Files
sm-seo-plugin/assets/dist/seo.js
Jakub Zych 10ff628f6a feat: structured data, graph preview and primary category in the SEO tab
- E8 golem15-seo-schema: the type per content kind, the Service grid with
  price and currency checks, custom JSON-LD with a 300 ms parse status
- E9 golem15-seo-graph: nodes and findings from the seo_graph action, the
  JSON, the Rich Results Test link, 800 ms re-check on fill changes, the
  ML locale switch, one queued request, the failure line
- golem15-seo-parent: the primary category select over the record's
  parents; the seoparent Decode accepts the loaded value sent back
- the rebuilt element bundle and vitest smoke tests
2026-11-04 14:37:49 +01:00

3 lines
66 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const ie={count:":chars characters · :px / :max px",good:"Good length",emptyTitle:"Empty: the title template is used",emptyDescription:"Empty: the template or the excerpt is used",shortTitle:"Short: aim for 30–60 characters",shortDescription:"Short: aim for 120–160 characters",longTitle:"Too long: Google cuts titles after about 580 px",longDescription:"Too long: Google cuts descriptions after about 920 px on desktop and 680 px on mobile",indexing:"Indexing",links:"Links",inherit:"Inherit",siteDefault:"Site default",index:"Index",noindex:"Noindex",follow:"Follow",nofollow:"Nofollow",advanced:"Advanced directives",advancedSet:{one:":count set",other:":count set"},maxSnippet:"Maximum snippet length (characters)",maxSnippetHint:"Empty: no limit. 0: no snippet. -1: no limit.",maxImagePreview:"Image preview size",notSet:"Not set",none:"None",standard:"Standard",large:"Large",maxVideoPreview:"Maximum video preview (seconds)",noarchive:"Do not show a cached copy (noarchive)",nosnippet:"Do not show a snippet (nosnippet)",noimageindex:"Do not index images (noimageindex)",unavailableAfter:"Remove from results after",invalidNumber:"Enter a whole number, -1 or more.",robotsUnparsed:"The stored value “:value” is not one this editor can show. It stays as it is until you reset it.",robotsReset:"Reset",desktop:"Desktop",mobile:"Mobile",device:"Preview device",language:"Language: :locale",fromTemplate:"Title from the template “:template”",fromContent:"Description from the content excerpt",noDescription:"No description: Google picks text from the page.",noUrl:"The address appears after the first save.",savedNote:"The address and the H1 come from the saved record. Save to refresh them.",checking:"Checking for duplicates…",dupTitle:{one:"Same title as :count other page: :list",other:"Same title as :count other pages: :list"},dupDescription:{one:"Same description as :count other page: :list",other:"Same description as :count other pages: :list"},andMore:"and :count more",keyphrase:"Focus keyphrase “:phrase”",kpTitle:"In the SEO title",kpTitleNo:"Not in the SEO title",kpH1:"In the H1",kpH1No:"Not in the H1",kpDesc:"In the meta description",kpDescNo:"Not in the meta description",kpUrl:"In the address",kpUrlNo:"Not in the address",kpLength:"Text length: :count words",kpLengthNo:"Text length: :count words, aim for at least 300",contextFailed:"The preview data could not be loaded.",imageUpload:"Upload image",imageReplace:"Replace image",imageRemove:"Remove",imageUploading:"Uploading…",imageFailed:"The image could not be uploaded.",imageAlt:"Social image preview",size:":size of 500 KB",clean:"No problems found.",unknown:"Line :line: “:word” is not a robots.txt directive.",unknownSuggest:"Line :line: “:word” is not a robots.txt directive. Did you mean “:suggestion”?",noGroup:"Line :line: this rule has no User-agent line above it, so crawlers ignore it.",badPath:"Line :line: a path must start with / or *.",noColon:"Line :line: write the directive as “Name: value”.",ownSitemap:"Line :line: Sitemap lines are added automatically. This one is kept as written.",crawlDelay:"Line :line: Google ignores Crawl-delay. Bing and Yandex use it.",moreFindings:"and :count more",tooLarge:"Over 500 KB: the file cannot be saved.",url:"Address",urlPlaceholder:"/konto/ustawienia",agent:"Crawler",allowedRule:"Allowed for :agent. Rule: line :line “:rule”.",allowedNone:"Allowed for :agent: no rule matches this address.",blocked:"Blocked for :agent by line :line “:rule”.",blockedBot:"Blocked for :agent by its switch on the AI bots tab.",unsaved:"Tests the text in the editor and the AI bot switches, including unsaved changes.",stagingNote:"On this environment every address is blocked. The result shows the production behaviour.",urlRequired:"Enter an address starting with /.",testFailed:"The test could not be run. Try again.",exportHeading:"Export",importHeading:"Import",dataset:"Data",dsRedirects:"Redirects",dsRules:"URL rules",dsRecords:"SEO of records",download:"Download CSV",chooseFile:"Choose CSV file",noFile:"No file chosen",summary:":new new, :changed changed, :unchanged unchanged, :refused refused",bNew:"New",bChanged:"Changed",bUnchanged:"Unchanged",bRefused:"Refused",bWarning:"Warning",colLine:"Line",colChange:"Change",colAddress:"Address",colField:"Field",colBefore:"Before",colAfter:"After",colNote:"Note",rowCap:"Showing the first 200 of :count rows. All rows are applied.",refusedBlocks:"Fix the refused rows in the file and preview it again. Nothing is applied while a row is refused.",nothing:"The file changes nothing.",discard:"Discard preview",fileTooLarge:"This file is larger than :limit. Split it into smaller files, or import it through MCP.",readFailed:"The file could not be read.",openHistory:"Open History",applyCount:{one:"Apply :count change",other:"Apply :count changes"},schemaType:"Schema type",typeDefault:"Default (:type)",tBlogPosting:"BlogPosting (blog post)",tArticle:"Article (article)",tNewsArticle:"NewsArticle (news)",tWebPage:"WebPage (page)",tAboutPage:"AboutPage (about us)",tContactPage:"ContactPage (contact)",tService:"Service (service or offer)",tCollectionPage:"CollectionPage (listing)",tProfilePage:"ProfilePage (profile)",noteArticle:"Author, dates, image, word count and section come from the content.",notePage:"Name, description and breadcrumbs come from the SEO tab.",noteContact:"Address and opening hours come from the SEO settings (Publisher, Local business).",noteService:"The provider is the publisher from the SEO settings.",noteCollection:"Lists the items shown on the page.",noteProfile:"Name, image and profiles come from the author.",serviceType:"Kind of service",serviceTypePh:"e.g. Mushroom workshops",areaServed:"Area served",areaServedHint:"Cities or regions, separated by commas.",price:"Price",priceHint:"Leave empty when the price is set individually.",currency:"Currency",currencyHint:"ISO code, e.g. PLN.",priceInvalid:"Enter a price such as 150 or 149.99.",currencyInvalid:"Use a three-letter currency code, e.g. PLN.",custom:"Custom JSON-LD (advanced)",customSet:"Set",customHint:"An object or a list of objects. A node with the @id of a generated node is merged into it, and your values win; other nodes are added to the graph. Paste only the JSON, without a script tag.",jsonValid:{one:"Valid JSON: :count node",other:"Valid JSON: :count nodes"},jsonError:"Line :line, column :column: :message",jsonNotObject:"Use an object or a list of objects.",jsonTooLarge:"Over 16 KB: shorten the custom JSON-LD.",forLocale:"JSON-LD for :locale — :url",graphChecking:"Building the graph…",allGood:"No problems: every node has its required and recommended properties.",required:"Missing required property “:property” (:type)",recommended:"Missing recommended property “:property” (:type)",noRules:":type has no rich-result rules at Google; it is checked as valid schema.org only.",showJson:"Show JSON-LD",hideJson:"Hide JSON-LD",richResults:"Check in Google's Rich Results Test",graphNoUrl:"The Rich Results Test link appears after the first save, when the page has an address.",graphUnsaved:"Shows the saved page with your unsaved structured data changes.",layerNodes:"The site may add nodes of its own, such as FAQPage. The site audit checks the rendered result.",graphAction:"Check structured data",graphFailed:"The structured data could not be built. Try again.",primaryDefault:"Default (first category)"},ce={count:"Znaki: :chars · :px / :max px",good:"Dobra długość",emptyTitle:"Puste: używany jest szablon tytułu",emptyDescription:"Puste: używany jest szablon lub zajawka",shortTitle:"Krótki: celuj w 30–60 znaków",shortDescription:"Krótki: celuj w 120–160 znaków",longTitle:"Za długi: Google ucina tytuły po ok. 580 px",longDescription:"Za długi: Google ucina opisy po ok. 920 px na komputerze i 680 px na telefonie",indexing:"Indeksowanie",links:"Linki",inherit:"Dziedzicz",siteDefault:"Domyślne",index:"Indeksuj",noindex:"Nie indeksuj",follow:"Śledź",nofollow:"Nie śledź",advanced:"Dyrektywy zaawansowane",advancedSet:{one:"ustawiona :count",few:"ustawione :count",many:"ustawionych :count",other:"ustawione :count"},maxSnippet:"Maksymalna długość fragmentu (znaki)",maxSnippetHint:"Puste: bez limitu. 0: bez fragmentu. -1: bez limitu.",maxImagePreview:"Rozmiar podglądu obrazu",notSet:"Nie ustawiono",none:"Brak",standard:"Standardowy",large:"Duży",maxVideoPreview:"Maksymalny podgląd wideo (sekundy)",noarchive:"Nie pokazuj kopii (noarchive)",nosnippet:"Nie pokazuj fragmentu (nosnippet)",noimageindex:"Nie indeksuj obrazów (noimageindex)",unavailableAfter:"Usuń z wyników po dniu",invalidNumber:"Wpisz liczbę całkowitą, -1 lub większą.",robotsUnparsed:"Zapisanej wartości „:value” ten edytor nie potrafi pokazać. Zostaje bez zmian, dopóki jej nie wyzerujesz.",robotsReset:"Wyzeruj",desktop:"Komputer",mobile:"Telefon",device:"Urządzenie podglądu",language:"Język: :locale",fromTemplate:"Tytuł z szablonu „:template”",fromContent:"Opis z zajawki treści",noDescription:"Brak opisu: Google wybierze tekst ze strony.",noUrl:"Adres pojawi się po pierwszym zapisie.",savedNote:"Adres i H1 pochodzą z zapisanego rekordu. Zapisz, aby je odświeżyć.",checking:"Sprawdzanie duplikatów…",dupTitle:{one:"Ten sam tytuł co :count inna strona: :list",few:"Ten sam tytuł co :count inne strony: :list",many:"Ten sam tytuł co :count innych stron: :list",other:"Ten sam tytuł co :count innej strony: :list"},dupDescription:{one:"Ten sam opis co :count inna strona: :list",few:"Ten sam opis co :count inne strony: :list",many:"Ten sam opis co :count innych stron: :list",other:"Ten sam opis co :count innej strony: :list"},andMore:"i :count więcej",keyphrase:"Fraza kluczowa „:phrase”",kpTitle:"W tytule SEO",kpTitleNo:"Brak w tytule SEO",kpH1:"W nagłówku H1",kpH1No:"Brak w nagłówku H1",kpDesc:"W opisie meta",kpDescNo:"Brak w opisie meta",kpUrl:"W adresie",kpUrlNo:"Brak w adresie",kpLength:"Długość tekstu: :count słów",kpLengthNo:"Długość tekstu: :count słów, celuj w co najmniej 300",contextFailed:"Nie udało się wczytać danych podglądu.",imageUpload:"Wgraj obraz",imageReplace:"Zmień obraz",imageRemove:"Usuń",imageUploading:"Wgrywanie…",imageFailed:"Nie udało się wgrać obrazu.",imageAlt:"Podgląd obrazu w mediach społecznościowych",size:":size z 500 KB",clean:"Nie znaleziono problemów.",unknown:"Wiersz :line: „:word” nie jest dyrektywą robots.txt.",unknownSuggest:"Wiersz :line: „:word” nie jest dyrektywą robots.txt. Czy chodziło o „:suggestion”?",noGroup:"Wiersz :line: nad tą regułą nie ma wiersza User-agent, więc roboty ją ignorują.",badPath:"Wiersz :line: ścieżka musi zaczynać się od / lub *.",noColon:"Wiersz :line: zapisz dyrektywę jako „Nazwa: wartość”.",ownSitemap:"Wiersz :line: wiersze Sitemap są dodawane automatycznie. Ten zostaje bez zmian.",crawlDelay:"Wiersz :line: Google ignoruje Crawl-delay. Bing i Yandex go stosują.",moreFindings:"i :count więcej",tooLarge:"Ponad 500 KB: nie można zapisać pliku.",url:"Adres",urlPlaceholder:"/konto/ustawienia",agent:"Robot",allowedRule:"Dozwolone dla :agent. Reguła: wiersz :line „:rule”.",allowedNone:"Dozwolone dla :agent: żadna reguła nie pasuje do tego adresu.",blocked:"Zablokowane dla :agent przez wiersz :line „:rule”.",blockedBot:"Zablokowane dla :agent przełącznikiem w zakładce Boty AI.",unsaved:"Sprawdza tekst w edytorze i przełączniki botów AI, także niezapisane zmiany.",stagingNote:"W tym środowisku każdy adres jest zablokowany. Wynik pokazuje zachowanie na produkcji.",urlRequired:"Wpisz adres zaczynający się od /.",testFailed:"Nie udało się uruchomić testu. Spróbuj ponownie.",exportHeading:"Eksport",importHeading:"Import",dataset:"Dane",dsRedirects:"Przekierowania",dsRules:"Reguły adresów",dsRecords:"SEO rekordów",download:"Pobierz CSV",chooseFile:"Wybierz plik CSV",noFile:"Nie wybrano pliku",summary:"Nowe: :new, zmienione: :changed, bez zmian: :unchanged, odrzucone: :refused",bNew:"Nowy",bChanged:"Zmieniony",bUnchanged:"Bez zmian",bRefused:"Odrzucony",bWarning:"Ostrzeżenie",colLine:"Wiersz",colChange:"Zmiana",colAddress:"Adres",colField:"Pole",colBefore:"Przed",colAfter:"Po",colNote:"Uwagi",rowCap:"Pokazano pierwsze 200 z :count wierszy. Zastosowane zostaną wszystkie.",refusedBlocks:"Popraw odrzucone wiersze w pliku i ponownie wyświetl podgląd. Nic nie zostanie zastosowane, dopóki jakiś wiersz jest odrzucony.",nothing:"Plik niczego nie zmienia.",discard:"Odrzuć podgląd",fileTooLarge:"Ten plik jest większy niż :limit. Podziel go na mniejsze pliki lub zaimportuj przez MCP.",readFailed:"Nie udało się odczytać pliku.",openHistory:"Otwórz Historię zmian",applyCount:{one:"Zastosuj :count zmianę",few:"Zastosuj :count zmiany",many:"Zastosuj :count zmian",other:"Zastosuj :count zmiany"},schemaType:"Typ schema",typeDefault:"Domyślny (:type)",tBlogPosting:"BlogPosting (wpis na blogu)",tArticle:"Article (artykuł)",tNewsArticle:"NewsArticle (wiadomość)",tWebPage:"WebPage (strona)",tAboutPage:"AboutPage (o nas)",tContactPage:"ContactPage (kontakt)",tService:"Service (usługa lub oferta)",tCollectionPage:"CollectionPage (lista)",tProfilePage:"ProfilePage (profil)",noteArticle:"Autor, daty, obraz, liczba słów i sekcja pochodzą z treści.",notePage:"Nazwa, opis i ścieżka nawigacji pochodzą z zakładki SEO.",noteContact:"Adres i godziny otwarcia pochodzą z ustawień SEO (Wydawca, Firma lokalna).",noteService:"Usługodawcą jest wydawca z ustawień SEO.",noteCollection:"Wymienia elementy pokazane na stronie.",noteProfile:"Imię i nazwisko, zdjęcie i profile pochodzą od autora.",serviceType:"Rodzaj usługi",serviceTypePh:"np. warsztaty grzybowe",areaServed:"Obszar działania",areaServedHint:"Miasta lub regiony oddzielone przecinkami.",price:"Cena",priceHint:"Zostaw puste, gdy cena jest ustalana indywidualnie.",currency:"Waluta",currencyHint:"Kod ISO, np. PLN.",priceInvalid:"Wpisz cenę, np. 150 lub 149,99.",currencyInvalid:"Użyj trzyliterowego kodu waluty, np. PLN.",custom:"Własny JSON-LD (zaawansowane)",customSet:"Ustawiony",customHint:"Obiekt lub lista obiektów. Węzeł z @id wygenerowanego węzła zostaje z nim scalony, a Twoje wartości mają pierwszeństwo; pozostałe węzły są dodawane do grafu. Wklej sam JSON, bez znacznika script.",jsonValid:{one:"Poprawny JSON: :count węzeł",few:"Poprawny JSON: :count węzły",many:"Poprawny JSON: :count węzłów",other:"Poprawny JSON: :count węzła"},jsonError:"Wiersz :line, kolumna :column: :message",jsonNotObject:"Użyj obiektu lub listy obiektów.",jsonTooLarge:"Ponad 16 KB: skróć własny JSON-LD.",forLocale:"JSON-LD dla :locale — :url",graphChecking:"Budowanie grafu…",allGood:"Brak problemów: każdy węzeł ma wymagane i zalecane właściwości.",required:"Brak wymaganej właściwości „:property” (:type)",recommended:"Brak zalecanej właściwości „:property” (:type)",noRules:":type nie ma reguł wyników z elementami rozszerzonymi w Google; sprawdzana jest tylko poprawność schema.org.",showJson:"Pokaż JSON-LD",hideJson:"Ukryj JSON-LD",richResults:"Sprawdź w Teście wyników z elementami rozszerzonymi Google",graphNoUrl:"Link do testu pojawi się po pierwszym zapisie, gdy strona będzie miała adres.",graphUnsaved:"Pokazuje zapisaną stronę z niezapisanymi zmianami danych strukturalnych.",layerNodes:"Witryna może dodać własne węzły, np. FAQPage. Audyt witryny sprawdza wynik na stronie.",graphAction:"Sprawdź dane strukturalne",graphFailed:"Nie udało się zbudować danych strukturalnych. Spróbuj ponownie.",primaryDefault:"Domyślna (pierwsza kategoria)"},de={en:ie,pl:ce};function _(i){return(i.getAttribute("ui-locale")||document.documentElement.lang||"en").toLowerCase().split(/[-_]/)[0]||"en"}function N(i){return de[i]??ie}function y(i,e={}){const t=Object.keys(e).sort((o,r)=>r.length-o.length);let s=i;for(const o of t)s=s.split(":"+o).join(String(e[o]));return s}function I(i,e,t,s={}){let o="other";try{o=new Intl.PluralRules(t).select(e)}catch{o=e===1?"one":"other"}const r=o==="one"&&i.one||o==="few"&&i.few||o==="many"&&i.many||i.other;return y(r,{...s,count:new Intl.NumberFormat(t).format(e)})}function C(i,e){try{return new Intl.NumberFormat(e).format(i)}catch{return String(i)}}const q="http://www.w3.org/2000/svg",ue={info:["M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z","M12 16v-4","M12 8h.01"],"triangle-alert":["m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3","M12 9v4","M12 17h.01"],"circle-check":["M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z","m9 12 2 2 4-4"],"circle-alert":["M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z","M12 8v4","M12 16h.01"],"chevron-down":["m6 9 6 6 6-6"],"external-link":["M15 3h6v6","M10 14 21 3","M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"]};function x(i,e=14){const t=document.createElementNS(q,"svg");t.setAttribute("width",String(e)),t.setAttribute("height",String(e)),t.setAttribute("viewBox","0 0 24 24"),t.setAttribute("fill","none"),t.setAttribute("stroke","currentColor"),t.setAttribute("stroke-width","2"),t.setAttribute("stroke-linecap","round"),t.setAttribute("stroke-linejoin","round"),t.setAttribute("aria-hidden","true"),t.setAttribute("class","seo-icon seo-icon--"+i);for(const s of ue[i]??[]){const o=document.createElementNS(q,"path");o.setAttribute("d",s),t.appendChild(o)}return t}function n(i,e="",t){const s=document.createElement(i);return e&&(s.className=e),t!==void 0&&(s.textContent=t),s}function P(i,e,t){const s=i.getAttribute(e);if(s===null||s==="")return t;try{return JSON.parse(s)}catch{return t}}function L(i,e,t){i.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))}let V=0;function S(i){return V+=1,`${i}-${V}`}class J{constructor(e,t){this.host=e,this.onDropped=t}host;onDropped;inflight=null;queued=null;retry=null;retried=!1;timer;get current(){return this.inflight}request(e){if(this.host.hasAttribute("busy")||this.inflight!==null){this.queued=e;return}this.send(e)}settle(){const e=this.inflight;return this.inflight=null,this.flush(),e}flush(){if(this.host.hasAttribute("busy")||this.inflight!==null)return;const e=this.retry??this.queued;e!==null&&(this.retry!==null?this.retry=null:this.queued=null,this.send(e))}reset(){clearTimeout(this.timer),this.timer=void 0,this.inflight=null,this.retry=null,this.retried=!1}send(e){if(this.inflight=e,L(this.host,"summer-action",{payload:e}),this.host.hasAttribute("busy")||this.inflight!==e){this.retried=!1;return}if(this.inflight=null,this.retried){this.retried=!1,this.onDropped(e);return}this.retried=!0,this.retry=e,clearTimeout(this.timer),this.timer=setTimeout(()=>{this.timer=void 0,this.flush()},0)}}const bt="golem15-seo-graph";function he(i){return"https://search.google.com/test/rich-results?url="+encodeURIComponent(i)}function pe(i){const e=i.indexOf("#");return e>=0?i.slice(e):i}class me extends HTMLElement{static observedAttributes=["fill-values","busy","state","ui-locale","disabled","label"];data=null;failed=!1;pending=!1;showJSON=!1;shownLocale="";lastFill="";timer;connected=!1;actions=new J(this,()=>this.fail());onResult=e=>{const t=e.detail;this.actions.settle();const s=t?.data;s&&Array.isArray(s.nodes)&&(this.data=s,this.failed=!1),this.pending=this.actions.current!==null,this.render()};onLocale=e=>{const t=e.detail;typeof t=="string"&&t!==""&&t!==this.shownLocale&&(this.shownLocale=t,this.check())};connectedCallback(){this.connected=!0,this.lastFill=this.getAttribute("fill-values")??"",this.addEventListener("summer-result",this.onResult),window.addEventListener("summer:ml-locale",this.onLocale),this.render(),queueMicrotask(()=>{this.connected&&this.check()})}disconnectedCallback(){this.connected=!1,this.removeEventListener("summer-result",this.onResult),window.removeEventListener("summer:ml-locale",this.onLocale),clearTimeout(this.timer),this.actions.reset(),this.pending=!1}attributeChangedCallback(e,t,s){if(this.connected){if(e==="busy"&&s===null){this.actions.flush();return}if(e==="state"&&s==="error"){this.actions.settle()&&this.fail();return}if(e==="fill-values"){const o=s??"";o!==this.lastFill&&(this.lastFill=o,clearTimeout(this.timer),this.timer=setTimeout(()=>this.check(),800));return}this.render()}}labels(){return N(_(this))}check(){clearTimeout(this.timer),this.pending=!0,this.actions.request({op:"graph",locale:this.shownLocale}),this.render()}fail(){this.failed=!0,this.pending=this.actions.current!==null,this.render()}render(){if(!this.connected)return;const e=this.labels(),t=[];this.setAttribute("aria-busy",String(this.pending));const s=this.data,o=n("p","seo-graph__meta");if(s&&(o.textContent=s.url?y(e.forLocale,{locale:(s.locale||"").toUpperCase(),url:s.url}):e.graphNoUrl),this.pending){const r=n("p","seo-graph__meta seo-graph__checking",e.graphChecking);r.setAttribute("role","status"),t.push(r)}if(s){t.push(o);const r=n("div","seo-graph__nodes");let a=0;for(const l of s.nodes){const d=n("div","seo-graph__node"),p=n("div","seo-graph__node-head");p.append(n("span","seo-graph__pill",l.type||"—"),n("code","seo-graph__id",pe(l.id||""))),d.append(p),l.rules||d.append(n("p","seo-graph__meta",y(e.noRules,{type:l.type})));for(const h of l.findings??[]){a++;const m=h.level==="required",b=n("p","seo-graph__finding seo-graph__finding--"+(m?"required":"recommended"));b.append(x(m?"circle-alert":"triangle-alert"),n("span","",y(m?e.required:e.recommended,{property:h.property,type:l.type}))),d.append(b)}r.append(d)}if(t.push(r),a===0&&s.nodes.length>0){const l=n("p","seo-graph__ok");l.append(x("circle-check"),n("span","",e.allGood)),t.push(l)}if(s.graph){const l=n("button","seo-graph__disclosure");l.type="button",l.setAttribute("aria-expanded",String(this.showJSON)),l.append(n("span","",this.showJSON?e.hideJson:e.showJson),x("chevron-down")),l.addEventListener("click",()=>{this.showJSON=!this.showJSON,this.render()}),t.push(l),this.showJSON&&t.push(n("pre","seo-graph__json",JSON.stringify(s.graph,null,2)))}const c=n("div","seo-graph__links");if(s.url){const l=n("a","seo-graph__link");l.href=he(s.url),l.target="_blank",l.rel="noopener",l.append(n("span","",e.richResults),x("external-link")),c.append(l)}c.append(n("p","seo-graph__meta",e.graphUnsaved),n("p","seo-graph__meta",e.layerNodes)),t.push(c)}if(this.failed){const r=n("p","seo-graph__error");r.setAttribute("role","status"),r.append(x("circle-alert"),n("span","",e.graphFailed)),t.push(r)}if(!this.hasAttribute("disabled")){const r=n("button","seo-graph__button",this.getAttribute("label")||e.graphAction);r.type="button",r.addEventListener("click",()=>this.check()),t.push(r)}this.replaceChildren(...t)}fill(){return P(this,"fill-values",{})}}const fe="golem15-seo-image";function ge(i){return/^\/(?![\/\\])/.test(i)||/^https?:\/\//i.test(i)}class be extends HTMLElement{static observedAttributes=["disabled","invalid","ui-locale"];current="";pending="";error="";onUploadResult=e=>{const t=e.detail;!t||t.id!==this.pending||(this.pending="",typeof t.url=="string"&&t.url!==""?(this.current=t.url,this.error="",L(this,"summer-change",{value:this.current})):this.error=t.error||this.labels().imageFailed,this.render())};get value(){return this.current}set value(e){this.current=typeof e=="string"?e:"",this.render()}connectedCallback(){this.addEventListener("summer-upload-result",this.onUploadResult),this.render()}disconnectedCallback(){this.removeEventListener("summer-upload-result",this.onUploadResult)}attributeChangedCallback(){this.isConnected&&this.render()}labels(){return N(_(this))}render(){const e=this.labels(),t=this.hasAttribute("disabled"),s=[];if(this.current&&ge(this.current)){const r=n("div","seo-image__preview"),a=n("img","seo-image__img");a.src=this.current,a.alt=e.imageAlt,a.width=240,a.height=126,r.append(a),s.push(r)}if(!t){const r=n("div","seo-image__actions"),a=S("seo-image-file"),c=n("input","seo-visually-hidden");c.type="file",c.accept="image/jpeg,image/png,image/gif,image/webp",c.id=a,c.addEventListener("change",()=>{const d=c.files?.[0];d&&(this.pending=S("seo-image-upload"),this.error="",this.render(),L(this,"summer-upload",{id:this.pending,file:d}))});const l=n("label","seo-image__button",this.current?e.imageReplace:e.imageUpload);if(l.htmlFor=a,r.append(c,l),this.current){const d=n("button","seo-image__button seo-image__button--secondary",e.imageRemove);d.type="button",d.addEventListener("click",()=>{this.current="",this.error="",L(this,"summer-change",{value:""}),this.render()}),r.append(d)}s.push(r)}const o=n("div","seo-image__status"+(this.error?" seo-image__status--error":""));o.setAttribute("role","status"),o.textContent=this.pending?e.imageUploading:this.error,s.push(o),this.classList.toggle("seo-image--invalid",this.hasAttribute("invalid")),this.replaceChildren(...s)}}const wt="golem15-seo-parent";function we(i){if(typeof i=="string")return{selected:i,options:[]};const e={selected:"",options:[]};if(i&&typeof i=="object"){const t=i;if(e.selected=typeof t.selected=="string"?t.selected:"",Array.isArray(t.options)){for(const s of t.options)if(s&&typeof s=="object"&&typeof s.value=="string"){const o=s;e.options.push({value:o.value,label:typeof o.label=="string"&&o.label?o.label:o.value})}}}return e}class ye extends HTMLElement{static observedAttributes=["disabled","invalid","ui-locale"];current={selected:"",options:[]};get value(){return this.current.options.some(e=>e.value===this.current.selected)?this.current.selected:""}set value(e){const t=we(e);typeof e=="string"&&this.current.options.length>0&&(t.options=this.current.options),this.current=t,this.render()}connectedCallback(){this.render()}attributeChangedCallback(){this.isConnected&&this.render()}render(){if(!this.isConnected)return;const e=N(_(this)),t=n("select","seo-parent__select");t.id=S("seo-parent"),t.disabled=this.hasAttribute("disabled");const s=n("option","",e.primaryDefault);s.value="",t.append(s);for(const o of this.current.options){const r=n("option","",o.label);r.value=o.value,t.append(r)}t.value=this.value,t.addEventListener("change",()=>{this.current.selected=t.value,L(this,"summer-change",{value:t.value})}),this.classList.toggle("seo-parent--invalid",this.hasAttribute("invalid")),this.replaceChildren(t)}}const ve="golem15-seo-robots";function O(){return{index:"",follow:"",noarchive:!1,nosnippet:!1,noimageindex:!1,maxSnippet:null,maxImagePreview:"",maxVideoPreview:null,unavailableAfter:""}}function ne(i){const e=/^(\d{4})-(\d{2})-(\d{2})$/.exec(i);if(!e)return!1;const t=Number(e[1]),s=Number(e[2]),o=Number(e[3]);if(s<1||s>12||o<1)return!1;const a=[31,t%4===0&&t%100!==0||t%400===0?29:28,31,30,31,30,31,31,30,31,30,31][s-1];return o<=a}function _e(i){const e=O(),t=i.trim();if(t==="")return e;const s=new Set;for(const o of t.split(",")){const r=o.trim().toLowerCase();if(r==="")return null;const a=r.indexOf(":"),c=(a<0?r:r.slice(0,a)).trim(),l=a<0?null:r.slice(a+1).trim(),d=c==="noindex"?"index":c==="nofollow"?"follow":c;if(s.has(d))return null;switch(s.add(d),c){case"index":case"noindex":if(l!==null)return null;e.index=c;break;case"follow":case"nofollow":if(l!==null)return null;e.follow=c;break;case"noarchive":case"nosnippet":case"noimageindex":if(l!==null)return null;e[c]=!0;break;case"max-snippet":case"max-video-preview":{if(l===null||!/^[+-]?\d+$/.test(l))return null;const p=Number.parseInt(l,10);if(p<-1)return null;c==="max-snippet"?e.maxSnippet=p:e.maxVideoPreview=p;break}case"max-image-preview":if(l!=="none"&&l!=="standard"&&l!=="large")return null;e.maxImagePreview=l;break;case"unavailable_after":if(l===null||!ne(l))return null;e.unavailableAfter=l;break;default:return null}}return e}function ke(i){const e=[];return i.index&&e.push(i.index),i.follow&&e.push(i.follow),i.noarchive&&e.push("noarchive"),i.nosnippet&&e.push("nosnippet"),i.noimageindex&&e.push("noimageindex"),i.maxSnippet!==null&&e.push("max-snippet:"+i.maxSnippet),i.maxImagePreview&&e.push("max-image-preview:"+i.maxImagePreview),i.maxVideoPreview!==null&&e.push("max-video-preview:"+i.maxVideoPreview),i.unavailableAfter&&e.push("unavailable_after:"+i.unavailableAfter),e.join(",")}function M(i){return[i.noarchive,i.nosnippet,i.noimageindex,i.maxSnippet!==null,i.maxImagePreview!=="",i.maxVideoPreview!==null,i.unavailableAfter!==""].filter(Boolean).length}class xe extends HTMLElement{static observedAttributes=["options","disabled","invalid","ui-locale","locale"];current="";model=O();open=!1;unparsed=!1;get value(){return this.current}set value(e){const t=typeof e=="string"?e:e==null?"":String(e);if(t===this.current&&this.childElementCount>0)return;this.current=t;const s=_e(t);this.unparsed=s===null,this.model=s??O(),this.open=this.open||M(this.model)>0,this.render()}connectedCallback(){this.open=M(this.model)>0,this.render()}attributeChangedCallback(){this.isConnected&&this.render()}labels(){return N(_(this))}commit(){this.unparsed||(this.current=ke(this.model),L(this,"summer-change",{value:this.current}),this.render())}render(){const e=this.labels(),t=this.hasAttribute("disabled")||this.unparsed,o=P(this,"options",{}).scope==="type"?e.siteDefault:e.inherit;this.classList.toggle("seo-robots--invalid",this.hasAttribute("invalid"));const r=document.activeElement&&this.contains(document.activeElement)?document.activeElement.dataset.focusKey:void 0,a=n("div","seo-robots__groups");a.append(this.radioGroup(e.indexing,"index",[["",o,"inherit"],["index",e.index,"ok"],["noindex",e.noindex,"danger"]],t),this.radioGroup(e.links,"follow",[["",o,"inherit"],["follow",e.follow,"ok"],["nofollow",e.nofollow,"danger"]],t));const c=S("seo-robots-advanced"),l=n("button","seo-robots__toggle");l.type="button",l.setAttribute("aria-expanded",this.open?"true":"false"),l.setAttribute("aria-controls",c),l.dataset.focusKey="toggle",l.append(n("span","",e.advanced),x("chevron-down")),l.addEventListener("click",()=>{this.open=!this.open,this.render()});const d=n("div","seo-robots__advanced-row");d.append(l);const p=M(this.model);p>0&&d.append(n("span","seo-robots__summary",I(e.advancedSet,p,_(this))));const h=n("div","seo-robots__panel");h.id=c,h.hidden=!this.open,h.append(this.numberField(e.maxSnippet,e.maxSnippetHint,"maxSnippet",t,e),this.selectField(e,t),this.numberField(e.maxVideoPreview,"","maxVideoPreview",t,e),this.dateField(e,t));const m=n("div","seo-robots__checks");for(const u of["noarchive","nosnippet","noimageindex"]){const f=n("label","seo-robots__check"),g=n("input");g.type="checkbox",g.checked=this.model[u],g.disabled=t,g.dataset.focusKey=u,g.addEventListener("change",()=>{this.model[u]=g.checked,this.commit()}),f.append(g,n("span","",e[u])),m.append(f)}h.append(m);const b=[a,d,h];if(this.unparsed){const u=n("div","seo-robots__unparsed");if(u.setAttribute("role","status"),u.append(x("triangle-alert"),n("span","",y(e.robotsUnparsed,{value:this.current}))),!this.hasAttribute("disabled")){const f=n("button","seo-robots__reset",e.robotsReset);f.type="button",f.dataset.focusKey="reset",f.addEventListener("click",()=>{this.unparsed=!1,this.model=O(),this.commit()}),u.append(f)}b.unshift(u)}this.replaceChildren(...b),r&&this.querySelector(`[data-focus-key="${r}"]`)?.focus()}radioGroup(e,t,s,o){const r=n("div","seo-robots__group"),a=S("seo-robots-caption"),c=n("span","seo-robots__caption",e);c.id=a;const l=n("div","seo-robots__track");l.setAttribute("role","radiogroup"),l.setAttribute("aria-labelledby",a);const d=this.model[t];return s.forEach(([p,h,m],b)=>{const u=n("button","seo-robots__segment seo-robots__segment--"+m,h);u.type="button",u.setAttribute("role","radio");const f=d===p;u.setAttribute("aria-checked",f?"true":"false"),u.tabIndex=f?0:-1,u.disabled=o,u.dataset.focusKey=t+"-"+b,u.addEventListener("click",()=>this.choose(t,p)),u.addEventListener("keydown",g=>{const A=g.key==="ArrowRight"||g.key==="ArrowDown"?1:g.key==="ArrowLeft"||g.key==="ArrowUp"?-1:0;if(A===0||o)return;g.preventDefault();const w=(b+A+s.length)%s.length;this.choose(t,s[w][0]),this.querySelector(`[data-focus-key="${t}-${w}"]`)?.focus()}),l.append(u)}),r.append(c,l),r}choose(e,t){this.hasAttribute("disabled")||(e==="index"?this.model.index=t:this.model.follow=t,this.commit())}numberField(e,t,s,o,r){const a=n("label","seo-robots__field");a.append(n("span","seo-robots__label",e));const c=n("input","seo-robots__input");c.type="number",c.min="-1",c.step="1",c.disabled=o,c.dataset.focusKey=s;const l=this.model[s];c.value=l===null?"":String(l);const d=n("span","seo-robots__error");return d.setAttribute("role","status"),c.addEventListener("change",()=>{const p=c.value.trim();if(p===""){this.model[s]=null,this.commit();return}if(!/^-?\d+$/.test(p)||Number.parseInt(p,10)<-1){d.textContent=r.invalidNumber;return}this.model[s]=Number.parseInt(p,10),this.commit()}),a.append(c),t&&a.append(n("span","seo-robots__hint",t)),a.append(d),a}selectField(e,t){const s=n("label","seo-robots__field");s.append(n("span","seo-robots__label",e.maxImagePreview));const o=n("select","seo-robots__input");o.disabled=t,o.dataset.focusKey="maxImagePreview";for(const[r,a]of[["",e.notSet],["none",e.none],["standard",e.standard],["large",e.large]]){const c=n("option","",a);c.value=r,c.selected=this.model.maxImagePreview===r,o.append(c)}return o.addEventListener("change",()=>{this.model.maxImagePreview=o.value,this.commit()}),s.append(o),s}dateField(e,t){const s=n("label","seo-robots__field");s.append(n("span","seo-robots__label",e.unavailableAfter));const o=n("input","seo-robots__input");return o.type="date",o.disabled=t,o.dataset.focusKey="unavailableAfter",o.value=this.model.unavailableAfter,o.addEventListener("change",()=>{this.model.unavailableAfter=ne(o.value)?o.value:"",this.commit()}),s.append(o),s}}const Ae="golem15-seo-robotstester",K=["Googlebot","Googlebot-Image","Bingbot","*"];function ze(i,e){const t={agent:e.agent,line:e.line,rule:e.rule};return e.allowed?e.line>0?y(i.allowedRule,t):y(i.allowedNone,t):e.bot?y(i.blockedBot,t):y(i.blocked,t)}class Se extends HTMLElement{static observedAttributes=["busy","state","ui-locale","disabled","label","busy-label"];context=null;result=null;error="";actions=new J(this,e=>this.failed(e));connected=!1;input=null;select=null;button=null;line=null;notes=null;builtFor="";onResult=e=>{const s=e.detail?.data;this.actions.settle(),s&&s.op==="context"?(this.context=s,this.build(!0)):s&&s.op==="test"&&(this.result=s,this.error="",this.renderResult())};connectedCallback(){this.connected=!0,this.addEventListener("summer-result",this.onResult),this.build(!1),queueMicrotask(()=>{this.connected&&!this.context&&this.request({op:"context"})})}disconnectedCallback(){this.connected=!1,this.removeEventListener("summer-result",this.onResult),this.actions.reset()}attributeChangedCallback(e,t,s){if(this.connected){if(e==="busy"&&s===null&&this.actions.flush(),e==="state"&&s==="error"&&this.actions.settle(),e==="ui-locale"){this.build(!0);return}this.syncControls()}}labels(){return N(_(this))}request(e){this.actions.request(e)}failed(e){e.op==="test"&&(this.error=this.labels().testFailed,this.result=null,this.renderResult())}build(e){const t=_(this)+"|"+(this.context?.agents??K).join(",");if(!e&&this.builtFor===t&&this.input){this.syncControls();return}this.builtFor=t;const s=this.labels(),o=this.input?.value??"",r=this.select?.value??"Googlebot";this.replaceChildren();const a=n("div","seo-robotstester__row"),c=S("seo-robotstester-url"),l=n("div","seo-robotstester__field seo-robotstester__field--url"),d=n("label","seo-robotstester__label",s.url);d.htmlFor=c;const p=n("input","seo-robotstester__input");p.id=c,p.type="text",p.placeholder=s.urlPlaceholder,p.value=o,p.addEventListener("keydown",w=>{w.key==="Enter"&&(w.preventDefault(),this.test())}),l.append(d,p);const h=S("seo-robotstester-agent"),m=n("div","seo-robotstester__field seo-robotstester__field--agent"),b=n("label","seo-robotstester__label",s.agent);b.htmlFor=h;const u=n("select","seo-robotstester__select");u.id=h;for(const w of this.context?.agents??K){const k=n("option","",w);k.value=w,u.append(k)}u.value=r,u.value!==r&&(u.value="Googlebot"),m.append(b,u);const f=n("button","seo-robotstester__button");f.type="button",f.addEventListener("click",()=>this.test()),a.append(l,m,f);const g=n("div","seo-robotstester__result");g.setAttribute("role","status");const A=n("div","seo-robotstester__notes");this.input=p,this.select=u,this.button=f,this.line=g,this.notes=A,this.append(a,g,A),this.syncControls(),this.renderResult()}syncControls(){if(!this.button||!this.input||!this.select)return;const e=this.hasAttribute("disabled"),t=this.hasAttribute("busy");this.input.readOnly=e,this.select.disabled=e,this.button.hidden=e,this.button.disabled=t,this.button.textContent=t?this.getAttribute("busy-label")||this.getAttribute("label")||"":this.getAttribute("label")||""}test(){if(this.hasAttribute("disabled")||!this.input||!this.select)return;const e=this.input.value.trim();if(!e.startsWith("/")){this.error=this.labels().urlRequired,this.result=null,this.renderResult();return}this.error="",this.request({op:"test",url:e,agent:this.select.value})}renderResult(){if(!this.line||!this.notes)return;const e=this.labels();if(this.line.className="seo-robotstester__result",this.error)this.line.classList.add("seo-robotstester__result--error"),this.line.replaceChildren(n("span","",this.error));else if(this.result){const s=this.result.allowed;this.line.classList.add(s?"seo-robotstester__result--allowed":"seo-robotstester__result--blocked"),this.line.replaceChildren(x(s?"circle-check":"triangle-alert"),n("span","",ze(e,this.result)))}else this.line.replaceChildren();const t=[];(this.context?.staging||P(this,"data",{}).staging)&&t.push(n("p","seo-robotstester__note",e.stagingNote)),t.push(n("p","seo-robotstester__note",e.unsaved)),this.notes.replaceChildren(...t)}}const Te="golem15-seo-robotstxt",Ce=500*1024,U=10,Le=["User-agent","Allow","Disallow","Sitemap","Crawl-delay","Host","Clean-param"];function Ne(i,e){const t=Array.from({length:e.length+1},(s,o)=>o);for(let s=1;s<=i.length;s++){let o=t[0];t[0]=s;for(let r=1;r<=e.length;r++){const a=t[r];t[r]=Math.min(t[r]+1,t[r-1]+1,o+(i[s-1]===e[r-1]?0:1)),o=a}}return t[e.length]}function Ee(i){const e=i.toLowerCase();let t="",s=3;for(const o of Le){const r=Ne(e,o.toLowerCase());r<s&&(t=o,s=r)}return t}function Pe(i){const e=[];let t=!1;return i.split(/\r?\n/).forEach((s,o)=>{const r=o+1,a=s.indexOf("#"),c=(a>=0?s.slice(0,a):s).trim();if(c==="")return;const l=c.indexOf(":");if(l<0){e.push({kind:"noColon",line:r});return}const d=c.slice(0,l).trim(),p=c.slice(l+1).trim();switch(d.toLowerCase()){case"user-agent":t=!0;return;case"allow":case"disallow":t?p!==""&&!p.startsWith("/")&&!p.startsWith("*")&&e.push({kind:"badPath",line:r}):e.push({kind:"noGroup",line:r});return;case"sitemap":e.push({kind:"ownSitemap",line:r});return;case"crawl-delay":e.push({kind:"crawlDelay",line:r});return;case"host":case"clean-param":return}const h=Ee(d);e.push(h?{kind:"unknownSuggest",line:r,word:d,suggestion:h}:{kind:"unknown",line:r,word:d})}),e}function je(i){return new TextEncoder().encode(i).length}function Re(i,e){return y(i[e.kind],{line:e.line,word:e.word??"",suggestion:e.suggestion??""})}class De extends HTMLElement{static observedAttributes=["disabled","invalid","ui-locale"];current="";control=null;panel=null;meter=null;builtFor="";get value(){return this.current}set value(e){this.current=typeof e=="string"?e:e==null?"":String(e),this.control&&this.control.value!==this.current&&(this.control.value=this.current),this.update()}connectedCallback(){this.build()}attributeChangedCallback(e){if(this.isConnected){if(e==="ui-locale"){this.build();return}this.sync()}}labels(){return N(_(this))}build(){const e=_(this);if(this.builtFor===e&&this.control){this.sync();return}this.builtFor=e,this.replaceChildren();const t=S("seo-robotstxt-lint"),s=n("textarea","seo-robotstxt__control");s.spellcheck=!1,s.setAttribute("wrap","off"),s.value=this.current,s.setAttribute("aria-describedby",t);const o=this.getAttribute("field-name");o&&s.setAttribute("aria-label",o),s.addEventListener("input",()=>{this.hasAttribute("disabled")||(this.current=s.value,this.update(),L(this,"summer-change",{value:this.current}))});const r=n("div","seo-robotstxt__lint");r.id=t,r.setAttribute("role","status");const a=n("div","seo-robotstxt__size");this.control=s,this.panel=r,this.meter=a,this.append(s,r,a),this.sync()}sync(){this.control&&(this.control.readOnly=this.hasAttribute("disabled"),this.classList.toggle("seo-robotstxt--invalid",this.hasAttribute("invalid")),this.control.setAttribute("aria-invalid",this.hasAttribute("invalid")?"true":"false"),this.update())}update(){if(!this.panel||!this.meter)return;const e=this.labels(),t=_(this),s=Pe(this.current),o=[];if(s.length===0){const l=n("div","seo-robotstxt__finding seo-robotstxt__finding--clean");l.append(x("circle-check"),n("span","",e.clean)),o.push(l)}else{for(const l of s.slice(0,U)){const d=n("div","seo-robotstxt__finding");d.append(x("triangle-alert"),n("span","",Re(e,l))),o.push(d)}s.length>U&&o.push(n("div","seo-robotstxt__more",y(e.moreFindings,{count:C(s.length-U,t)})))}this.panel.replaceChildren(...o);const r=je(this.current),a=new Intl.NumberFormat(t,{maximumFractionDigits:1}).format(r/1024)+" KB";this.meter.replaceChildren(n("span","",y(e.size,{size:a})));const c=r>Ce;this.classList.toggle("seo-robotstxt--over",c),c&&this.meter.append(n("span","seo-robotstxt__over",e.tooLarge))}}const yt="golem15-seo-schema",Oe=16*1024;function Z(i){switch(i){case"article":return["BlogPosting","Article","NewsArticle"];case"collection":return["CollectionPage"];case"profile":return["ProfilePage"]}return["WebPage","AboutPage","ContactPage","Service"]}function Ie(i){const e={type:"",fields:{},custom:""};if(typeof i!="string"||i.trim()==="")return e;try{const t=JSON.parse(i);e.type=typeof t.type=="string"?t.type:"",e.fields=t.fields&&typeof t.fields=="object"?{...t.fields}:{},e.custom=typeof t.custom=="string"?t.custom:""}catch{}return e}function Fe(i){const e={};for(const s of["serviceType","areaServed","price","currency"]){const o=(i.fields[s]??"").trim();o!==""&&(e[s]=o)}const t=i.custom.trim();return i.type===""&&t===""&&Object.keys(e).length===0?"":JSON.stringify({type:i.type,fields:e,custom:t})}function Me(i){return i.trim()===""||/^\d+([.,]\d{1,2})?$/.test(i.trim())}function $(i){return i.trim()===""||/^[A-Za-z]{3}$/.test(i.trim())}function X(i,e){const s=i.slice(0,Math.max(0,Math.min(e,i.length))).split(`
`);return{line:s.length,column:s[s.length-1].length+1}}function Y(i){if(i.trim()==="")return{kind:"empty"};if(new TextEncoder().encode(i.trim()).length>Oe)return{kind:"tooLarge"};let e;try{e=JSON.parse(i)}catch(s){const o=s instanceof Error?s.message:String(s),r=/line (\d+) column (\d+)/i.exec(o);if(r)return{kind:"error",line:Number(r[1]),column:Number(r[2]),message:o};const a=/position (\d+)/i.exec(o),c=a?X(i,Number(a[1])):X(i,i.length);return{kind:"error",line:c.line,column:c.column,message:o}}const t=s=>s!==null&&typeof s=="object"&&!Array.isArray(s);return t(e)?{kind:"valid",nodes:1}:Array.isArray(e)&&e.length>0&&e.every(t)?{kind:"valid",nodes:e.length}:{kind:"notObject"}}const Q=(i,e)=>i["t"+e]??e,Ue=(i,e)=>{switch(e){case"BlogPosting":case"Article":case"NewsArticle":return i.noteArticle;case"ContactPage":return i.noteContact;case"Service":return i.noteService;case"CollectionPage":return i.noteCollection;case"ProfilePage":return i.noteProfile}return i.notePage};class He extends HTMLElement{static observedAttributes=["options","disabled","invalid","ui-locale"];current={type:"",fields:{},custom:""};open=!1;status={kind:"empty"};timer;fieldErrors={};connected=!1;get value(){return Fe(this.current)}set value(e){this.current=Ie(e),this.status=Y(this.current.custom),this.open=this.current.custom.trim()!=="",this.render()}connectedCallback(){this.connected=!0,this.render()}disconnectedCallback(){this.connected=!1,clearTimeout(this.timer)}attributeChangedCallback(){this.connected&&this.render()}kind(){const e=P(this,"options",{});return typeof e.kind=="string"?e.kind:""}labels(){return N(_(this))}changed(){L(this,"summer-change",{value:this.value})}effectiveType(){const e=Z(this.kind());return e.includes(this.current.type)?this.current.type:e[0]}render(){if(!this.connected)return;const e=this.labels(),t=this.hasAttribute("disabled"),s=Z(this.kind()),o=[],r=n("div","seo-schema__section"),a=S("seo-schema-type"),c=n("label","seo-schema__label",e.schemaType);if(c.htmlFor=a,s.length>1){const m=n("select","seo-schema__select");m.id=a,m.disabled=t;const b=n("option","",y(e.typeDefault,{type:s[0]}));b.value="",m.append(b);for(const u of s){const f=n("option","",Q(e,u));f.value=u,m.append(f)}m.value=s.includes(this.current.type)?this.current.type:"",m.addEventListener("change",()=>{this.current.type=m.value,this.changed(),this.render()}),r.append(c,m)}else{const m=n("div","seo-schema__fixed",Q(e,s[0]));m.id=a,r.append(c,m)}if(r.append(n("p","seo-schema__note",Ue(e,this.effectiveType()))),o.push(r),this.effectiveType()==="Service"){const m=n("div","seo-schema__grid"),b=(u,f,g,A="",w="")=>{const k=n("div","seo-schema__cell"),v=S("seo-schema-"+u),T=n("label","seo-schema__label",f);T.htmlFor=v;const z=n("input","seo-schema__input");z.id=v,z.type="text",z.disabled=t,z.value=this.current.fields[u]??"",A&&(z.placeholder=A),w&&(z.inputMode=w),u==="currency"&&(z.maxLength=3);const R=n("p","seo-schema__error",this.fieldErrors[u]??"");R.setAttribute("role","status"),z.addEventListener("input",()=>{const F=z.value;(u==="price"?Me(F):u==="currency"?$(F):!0)?(this.current.fields[u]=F,delete this.fieldErrors[u],R.textContent="",this.changed()):(this.fieldErrors[u]=u==="price"?e.priceInvalid:e.currencyInvalid,R.textContent=this.fieldErrors[u])}),u==="currency"&&z.addEventListener("blur",()=>{z.value=z.value.toUpperCase(),$(z.value)&&(this.current.fields.currency=z.value,this.changed())}),k.append(T,z),g&&k.append(n("p","seo-schema__note",g)),k.append(R),m.append(k)};b("serviceType",e.serviceType,"",e.serviceTypePh),b("areaServed",e.areaServed,e.areaServedHint),b("price",e.price,e.priceHint,"","decimal"),b("currency",e.currency,e.currencyHint),o.push(m)}const l=n("div","seo-schema__section"),d=n("button","seo-schema__disclosure");d.type="button",d.setAttribute("aria-expanded",String(this.open));const p=S("seo-schema-custom");d.setAttribute("aria-controls",p),d.append(n("span","",e.custom),x("chevron-down")),d.addEventListener("click",()=>{this.open=!this.open,this.render()});const h=n("div","seo-schema__disclosure-row");if(h.append(d),this.current.custom.trim()!==""&&h.append(n("span","seo-schema__note",e.customSet)),l.append(h),this.open){const m=n("div","seo-schema__panel");m.id=p;const b=S("seo-schema-json"),u=n("p","seo-schema__note",e.customHint);u.id=b+"-hint";const f=n("textarea","seo-schema__json");f.id=b,f.spellcheck=!1,f.disabled=t,f.value=this.current.custom,f.setAttribute("aria-label",e.custom),f.setAttribute("aria-describedby",u.id);const g=n("p","seo-schema__status");g.setAttribute("role","status"),g.setAttribute("aria-live","polite"),this.statusLine(g,e),f.addEventListener("input",()=>{this.current.custom=f.value,this.changed(),clearTimeout(this.timer),this.timer=setTimeout(()=>{this.status=Y(f.value),this.statusLine(g,e)},300)}),m.append(u,f,g),l.append(m)}o.push(l),this.classList.toggle("seo-schema--invalid",this.hasAttribute("invalid")),this.replaceChildren(...o)}statusLine(e,t){const s=this.status;switch(e.className="seo-schema__status",s.kind){case"empty":e.replaceChildren();return;case"valid":e.classList.add("seo-schema__status--ok"),e.replaceChildren(x("circle-check"),n("span","",I(t.jsonValid,s.nodes,_(this))));return;case"error":e.classList.add("seo-schema__status--error"),e.replaceChildren(x("circle-alert"),n("span","",y(t.jsonError,{line:s.line,column:s.column,message:s.message})));return;case"notObject":e.classList.add("seo-schema__status--error"),e.replaceChildren(x("circle-alert"),n("span","",t.jsonNotObject));return;case"tooLarge":e.classList.add("seo-schema__status--error"),e.replaceChildren(x("circle-alert"),n("span","",t.jsonTooLarge))}}}const oe="20px Arial, sans-serif",re="14px Arial, sans-serif",ae=580,le=920,Be=680,We=30,Ge=120;let j;function Je(){if(j!==void 0)return j;try{const e=document.createElement("canvas").getContext("2d");j=e&&typeof e.measureText=="function"?e:null}catch{j=null}return j}function qe(i,e){let t=0;for(const s of i)/[ilIj.,:;'!|]/.test(s)?t+=.28:/[mwMW@]/.test(s)?t+=.85:/[A-Z]/.test(s)?t+=.67:s===" "?t+=.28:t+=.53;return t*e}function W(i,e){const t=Je();if(t){t.font=e;const o=t.measureText(i).width;if(Number.isFinite(o)&&(o>0||i===""))return o}const s=Number.parseFloat(e)||14;return qe(i,s)}const H=" …";function ee(i,e,t){if(W(i,e)<=t)return i;const s=h=>W(h+H,e)<=t,o=Array.from(i),r=[];for(let h=1;h<o.length;h++)/\s/u.test(o[h])&&!/\s/u.test(o[h-1])&&r.push(h);let a=-1,c=0,l=r.length-1;for(;c<=l;){const h=c+l>>1;s(o.slice(0,r[h]).join(""))?(a=h,c=h+1):l=h-1}if(a>=0)return o.slice(0,r[a]).join("")+H;let d=0,p=o.length;for(;d<p;){const h=Math.ceil((d+p)/2);s(o.slice(0,h).join("").trimEnd())?d=h:p=h-1}return o.slice(0,d).join("").trimEnd()+H}function Ve(i){return i==="title"?{font:oe,maxPx:ae,shortChars:We}:{font:re,maxPx:le,shortChars:Ge}}function Ke(i,e){const{font:t,maxPx:s,shortChars:o}=Ve(e),r=i.trim(),a=Array.from(r).length,c=Math.round(W(r,t));let l="good";return r===""?l="empty":c>s?l="long":a<o&&(l="short"),{status:l,chars:a,px:c,maxPx:s}}const Ze="golem15-seo-serp",$e=800,B=3,Xe=300;function Ye(i,e){return i.trim()===""?"":i.split("%title%").join(e.title).split("%description%").join(e.description??"").split("%site%").join(e.site).split(/\s+/).filter(Boolean).join(" ").replace(/^[\s|\-–—·:,]+|[\s|\-–—·:,]+$/gu,"")}function Qe(i){return i.toLowerCase().replace(/ł/g,"l").normalize("NFD").replace(/\p{M}/gu,"")}function te(i){return Qe(i).split(/[^\p{L}\p{N}]+/u).filter(Boolean)}function et(i,e){if(i===e)return!0;const t=Array.from(i),s=Array.from(e);if(t.length<5||s.length<5)return!1;const o=Math.max(5,Math.min(t.length,s.length)-3);let r=0;for(;r<t.length&&r<s.length&&t[r]===s[r];)r++;return r>=o}function D(i,e){const t=te(i);if(t.length===0)return!1;const s=te(e);for(let o=0;o+t.length<=s.length;o++){let r=!0;for(let a=0;a<t.length;a++)if(!et(t[a],s[o+a])){r=!1;break}if(r)return!0}return!1}function E(i,e,t){const s=i[e];if(typeof s=="string")return s;if(s&&typeof s=="object"){const o=s[t];return typeof o=="string"?o:""}return""}class tt extends HTMLElement{static observedAttributes=["fill-values","busy","state","record-id","ui-locale","locale","disabled"];context=null;contextFailed=!1;device="desktop";shownLocale="";actions=new J(this,e=>this.failed(e));duplicates=new Map;checking=!1;timer;lastChecked="";connected=!1;onResult=e=>{const s=e.detail?.data;this.actions.settle(),s&&s.op==="context"?(this.context=s,this.contextFailed=!1,this.render(),this.scheduleDuplicates(!0)):s&&s.op==="duplicates"&&(this.duplicates.set(s.locale,s),this.checking=!1,this.render())};onLocale=e=>{const t=e.detail;typeof t=="string"&&t!==""&&t!==this.shownLocale&&(this.shownLocale=t,this.render(),this.scheduleDuplicates(!1))};connectedCallback(){this.connected=!0,this.addEventListener("summer-result",this.onResult),window.addEventListener("summer:ml-locale",this.onLocale),this.render(),queueMicrotask(()=>{this.connected&&(this.context?this.scheduleDuplicates(!0):this.request({op:"context"}))})}disconnectedCallback(){this.connected=!1,this.removeEventListener("summer-result",this.onResult),window.removeEventListener("summer:ml-locale",this.onLocale),clearTimeout(this.timer),this.actions.reset(),this.checking=!1,this.lastChecked=""}attributeChangedCallback(e,t,s){if(this.connected){if(e==="busy"&&s===null){this.actions.flush();return}if(e==="state"&&s==="error"){const o=this.actions.settle();o?this.failed(o):(this.checking=!1,this.render());return}if(e==="fill-values"){this.render(),this.scheduleDuplicates(!1);return}this.render()}}labels(){return N(_(this))}request(e){this.actions.request(e)}failed(e){e.op==="context"?this.contextFailed=!0:this.lastChecked="",this.checking=!1,this.render()}fill(){return P(this,"fill-values",{})}locale(){const e=this.context?.locales??[];return e.length===0?null:e.find(t=>t.locale===this.shownLocale)??e[0]}scheduleDuplicates(e){const t=this.locale();if(!t)return;const s=this.fill(),o=E(s,"seo_title",t.locale)||E(s,"title",t.locale),r=E(s,"seo_description",t.locale)||E(s,"description",t.locale),a=JSON.stringify([t.locale,o,r]);if(a===this.lastChecked)return;clearTimeout(this.timer);const c=()=>{this.lastChecked=a,this.checking=!0,this.render(),this.request({op:"duplicates",locale:t.locale,title:o,description:r})};e?c():this.timer=setTimeout(c,$e)}render(){const e=this.labels(),t=_(this);if(!this.context&&!this.contextFailed){this.setAttribute("aria-busy","true"),this.replaceChildren(n("div","seo-serp__skeleton"));return}this.removeAttribute("aria-busy");const s=this.locale(),o=s?.locale??this.shownLocale,r=this.fill(),a=(E(r,"seo_title",o)||E(r,"title",o)).trim(),c=(E(r,"seo_description",o)||E(r,"description",o)).trim(),l=E(r,"seo_keyphrase",o).trim(),d=s?.siteName??"",p=a||Ye(s?.titleTemplate??"",{title:s?.defaultTitle??"",site:d})||s?.defaultTitle||"",h=c||s?.defaultDescription||"",m=n("div","seo-serp__header"),b=n("div","seo-serp__track");b.setAttribute("role","radiogroup"),b.setAttribute("aria-label",e.device);for(const v of["desktop","mobile"]){const T=n("button","seo-serp__segment",e[v]);T.type="button",T.setAttribute("role","radio"),T.setAttribute("aria-checked",this.device===v?"true":"false"),T.addEventListener("click",()=>{this.device=v,this.render()}),b.append(T)}m.append(b),o&&m.append(n("span","seo-serp__language",y(e.language,{locale:o.toUpperCase()})));const u=n("div","serp-card"+(this.device==="mobile"?" serp-card--mobile":"")),f=n("div","serp-card__site");f.append(n("span","serp-card__favicon",Array.from(d||this.context?.host||"?")[0]?.toUpperCase()??"?"));const g=n("div","serp-card__names");if(g.append(n("span","serp-card__sitename",d||this.context?.host||"")),g.append(n("span","serp-card__crumbs",st(this.context?.host??"",s?.url??null))),f.append(g),u.append(f),u.append(n("div","serp-card__title",ee(p,oe,ae))),h){const v=this.device==="mobile"?Be:le;u.append(n("div","serp-card__description",ee(h,re,v)))}else u.append(n("div","serp-card__description serp-card__description--missing",e.noDescription));const A=n("div","seo-serp__notes");if(this.contextFailed){const v=n("div","seo-serp__error");v.setAttribute("role","status"),v.append(x("circle-alert"),n("span","",e.contextFailed)),A.append(v)}!a&&s?.titleTemplate&&A.append(n("div","",y(e.fromTemplate,{template:s.titleTemplate}))),!c&&s?.defaultDescription&&s.descriptionSource==="content"&&A.append(n("div","",e.fromContent)),s&&s.url===null&&A.append(n("div","",e.noUrl)),(this.getAttribute("record-id")??"")!==""&&s&&A.append(n("div","",e.savedNote));const w=n("div","seo-serp__checks");if(w.setAttribute("role","status"),this.checking)w.append(n("div","seo-serp__checking",e.checking));else{const v=this.duplicates.get(o);if(v)for(const[T,z]of[[v.title,e.dupTitle],[v.description,e.dupDescription]])T.length>0&&w.append(it(T,z,e,t))}const k=[m,u,A,w];l&&s&&k.push(nt(l,{title:p,description:h,h1:s.h1,url:s.url,bodyWords:s.bodyWords},e,t)),this.replaceChildren(...k)}}function st(i,e){const t=(e??"").split("?")[0].split("/").filter(Boolean).map(s=>{try{return decodeURIComponent(s)}catch{return s}});return[i,...t].filter(Boolean).join(" › ")}function it(i,e,t,s){const o=n("div","seo-serp__check seo-serp__check--warn");o.append(x("triangle-alert"));const r=n("span"),a="\0list\0",c=I(e,i.length,s,{list:a}),[l,d]=c.split(a);return r.append(document.createTextNode(l??"")),i.slice(0,B).forEach((p,h)=>{if(h>0&&r.append(document.createTextNode(", ")),p.url.startsWith("/")&&!p.url.startsWith("//")){const m=n("a","seo-serp__link",p.label);m.href=p.url,m.target="_blank",m.rel="noopener",r.append(m)}else r.append(document.createTextNode(p.label))}),i.length>B&&r.append(document.createTextNode(" "+y(t.andMore,{count:i.length-B}))),r.append(document.createTextNode(d??"")),o.append(r),o}function nt(i,e,t,s){const o=n("div","seo-serp__keyphrase");o.append(n("div","seo-serp__keyphrase-title",y(t.keyphrase,{phrase:i})));const r=(a,c,l)=>{const d=n("div","seo-serp__check "+(a?"seo-serp__check--ok":"seo-serp__check--warn"));d.append(x(a?"circle-check":"triangle-alert"),n("span","",a?c:l)),o.append(d)};if(r(D(i,e.title),t.kpTitle,t.kpTitleNo),e.h1!==null&&r(D(i,e.h1),t.kpH1,t.kpH1No),r(D(i,e.description),t.kpDesc,t.kpDescNo),e.url!==null&&r(D(i,e.url.replace(/[-_/]+/g," ")),t.kpUrl,t.kpUrlNo),e.bodyWords!==null){const a=new Intl.NumberFormat(s).format(e.bodyWords);r(e.bodyWords>=Xe,y(t.kpLength,{count:a}),y(t.kpLengthNo,{count:a}))}return o}const ot="golem15-seo-text",rt={empty:"info",short:"triangle-alert",long:"triangle-alert",good:"circle-check"};class at extends HTMLElement{static observedAttributes=["options","disabled","invalid","ui-locale","locale"];current="";control=null;statusIcon=null;statusText=null;countText=null;live=null;lastStatus=null;builtFor="";get value(){return this.current}set value(e){this.current=typeof e=="string"?e:e==null?"":String(e),this.control&&this.control.value!==this.current&&(this.control.value=this.current),this.update(!1)}connectedCallback(){this.build()}attributeChangedCallback(e){if(this.isConnected){if(e==="options"||e==="ui-locale"){this.build();return}this.sync()}}measure(){return P(this,"options",{}).measure==="description"?"description":"title"}labels(){return N(_(this))}build(){const e=this.measure()+"|"+_(this);if(this.builtFor===e&&this.control){this.sync();return}this.builtFor=e,this.replaceChildren();const t=S("seo-text-counter"),o=this.measure()==="description"?n("textarea","seo-text__control seo-text__control--area"):n("input","seo-text__control");o instanceof HTMLTextAreaElement?o.rows=3:o.type="text",o.value=this.current,o.setAttribute("aria-describedby",t);const r=this.getAttribute("field-name");r&&o.setAttribute("aria-label",r),o.addEventListener("input",()=>{this.hasAttribute("disabled")||(this.current=o.value.replace(/\s+$/u,""),this.update(!0),L(this,"summer-change",{value:this.current}))});const a=n("div","seo-text__counter");a.id=t;const c=n("span","seo-text__status");this.statusIcon=n("span","seo-text__icon"),this.statusText=n("span","seo-text__status-text"),c.append(this.statusIcon,this.statusText),this.countText=n("span","seo-text__count"),a.append(c,this.countText),this.live=n("span","seo-visually-hidden"),this.live.setAttribute("aria-live","polite"),this.live.setAttribute("role","status"),this.control=o,this.lastStatus=null,this.append(o,a,this.live),this.sync()}sync(){if(!this.control)return;const e=this.hasAttribute("disabled");this.control.readOnly=e,this.classList.toggle("seo-text--invalid",this.hasAttribute("invalid")),this.control.setAttribute("aria-invalid",this.hasAttribute("invalid")?"true":"false"),this.update(!1)}update(e){if(!this.statusText||!this.countText||!this.statusIcon)return;const t=this.labels(),s=_(this),o=this.measure(),r=Ke(this.current,o),a=lt(t,r.status,o);this.statusIcon.replaceChildren(x(rt[r.status])),this.statusText.textContent=a,this.dataset.status=r.status,this.countText.textContent=y(t.count,{chars:C(r.chars,s),px:C(r.px,s),max:C(r.maxPx,s)}),e&&this.live&&r.status!==this.lastStatus&&(this.live.textContent=a),this.lastStatus=r.status}}function lt(i,e,t){switch(e){case"empty":return t==="title"?i.emptyTitle:i.emptyDescription;case"short":return t==="title"?i.shortTitle:i.shortDescription;case"long":return t==="title"?i.longTitle:i.longDescription;default:return i.good}}const ct="golem15-seo-transfer",se=60*1024,G=200;function dt(i){return i.summary.refused>0?"refused":i.count>0?"ready":"nothing"}function ut(i){const e=i.filter(s=>s.change==="refused"),t=i.filter(s=>s.change!=="refused");return[...e,...t].slice(0,G)}function ht(i,e){const t=new Blob([e],{type:"text/csv;charset=utf-8"}),s=URL.createObjectURL(t),o=document.createElement("a");o.href=s,o.download=i,o.rel="noopener",document.body.append(o),o.click(),o.remove(),setTimeout(()=>URL.revokeObjectURL(s),0)}function pt(){return window.location.pathname.replace(/\/transfer(\/.*)?$/,"/history")}class mt extends HTMLElement{static observedAttributes=["busy","state","ui-locale","disabled","label","busy-label"];connected=!1;pending=null;exportDataset="redirects";importDataset="redirects";fileName="";csv="";fileError="";importError="";exportError="";applyError="";preview=null;applied=!1;onResult=e=>{const s=e.detail?.data;if(this.pending=null,!s){this.render();return}s.error!==void 0?s.op==="export"?this.exportError=s.message:s.op==="preview"?(this.importError=s.message,this.preview=null):this.applyError=s.message:s.op==="export"?(this.exportError="",ht(s.filename,s.csv)):s.op==="preview"?(this.importError="",this.applyError="",this.applied=!1,this.preview=s):s.op==="apply"&&(this.preview=null,this.applyError="",this.applied=!0),this.render()};connectedCallback(){this.connected=!0,this.addEventListener("summer-result",this.onResult),this.render()}disconnectedCallback(){this.connected=!1,this.removeEventListener("summer-result",this.onResult)}attributeChangedCallback(e,t,s){this.connected&&(e==="state"&&s==="error"&&(this.pending=null),e==="busy"&&s===null&&(this.pending=null),this.render())}labels(){return N(_(this))}request(e){this.hasAttribute("disabled")||this.hasAttribute("busy")||this.pending||(this.pending=e.op,L(this,"summer-action",{payload:e}),this.render())}busyLabel(e,t){return this.pending===e&&this.getAttribute("busy-label")||t}datasetSelect(e,t,s){const o=n("div","seo-transfer__field"),r=S("seo-transfer-dataset"),a=n("label","seo-transfer__label",e.dataset);a.htmlFor=r;const c=n("select","seo-transfer__select");c.id=r;const l=[["redirects",e.dsRedirects],["rules",e.dsRules],["records",e.dsRecords]];for(const[d,p]of l){const h=n("option","",p);h.value=d,c.append(h)}return c.value=t,c.disabled=this.hasAttribute("disabled"),c.addEventListener("change",()=>s(c.value)),o.append(a,c),o}button(e,t,s){const o=n("button","seo-transfer__button seo-transfer__button--"+t,e);return o.type="button",o.addEventListener("click",s),o}message(e,t){const s=n("p",t,e);return s.setAttribute("role","status"),s}async chooseFile(e){const t=e.files?.[0];if(this.preview=null,this.applied=!1,this.importError="",this.applyError="",this.csv="",!t){this.fileName="",this.fileError="",this.render();return}if(this.fileName=t.name,t.size>se){this.fileError=y(this.labels().fileTooLarge,{limit:C(se/1024,_(this))+" KB"}),this.render();return}try{this.csv=await t.text(),this.fileError=""}catch{this.fileError=this.labels().readFailed}this.render()}render(){const e=this.labels(),t=_(this),s=this.hasAttribute("disabled"),o=this.hasAttribute("busy")||this.pending!==null,r=this.getAttribute("label")||e.chooseFile,a=n("section","seo-transfer__section");a.append(n("h3","seo-transfer__heading",e.exportHeading));const c=n("div","seo-transfer__row");c.append(this.datasetSelect(e,this.exportDataset,f=>this.exportDataset=f));const l=this.button(this.busyLabel("export",e.download),"outline",()=>this.request({op:"export",dataset:this.exportDataset}));l.disabled=o,l.hidden=s,c.append(l),a.append(c),this.exportError&&a.append(this.message(this.exportError,"seo-transfer__error"));const d=n("section","seo-transfer__section seo-transfer__section--import");d.append(n("h3","seo-transfer__heading",e.importHeading));const p=n("div","seo-transfer__row");p.append(this.datasetSelect(e,this.importDataset,f=>{this.importDataset=f,this.preview=null,this.render()}));const h=n("input","seo-transfer__file");h.type="file",h.accept=".csv,text/csv",h.hidden=!0,h.addEventListener("change",()=>{this.chooseFile(h)});const m=this.button(e.chooseFile,"outline",()=>h.click());m.hidden=s,m.disabled=o;const b=n("span",this.fileName?"seo-transfer__filename":"seo-transfer__filename seo-transfer__filename--none",this.fileName||e.noFile),u=this.button(this.busyLabel("preview",r),"outline",()=>this.request({op:"preview",dataset:this.importDataset,csv:this.csv}));if(u.disabled=o||this.csv===""||this.fileError!=="",u.hidden=s,p.append(h,m,b,u),d.append(p),(this.fileError||this.importError)&&d.append(this.message(this.fileError||this.importError,"seo-transfer__error")),this.applied){const f=n("p","seo-transfer__done"),g=n("a","seo-transfer__link",e.openHistory);g.href=pt(),f.append(g),d.append(f)}this.preview&&d.append(this.renderPreview(e,t,o,s)),this.replaceChildren(a,d)}renderPreview(e,t,s,o){const r=this.preview,a=n("div","seo-transfer__preview"),c=r.summary;a.append(this.message(y(e.summary,{new:C(c.new,t),changed:C(c.changed,t),unchanged:C(c.unchanged,t),refused:C(c.refused,t)}),"seo-transfer__summary"));const l=n("div","summer-table-wrap seo-transfer__table-wrap"),d=n("table","summer-table seo-transfer__table"),p=n("tr");for(const w of[e.colLine,e.colChange,e.colAddress,e.colField,e.colBefore,e.colAfter,e.colNote])p.append(n("th","",w));const h=n("thead");h.append(p);const m=n("tbody"),b={new:e.bNew,changed:e.bChanged,unchanged:e.bUnchanged,refused:e.bRefused};for(const w of ut(r.rows)){const k=n("tr","seo-transfer__tr--"+w.change);k.append(n("td","seo-transfer__num",C(w.line,t)));const v=n("td");v.append(n("span","seo-transfer__badge seo-transfer__badge--"+w.change,b[w.change])),w.warning&&v.append(n("span","seo-transfer__badge seo-transfer__badge--warning",e.bWarning)),k.append(v),k.append(n("td","seo-transfer__mono",w.address)),k.append(n("td","",w.field)),k.append(n("td","",w.before)),k.append(n("td","",w.after)),k.append(n("td","",w.note)),m.append(k)}d.append(h,m),l.append(d),a.append(l),(r.total>G||r.rows.length>G)&&a.append(n("p","seo-transfer__note",y(e.rowCap,{count:C(Math.max(r.total,r.rows.length),t)})));const u=dt(r);u==="refused"?a.append(this.message(e.refusedBlocks,"seo-transfer__error")):u==="nothing"&&a.append(this.message(e.nothing,"seo-transfer__note")),this.applyError&&a.append(this.message(this.applyError,"seo-transfer__error"));const f=n("div","seo-transfer__actions"),g=this.button(e.discard,"ghost",()=>{this.preview=null,this.applyError="",this.render()});g.disabled=s;const A=this.button(this.busyLabel("apply",I(e.applyCount,r.count,t)),"primary",()=>this.request({op:"apply",token:r.token}));return A.disabled=s||u!=="ready",f.append(g,A),f.hidden=o,a.append(f),a}}const ft=[[ot,at],[ve,xe],[Ze,tt],[fe,be],[Te,De],[Ae,Se],[ct,mt],["golem15-seo-schema",He],["golem15-seo-graph",me],["golem15-seo-parent",ye]];for(const[i,e]of ft)customElements.get(i)||customElements.define(i,e);export{bt as GRAPH_TAG,fe as IMAGE_TAG,wt as PARENT_TAG,Ae as ROBOTSTESTER_TAG,Te as ROBOTSTXT_TAG,ve as ROBOTS_TAG,yt as SCHEMA_TAG,Ze as SERP_TAG,me as SeoGraphElement,be as SeoImageElement,ye as SeoParentElement,xe as SeoRobotsElement,Se as SeoRobotsTesterElement,De as SeoRobotsTxtElement,He as SeoSchemaElement,tt as SeoSerpElement,at as SeoTextElement,mt as SeoTransferElement,ot as TEXT_TAG,ct as TRANSFER_TAG};