hermesbuttons 1.1.4 → 1.1.5

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.
@@ -1,4 +1,4 @@
1
- "use strict";var HermesButtons=(()=>{var z=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var Z=Object.getOwnPropertyNames;var X=Object.prototype.hasOwnProperty;var Q=(a,n)=>{for(var t in n)z(a,t,{get:n[t],enumerable:!0})},tt=(a,n,t,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Z(n))!X.call(a,o)&&o!==t&&z(a,o,{get:()=>n[o],enumerable:!(e=J(n,o))||e.enumerable});return a};var et=a=>tt(z({},"__esModule",{value:!0}),a);var ht={};Q(ht,{ALT_BRAND_COLOR:()=>m,BRAND_COLOR:()=>i,HERMES_ICON:()=>x,HERMES_SKILL_ICON:()=>k,HermesButton:()=>A,HermesPopupDialog:()=>F,HermesSkillButton:()=>_,createHermesButton:()=>U,createHermesSkillButton:()=>W,discoverButtons:()=>D,generateStructuredData:()=>I,injectStructuredData:()=>G,register:()=>dt,registerHermesButton:()=>T,registerHermesSkillButton:()=>$,resolveTheme:()=>p,showPopup:()=>C,themes:()=>y});var P="agentpreferences";function q(){return typeof document<"u"}function ot(){if(!q())return null;let a=document.cookie.split(";").map(t=>t.trim()).find(t=>t.startsWith(`${P}=`));if(!a)return null;let n=a.slice(P.length+1);if(!n)return null;try{let t=decodeURIComponent(n),e=JSON.parse(t);return!e||typeof e!="object"||!Array.isArray(e.order)?null:{order:e.order.filter(r=>typeof r=="string"&&r.length>0)}}catch{return null}}function at(a){if(!q())return;let n=a.order.slice(0,24),t=JSON.stringify({order:n}),e=new Date;e.setFullYear(e.getFullYear()+1),document.cookie=`${P}=${encodeURIComponent(t)}; Path=/; SameSite=Lax; Expires=${e.toUTCString()}`}function f(a){if(!a||typeof a!="string")return;let t=ot()?.order.filter(e=>e!==a)??[];at({order:[a,...t]})}var x=`<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="hb-icon">
1
+ "use strict";var HermesButtons=(()=>{var P=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var Z=Object.getOwnPropertyNames;var X=Object.prototype.hasOwnProperty;var Q=(a,n)=>{for(var t in n)P(a,t,{get:n[t],enumerable:!0})},tt=(a,n,t,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Z(n))!X.call(a,o)&&o!==t&&P(a,o,{get:()=>n[o],enumerable:!(e=J(n,o))||e.enumerable});return a};var et=a=>tt(P({},"__esModule",{value:!0}),a);var lt={};Q(lt,{ALT_BRAND_COLOR:()=>m,BRAND_COLOR:()=>i,HERMES_ICON:()=>x,HERMES_SKILL_ICON:()=>k,HermesButton:()=>A,HermesPopupDialog:()=>F,HermesSkillButton:()=>_,createHermesButton:()=>U,createHermesSkillButton:()=>G,discoverButtons:()=>D,generateStructuredData:()=>I,injectStructuredData:()=>W,register:()=>ht,registerHermesButton:()=>T,registerHermesSkillButton:()=>$,resolveTheme:()=>p,showPopup:()=>C,themes:()=>y});var z="agentpreferences";function q(){return typeof document<"u"}function ot(){if(!q())return null;let a=document.cookie.split(";").map(t=>t.trim()).find(t=>t.startsWith(`${z}=`));if(!a)return null;let n=a.slice(z.length+1);if(!n)return null;try{let t=decodeURIComponent(n),e=JSON.parse(t);return!e||typeof e!="object"||!Array.isArray(e.order)?null:{order:e.order.filter(r=>typeof r=="string"&&r.length>0)}}catch{return null}}function at(a){if(!q())return;let n=a.order.slice(0,24),t=JSON.stringify({order:n}),e=new Date;e.setFullYear(e.getFullYear()+1),document.cookie=`${z}=${encodeURIComponent(t)}; Path=/; SameSite=Lax; Expires=${e.toUTCString()}`}function f(a){if(!a||typeof a!="string")return;let t=ot()?.order.filter(e=>e!==a)??[];at({order:[a,...t]})}var x=`<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="hb-icon">
2
2
  <!-- Wing helmet -->
3
3
  <path d="M12 2C8.5 2 6 4.5 6 7c0 1.5.5 2.8 1.5 3.8L6 14h12l-1.5-3.2C17.5 9.8 18 8.5 18 7c0-2.5-2.5-5-6-5z" fill="currentColor" opacity="0.2"/>
4
4
  <path d="M12 2C8.5 2 6 4.5 6 7c0 1.5.5 2.8 1.5 3.8L6 14h12l-1.5-3.2C17.5 9.8 18 8.5 18 7c0-2.5-2.5-5-6-5z" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linejoin="round"/>
@@ -899,5 +899,5 @@
899
899
  <span class="hb-btn-icon" aria-hidden="true">${k}</span>
900
900
  <span class="hb-btn-label">Run on Hermes Skills</span>
901
901
  </button>
902
- `;let E=this.shadowRoot.querySelector(".hb-btn");E.addEventListener("click",()=>this.handleClick()),E.addEventListener("keydown",g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),this.handleClick())}),this._rendered=!0,this.setupSystemThemeWatch()}handleClick(){let{popup:t,command:e,popupTitle:o,popupDescription:r}=this._options;if(this.dispatchEvent(new CustomEvent("hb-open",{bubbles:!0,composed:!0,detail:{command:e}})),t===!1){navigator.clipboard.writeText(e).then(()=>{this._options.onCopy?.(e),f("hermes-skill"),this.dispatchEvent(new CustomEvent("hb-copy",{bubbles:!0,composed:!0,detail:{command:e}}))});return}C({variant:"hermes-skill",theme:this.getResolvedTheme(),title:o||"Run on Hermes Skills",description:r||"Copy and paste into a Hermes session to get started.",command:e,onCopy:s=>{this._options.onCopy?.(s),f("hermes-skill"),this.dispatchEvent(new CustomEvent("hb-copy",{bubbles:!0,composed:!0,detail:{command:s}}))},onClose:()=>{this.dispatchEvent(new CustomEvent("hb-close",{bubbles:!0,composed:!0}))}})}setupSystemThemeWatch(){if(this._mqCleanup?.(),this._mqCleanup=null,this.getResolvedTheme()!=="system"||typeof window>"u")return;let t=window.matchMedia("(prefers-color-scheme: dark)"),e=()=>this.render();t.addEventListener("change",e),this._mqCleanup=()=>t.removeEventListener("change",e)}};_.observedAttributes=["command","theme","size","variant","shape","popup","popup-title","popup-description"];function $(a="hermes-skill-button"){typeof customElements>"u"||customElements.get(a)||customElements.define(a,_)}$();function W(a){let n=document.createElement("hermes-skill-button");return n.options=a,n}function D(){if(typeof document>"u")return[];let a=[];return document.querySelectorAll("hermes-button").forEach(n=>{let t=n.getAttribute("command")||"",r=n.getAttribute("prompt-flag")!=="false"?`hermes -p "${t}"`:t;a.push({platform:"hermes",command:t,fullCommand:r})}),document.querySelectorAll("hermes-skill-button").forEach(n=>{let t=n.getAttribute("command")||"";a.push({platform:"hermes-skill",command:t})}),a}function I(){let a=D();return a.length===0?{}:{"@context":"https://schema.org","@type":"WebPage",potentialAction:a.map(t=>{if(t.platform==="hermes")return{"@type":"Action",name:`Run on Hermes: ${t.command}`,description:t.command,target:{"@type":"EntryPoint",urlTemplate:`https://hermes.ai/run?command=${encodeURIComponent(t.fullCommand||t.command)}`,actionPlatform:"https://hermes.ai/run"},object:{"@type":"SoftwareSourceCode",runtimePlatform:"Hermes Agent",text:t.fullCommand||t.command}};let e={"@type":"EntryPoint",actionPlatform:"https://hermes.ai/skills",urlTemplate:`https://hermes.ai/skills?command=${encodeURIComponent(t.command)}`};return{"@type":"Action",name:`Run on Hermes Skills: ${t.command}`,description:t.command,target:e}})}}function G(){if(typeof document>"u")return;let a=document.querySelector("script[data-hermesbuttons-jsonld]");a&&a.remove();let n=I();if(!n||!("potentialAction"in n))return;let t=document.createElement("script");t.type="application/ld+json",t.setAttribute("data-hermesbuttons-jsonld",""),t.textContent=JSON.stringify(n,null,2),document.head.appendChild(t)}var K="https://hermesbuttons.vercel.app/api/ping",Y=!1;function st(){if(Y||typeof window>"u"||typeof navigator>"u")return;let a=window.location?.origin;if(!(!a||a==="null"||a.startsWith("file:"))){Y=!0;try{let n=JSON.stringify({origin:a}),t=new Blob([n],{type:"text/plain"});typeof navigator.sendBeacon=="function"?navigator.sendBeacon(K,t):fetch(K,{method:"POST",body:n,keepalive:!0}).catch(()=>{})}catch{}}}if(typeof window<"u")try{st()}catch{}function dt(){T(),$()}return et(ht);})();
902
+ `;let E=this.shadowRoot.querySelector(".hb-btn");E.addEventListener("click",()=>this.handleClick()),E.addEventListener("keydown",g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),this.handleClick())}),this._rendered=!0,this.setupSystemThemeWatch()}handleClick(){let{popup:t,command:e,popupTitle:o,popupDescription:r}=this._options;if(this.dispatchEvent(new CustomEvent("hb-open",{bubbles:!0,composed:!0,detail:{command:e}})),t===!1){navigator.clipboard.writeText(e).then(()=>{this._options.onCopy?.(e),f("hermes-skill"),this.dispatchEvent(new CustomEvent("hb-copy",{bubbles:!0,composed:!0,detail:{command:e}}))});return}C({variant:"hermes-skill",theme:this.getResolvedTheme(),title:o||"Run on Hermes Skills",description:r||"Copy and paste into a Hermes session to get started.",command:e,onCopy:s=>{this._options.onCopy?.(s),f("hermes-skill"),this.dispatchEvent(new CustomEvent("hb-copy",{bubbles:!0,composed:!0,detail:{command:s}}))},onClose:()=>{this.dispatchEvent(new CustomEvent("hb-close",{bubbles:!0,composed:!0}))}})}setupSystemThemeWatch(){if(this._mqCleanup?.(),this._mqCleanup=null,this.getResolvedTheme()!=="system"||typeof window>"u")return;let t=window.matchMedia("(prefers-color-scheme: dark)"),e=()=>this.render();t.addEventListener("change",e),this._mqCleanup=()=>t.removeEventListener("change",e)}};_.observedAttributes=["command","theme","size","variant","shape","popup","popup-title","popup-description"];function $(a="hermes-skill-button"){typeof customElements>"u"||customElements.get(a)||customElements.define(a,_)}$();function G(a){let n=document.createElement("hermes-skill-button");return n.options=a,n}function D(){if(typeof document>"u")return[];let a=[];return document.querySelectorAll("hermes-button").forEach(n=>{let t=n.getAttribute("command")||"",r=n.getAttribute("prompt-flag")!=="false"?`hermes -p "${t}"`:t;a.push({platform:"hermes",command:t,fullCommand:r})}),document.querySelectorAll("hermes-skill-button").forEach(n=>{let t=n.getAttribute("command")||"";a.push({platform:"hermes-skill",command:t})}),a}function I(){let a=D();return a.length===0?{}:{"@context":"https://schema.org","@type":"WebPage",potentialAction:a.map(t=>{if(t.platform==="hermes")return{"@type":"Action",name:`Run on Hermes: ${t.command}`,description:t.command,target:{"@type":"EntryPoint",urlTemplate:`https://hermes.ai/run?command=${encodeURIComponent(t.fullCommand||t.command)}`,actionPlatform:"https://hermes.ai/run"},object:{"@type":"SoftwareSourceCode",runtimePlatform:"Hermes Agent",text:t.fullCommand||t.command}};let e={"@type":"EntryPoint",actionPlatform:"https://hermes.ai/skills",urlTemplate:`https://hermes.ai/skills?command=${encodeURIComponent(t.command)}`};return{"@type":"Action",name:`Run on Hermes Skills: ${t.command}`,description:t.command,target:e}})}}function W(){if(typeof document>"u")return;let a=document.querySelector("script[data-hermesbuttons-jsonld]");a&&a.remove();let n=I();if(!n||!("potentialAction"in n))return;let t=document.createElement("script");t.type="application/ld+json",t.setAttribute("data-hermesbuttons-jsonld",""),t.textContent=JSON.stringify(n,null,2),document.head.appendChild(t)}var K="https://hermesbuttons.vercel.app/api/ping",st="hermesbuttons",Y=!1;function dt(){if(Y||typeof window>"u"||typeof navigator>"u")return;let a=window.location?.origin;if(!(!a||a==="null"||a.startsWith("file:"))){Y=!0;try{let n=JSON.stringify({origin:a,pkg:st}),t=new Blob([n],{type:"text/plain"});typeof navigator.sendBeacon=="function"?navigator.sendBeacon(K,t):fetch(K,{method:"POST",body:n,keepalive:!0}).catch(()=>{})}catch{}}}if(typeof window<"u")try{dt()}catch{}function ht(){T(),$()}return et(lt);})();
903
903
  //# sourceMappingURL=index.global.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/agent-preferences.ts","../src/icons.ts","../src/themes.ts","../src/popup-dialog.ts","../src/hermes-button.ts","../src/hermes-skill-button.ts","../src/structured-data.ts","../src/beacon.ts"],"sourcesContent":["export type { Theme, Size, Variant, Shape, HermesButtonOptions, HermesSkillButtonOptions, PopupOptions, ThemeTokens } from './types';\n\nexport { HermesButton, createHermesButton, registerHermesButton } from './hermes-button';\nexport { HermesSkillButton, createHermesSkillButton, registerHermesSkillButton } from './hermes-skill-button';\nexport { HermesPopupDialog, showPopup } from './popup-dialog';\n\nexport { HERMES_ICON, HERMES_SKILL_ICON } from './icons';\nexport { themes, resolveTheme, BRAND_COLOR, ALT_BRAND_COLOR } from './themes';\n\nexport type { ButtonMetadata } from './structured-data';\nexport { discoverButtons, generateStructuredData, injectStructuredData } from './structured-data';\n\nimport { registerHermesButton } from './hermes-button';\nimport { registerHermesSkillButton } from './hermes-skill-button';\n\n/**\n * Manually register all custom elements.\n * Called automatically on import, but exposed for frameworks\n * that need explicit registration timing (Angular, micro-frontends).\n */\nexport function register() {\n registerHermesButton();\n registerHermesSkillButton();\n}\n\nimport './beacon';\n\nexport type {} from './jsx.d';\n","/**\n * Cross-site preference cookie for the agentbuttons family (same origin).\n * Name and JSON shape must match claudebuttons, clawbuttons, and agentbuttons.\n */\nexport const AGENT_PREFERENCES_COOKIE_NAME = 'agentpreferences';\n\nexport const MAX_AGENT_PREFERENCE_ENTRIES = 24;\n\nexport interface AgentPreferencesPayload {\n /** Most recently used agent ids first. */\n order: string[];\n}\n\nfunction isBrowser(): boolean {\n return typeof document !== 'undefined';\n}\n\nexport function readAgentPreferences(): AgentPreferencesPayload | null {\n if (!isBrowser()) return null;\n const match = document.cookie\n .split(';')\n .map((p) => p.trim())\n .find((p) => p.startsWith(`${AGENT_PREFERENCES_COOKIE_NAME}=`));\n if (!match) return null;\n const value = match.slice(AGENT_PREFERENCES_COOKIE_NAME.length + 1);\n if (!value) return null;\n try {\n const decoded = decodeURIComponent(value);\n const data = JSON.parse(decoded) as unknown;\n if (!data || typeof data !== 'object' || !Array.isArray((data as AgentPreferencesPayload).order)) {\n return null;\n }\n const order = (data as AgentPreferencesPayload).order.filter(\n (x): x is string => typeof x === 'string' && x.length > 0,\n );\n return { order };\n } catch {\n return null;\n }\n}\n\nexport function writeAgentPreferences(payload: AgentPreferencesPayload): void {\n if (!isBrowser()) return;\n const order = payload.order.slice(0, MAX_AGENT_PREFERENCE_ENTRIES);\n const json = JSON.stringify({ order });\n const expires = new Date();\n expires.setFullYear(expires.getFullYear() + 1);\n document.cookie = `${AGENT_PREFERENCES_COOKIE_NAME}=${encodeURIComponent(json)}; Path=/; SameSite=Lax; Expires=${expires.toUTCString()}`;\n}\n\n/** Move agentId to the front of the MRU list (call after a successful copy / engagement). */\nexport function recordAgentPreference(agentId: string): void {\n if (!agentId || typeof agentId !== 'string') return;\n const prev = readAgentPreferences();\n const base = prev?.order.filter((id) => id !== agentId) ?? [];\n writeAgentPreferences({ order: [agentId, ...base] });\n}\n","export const HERMES_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon\">\n <!-- Wing helmet -->\n <path d=\"M12 2C8.5 2 6 4.5 6 7c0 1.5.5 2.8 1.5 3.8L6 14h12l-1.5-3.2C17.5 9.8 18 8.5 18 7c0-2.5-2.5-5-6-5z\" fill=\"currentColor\" opacity=\"0.2\"/>\n <path d=\"M12 2C8.5 2 6 4.5 6 7c0 1.5.5 2.8 1.5 3.8L6 14h12l-1.5-3.2C17.5 9.8 18 8.5 18 7c0-2.5-2.5-5-6-5z\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linejoin=\"round\"/>\n <!-- Wings -->\n <path d=\"M6 6.5C4.5 5 2 5 2 7s1.5 3 3 3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M18 6.5C19.5 5 22 5 22 7s-1.5 3-3 3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <!-- Caduceus staff -->\n <line x1=\"12\" y1=\"14\" x2=\"12\" y2=\"22\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n <!-- Snakes -->\n <path d=\"M9.5 16c1.5 1 3.5 1 5 0\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" fill=\"none\"/>\n <path d=\"M9.5 19c1.5 1 3.5 1 5 0\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" fill=\"none\"/>\n <!-- Eye -->\n <circle cx=\"12\" cy=\"7.5\" r=\"1.5\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const HERMES_SKILL_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon\">\n <!-- Brain/memory symbol -->\n <path d=\"M12 3C8 3 5 6 5 9c0 2 1 3.5 2 4.5V16a2 2 0 002 2h6a2 2 0 002-2v-2.5c1-1 2-2.5 2-4.5 0-3-3-6-7-6z\" fill=\"currentColor\" opacity=\"0.15\"/>\n <path d=\"M12 3C8 3 5 6 5 9c0 2 1 3.5 2 4.5V16a2 2 0 002 2h6a2 2 0 002-2v-2.5c1-1 2-2.5 2-4.5 0-3-3-6-7-6z\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linejoin=\"round\"/>\n <!-- Neural connections -->\n <path d=\"M9 9.5c0-1 .5-2 1.5-2.5M15 9.5c0-1-.5-2-1.5-2.5M10.5 11c.5.5 1.5 1 3 0\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" fill=\"none\"/>\n <!-- Growing roots -->\n <path d=\"M9 18v2M12 18v3M15 18v2\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <!-- Sparkle -->\n <circle cx=\"8\" cy=\"6\" r=\"0.8\" fill=\"currentColor\"/>\n <circle cx=\"16\" cy=\"6\" r=\"0.8\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const COPY_ICON = `<svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon-sm\">\n <rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M3 10V3.5A1.5 1.5 0 014.5 2H10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n\nexport const CHECK_ICON = `<svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon-sm\">\n <path d=\"M3 8.5l3.5 3.5L13 4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>`;\n\nexport const DOWNLOAD_ICON = `<svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon-sm\">\n <path d=\"M8 2v8m0 0l-3-3m3 3l3-3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 12v1.5a1 1 0 001 1h8a1 1 0 001-1V12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n\nexport const CLOSE_ICON = `<svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon-sm\">\n <path d=\"M4 4l8 8m0-8l-8 8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n\nexport const TERMINAL_ICON = `<svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon-sm\">\n <rect x=\"1\" y=\"2\" width=\"14\" height=\"12\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M4 6l3 2.5L4 11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M9 11h3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n","import type { ThemeTokens, Theme } from './types';\n\n/** Electric blue aligned with [Hermes Agent](https://hermes-agent.nousresearch.com/) marketing */\nexport const BRAND_COLOR = '#2B8CFF';\nexport const BRAND_COLOR_HOVER = '#1E7AEB';\nexport const BRAND_COLOR_ACTIVE = '#186BD4';\n/** Comma-separated RGB for `rgba(..., α)` in component styles */\nexport const BRAND_RGB = '43, 140, 255';\n\n/** Periwinkle secondary (Hermes hero title tone) */\nexport const ALT_BRAND_COLOR = '#8FA3E8';\nexport const ALT_BRAND_COLOR_HOVER = '#7B91DC';\nexport const ALT_BRAND_COLOR_ACTIVE = '#6B82CC';\nexport const ALT_BRAND_RGB = '143, 163, 232';\n\nexport const themes: Record<Exclude<Theme, 'system'>, ThemeTokens> = {\n branded: {\n bg: BRAND_COLOR,\n text: '#FFFFFF',\n border: 'transparent',\n surface: '#FFFFFF',\n surfaceText: '#0F172A',\n muted: '#64748B',\n primary: BRAND_COLOR,\n primaryText: '#FFFFFF',\n codeBg: '#0F172A',\n codeText: '#F1F5F9',\n },\n 'branded-alt': {\n bg: ALT_BRAND_COLOR,\n text: '#FFFFFF',\n border: 'transparent',\n surface: '#FFFFFF',\n surfaceText: '#0F172A',\n muted: '#64748B',\n primary: ALT_BRAND_COLOR,\n primaryText: '#FFFFFF',\n codeBg: '#0F172A',\n codeText: '#F1F5F9',\n },\n dark: {\n bg: '#141C2E',\n text: '#F1F5F9',\n border: '#2A3F5C',\n surface: '#1A2740',\n surfaceText: '#F1F5F9',\n muted: '#94A3B8',\n primary: BRAND_COLOR,\n primaryText: '#FFFFFF',\n codeBg: '#0A0E18',\n codeText: '#F1F5F9',\n },\n light: {\n bg: '#FFFFFF',\n text: '#0F172A',\n border: '#CBD5E1',\n surface: '#F8FAFC',\n surfaceText: '#0F172A',\n muted: '#64748B',\n primary: BRAND_COLOR,\n primaryText: '#FFFFFF',\n codeBg: '#0F172A',\n codeText: '#F1F5F9',\n },\n};\n\nexport function resolveTheme(theme: Theme): ThemeTokens {\n if (theme !== 'system') return themes[theme];\n if (typeof window === 'undefined') return themes.light;\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? themes.dark\n : themes.light;\n}\n\nexport function themeToCSS(tokens: ThemeTokens): string {\n return `\n --hb-bg: ${tokens.bg};\n --hb-text: ${tokens.text};\n --hb-border: ${tokens.border};\n --hb-surface: ${tokens.surface};\n --hb-surface-text: ${tokens.surfaceText};\n --hb-muted: ${tokens.muted};\n --hb-primary: ${tokens.primary};\n --hb-primary-text: ${tokens.primaryText};\n --hb-code-bg: ${tokens.codeBg};\n --hb-code-text: ${tokens.codeText};\n `;\n}\n\nexport const SHAPE_MAP = {\n rounded: { sm: '0.375rem', md: '0.5rem', lg: '0.625rem' },\n pill: { sm: '999px', md: '999px', lg: '999px' },\n square: { sm: '0', md: '0', lg: '0' },\n} as const;\n\nexport const SIZE_MAP = {\n sm: { height: '2rem', fontSize: '0.75rem', iconSize: '0.875rem', padding: '0 0.75rem', ccPadding: '0 0.5rem', gap: '0.375rem', radius: '0.375rem' },\n md: { height: '2.5rem', fontSize: '0.875rem', iconSize: '1.125rem', padding: '0 1rem', ccPadding: '0 0.75rem', gap: '0.5rem', radius: '0.5rem' },\n lg: { height: '3rem', fontSize: '1rem', iconSize: '1.375rem', padding: '0 1.25rem', ccPadding: '0 1rem', gap: '0.625rem', radius: '0.625rem' },\n};\n","import type { PopupOptions, ThemeTokens } from './types';\nimport { HERMES_ICON, HERMES_SKILL_ICON, COPY_ICON, CHECK_ICON, CLOSE_ICON } from './icons';\nimport { resolveTheme, themeToCSS, BRAND_COLOR_HOVER } from './themes';\n\nconst POPUP_STYLES = `\n :host {\n position: fixed;\n inset: 0;\n z-index: 999999;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n }\n\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n .hb-backdrop {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n animation: hb-fade-in 0.15s ease-out;\n }\n\n .hb-dialog {\n position: relative;\n width: 90%;\n max-width: 460px;\n background: var(--hb-surface);\n color: var(--hb-surface-text);\n border-radius: 16px;\n box-shadow: 0 24px 48px -12px rgba(0, 0, 0, 0.25), 0 0 0 1px var(--hb-border);\n overflow: hidden;\n animation: hb-scale-in 0.2s ease-out;\n }\n\n .hb-dialog-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--hb-border);\n }\n\n .hb-dialog-header-icon {\n width: 36px;\n height: 36px;\n color: var(--hb-primary);\n flex-shrink: 0;\n }\n\n .hb-dialog-header-text {\n flex: 1;\n min-width: 0;\n }\n\n .hb-dialog-title {\n font-size: 16px;\n font-weight: 600;\n line-height: 1.3;\n color: var(--hb-surface-text);\n }\n\n .hb-dialog-description {\n font-size: 13px;\n color: var(--hb-muted);\n margin-top: 2px;\n line-height: 1.4;\n }\n\n .hb-dialog-close {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: var(--hb-muted);\n cursor: pointer;\n border-radius: 8px;\n flex-shrink: 0;\n transition: background 0.15s, color 0.15s;\n }\n\n .hb-dialog-close:hover {\n background: var(--hb-border);\n color: var(--hb-surface-text);\n }\n\n .hb-dialog-close svg { width: 14px; height: 14px; }\n\n .hb-dialog-body { padding: 20px 24px; }\n\n .hb-step {\n display: flex;\n gap: 12px;\n margin-bottom: 16px;\n }\n\n .hb-step:last-child { margin-bottom: 0; }\n\n .hb-step-num {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--hb-primary);\n color: var(--hb-primary-text);\n font-size: 12px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n .hb-step-content {\n flex: 1;\n min-width: 0;\n }\n\n .hb-step-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--hb-surface-text);\n margin-bottom: 8px;\n line-height: 1.4;\n }\n\n .hb-code-block {\n display: flex;\n align-items: center;\n background: var(--hb-code-bg);\n color: var(--hb-code-text);\n border-radius: 10px;\n padding: 2px 2px 2px 14px;\n font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', Consolas, 'Liberation Mono', Menlo, monospace;\n font-size: 13px;\n line-height: 1.5;\n gap: 8px;\n overflow: hidden;\n }\n\n .hb-code-text {\n flex: 1;\n overflow-x: auto;\n white-space: nowrap;\n padding: 10px 0;\n scrollbar-width: none;\n }\n\n .hb-code-text::-webkit-scrollbar { display: none; }\n\n .hb-code-prefix {\n color: var(--hb-muted);\n user-select: none;\n margin-right: 6px;\n }\n\n .hb-copy-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 36px;\n min-width: 36px;\n padding: 0 12px;\n border: none;\n background: var(--hb-primary);\n color: var(--hb-primary-text);\n cursor: pointer;\n border-radius: 8px;\n font-family: inherit;\n font-size: 12px;\n font-weight: 500;\n flex-shrink: 0;\n transition: background 0.15s, transform 0.1s;\n white-space: nowrap;\n }\n\n .hb-copy-btn:hover { background: ${BRAND_COLOR_HOVER}; }\n .hb-copy-btn:active { transform: scale(0.96); }\n .hb-copy-btn svg { width: 14px; height: 14px; }\n\n .hb-copy-btn[data-copied=\"true\"] {\n background: #16a34a;\n }\n\n .hb-dialog-footer {\n padding: 16px 24px 20px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .hb-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n height: 44px;\n border: none;\n background: var(--hb-primary);\n color: var(--hb-primary-text);\n cursor: pointer;\n border-radius: 10px;\n font-family: inherit;\n font-size: 14px;\n font-weight: 600;\n transition: background 0.15s, transform 0.1s;\n }\n\n .hb-action-btn:hover { background: ${BRAND_COLOR_HOVER}; }\n .hb-action-btn:active { transform: scale(0.98); }\n .hb-action-btn svg { width: 16px; height: 16px; }\n\n .hb-hint {\n font-size: 12px;\n color: var(--hb-muted);\n text-align: center;\n line-height: 1.4;\n }\n\n .hb-hint kbd {\n display: inline-block;\n padding: 1px 5px;\n font-family: inherit;\n font-size: 11px;\n background: var(--hb-border);\n border-radius: 4px;\n border: 1px solid var(--hb-border);\n }\n\n @keyframes hb-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes hb-scale-in {\n from { opacity: 0; transform: scale(0.95) translateY(8px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n @media (max-width: 480px) {\n .hb-dialog {\n width: 96%;\n max-width: none;\n border-radius: 14px;\n max-height: 90dvh;\n overflow-y: auto;\n overscroll-behavior: contain;\n }\n\n .hb-dialog-header { padding: 16px 16px 12px; gap: 10px; }\n .hb-dialog-header-icon { width: 28px; height: 28px; }\n .hb-dialog-body { padding: 16px; }\n .hb-dialog-footer { padding: 12px 16px 16px; }\n\n .hb-step { gap: 10px; margin-bottom: 14px; }\n .hb-step-num { width: 22px; height: 22px; font-size: 11px; }\n .hb-step-label { font-size: 12px; margin-bottom: 6px; }\n\n .hb-code-block { font-size: 12px; padding: 2px 2px 2px 10px; border-radius: 8px; }\n .hb-copy-btn { height: 32px; padding: 0 10px; font-size: 11px; border-radius: 6px; }\n .hb-action-btn { height: 40px; font-size: 13px; border-radius: 8px; }\n .hb-hint { font-size: 11px; }\n }\n\n @media (max-width: 360px) {\n .hb-dialog { width: 100%; border-radius: 12px 12px 0 0; align-self: flex-end; }\n .hb-copy-btn span { display: none; }\n .hb-copy-btn { min-width: 32px; padding: 0 8px; }\n }\n\n @supports (padding: env(safe-area-inset-bottom)) {\n .hb-dialog-footer { padding-bottom: calc(20px + env(safe-area-inset-bottom)); }\n }\n`;\n\nexport class HermesPopupDialog extends HTMLElement {\n private _options!: PopupOptions;\n private _mqCleanup: (() => void) | null = null;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n set options(opts: PopupOptions) {\n this._options = opts;\n this.render();\n }\n\n get options() {\n return this._options;\n }\n\n disconnectedCallback() {\n this._mqCleanup?.();\n this._mqCleanup = null;\n }\n\n private resolvePopupTokens(): ThemeTokens {\n const { theme } = this._options;\n\n if (theme === 'dark' || theme === 'light') return resolveTheme(theme);\n\n const prefersDark = typeof window !== 'undefined'\n && window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n if (theme === 'system') {\n return prefersDark ? resolveTheme('dark') : resolveTheme('light');\n }\n\n const base = prefersDark ? resolveTheme('dark') : resolveTheme('light');\n const brand = resolveTheme(theme);\n return {\n ...base,\n primary: brand.primary,\n primaryText: brand.primaryText,\n };\n }\n\n private render() {\n if (!this.shadowRoot || !this._options) return;\n\n const { variant, title, description, command, fullCommand } = this._options;\n const tokens = this.resolvePopupTokens();\n const icon = variant === 'hermes' ? HERMES_ICON : HERMES_SKILL_ICON;\n\n const isHermesTerminal = variant === 'hermes';\n const displayCommand = fullCommand || command;\n\n this.shadowRoot.innerHTML = `\n <style>${POPUP_STYLES}</style>\n <div style=\"${themeToCSS(tokens)}\">\n <div class=\"hb-backdrop\" data-action=\"close\"></div>\n <div class=\"hb-dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"hb-dialog-title\">\n <div class=\"hb-dialog-header\">\n <div class=\"hb-dialog-header-icon\">${icon}</div>\n <div class=\"hb-dialog-header-text\">\n <div class=\"hb-dialog-title\" id=\"hb-dialog-title\">${title}</div>\n ${description ? `<div class=\"hb-dialog-description\">${description}</div>` : ''}\n </div>\n <button class=\"hb-dialog-close\" data-action=\"close\" aria-label=\"Close\">${CLOSE_ICON}</button>\n </div>\n <div class=\"hb-dialog-body\">\n ${isHermesTerminal ? this.renderHermesTerminalBody(displayCommand) : this.renderHermesSkillBody(command)}\n </div>\n <div class=\"hb-dialog-footer\">\n ${isHermesTerminal ? `\n <div class=\"hb-hint\">Press <kbd>⌘</kbd>+<kbd>V</kbd> or <kbd>Ctrl</kbd>+<kbd>V</kbd> in your terminal to run</div>\n ` : `\n <div class=\"hb-hint\">Press <kbd>⌘</kbd>+<kbd>V</kbd> or <kbd>Ctrl</kbd>+<kbd>V</kbd> in your Hermes session to run</div>\n `}\n </div>\n </div>\n </div>\n `;\n\n this.setupListeners();\n this.setupSystemThemeWatch();\n }\n\n private renderHermesTerminalBody(command: string): string {\n return `\n <div class=\"hb-step\">\n <div class=\"hb-step-num\">1</div>\n <div class=\"hb-step-content\">\n <div class=\"hb-step-label\">Copy this command to your clipboard</div>\n <div class=\"hb-code-block\">\n <div class=\"hb-code-text\"><span class=\"hb-code-prefix\">$</span>${this.escapeHtml(command)}</div>\n <button class=\"hb-copy-btn\" data-action=\"copy\" data-command=\"${this.escapeAttr(command)}\">${COPY_ICON}<span>Copy</span></button>\n </div>\n </div>\n </div>\n <div class=\"hb-step\">\n <div class=\"hb-step-num\">2</div>\n <div class=\"hb-step-content\">\n <div class=\"hb-step-label\">Paste and run in your terminal</div>\n </div>\n </div>\n `;\n }\n\n private renderHermesSkillBody(command: string): string {\n return `\n <div class=\"hb-step\">\n <div class=\"hb-step-num\">1</div>\n <div class=\"hb-step-content\">\n <div class=\"hb-step-label\">Copy this command to your clipboard</div>\n <div class=\"hb-code-block\">\n <div class=\"hb-code-text\">${this.escapeHtml(command)}</div>\n <button class=\"hb-copy-btn\" data-action=\"copy\" data-command=\"${this.escapeAttr(command)}\">${COPY_ICON}<span>Copy</span></button>\n </div>\n </div>\n </div>\n <div class=\"hb-step\">\n <div class=\"hb-step-num\">2</div>\n <div class=\"hb-step-content\">\n <div class=\"hb-step-label\">Paste and send in your Hermes session</div>\n </div>\n </div>\n `;\n }\n\n private setupListeners() {\n if (!this.shadowRoot) return;\n\n this.shadowRoot.addEventListener('click', (e) => {\n const target = (e.target as HTMLElement).closest('[data-action]') as HTMLElement | null;\n if (!target) return;\n\n const action = target.dataset.action;\n\n if (action === 'close') {\n this.close();\n } else if (action === 'copy') {\n const cmd = target.dataset.command || '';\n this.copyToClipboard(cmd, target);\n }\n });\n\n this.shadowRoot.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Escape') this.close();\n });\n }\n\n private setupSystemThemeWatch() {\n this._mqCleanup?.();\n this._mqCleanup = null;\n\n const theme = this._options.theme;\n const needsWatch = theme === 'system' || theme === 'branded' || theme === 'branded-alt';\n if (!needsWatch || typeof window === 'undefined') return;\n\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = () => this.render();\n mq.addEventListener('change', handler);\n this._mqCleanup = () => mq.removeEventListener('change', handler);\n }\n\n private async copyToClipboard(command: string, button: HTMLElement) {\n try {\n await navigator.clipboard.writeText(command);\n const label = button.querySelector('span');\n const iconContainer = button;\n\n button.setAttribute('data-copied', 'true');\n if (label) label.textContent = 'Copied!';\n iconContainer.innerHTML = `${CHECK_ICON}<span>Copied!</span>`;\n\n this._options.onCopy?.(command);\n\n setTimeout(() => {\n button.setAttribute('data-copied', 'false');\n iconContainer.innerHTML = `${COPY_ICON}<span>Copy</span>`;\n }, 2000);\n } catch {\n const textarea = document.createElement('textarea');\n textarea.value = command;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n\n this._options.onCopy?.(command);\n }\n }\n\n close() {\n const dialog = this.shadowRoot?.querySelector('.hb-dialog') as HTMLElement;\n const backdrop = this.shadowRoot?.querySelector('.hb-backdrop') as HTMLElement;\n\n if (dialog) {\n dialog.style.animation = 'hb-scale-in 0.15s ease-in reverse';\n }\n if (backdrop) {\n backdrop.style.animation = 'hb-fade-in 0.15s ease-in reverse';\n }\n\n setTimeout(() => {\n this._options.onClose?.();\n this.remove();\n }, 140);\n }\n\n private escapeHtml(str: string): string {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n private escapeAttr(str: string): string {\n return str.replace(/\"/g, '&quot;').replace(/'/g, '&#39;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('hermes-popup-dialog')) {\n customElements.define('hermes-popup-dialog', HermesPopupDialog);\n}\n\nexport function showPopup(options: PopupOptions): HermesPopupDialog {\n const popup = document.createElement('hermes-popup-dialog') as HermesPopupDialog;\n popup.options = options;\n document.body.appendChild(popup);\n return popup;\n}\n","import type { HermesButtonOptions, Theme, Size, Variant, Shape } from './types';\nimport { recordAgentPreference } from './agent-preferences';\nimport { HERMES_ICON } from './icons';\nimport {\n resolveTheme,\n themeToCSS,\n SIZE_MAP,\n SHAPE_MAP,\n BRAND_COLOR,\n BRAND_COLOR_HOVER,\n BRAND_COLOR_ACTIVE,\n BRAND_RGB,\n ALT_BRAND_COLOR,\n ALT_BRAND_COLOR_HOVER,\n ALT_BRAND_COLOR_ACTIVE,\n ALT_BRAND_RGB,\n} from './themes';\nimport { showPopup } from './popup-dialog';\n\nconst BUTTON_STYLES = `\n :host {\n display: inline-block;\n vertical-align: middle;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n -webkit-tap-highlight-color: transparent;\n }\n\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n .hb-btn {\n display: inline-flex;\n align-items: center;\n gap: var(--hb-gap);\n height: var(--hb-height);\n min-height: 44px;\n padding: var(--hb-padding);\n border: 1.5px solid var(--hb-border);\n background: var(--hb-bg);\n color: var(--hb-text);\n font-family: inherit;\n font-size: var(--hb-font-size);\n font-weight: 600;\n line-height: 1;\n border-radius: var(--hb-radius);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n touch-action: manipulation;\n transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, transform 0.1s ease, color 0.15s ease;\n text-decoration: none;\n -webkit-font-smoothing: antialiased;\n }\n\n @media (pointer: fine) {\n .hb-btn { min-height: unset; }\n }\n\n /* ─── FILLED ─── */\n\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn,\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn {\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn:hover {\n background: ${BRAND_COLOR_HOVER};\n box-shadow: 0 2px 8px rgba(${BRAND_RGB}, 0.35);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn:active {\n background: ${BRAND_COLOR_ACTIVE};\n transform: scale(0.98);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn:hover {\n background: ${ALT_BRAND_COLOR_HOVER};\n box-shadow: 0 2px 8px rgba(${ALT_BRAND_RGB}, 0.35);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn:active {\n background: ${ALT_BRAND_COLOR_ACTIVE};\n transform: scale(0.98);\n }\n\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn {\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n }\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn:hover {\n background: #1E2A42;\n border-color: #475569;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n }\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn:active {\n background: #141C2E;\n transform: scale(0.98);\n }\n\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn {\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.04);\n }\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn:hover {\n border-color: #94A3B8;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn:active {\n background: #F8FAFC;\n transform: scale(0.98);\n }\n\n /* ─── OUTLINE ─── */\n\n :host([data-variant=\"outline\"][data-theme=\"branded\"]) .hb-btn {\n background: transparent;\n border-color: ${BRAND_COLOR};\n color: ${BRAND_COLOR};\n }\n :host([data-variant=\"outline\"][data-theme=\"branded\"]) .hb-btn:hover {\n background: rgba(${BRAND_RGB}, 0.08);\n box-shadow: 0 2px 8px rgba(${BRAND_RGB}, 0.15);\n }\n :host([data-variant=\"outline\"][data-theme=\"branded\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.14);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"outline\"][data-theme=\"branded-alt\"]) .hb-btn {\n background: transparent;\n border-color: ${ALT_BRAND_COLOR};\n color: ${ALT_BRAND_COLOR};\n }\n :host([data-variant=\"outline\"][data-theme=\"branded-alt\"]) .hb-btn:hover {\n background: rgba(${ALT_BRAND_RGB}, 0.08);\n box-shadow: 0 2px 8px rgba(${ALT_BRAND_RGB}, 0.15);\n }\n :host([data-variant=\"outline\"][data-theme=\"branded-alt\"]) .hb-btn:active {\n background: rgba(${ALT_BRAND_RGB}, 0.14);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"outline\"][data-theme=\"dark\"]) .hb-btn {\n background: transparent;\n border-color: #475569;\n color: #F1F5F9;\n }\n :host([data-variant=\"outline\"][data-theme=\"dark\"]) .hb-btn:hover {\n border-color: ${BRAND_COLOR};\n background: rgba(${BRAND_RGB}, 0.08);\n }\n :host([data-variant=\"outline\"][data-theme=\"dark\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.14);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"outline\"][data-theme=\"light\"]) .hb-btn {\n background: transparent;\n border-color: #CBD5E1;\n color: #0F172A;\n }\n :host([data-variant=\"outline\"][data-theme=\"light\"]) .hb-btn:hover {\n border-color: ${BRAND_COLOR};\n background: rgba(${BRAND_RGB}, 0.05);\n }\n :host([data-variant=\"outline\"][data-theme=\"light\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.1);\n transform: scale(0.98);\n }\n\n /* ─── GHOST ─── */\n\n :host([data-variant=\"ghost\"]) .hb-btn {\n background: transparent;\n border-color: transparent;\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"branded\"]) .hb-btn {\n color: ${BRAND_COLOR};\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded\"]) .hb-btn:hover {\n background: rgba(${BRAND_RGB}, 0.1);\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.16);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"branded-alt\"]) .hb-btn {\n color: ${ALT_BRAND_COLOR};\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded-alt\"]) .hb-btn:hover {\n background: rgba(${ALT_BRAND_RGB}, 0.1);\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded-alt\"]) .hb-btn:active {\n background: rgba(${ALT_BRAND_RGB}, 0.16);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"dark\"]) .hb-btn {\n color: #F1F5F9;\n }\n :host([data-variant=\"ghost\"][data-theme=\"dark\"]) .hb-btn:hover {\n background: rgba(255, 255, 255, 0.06);\n }\n :host([data-variant=\"ghost\"][data-theme=\"dark\"]) .hb-btn:active {\n background: rgba(255, 255, 255, 0.1);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"light\"]) .hb-btn {\n color: #0F172A;\n }\n :host([data-variant=\"ghost\"][data-theme=\"light\"]) .hb-btn:hover {\n background: rgba(0, 0, 0, 0.04);\n }\n :host([data-variant=\"ghost\"][data-theme=\"light\"]) .hb-btn:active {\n background: rgba(0, 0, 0, 0.08);\n transform: scale(0.98);\n }\n\n /* ─── FOCUS ─── */\n\n .hb-btn:focus-visible {\n outline: 2px solid var(--hb-focus-color, ${BRAND_COLOR});\n outline-offset: 2px;\n }\n\n /* ─── ICON ─── */\n\n .hb-btn-icon {\n width: var(--hb-icon-size);\n height: var(--hb-icon-size);\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .hb-btn-icon svg { width: 100%; height: 100%; }\n\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn-icon,\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn-icon {\n color: #FFFFFF;\n --hb-icon-accent: rgba(255,255,255,0.2);\n }\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn-icon {\n color: var(--hb-accent-color, ${BRAND_COLOR});\n }\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn-icon {\n color: var(--hb-accent-color, ${BRAND_COLOR});\n }\n\n :host([data-variant=\"outline\"]) .hb-btn-icon,\n :host([data-variant=\"ghost\"]) .hb-btn-icon {\n color: var(--hb-accent-color, ${BRAND_COLOR});\n }\n\n /* ─── LABEL ─── */\n\n .hb-btn-label {\n letter-spacing: -0.01em;\n }\n`;\n\nexport class HermesButton extends HTMLElement {\n static observedAttributes = ['command', 'theme', 'size', 'variant', 'shape', 'popup', 'prompt-flag', 'popup-title', 'popup-description'];\n\n private _options: HermesButtonOptions = {\n command: '',\n theme: 'branded',\n size: 'md',\n variant: 'filled',\n popup: true,\n promptFlag: true,\n };\n\n private _mqCleanup: (() => void) | null = null;\n private _rendered = false;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n this.syncFromAttributes();\n this.render();\n this.updateLightDOM();\n }\n\n disconnectedCallback() {\n this._mqCleanup?.();\n this._mqCleanup = null;\n }\n\n attributeChangedCallback() {\n if (!this._rendered) return;\n this.syncFromAttributes();\n this.render();\n this.updateLightDOM();\n }\n\n set options(opts: Partial<HermesButtonOptions>) {\n this._options = { ...this._options, ...opts };\n this.render();\n this.updateLightDOM();\n }\n\n get options() {\n return this._options;\n }\n\n private syncFromAttributes() {\n const command = this.getAttribute('command');\n const theme = this.getAttribute('theme') as Theme | null;\n const size = this.getAttribute('size') as Size | null;\n const variant = this.getAttribute('variant') as Variant | null;\n const shape = this.getAttribute('shape') as Shape | null;\n const popup = this.getAttribute('popup');\n const promptFlag = this.getAttribute('prompt-flag');\n const popupTitle = this.getAttribute('popup-title');\n const popupDescription = this.getAttribute('popup-description');\n\n if (command !== null) this._options.command = command;\n if (theme) this._options.theme = theme;\n if (size) this._options.size = size;\n if (variant) this._options.variant = variant;\n if (shape) this._options.shape = shape;\n if (popup !== null) this._options.popup = popup !== 'false';\n if (promptFlag !== null) this._options.promptFlag = promptFlag !== 'false';\n if (popupTitle !== null) this._options.popupTitle = popupTitle;\n if (popupDescription !== null) this._options.popupDescription = popupDescription;\n }\n\n private updateLightDOM() {\n const { command } = this._options;\n const fullCommand = this.getFullCommand();\n\n this.setAttribute('role', 'button');\n this.setAttribute('tabindex', '0');\n this.setAttribute('aria-label', `Run on Hermes: ${command}`);\n if (this._options.popup !== false) {\n this.setAttribute('aria-haspopup', 'dialog');\n } else {\n this.removeAttribute('aria-haspopup');\n }\n\n let link = this.querySelector('a[data-hb-crawl]') as HTMLAnchorElement | null;\n if (!link) {\n link = document.createElement('a');\n link.setAttribute('data-hb-crawl', '');\n link.setAttribute('aria-hidden', 'true');\n link.style.cssText = 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;';\n this.appendChild(link);\n }\n link.href = `https://hermes.ai/run?command=${encodeURIComponent(fullCommand)}`;\n link.textContent = `Run on Hermes: ${command}`;\n link.setAttribute('data-platform', 'hermes');\n link.setAttribute('data-command', command);\n link.setAttribute('data-full-command', fullCommand);\n }\n\n private getResolvedTheme(): Theme {\n return this._options.theme || 'branded';\n }\n\n private getFullCommand(): string {\n const { command, promptFlag } = this._options;\n if (promptFlag === false) return command;\n return `hermes -p \"${command}\"`;\n }\n\n private render() {\n if (!this.shadowRoot) return;\n\n const theme = this.getResolvedTheme();\n const resolvedTheme = theme === 'system' ? (\n typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n ) : theme;\n const variant = this._options.variant || 'filled';\n\n const tokens = resolveTheme(theme);\n const size = this._options.size || 'md';\n const shape = this._options.shape || 'rounded';\n const sizeTokens = SIZE_MAP[size];\n const radius = SHAPE_MAP[shape][size];\n\n this.setAttribute('data-theme', resolvedTheme);\n this.setAttribute('data-variant', variant);\n\n const bgOverride = variant !== 'filled' ? 'transparent' : tokens.bg;\n const borderOverride = variant === 'ghost' ? 'transparent' :\n variant === 'outline' ? tokens.primary : tokens.border;\n const textOverride = variant !== 'filled' ? tokens.primary : tokens.text;\n\n this.shadowRoot.innerHTML = `\n <style>${BUTTON_STYLES}</style>\n <button\n class=\"hb-btn\"\n type=\"button\"\n style=\"\n ${themeToCSS(tokens)}\n --hb-bg: ${bgOverride};\n --hb-border: ${borderOverride};\n --hb-text: ${textOverride};\n --hb-accent-color: ${tokens.primary};\n --hb-focus-color: ${tokens.primary};\n --hb-height: ${sizeTokens.height};\n --hb-font-size: ${sizeTokens.fontSize};\n --hb-icon-size: ${sizeTokens.iconSize};\n --hb-padding: ${sizeTokens.ccPadding};\n --hb-gap: ${sizeTokens.gap};\n --hb-radius: ${radius};\n \"\n aria-label=\"Run on Hermes: ${this._options.command.replace(/\"/g, '&quot;')}\"\n >\n <span class=\"hb-btn-icon\" aria-hidden=\"true\">${HERMES_ICON}</span>\n <span class=\"hb-btn-label\">Run on Hermes</span>\n </button>\n `;\n\n const btn = this.shadowRoot.querySelector('.hb-btn')!;\n btn.addEventListener('click', () => this.handleClick());\n btn.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Enter' || (e as KeyboardEvent).key === ' ') {\n e.preventDefault();\n this.handleClick();\n }\n });\n this._rendered = true;\n this.setupSystemThemeWatch();\n }\n\n private handleClick() {\n const { popup, command, popupTitle, popupDescription } = this._options;\n const fullCommand = this.getFullCommand();\n\n this.dispatchEvent(new CustomEvent('hb-open', {\n bubbles: true,\n composed: true,\n detail: { command, fullCommand },\n }));\n\n if (popup === false) {\n navigator.clipboard.writeText(fullCommand).then(() => {\n this._options.onCopy?.(fullCommand);\n recordAgentPreference('hermes');\n this.dispatchEvent(new CustomEvent('hb-copy', {\n bubbles: true,\n composed: true,\n detail: { command: fullCommand },\n }));\n });\n return;\n }\n\n showPopup({\n variant: 'hermes',\n theme: this.getResolvedTheme(),\n title: popupTitle || 'Run on Hermes',\n description: popupDescription || 'Execute this command in your terminal to get started with Hermes Agent.',\n command,\n fullCommand,\n onCopy: (cmd: string) => {\n this._options.onCopy?.(cmd);\n recordAgentPreference('hermes');\n this.dispatchEvent(new CustomEvent('hb-copy', {\n bubbles: true,\n composed: true,\n detail: { command: cmd },\n }));\n },\n onClose: () => {\n this.dispatchEvent(new CustomEvent('hb-close', {\n bubbles: true,\n composed: true,\n }));\n },\n });\n }\n\n private setupSystemThemeWatch() {\n this._mqCleanup?.();\n this._mqCleanup = null;\n\n if (this.getResolvedTheme() !== 'system' || typeof window === 'undefined') return;\n\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = () => this.render();\n mq.addEventListener('change', handler);\n this._mqCleanup = () => mq.removeEventListener('change', handler);\n }\n}\n\nexport function registerHermesButton(tagName = 'hermes-button') {\n if (typeof customElements === 'undefined') return;\n if (!customElements.get(tagName)) {\n customElements.define(tagName, HermesButton);\n }\n}\n\nregisterHermesButton();\n\nexport function createHermesButton(options: HermesButtonOptions): HermesButton {\n const el = document.createElement('hermes-button') as HermesButton;\n el.options = options;\n return el;\n}\n","import type { HermesSkillButtonOptions, Theme, Size, Variant, Shape } from './types';\nimport { recordAgentPreference } from './agent-preferences';\nimport { HERMES_SKILL_ICON } from './icons';\nimport {\n resolveTheme,\n themeToCSS,\n SIZE_MAP,\n SHAPE_MAP,\n BRAND_COLOR,\n BRAND_COLOR_HOVER,\n BRAND_COLOR_ACTIVE,\n BRAND_RGB,\n ALT_BRAND_COLOR,\n ALT_BRAND_COLOR_HOVER,\n ALT_BRAND_COLOR_ACTIVE,\n ALT_BRAND_RGB,\n} from './themes';\nimport { showPopup } from './popup-dialog';\n\nconst BUTTON_STYLES = `\n :host {\n display: inline-block;\n vertical-align: middle;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n -webkit-tap-highlight-color: transparent;\n }\n\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n .hb-btn {\n display: inline-flex;\n align-items: center;\n gap: var(--hb-gap);\n height: var(--hb-height);\n min-height: 44px;\n padding: var(--hb-padding);\n border: 1.5px solid var(--hb-border);\n background: var(--hb-bg);\n color: var(--hb-text);\n font-family: inherit;\n font-size: var(--hb-font-size);\n font-weight: 600;\n line-height: 1;\n border-radius: var(--hb-radius);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n touch-action: manipulation;\n transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, transform 0.1s ease, color 0.15s ease;\n text-decoration: none;\n -webkit-font-smoothing: antialiased;\n }\n\n @media (pointer: fine) {\n .hb-btn { min-height: unset; }\n }\n\n /* ─── FILLED ─── */\n\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn,\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn {\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn:hover {\n background: ${BRAND_COLOR_HOVER};\n box-shadow: 0 2px 8px rgba(${BRAND_RGB}, 0.35);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn:active {\n background: ${BRAND_COLOR_ACTIVE};\n transform: scale(0.98);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn:hover {\n background: ${ALT_BRAND_COLOR_HOVER};\n box-shadow: 0 2px 8px rgba(${ALT_BRAND_RGB}, 0.35);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn:active {\n background: ${ALT_BRAND_COLOR_ACTIVE};\n transform: scale(0.98);\n }\n\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn {\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n }\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn:hover {\n background: #1E2A42;\n border-color: #475569;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n }\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn:active {\n background: #141C2E;\n transform: scale(0.98);\n }\n\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn {\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.04);\n }\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn:hover {\n border-color: #94A3B8;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn:active {\n background: #F8FAFC;\n transform: scale(0.98);\n }\n\n /* ─── OUTLINE ─── */\n\n :host([data-variant=\"outline\"][data-theme=\"branded\"]) .hb-btn {\n background: transparent;\n border-color: ${BRAND_COLOR};\n color: ${BRAND_COLOR};\n }\n :host([data-variant=\"outline\"][data-theme=\"branded\"]) .hb-btn:hover {\n background: rgba(${BRAND_RGB}, 0.08);\n box-shadow: 0 2px 8px rgba(${BRAND_RGB}, 0.15);\n }\n :host([data-variant=\"outline\"][data-theme=\"branded\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.14);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"outline\"][data-theme=\"branded-alt\"]) .hb-btn {\n background: transparent;\n border-color: ${ALT_BRAND_COLOR};\n color: ${ALT_BRAND_COLOR};\n }\n :host([data-variant=\"outline\"][data-theme=\"branded-alt\"]) .hb-btn:hover {\n background: rgba(${ALT_BRAND_RGB}, 0.08);\n box-shadow: 0 2px 8px rgba(${ALT_BRAND_RGB}, 0.15);\n }\n :host([data-variant=\"outline\"][data-theme=\"branded-alt\"]) .hb-btn:active {\n background: rgba(${ALT_BRAND_RGB}, 0.14);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"outline\"][data-theme=\"dark\"]) .hb-btn {\n background: transparent;\n border-color: #475569;\n color: #F1F5F9;\n }\n :host([data-variant=\"outline\"][data-theme=\"dark\"]) .hb-btn:hover {\n border-color: ${BRAND_COLOR};\n background: rgba(${BRAND_RGB}, 0.08);\n }\n :host([data-variant=\"outline\"][data-theme=\"dark\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.14);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"outline\"][data-theme=\"light\"]) .hb-btn {\n background: transparent;\n border-color: #CBD5E1;\n color: #0F172A;\n }\n :host([data-variant=\"outline\"][data-theme=\"light\"]) .hb-btn:hover {\n border-color: ${BRAND_COLOR};\n background: rgba(${BRAND_RGB}, 0.05);\n }\n :host([data-variant=\"outline\"][data-theme=\"light\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.1);\n transform: scale(0.98);\n }\n\n /* ─── GHOST ─── */\n\n :host([data-variant=\"ghost\"]) .hb-btn {\n background: transparent;\n border-color: transparent;\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"branded\"]) .hb-btn {\n color: ${BRAND_COLOR};\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded\"]) .hb-btn:hover {\n background: rgba(${BRAND_RGB}, 0.1);\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.16);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"branded-alt\"]) .hb-btn {\n color: ${ALT_BRAND_COLOR};\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded-alt\"]) .hb-btn:hover {\n background: rgba(${ALT_BRAND_RGB}, 0.1);\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded-alt\"]) .hb-btn:active {\n background: rgba(${ALT_BRAND_RGB}, 0.16);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"dark\"]) .hb-btn {\n color: #F1F5F9;\n }\n :host([data-variant=\"ghost\"][data-theme=\"dark\"]) .hb-btn:hover {\n background: rgba(255, 255, 255, 0.06);\n }\n :host([data-variant=\"ghost\"][data-theme=\"dark\"]) .hb-btn:active {\n background: rgba(255, 255, 255, 0.1);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"light\"]) .hb-btn {\n color: #0F172A;\n }\n :host([data-variant=\"ghost\"][data-theme=\"light\"]) .hb-btn:hover {\n background: rgba(0, 0, 0, 0.04);\n }\n :host([data-variant=\"ghost\"][data-theme=\"light\"]) .hb-btn:active {\n background: rgba(0, 0, 0, 0.08);\n transform: scale(0.98);\n }\n\n /* ─── FOCUS ─── */\n\n .hb-btn:focus-visible {\n outline: 2px solid var(--hb-focus-color, ${BRAND_COLOR});\n outline-offset: 2px;\n }\n\n /* ─── ICON ─── */\n\n .hb-btn-icon {\n width: var(--hb-icon-size);\n height: var(--hb-icon-size);\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .hb-btn-icon svg { width: 100%; height: 100%; }\n\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn-icon,\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn-icon {\n color: #FFFFFF;\n --hb-icon-accent: rgba(255,255,255,0.2);\n }\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn-icon {\n color: var(--hb-accent-color, ${BRAND_COLOR});\n }\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn-icon {\n color: var(--hb-accent-color, ${BRAND_COLOR});\n }\n\n :host([data-variant=\"outline\"]) .hb-btn-icon,\n :host([data-variant=\"ghost\"]) .hb-btn-icon {\n color: var(--hb-accent-color, ${BRAND_COLOR});\n }\n\n /* ─── LABEL ─── */\n\n .hb-btn-label {\n letter-spacing: -0.01em;\n }\n`;\n\nexport class HermesSkillButton extends HTMLElement {\n static observedAttributes = ['command', 'theme', 'size', 'variant', 'shape', 'popup', 'popup-title', 'popup-description'];\n\n private _options: HermesSkillButtonOptions = {\n command: '',\n theme: 'branded',\n size: 'md',\n variant: 'filled',\n popup: true,\n };\n\n private _mqCleanup: (() => void) | null = null;\n private _rendered = false;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n this.syncFromAttributes();\n this.render();\n this.updateLightDOM();\n }\n\n disconnectedCallback() {\n this._mqCleanup?.();\n this._mqCleanup = null;\n }\n\n attributeChangedCallback() {\n if (!this._rendered) return;\n this.syncFromAttributes();\n this.render();\n this.updateLightDOM();\n }\n\n set options(opts: Partial<HermesSkillButtonOptions>) {\n this._options = { ...this._options, ...opts };\n this.render();\n this.updateLightDOM();\n }\n\n get options() {\n return this._options;\n }\n\n private syncFromAttributes() {\n const command = this.getAttribute('command');\n const theme = this.getAttribute('theme') as Theme | null;\n const size = this.getAttribute('size') as Size | null;\n const variant = this.getAttribute('variant') as Variant | null;\n const shape = this.getAttribute('shape') as Shape | null;\n const popup = this.getAttribute('popup');\n const popupTitle = this.getAttribute('popup-title');\n const popupDescription = this.getAttribute('popup-description');\n\n if (command !== null) this._options.command = command;\n if (theme) this._options.theme = theme;\n if (size) this._options.size = size;\n if (variant) this._options.variant = variant;\n if (shape) this._options.shape = shape;\n if (popup !== null) this._options.popup = popup !== 'false';\n if (popupTitle !== null) this._options.popupTitle = popupTitle;\n if (popupDescription !== null) this._options.popupDescription = popupDescription;\n }\n\n private updateLightDOM() {\n const { command } = this._options;\n\n this.setAttribute('role', 'button');\n this.setAttribute('tabindex', '0');\n this.setAttribute('aria-label', `Run on Hermes Skills: ${command}`);\n if (this._options.popup !== false) {\n this.setAttribute('aria-haspopup', 'dialog');\n } else {\n this.removeAttribute('aria-haspopup');\n }\n\n let link = this.querySelector('a[data-hb-crawl]') as HTMLAnchorElement | null;\n if (!link) {\n link = document.createElement('a');\n link.setAttribute('data-hb-crawl', '');\n link.setAttribute('aria-hidden', 'true');\n link.style.cssText = 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;';\n this.appendChild(link);\n }\n link.textContent = `Run on Hermes Skills: ${command}`;\n link.setAttribute('data-platform', 'hermes-skill');\n link.setAttribute('data-command', command);\n link.href = `https://hermes.ai/skills?command=${encodeURIComponent(command)}`;\n }\n\n private getResolvedTheme(): Theme {\n return this._options.theme || 'branded';\n }\n\n private render() {\n if (!this.shadowRoot) return;\n\n const theme = this.getResolvedTheme();\n const resolvedTheme = theme === 'system' ? (\n typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n ) : theme;\n const variant = this._options.variant || 'filled';\n\n const tokens = resolveTheme(theme);\n const size = this._options.size || 'md';\n const shape = this._options.shape || 'rounded';\n const sizeTokens = SIZE_MAP[size];\n const radius = SHAPE_MAP[shape][size];\n\n this.setAttribute('data-theme', resolvedTheme);\n this.setAttribute('data-variant', variant);\n\n const bgOverride = variant !== 'filled' ? 'transparent' : tokens.bg;\n const borderOverride = variant === 'ghost' ? 'transparent' :\n variant === 'outline' ? tokens.primary : tokens.border;\n const textOverride = variant !== 'filled' ? tokens.primary : tokens.text;\n\n this.shadowRoot.innerHTML = `\n <style>${BUTTON_STYLES}</style>\n <button\n class=\"hb-btn\"\n type=\"button\"\n style=\"\n ${themeToCSS(tokens)}\n --hb-bg: ${bgOverride};\n --hb-border: ${borderOverride};\n --hb-text: ${textOverride};\n --hb-accent-color: ${tokens.primary};\n --hb-focus-color: ${tokens.primary};\n --hb-height: ${sizeTokens.height};\n --hb-font-size: ${sizeTokens.fontSize};\n --hb-icon-size: ${sizeTokens.iconSize};\n --hb-padding: ${sizeTokens.padding};\n --hb-gap: ${sizeTokens.gap};\n --hb-radius: ${radius};\n \"\n aria-label=\"Run on Hermes Skills: ${this._options.command.replace(/\"/g, '&quot;')}\"\n >\n <span class=\"hb-btn-icon\" aria-hidden=\"true\">${HERMES_SKILL_ICON}</span>\n <span class=\"hb-btn-label\">Run on Hermes Skills</span>\n </button>\n `;\n\n const btn = this.shadowRoot.querySelector('.hb-btn')!;\n btn.addEventListener('click', () => this.handleClick());\n btn.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Enter' || (e as KeyboardEvent).key === ' ') {\n e.preventDefault();\n this.handleClick();\n }\n });\n this._rendered = true;\n this.setupSystemThemeWatch();\n }\n\n private handleClick() {\n const { popup, command, popupTitle, popupDescription } = this._options;\n\n this.dispatchEvent(new CustomEvent('hb-open', {\n bubbles: true,\n composed: true,\n detail: { command },\n }));\n\n if (popup === false) {\n navigator.clipboard.writeText(command).then(() => {\n this._options.onCopy?.(command);\n recordAgentPreference('hermes-skill');\n this.dispatchEvent(new CustomEvent('hb-copy', {\n bubbles: true,\n composed: true,\n detail: { command },\n }));\n });\n return;\n }\n\n showPopup({\n variant: 'hermes-skill',\n theme: this.getResolvedTheme(),\n title: popupTitle || 'Run on Hermes Skills',\n description: popupDescription || 'Copy and paste into a Hermes session to get started.',\n command,\n onCopy: (cmd) => {\n this._options.onCopy?.(cmd);\n recordAgentPreference('hermes-skill');\n this.dispatchEvent(new CustomEvent('hb-copy', {\n bubbles: true,\n composed: true,\n detail: { command: cmd },\n }));\n },\n onClose: () => {\n this.dispatchEvent(new CustomEvent('hb-close', {\n bubbles: true,\n composed: true,\n }));\n },\n });\n }\n\n private setupSystemThemeWatch() {\n this._mqCleanup?.();\n this._mqCleanup = null;\n\n if (this.getResolvedTheme() !== 'system' || typeof window === 'undefined') return;\n\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = () => this.render();\n mq.addEventListener('change', handler);\n this._mqCleanup = () => mq.removeEventListener('change', handler);\n }\n}\n\nexport function registerHermesSkillButton(tagName = 'hermes-skill-button') {\n if (typeof customElements === 'undefined') return;\n if (!customElements.get(tagName)) {\n customElements.define(tagName, HermesSkillButton);\n }\n}\n\nregisterHermesSkillButton();\n\nexport function createHermesSkillButton(options: HermesSkillButtonOptions): HermesSkillButton {\n const el = document.createElement('hermes-skill-button') as HermesSkillButton;\n el.options = options;\n return el;\n}\n","/**\n * Generates JSON-LD structured data for all hermesbuttons on the page.\n *\n * Crawlers and AI agents can use this to discover skills and commands\n * without executing JavaScript — call this after buttons are rendered\n * and inject the result into a <script type=\"application/ld+json\"> tag.\n */\nexport interface ButtonMetadata {\n platform: 'hermes' | 'hermes-skill';\n command: string;\n fullCommand?: string;\n}\n\nexport function discoverButtons(): ButtonMetadata[] {\n if (typeof document === 'undefined') return [];\n\n const results: ButtonMetadata[] = [];\n\n document.querySelectorAll('hermes-button').forEach((el) => {\n const command = el.getAttribute('command') || '';\n const promptFlag = el.getAttribute('prompt-flag');\n const usePrompt = promptFlag !== 'false';\n const fullCommand = usePrompt ? `hermes -p \"${command}\"` : command;\n\n results.push({\n platform: 'hermes',\n command,\n fullCommand,\n });\n });\n\n document.querySelectorAll('hermes-skill-button').forEach((el) => {\n const command = el.getAttribute('command') || '';\n\n results.push({\n platform: 'hermes-skill',\n command,\n });\n });\n\n return results;\n}\n\nexport function generateStructuredData(): object {\n const buttons = discoverButtons();\n if (buttons.length === 0) return {};\n\n const actions = buttons.map((btn) => {\n if (btn.platform === 'hermes') {\n return {\n '@type': 'Action',\n name: `Run on Hermes: ${btn.command}`,\n description: btn.command,\n target: {\n '@type': 'EntryPoint',\n urlTemplate: `https://hermes.ai/run?command=${encodeURIComponent(btn.fullCommand || btn.command)}`,\n actionPlatform: 'https://hermes.ai/run',\n },\n object: {\n '@type': 'SoftwareSourceCode',\n runtimePlatform: 'Hermes Agent',\n text: btn.fullCommand || btn.command,\n },\n };\n }\n\n const entry: Record<string, unknown> = {\n '@type': 'EntryPoint',\n actionPlatform: 'https://hermes.ai/skills',\n urlTemplate: `https://hermes.ai/skills?command=${encodeURIComponent(btn.command)}`,\n };\n\n return {\n '@type': 'Action',\n name: `Run on Hermes Skills: ${btn.command}`,\n description: btn.command,\n target: entry,\n };\n });\n\n return {\n '@context': 'https://schema.org',\n '@type': 'WebPage',\n potentialAction: actions,\n };\n}\n\n/**\n * Injects a <script type=\"application/ld+json\"> tag into the document head\n * with structured data for all hermesbuttons on the page.\n *\n * Call after all buttons have been rendered to the DOM.\n */\nexport function injectStructuredData(): void {\n if (typeof document === 'undefined') return;\n\n const existing = document.querySelector('script[data-hermesbuttons-jsonld]');\n if (existing) existing.remove();\n\n const data = generateStructuredData();\n if (!data || !('potentialAction' in data)) return;\n\n const script = document.createElement('script');\n script.type = 'application/ld+json';\n script.setAttribute('data-hermesbuttons-jsonld', '');\n script.textContent = JSON.stringify(data, null, 2);\n document.head.appendChild(script);\n}\n","const PING_URL = 'https://hermesbuttons.vercel.app/api/ping';\n\nlet sent = false;\n\nexport function reportOrigin(): void {\n if (sent) return;\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return;\n\n const origin = window.location?.origin;\n if (!origin || origin === 'null' || origin.startsWith('file:')) return;\n\n sent = true;\n\n try {\n const payload = JSON.stringify({ origin });\n const blob = new Blob([payload], { type: 'text/plain' });\n\n if (typeof navigator.sendBeacon === 'function') {\n navigator.sendBeacon(PING_URL, blob);\n } else {\n fetch(PING_URL, { method: 'POST', body: payload, keepalive: true })\n .catch(() => {});\n }\n } catch {\n // Never let telemetry break the host page\n }\n}\n\nif (typeof window !== 'undefined') {\n try { reportOrigin(); } catch {}\n}\n"],"mappings":"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","names":["index_exports","__export","ALT_BRAND_COLOR","BRAND_COLOR","HERMES_ICON","HERMES_SKILL_ICON","HermesButton","HermesPopupDialog","HermesSkillButton","createHermesButton","createHermesSkillButton","discoverButtons","generateStructuredData","injectStructuredData","register","registerHermesButton","registerHermesSkillButton","resolveTheme","showPopup","themes","AGENT_PREFERENCES_COOKIE_NAME","isBrowser","readAgentPreferences","match","p","AGENT_PREFERENCES_COOKIE_NAME","value","decoded","data","x","writeAgentPreferences","payload","order","json","expires","recordAgentPreference","agentId","base","id","HERMES_ICON","HERMES_SKILL_ICON","COPY_ICON","CHECK_ICON","CLOSE_ICON","BRAND_COLOR","BRAND_COLOR_HOVER","BRAND_COLOR_ACTIVE","BRAND_RGB","ALT_BRAND_COLOR","ALT_BRAND_COLOR_HOVER","ALT_BRAND_COLOR_ACTIVE","ALT_BRAND_RGB","themes","resolveTheme","theme","themeToCSS","tokens","SHAPE_MAP","SIZE_MAP","POPUP_STYLES","BRAND_COLOR_HOVER","HermesPopupDialog","opts","theme","resolveTheme","prefersDark","base","brand","variant","title","description","command","fullCommand","tokens","icon","HERMES_ICON","HERMES_SKILL_ICON","isHermesTerminal","displayCommand","themeToCSS","CLOSE_ICON","COPY_ICON","e","target","action","cmd","mq","handler","button","label","iconContainer","CHECK_ICON","textarea","dialog","backdrop","str","div","showPopup","options","popup","BUTTON_STYLES","BRAND_COLOR_HOVER","BRAND_RGB","BRAND_COLOR_ACTIVE","ALT_BRAND_COLOR_HOVER","ALT_BRAND_RGB","ALT_BRAND_COLOR_ACTIVE","BRAND_COLOR","ALT_BRAND_COLOR","HermesButton","opts","command","theme","size","variant","shape","popup","promptFlag","popupTitle","popupDescription","fullCommand","link","resolvedTheme","tokens","resolveTheme","sizeTokens","SIZE_MAP","radius","SHAPE_MAP","bgOverride","borderOverride","textOverride","themeToCSS","HERMES_ICON","btn","e","recordAgentPreference","showPopup","cmd","mq","handler","registerHermesButton","tagName","createHermesButton","options","el","BUTTON_STYLES","BRAND_COLOR_HOVER","BRAND_RGB","BRAND_COLOR_ACTIVE","ALT_BRAND_COLOR_HOVER","ALT_BRAND_RGB","ALT_BRAND_COLOR_ACTIVE","BRAND_COLOR","ALT_BRAND_COLOR","HermesSkillButton","opts","command","theme","size","variant","shape","popup","popupTitle","popupDescription","link","resolvedTheme","tokens","resolveTheme","sizeTokens","SIZE_MAP","radius","SHAPE_MAP","bgOverride","borderOverride","textOverride","themeToCSS","HERMES_SKILL_ICON","btn","e","recordAgentPreference","showPopup","cmd","mq","handler","registerHermesSkillButton","tagName","createHermesSkillButton","options","el","discoverButtons","results","el","command","fullCommand","generateStructuredData","buttons","btn","entry","injectStructuredData","existing","data","script","PING_URL","sent","reportOrigin","origin","payload","blob","register","registerHermesButton","registerHermesSkillButton"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/agent-preferences.ts","../src/icons.ts","../src/themes.ts","../src/popup-dialog.ts","../src/hermes-button.ts","../src/hermes-skill-button.ts","../src/structured-data.ts","../src/beacon.ts"],"sourcesContent":["export type { Theme, Size, Variant, Shape, HermesButtonOptions, HermesSkillButtonOptions, PopupOptions, ThemeTokens } from './types';\n\nexport { HermesButton, createHermesButton, registerHermesButton } from './hermes-button';\nexport { HermesSkillButton, createHermesSkillButton, registerHermesSkillButton } from './hermes-skill-button';\nexport { HermesPopupDialog, showPopup } from './popup-dialog';\n\nexport { HERMES_ICON, HERMES_SKILL_ICON } from './icons';\nexport { themes, resolveTheme, BRAND_COLOR, ALT_BRAND_COLOR } from './themes';\n\nexport type { ButtonMetadata } from './structured-data';\nexport { discoverButtons, generateStructuredData, injectStructuredData } from './structured-data';\n\nimport { registerHermesButton } from './hermes-button';\nimport { registerHermesSkillButton } from './hermes-skill-button';\n\n/**\n * Manually register all custom elements.\n * Called automatically on import, but exposed for frameworks\n * that need explicit registration timing (Angular, micro-frontends).\n */\nexport function register() {\n registerHermesButton();\n registerHermesSkillButton();\n}\n\nimport './beacon';\n\nexport type {} from './jsx.d';\n","/**\n * Cross-site preference cookie for the agentbuttons family (same origin).\n * Name and JSON shape must match claudebuttons, clawbuttons, and agentbuttons.\n */\nexport const AGENT_PREFERENCES_COOKIE_NAME = 'agentpreferences';\n\nexport const MAX_AGENT_PREFERENCE_ENTRIES = 24;\n\nexport interface AgentPreferencesPayload {\n /** Most recently used agent ids first. */\n order: string[];\n}\n\nfunction isBrowser(): boolean {\n return typeof document !== 'undefined';\n}\n\nexport function readAgentPreferences(): AgentPreferencesPayload | null {\n if (!isBrowser()) return null;\n const match = document.cookie\n .split(';')\n .map((p) => p.trim())\n .find((p) => p.startsWith(`${AGENT_PREFERENCES_COOKIE_NAME}=`));\n if (!match) return null;\n const value = match.slice(AGENT_PREFERENCES_COOKIE_NAME.length + 1);\n if (!value) return null;\n try {\n const decoded = decodeURIComponent(value);\n const data = JSON.parse(decoded) as unknown;\n if (!data || typeof data !== 'object' || !Array.isArray((data as AgentPreferencesPayload).order)) {\n return null;\n }\n const order = (data as AgentPreferencesPayload).order.filter(\n (x): x is string => typeof x === 'string' && x.length > 0,\n );\n return { order };\n } catch {\n return null;\n }\n}\n\nexport function writeAgentPreferences(payload: AgentPreferencesPayload): void {\n if (!isBrowser()) return;\n const order = payload.order.slice(0, MAX_AGENT_PREFERENCE_ENTRIES);\n const json = JSON.stringify({ order });\n const expires = new Date();\n expires.setFullYear(expires.getFullYear() + 1);\n document.cookie = `${AGENT_PREFERENCES_COOKIE_NAME}=${encodeURIComponent(json)}; Path=/; SameSite=Lax; Expires=${expires.toUTCString()}`;\n}\n\n/** Move agentId to the front of the MRU list (call after a successful copy / engagement). */\nexport function recordAgentPreference(agentId: string): void {\n if (!agentId || typeof agentId !== 'string') return;\n const prev = readAgentPreferences();\n const base = prev?.order.filter((id) => id !== agentId) ?? [];\n writeAgentPreferences({ order: [agentId, ...base] });\n}\n","export const HERMES_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon\">\n <!-- Wing helmet -->\n <path d=\"M12 2C8.5 2 6 4.5 6 7c0 1.5.5 2.8 1.5 3.8L6 14h12l-1.5-3.2C17.5 9.8 18 8.5 18 7c0-2.5-2.5-5-6-5z\" fill=\"currentColor\" opacity=\"0.2\"/>\n <path d=\"M12 2C8.5 2 6 4.5 6 7c0 1.5.5 2.8 1.5 3.8L6 14h12l-1.5-3.2C17.5 9.8 18 8.5 18 7c0-2.5-2.5-5-6-5z\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linejoin=\"round\"/>\n <!-- Wings -->\n <path d=\"M6 6.5C4.5 5 2 5 2 7s1.5 3 3 3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M18 6.5C19.5 5 22 5 22 7s-1.5 3-3 3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <!-- Caduceus staff -->\n <line x1=\"12\" y1=\"14\" x2=\"12\" y2=\"22\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n <!-- Snakes -->\n <path d=\"M9.5 16c1.5 1 3.5 1 5 0\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" fill=\"none\"/>\n <path d=\"M9.5 19c1.5 1 3.5 1 5 0\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" fill=\"none\"/>\n <!-- Eye -->\n <circle cx=\"12\" cy=\"7.5\" r=\"1.5\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const HERMES_SKILL_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon\">\n <!-- Brain/memory symbol -->\n <path d=\"M12 3C8 3 5 6 5 9c0 2 1 3.5 2 4.5V16a2 2 0 002 2h6a2 2 0 002-2v-2.5c1-1 2-2.5 2-4.5 0-3-3-6-7-6z\" fill=\"currentColor\" opacity=\"0.15\"/>\n <path d=\"M12 3C8 3 5 6 5 9c0 2 1 3.5 2 4.5V16a2 2 0 002 2h6a2 2 0 002-2v-2.5c1-1 2-2.5 2-4.5 0-3-3-6-7-6z\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linejoin=\"round\"/>\n <!-- Neural connections -->\n <path d=\"M9 9.5c0-1 .5-2 1.5-2.5M15 9.5c0-1-.5-2-1.5-2.5M10.5 11c.5.5 1.5 1 3 0\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" fill=\"none\"/>\n <!-- Growing roots -->\n <path d=\"M9 18v2M12 18v3M15 18v2\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <!-- Sparkle -->\n <circle cx=\"8\" cy=\"6\" r=\"0.8\" fill=\"currentColor\"/>\n <circle cx=\"16\" cy=\"6\" r=\"0.8\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const COPY_ICON = `<svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon-sm\">\n <rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M3 10V3.5A1.5 1.5 0 014.5 2H10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n\nexport const CHECK_ICON = `<svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon-sm\">\n <path d=\"M3 8.5l3.5 3.5L13 4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>`;\n\nexport const DOWNLOAD_ICON = `<svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon-sm\">\n <path d=\"M8 2v8m0 0l-3-3m3 3l3-3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 12v1.5a1 1 0 001 1h8a1 1 0 001-1V12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n\nexport const CLOSE_ICON = `<svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon-sm\">\n <path d=\"M4 4l8 8m0-8l-8 8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n\nexport const TERMINAL_ICON = `<svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"hb-icon-sm\">\n <rect x=\"1\" y=\"2\" width=\"14\" height=\"12\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M4 6l3 2.5L4 11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M9 11h3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n","import type { ThemeTokens, Theme } from './types';\n\n/** Electric blue aligned with [Hermes Agent](https://hermes-agent.nousresearch.com/) marketing */\nexport const BRAND_COLOR = '#2B8CFF';\nexport const BRAND_COLOR_HOVER = '#1E7AEB';\nexport const BRAND_COLOR_ACTIVE = '#186BD4';\n/** Comma-separated RGB for `rgba(..., α)` in component styles */\nexport const BRAND_RGB = '43, 140, 255';\n\n/** Periwinkle secondary (Hermes hero title tone) */\nexport const ALT_BRAND_COLOR = '#8FA3E8';\nexport const ALT_BRAND_COLOR_HOVER = '#7B91DC';\nexport const ALT_BRAND_COLOR_ACTIVE = '#6B82CC';\nexport const ALT_BRAND_RGB = '143, 163, 232';\n\nexport const themes: Record<Exclude<Theme, 'system'>, ThemeTokens> = {\n branded: {\n bg: BRAND_COLOR,\n text: '#FFFFFF',\n border: 'transparent',\n surface: '#FFFFFF',\n surfaceText: '#0F172A',\n muted: '#64748B',\n primary: BRAND_COLOR,\n primaryText: '#FFFFFF',\n codeBg: '#0F172A',\n codeText: '#F1F5F9',\n },\n 'branded-alt': {\n bg: ALT_BRAND_COLOR,\n text: '#FFFFFF',\n border: 'transparent',\n surface: '#FFFFFF',\n surfaceText: '#0F172A',\n muted: '#64748B',\n primary: ALT_BRAND_COLOR,\n primaryText: '#FFFFFF',\n codeBg: '#0F172A',\n codeText: '#F1F5F9',\n },\n dark: {\n bg: '#141C2E',\n text: '#F1F5F9',\n border: '#2A3F5C',\n surface: '#1A2740',\n surfaceText: '#F1F5F9',\n muted: '#94A3B8',\n primary: BRAND_COLOR,\n primaryText: '#FFFFFF',\n codeBg: '#0A0E18',\n codeText: '#F1F5F9',\n },\n light: {\n bg: '#FFFFFF',\n text: '#0F172A',\n border: '#CBD5E1',\n surface: '#F8FAFC',\n surfaceText: '#0F172A',\n muted: '#64748B',\n primary: BRAND_COLOR,\n primaryText: '#FFFFFF',\n codeBg: '#0F172A',\n codeText: '#F1F5F9',\n },\n};\n\nexport function resolveTheme(theme: Theme): ThemeTokens {\n if (theme !== 'system') return themes[theme];\n if (typeof window === 'undefined') return themes.light;\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? themes.dark\n : themes.light;\n}\n\nexport function themeToCSS(tokens: ThemeTokens): string {\n return `\n --hb-bg: ${tokens.bg};\n --hb-text: ${tokens.text};\n --hb-border: ${tokens.border};\n --hb-surface: ${tokens.surface};\n --hb-surface-text: ${tokens.surfaceText};\n --hb-muted: ${tokens.muted};\n --hb-primary: ${tokens.primary};\n --hb-primary-text: ${tokens.primaryText};\n --hb-code-bg: ${tokens.codeBg};\n --hb-code-text: ${tokens.codeText};\n `;\n}\n\nexport const SHAPE_MAP = {\n rounded: { sm: '0.375rem', md: '0.5rem', lg: '0.625rem' },\n pill: { sm: '999px', md: '999px', lg: '999px' },\n square: { sm: '0', md: '0', lg: '0' },\n} as const;\n\nexport const SIZE_MAP = {\n sm: { height: '2rem', fontSize: '0.75rem', iconSize: '0.875rem', padding: '0 0.75rem', ccPadding: '0 0.5rem', gap: '0.375rem', radius: '0.375rem' },\n md: { height: '2.5rem', fontSize: '0.875rem', iconSize: '1.125rem', padding: '0 1rem', ccPadding: '0 0.75rem', gap: '0.5rem', radius: '0.5rem' },\n lg: { height: '3rem', fontSize: '1rem', iconSize: '1.375rem', padding: '0 1.25rem', ccPadding: '0 1rem', gap: '0.625rem', radius: '0.625rem' },\n};\n","import type { PopupOptions, ThemeTokens } from './types';\nimport { HERMES_ICON, HERMES_SKILL_ICON, COPY_ICON, CHECK_ICON, CLOSE_ICON } from './icons';\nimport { resolveTheme, themeToCSS, BRAND_COLOR_HOVER } from './themes';\n\nconst POPUP_STYLES = `\n :host {\n position: fixed;\n inset: 0;\n z-index: 999999;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n }\n\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n .hb-backdrop {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n animation: hb-fade-in 0.15s ease-out;\n }\n\n .hb-dialog {\n position: relative;\n width: 90%;\n max-width: 460px;\n background: var(--hb-surface);\n color: var(--hb-surface-text);\n border-radius: 16px;\n box-shadow: 0 24px 48px -12px rgba(0, 0, 0, 0.25), 0 0 0 1px var(--hb-border);\n overflow: hidden;\n animation: hb-scale-in 0.2s ease-out;\n }\n\n .hb-dialog-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--hb-border);\n }\n\n .hb-dialog-header-icon {\n width: 36px;\n height: 36px;\n color: var(--hb-primary);\n flex-shrink: 0;\n }\n\n .hb-dialog-header-text {\n flex: 1;\n min-width: 0;\n }\n\n .hb-dialog-title {\n font-size: 16px;\n font-weight: 600;\n line-height: 1.3;\n color: var(--hb-surface-text);\n }\n\n .hb-dialog-description {\n font-size: 13px;\n color: var(--hb-muted);\n margin-top: 2px;\n line-height: 1.4;\n }\n\n .hb-dialog-close {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: var(--hb-muted);\n cursor: pointer;\n border-radius: 8px;\n flex-shrink: 0;\n transition: background 0.15s, color 0.15s;\n }\n\n .hb-dialog-close:hover {\n background: var(--hb-border);\n color: var(--hb-surface-text);\n }\n\n .hb-dialog-close svg { width: 14px; height: 14px; }\n\n .hb-dialog-body { padding: 20px 24px; }\n\n .hb-step {\n display: flex;\n gap: 12px;\n margin-bottom: 16px;\n }\n\n .hb-step:last-child { margin-bottom: 0; }\n\n .hb-step-num {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--hb-primary);\n color: var(--hb-primary-text);\n font-size: 12px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n .hb-step-content {\n flex: 1;\n min-width: 0;\n }\n\n .hb-step-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--hb-surface-text);\n margin-bottom: 8px;\n line-height: 1.4;\n }\n\n .hb-code-block {\n display: flex;\n align-items: center;\n background: var(--hb-code-bg);\n color: var(--hb-code-text);\n border-radius: 10px;\n padding: 2px 2px 2px 14px;\n font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', Consolas, 'Liberation Mono', Menlo, monospace;\n font-size: 13px;\n line-height: 1.5;\n gap: 8px;\n overflow: hidden;\n }\n\n .hb-code-text {\n flex: 1;\n overflow-x: auto;\n white-space: nowrap;\n padding: 10px 0;\n scrollbar-width: none;\n }\n\n .hb-code-text::-webkit-scrollbar { display: none; }\n\n .hb-code-prefix {\n color: var(--hb-muted);\n user-select: none;\n margin-right: 6px;\n }\n\n .hb-copy-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 36px;\n min-width: 36px;\n padding: 0 12px;\n border: none;\n background: var(--hb-primary);\n color: var(--hb-primary-text);\n cursor: pointer;\n border-radius: 8px;\n font-family: inherit;\n font-size: 12px;\n font-weight: 500;\n flex-shrink: 0;\n transition: background 0.15s, transform 0.1s;\n white-space: nowrap;\n }\n\n .hb-copy-btn:hover { background: ${BRAND_COLOR_HOVER}; }\n .hb-copy-btn:active { transform: scale(0.96); }\n .hb-copy-btn svg { width: 14px; height: 14px; }\n\n .hb-copy-btn[data-copied=\"true\"] {\n background: #16a34a;\n }\n\n .hb-dialog-footer {\n padding: 16px 24px 20px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .hb-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n height: 44px;\n border: none;\n background: var(--hb-primary);\n color: var(--hb-primary-text);\n cursor: pointer;\n border-radius: 10px;\n font-family: inherit;\n font-size: 14px;\n font-weight: 600;\n transition: background 0.15s, transform 0.1s;\n }\n\n .hb-action-btn:hover { background: ${BRAND_COLOR_HOVER}; }\n .hb-action-btn:active { transform: scale(0.98); }\n .hb-action-btn svg { width: 16px; height: 16px; }\n\n .hb-hint {\n font-size: 12px;\n color: var(--hb-muted);\n text-align: center;\n line-height: 1.4;\n }\n\n .hb-hint kbd {\n display: inline-block;\n padding: 1px 5px;\n font-family: inherit;\n font-size: 11px;\n background: var(--hb-border);\n border-radius: 4px;\n border: 1px solid var(--hb-border);\n }\n\n @keyframes hb-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes hb-scale-in {\n from { opacity: 0; transform: scale(0.95) translateY(8px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n @media (max-width: 480px) {\n .hb-dialog {\n width: 96%;\n max-width: none;\n border-radius: 14px;\n max-height: 90dvh;\n overflow-y: auto;\n overscroll-behavior: contain;\n }\n\n .hb-dialog-header { padding: 16px 16px 12px; gap: 10px; }\n .hb-dialog-header-icon { width: 28px; height: 28px; }\n .hb-dialog-body { padding: 16px; }\n .hb-dialog-footer { padding: 12px 16px 16px; }\n\n .hb-step { gap: 10px; margin-bottom: 14px; }\n .hb-step-num { width: 22px; height: 22px; font-size: 11px; }\n .hb-step-label { font-size: 12px; margin-bottom: 6px; }\n\n .hb-code-block { font-size: 12px; padding: 2px 2px 2px 10px; border-radius: 8px; }\n .hb-copy-btn { height: 32px; padding: 0 10px; font-size: 11px; border-radius: 6px; }\n .hb-action-btn { height: 40px; font-size: 13px; border-radius: 8px; }\n .hb-hint { font-size: 11px; }\n }\n\n @media (max-width: 360px) {\n .hb-dialog { width: 100%; border-radius: 12px 12px 0 0; align-self: flex-end; }\n .hb-copy-btn span { display: none; }\n .hb-copy-btn { min-width: 32px; padding: 0 8px; }\n }\n\n @supports (padding: env(safe-area-inset-bottom)) {\n .hb-dialog-footer { padding-bottom: calc(20px + env(safe-area-inset-bottom)); }\n }\n`;\n\nexport class HermesPopupDialog extends HTMLElement {\n private _options!: PopupOptions;\n private _mqCleanup: (() => void) | null = null;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n set options(opts: PopupOptions) {\n this._options = opts;\n this.render();\n }\n\n get options() {\n return this._options;\n }\n\n disconnectedCallback() {\n this._mqCleanup?.();\n this._mqCleanup = null;\n }\n\n private resolvePopupTokens(): ThemeTokens {\n const { theme } = this._options;\n\n if (theme === 'dark' || theme === 'light') return resolveTheme(theme);\n\n const prefersDark = typeof window !== 'undefined'\n && window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n if (theme === 'system') {\n return prefersDark ? resolveTheme('dark') : resolveTheme('light');\n }\n\n const base = prefersDark ? resolveTheme('dark') : resolveTheme('light');\n const brand = resolveTheme(theme);\n return {\n ...base,\n primary: brand.primary,\n primaryText: brand.primaryText,\n };\n }\n\n private render() {\n if (!this.shadowRoot || !this._options) return;\n\n const { variant, title, description, command, fullCommand } = this._options;\n const tokens = this.resolvePopupTokens();\n const icon = variant === 'hermes' ? HERMES_ICON : HERMES_SKILL_ICON;\n\n const isHermesTerminal = variant === 'hermes';\n const displayCommand = fullCommand || command;\n\n this.shadowRoot.innerHTML = `\n <style>${POPUP_STYLES}</style>\n <div style=\"${themeToCSS(tokens)}\">\n <div class=\"hb-backdrop\" data-action=\"close\"></div>\n <div class=\"hb-dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"hb-dialog-title\">\n <div class=\"hb-dialog-header\">\n <div class=\"hb-dialog-header-icon\">${icon}</div>\n <div class=\"hb-dialog-header-text\">\n <div class=\"hb-dialog-title\" id=\"hb-dialog-title\">${title}</div>\n ${description ? `<div class=\"hb-dialog-description\">${description}</div>` : ''}\n </div>\n <button class=\"hb-dialog-close\" data-action=\"close\" aria-label=\"Close\">${CLOSE_ICON}</button>\n </div>\n <div class=\"hb-dialog-body\">\n ${isHermesTerminal ? this.renderHermesTerminalBody(displayCommand) : this.renderHermesSkillBody(command)}\n </div>\n <div class=\"hb-dialog-footer\">\n ${isHermesTerminal ? `\n <div class=\"hb-hint\">Press <kbd>⌘</kbd>+<kbd>V</kbd> or <kbd>Ctrl</kbd>+<kbd>V</kbd> in your terminal to run</div>\n ` : `\n <div class=\"hb-hint\">Press <kbd>⌘</kbd>+<kbd>V</kbd> or <kbd>Ctrl</kbd>+<kbd>V</kbd> in your Hermes session to run</div>\n `}\n </div>\n </div>\n </div>\n `;\n\n this.setupListeners();\n this.setupSystemThemeWatch();\n }\n\n private renderHermesTerminalBody(command: string): string {\n return `\n <div class=\"hb-step\">\n <div class=\"hb-step-num\">1</div>\n <div class=\"hb-step-content\">\n <div class=\"hb-step-label\">Copy this command to your clipboard</div>\n <div class=\"hb-code-block\">\n <div class=\"hb-code-text\"><span class=\"hb-code-prefix\">$</span>${this.escapeHtml(command)}</div>\n <button class=\"hb-copy-btn\" data-action=\"copy\" data-command=\"${this.escapeAttr(command)}\">${COPY_ICON}<span>Copy</span></button>\n </div>\n </div>\n </div>\n <div class=\"hb-step\">\n <div class=\"hb-step-num\">2</div>\n <div class=\"hb-step-content\">\n <div class=\"hb-step-label\">Paste and run in your terminal</div>\n </div>\n </div>\n `;\n }\n\n private renderHermesSkillBody(command: string): string {\n return `\n <div class=\"hb-step\">\n <div class=\"hb-step-num\">1</div>\n <div class=\"hb-step-content\">\n <div class=\"hb-step-label\">Copy this command to your clipboard</div>\n <div class=\"hb-code-block\">\n <div class=\"hb-code-text\">${this.escapeHtml(command)}</div>\n <button class=\"hb-copy-btn\" data-action=\"copy\" data-command=\"${this.escapeAttr(command)}\">${COPY_ICON}<span>Copy</span></button>\n </div>\n </div>\n </div>\n <div class=\"hb-step\">\n <div class=\"hb-step-num\">2</div>\n <div class=\"hb-step-content\">\n <div class=\"hb-step-label\">Paste and send in your Hermes session</div>\n </div>\n </div>\n `;\n }\n\n private setupListeners() {\n if (!this.shadowRoot) return;\n\n this.shadowRoot.addEventListener('click', (e) => {\n const target = (e.target as HTMLElement).closest('[data-action]') as HTMLElement | null;\n if (!target) return;\n\n const action = target.dataset.action;\n\n if (action === 'close') {\n this.close();\n } else if (action === 'copy') {\n const cmd = target.dataset.command || '';\n this.copyToClipboard(cmd, target);\n }\n });\n\n this.shadowRoot.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Escape') this.close();\n });\n }\n\n private setupSystemThemeWatch() {\n this._mqCleanup?.();\n this._mqCleanup = null;\n\n const theme = this._options.theme;\n const needsWatch = theme === 'system' || theme === 'branded' || theme === 'branded-alt';\n if (!needsWatch || typeof window === 'undefined') return;\n\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = () => this.render();\n mq.addEventListener('change', handler);\n this._mqCleanup = () => mq.removeEventListener('change', handler);\n }\n\n private async copyToClipboard(command: string, button: HTMLElement) {\n try {\n await navigator.clipboard.writeText(command);\n const label = button.querySelector('span');\n const iconContainer = button;\n\n button.setAttribute('data-copied', 'true');\n if (label) label.textContent = 'Copied!';\n iconContainer.innerHTML = `${CHECK_ICON}<span>Copied!</span>`;\n\n this._options.onCopy?.(command);\n\n setTimeout(() => {\n button.setAttribute('data-copied', 'false');\n iconContainer.innerHTML = `${COPY_ICON}<span>Copy</span>`;\n }, 2000);\n } catch {\n const textarea = document.createElement('textarea');\n textarea.value = command;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n\n this._options.onCopy?.(command);\n }\n }\n\n close() {\n const dialog = this.shadowRoot?.querySelector('.hb-dialog') as HTMLElement;\n const backdrop = this.shadowRoot?.querySelector('.hb-backdrop') as HTMLElement;\n\n if (dialog) {\n dialog.style.animation = 'hb-scale-in 0.15s ease-in reverse';\n }\n if (backdrop) {\n backdrop.style.animation = 'hb-fade-in 0.15s ease-in reverse';\n }\n\n setTimeout(() => {\n this._options.onClose?.();\n this.remove();\n }, 140);\n }\n\n private escapeHtml(str: string): string {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n private escapeAttr(str: string): string {\n return str.replace(/\"/g, '&quot;').replace(/'/g, '&#39;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('hermes-popup-dialog')) {\n customElements.define('hermes-popup-dialog', HermesPopupDialog);\n}\n\nexport function showPopup(options: PopupOptions): HermesPopupDialog {\n const popup = document.createElement('hermes-popup-dialog') as HermesPopupDialog;\n popup.options = options;\n document.body.appendChild(popup);\n return popup;\n}\n","import type { HermesButtonOptions, Theme, Size, Variant, Shape } from './types';\nimport { recordAgentPreference } from './agent-preferences';\nimport { HERMES_ICON } from './icons';\nimport {\n resolveTheme,\n themeToCSS,\n SIZE_MAP,\n SHAPE_MAP,\n BRAND_COLOR,\n BRAND_COLOR_HOVER,\n BRAND_COLOR_ACTIVE,\n BRAND_RGB,\n ALT_BRAND_COLOR,\n ALT_BRAND_COLOR_HOVER,\n ALT_BRAND_COLOR_ACTIVE,\n ALT_BRAND_RGB,\n} from './themes';\nimport { showPopup } from './popup-dialog';\n\nconst BUTTON_STYLES = `\n :host {\n display: inline-block;\n vertical-align: middle;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n -webkit-tap-highlight-color: transparent;\n }\n\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n .hb-btn {\n display: inline-flex;\n align-items: center;\n gap: var(--hb-gap);\n height: var(--hb-height);\n min-height: 44px;\n padding: var(--hb-padding);\n border: 1.5px solid var(--hb-border);\n background: var(--hb-bg);\n color: var(--hb-text);\n font-family: inherit;\n font-size: var(--hb-font-size);\n font-weight: 600;\n line-height: 1;\n border-radius: var(--hb-radius);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n touch-action: manipulation;\n transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, transform 0.1s ease, color 0.15s ease;\n text-decoration: none;\n -webkit-font-smoothing: antialiased;\n }\n\n @media (pointer: fine) {\n .hb-btn { min-height: unset; }\n }\n\n /* ─── FILLED ─── */\n\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn,\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn {\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn:hover {\n background: ${BRAND_COLOR_HOVER};\n box-shadow: 0 2px 8px rgba(${BRAND_RGB}, 0.35);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn:active {\n background: ${BRAND_COLOR_ACTIVE};\n transform: scale(0.98);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn:hover {\n background: ${ALT_BRAND_COLOR_HOVER};\n box-shadow: 0 2px 8px rgba(${ALT_BRAND_RGB}, 0.35);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn:active {\n background: ${ALT_BRAND_COLOR_ACTIVE};\n transform: scale(0.98);\n }\n\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn {\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n }\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn:hover {\n background: #1E2A42;\n border-color: #475569;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n }\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn:active {\n background: #141C2E;\n transform: scale(0.98);\n }\n\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn {\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.04);\n }\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn:hover {\n border-color: #94A3B8;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn:active {\n background: #F8FAFC;\n transform: scale(0.98);\n }\n\n /* ─── OUTLINE ─── */\n\n :host([data-variant=\"outline\"][data-theme=\"branded\"]) .hb-btn {\n background: transparent;\n border-color: ${BRAND_COLOR};\n color: ${BRAND_COLOR};\n }\n :host([data-variant=\"outline\"][data-theme=\"branded\"]) .hb-btn:hover {\n background: rgba(${BRAND_RGB}, 0.08);\n box-shadow: 0 2px 8px rgba(${BRAND_RGB}, 0.15);\n }\n :host([data-variant=\"outline\"][data-theme=\"branded\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.14);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"outline\"][data-theme=\"branded-alt\"]) .hb-btn {\n background: transparent;\n border-color: ${ALT_BRAND_COLOR};\n color: ${ALT_BRAND_COLOR};\n }\n :host([data-variant=\"outline\"][data-theme=\"branded-alt\"]) .hb-btn:hover {\n background: rgba(${ALT_BRAND_RGB}, 0.08);\n box-shadow: 0 2px 8px rgba(${ALT_BRAND_RGB}, 0.15);\n }\n :host([data-variant=\"outline\"][data-theme=\"branded-alt\"]) .hb-btn:active {\n background: rgba(${ALT_BRAND_RGB}, 0.14);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"outline\"][data-theme=\"dark\"]) .hb-btn {\n background: transparent;\n border-color: #475569;\n color: #F1F5F9;\n }\n :host([data-variant=\"outline\"][data-theme=\"dark\"]) .hb-btn:hover {\n border-color: ${BRAND_COLOR};\n background: rgba(${BRAND_RGB}, 0.08);\n }\n :host([data-variant=\"outline\"][data-theme=\"dark\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.14);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"outline\"][data-theme=\"light\"]) .hb-btn {\n background: transparent;\n border-color: #CBD5E1;\n color: #0F172A;\n }\n :host([data-variant=\"outline\"][data-theme=\"light\"]) .hb-btn:hover {\n border-color: ${BRAND_COLOR};\n background: rgba(${BRAND_RGB}, 0.05);\n }\n :host([data-variant=\"outline\"][data-theme=\"light\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.1);\n transform: scale(0.98);\n }\n\n /* ─── GHOST ─── */\n\n :host([data-variant=\"ghost\"]) .hb-btn {\n background: transparent;\n border-color: transparent;\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"branded\"]) .hb-btn {\n color: ${BRAND_COLOR};\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded\"]) .hb-btn:hover {\n background: rgba(${BRAND_RGB}, 0.1);\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.16);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"branded-alt\"]) .hb-btn {\n color: ${ALT_BRAND_COLOR};\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded-alt\"]) .hb-btn:hover {\n background: rgba(${ALT_BRAND_RGB}, 0.1);\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded-alt\"]) .hb-btn:active {\n background: rgba(${ALT_BRAND_RGB}, 0.16);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"dark\"]) .hb-btn {\n color: #F1F5F9;\n }\n :host([data-variant=\"ghost\"][data-theme=\"dark\"]) .hb-btn:hover {\n background: rgba(255, 255, 255, 0.06);\n }\n :host([data-variant=\"ghost\"][data-theme=\"dark\"]) .hb-btn:active {\n background: rgba(255, 255, 255, 0.1);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"light\"]) .hb-btn {\n color: #0F172A;\n }\n :host([data-variant=\"ghost\"][data-theme=\"light\"]) .hb-btn:hover {\n background: rgba(0, 0, 0, 0.04);\n }\n :host([data-variant=\"ghost\"][data-theme=\"light\"]) .hb-btn:active {\n background: rgba(0, 0, 0, 0.08);\n transform: scale(0.98);\n }\n\n /* ─── FOCUS ─── */\n\n .hb-btn:focus-visible {\n outline: 2px solid var(--hb-focus-color, ${BRAND_COLOR});\n outline-offset: 2px;\n }\n\n /* ─── ICON ─── */\n\n .hb-btn-icon {\n width: var(--hb-icon-size);\n height: var(--hb-icon-size);\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .hb-btn-icon svg { width: 100%; height: 100%; }\n\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn-icon,\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn-icon {\n color: #FFFFFF;\n --hb-icon-accent: rgba(255,255,255,0.2);\n }\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn-icon {\n color: var(--hb-accent-color, ${BRAND_COLOR});\n }\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn-icon {\n color: var(--hb-accent-color, ${BRAND_COLOR});\n }\n\n :host([data-variant=\"outline\"]) .hb-btn-icon,\n :host([data-variant=\"ghost\"]) .hb-btn-icon {\n color: var(--hb-accent-color, ${BRAND_COLOR});\n }\n\n /* ─── LABEL ─── */\n\n .hb-btn-label {\n letter-spacing: -0.01em;\n }\n`;\n\nexport class HermesButton extends HTMLElement {\n static observedAttributes = ['command', 'theme', 'size', 'variant', 'shape', 'popup', 'prompt-flag', 'popup-title', 'popup-description'];\n\n private _options: HermesButtonOptions = {\n command: '',\n theme: 'branded',\n size: 'md',\n variant: 'filled',\n popup: true,\n promptFlag: true,\n };\n\n private _mqCleanup: (() => void) | null = null;\n private _rendered = false;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n this.syncFromAttributes();\n this.render();\n this.updateLightDOM();\n }\n\n disconnectedCallback() {\n this._mqCleanup?.();\n this._mqCleanup = null;\n }\n\n attributeChangedCallback() {\n if (!this._rendered) return;\n this.syncFromAttributes();\n this.render();\n this.updateLightDOM();\n }\n\n set options(opts: Partial<HermesButtonOptions>) {\n this._options = { ...this._options, ...opts };\n this.render();\n this.updateLightDOM();\n }\n\n get options() {\n return this._options;\n }\n\n private syncFromAttributes() {\n const command = this.getAttribute('command');\n const theme = this.getAttribute('theme') as Theme | null;\n const size = this.getAttribute('size') as Size | null;\n const variant = this.getAttribute('variant') as Variant | null;\n const shape = this.getAttribute('shape') as Shape | null;\n const popup = this.getAttribute('popup');\n const promptFlag = this.getAttribute('prompt-flag');\n const popupTitle = this.getAttribute('popup-title');\n const popupDescription = this.getAttribute('popup-description');\n\n if (command !== null) this._options.command = command;\n if (theme) this._options.theme = theme;\n if (size) this._options.size = size;\n if (variant) this._options.variant = variant;\n if (shape) this._options.shape = shape;\n if (popup !== null) this._options.popup = popup !== 'false';\n if (promptFlag !== null) this._options.promptFlag = promptFlag !== 'false';\n if (popupTitle !== null) this._options.popupTitle = popupTitle;\n if (popupDescription !== null) this._options.popupDescription = popupDescription;\n }\n\n private updateLightDOM() {\n const { command } = this._options;\n const fullCommand = this.getFullCommand();\n\n this.setAttribute('role', 'button');\n this.setAttribute('tabindex', '0');\n this.setAttribute('aria-label', `Run on Hermes: ${command}`);\n if (this._options.popup !== false) {\n this.setAttribute('aria-haspopup', 'dialog');\n } else {\n this.removeAttribute('aria-haspopup');\n }\n\n let link = this.querySelector('a[data-hb-crawl]') as HTMLAnchorElement | null;\n if (!link) {\n link = document.createElement('a');\n link.setAttribute('data-hb-crawl', '');\n link.setAttribute('aria-hidden', 'true');\n link.style.cssText = 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;';\n this.appendChild(link);\n }\n link.href = `https://hermes.ai/run?command=${encodeURIComponent(fullCommand)}`;\n link.textContent = `Run on Hermes: ${command}`;\n link.setAttribute('data-platform', 'hermes');\n link.setAttribute('data-command', command);\n link.setAttribute('data-full-command', fullCommand);\n }\n\n private getResolvedTheme(): Theme {\n return this._options.theme || 'branded';\n }\n\n private getFullCommand(): string {\n const { command, promptFlag } = this._options;\n if (promptFlag === false) return command;\n return `hermes -p \"${command}\"`;\n }\n\n private render() {\n if (!this.shadowRoot) return;\n\n const theme = this.getResolvedTheme();\n const resolvedTheme = theme === 'system' ? (\n typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n ) : theme;\n const variant = this._options.variant || 'filled';\n\n const tokens = resolveTheme(theme);\n const size = this._options.size || 'md';\n const shape = this._options.shape || 'rounded';\n const sizeTokens = SIZE_MAP[size];\n const radius = SHAPE_MAP[shape][size];\n\n this.setAttribute('data-theme', resolvedTheme);\n this.setAttribute('data-variant', variant);\n\n const bgOverride = variant !== 'filled' ? 'transparent' : tokens.bg;\n const borderOverride = variant === 'ghost' ? 'transparent' :\n variant === 'outline' ? tokens.primary : tokens.border;\n const textOverride = variant !== 'filled' ? tokens.primary : tokens.text;\n\n this.shadowRoot.innerHTML = `\n <style>${BUTTON_STYLES}</style>\n <button\n class=\"hb-btn\"\n type=\"button\"\n style=\"\n ${themeToCSS(tokens)}\n --hb-bg: ${bgOverride};\n --hb-border: ${borderOverride};\n --hb-text: ${textOverride};\n --hb-accent-color: ${tokens.primary};\n --hb-focus-color: ${tokens.primary};\n --hb-height: ${sizeTokens.height};\n --hb-font-size: ${sizeTokens.fontSize};\n --hb-icon-size: ${sizeTokens.iconSize};\n --hb-padding: ${sizeTokens.ccPadding};\n --hb-gap: ${sizeTokens.gap};\n --hb-radius: ${radius};\n \"\n aria-label=\"Run on Hermes: ${this._options.command.replace(/\"/g, '&quot;')}\"\n >\n <span class=\"hb-btn-icon\" aria-hidden=\"true\">${HERMES_ICON}</span>\n <span class=\"hb-btn-label\">Run on Hermes</span>\n </button>\n `;\n\n const btn = this.shadowRoot.querySelector('.hb-btn')!;\n btn.addEventListener('click', () => this.handleClick());\n btn.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Enter' || (e as KeyboardEvent).key === ' ') {\n e.preventDefault();\n this.handleClick();\n }\n });\n this._rendered = true;\n this.setupSystemThemeWatch();\n }\n\n private handleClick() {\n const { popup, command, popupTitle, popupDescription } = this._options;\n const fullCommand = this.getFullCommand();\n\n this.dispatchEvent(new CustomEvent('hb-open', {\n bubbles: true,\n composed: true,\n detail: { command, fullCommand },\n }));\n\n if (popup === false) {\n navigator.clipboard.writeText(fullCommand).then(() => {\n this._options.onCopy?.(fullCommand);\n recordAgentPreference('hermes');\n this.dispatchEvent(new CustomEvent('hb-copy', {\n bubbles: true,\n composed: true,\n detail: { command: fullCommand },\n }));\n });\n return;\n }\n\n showPopup({\n variant: 'hermes',\n theme: this.getResolvedTheme(),\n title: popupTitle || 'Run on Hermes',\n description: popupDescription || 'Execute this command in your terminal to get started with Hermes Agent.',\n command,\n fullCommand,\n onCopy: (cmd: string) => {\n this._options.onCopy?.(cmd);\n recordAgentPreference('hermes');\n this.dispatchEvent(new CustomEvent('hb-copy', {\n bubbles: true,\n composed: true,\n detail: { command: cmd },\n }));\n },\n onClose: () => {\n this.dispatchEvent(new CustomEvent('hb-close', {\n bubbles: true,\n composed: true,\n }));\n },\n });\n }\n\n private setupSystemThemeWatch() {\n this._mqCleanup?.();\n this._mqCleanup = null;\n\n if (this.getResolvedTheme() !== 'system' || typeof window === 'undefined') return;\n\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = () => this.render();\n mq.addEventListener('change', handler);\n this._mqCleanup = () => mq.removeEventListener('change', handler);\n }\n}\n\nexport function registerHermesButton(tagName = 'hermes-button') {\n if (typeof customElements === 'undefined') return;\n if (!customElements.get(tagName)) {\n customElements.define(tagName, HermesButton);\n }\n}\n\nregisterHermesButton();\n\nexport function createHermesButton(options: HermesButtonOptions): HermesButton {\n const el = document.createElement('hermes-button') as HermesButton;\n el.options = options;\n return el;\n}\n","import type { HermesSkillButtonOptions, Theme, Size, Variant, Shape } from './types';\nimport { recordAgentPreference } from './agent-preferences';\nimport { HERMES_SKILL_ICON } from './icons';\nimport {\n resolveTheme,\n themeToCSS,\n SIZE_MAP,\n SHAPE_MAP,\n BRAND_COLOR,\n BRAND_COLOR_HOVER,\n BRAND_COLOR_ACTIVE,\n BRAND_RGB,\n ALT_BRAND_COLOR,\n ALT_BRAND_COLOR_HOVER,\n ALT_BRAND_COLOR_ACTIVE,\n ALT_BRAND_RGB,\n} from './themes';\nimport { showPopup } from './popup-dialog';\n\nconst BUTTON_STYLES = `\n :host {\n display: inline-block;\n vertical-align: middle;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n -webkit-tap-highlight-color: transparent;\n }\n\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n .hb-btn {\n display: inline-flex;\n align-items: center;\n gap: var(--hb-gap);\n height: var(--hb-height);\n min-height: 44px;\n padding: var(--hb-padding);\n border: 1.5px solid var(--hb-border);\n background: var(--hb-bg);\n color: var(--hb-text);\n font-family: inherit;\n font-size: var(--hb-font-size);\n font-weight: 600;\n line-height: 1;\n border-radius: var(--hb-radius);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n touch-action: manipulation;\n transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, transform 0.1s ease, color 0.15s ease;\n text-decoration: none;\n -webkit-font-smoothing: antialiased;\n }\n\n @media (pointer: fine) {\n .hb-btn { min-height: unset; }\n }\n\n /* ─── FILLED ─── */\n\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn,\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn {\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn:hover {\n background: ${BRAND_COLOR_HOVER};\n box-shadow: 0 2px 8px rgba(${BRAND_RGB}, 0.35);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn:active {\n background: ${BRAND_COLOR_ACTIVE};\n transform: scale(0.98);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn:hover {\n background: ${ALT_BRAND_COLOR_HOVER};\n box-shadow: 0 2px 8px rgba(${ALT_BRAND_RGB}, 0.35);\n }\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn:active {\n background: ${ALT_BRAND_COLOR_ACTIVE};\n transform: scale(0.98);\n }\n\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn {\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n }\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn:hover {\n background: #1E2A42;\n border-color: #475569;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n }\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn:active {\n background: #141C2E;\n transform: scale(0.98);\n }\n\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn {\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.04);\n }\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn:hover {\n border-color: #94A3B8;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn:active {\n background: #F8FAFC;\n transform: scale(0.98);\n }\n\n /* ─── OUTLINE ─── */\n\n :host([data-variant=\"outline\"][data-theme=\"branded\"]) .hb-btn {\n background: transparent;\n border-color: ${BRAND_COLOR};\n color: ${BRAND_COLOR};\n }\n :host([data-variant=\"outline\"][data-theme=\"branded\"]) .hb-btn:hover {\n background: rgba(${BRAND_RGB}, 0.08);\n box-shadow: 0 2px 8px rgba(${BRAND_RGB}, 0.15);\n }\n :host([data-variant=\"outline\"][data-theme=\"branded\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.14);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"outline\"][data-theme=\"branded-alt\"]) .hb-btn {\n background: transparent;\n border-color: ${ALT_BRAND_COLOR};\n color: ${ALT_BRAND_COLOR};\n }\n :host([data-variant=\"outline\"][data-theme=\"branded-alt\"]) .hb-btn:hover {\n background: rgba(${ALT_BRAND_RGB}, 0.08);\n box-shadow: 0 2px 8px rgba(${ALT_BRAND_RGB}, 0.15);\n }\n :host([data-variant=\"outline\"][data-theme=\"branded-alt\"]) .hb-btn:active {\n background: rgba(${ALT_BRAND_RGB}, 0.14);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"outline\"][data-theme=\"dark\"]) .hb-btn {\n background: transparent;\n border-color: #475569;\n color: #F1F5F9;\n }\n :host([data-variant=\"outline\"][data-theme=\"dark\"]) .hb-btn:hover {\n border-color: ${BRAND_COLOR};\n background: rgba(${BRAND_RGB}, 0.08);\n }\n :host([data-variant=\"outline\"][data-theme=\"dark\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.14);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"outline\"][data-theme=\"light\"]) .hb-btn {\n background: transparent;\n border-color: #CBD5E1;\n color: #0F172A;\n }\n :host([data-variant=\"outline\"][data-theme=\"light\"]) .hb-btn:hover {\n border-color: ${BRAND_COLOR};\n background: rgba(${BRAND_RGB}, 0.05);\n }\n :host([data-variant=\"outline\"][data-theme=\"light\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.1);\n transform: scale(0.98);\n }\n\n /* ─── GHOST ─── */\n\n :host([data-variant=\"ghost\"]) .hb-btn {\n background: transparent;\n border-color: transparent;\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"branded\"]) .hb-btn {\n color: ${BRAND_COLOR};\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded\"]) .hb-btn:hover {\n background: rgba(${BRAND_RGB}, 0.1);\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded\"]) .hb-btn:active {\n background: rgba(${BRAND_RGB}, 0.16);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"branded-alt\"]) .hb-btn {\n color: ${ALT_BRAND_COLOR};\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded-alt\"]) .hb-btn:hover {\n background: rgba(${ALT_BRAND_RGB}, 0.1);\n }\n :host([data-variant=\"ghost\"][data-theme=\"branded-alt\"]) .hb-btn:active {\n background: rgba(${ALT_BRAND_RGB}, 0.16);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"dark\"]) .hb-btn {\n color: #F1F5F9;\n }\n :host([data-variant=\"ghost\"][data-theme=\"dark\"]) .hb-btn:hover {\n background: rgba(255, 255, 255, 0.06);\n }\n :host([data-variant=\"ghost\"][data-theme=\"dark\"]) .hb-btn:active {\n background: rgba(255, 255, 255, 0.1);\n transform: scale(0.98);\n }\n\n :host([data-variant=\"ghost\"][data-theme=\"light\"]) .hb-btn {\n color: #0F172A;\n }\n :host([data-variant=\"ghost\"][data-theme=\"light\"]) .hb-btn:hover {\n background: rgba(0, 0, 0, 0.04);\n }\n :host([data-variant=\"ghost\"][data-theme=\"light\"]) .hb-btn:active {\n background: rgba(0, 0, 0, 0.08);\n transform: scale(0.98);\n }\n\n /* ─── FOCUS ─── */\n\n .hb-btn:focus-visible {\n outline: 2px solid var(--hb-focus-color, ${BRAND_COLOR});\n outline-offset: 2px;\n }\n\n /* ─── ICON ─── */\n\n .hb-btn-icon {\n width: var(--hb-icon-size);\n height: var(--hb-icon-size);\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .hb-btn-icon svg { width: 100%; height: 100%; }\n\n :host([data-variant=\"filled\"][data-theme=\"branded\"]) .hb-btn-icon,\n :host([data-variant=\"filled\"][data-theme=\"branded-alt\"]) .hb-btn-icon {\n color: #FFFFFF;\n --hb-icon-accent: rgba(255,255,255,0.2);\n }\n :host([data-variant=\"filled\"][data-theme=\"dark\"]) .hb-btn-icon {\n color: var(--hb-accent-color, ${BRAND_COLOR});\n }\n :host([data-variant=\"filled\"][data-theme=\"light\"]) .hb-btn-icon {\n color: var(--hb-accent-color, ${BRAND_COLOR});\n }\n\n :host([data-variant=\"outline\"]) .hb-btn-icon,\n :host([data-variant=\"ghost\"]) .hb-btn-icon {\n color: var(--hb-accent-color, ${BRAND_COLOR});\n }\n\n /* ─── LABEL ─── */\n\n .hb-btn-label {\n letter-spacing: -0.01em;\n }\n`;\n\nexport class HermesSkillButton extends HTMLElement {\n static observedAttributes = ['command', 'theme', 'size', 'variant', 'shape', 'popup', 'popup-title', 'popup-description'];\n\n private _options: HermesSkillButtonOptions = {\n command: '',\n theme: 'branded',\n size: 'md',\n variant: 'filled',\n popup: true,\n };\n\n private _mqCleanup: (() => void) | null = null;\n private _rendered = false;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n this.syncFromAttributes();\n this.render();\n this.updateLightDOM();\n }\n\n disconnectedCallback() {\n this._mqCleanup?.();\n this._mqCleanup = null;\n }\n\n attributeChangedCallback() {\n if (!this._rendered) return;\n this.syncFromAttributes();\n this.render();\n this.updateLightDOM();\n }\n\n set options(opts: Partial<HermesSkillButtonOptions>) {\n this._options = { ...this._options, ...opts };\n this.render();\n this.updateLightDOM();\n }\n\n get options() {\n return this._options;\n }\n\n private syncFromAttributes() {\n const command = this.getAttribute('command');\n const theme = this.getAttribute('theme') as Theme | null;\n const size = this.getAttribute('size') as Size | null;\n const variant = this.getAttribute('variant') as Variant | null;\n const shape = this.getAttribute('shape') as Shape | null;\n const popup = this.getAttribute('popup');\n const popupTitle = this.getAttribute('popup-title');\n const popupDescription = this.getAttribute('popup-description');\n\n if (command !== null) this._options.command = command;\n if (theme) this._options.theme = theme;\n if (size) this._options.size = size;\n if (variant) this._options.variant = variant;\n if (shape) this._options.shape = shape;\n if (popup !== null) this._options.popup = popup !== 'false';\n if (popupTitle !== null) this._options.popupTitle = popupTitle;\n if (popupDescription !== null) this._options.popupDescription = popupDescription;\n }\n\n private updateLightDOM() {\n const { command } = this._options;\n\n this.setAttribute('role', 'button');\n this.setAttribute('tabindex', '0');\n this.setAttribute('aria-label', `Run on Hermes Skills: ${command}`);\n if (this._options.popup !== false) {\n this.setAttribute('aria-haspopup', 'dialog');\n } else {\n this.removeAttribute('aria-haspopup');\n }\n\n let link = this.querySelector('a[data-hb-crawl]') as HTMLAnchorElement | null;\n if (!link) {\n link = document.createElement('a');\n link.setAttribute('data-hb-crawl', '');\n link.setAttribute('aria-hidden', 'true');\n link.style.cssText = 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;';\n this.appendChild(link);\n }\n link.textContent = `Run on Hermes Skills: ${command}`;\n link.setAttribute('data-platform', 'hermes-skill');\n link.setAttribute('data-command', command);\n link.href = `https://hermes.ai/skills?command=${encodeURIComponent(command)}`;\n }\n\n private getResolvedTheme(): Theme {\n return this._options.theme || 'branded';\n }\n\n private render() {\n if (!this.shadowRoot) return;\n\n const theme = this.getResolvedTheme();\n const resolvedTheme = theme === 'system' ? (\n typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n ) : theme;\n const variant = this._options.variant || 'filled';\n\n const tokens = resolveTheme(theme);\n const size = this._options.size || 'md';\n const shape = this._options.shape || 'rounded';\n const sizeTokens = SIZE_MAP[size];\n const radius = SHAPE_MAP[shape][size];\n\n this.setAttribute('data-theme', resolvedTheme);\n this.setAttribute('data-variant', variant);\n\n const bgOverride = variant !== 'filled' ? 'transparent' : tokens.bg;\n const borderOverride = variant === 'ghost' ? 'transparent' :\n variant === 'outline' ? tokens.primary : tokens.border;\n const textOverride = variant !== 'filled' ? tokens.primary : tokens.text;\n\n this.shadowRoot.innerHTML = `\n <style>${BUTTON_STYLES}</style>\n <button\n class=\"hb-btn\"\n type=\"button\"\n style=\"\n ${themeToCSS(tokens)}\n --hb-bg: ${bgOverride};\n --hb-border: ${borderOverride};\n --hb-text: ${textOverride};\n --hb-accent-color: ${tokens.primary};\n --hb-focus-color: ${tokens.primary};\n --hb-height: ${sizeTokens.height};\n --hb-font-size: ${sizeTokens.fontSize};\n --hb-icon-size: ${sizeTokens.iconSize};\n --hb-padding: ${sizeTokens.padding};\n --hb-gap: ${sizeTokens.gap};\n --hb-radius: ${radius};\n \"\n aria-label=\"Run on Hermes Skills: ${this._options.command.replace(/\"/g, '&quot;')}\"\n >\n <span class=\"hb-btn-icon\" aria-hidden=\"true\">${HERMES_SKILL_ICON}</span>\n <span class=\"hb-btn-label\">Run on Hermes Skills</span>\n </button>\n `;\n\n const btn = this.shadowRoot.querySelector('.hb-btn')!;\n btn.addEventListener('click', () => this.handleClick());\n btn.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Enter' || (e as KeyboardEvent).key === ' ') {\n e.preventDefault();\n this.handleClick();\n }\n });\n this._rendered = true;\n this.setupSystemThemeWatch();\n }\n\n private handleClick() {\n const { popup, command, popupTitle, popupDescription } = this._options;\n\n this.dispatchEvent(new CustomEvent('hb-open', {\n bubbles: true,\n composed: true,\n detail: { command },\n }));\n\n if (popup === false) {\n navigator.clipboard.writeText(command).then(() => {\n this._options.onCopy?.(command);\n recordAgentPreference('hermes-skill');\n this.dispatchEvent(new CustomEvent('hb-copy', {\n bubbles: true,\n composed: true,\n detail: { command },\n }));\n });\n return;\n }\n\n showPopup({\n variant: 'hermes-skill',\n theme: this.getResolvedTheme(),\n title: popupTitle || 'Run on Hermes Skills',\n description: popupDescription || 'Copy and paste into a Hermes session to get started.',\n command,\n onCopy: (cmd) => {\n this._options.onCopy?.(cmd);\n recordAgentPreference('hermes-skill');\n this.dispatchEvent(new CustomEvent('hb-copy', {\n bubbles: true,\n composed: true,\n detail: { command: cmd },\n }));\n },\n onClose: () => {\n this.dispatchEvent(new CustomEvent('hb-close', {\n bubbles: true,\n composed: true,\n }));\n },\n });\n }\n\n private setupSystemThemeWatch() {\n this._mqCleanup?.();\n this._mqCleanup = null;\n\n if (this.getResolvedTheme() !== 'system' || typeof window === 'undefined') return;\n\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = () => this.render();\n mq.addEventListener('change', handler);\n this._mqCleanup = () => mq.removeEventListener('change', handler);\n }\n}\n\nexport function registerHermesSkillButton(tagName = 'hermes-skill-button') {\n if (typeof customElements === 'undefined') return;\n if (!customElements.get(tagName)) {\n customElements.define(tagName, HermesSkillButton);\n }\n}\n\nregisterHermesSkillButton();\n\nexport function createHermesSkillButton(options: HermesSkillButtonOptions): HermesSkillButton {\n const el = document.createElement('hermes-skill-button') as HermesSkillButton;\n el.options = options;\n return el;\n}\n","/**\n * Generates JSON-LD structured data for all hermesbuttons on the page.\n *\n * Crawlers and AI agents can use this to discover skills and commands\n * without executing JavaScript — call this after buttons are rendered\n * and inject the result into a <script type=\"application/ld+json\"> tag.\n */\nexport interface ButtonMetadata {\n platform: 'hermes' | 'hermes-skill';\n command: string;\n fullCommand?: string;\n}\n\nexport function discoverButtons(): ButtonMetadata[] {\n if (typeof document === 'undefined') return [];\n\n const results: ButtonMetadata[] = [];\n\n document.querySelectorAll('hermes-button').forEach((el) => {\n const command = el.getAttribute('command') || '';\n const promptFlag = el.getAttribute('prompt-flag');\n const usePrompt = promptFlag !== 'false';\n const fullCommand = usePrompt ? `hermes -p \"${command}\"` : command;\n\n results.push({\n platform: 'hermes',\n command,\n fullCommand,\n });\n });\n\n document.querySelectorAll('hermes-skill-button').forEach((el) => {\n const command = el.getAttribute('command') || '';\n\n results.push({\n platform: 'hermes-skill',\n command,\n });\n });\n\n return results;\n}\n\nexport function generateStructuredData(): object {\n const buttons = discoverButtons();\n if (buttons.length === 0) return {};\n\n const actions = buttons.map((btn) => {\n if (btn.platform === 'hermes') {\n return {\n '@type': 'Action',\n name: `Run on Hermes: ${btn.command}`,\n description: btn.command,\n target: {\n '@type': 'EntryPoint',\n urlTemplate: `https://hermes.ai/run?command=${encodeURIComponent(btn.fullCommand || btn.command)}`,\n actionPlatform: 'https://hermes.ai/run',\n },\n object: {\n '@type': 'SoftwareSourceCode',\n runtimePlatform: 'Hermes Agent',\n text: btn.fullCommand || btn.command,\n },\n };\n }\n\n const entry: Record<string, unknown> = {\n '@type': 'EntryPoint',\n actionPlatform: 'https://hermes.ai/skills',\n urlTemplate: `https://hermes.ai/skills?command=${encodeURIComponent(btn.command)}`,\n };\n\n return {\n '@type': 'Action',\n name: `Run on Hermes Skills: ${btn.command}`,\n description: btn.command,\n target: entry,\n };\n });\n\n return {\n '@context': 'https://schema.org',\n '@type': 'WebPage',\n potentialAction: actions,\n };\n}\n\n/**\n * Injects a <script type=\"application/ld+json\"> tag into the document head\n * with structured data for all hermesbuttons on the page.\n *\n * Call after all buttons have been rendered to the DOM.\n */\nexport function injectStructuredData(): void {\n if (typeof document === 'undefined') return;\n\n const existing = document.querySelector('script[data-hermesbuttons-jsonld]');\n if (existing) existing.remove();\n\n const data = generateStructuredData();\n if (!data || !('potentialAction' in data)) return;\n\n const script = document.createElement('script');\n script.type = 'application/ld+json';\n script.setAttribute('data-hermesbuttons-jsonld', '');\n script.textContent = JSON.stringify(data, null, 2);\n document.head.appendChild(script);\n}\n","const PING_URL = 'https://hermesbuttons.vercel.app/api/ping';\nconst PKG = 'hermesbuttons';\n\nlet sent = false;\n\nexport function reportOrigin(): void {\n if (sent) return;\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return;\n\n const origin = window.location?.origin;\n if (!origin || origin === 'null' || origin.startsWith('file:')) return;\n\n sent = true;\n\n try {\n const payload = JSON.stringify({ origin, pkg: PKG });\n const blob = new Blob([payload], { type: 'text/plain' });\n\n if (typeof navigator.sendBeacon === 'function') {\n navigator.sendBeacon(PING_URL, blob);\n } else {\n fetch(PING_URL, { method: 'POST', body: payload, keepalive: true })\n .catch(() => {});\n }\n } catch {}\n}\n\nif (typeof window !== 'undefined') {\n try { reportOrigin(); } catch {}\n}\n"],"mappings":"ocAAA,IAAAA,GAAA,GAAAC,EAAAD,GAAA,qBAAAE,EAAA,gBAAAC,EAAA,gBAAAC,EAAA,sBAAAC,EAAA,iBAAAC,EAAA,sBAAAC,EAAA,sBAAAC,EAAA,uBAAAC,EAAA,4BAAAC,EAAA,oBAAAC,EAAA,2BAAAC,EAAA,yBAAAC,EAAA,aAAAC,GAAA,yBAAAC,EAAA,8BAAAC,EAAA,iBAAAC,EAAA,cAAAC,EAAA,WAAAC,ICIO,IAAMC,EAAgC,mBAS7C,SAASC,GAAqB,CAC5B,OAAO,OAAO,SAAa,GAC7B,CAEO,SAASC,IAAuD,CACrE,GAAI,CAACD,EAAU,EAAG,OAAO,KACzB,IAAME,EAAQ,SAAS,OACpB,MAAM,GAAG,EACT,IAAKC,GAAMA,EAAE,KAAK,CAAC,EACnB,KAAMA,GAAMA,EAAE,WAAW,GAAGC,CAA6B,GAAG,CAAC,EAChE,GAAI,CAACF,EAAO,OAAO,KACnB,IAAMG,EAAQH,EAAM,MAAME,EAA8B,OAAS,CAAC,EAClE,GAAI,CAACC,EAAO,OAAO,KACnB,GAAI,CACF,IAAMC,EAAU,mBAAmBD,CAAK,EAClCE,EAAO,KAAK,MAAMD,CAAO,EAC/B,MAAI,CAACC,GAAQ,OAAOA,GAAS,UAAY,CAAC,MAAM,QAASA,EAAiC,KAAK,EACtF,KAKF,CAAE,MAHMA,EAAiC,MAAM,OACnDC,GAAmB,OAAOA,GAAM,UAAYA,EAAE,OAAS,CAC1D,CACe,CACjB,MAAQ,CACN,OAAO,IACT,CACF,CAEO,SAASC,GAAsBC,EAAwC,CAC5E,GAAI,CAACV,EAAU,EAAG,OAClB,IAAMW,EAAQD,EAAQ,MAAM,MAAM,EAAG,EAA4B,EAC3DE,EAAO,KAAK,UAAU,CAAE,MAAAD,CAAM,CAAC,EAC/BE,EAAU,IAAI,KACpBA,EAAQ,YAAYA,EAAQ,YAAY,EAAI,CAAC,EAC7C,SAAS,OAAS,GAAGT,CAA6B,IAAI,mBAAmBQ,CAAI,CAAC,mCAAmCC,EAAQ,YAAY,CAAC,EACxI,CAGO,SAASC,EAAsBC,EAAuB,CAC3D,GAAI,CAACA,GAAW,OAAOA,GAAY,SAAU,OAE7C,IAAMC,EADOf,GAAqB,GACf,MAAM,OAAQgB,GAAOA,IAAOF,CAAO,GAAK,CAAC,EAC5DN,GAAsB,CAAE,MAAO,CAACM,EAAS,GAAGC,CAAI,CAAE,CAAC,CACrD,CCxDO,IAAME,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAgBdC,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAapBC,EAAY;AAAA;AAAA;AAAA,QAKZC,EAAa;AAAA;QASnB,IAAMC,EAAa;AAAA;QCxCnB,IAAMC,EAAc,UACdC,EAAoB,UACpBC,EAAqB,UAErBC,EAAY,eAGZC,EAAkB,UAClBC,EAAwB,UACxBC,EAAyB,UACzBC,EAAgB,gBAEhBC,EAAwD,CACnE,QAAS,CACP,GAAIR,EACJ,KAAM,UACN,OAAQ,cACR,QAAS,UACT,YAAa,UACb,MAAO,UACP,QAASA,EACT,YAAa,UACb,OAAQ,UACR,SAAU,SACZ,EACA,cAAe,CACb,GAAII,EACJ,KAAM,UACN,OAAQ,cACR,QAAS,UACT,YAAa,UACb,MAAO,UACP,QAASA,EACT,YAAa,UACb,OAAQ,UACR,SAAU,SACZ,EACA,KAAM,CACJ,GAAI,UACJ,KAAM,UACN,OAAQ,UACR,QAAS,UACT,YAAa,UACb,MAAO,UACP,QAASJ,EACT,YAAa,UACb,OAAQ,UACR,SAAU,SACZ,EACA,MAAO,CACL,GAAI,UACJ,KAAM,UACN,OAAQ,UACR,QAAS,UACT,YAAa,UACb,MAAO,UACP,QAASA,EACT,YAAa,UACb,OAAQ,UACR,SAAU,SACZ,CACF,EAEO,SAASS,EAAaC,EAA2B,CACtD,OAAIA,IAAU,SAAiBF,EAAOE,CAAK,EACvC,OAAO,OAAW,IAAoBF,EAAO,MAC1C,OAAO,WAAW,8BAA8B,EAAE,QACrDA,EAAO,KACPA,EAAO,KACb,CAEO,SAASG,EAAWC,EAA6B,CACtD,MAAO;AAAA,eACMA,EAAO,EAAE;AAAA,iBACPA,EAAO,IAAI;AAAA,mBACTA,EAAO,MAAM;AAAA,oBACZA,EAAO,OAAO;AAAA,yBACTA,EAAO,WAAW;AAAA,kBACzBA,EAAO,KAAK;AAAA,oBACVA,EAAO,OAAO;AAAA,yBACTA,EAAO,WAAW;AAAA,oBACvBA,EAAO,MAAM;AAAA,sBACXA,EAAO,QAAQ;AAAA,GAErC,CAEO,IAAMC,EAAY,CACvB,QAAS,CAAE,GAAI,WAAY,GAAI,SAAU,GAAI,UAAW,EACxD,KAAS,CAAE,GAAI,QAAY,GAAI,QAAU,GAAI,OAAQ,EACrD,OAAS,CAAE,GAAI,IAAY,GAAI,IAAU,GAAI,GAAI,CACnD,EAEaC,EAAW,CACtB,GAAI,CAAE,OAAQ,OAAQ,SAAU,UAAW,SAAU,WAAY,QAAS,YAAa,UAAW,WAAY,IAAK,WAAY,OAAQ,UAAW,EAClJ,GAAI,CAAE,OAAQ,SAAU,SAAU,WAAY,SAAU,WAAY,QAAS,SAAU,UAAW,YAAa,IAAK,SAAU,OAAQ,QAAS,EAC/I,GAAI,CAAE,OAAQ,OAAQ,SAAU,OAAQ,SAAU,WAAY,QAAS,YAAa,UAAW,SAAU,IAAK,WAAY,OAAQ,UAAW,CAC/I,EC/FA,IAAMC,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAmLgBC,CAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAiCfA,CAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmE3CC,EAAN,cAAgC,WAAY,CAIjD,aAAc,CACZ,MAAM,EAHR,KAAQ,WAAkC,KAIxC,KAAK,aAAa,CAAE,KAAM,MAAO,CAAC,CACpC,CAEA,IAAI,QAAQC,EAAoB,CAC9B,KAAK,SAAWA,EAChB,KAAK,OAAO,CACd,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,QACd,CAEA,sBAAuB,CACrB,KAAK,aAAa,EAClB,KAAK,WAAa,IACpB,CAEQ,oBAAkC,CACxC,GAAM,CAAE,MAAAC,CAAM,EAAI,KAAK,SAEvB,GAAIA,IAAU,QAAUA,IAAU,QAAS,OAAOC,EAAaD,CAAK,EAEpE,IAAME,EAAc,OAAO,OAAW,KACjC,OAAO,WAAW,8BAA8B,EAAE,QAEvD,GAAIF,IAAU,SACZ,OAAOE,EAAcD,EAAa,MAAM,EAAIA,EAAa,OAAO,EAGlE,IAAME,EAAOD,EAAcD,EAAa,MAAM,EAAIA,EAAa,OAAO,EAChEG,EAAQH,EAAaD,CAAK,EAChC,MAAO,CACL,GAAGG,EACH,QAASC,EAAM,QACf,YAAaA,EAAM,WACrB,CACF,CAEQ,QAAS,CACf,GAAI,CAAC,KAAK,YAAc,CAAC,KAAK,SAAU,OAExC,GAAM,CAAE,QAAAC,EAAS,MAAAC,EAAO,YAAAC,EAAa,QAAAC,EAAS,YAAAC,CAAY,EAAI,KAAK,SAC7DC,EAAS,KAAK,mBAAmB,EACjCC,EAAON,IAAY,SAAWO,EAAcC,EAE5CC,EAAmBT,IAAY,SAC/BU,EAAiBN,GAAeD,EAEtC,KAAK,WAAW,UAAY;AAAA,eACjBZ,EAAY;AAAA,oBACPoB,EAAWN,CAAM,CAAC;AAAA;AAAA;AAAA;AAAA,iDAIWC,CAAI;AAAA;AAAA,kEAEaL,CAAK;AAAA,gBACvDC,EAAc,sCAAsCA,CAAW,SAAW,EAAE;AAAA;AAAA,qFAEPU,CAAU;AAAA;AAAA;AAAA,cAGjFH,EAAmB,KAAK,yBAAyBC,CAAc,EAAI,KAAK,sBAAsBP,CAAO,CAAC;AAAA;AAAA;AAAA,cAGtGM,EAAmB;AAAA;AAAA,cAEjB;AAAA;AAAA,aAEH;AAAA;AAAA;AAAA;AAAA,MAMT,KAAK,eAAe,EACpB,KAAK,sBAAsB,CAC7B,CAEQ,yBAAyBN,EAAyB,CACxD,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6EAMkE,KAAK,WAAWA,CAAO,CAAC;AAAA,2EAC1B,KAAK,WAAWA,CAAO,CAAC,KAAKU,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAW/G,CAEQ,sBAAsBV,EAAyB,CACrD,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAM6B,KAAK,WAAWA,CAAO,CAAC;AAAA,2EACW,KAAK,WAAWA,CAAO,CAAC,KAAKU,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAW/G,CAEQ,gBAAiB,CAClB,KAAK,aAEV,KAAK,WAAW,iBAAiB,QAAUC,GAAM,CAC/C,IAAMC,EAAUD,EAAE,OAAuB,QAAQ,eAAe,EAChE,GAAI,CAACC,EAAQ,OAEb,IAAMC,EAASD,EAAO,QAAQ,OAE9B,GAAIC,IAAW,QACb,KAAK,MAAM,UACFA,IAAW,OAAQ,CAC5B,IAAMC,EAAMF,EAAO,QAAQ,SAAW,GACtC,KAAK,gBAAgBE,EAAKF,CAAM,CAClC,CACF,CAAC,EAED,KAAK,WAAW,iBAAiB,UAAYD,GAAM,CAC5CA,EAAoB,MAAQ,UAAU,KAAK,MAAM,CACxD,CAAC,EACH,CAEQ,uBAAwB,CAC9B,KAAK,aAAa,EAClB,KAAK,WAAa,KAElB,IAAMnB,EAAQ,KAAK,SAAS,MAE5B,GAAI,EADeA,IAAU,UAAYA,IAAU,WAAaA,IAAU,gBACvD,OAAO,OAAW,IAAa,OAElD,IAAMuB,EAAK,OAAO,WAAW,8BAA8B,EACrDC,EAAU,IAAM,KAAK,OAAO,EAClCD,EAAG,iBAAiB,SAAUC,CAAO,EACrC,KAAK,WAAa,IAAMD,EAAG,oBAAoB,SAAUC,CAAO,CAClE,CAEA,MAAc,gBAAgBhB,EAAiBiB,EAAqB,CAClE,GAAI,CACF,MAAM,UAAU,UAAU,UAAUjB,CAAO,EAC3C,IAAMkB,EAAQD,EAAO,cAAc,MAAM,EACnCE,EAAgBF,EAEtBA,EAAO,aAAa,cAAe,MAAM,EACrCC,IAAOA,EAAM,YAAc,WAC/BC,EAAc,UAAY,GAAGC,CAAU,uBAEvC,KAAK,SAAS,SAASpB,CAAO,EAE9B,WAAW,IAAM,CACfiB,EAAO,aAAa,cAAe,OAAO,EAC1CE,EAAc,UAAY,GAAGT,CAAS,mBACxC,EAAG,GAAI,CACT,MAAQ,CACN,IAAMW,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,MAAQrB,EACjBqB,EAAS,MAAM,SAAW,QAC1BA,EAAS,MAAM,QAAU,IACzB,SAAS,KAAK,YAAYA,CAAQ,EAClCA,EAAS,OAAO,EAChB,SAAS,YAAY,MAAM,EAC3B,SAAS,KAAK,YAAYA,CAAQ,EAElC,KAAK,SAAS,SAASrB,CAAO,CAChC,CACF,CAEA,OAAQ,CACN,IAAMsB,EAAS,KAAK,YAAY,cAAc,YAAY,EACpDC,EAAW,KAAK,YAAY,cAAc,cAAc,EAE1DD,IACFA,EAAO,MAAM,UAAY,qCAEvBC,IACFA,EAAS,MAAM,UAAY,oCAG7B,WAAW,IAAM,CACf,KAAK,SAAS,UAAU,EACxB,KAAK,OAAO,CACd,EAAG,GAAG,CACR,CAEQ,WAAWC,EAAqB,CACtC,IAAMC,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,YAAcD,EACXC,EAAI,SACb,CAEQ,WAAWD,EAAqB,CACtC,OAAOA,EAAI,QAAQ,KAAM,QAAQ,EAAE,QAAQ,KAAM,OAAO,EAAE,QAAQ,KAAM,MAAM,EAAE,QAAQ,KAAM,MAAM,CACtG,CACF,EAEI,OAAO,eAAmB,KAAe,CAAC,eAAe,IAAI,qBAAqB,GACpF,eAAe,OAAO,sBAAuBlC,CAAiB,EAGzD,SAASoC,EAAUC,EAA0C,CAClE,IAAMC,EAAQ,SAAS,cAAc,qBAAqB,EAC1D,OAAAA,EAAM,QAAUD,EAChB,SAAS,KAAK,YAAYC,CAAK,EACxBA,CACT,CC9eA,IAAMC,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBA6CJC,CAAiB;AAAA,iCACFC,CAAS;AAAA;AAAA;AAAA,kBAGxBC,CAAkB;AAAA;AAAA;AAAA;AAAA,kBAIlBC,CAAqB;AAAA,iCACNC,CAAa;AAAA;AAAA;AAAA,kBAG5BC,CAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAiCpBC,CAAW;AAAA,aAClBA,CAAW;AAAA;AAAA;AAAA,uBAGDL,CAAS;AAAA,iCACCA,CAAS;AAAA;AAAA;AAAA,uBAGnBA,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMZM,CAAe;AAAA,aACtBA,CAAe;AAAA;AAAA;AAAA,uBAGLH,CAAa;AAAA,iCACHA,CAAa;AAAA;AAAA;AAAA,uBAGvBA,CAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAUhBE,CAAW;AAAA,uBACRL,CAAS;AAAA;AAAA;AAAA,uBAGTA,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAUZK,CAAW;AAAA,uBACRL,CAAS;AAAA;AAAA;AAAA,uBAGTA,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAYnBK,CAAW;AAAA;AAAA;AAAA,uBAGDL,CAAS;AAAA;AAAA;AAAA,uBAGTA,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA,aAKnBM,CAAe;AAAA;AAAA;AAAA,uBAGLH,CAAa;AAAA;AAAA;AAAA,uBAGbA,CAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+CA6BWE,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAuBtBA,CAAW;AAAA;AAAA;AAAA,oCAGXA,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA,oCAKXA,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUlCE,EAAN,cAA2B,WAAY,CAe5C,aAAc,CACZ,MAAM,EAbR,KAAQ,SAAgC,CACtC,QAAS,GACT,MAAO,UACP,KAAM,KACN,QAAS,SACT,MAAO,GACP,WAAY,EACd,EAEA,KAAQ,WAAkC,KAC1C,KAAQ,UAAY,GAIlB,KAAK,aAAa,CAAE,KAAM,MAAO,CAAC,CACpC,CAEA,mBAAoB,CAClB,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,eAAe,CACtB,CAEA,sBAAuB,CACrB,KAAK,aAAa,EAClB,KAAK,WAAa,IACpB,CAEA,0BAA2B,CACpB,KAAK,YACV,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,eAAe,EACtB,CAEA,IAAI,QAAQC,EAAoC,CAC9C,KAAK,SAAW,CAAE,GAAG,KAAK,SAAU,GAAGA,CAAK,EAC5C,KAAK,OAAO,EACZ,KAAK,eAAe,CACtB,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,QACd,CAEQ,oBAAqB,CAC3B,IAAMC,EAAU,KAAK,aAAa,SAAS,EACrCC,EAAQ,KAAK,aAAa,OAAO,EACjCC,EAAO,KAAK,aAAa,MAAM,EAC/BC,EAAU,KAAK,aAAa,SAAS,EACrCC,EAAQ,KAAK,aAAa,OAAO,EACjCC,EAAQ,KAAK,aAAa,OAAO,EACjCC,EAAa,KAAK,aAAa,aAAa,EAC5CC,EAAa,KAAK,aAAa,aAAa,EAC5CC,EAAmB,KAAK,aAAa,mBAAmB,EAE1DR,IAAY,OAAM,KAAK,SAAS,QAAUA,GAC1CC,IAAO,KAAK,SAAS,MAAQA,GAC7BC,IAAM,KAAK,SAAS,KAAOA,GAC3BC,IAAS,KAAK,SAAS,QAAUA,GACjCC,IAAO,KAAK,SAAS,MAAQA,GAC7BC,IAAU,OAAM,KAAK,SAAS,MAAQA,IAAU,SAChDC,IAAe,OAAM,KAAK,SAAS,WAAaA,IAAe,SAC/DC,IAAe,OAAM,KAAK,SAAS,WAAaA,GAChDC,IAAqB,OAAM,KAAK,SAAS,iBAAmBA,EAClE,CAEQ,gBAAiB,CACvB,GAAM,CAAE,QAAAR,CAAQ,EAAI,KAAK,SACnBS,EAAc,KAAK,eAAe,EAExC,KAAK,aAAa,OAAQ,QAAQ,EAClC,KAAK,aAAa,WAAY,GAAG,EACjC,KAAK,aAAa,aAAc,kBAAkBT,CAAO,EAAE,EACvD,KAAK,SAAS,QAAU,GAC1B,KAAK,aAAa,gBAAiB,QAAQ,EAE3C,KAAK,gBAAgB,eAAe,EAGtC,IAAIU,EAAO,KAAK,cAAc,kBAAkB,EAC3CA,IACHA,EAAO,SAAS,cAAc,GAAG,EACjCA,EAAK,aAAa,gBAAiB,EAAE,EACrCA,EAAK,aAAa,cAAe,MAAM,EACvCA,EAAK,MAAM,QAAU,gGACrB,KAAK,YAAYA,CAAI,GAEvBA,EAAK,KAAO,iCAAiC,mBAAmBD,CAAW,CAAC,GAC5EC,EAAK,YAAc,kBAAkBV,CAAO,GAC5CU,EAAK,aAAa,gBAAiB,QAAQ,EAC3CA,EAAK,aAAa,eAAgBV,CAAO,EACzCU,EAAK,aAAa,oBAAqBD,CAAW,CACpD,CAEQ,kBAA0B,CAChC,OAAO,KAAK,SAAS,OAAS,SAChC,CAEQ,gBAAyB,CAC/B,GAAM,CAAE,QAAAT,EAAS,WAAAM,CAAW,EAAI,KAAK,SACrC,OAAIA,IAAe,GAAcN,EAC1B,cAAcA,CAAO,GAC9B,CAEQ,QAAS,CACf,GAAI,CAAC,KAAK,WAAY,OAEtB,IAAMC,EAAQ,KAAK,iBAAiB,EAC9BU,EAAgBV,IAAU,SAC9B,OAAO,OAAW,KAAe,OAAO,WAAW,8BAA8B,EAAE,QAAU,OAAS,QACpGA,EACEE,EAAU,KAAK,SAAS,SAAW,SAEnCS,EAASC,EAAaZ,CAAK,EAC3BC,EAAO,KAAK,SAAS,MAAQ,KAC7BE,EAAQ,KAAK,SAAS,OAAS,UAC/BU,EAAaC,EAASb,CAAI,EAC1Bc,EAASC,EAAUb,CAAK,EAAEF,CAAI,EAEpC,KAAK,aAAa,aAAcS,CAAa,EAC7C,KAAK,aAAa,eAAgBR,CAAO,EAEzC,IAAMe,EAAaf,IAAY,SAAW,cAAgBS,EAAO,GAC3DO,EAAiBhB,IAAY,QAAU,cAC3CA,IAAY,UAAYS,EAAO,QAAUA,EAAO,OAC5CQ,EAAejB,IAAY,SAAWS,EAAO,QAAUA,EAAO,KAEpE,KAAK,WAAW,UAAY;AAAA,eACjBvB,EAAa;AAAA;AAAA;AAAA;AAAA;AAAA,YAKhBgC,EAAWT,CAAM,CAAC;AAAA,qBACTM,CAAU;AAAA,yBACNC,CAAc;AAAA,uBAChBC,CAAY;AAAA,+BACJR,EAAO,OAAO;AAAA,8BACfA,EAAO,OAAO;AAAA,yBACnBE,EAAW,MAAM;AAAA,4BACdA,EAAW,QAAQ;AAAA,4BACnBA,EAAW,QAAQ;AAAA,0BACrBA,EAAW,SAAS;AAAA,sBACxBA,EAAW,GAAG;AAAA,yBACXE,CAAM;AAAA;AAAA,qCAEM,KAAK,SAAS,QAAQ,QAAQ,KAAM,QAAQ,CAAC;AAAA;AAAA,uDAE3BM,CAAW;AAAA;AAAA;AAAA,MAK9D,IAAMC,EAAM,KAAK,WAAW,cAAc,SAAS,EACnDA,EAAI,iBAAiB,QAAS,IAAM,KAAK,YAAY,CAAC,EACtDA,EAAI,iBAAiB,UAAYC,GAAM,EAChCA,EAAoB,MAAQ,SAAYA,EAAoB,MAAQ,OACvEA,EAAE,eAAe,EACjB,KAAK,YAAY,EAErB,CAAC,EACD,KAAK,UAAY,GACjB,KAAK,sBAAsB,CAC7B,CAEQ,aAAc,CACpB,GAAM,CAAE,MAAAnB,EAAO,QAAAL,EAAS,WAAAO,EAAY,iBAAAC,CAAiB,EAAI,KAAK,SACxDC,EAAc,KAAK,eAAe,EAQxC,GANA,KAAK,cAAc,IAAI,YAAY,UAAW,CAC5C,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,QAAAT,EAAS,YAAAS,CAAY,CACjC,CAAC,CAAC,EAEEJ,IAAU,GAAO,CACnB,UAAU,UAAU,UAAUI,CAAW,EAAE,KAAK,IAAM,CACpD,KAAK,SAAS,SAASA,CAAW,EAClCgB,EAAsB,QAAQ,EAC9B,KAAK,cAAc,IAAI,YAAY,UAAW,CAC5C,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,QAAShB,CAAY,CACjC,CAAC,CAAC,CACJ,CAAC,EACD,MACF,CAEAiB,EAAU,CACR,QAAS,SACT,MAAO,KAAK,iBAAiB,EAC7B,MAAOnB,GAAc,gBACrB,YAAaC,GAAoB,0EACjC,QAAAR,EACA,YAAAS,EACA,OAASkB,GAAgB,CACvB,KAAK,SAAS,SAASA,CAAG,EAC1BF,EAAsB,QAAQ,EAC9B,KAAK,cAAc,IAAI,YAAY,UAAW,CAC5C,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,QAASE,CAAI,CACzB,CAAC,CAAC,CACJ,EACA,QAAS,IAAM,CACb,KAAK,cAAc,IAAI,YAAY,WAAY,CAC7C,QAAS,GACT,SAAU,EACZ,CAAC,CAAC,CACJ,CACF,CAAC,CACH,CAEQ,uBAAwB,CAI9B,GAHA,KAAK,aAAa,EAClB,KAAK,WAAa,KAEd,KAAK,iBAAiB,IAAM,UAAY,OAAO,OAAW,IAAa,OAE3E,IAAMC,EAAK,OAAO,WAAW,8BAA8B,EACrDC,EAAU,IAAM,KAAK,OAAO,EAClCD,EAAG,iBAAiB,SAAUC,CAAO,EACrC,KAAK,WAAa,IAAMD,EAAG,oBAAoB,SAAUC,CAAO,CAClE,CACF,EApOa/B,EACJ,mBAAqB,CAAC,UAAW,QAAS,OAAQ,UAAW,QAAS,QAAS,cAAe,cAAe,mBAAmB,EAqOlI,SAASgC,EAAqBC,EAAU,gBAAiB,CAC1D,OAAO,eAAmB,KACzB,eAAe,IAAIA,CAAO,GAC7B,eAAe,OAAOA,EAASjC,CAAY,CAE/C,CAEAgC,EAAqB,EAEd,SAASE,EAAmBC,EAA4C,CAC7E,IAAMC,EAAK,SAAS,cAAc,eAAe,EACjD,OAAAA,EAAG,QAAUD,EACNC,CACT,CCleA,IAAMC,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBA6CJC,CAAiB;AAAA,iCACFC,CAAS;AAAA;AAAA;AAAA,kBAGxBC,CAAkB;AAAA;AAAA;AAAA;AAAA,kBAIlBC,CAAqB;AAAA,iCACNC,CAAa;AAAA;AAAA;AAAA,kBAG5BC,CAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAiCpBC,CAAW;AAAA,aAClBA,CAAW;AAAA;AAAA;AAAA,uBAGDL,CAAS;AAAA,iCACCA,CAAS;AAAA;AAAA;AAAA,uBAGnBA,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMZM,CAAe;AAAA,aACtBA,CAAe;AAAA;AAAA;AAAA,uBAGLH,CAAa;AAAA,iCACHA,CAAa;AAAA;AAAA;AAAA,uBAGvBA,CAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAUhBE,CAAW;AAAA,uBACRL,CAAS;AAAA;AAAA;AAAA,uBAGTA,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAUZK,CAAW;AAAA,uBACRL,CAAS;AAAA;AAAA;AAAA,uBAGTA,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAYnBK,CAAW;AAAA;AAAA;AAAA,uBAGDL,CAAS;AAAA;AAAA;AAAA,uBAGTA,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA,aAKnBM,CAAe;AAAA;AAAA;AAAA,uBAGLH,CAAa;AAAA;AAAA;AAAA,uBAGbA,CAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+CA6BWE,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAuBtBA,CAAW;AAAA;AAAA;AAAA,oCAGXA,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA,oCAKXA,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUlCE,EAAN,cAAgC,WAAY,CAcjD,aAAc,CACZ,MAAM,EAZR,KAAQ,SAAqC,CAC3C,QAAS,GACT,MAAO,UACP,KAAM,KACN,QAAS,SACT,MAAO,EACT,EAEA,KAAQ,WAAkC,KAC1C,KAAQ,UAAY,GAIlB,KAAK,aAAa,CAAE,KAAM,MAAO,CAAC,CACpC,CAEA,mBAAoB,CAClB,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,eAAe,CACtB,CAEA,sBAAuB,CACrB,KAAK,aAAa,EAClB,KAAK,WAAa,IACpB,CAEA,0BAA2B,CACpB,KAAK,YACV,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,eAAe,EACtB,CAEA,IAAI,QAAQC,EAAyC,CACnD,KAAK,SAAW,CAAE,GAAG,KAAK,SAAU,GAAGA,CAAK,EAC5C,KAAK,OAAO,EACZ,KAAK,eAAe,CACtB,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,QACd,CAEQ,oBAAqB,CAC3B,IAAMC,EAAU,KAAK,aAAa,SAAS,EACrCC,EAAQ,KAAK,aAAa,OAAO,EACjCC,EAAO,KAAK,aAAa,MAAM,EAC/BC,EAAU,KAAK,aAAa,SAAS,EACrCC,EAAQ,KAAK,aAAa,OAAO,EACjCC,EAAQ,KAAK,aAAa,OAAO,EACjCC,EAAa,KAAK,aAAa,aAAa,EAC5CC,EAAmB,KAAK,aAAa,mBAAmB,EAE1DP,IAAY,OAAM,KAAK,SAAS,QAAUA,GAC1CC,IAAO,KAAK,SAAS,MAAQA,GAC7BC,IAAM,KAAK,SAAS,KAAOA,GAC3BC,IAAS,KAAK,SAAS,QAAUA,GACjCC,IAAO,KAAK,SAAS,MAAQA,GAC7BC,IAAU,OAAM,KAAK,SAAS,MAAQA,IAAU,SAChDC,IAAe,OAAM,KAAK,SAAS,WAAaA,GAChDC,IAAqB,OAAM,KAAK,SAAS,iBAAmBA,EAClE,CAEQ,gBAAiB,CACvB,GAAM,CAAE,QAAAP,CAAQ,EAAI,KAAK,SAEzB,KAAK,aAAa,OAAQ,QAAQ,EAClC,KAAK,aAAa,WAAY,GAAG,EACjC,KAAK,aAAa,aAAc,yBAAyBA,CAAO,EAAE,EAC9D,KAAK,SAAS,QAAU,GAC1B,KAAK,aAAa,gBAAiB,QAAQ,EAE3C,KAAK,gBAAgB,eAAe,EAGtC,IAAIQ,EAAO,KAAK,cAAc,kBAAkB,EAC3CA,IACHA,EAAO,SAAS,cAAc,GAAG,EACjCA,EAAK,aAAa,gBAAiB,EAAE,EACrCA,EAAK,aAAa,cAAe,MAAM,EACvCA,EAAK,MAAM,QAAU,gGACrB,KAAK,YAAYA,CAAI,GAEvBA,EAAK,YAAc,yBAAyBR,CAAO,GACnDQ,EAAK,aAAa,gBAAiB,cAAc,EACjDA,EAAK,aAAa,eAAgBR,CAAO,EACzCQ,EAAK,KAAO,oCAAoC,mBAAmBR,CAAO,CAAC,EAC7E,CAEQ,kBAA0B,CAChC,OAAO,KAAK,SAAS,OAAS,SAChC,CAEQ,QAAS,CACf,GAAI,CAAC,KAAK,WAAY,OAEtB,IAAMC,EAAQ,KAAK,iBAAiB,EAC9BQ,EAAgBR,IAAU,SAC9B,OAAO,OAAW,KAAe,OAAO,WAAW,8BAA8B,EAAE,QAAU,OAAS,QACpGA,EACEE,EAAU,KAAK,SAAS,SAAW,SAEnCO,EAASC,EAAaV,CAAK,EAC3BC,EAAO,KAAK,SAAS,MAAQ,KAC7BE,EAAQ,KAAK,SAAS,OAAS,UAC/BQ,EAAaC,EAASX,CAAI,EAC1BY,EAASC,EAAUX,CAAK,EAAEF,CAAI,EAEpC,KAAK,aAAa,aAAcO,CAAa,EAC7C,KAAK,aAAa,eAAgBN,CAAO,EAEzC,IAAMa,EAAab,IAAY,SAAW,cAAgBO,EAAO,GAC3DO,EAAiBd,IAAY,QAAU,cAC3CA,IAAY,UAAYO,EAAO,QAAUA,EAAO,OAC5CQ,EAAef,IAAY,SAAWO,EAAO,QAAUA,EAAO,KAEpE,KAAK,WAAW,UAAY;AAAA,eACjBrB,EAAa;AAAA;AAAA;AAAA;AAAA;AAAA,YAKhB8B,EAAWT,CAAM,CAAC;AAAA,qBACTM,CAAU;AAAA,yBACNC,CAAc;AAAA,uBAChBC,CAAY;AAAA,+BACJR,EAAO,OAAO;AAAA,8BACfA,EAAO,OAAO;AAAA,yBACnBE,EAAW,MAAM;AAAA,4BACdA,EAAW,QAAQ;AAAA,4BACnBA,EAAW,QAAQ;AAAA,0BACrBA,EAAW,OAAO;AAAA,sBACtBA,EAAW,GAAG;AAAA,yBACXE,CAAM;AAAA;AAAA,4CAEa,KAAK,SAAS,QAAQ,QAAQ,KAAM,QAAQ,CAAC;AAAA;AAAA,uDAElCM,CAAiB;AAAA;AAAA;AAAA,MAKpE,IAAMC,EAAM,KAAK,WAAW,cAAc,SAAS,EACnDA,EAAI,iBAAiB,QAAS,IAAM,KAAK,YAAY,CAAC,EACtDA,EAAI,iBAAiB,UAAYC,GAAM,EAChCA,EAAoB,MAAQ,SAAYA,EAAoB,MAAQ,OACvEA,EAAE,eAAe,EACjB,KAAK,YAAY,EAErB,CAAC,EACD,KAAK,UAAY,GACjB,KAAK,sBAAsB,CAC7B,CAEQ,aAAc,CACpB,GAAM,CAAE,MAAAjB,EAAO,QAAAL,EAAS,WAAAM,EAAY,iBAAAC,CAAiB,EAAI,KAAK,SAQ9D,GANA,KAAK,cAAc,IAAI,YAAY,UAAW,CAC5C,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,QAAAP,CAAQ,CACpB,CAAC,CAAC,EAEEK,IAAU,GAAO,CACnB,UAAU,UAAU,UAAUL,CAAO,EAAE,KAAK,IAAM,CAChD,KAAK,SAAS,SAASA,CAAO,EAC9BuB,EAAsB,cAAc,EACpC,KAAK,cAAc,IAAI,YAAY,UAAW,CAC5C,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,QAAAvB,CAAQ,CACpB,CAAC,CAAC,CACJ,CAAC,EACD,MACF,CAEAwB,EAAU,CACR,QAAS,eACT,MAAO,KAAK,iBAAiB,EAC7B,MAAOlB,GAAc,uBACrB,YAAaC,GAAoB,uDACjC,QAAAP,EACA,OAASyB,GAAQ,CACf,KAAK,SAAS,SAASA,CAAG,EAC1BF,EAAsB,cAAc,EACpC,KAAK,cAAc,IAAI,YAAY,UAAW,CAC5C,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,QAASE,CAAI,CACzB,CAAC,CAAC,CACJ,EACA,QAAS,IAAM,CACb,KAAK,cAAc,IAAI,YAAY,WAAY,CAC7C,QAAS,GACT,SAAU,EACZ,CAAC,CAAC,CACJ,CACF,CAAC,CACH,CAEQ,uBAAwB,CAI9B,GAHA,KAAK,aAAa,EAClB,KAAK,WAAa,KAEd,KAAK,iBAAiB,IAAM,UAAY,OAAO,OAAW,IAAa,OAE3E,IAAMC,EAAK,OAAO,WAAW,8BAA8B,EACrDC,EAAU,IAAM,KAAK,OAAO,EAClCD,EAAG,iBAAiB,SAAUC,CAAO,EACrC,KAAK,WAAa,IAAMD,EAAG,oBAAoB,SAAUC,CAAO,CAClE,CACF,EAvNa7B,EACJ,mBAAqB,CAAC,UAAW,QAAS,OAAQ,UAAW,QAAS,QAAS,cAAe,mBAAmB,EAwNnH,SAAS8B,EAA0BC,EAAU,sBAAuB,CACrE,OAAO,eAAmB,KACzB,eAAe,IAAIA,CAAO,GAC7B,eAAe,OAAOA,EAAS/B,CAAiB,CAEpD,CAEA8B,EAA0B,EAEnB,SAASE,EAAwBC,EAAsD,CAC5F,IAAMC,EAAK,SAAS,cAAc,qBAAqB,EACvD,OAAAA,EAAG,QAAUD,EACNC,CACT,CC3dO,SAASC,GAAoC,CAClD,GAAI,OAAO,SAAa,IAAa,MAAO,CAAC,EAE7C,IAAMC,EAA4B,CAAC,EAEnC,gBAAS,iBAAiB,eAAe,EAAE,QAASC,GAAO,CACzD,IAAMC,EAAUD,EAAG,aAAa,SAAS,GAAK,GAGxCE,EAFaF,EAAG,aAAa,aAAa,IACf,QACD,cAAcC,CAAO,IAAMA,EAE3DF,EAAQ,KAAK,CACX,SAAU,SACV,QAAAE,EACA,YAAAC,CACF,CAAC,CACH,CAAC,EAED,SAAS,iBAAiB,qBAAqB,EAAE,QAASF,GAAO,CAC/D,IAAMC,EAAUD,EAAG,aAAa,SAAS,GAAK,GAE9CD,EAAQ,KAAK,CACX,SAAU,eACV,QAAAE,CACF,CAAC,CACH,CAAC,EAEMF,CACT,CAEO,SAASI,GAAiC,CAC/C,IAAMC,EAAUN,EAAgB,EAChC,OAAIM,EAAQ,SAAW,EAAU,CAAC,EAmC3B,CACL,WAAY,qBACZ,QAAS,UACT,gBApCcA,EAAQ,IAAKC,GAAQ,CACnC,GAAIA,EAAI,WAAa,SACnB,MAAO,CACL,QAAS,SACT,KAAM,kBAAkBA,EAAI,OAAO,GACnC,YAAaA,EAAI,QACjB,OAAQ,CACN,QAAS,aACT,YAAa,iCAAiC,mBAAmBA,EAAI,aAAeA,EAAI,OAAO,CAAC,GAChG,eAAgB,uBAClB,EACA,OAAQ,CACN,QAAS,qBACT,gBAAiB,eACjB,KAAMA,EAAI,aAAeA,EAAI,OAC/B,CACF,EAGF,IAAMC,EAAiC,CACrC,QAAS,aACT,eAAgB,2BAChB,YAAa,oCAAoC,mBAAmBD,EAAI,OAAO,CAAC,EAClF,EAEA,MAAO,CACL,QAAS,SACT,KAAM,yBAAyBA,EAAI,OAAO,GAC1C,YAAaA,EAAI,QACjB,OAAQC,CACV,CACF,CAAC,CAMD,CACF,CAQO,SAASC,GAA6B,CAC3C,GAAI,OAAO,SAAa,IAAa,OAErC,IAAMC,EAAW,SAAS,cAAc,mCAAmC,EACvEA,GAAUA,EAAS,OAAO,EAE9B,IAAMC,EAAON,EAAuB,EACpC,GAAI,CAACM,GAAQ,EAAE,oBAAqBA,GAAO,OAE3C,IAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,KAAO,sBACdA,EAAO,aAAa,4BAA6B,EAAE,EACnDA,EAAO,YAAc,KAAK,UAAUD,EAAM,KAAM,CAAC,EACjD,SAAS,KAAK,YAAYC,CAAM,CAClC,CC3GA,IAAMC,EAAW,4CACXC,GAAM,gBAERC,EAAO,GAEJ,SAASC,IAAqB,CAEnC,GADID,GACA,OAAO,OAAW,KAAe,OAAO,UAAc,IAAa,OAEvE,IAAME,EAAS,OAAO,UAAU,OAChC,GAAI,GAACA,GAAUA,IAAW,QAAUA,EAAO,WAAW,OAAO,GAE7D,CAAAF,EAAO,GAEP,GAAI,CACF,IAAMG,EAAU,KAAK,UAAU,CAAE,OAAAD,EAAQ,IAAKH,EAAI,CAAC,EAC7CK,EAAO,IAAI,KAAK,CAACD,CAAO,EAAG,CAAE,KAAM,YAAa,CAAC,EAEnD,OAAO,UAAU,YAAe,WAClC,UAAU,WAAWL,EAAUM,CAAI,EAEnC,MAAMN,EAAU,CAAE,OAAQ,OAAQ,KAAMK,EAAS,UAAW,EAAK,CAAC,EAC/D,MAAM,IAAM,CAAC,CAAC,CAErB,MAAQ,CAAC,EACX,CAEA,GAAI,OAAO,OAAW,IACpB,GAAI,CAAEF,GAAa,CAAG,MAAQ,CAAC,CRR1B,SAASI,IAAW,CACzBC,EAAqB,EACrBC,EAA0B,CAC5B","names":["index_exports","__export","ALT_BRAND_COLOR","BRAND_COLOR","HERMES_ICON","HERMES_SKILL_ICON","HermesButton","HermesPopupDialog","HermesSkillButton","createHermesButton","createHermesSkillButton","discoverButtons","generateStructuredData","injectStructuredData","register","registerHermesButton","registerHermesSkillButton","resolveTheme","showPopup","themes","AGENT_PREFERENCES_COOKIE_NAME","isBrowser","readAgentPreferences","match","p","AGENT_PREFERENCES_COOKIE_NAME","value","decoded","data","x","writeAgentPreferences","payload","order","json","expires","recordAgentPreference","agentId","base","id","HERMES_ICON","HERMES_SKILL_ICON","COPY_ICON","CHECK_ICON","CLOSE_ICON","BRAND_COLOR","BRAND_COLOR_HOVER","BRAND_COLOR_ACTIVE","BRAND_RGB","ALT_BRAND_COLOR","ALT_BRAND_COLOR_HOVER","ALT_BRAND_COLOR_ACTIVE","ALT_BRAND_RGB","themes","resolveTheme","theme","themeToCSS","tokens","SHAPE_MAP","SIZE_MAP","POPUP_STYLES","BRAND_COLOR_HOVER","HermesPopupDialog","opts","theme","resolveTheme","prefersDark","base","brand","variant","title","description","command","fullCommand","tokens","icon","HERMES_ICON","HERMES_SKILL_ICON","isHermesTerminal","displayCommand","themeToCSS","CLOSE_ICON","COPY_ICON","e","target","action","cmd","mq","handler","button","label","iconContainer","CHECK_ICON","textarea","dialog","backdrop","str","div","showPopup","options","popup","BUTTON_STYLES","BRAND_COLOR_HOVER","BRAND_RGB","BRAND_COLOR_ACTIVE","ALT_BRAND_COLOR_HOVER","ALT_BRAND_RGB","ALT_BRAND_COLOR_ACTIVE","BRAND_COLOR","ALT_BRAND_COLOR","HermesButton","opts","command","theme","size","variant","shape","popup","promptFlag","popupTitle","popupDescription","fullCommand","link","resolvedTheme","tokens","resolveTheme","sizeTokens","SIZE_MAP","radius","SHAPE_MAP","bgOverride","borderOverride","textOverride","themeToCSS","HERMES_ICON","btn","e","recordAgentPreference","showPopup","cmd","mq","handler","registerHermesButton","tagName","createHermesButton","options","el","BUTTON_STYLES","BRAND_COLOR_HOVER","BRAND_RGB","BRAND_COLOR_ACTIVE","ALT_BRAND_COLOR_HOVER","ALT_BRAND_RGB","ALT_BRAND_COLOR_ACTIVE","BRAND_COLOR","ALT_BRAND_COLOR","HermesSkillButton","opts","command","theme","size","variant","shape","popup","popupTitle","popupDescription","link","resolvedTheme","tokens","resolveTheme","sizeTokens","SIZE_MAP","radius","SHAPE_MAP","bgOverride","borderOverride","textOverride","themeToCSS","HERMES_SKILL_ICON","btn","e","recordAgentPreference","showPopup","cmd","mq","handler","registerHermesSkillButton","tagName","createHermesSkillButton","options","el","discoverButtons","results","el","command","fullCommand","generateStructuredData","buttons","btn","entry","injectStructuredData","existing","data","script","PING_URL","PKG","sent","reportOrigin","origin","payload","blob","register","registerHermesButton","registerHermesSkillButton"]}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var z="agentpreferences";function P(){return typeof document<"u"}function W(){if(!P())return null;let a=document.cookie.split(";").map(t=>t.trim()).find(t=>t.startsWith(`${z}=`));if(!a)return null;let n=a.slice(z.length+1);if(!n)return null;try{let t=decodeURIComponent(n),e=JSON.parse(t);return !e||typeof e!="object"||!Array.isArray(e.order)?null:{order:e.order.filter(r=>typeof r=="string"&&r.length>0)}}catch{return null}}function G(a){if(!P())return;let n=a.order.slice(0,24),t=JSON.stringify({order:n}),e=new Date;e.setFullYear(e.getFullYear()+1),document.cookie=`${z}=${encodeURIComponent(t)}; Path=/; SameSite=Lax; Expires=${e.toUTCString()}`;}function f(a){if(!a||typeof a!="string")return;let t=W()?.order.filter(e=>e!==a)??[];G({order:[a,...t]});}var y=`<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="hb-icon">
1
+ 'use strict';var P="agentpreferences";function z(){return typeof document<"u"}function G(){if(!z())return null;let a=document.cookie.split(";").map(t=>t.trim()).find(t=>t.startsWith(`${P}=`));if(!a)return null;let n=a.slice(P.length+1);if(!n)return null;try{let t=decodeURIComponent(n),e=JSON.parse(t);return !e||typeof e!="object"||!Array.isArray(e.order)?null:{order:e.order.filter(r=>typeof r=="string"&&r.length>0)}}catch{return null}}function W(a){if(!z())return;let n=a.order.slice(0,24),t=JSON.stringify({order:n}),e=new Date;e.setFullYear(e.getFullYear()+1),document.cookie=`${P}=${encodeURIComponent(t)}; Path=/; SameSite=Lax; Expires=${e.toUTCString()}`;}function f(a){if(!a||typeof a!="string")return;let t=G()?.order.filter(e=>e!==a)??[];W({order:[a,...t]});}var y=`<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="hb-icon">
2
2
  <!-- Wing helmet -->
3
3
  <path d="M12 2C8.5 2 6 4.5 6 7c0 1.5.5 2.8 1.5 3.8L6 14h12l-1.5-3.2C17.5 9.8 18 8.5 18 7c0-2.5-2.5-5-6-5z" fill="currentColor" opacity="0.2"/>
4
4
  <path d="M12 2C8.5 2 6 4.5 6 7c0 1.5.5 2.8 1.5 3.8L6 14h12l-1.5-3.2C17.5 9.8 18 8.5 18 7c0-2.5-2.5-5-6-5z" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linejoin="round"/>
@@ -899,6 +899,6 @@
899
899
  <span class="hb-btn-icon" aria-hidden="true">${w}</span>
900
900
  <span class="hb-btn-label">Run on Hermes Skills</span>
901
901
  </button>
902
- `;let k=this.shadowRoot.querySelector(".hb-btn");k.addEventListener("click",()=>this.handleClick()),k.addEventListener("keydown",g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),this.handleClick());}),this._rendered=true,this.setupSystemThemeWatch();}handleClick(){let{popup:t,command:e,popupTitle:o,popupDescription:r}=this._options;if(this.dispatchEvent(new CustomEvent("hb-open",{bubbles:true,composed:true,detail:{command:e}})),t===false){navigator.clipboard.writeText(e).then(()=>{this._options.onCopy?.(e),f("hermes-skill"),this.dispatchEvent(new CustomEvent("hb-copy",{bubbles:true,composed:true,detail:{command:e}}));});return}A({variant:"hermes-skill",theme:this.getResolvedTheme(),title:o||"Run on Hermes Skills",description:r||"Copy and paste into a Hermes session to get started.",command:e,onCopy:s=>{this._options.onCopy?.(s),f("hermes-skill"),this.dispatchEvent(new CustomEvent("hb-copy",{bubbles:true,composed:true,detail:{command:s}}));},onClose:()=>{this.dispatchEvent(new CustomEvent("hb-close",{bubbles:true,composed:true}));}});}setupSystemThemeWatch(){if(this._mqCleanup?.(),this._mqCleanup=null,this.getResolvedTheme()!=="system"||typeof window>"u")return;let t=window.matchMedia("(prefers-color-scheme: dark)"),e=()=>this.render();t.addEventListener("change",e),this._mqCleanup=()=>t.removeEventListener("change",e);}};E.observedAttributes=["command","theme","size","variant","shape","popup","popup-title","popup-description"];function H(a="hermes-skill-button"){typeof customElements>"u"||customElements.get(a)||customElements.define(a,E);}H();function X(a){let n=document.createElement("hermes-skill-button");return n.options=a,n}function q(){if(typeof document>"u")return [];let a=[];return document.querySelectorAll("hermes-button").forEach(n=>{let t=n.getAttribute("command")||"",r=n.getAttribute("prompt-flag")!=="false"?`hermes -p "${t}"`:t;a.push({platform:"hermes",command:t,fullCommand:r});}),document.querySelectorAll("hermes-skill-button").forEach(n=>{let t=n.getAttribute("command")||"";a.push({platform:"hermes-skill",command:t});}),a}function V(){let a=q();return a.length===0?{}:{"@context":"https://schema.org","@type":"WebPage",potentialAction:a.map(t=>{if(t.platform==="hermes")return {"@type":"Action",name:`Run on Hermes: ${t.command}`,description:t.command,target:{"@type":"EntryPoint",urlTemplate:`https://hermes.ai/run?command=${encodeURIComponent(t.fullCommand||t.command)}`,actionPlatform:"https://hermes.ai/run"},object:{"@type":"SoftwareSourceCode",runtimePlatform:"Hermes Agent",text:t.fullCommand||t.command}};let e={"@type":"EntryPoint",actionPlatform:"https://hermes.ai/skills",urlTemplate:`https://hermes.ai/skills?command=${encodeURIComponent(t.command)}`};return {"@type":"Action",name:`Run on Hermes Skills: ${t.command}`,description:t.command,target:e}})}}function Q(){if(typeof document>"u")return;let a=document.querySelector("script[data-hermesbuttons-jsonld]");a&&a.remove();let n=V();if(!n||!("potentialAction"in n))return;let t=document.createElement("script");t.type="application/ld+json",t.setAttribute("data-hermesbuttons-jsonld",""),t.textContent=JSON.stringify(n,null,2),document.head.appendChild(t);}var j="https://hermesbuttons.vercel.app/api/ping",U=false;function tt(){if(U||typeof window>"u"||typeof navigator>"u")return;let a=window.location?.origin;if(!(!a||a==="null"||a.startsWith("file:"))){U=true;try{let n=JSON.stringify({origin:a}),t=new Blob([n],{type:"text/plain"});typeof navigator.sendBeacon=="function"?navigator.sendBeacon(j,t):fetch(j,{method:"POST",body:n,keepalive:!0}).catch(()=>{});}catch{}}}if(typeof window<"u")try{tt();}catch{}function yt(){B(),H();}
903
- exports.ALT_BRAND_COLOR=m;exports.BRAND_COLOR=i;exports.HERMES_ICON=y;exports.HERMES_SKILL_ICON=w;exports.HermesButton=_;exports.HermesPopupDialog=L;exports.HermesSkillButton=E;exports.createHermesButton=J;exports.createHermesSkillButton=X;exports.discoverButtons=q;exports.generateStructuredData=V;exports.injectStructuredData=Q;exports.register=yt;exports.registerHermesButton=B;exports.registerHermesSkillButton=H;exports.resolveTheme=b;exports.showPopup=A;exports.themes=C;//# sourceMappingURL=index.js.map
902
+ `;let k=this.shadowRoot.querySelector(".hb-btn");k.addEventListener("click",()=>this.handleClick()),k.addEventListener("keydown",g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),this.handleClick());}),this._rendered=true,this.setupSystemThemeWatch();}handleClick(){let{popup:t,command:e,popupTitle:o,popupDescription:r}=this._options;if(this.dispatchEvent(new CustomEvent("hb-open",{bubbles:true,composed:true,detail:{command:e}})),t===false){navigator.clipboard.writeText(e).then(()=>{this._options.onCopy?.(e),f("hermes-skill"),this.dispatchEvent(new CustomEvent("hb-copy",{bubbles:true,composed:true,detail:{command:e}}));});return}A({variant:"hermes-skill",theme:this.getResolvedTheme(),title:o||"Run on Hermes Skills",description:r||"Copy and paste into a Hermes session to get started.",command:e,onCopy:s=>{this._options.onCopy?.(s),f("hermes-skill"),this.dispatchEvent(new CustomEvent("hb-copy",{bubbles:true,composed:true,detail:{command:s}}));},onClose:()=>{this.dispatchEvent(new CustomEvent("hb-close",{bubbles:true,composed:true}));}});}setupSystemThemeWatch(){if(this._mqCleanup?.(),this._mqCleanup=null,this.getResolvedTheme()!=="system"||typeof window>"u")return;let t=window.matchMedia("(prefers-color-scheme: dark)"),e=()=>this.render();t.addEventListener("change",e),this._mqCleanup=()=>t.removeEventListener("change",e);}};E.observedAttributes=["command","theme","size","variant","shape","popup","popup-title","popup-description"];function H(a="hermes-skill-button"){typeof customElements>"u"||customElements.get(a)||customElements.define(a,E);}H();function X(a){let n=document.createElement("hermes-skill-button");return n.options=a,n}function q(){if(typeof document>"u")return [];let a=[];return document.querySelectorAll("hermes-button").forEach(n=>{let t=n.getAttribute("command")||"",r=n.getAttribute("prompt-flag")!=="false"?`hermes -p "${t}"`:t;a.push({platform:"hermes",command:t,fullCommand:r});}),document.querySelectorAll("hermes-skill-button").forEach(n=>{let t=n.getAttribute("command")||"";a.push({platform:"hermes-skill",command:t});}),a}function V(){let a=q();return a.length===0?{}:{"@context":"https://schema.org","@type":"WebPage",potentialAction:a.map(t=>{if(t.platform==="hermes")return {"@type":"Action",name:`Run on Hermes: ${t.command}`,description:t.command,target:{"@type":"EntryPoint",urlTemplate:`https://hermes.ai/run?command=${encodeURIComponent(t.fullCommand||t.command)}`,actionPlatform:"https://hermes.ai/run"},object:{"@type":"SoftwareSourceCode",runtimePlatform:"Hermes Agent",text:t.fullCommand||t.command}};let e={"@type":"EntryPoint",actionPlatform:"https://hermes.ai/skills",urlTemplate:`https://hermes.ai/skills?command=${encodeURIComponent(t.command)}`};return {"@type":"Action",name:`Run on Hermes Skills: ${t.command}`,description:t.command,target:e}})}}function Q(){if(typeof document>"u")return;let a=document.querySelector("script[data-hermesbuttons-jsonld]");a&&a.remove();let n=V();if(!n||!("potentialAction"in n))return;let t=document.createElement("script");t.type="application/ld+json",t.setAttribute("data-hermesbuttons-jsonld",""),t.textContent=JSON.stringify(n,null,2),document.head.appendChild(t);}var j="https://hermesbuttons.vercel.app/api/ping",tt="hermesbuttons",U=false;function et(){if(U||typeof window>"u"||typeof navigator>"u")return;let a=window.location?.origin;if(!(!a||a==="null"||a.startsWith("file:"))){U=true;try{let n=JSON.stringify({origin:a,pkg:tt}),t=new Blob([n],{type:"text/plain"});typeof navigator.sendBeacon=="function"?navigator.sendBeacon(j,t):fetch(j,{method:"POST",body:n,keepalive:!0}).catch(()=>{});}catch{}}}if(typeof window<"u")try{et();}catch{}function wt(){B(),H();}
903
+ exports.ALT_BRAND_COLOR=m;exports.BRAND_COLOR=i;exports.HERMES_ICON=y;exports.HERMES_SKILL_ICON=w;exports.HermesButton=_;exports.HermesPopupDialog=L;exports.HermesSkillButton=E;exports.createHermesButton=J;exports.createHermesSkillButton=X;exports.discoverButtons=q;exports.generateStructuredData=V;exports.injectStructuredData=Q;exports.register=wt;exports.registerHermesButton=B;exports.registerHermesSkillButton=H;exports.resolveTheme=b;exports.showPopup=A;exports.themes=C;//# sourceMappingURL=index.js.map
904
904
  //# sourceMappingURL=index.js.map