@steppy/player 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"steppy-tour.js","sources":["../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/lit-html/lit-html.js","../node_modules/lit-element/lit-element.js","../src/ui/names.ts","../src/tour/contract.ts","../src/ui/placement.ts","../src/tour/dom.ts","../src/tour/engine.ts","../src/tour/events.ts","../src/tour/layer.ts","../src/ui/strings.ts","../src/tour/validate.ts","../src/tour/loader.ts","../src/tour/resolver.ts","../src/tour/routes.ts","../src/tour/signature.ts","../src/tour/storage.ts","../src/tour/strings.ts","../src/ui/tokens.ts","../src/tour/styles.ts","../src/ui/markdown.ts","../src/tour/templates.ts","../src/tour/tracker.ts","../src/tour/triggers.ts","../src/tour/host.ts","../src/tour/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.3\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * Product-derived names, the TypeScript twin of ``src/steppy/naming.py``.\n *\n * One literal per line on purpose: ``tests/test_tour_contract_sync.py`` reads\n * this file with regular expressions and fails when a value drifts from the\n * Python side. A future rename edits both files.\n */\n\nexport const PRODUCT = 'steppy';\nexport const TOUR_HOST_TAG = 'steppy-tour-host';\nexport const TOURS_MANIFEST_KIND = 'steppy-tours-manifest';\nexport const TOUR_FILE_KIND = 'steppy-tour';\nexport const TOURS_MANIFEST_FILENAME = 'tours.manifest.json';\nexport const TOURS_KILL_SWITCH_GLOBAL = '__STEPPY_TOURS_DISABLED__';\nexport const TOUR_RESUME_STORAGE_KEY = 'steppy:tour';\n/** ``globalThis[Symbol.for(...)]`` marks the host instance that owns the running tour. */\nexport const TOUR_ACTIVE_SYMBOL_KEY = 'steppy.tour.active';\n/** Prefix of every public CSS custom property (``--steppy-accent`` ...). */\nexport const CSS_TOKEN_PREFIX = '--steppy-';\n","/**\n * In-app tour data contract v1, the TypeScript twin of ``src/steppy/tour_spec.py``.\n *\n * The overlay validates every manifest and tour file against these values\n * (``validate.ts``); the compiler never emits anything they reject.\n * ``tests/test_tour_contract_sync.py`` keeps both sides equal, so every value\n * stays a plain literal: string patterns carry no backslashes, and arrays are\n * written on one line.\n */\n\nexport const TOUR_SCHEMA_VERSION = 1;\n\nexport const ADVANCE_KINDS = ['click', 'input', 'change', 'visible', 'manual'] as const;\nexport const TARGETED_ADVANCE_KINDS = ['click', 'input', 'change', 'visible'] as const;\nexport const PLACEMENTS = ['top', 'bottom', 'left', 'right', 'auto'] as const;\nexport const TOUR_EVENTS = ['tour-start', 'tour-step', 'tour-complete', 'tour-dismiss', 'tour-offpath', 'tour-error'] as const;\nexport const TOUR_ERROR_REASONS = ['target-timeout', 'entry-params', 'load-failed', 'schema-unsupported', 'invalid-data'] as const;\nexport const TOUR_PARTS = ['layer', 'spotlight', 'bubble', 'title', 'body', 'progress', 'button', 'primary', 'secondary', 'next', 'close', 'skip', 'end', 'resume', 'pill', 'guide-link'] as const;\nexport const ATTR_TOUR_ID = 'data-tour-id';\nexport const ATTR_STEP_ID = 'data-step-id';\nexport const ATTR_STATE = 'data-state';\nexport const ATTR_ADVANCE = 'data-advance';\nexport const BUBBLE_STATES = ['shown', 'fallback'] as const;\n/** Languages ``strings.ts`` ships chrome strings for; others need the host's ``strings``. */\nexport const CHROME_STRING_LOCALES = ['en', 'fr', 'nl', 'de'] as const;\n\nexport const TEST_ID_PATTERN = '^[A-Za-z0-9_.:/-]{1,128}$';\nexport const STEP_ID_PATTERN = '^[A-Za-z0-9_.:/-]{1,128}$';\nexport const TEST_ID_ATTRIBUTE_PATTERN = '^data-[a-z0-9-]+$';\nexport const TOUR_ID_PATTERN = '^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$';\nexport const LAYOUT_NAME_PATTERN = '^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$';\nexport const ROLE_PATTERN = '^[A-Za-z0-9_-]{1,64}$';\nexport const LOCALE_PATTERN = '^[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]{1,8}){0,5}$';\nexport const SRI_PATTERN = '^sha384-[A-Za-z0-9+/]{64}$';\nexport const TOUR_FILE_NAME_PATTERN = '^[A-Za-z0-9][A-Za-z0-9_-]{0,63}[.][A-Za-z0-9_-]{1,64}[.]json$';\nexport const ROUTE_PATTERN = '^/$|^(?:/(?::[A-Za-z_][A-Za-z0-9_]{0,63}|[A-Za-z0-9._~%!$&()*+,;=@-]{1,128})){1,32}$';\nexport const MEDIA_QUERY_PATTERN = '^[A-Za-z0-9 :().,<>=/_-]{1,256}$';\nexport const BUILD_ID_PATTERN = '^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,62}[A-Za-z0-9])?$';\n\nexport const MAX_TOURS = 500;\nexport const MAX_STEPS = 100;\nexport const MAX_LOCALES = 32;\nexport const MAX_LAYOUTS = 16;\nexport const MAX_TITLE_CHARS = 200;\nexport const MAX_TEXT_CHARS = 2000;\nexport const MAX_ROUTE_CHARS = 512;\nexport const MAX_URL_CHARS = 2048;\nexport const MAX_MEDIA_QUERY_CHARS = 256;\nexport const MAX_TOUR_FILE_BYTES = 262144;\nexport const MAX_MANIFEST_BYTES = 1048576;\n\n/** Player-only defaults (no Python twin). */\nexport const DEFAULT_TARGET_TIMEOUT_MS = 8000;\nexport const DEFAULT_BASE_Z_INDEX = 2147483000;\n\nexport type AdvanceKind = (typeof ADVANCE_KINDS)[number];\nexport type Placement = (typeof PLACEMENTS)[number];\nexport type TourEventName = (typeof TOUR_EVENTS)[number];\nexport type TourErrorReason = (typeof TOUR_ERROR_REASONS)[number];\nexport type TourPart = (typeof TOUR_PARTS)[number];\n","/**\n * Bubble placement next to a highlighted rect, shared by the guide player's\n * tooltip and the in-app tour popover. Pure math, no DOM.\n *\n * Called without options, ``placeTooltip`` is the guide's historical rule,\n * byte for byte (guard: ``test/ui/placement.test.ts`` against a frozen copy).\n * With options it honours a preferred side, keeps a margin from the stage\n * edges, steers clear of rects to ``avoid`` and reports whether the bubble\n * could not avoid covering the hotspot.\n *\n * ``Rect`` is declared here rather than imported from ``cursor/`` so the tour's\n * type declarations do not pull the cursor animator in.\n */\n\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport type TooltipSide = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TooltipPlacement {\n side: TooltipSide;\n /** Top-left offset, in display space, of the tooltip's bounding box. */\n x: number;\n y: number;\n /** Only with options: true when no side fits and the bubble covers the hotspot. */\n overlaps?: boolean;\n}\n\nexport interface PlaceOptions {\n /** Side to try first; ``auto`` (the default) uses the historical bias. */\n preferred?: TooltipSide | 'auto';\n /** Distance kept from every stage edge (default 0). */\n margin?: number;\n /** Rects a fitting side should not cover (e.g. the next step's target). */\n avoid?: readonly Rect[];\n}\n\ntype Size = { width: number; height: number };\n\nconst OPPOSITE: Record<TooltipSide, TooltipSide> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' };\n\n/**\n * Decide which side of the hotspot the tooltip should sit on. Picks the side\n * with the most room, then biases toward ``bottom`` for ties (matches\n * Guideflow's default).\n *\n * All inputs and outputs are in display space (the same coordinate frame as\n * the hotspot rect).\n */\nexport function placeTooltip(hotspot: Rect, tooltip: Size, stage: Size, gap = 8, opts?: PlaceOptions): TooltipPlacement {\n if (opts === undefined) return legacyPlace(hotspot, tooltip, stage, gap);\n return placeWithOptions(hotspot, tooltip, stage, gap, opts);\n}\n\nfunction legacyPlace(hotspot: Rect, tooltip: Size, stage: Size, gap: number): TooltipPlacement {\n const above = hotspot.y;\n const below = stage.height - (hotspot.y + hotspot.height);\n const left = hotspot.x;\n const right = stage.width - (hotspot.x + hotspot.width);\n\n // Prefer vertical placement (above or below). Only fall back to horizontal\n // when neither vertical side has room for the tooltip's height plus gap.\n const verticalNeeded = tooltip.height + gap;\n const horizontalNeeded = tooltip.width + gap;\n const bestVertical: { side: TooltipSide; room: number } =\n below >= above ? { side: 'bottom', room: below } : { side: 'top', room: above };\n let pick: TooltipSide;\n if (bestVertical.room >= verticalNeeded) {\n pick = bestVertical.side;\n } else {\n const bestHorizontal: { side: TooltipSide; room: number } =\n right >= left ? { side: 'right', room: right } : { side: 'left', room: left };\n pick = bestHorizontal.room >= horizontalNeeded ? bestHorizontal.side : bestVertical.side;\n }\n\n const cx = hotspot.x + hotspot.width / 2;\n const cy = hotspot.y + hotspot.height / 2;\n\n let x = 0;\n let y = 0;\n if (pick === 'bottom') {\n x = clamp(cx - tooltip.width / 2, 0, stage.width - tooltip.width);\n y = Math.min(hotspot.y + hotspot.height + gap, stage.height - tooltip.height);\n } else if (pick === 'top') {\n x = clamp(cx - tooltip.width / 2, 0, stage.width - tooltip.width);\n y = Math.max(0, hotspot.y - tooltip.height - gap);\n } else if (pick === 'right') {\n x = Math.min(hotspot.x + hotspot.width + gap, stage.width - tooltip.width);\n y = clamp(cy - tooltip.height / 2, 0, stage.height - tooltip.height);\n } else {\n x = Math.max(0, hotspot.x - tooltip.width - gap);\n y = clamp(cy - tooltip.height / 2, 0, stage.height - tooltip.height);\n }\n return { side: pick, x, y };\n}\n\nfunction placeWithOptions(hotspot: Rect, tooltip: Size, stage: Size, gap: number, opts: PlaceOptions): TooltipPlacement {\n const margin = opts.margin ?? 0;\n const room: Record<TooltipSide, number> = {\n top: hotspot.y - margin,\n bottom: stage.height - (hotspot.y + hotspot.height) - margin,\n left: hotspot.x - margin,\n right: stage.width - (hotspot.x + hotspot.width) - margin,\n };\n const order = sideOrder(room, opts.preferred ?? 'auto');\n const fits = (side: TooltipSide): boolean => {\n const vertical = side === 'top' || side === 'bottom';\n const main = vertical ? tooltip.height : tooltip.width;\n const cross = vertical ? tooltip.width : tooltip.height;\n const crossStage = vertical ? stage.width : stage.height;\n return room[side] >= main + gap && cross <= crossStage - 2 * margin;\n };\n const place = (side: TooltipSide): TooltipPlacement => {\n const cx = hotspot.x + hotspot.width / 2;\n const cy = hotspot.y + hotspot.height / 2;\n const xCentred = clamp(cx - tooltip.width / 2, margin, stage.width - tooltip.width - margin);\n const yCentred = clamp(cy - tooltip.height / 2, margin, stage.height - tooltip.height - margin);\n if (side === 'bottom') return { side, x: xCentred, y: hotspot.y + hotspot.height + gap };\n if (side === 'top') return { side, x: xCentred, y: hotspot.y - gap - tooltip.height };\n if (side === 'right') return { side, x: hotspot.x + hotspot.width + gap, y: yCentred };\n return { side, x: hotspot.x - gap - tooltip.width, y: yCentred };\n };\n const avoid = opts.avoid ?? [];\n const hits = (p: TooltipPlacement): boolean =>\n avoid.some((r) => intersects({ x: p.x, y: p.y, width: tooltip.width, height: tooltip.height }, r));\n\n const fitting = order.filter(fits).map(place);\n const clear = fitting.filter((p) => !hits(p));\n const chosen = clear[0] ?? fitting[0];\n if (chosen) return { ...chosen, overlaps: false };\n\n // Nothing fits: best effort on the first side in order, kept inside the stage.\n const best = place(order[0]!);\n const x = clamp(best.x, margin, stage.width - tooltip.width - margin);\n const y = clamp(best.y, margin, stage.height - tooltip.height - margin);\n const overlaps = intersects({ x, y, width: tooltip.width, height: tooltip.height }, hotspot);\n return { side: best.side, x, y, overlaps };\n}\n\nfunction sideOrder(room: Record<TooltipSide, number>, preferred: TooltipSide | 'auto'): TooltipSide[] {\n if (preferred === 'auto') {\n const vertical: TooltipSide[] = room.bottom >= room.top ? ['bottom', 'top'] : ['top', 'bottom'];\n const horizontal: TooltipSide[] = room.right >= room.left ? ['right', 'left'] : ['left', 'right'];\n return [...vertical, ...horizontal];\n }\n const rest = (['top', 'bottom', 'left', 'right'] as TooltipSide[])\n .filter((s) => s !== preferred && s !== OPPOSITE[preferred])\n .sort((a, b) => room[b] - room[a]);\n return [preferred, OPPOSITE[preferred], ...rest];\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v));\n}\n\n/** True when ``a`` and ``b`` share a positive area. */\nexport function intersects(a: Rect, b: Rect): boolean {\n return a.x < b.x + b.width && b.x < a.x + a.width && a.y < b.y + b.height && b.y < a.y + a.height;\n}\n\n/** The overlap of ``a`` and ``b``, or ``null`` when they share no area. */\nexport function intersect(a: Rect, b: Rect): Rect | null {\n const x = Math.max(a.x, b.x);\n const y = Math.max(a.y, b.y);\n const right = Math.min(a.x + a.width, b.x + b.width);\n const bottom = Math.min(a.y + a.height, b.y + b.height);\n return right > x && bottom > y ? { x, y, width: right - x, height: bottom - y } : null;\n}\n\n/** The smallest rect containing both. */\nexport function union(a: Rect, b: Rect): Rect {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return {\n x,\n y,\n width: Math.max(a.x + a.width, b.x + b.width) - x,\n height: Math.max(a.y + a.height, b.y + b.height) - y,\n };\n}\n\n/** ``r`` grown by ``pad`` on every side. */\nexport function inflate(r: Rect, pad: number): Rect {\n return { x: r.x - pad, y: r.y - pad, width: r.width + 2 * pad, height: r.height + 2 * pad };\n}\n\nexport function containsPoint(r: Rect, x: number, y: number): boolean {\n return x >= r.x && x <= r.x + r.width && y >= r.y && y <= r.y + r.height;\n}\n","/**\n * Everything the overlay asks the browser about geometry and timing, behind\n * one interface. ``defaultDom`` is the real thing; tests swap\n * ``SteppyTourHost.dom`` for a stub with settable rects and a manual\n * scheduler (happy-dom has no layout, and its rAF escapes fake timers).\n */\n\nimport { union, type Rect } from '../ui/placement.js';\n\nexport interface Scheduler {\n now(): number;\n raf(cb: () => void): number;\n cancelRaf(id: number): void;\n setTimeout(cb: () => void, ms: number): number;\n clearTimeout(id: number): void;\n setInterval(cb: () => void, ms: number): number;\n clearInterval(id: number): void;\n}\n\nexport interface Viewport {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface DomAdapter {\n scheduler: Scheduler;\n /** The element's effective rect (see ``effectiveRect``), or null when it has none. */\n rect(el: Element): Rect | null;\n isVisible(el: Element): boolean;\n /** The visual viewport, in layout-viewport coordinates. */\n viewport(): Viewport;\n matchMedia(query: string): boolean;\n reducedMotion(): boolean;\n scrollIntoView(el: Element, instant: boolean): void;\n supportsPopover(): boolean;\n}\n\nconst FOCUSABLE = 'button,input,select,textarea,a[href],[role=button],[role=combobox],[tabindex]:not([tabindex=\"-1\"])';\n\nfunction ownRect(el: Element): Rect | null {\n const r = el.getBoundingClientRect();\n return r.width > 0 && r.height > 0 ? { x: r.left, y: r.top, width: r.width, height: r.height } : null;\n}\n\n/**\n * Playwright's notion of a visible box, extended for wrapper hosts: an element\n * with ``display: contents`` measures as the union of its children, and an\n * empty 0x0 host (a custom element wrapping a native control) as its first\n * visible focusable descendant.\n */\nexport function effectiveRect(el: Element, depth = 0): Rect | null {\n const style = getComputedStyle(el);\n if (style.visibility === 'hidden') return null;\n if (style.display === 'contents' && depth < 3) {\n let acc: Rect | null = null;\n for (const child of el.children) {\n const r = effectiveRect(child, depth + 1);\n if (r) acc = acc ? union(acc, r) : r;\n }\n return acc;\n }\n const own = ownRect(el);\n if (own || depth >= 3) return own;\n for (const inner of el.querySelectorAll(FOCUSABLE)) {\n const r = ownRect(inner);\n if (r && getComputedStyle(inner).visibility !== 'hidden') return r;\n }\n return null;\n}\n\nexport const defaultScheduler: Scheduler = {\n now: () => performance.now(),\n raf: (cb) => requestAnimationFrame(cb),\n cancelRaf: (id) => cancelAnimationFrame(id),\n setTimeout: (cb, ms) => window.setTimeout(cb, ms),\n clearTimeout: (id) => window.clearTimeout(id),\n setInterval: (cb, ms) => window.setInterval(cb, ms),\n clearInterval: (id) => window.clearInterval(id),\n};\n\nexport const defaultDom: DomAdapter = {\n scheduler: defaultScheduler,\n rect: (el) => effectiveRect(el),\n isVisible: (el) => effectiveRect(el) !== null,\n viewport: () => {\n const vv = window.visualViewport;\n return vv\n ? { x: vv.offsetLeft, y: vv.offsetTop, width: vv.width, height: vv.height }\n : { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight };\n },\n matchMedia: (q) => {\n try {\n return window.matchMedia(q).matches;\n } catch {\n return false;\n }\n },\n reducedMotion: () => defaultDom.matchMedia('(prefers-reduced-motion: reduce)'),\n scrollIntoView: (el, instant) =>\n el.scrollIntoView({ block: 'center', inline: 'nearest', behavior: instant ? 'instant' : 'smooth' } as ScrollIntoViewOptions),\n supportsPopover: () => typeof HTMLElement.prototype.showPopover === 'function',\n};\n","/**\n * The tour state machine, as a pure reducer: ``reduce(state, event)`` returns\n * the next state and the effects the host must carry out (load, navigate, wait\n * for an element, emit an event, persist the resume record, ...). No DOM, no\n * timers — every transition is a unit test.\n *\n * Async results come back as events carrying the ``token`` they were started\n * under; ``token`` changes whenever a step or phase change invalidates pending\n * work, so a late answer from an abandoned wait is dropped instead of moving\n * the tour.\n *\n * Phases: ``idle`` → ``loading`` → (``entering``) → ``resolving`` →\n * ``showing``; a target that does not appear in time puts the step in\n * ``fallback`` (the \"can't find this element\" popover, with Skip / End); a\n * target that disappears while shown goes ``lost``, then ``paused`` (the pill)\n * when it stays away.\n */\n\nimport type { AdvanceKind, TourErrorReason } from './contract.js';\nimport type { Issue, TourFile } from './validate.js';\n\nexport type Phase = 'idle' | 'loading' | 'entering' | 'resolving' | 'showing' | 'lost' | 'fallback' | 'paused';\nexport type StepReason = 'start' | 'advance' | 'jump' | 'skip' | 'resume' | 'recovered';\nexport type DismissVia = 'close' | 'escape' | 'end' | 'api' | 'replaced' | 'disabled';\nexport type TourSourceKind = 'bundled' | 'remote' | 'custom';\nexport type TriggerKind = 'click' | 'input-commit' | 'change' | 'visible';\nexport type WaitMode = 'resolve' | 'fallback' | 'lost' | 'paused' | 'visible';\n\nexport interface Loaded {\n tour: TourFile;\n source: TourSourceKind;\n /** Per step: does it apply to the current layout (``tours.layouts``)? */\n applicable: readonly boolean[];\n start: number;\n resumed: boolean;\n /** The entry route must be navigated to before the first step. */\n navigate: boolean;\n}\n\nexport interface TourErrorDetail {\n reason: TourErrorReason;\n fatal: boolean;\n message: string;\n tourId?: string;\n buildId?: string;\n locale?: string;\n stepId?: string;\n index?: number;\n testId?: string;\n kind?: 'target' | 'waitFor';\n missing?: string[];\n issues?: Issue[];\n}\n\nexport interface EngineState {\n readonly phase: Phase;\n readonly token: number;\n readonly loaded: Loaded | null;\n readonly index: number;\n /** The ``tour-step`` reason to report when the pending step shows. */\n readonly reason: StepReason;\n readonly fieldNonEmpty: boolean;\n}\n\nexport type EngineEvent =\n | { type: 'REQUEST' }\n | { type: 'LOADED'; loaded: Loaded }\n | { type: 'LOAD_FAILED'; error: TourErrorDetail }\n | { type: 'ENTER_DONE'; token: number }\n | { type: 'ENTER_FAILED'; token: number; message: string }\n | { type: 'RESOLVED'; token: number; fieldNonEmpty?: boolean }\n | { type: 'RESOLVE_TIMEOUT'; token: number; testId: string | null; kind: 'target' | 'waitFor' }\n | { type: 'TRIGGER'; token: number; kind: TriggerKind }\n | { type: 'NEXT'; token?: number }\n | { type: 'SKIP'; token: number }\n | { type: 'FIELD'; token: number; nonEmpty: boolean }\n | { type: 'JUMP'; token: number; to: number; performed: boolean }\n | { type: 'TARGET_LOST'; token: number }\n | { type: 'TARGET_BACK'; token: number }\n | { type: 'LOST_TIMEOUT'; token: number }\n | { type: 'RESUME'; token: number }\n | { type: 'DISMISS'; via: DismissVia; reason?: string }\n | { type: 'LOCALE'; tour: TourFile };\n\nexport type Effect =\n | { type: 'load' }\n | { type: 'emit'; name: 'tour-start' | 'tour-step' | 'tour-complete' | 'tour-dismiss' | 'tour-offpath' | 'tour-error'; detail: object }\n | { type: 'persist'; index: number }\n | { type: 'clearPersist' }\n | { type: 'navigate'; token: number }\n | { type: 'wait'; mode: WaitMode; index: number; token: number }\n | { type: 'focus' }\n | { type: 'teardown' };\n\nexport interface Transition {\n state: EngineState;\n effects: Effect[];\n}\n\nexport function initialState(): EngineState {\n return { phase: 'idle', token: 0, loaded: null, index: 0, reason: 'start', fieldNonEmpty: false };\n}\n\nexport const isActive = (s: EngineState): boolean => s.phase !== 'idle' && s.phase !== 'loading';\n\n/** Position among applicable steps (0-based) and their count — what progress shows. */\nexport function position(s: EngineState, index = s.index): { index: number; total: number } {\n const applicable = s.loaded?.applicable ?? [];\n return { index: applicable.slice(0, index).filter(Boolean).length, total: applicable.filter(Boolean).length };\n}\n\nfunction meta(s: EngineState) {\n const tour = s.loaded!.tour;\n return { tourId: tour.id, buildId: tour.buildId, locale: tour.locale };\n}\n\nfunction stepDetail(s: EngineState) {\n const step = s.loaded!.tour.steps[s.index]!;\n return { ...meta(s), stepId: step.id, ...position(s) };\n}\n\nconst emit = (name: Extract<Effect, { type: 'emit' }>['name'], detail: object): Effect => ({ type: 'emit', name, detail });\n\n/** Enter ``index`` in ``resolving`` (a fresh token: every pending wait is void). */\nfunction resolveStep(s: EngineState, index: number, reason: StepReason): Transition {\n const state: EngineState = { ...s, phase: 'resolving', index, reason, token: s.token + 1, fieldNonEmpty: false };\n return { state, effects: [{ type: 'persist', index }, { type: 'wait', mode: 'resolve', index, token: state.token }] };\n}\n\n/** Move past ``from`` to the next applicable step, or complete the tour. */\nfunction advanceFrom(s: EngineState, from: number, reason: StepReason): Transition {\n const applicable = s.loaded!.applicable;\n const next = applicable.findIndex((ok, j) => ok && j > from);\n if (next === -1) {\n const done = { ...initialState(), token: s.token + 1 };\n return {\n state: done,\n effects: [emit('tour-complete', { ...meta(s), total: position(s).total }), { type: 'clearPersist' }, { type: 'teardown' }],\n };\n }\n return resolveStep(s, next, reason);\n}\n\nfunction step(s: EngineState) {\n return s.loaded!.tour.steps[s.index]!;\n}\n\nconst TRIGGER_FOR: Record<TriggerKind, AdvanceKind> = {\n click: 'click',\n 'input-commit': 'input',\n change: 'change',\n visible: 'visible',\n};\n\nexport function reduce(s: EngineState, e: EngineEvent): Transition {\n const none: Transition = { state: s, effects: [] };\n if ('token' in e && e.token !== undefined && e.token !== s.token) return none;\n\n switch (e.type) {\n case 'REQUEST':\n return { state: { ...initialState(), phase: 'loading', token: s.token + 1 }, effects: [{ type: 'load' }] };\n\n case 'LOAD_FAILED':\n if (s.phase !== 'loading') return none;\n return {\n state: { ...initialState(), token: s.token + 1 },\n effects: [emit('tour-error', e.error), { type: 'clearPersist' }, { type: 'teardown' }],\n };\n\n case 'LOADED': {\n if (s.phase !== 'loading') return none;\n const loaded = e.loaded;\n const base: EngineState = { ...s, loaded, index: loaded.start };\n const start = emit('tour-start', {\n ...meta(base),\n total: position(base).total,\n source: loaded.source,\n resumed: loaded.resumed,\n entryNavigated: loaded.navigate,\n });\n const reason: StepReason = loaded.resumed ? 'resume' : 'start';\n if (loaded.navigate) {\n const state: EngineState = { ...base, phase: 'entering', reason, token: s.token + 1 };\n return { state, effects: [start, { type: 'persist', index: loaded.start }, { type: 'navigate', token: state.token }] };\n }\n const t = resolveStep(base, loaded.start, reason);\n return { state: t.state, effects: [start, ...t.effects] };\n }\n\n case 'ENTER_DONE':\n return s.phase === 'entering' ? resolveStep(s, s.index, s.reason) : none;\n\n case 'ENTER_FAILED':\n if (s.phase !== 'entering') return none;\n return {\n state: { ...initialState(), token: s.token + 1 },\n effects: [\n emit('tour-error', { reason: 'entry-params', fatal: true, message: e.message, ...meta(s) }),\n { type: 'clearPersist' },\n { type: 'teardown' },\n ],\n };\n\n case 'RESOLVED': {\n if (s.phase !== 'resolving' && s.phase !== 'fallback') return none;\n const reason: StepReason = s.phase === 'fallback' ? 'recovered' : s.reason;\n const state: EngineState = { ...s, phase: 'showing', reason, token: s.token + 1, fieldNonEmpty: e.fieldNonEmpty ?? false };\n const st = step(state);\n const effects: Effect[] = [emit('tour-step', { ...stepDetail(state), advance: st.advance, reason })];\n if (st.advance === 'manual') effects.push({ type: 'focus' });\n if (st.advance === 'visible') effects.push({ type: 'wait', mode: 'visible', index: s.index, token: state.token });\n return { state, effects };\n }\n\n case 'RESOLVE_TIMEOUT': {\n const visibleWait = s.phase === 'showing' && step(s).advance === 'visible';\n if (s.phase !== 'resolving' && !visibleWait) return none;\n const state: EngineState = { ...s, phase: 'fallback', token: s.token + 1 };\n const detail = { ...stepDetail(state), reason: 'target-timeout', fatal: false, message: 'the target did not appear in time' };\n return {\n state,\n effects: [\n emit('tour-error', { ...detail, ...(e.testId ? { testId: e.testId } : {}), kind: e.kind }),\n { type: 'wait', mode: 'fallback', index: s.index, token: state.token },\n { type: 'focus' },\n ],\n };\n }\n\n case 'TRIGGER':\n if (s.phase !== 'showing' || step(s).advance !== TRIGGER_FOR[e.kind]) return none;\n return advanceFrom(s, s.index, 'advance');\n\n case 'NEXT': {\n const api = e.token === undefined;\n if (s.phase === 'fallback' && api) return advanceFrom(s, s.index, 'skip');\n if (s.phase !== 'showing') return none;\n if (!api && step(s).advance === 'input' && !s.fieldNonEmpty) return none;\n return advanceFrom(s, s.index, 'advance');\n }\n\n case 'SKIP':\n return s.phase === 'fallback' ? advanceFrom(s, s.index, 'skip') : none;\n\n case 'FIELD':\n return s.phase === 'showing' && s.fieldNonEmpty !== e.nonEmpty ? { state: { ...s, fieldNonEmpty: e.nonEmpty }, effects: [] } : none;\n\n case 'JUMP': {\n const active = s.phase === 'showing' || s.phase === 'lost' || s.phase === 'paused' || s.phase === 'fallback';\n if (!active || e.to <= s.index || !s.loaded!.applicable[e.to]) return none;\n return e.performed ? advanceFrom(s, e.to, 'jump') : resolveStep(s, e.to, 'jump');\n }\n\n case 'TARGET_LOST':\n if (s.phase !== 'showing') return none;\n return lost(s);\n\n case 'TARGET_BACK': {\n if (s.phase !== 'lost' && s.phase !== 'paused') return none;\n const state: EngineState = { ...s, phase: 'showing', token: s.token + 1 };\n if (s.phase === 'lost') return { state, effects: [] }; // a silent re-show\n return {\n state: { ...state, reason: 'resume' },\n effects: [emit('tour-step', { ...stepDetail(state), advance: step(state).advance, reason: 'resume' })],\n };\n }\n\n case 'LOST_TIMEOUT': {\n if (s.phase !== 'lost') return none;\n const state: EngineState = { ...s, phase: 'paused', token: s.token + 1 };\n return {\n state,\n effects: [\n emit('tour-offpath', { ...stepDetail(state), reason: 'target-lost' }),\n { type: 'wait', mode: 'paused', index: s.index, token: state.token },\n ],\n };\n }\n\n case 'RESUME':\n return s.phase === 'paused' ? resolveStep(s, s.index, 'resume') : none;\n\n case 'DISMISS': {\n if (s.phase === 'idle') return none;\n const effects: Effect[] = [];\n if (s.loaded && s.phase !== 'loading') {\n effects.push(emit('tour-dismiss', { ...stepDetail(s), via: e.via, ...(e.reason ? { reason: e.reason } : {}) }));\n }\n effects.push({ type: 'clearPersist' }, { type: 'teardown' });\n return { state: { ...initialState(), token: s.token + 1 }, effects };\n }\n\n case 'LOCALE': {\n if (!isActive(s)) return none;\n const old = s.loaded!.tour.steps;\n const same =\n e.tour.steps.length === old.length &&\n e.tour.steps.every((st, i) => st.id === old[i]!.id && st.target === old[i]!.target && st.advance === old[i]!.advance);\n return same ? { state: { ...s, loaded: { ...s.loaded!, tour: e.tour } }, effects: [] } : none;\n }\n }\n}\n\nfunction lost(s: EngineState): Transition {\n const state: EngineState = { ...s, phase: 'lost', token: s.token + 1 };\n return { state, effects: [{ type: 'wait', mode: 'lost', index: s.index, token: state.token }] };\n}\n","/**\n * The six DOM events the overlay dispatches on its host element — bubbling\n * and composed, JSON-only details. Colon-free names on purpose: Angular\n * templates read ``(a:b)`` as a global event target.\n */\n\nimport type { AdvanceKind } from './contract.js';\nimport type { DismissVia, StepReason, TourErrorDetail, TourSourceKind } from './engine.js';\n\nexport interface TourEventMeta {\n tourId: string;\n buildId: string;\n locale: string;\n}\n\nexport interface TourStepPosition extends TourEventMeta {\n stepId: string;\n /** 0-based, counting only the steps that apply to the current layout. */\n index: number;\n total: number;\n}\n\nexport interface TourEventDetailMap {\n 'tour-start': TourEventMeta & { total: number; source: TourSourceKind; resumed: boolean; entryNavigated: boolean };\n 'tour-step': TourStepPosition & { advance: AdvanceKind; reason: StepReason };\n 'tour-complete': TourEventMeta & { total: number };\n 'tour-dismiss': TourStepPosition & { via: DismissVia; reason?: string };\n 'tour-offpath': TourStepPosition & { reason: 'target-lost' };\n 'tour-error': TourErrorDetail;\n}\n\nexport function emitTourEvent<K extends keyof TourEventDetailMap>(host: EventTarget, name: K, detail: TourEventDetailMap[K]): void {\n host.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n}\n","/**\n * Stacking. Where the popover API exists the layer is a ``popover=\"manual\"``\n * element in the browser's top layer — above any z-index the app uses — and\n * every step re-raises it (hide, then show) so it stays above an app dialog\n * opened after it. Elsewhere the layer falls back to ``z-index: var(--_pw-z)``.\n *\n * Known limit: a native ``<dialog>`` opened with ``showModal()`` makes\n * everything outside it inert, the layer included; re-raising does not lift\n * that. Steps advanced by the app's own events still work, the overlay's\n * buttons do not until the dialog closes.\n */\n\nimport type { DomAdapter } from './dom.js';\n\nfunction deepActive(): Element | null {\n let el = document.activeElement;\n while (el?.shadowRoot?.activeElement) el = el.shadowRoot.activeElement;\n return el;\n}\n\nexport function isLayerOpen(el: HTMLElement): boolean {\n try {\n return el.matches(':popover-open');\n } catch {\n return false;\n }\n}\n\nexport function showLayer(el: HTMLElement, dom: DomAdapter): void {\n if (!dom.supportsPopover() || isLayerOpen(el)) return;\n try {\n el.showPopover();\n } catch {\n // Not connected yet or already shown elsewhere: the z-index fallback holds.\n }\n}\n\n/** Move the layer to the top of the top layer, keeping the app's focus where it was. */\nexport function raiseLayer(el: HTMLElement, dom: DomAdapter): void {\n if (!dom.supportsPopover()) return;\n const active = deepActive();\n try {\n if (isLayerOpen(el)) el.hidePopover();\n el.showPopover();\n } catch {\n return;\n }\n if (active instanceof HTMLElement && active.isConnected && deepActive() !== active) active.focus({ preventScroll: true });\n}\n","/**\n * The string mechanism both players share: placeholder formatting, locale\n * lookup with a base-language rung, and the chrome vocabulary they have in\n * common (so \"Next\" reads the same in the guide and in the tour).\n */\n\n/** Replace ``{name}`` placeholders; unknown names stay as written. */\nexport function format(template: string, vars: Record<string, string | number>): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => (key in vars ? String(vars[key]) : `{${key}}`));\n}\n\n/**\n * Bare language subtag, lowercased (``fr-BE`` -> ``fr``). Mirrors Python's\n * ``steppy.locales.base_language``: lenient, never validates.\n */\nexport function baseLanguage(tag: string): string {\n return tag.replace(/_/g, '-').split('-', 1)[0]!.toLowerCase();\n}\n\n/**\n * The key of ``keys`` to use for ``requested``: an exact match (case- and\n * ``_``/``-``-insensitive) first, then the requested tag's base language. The\n * query is only ever truncated, never widened — ``fr`` does not match ``fr-BE``.\n */\nexport function lookupLocale(keys: Iterable<string>, requested: string | null | undefined): string | null {\n if (!requested) return null;\n const norm = (tag: string) => tag.replace(/_/g, '-').toLowerCase();\n const list = [...keys];\n const wanted = norm(requested);\n const exact = list.find((key) => norm(key) === wanted);\n if (exact !== undefined) return exact;\n const base = baseLanguage(requested);\n return list.find((key) => norm(key) === base) ?? null;\n}\n\n/**\n * Bundled ``defaults`` for ``locale`` (else ``fallback``), with the host's\n * sparse per-locale ``overrides`` merged on top. Without an override the\n * bundled object itself is returned.\n */\nexport function resolveStrings<T extends object>(\n defaults: Record<string, T>,\n locale: string,\n overrides?: Partial<Record<string, Partial<T>>>,\n fallback = 'en',\n): T {\n const key = lookupLocale(Object.keys(defaults), locale);\n const base = (key !== null ? defaults[key] : undefined) ?? defaults[fallback]!;\n const overrideKey = overrides ? lookupLocale(Object.keys(overrides), locale) : null;\n const override = overrideKey !== null ? overrides![overrideKey] : undefined;\n return override ? { ...base, ...override } : base;\n}\n\nexport interface ChromeStrings {\n next: string;\n /** Placeholders: ``{current}`` and ``{total}``. */\n progress: string;\n}\n\n/** Chrome words the guide and the tour share, per bundled locale. */\nexport const CHROME_STRINGS: Record<'en' | 'fr' | 'nl' | 'de', ChromeStrings> = {\n en: { next: 'Next', progress: 'Step {current} of {total}' },\n fr: { next: 'Suivant', progress: 'Étape {current} sur {total}' },\n nl: { next: 'Volgende', progress: 'Stap {current} van {total}' },\n de: { next: 'Weiter', progress: 'Schritt {current} von {total}' },\n};\n","/**\n * The overlay's security boundary: every manifest and tour file is validated\n * here before anything renders, and a file that breaks any rule is rejected\n * whole (spec 7.1). Hand-written rather than zod so the tour bundle stays small.\n *\n * Only known keys are copied into fresh objects — unknown keys are ignored, so\n * a newer producer's extra field never breaks an older overlay — but unknown\n * enum values and an unknown schema major are rejected: a tour file is data,\n * never code. The rules mirror ``src/steppy/contracts/tours.py`` (the\n * producer's self-check); ``contracts/fixtures/tours/cases.json`` runs both\n * sides over the same cases.\n */\n\nimport { TOURS_MANIFEST_KIND, TOUR_FILE_KIND } from '../ui/names.js';\nimport {\n ADVANCE_KINDS,\n BUILD_ID_PATTERN,\n LAYOUT_NAME_PATTERN,\n LOCALE_PATTERN,\n MAX_LAYOUTS,\n MAX_LOCALES,\n MAX_MEDIA_QUERY_CHARS,\n MAX_ROUTE_CHARS,\n MAX_STEPS,\n MAX_TEXT_CHARS,\n MAX_TITLE_CHARS,\n MAX_TOURS,\n MAX_URL_CHARS,\n MEDIA_QUERY_PATTERN,\n PLACEMENTS,\n ROLE_PATTERN,\n ROUTE_PATTERN,\n SRI_PATTERN,\n STEP_ID_PATTERN,\n TARGETED_ADVANCE_KINDS,\n TEST_ID_ATTRIBUTE_PATTERN,\n TEST_ID_PATTERN,\n TOUR_ID_PATTERN,\n TOUR_SCHEMA_VERSION,\n type AdvanceKind,\n type Placement,\n} from './contract.js';\n\nexport interface TourEntry {\n readonly route: string;\n}\n\nexport interface ManifestTour {\n readonly id: string;\n readonly role: string;\n readonly title: Readonly<Record<string, string>>;\n readonly entry: TourEntry | null;\n readonly steps: number;\n readonly files: Readonly<Record<string, string>>;\n readonly integrity: Readonly<Record<string, string>>;\n}\n\nexport interface TourManifest {\n readonly buildId: string;\n readonly defaultLocale: string;\n readonly locales: readonly string[];\n readonly testIdAttribute: string;\n readonly guideOrigin: string | null;\n readonly layouts: Readonly<Record<string, string>> | null;\n readonly tours: readonly ManifestTour[];\n}\n\nexport interface TourStep {\n readonly id: string;\n readonly target: string | null;\n readonly advance: AdvanceKind;\n readonly waitFor: string | null;\n readonly title: string | null;\n readonly text: string | null;\n readonly placement: Placement | null;\n readonly layouts: readonly string[] | null;\n}\n\nexport interface TourFile {\n readonly id: string;\n readonly buildId: string;\n readonly locale: string;\n readonly title: string;\n readonly guideUrl: string | null;\n readonly entry: TourEntry | null;\n readonly steps: readonly TourStep[];\n}\n\nexport interface Issue {\n path: string;\n message: string;\n}\n\nexport type FailReason = 'invalid-data' | 'schema-unsupported' | 'load-failed';\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; reason: FailReason; issues: Issue[] };\n\nconst MAX_ISSUES = 20;\nconst RX = {\n testId: new RegExp(TEST_ID_PATTERN),\n stepId: new RegExp(STEP_ID_PATTERN),\n tourId: new RegExp(TOUR_ID_PATTERN),\n attr: new RegExp(TEST_ID_ATTRIBUTE_PATTERN),\n locale: new RegExp(LOCALE_PATTERN),\n layout: new RegExp(LAYOUT_NAME_PATTERN),\n role: new RegExp(ROLE_PATTERN),\n route: new RegExp(ROUTE_PATTERN),\n media: new RegExp(MEDIA_QUERY_PATTERN),\n sri: new RegExp(SRI_PATTERN),\n buildId: new RegExp(BUILD_ID_PATTERN),\n};\nconst WINDOWS_RESERVED = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/i;\nconst BAD_PERCENT = /%(?![0-9A-Fa-f]{2})/;\n\n/** A same-origin, base-relative route pattern (``/invoices/:invoiceId``). */\nexport function isRoutePattern(value: unknown): value is string {\n return (\n typeof value === 'string' &&\n value.length <= MAX_ROUTE_CHARS &&\n RX.route.test(value) &&\n !BAD_PERCENT.test(value) &&\n value\n .split('/')\n .slice(1)\n // ``%2e`` is a dot to a URL parser: ``/%2e%2e/x`` would climb out of the app's base.\n .every((seg) => !/^\\.\\.?$/.test(seg.replace(/%2e/gi, '.')))\n );\n}\n\nexport function isBuildId(value: unknown): value is string {\n return typeof value === 'string' && RX.buildId.test(value) && !WINDOWS_RESERVED.test(value.split('.')[0]!);\n}\n\n/** ``scheme://host[:port]`` of an absolute http(s) URL without credentials, else null. */\nexport function httpOrigin(value: string): string | null {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n return null;\n }\n if ((url.protocol !== 'https:' && url.protocol !== 'http:') || url.username || url.password) return null;\n return url.origin;\n}\n\nclass Checker {\n issues: Issue[] = [];\n fail(path: string, message: string): void {\n if (this.issues.length < MAX_ISSUES) this.issues.push({ path, message });\n }\n get ok(): boolean {\n return this.issues.length === 0;\n }\n obj(v: unknown, path: string): Record<string, unknown> | null {\n if (v !== null && typeof v === 'object' && !Array.isArray(v)) return v as Record<string, unknown>;\n this.fail(path, 'must be an object');\n return null;\n }\n str(v: unknown, path: string, rx?: RegExp): string | null {\n if (typeof v !== 'string') {\n this.fail(path, 'must be a string');\n return null;\n }\n if (rx && !rx.test(v)) {\n this.fail(path, `does not match ${rx.source}`);\n return null;\n }\n return v;\n }\n optStr(v: unknown, path: string, rx?: RegExp): string | null {\n return v === undefined || v === null ? null : this.str(v, path, rx);\n }\n text(v: unknown, path: string, max: number, optional: boolean): string | null {\n if (optional && (v === undefined || v === null)) return null;\n const s = this.str(v, path);\n if (s === null) return null;\n if (!s.trim()) this.fail(path, 'must not be empty');\n else if ([...s].length > max) this.fail(path, `is longer than ${max} characters`);\n return s;\n }\n int(v: unknown, path: string, lo: number, hi: number): number | null {\n if (typeof v === 'number' && Number.isInteger(v) && v >= lo && v <= hi) return v;\n this.fail(path, `must be an integer in ${lo}..${hi}`);\n return null;\n }\n oneOf<T extends string>(v: unknown, path: string, allowed: readonly T[]): T | null {\n if (typeof v === 'string' && (allowed as readonly string[]).includes(v)) return v as T;\n this.fail(path, `must be one of ${allowed.join(', ')}`);\n return null;\n }\n entry(v: unknown, path: string): TourEntry | null {\n if (v === null) return null;\n const o = this.obj(v, path);\n if (!o) return null;\n if (!isRoutePattern(o.route)) {\n this.fail(`${path}.route`, 'is not a same-origin, base-relative route pattern');\n return null;\n }\n return Object.freeze({ route: o.route });\n }\n stringMap(v: unknown, path: string, check: (key: string, value: unknown, p: string) => string | null): Record<string, string> {\n const out: Record<string, string> = {};\n const o = this.obj(v, path);\n if (!o) return out;\n for (const [key, value] of Object.entries(o)) {\n const s = check(key, value, `${path}.${key}`);\n if (s !== null) out[key] = s;\n }\n return Object.freeze(out);\n }\n}\n\nfunction header(c: Checker, root: Record<string, unknown>, kind: string): boolean {\n if (root.kind !== kind) c.fail('kind', `must be \"${kind}\"`);\n return c.ok;\n}\n\n/** Parse JSON text; an HTML body (an SPA fallback page) is a load failure, not bad data. */\nexport function parseJson(text: string): Result<unknown> {\n if (/^\\s*</.test(text)) {\n return { ok: false, reason: 'load-failed', issues: [{ path: '', message: 'received HTML (missing file or SPA fallback?)' }] };\n }\n try {\n return { ok: true, value: JSON.parse(text) as unknown };\n } catch (err) {\n return { ok: false, reason: 'invalid-data', issues: [{ path: '', message: `not JSON: ${String(err)}` }] };\n }\n}\n\nfunction schemaGate(raw: unknown): Result<Record<string, unknown>> {\n const c = new Checker();\n const root = c.obj(raw, '');\n if (!root) return { ok: false, reason: 'invalid-data', issues: c.issues };\n const schema = root.schema;\n if (typeof schema !== 'number' || !Number.isInteger(schema)) {\n return { ok: false, reason: 'invalid-data', issues: [{ path: 'schema', message: 'must be an integer' }] };\n }\n if (schema !== TOUR_SCHEMA_VERSION) {\n return {\n ok: false,\n reason: 'schema-unsupported',\n issues: [{ path: 'schema', message: `schema ${schema} is not supported (this overlay reads ${TOUR_SCHEMA_VERSION})` }],\n };\n }\n return { ok: true, value: root };\n}\n\nexport function validateManifest(raw: unknown): Result<TourManifest> {\n const gate = schemaGate(raw);\n if (!gate.ok) return gate;\n const root = gate.value;\n const c = new Checker();\n if (!header(c, root, TOURS_MANIFEST_KIND)) return { ok: false, reason: 'invalid-data', issues: c.issues };\n\n const buildId = isBuildId(root.buildId) ? root.buildId : (c.fail('buildId', 'is not a build id'), '');\n const testIdAttribute = c.str(root.testIdAttribute, 'testIdAttribute', RX.attr) ?? '';\n const locales: string[] = [];\n // Case and -/_ do not distinguish locales: ``fr-BE`` and ``fr_be`` name one file on most filesystems.\n const key = (l: string) => l.replace(/_/g, '-').toLowerCase();\n if (!Array.isArray(root.locales) || root.locales.length < 1 || root.locales.length > MAX_LOCALES) {\n c.fail('locales', `must list 1..${MAX_LOCALES} locales`);\n } else {\n root.locales.forEach((l, i) => {\n const s = c.str(l, `locales.${i}`, RX.locale);\n if (s !== null) locales.some((x) => key(x) === key(s)) ? c.fail(`locales.${i}`, 'is listed twice') : locales.push(s);\n });\n }\n const defaultLocale = c.str(root.defaultLocale, 'defaultLocale', RX.locale) ?? '';\n if (defaultLocale && !locales.includes(defaultLocale)) c.fail('defaultLocale', 'must be one of locales');\n\n let guideOrigin: string | null = null;\n if (root.guideOrigin !== undefined && root.guideOrigin !== null) {\n const s = c.str(root.guideOrigin, 'guideOrigin');\n if (s !== null && httpOrigin(s) !== s) c.fail('guideOrigin', 'must be an origin only (scheme://host[:port])');\n else guideOrigin = s;\n }\n\n let layouts: Record<string, string> | null = null;\n if (root.layouts !== undefined && root.layouts !== null) {\n layouts = c.stringMap(root.layouts, 'layouts', (name, query, p) => {\n if (!RX.layout.test(name)) return c.fail(p, 'is not a layout name'), null;\n if (typeof query !== 'string' || query.length > MAX_MEDIA_QUERY_CHARS || !RX.media.test(query)) {\n return c.fail(p, 'is not a media query'), null;\n }\n return query;\n });\n const n = Object.keys(layouts).length;\n if (n < 1 || n > MAX_LAYOUTS) c.fail('layouts', `must map 1..${MAX_LAYOUTS} layouts`);\n }\n\n const tours: ManifestTour[] = [];\n const seen = new Set<string>();\n if (!Array.isArray(root.tours) || root.tours.length > MAX_TOURS) {\n c.fail('tours', `must be a list of at most ${MAX_TOURS} tours`);\n } else {\n root.tours.forEach((t, i) => {\n const p = `tours.${i}`;\n const o = c.obj(t, p);\n if (!o) return;\n const id = c.str(o.id, `${p}.id`, RX.tourId);\n if (id !== null) {\n if (seen.has(id.toLowerCase())) c.fail(`${p}.id`, 'is not unique');\n seen.add(id.toLowerCase());\n }\n const inLocales = (key: string, path: string) => locales.includes(key) || (c.fail(path, 'is not one of locales'), false);\n const files = c.stringMap(o.files, `${p}.files`, (loc, name, fp) =>\n !inLocales(loc, fp) ? null : name !== `${id}.${loc}.json` ? (c.fail(fp, `must be \"${id}.${loc}.json\"`), null) : (name as string),\n );\n if (defaultLocale && !Object.hasOwn(files, defaultLocale)) c.fail(`${p}.files`, 'has no file for the default locale');\n const title = c.stringMap(o.title, `${p}.title`, (loc, v, tp) => (inLocales(loc, tp) ? c.text(v, tp, MAX_TITLE_CHARS, false) : null));\n // Every file carries its hash: a remote copy of it is fetched with that hash pinned.\n const integrity = c.stringMap(o.integrity, `${p}.integrity`, (loc, v, ip) =>\n !Object.hasOwn(files, loc) ? (c.fail(ip, 'has no matching file'), null) : c.str(v, ip, RX.sri),\n );\n for (const loc in files) if (!Object.hasOwn(integrity, loc)) c.fail(`${p}.integrity`, `has no hash for \"${loc}\"`);\n const tour: ManifestTour = Object.freeze({\n id: id ?? '',\n role: c.str(o.role, `${p}.role`, RX.role) ?? '',\n title,\n entry: c.entry(o.entry, `${p}.entry`),\n steps: c.int(o.steps, `${p}.steps`, 1, MAX_STEPS) ?? 0,\n files,\n integrity,\n });\n tours.push(tour);\n });\n }\n if (!c.ok) return { ok: false, reason: 'invalid-data', issues: c.issues };\n return {\n ok: true,\n value: Object.freeze({\n buildId,\n defaultLocale,\n locales: Object.freeze(locales),\n testIdAttribute,\n guideOrigin,\n layouts,\n tours: Object.freeze(tours),\n }),\n };\n}\n\nexport interface TourContext {\n manifest: TourManifest;\n entry: ManifestTour;\n locale: string;\n /** The guide origin this overlay trusts for ``guideUrl`` (null: none). */\n guideOrigin: string | null;\n}\n\nexport function validateTour(raw: unknown, ctx: TourContext): Result<TourFile> {\n const gate = schemaGate(raw);\n if (!gate.ok) return gate;\n const root = gate.value;\n const c = new Checker();\n if (!header(c, root, TOUR_FILE_KIND)) return { ok: false, reason: 'invalid-data', issues: c.issues };\n const { manifest, entry } = ctx;\n\n if (root.id !== entry.id) c.fail('id', `must be \"${entry.id}\"`);\n if (!isBuildId(root.buildId) || root.buildId !== manifest.buildId) c.fail('buildId', `must be the manifest's \"${manifest.buildId}\"`);\n if (root.locale !== ctx.locale) c.fail('locale', `must be \"${ctx.locale}\"`);\n const title = c.text(root.title, 'title', MAX_TITLE_CHARS, false) ?? '';\n\n let guideUrl: string | null = null;\n if (root.guideUrl !== undefined && root.guideUrl !== null) {\n const s = c.str(root.guideUrl, 'guideUrl');\n if (s !== null) {\n const origin = s.length <= MAX_URL_CHARS ? httpOrigin(s) : null;\n if (origin === null || ctx.guideOrigin === null || origin !== ctx.guideOrigin) {\n c.fail('guideUrl', 'must be an http(s) URL on the trusted guide origin');\n } else guideUrl = s;\n }\n }\n\n const tourEntry = root.entry === undefined ? (c.fail('entry', 'is required (null for none)'), null) : c.entry(root.entry, 'entry');\n if ((tourEntry?.route ?? null) !== (entry.entry?.route ?? null)) c.fail('entry', \"must equal the manifest's entry\");\n\n const steps: TourStep[] = [];\n const ids = new Set<string>();\n const layoutNames = Object.keys(manifest.layouts ?? {});\n if (!Array.isArray(root.steps) || root.steps.length !== entry.steps || root.steps.length > MAX_STEPS) {\n c.fail('steps', `must be a list of exactly ${entry.steps} steps`);\n } else {\n root.steps.forEach((s, i) => {\n const p = `steps.${i}`;\n const o = c.obj(s, p);\n if (!o) return;\n const id = c.str(o.id, `${p}.id`, RX.stepId) ?? '';\n if (ids.has(id)) c.fail(`${p}.id`, 'is not unique');\n ids.add(id);\n const target = o.target === null ? null : c.str(o.target, `${p}.target`, RX.testId);\n const advanceObj = c.obj(o.advance, `${p}.advance`);\n const advance = advanceObj ? c.oneOf(advanceObj.on, `${p}.advance.on`, ADVANCE_KINDS) : null;\n if (advance && (TARGETED_ADVANCE_KINDS as readonly string[]).includes(advance) && target === null) {\n c.fail(`${p}.target`, `is required for advance \"${advance}\"`);\n }\n let layouts: string[] | null = null;\n if (o.layouts !== undefined && o.layouts !== null) {\n if (!Array.isArray(o.layouts) || o.layouts.length < 1 || o.layouts.length > MAX_LAYOUTS) {\n c.fail(`${p}.layouts`, `must list 1..${MAX_LAYOUTS} layouts`);\n } else {\n layouts = o.layouts.filter((l): l is string => typeof l === 'string' && layoutNames.includes(l));\n if (layouts.length !== o.layouts.length) c.fail(`${p}.layouts`, \"must name the manifest's layouts\");\n }\n }\n steps.push(\n Object.freeze({\n id,\n target,\n advance: advance ?? 'manual',\n waitFor: c.optStr(o.waitFor, `${p}.waitFor`, RX.testId),\n title: c.text(o.title, `${p}.title`, MAX_TITLE_CHARS, true),\n text: c.text(o.text, `${p}.text`, MAX_TEXT_CHARS, true),\n placement: o.placement === undefined || o.placement === null ? null : c.oneOf(o.placement, `${p}.placement`, PLACEMENTS),\n layouts: layouts && Object.freeze(layouts),\n }),\n );\n });\n }\n if (!c.ok) return { ok: false, reason: 'invalid-data', issues: c.issues };\n return {\n ok: true,\n value: Object.freeze({\n id: entry.id,\n buildId: manifest.buildId,\n locale: ctx.locale,\n title,\n guideUrl,\n entry: tourEntry,\n steps: Object.freeze(steps),\n }),\n };\n}\n","/**\n * Loads a tour: the manifest(s), then the tour file for the best locale.\n *\n * Two manifests can be configured. ``fallbackManifest`` is the copy bundled\n * with the app (same origin only). ``manifest`` may point at a remote guide\n * site and may contain ``{buildId}``, filled with the app's build id — the\n * host's ``buildId`` property, else the bundled manifest's — so remote mode\n * only ever fetches the tours of the app's own build. The remote copy is\n * tried first and the bundled copy is the fallback; a remote failure is only\n * logged.\n *\n * Cross-origin requests send no credentials, refuse redirects, and pass the\n * bundled manifest's SRI hash when both copies are the same build, so a\n * tampered remote file is rejected by the browser. Every body is read with a\n * byte cap and an HTML sniff (an SPA answering a missing JSON file with its\n * index page is a load failure, not bad data). Nothing a cross-origin\n * manifest says widens what the bundled one allows: when the bundled manifest\n * is for the same build, any other manifest (remote, or a same-origin proxy)\n * only locates files — the tour, the locale and the SRI hash all come from the\n * bundle, so a tour, locale or case variant the bundle does not pin is never\n * fetched from it.\n */\n\nimport { lookupLocale } from '../ui/strings.js';\nimport { MAX_MANIFEST_BYTES, MAX_TOUR_FILE_BYTES } from './contract.js';\nimport type { TourSourceKind } from './engine.js';\nimport {\n httpOrigin,\n parseJson,\n validateManifest,\n validateTour,\n type FailReason,\n type Issue,\n type ManifestTour,\n type Result,\n type TourFile,\n type TourManifest,\n} from './validate.js';\n\nexport type TourSource = (\n tourId: string,\n locale: string,\n ctx: { buildId: string; manifestUrl: string },\n) => Promise<string | Response | object> | string | Response | object;\n\nexport interface LoaderConfig {\n manifest: string;\n fallbackManifest: string;\n buildId: string;\n /** The locale asked for (host ``locale``, else the page's ``lang``). */\n locale: string;\n /** The host's ``guide-origin``: the only origin trusted without a manifest's say-so. */\n guideOrigin: string;\n source?: TourSource | null;\n fetch?: typeof fetch;\n origin?: string;\n baseURI?: string;\n timeoutMs?: number;\n /** Manifests per resolved URL, kept by the host for the page's lifetime. */\n cache?: Map<string, Promise<ManifestLoad>>;\n}\n\nexport interface LoadOk {\n ok: true;\n manifest: TourManifest;\n manifestUrl: string;\n tour: TourFile;\n locale: string;\n source: TourSourceKind;\n testIdAttribute: string;\n guideOrigin: string | null;\n}\n\nexport interface LoadErr {\n ok: false;\n reason: FailReason;\n message: string;\n issues?: Issue[];\n}\n\nexport type ManifestLoad = (Result<TourManifest> & { url: string }) | (LoadErr & { url: string });\n\nconst RANK: Record<FailReason, number> = { 'load-failed': 0, 'invalid-data': 1, 'schema-unsupported': 2 };\n\nclass LoadError extends Error {\n constructor(\n readonly reason: FailReason,\n message: string,\n ) {\n super(message);\n }\n}\n\n/** Exact tag, then its base language, then the manifest's default, then the first file. */\nexport function pickLocale(available: readonly string[], requested: string, fallback: string): string {\n return lookupLocale(available, requested) ?? (available.includes(fallback) ? fallback : available[0]!);\n}\n\n/** The body as text, refusing more than ``cap`` bytes and invalid UTF-8. */\nexport async function readCapped(res: Response, cap: number): Promise<string> {\n if (!res.ok) throw new LoadError('load-failed', `HTTP ${res.status}`);\n const declared = Number(res.headers.get('content-length') ?? NaN);\n if (declared > cap) throw new LoadError('invalid-data', `the file is larger than ${cap} bytes`);\n const decoder = new TextDecoder('utf-8', { fatal: true });\n const decode = (bytes: Uint8Array) => {\n try {\n return decoder.decode(bytes);\n } catch {\n throw new LoadError('invalid-data', 'the file is not valid UTF-8');\n }\n };\n if (!res.body) {\n const bytes = new Uint8Array(await res.arrayBuffer());\n if (bytes.byteLength > cap) throw new LoadError('invalid-data', `the file is larger than ${cap} bytes`);\n return decode(bytes);\n }\n const reader = res.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > cap) {\n void reader.cancel();\n throw new LoadError('invalid-data', `the file is larger than ${cap} bytes`);\n }\n chunks.push(value);\n }\n const all = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n all.set(c, offset);\n offset += c.byteLength;\n }\n return decode(all);\n}\n\nexport async function loadTour(cfg: LoaderConfig, tourId: string): Promise<LoadOk | LoadErr> {\n const origin = cfg.origin ?? location.origin;\n const baseURI = cfg.baseURI ?? document.baseURI;\n const doFetch = cfg.fetch ?? globalThis.fetch.bind(globalThis);\n const cache = cfg.cache ?? new Map<string, Promise<ManifestLoad>>();\n const abs = (u: string) => new URL(u, baseURI);\n const cross = (u: string) => abs(u).origin !== origin;\n const timeoutMs = cfg.timeoutMs ?? 10_000;\n\n async function get(url: string, kind: 'manifest' | 'tour', integrity?: string): Promise<string> {\n const isCross = cross(url);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const init: RequestInit = {\n credentials: isCross ? 'omit' : 'same-origin',\n mode: isCross ? 'cors' : 'same-origin',\n redirect: isCross ? 'error' : 'follow',\n cache: kind === 'manifest' || !isCross ? 'no-cache' : 'default',\n signal: controller.signal,\n };\n if (integrity) init.integrity = integrity;\n let res: Response;\n try {\n res = await doFetch(abs(url).href, init);\n } catch (err) {\n throw new LoadError('load-failed', `could not fetch ${url}: ${String(err)}`);\n }\n return await readCapped(res, kind === 'manifest' ? MAX_MANIFEST_BYTES : MAX_TOUR_FILE_BYTES);\n } finally {\n clearTimeout(timer);\n }\n }\n\n function getManifest(url: string): Promise<ManifestLoad> {\n const key = abs(url).href;\n let pending = cache.get(key);\n if (!pending) {\n pending = (async (): Promise<ManifestLoad> => {\n try {\n const parsed = parseJson(await get(url, 'manifest'));\n const r = parsed.ok ? validateManifest(parsed.value) : parsed;\n return { ...r, url: key } as ManifestLoad;\n } catch (err) {\n const e = err instanceof LoadError ? err : new LoadError('load-failed', String(err));\n // A network blip is not the manifest's answer: the next start() asks again.\n if (e.reason === 'load-failed') cache.delete(key);\n return { ok: false, reason: e.reason, message: e.message, url: key };\n }\n })();\n cache.set(key, pending);\n }\n return pending;\n }\n\n const errors: LoadErr[] = [];\n const failed = (r: { ok: false; reason: FailReason; issues?: Issue[]; message?: string }, what: string) =>\n errors.push({ ok: false, reason: r.reason, message: r.message ?? `${what}: ${r.issues?.[0]?.path ?? ''} ${r.issues?.[0]?.message ?? ''}`.trim(), issues: r.issues });\n\n let bundled: (TourManifest & { url: string }) | null = null;\n if (cfg.fallbackManifest) {\n if (cross(cfg.fallbackManifest)) {\n errors.push({ ok: false, reason: 'load-failed', message: 'fallbackManifest must be same-origin' });\n } else {\n const r = await getManifest(cfg.fallbackManifest);\n if (r.ok) bundled = { ...r.value, url: r.url };\n else failed(r, 'bundled manifest');\n }\n }\n\n const expected = cfg.buildId || bundled?.buildId || '';\n let primary: (TourManifest & { url: string }) | null = null;\n if (cfg.manifest) {\n if (cfg.manifest.includes('{buildId}') && !expected) {\n errors.push({ ok: false, reason: 'load-failed', message: 'the manifest URL needs a build id ({buildId}) and none is known' });\n } else {\n const r = await getManifest(cfg.manifest.split('{buildId}').join(encodeURIComponent(expected)));\n if (!r.ok) failed(r, 'manifest');\n else if (expected && r.value.buildId !== expected) {\n errors.push({ ok: false, reason: 'invalid-data', message: `the manifest is for build \"${r.value.buildId}\", expected \"${expected}\"` });\n } else primary = { ...r.value, url: r.url };\n if (!r.ok && bundled) console.warn(`[steppy-tour] remote manifest unavailable, using the bundled copy: ${errors.at(-1)?.message}`);\n }\n }\n if (!cfg.manifest && !cfg.fallbackManifest) {\n return { ok: false, reason: 'load-failed', message: 'no manifest is configured (set manifest or fallback-manifest)' };\n }\n\n const remoteOrigin = primary ? new URL(primary.url).origin : null;\n const guideOrigin =\n (cfg.guideOrigin && (httpOrigin(cfg.guideOrigin) ?? cfg.guideOrigin)) ||\n bundled?.guideOrigin ||\n (primary && (!cross(primary.url) || primary.guideOrigin === remoteOrigin) ? primary.guideOrigin : null);\n\n for (const m of [primary, bundled]) {\n if (!m) continue;\n // A manifest that is not the bundled one but is for its build only says\n // where the files are: the bundle picks the tour, the locale and the hash.\n // Keyed on \"not the bundled manifest\" rather than \"cross-origin\", so a\n // same-origin proxy in front of a guide site is pinned too.\n const ref = m !== bundled && bundled?.buildId === m.buildId ? bundled : m;\n const entry: ManifestTour | undefined = ref.tours.find((t) => t.id === tourId);\n if (!entry) {\n errors.push({ ok: false, reason: 'load-failed', message: `no tour \"${tourId}\" in ${ref.url}` });\n } else {\n const locale = pickLocale(Object.keys(entry.files), cfg.locale, ref.defaultLocale);\n const isCross = cross(m.url);\n const integrity = ref !== m || isCross ? entry.integrity[locale] : undefined;\n try {\n let raw: unknown;\n if (cfg.source) {\n const got = await cfg.source(tourId, locale, { buildId: m.buildId, manifestUrl: m.url });\n if (typeof got === 'string' || got instanceof Response) {\n const text = typeof got === 'string' ? got : await readCapped(got, MAX_TOUR_FILE_BYTES);\n if (new TextEncoder().encode(text).byteLength > MAX_TOUR_FILE_BYTES) throw new LoadError('invalid-data', 'the tour file is too large');\n const parsed = parseJson(text);\n if (!parsed.ok) throw new LoadError(parsed.reason, parsed.issues[0]?.message ?? '');\n raw = parsed.value;\n } else raw = got;\n } else {\n const parsed = parseJson(await get(new URL(entry.files[locale]!, m.url).href, 'tour', integrity));\n if (!parsed.ok) throw new LoadError(parsed.reason, parsed.issues[0]?.message ?? '');\n raw = parsed.value;\n }\n const v = validateTour(raw, { manifest: ref, entry, locale, guideOrigin });\n if (v.ok) {\n return {\n ok: true,\n manifest: ref,\n manifestUrl: m.url,\n tour: v.value,\n locale,\n source: cfg.source ? 'custom' : m === primary && isCross ? 'remote' : 'bundled',\n testIdAttribute: bundled?.testIdAttribute ?? m.testIdAttribute,\n guideOrigin,\n };\n }\n failed(v, `tour ${tourId} (${locale})`);\n } catch (err) {\n const e = err instanceof LoadError ? err : new LoadError('load-failed', String(err));\n errors.push({ ok: false, reason: e.reason, message: e.message });\n }\n }\n if (m === primary && bundled) console.warn(`[steppy-tour] remote tour rejected, trying the bundled copy: ${errors.at(-1)?.message}`);\n }\n return errors.reduce((best, e) => (RANK[e.reason] > RANK[best.reason] ? e : best), errors[0] ?? {\n ok: false,\n reason: 'load-failed',\n message: `tour \"${tourId}\" could not be loaded`,\n });\n}\n","/**\n * Test-id resolution: ``[data-testid=\"<id>\"]`` (the manifest's attribute)\n * against the document — light DOM only — skipping the overlay itself, first\n * *visible* match wins.\n *\n * Waiting is event-driven and only runs while the tour needs an element: a\n * document MutationObserver (filtered to attributes that can change\n * visibility, coalesced to one check per frame) plus a slow poll for changes\n * no mutation reports (a stylesheet swap, a CSS transition finishing). Time\n * spent in a background tab does not count against the deadline.\n */\n\nimport type { DomAdapter } from './dom.js';\n\nconst POLL_MS = 250;\nconst MAX_MATCHES = 500;\n\nexport interface WaitRequest {\n ids: readonly string[];\n /** Milliseconds to wait, or null for no deadline. */\n timeoutMs: number | null;\n onFound(found: Map<string, Element>): void;\n /** Called with the first id still missing. */\n onTimeout(missing: string): void;\n}\n\nexport interface Resolver {\n find(id: string): Element | null;\n /** Start waiting; returns the cancel function. */\n wait(req: WaitRequest): () => void;\n}\n\nexport function createResolver(opts: { attr: string; host: Element; dom: DomAdapter }): Resolver {\n const { attr, host, dom } = opts;\n const s = dom.scheduler;\n\n function find(id: string): Element | null {\n const selector = `[${attr}=\"${CSS.escape(id)}\"]`;\n const all = document.querySelectorAll(selector);\n for (let i = 0; i < all.length && i < MAX_MATCHES; i++) {\n const el = all[i]!;\n if (el === host || host.contains(el)) continue;\n if (dom.isVisible(el)) return el;\n }\n return null;\n }\n\n function wait(req: WaitRequest): () => void {\n let done = false;\n let frame = 0;\n let hiddenSince: number | null = document.hidden ? s.now() : null;\n let hiddenTotal = 0;\n const started = s.now();\n const attributeFilter = [attr, 'class', 'style', 'hidden', 'open', 'aria-hidden', 'aria-expanded'];\n\n const check = (): boolean => {\n frame = 0;\n if (done) return true;\n const found = new Map<string, Element>();\n let missing: string | null = null;\n for (const id of req.ids) {\n const el = find(id);\n if (el) found.set(id, el);\n else if (missing === null) missing = id;\n }\n if (missing === null) {\n stop();\n req.onFound(found);\n return true;\n }\n if (req.timeoutMs !== null) {\n const hidden = hiddenSince !== null ? s.now() - hiddenSince : 0;\n if (hiddenSince === null && s.now() - started - hiddenTotal - hidden >= req.timeoutMs) {\n stop();\n req.onTimeout(missing);\n return true;\n }\n }\n return false;\n };\n const schedule = () => {\n if (!frame && !done) frame = s.raf(check);\n };\n const onVisibility = () => {\n if (document.hidden) hiddenSince ??= s.now();\n else if (hiddenSince !== null) {\n hiddenTotal += s.now() - hiddenSince;\n hiddenSince = null;\n }\n };\n const observer = new MutationObserver(schedule);\n const poll = s.setInterval(() => check(), POLL_MS);\n function stop() {\n done = true;\n observer.disconnect();\n s.clearInterval(poll);\n if (frame) s.cancelRaf(frame);\n document.removeEventListener('visibilitychange', onVisibility);\n }\n\n if (!check()) {\n observer.observe(document.documentElement, { childList: true, subtree: true, attributes: true, attributeFilter });\n document.addEventListener('visibilitychange', onVisibility);\n }\n return stop;\n }\n\n return { find, wait };\n}\n","/**\n * Entry routes: match the current location against a tour's ``entry.route``\n * (``/invoices/:invoiceId``), fill its parameters, and translate between app\n * paths (relative to ``<base href>``) and document paths.\n *\n * The compiler strips the app's full URL (path included), so routes are\n * base-relative; an app served under ``/app/`` has documents at\n * ``/app/invoices`` for the route ``/invoices``. Both forms of the current\n * path are tried, so an app without a base element works either way.\n */\n\nexport type RouteParams = Record<string, string>;\n\nconst PARAM = /^:([A-Za-z_][A-Za-z0-9_]{0,63})$/;\n\nfunction segments(path: string): string[] {\n const trimmed = path.length > 1 && path.endsWith('/') ? path.slice(0, -1) : path;\n return trimmed === '/' ? [] : trimmed.split('/').slice(1);\n}\n\n/** Parameters of ``path`` under ``pattern``, or null when it does not match. */\nexport function matchRoute(pattern: string, path: string): RouteParams | null {\n const want = segments(pattern);\n const have = segments(path);\n if (want.length !== have.length) return null;\n const params: RouteParams = {};\n for (let i = 0; i < want.length; i++) {\n const param = PARAM.exec(want[i]!);\n if (!param) {\n if (want[i] !== have[i]) return null;\n continue;\n }\n if (!have[i]) return null;\n try {\n params[param[1]!] = decodeURIComponent(have[i]!);\n } catch {\n return null;\n }\n }\n return params;\n}\n\n/** The route's names, in order (``/a/:x/b/:y`` -> ``['x', 'y']``). */\nexport function routeParams(pattern: string): string[] {\n return segments(pattern).flatMap((seg) => {\n const m = PARAM.exec(seg);\n return m ? [m[1]!] : [];\n });\n}\n\n/** ``pattern`` with its parameters filled (URI-encoded), or the names missing a value. */\nexport function buildRoute(pattern: string, params: Record<string, unknown>): { path: string } | { missing: string[] } {\n const missing = routeParams(pattern).filter((name) => params[name] === undefined || params[name] === null || String(params[name]) === '');\n if (missing.length) return { missing };\n const path = segments(pattern)\n .map((seg) => {\n const m = PARAM.exec(seg);\n return m ? encodeURIComponent(String(params[m[1]!])) : seg;\n })\n .join('/');\n return { path: `/${path}` };\n}\n\n/** The document's base path (``/`` or ``/app/``); ``/`` when the base is cross-origin. */\nexport function basePath(baseURI: string, origin: string): string {\n try {\n const url = new URL(baseURI);\n if (url.origin !== origin) return '/';\n const dir = url.pathname.endsWith('/') ? url.pathname : url.pathname.replace(/[^/]*$/, '');\n return dir || '/';\n } catch {\n return '/';\n }\n}\n\n/** ``/app/invoices`` under base ``/app/`` -> ``/invoices``; paths outside the base are unchanged. */\nexport function toAppPath(documentPath: string, base: string): string {\n if (base === '/' || !documentPath.startsWith(base.slice(0, -1))) return documentPath;\n const rest = documentPath.slice(base.length - 1);\n if (rest !== '' && !rest.startsWith('/')) return documentPath;\n return rest || '/';\n}\n\n/** ``/invoices`` under base ``/app/`` -> ``/app/invoices``. */\nexport function toDocumentPath(appPath: string, base: string): string {\n return base === '/' ? appPath : base.slice(0, -1) + appPath;\n}\n\n/**\n * A link target the tour may follow in the same tab: a site-relative path —\n * not protocol-relative (``//host``, ``/\\host``), no backslash, whitespace or\n * control characters.\n */\nexport function isSafeRelativeUrl(url: string): boolean {\n return /^\\/(?![/\\\\])/.test(url) && !/[\\\\\\s\\u0000-\\u001f\\u007f]/.test(url);\n}\n\n/**\n * The same-tab href for a link in step text, or null. The URL is normalised\n * first and the *result* checked: dot segments (``/.//host``, ``/a/..//host``,\n * ``/%2e%2e//host``) collapse into a protocol-relative ``//host``, which the raw\n * string never looked like.\n */\nexport function linkHref(url: string, base: string, origin: string): string | null {\n if (!isSafeRelativeUrl(url)) return null;\n try {\n const u = new URL(url, origin);\n const href = toDocumentPath(u.pathname, base) + u.search + u.hash;\n return isSafeRelativeUrl(href) && new URL(href, origin).origin === origin ? href : null;\n } catch {\n return null;\n }\n}\n","/**\n * Readers for the ``input`` and ``change`` advance kinds.\n *\n * ``valueSignature`` summarises everything a \"pick a value\" widget can change:\n * native controls inside the target, ARIA state, and the visible label. A\n * component library that sets a value programmatically fires no ``change``\n * event (PrimeNG's select does exactly that), so the overlay compares\n * signatures instead of listening for the event.\n */\n\nconst CONTROLS = 'input,select,textarea';\nconst ARIA = '[aria-checked],[aria-pressed],[aria-selected]';\nconst LIMIT = 50;\n\nfunction controlSig(el: Element): string {\n if (el instanceof HTMLInputElement) {\n if (el.type === 'checkbox' || el.type === 'radio') return `c:${el.checked}`;\n if (el.type === 'file') return `f:${el.files?.length ?? 0}`;\n return `v:${el.value}`;\n }\n if (el instanceof HTMLSelectElement) {\n return `s:${el.multiple ? [...el.options].filter((o) => o.selected).map((o) => o.value).join('|') : el.value}`;\n }\n if (el instanceof HTMLTextAreaElement) return `v:${el.value}`;\n return '';\n}\n\nexport function valueSignature(target: Element): string {\n const controls = [...(target.matches(CONTROLS) ? [target] : []), ...[...target.querySelectorAll(CONTROLS)].slice(0, LIMIT)];\n const aria = [...(target.matches(ARIA) ? [target] : []), ...[...target.querySelectorAll(ARIA)].slice(0, LIMIT)].map(\n (el) =>\n `a:${el.getAttribute('aria-checked') ?? ''}${el.getAttribute('aria-pressed') ?? ''}${el.getAttribute('aria-selected') ?? ''}`,\n );\n const text = `t:${(target.textContent ?? '').replace(/\\s+/g, ' ').trim().slice(0, 500)}`;\n return [...controls.map(controlSig), ...aria, text].join('\\u0001');\n}\n\n/** True while the target, or anything in it, reports an open popup (a dropdown in use). */\nexport function isExpanded(target: Element): boolean {\n return target.matches('[aria-expanded=\"true\"]') || target.querySelector('[aria-expanded=\"true\"]') !== null;\n}\n\nfunction editableText(el: Element): string | null {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) return el.value;\n const editable = el.getAttribute('contenteditable');\n if (el instanceof HTMLElement && (el.isContentEditable || (editable !== null && editable !== 'false'))) {\n return el.textContent ?? '';\n }\n return null;\n}\n\n/** The value an ``input`` step watches: the target's own, else its first field. */\nexport function readFieldValue(target: Element): string {\n const own = editableText(target);\n if (own !== null) return own;\n const inner = target.querySelector(`${CONTROLS},[contenteditable]:not([contenteditable=\"false\"])`);\n return (inner && editableText(inner)) ?? '';\n}\n\n/** A select-like widget, whose popup the bubble should leave room for (placed on top). */\nexport function isComboboxLike(target: Element): boolean {\n const q = 'select,[role=combobox],[aria-haspopup]:not([aria-haspopup=\"false\"])';\n return target.matches(q) || target.querySelector(q) !== null;\n}\n","/**\n * The resume record: which step of which tour is running, kept in\n * ``sessionStorage`` so a full page load (a classic form post, a link the app\n * does not route) picks the tour up where it was. Per tab by design.\n *\n * Every access is wrapped: storage throws in private modes and sandboxed\n * frames, and a tour must keep working without it.\n */\n\nimport { TOUR_RESUME_STORAGE_KEY } from '../ui/names.js';\n\nexport const RESUME_TTL_MS = 30 * 60 * 1000;\n\nexport interface ResumeRecord {\n v: 1;\n tourId: string;\n stepId: string;\n locale: string;\n params: Record<string, string>;\n buildId: string;\n /** The manifest URL(s) the record was made with; another host config ignores it. */\n manifestKey: string;\n savedAt: number;\n}\n\nfunction store(): Storage | null {\n try {\n return globalThis.sessionStorage ?? null;\n } catch {\n return null;\n }\n}\n\nexport function writeResume(record: ResumeRecord): void {\n try {\n store()?.setItem(TOUR_RESUME_STORAGE_KEY, JSON.stringify(record));\n } catch {\n // Quota or access errors: the tour simply will not resume.\n }\n}\n\nexport function clearResume(): void {\n try {\n store()?.removeItem(TOUR_RESUME_STORAGE_KEY);\n } catch {\n // Nothing to clean up then.\n }\n}\n\n/**\n * The stored record when it is well formed, fresh and made for ``manifestKey``.\n * A malformed or expired record is removed; one made by another host\n * configuration is left for that host.\n */\nexport function readResume(manifestKey: string, now: number): ResumeRecord | null {\n let raw: string | null = null;\n try {\n raw = store()?.getItem(TOUR_RESUME_STORAGE_KEY) ?? null;\n } catch {\n return null;\n }\n if (!raw) return null;\n let r: Partial<ResumeRecord> | null = null;\n try {\n r = JSON.parse(raw) as Partial<ResumeRecord>;\n } catch {\n // Unreadable: dropped below.\n }\n const fresh = typeof r?.savedAt === 'number' && now - r.savedAt >= 0 && now - r.savedAt < RESUME_TTL_MS;\n const shaped =\n r !== null &&\n typeof r === 'object' &&\n r.v === 1 &&\n typeof r.tourId === 'string' &&\n typeof r.stepId === 'string' &&\n typeof r.locale === 'string' &&\n typeof r.buildId === 'string' &&\n r.params !== null &&\n typeof r.params === 'object' &&\n Object.values(r.params).every((v) => typeof v === 'string');\n if (!shaped || !fresh) {\n clearResume();\n return null;\n }\n return r!.manifestKey === manifestKey ? (r as ResumeRecord) : null;\n}\n","/**\n * The overlay's chrome strings. They resolve against the *loaded tour file's*\n * locale, never the page's, so the buttons and the step text are always in\n * one language. ``next`` and ``progress`` are the guide player's words\n * (``ui/strings.ts``); a host overrides any key per locale with ``strings``.\n *\n * The ``instruction*`` keys are the generic hint a step shows when its\n * scenario authored no text for that locale (the compiler warns about each).\n */\n\nimport { CHROME_STRINGS, resolveStrings } from '../ui/strings.js';\nimport type { AdvanceKind } from './contract.js';\n\nexport interface TourStrings {\n next: string;\n /** Placeholders: ``{current}`` and ``{total}``. */\n progress: string;\n /** The primary button on the last step. */\n done: string;\n close: string;\n skipStep: string;\n endTour: string;\n resume: string;\n paused: string;\n dialogLabel: string;\n openGuide: string;\n notFoundTitle: string;\n notFoundBody: string;\n instructionClick: string;\n instructionInput: string;\n instructionChange: string;\n instructionVisible: string;\n instructionManual: string;\n}\n\nexport type TourStringOverrides = Partial<Record<string, Partial<TourStrings>>>;\n\nexport const DEFAULT_TOUR_STRINGS: Record<string, TourStrings> = {\n en: {\n ...CHROME_STRINGS.en,\n done: 'Done',\n close: 'Close the tour',\n skipStep: 'Skip this step',\n endTour: 'End the tour',\n resume: 'Resume tour',\n paused: 'Tour paused',\n dialogLabel: 'Guided tour',\n openGuide: 'Open the full guide',\n notFoundTitle: \"Can't find this element\",\n notFoundBody: 'The page may have changed. Skip this step or end the tour.',\n instructionClick: 'Click the highlighted element.',\n instructionInput: 'Fill in the highlighted field.',\n instructionChange: 'Choose a value in the highlighted field.',\n instructionVisible: 'Wait for the highlighted element to appear.',\n instructionManual: 'Select Next to continue.',\n },\n fr: {\n ...CHROME_STRINGS.fr,\n done: 'Terminer',\n close: 'Fermer la visite',\n skipStep: 'Passer cette étape',\n endTour: 'Terminer la visite',\n resume: 'Reprendre la visite',\n paused: 'Visite en pause',\n dialogLabel: 'Visite guidée',\n openGuide: 'Ouvrir le guide complet',\n notFoundTitle: 'Élément introuvable',\n notFoundBody: 'La page a peut-être changé. Passez cette étape ou terminez la visite.',\n instructionClick: \"Cliquez sur l'élément mis en évidence.\",\n instructionInput: 'Remplissez le champ mis en évidence.',\n instructionChange: 'Choisissez une valeur dans le champ mis en évidence.',\n instructionVisible: \"Attendez que l'élément mis en évidence apparaisse.\",\n instructionManual: 'Sélectionnez Suivant pour continuer.',\n },\n nl: {\n ...CHROME_STRINGS.nl,\n done: 'Klaar',\n close: 'Rondleiding sluiten',\n skipStep: 'Deze stap overslaan',\n endTour: 'Rondleiding beëindigen',\n resume: 'Rondleiding hervatten',\n paused: 'Rondleiding gepauzeerd',\n dialogLabel: 'Rondleiding',\n openGuide: 'Volledige gids openen',\n notFoundTitle: 'Dit element is niet gevonden',\n notFoundBody: 'De pagina is mogelijk gewijzigd. Sla deze stap over of beëindig de rondleiding.',\n instructionClick: 'Klik op het gemarkeerde element.',\n instructionInput: 'Vul het gemarkeerde veld in.',\n instructionChange: 'Kies een waarde in het gemarkeerde veld.',\n instructionVisible: 'Wacht tot het gemarkeerde element verschijnt.',\n instructionManual: 'Kies Volgende om verder te gaan.',\n },\n de: {\n ...CHROME_STRINGS.de,\n done: 'Fertig',\n close: 'Tour schließen',\n skipStep: 'Diesen Schritt überspringen',\n endTour: 'Tour beenden',\n resume: 'Tour fortsetzen',\n paused: 'Tour pausiert',\n dialogLabel: 'Geführte Tour',\n openGuide: 'Vollständige Anleitung öffnen',\n notFoundTitle: 'Element nicht gefunden',\n notFoundBody: 'Die Seite hat sich möglicherweise geändert. Überspringen Sie diesen Schritt oder beenden Sie die Tour.',\n instructionClick: 'Klicken Sie auf das hervorgehobene Element.',\n instructionInput: 'Füllen Sie das hervorgehobene Feld aus.',\n instructionChange: 'Wählen Sie im hervorgehobenen Feld einen Wert aus.',\n instructionVisible: 'Warten Sie, bis das hervorgehobene Element erscheint.',\n instructionManual: 'Wählen Sie Weiter, um fortzufahren.',\n },\n};\n\nexport function resolveTourStrings(contentLocale: string, overrides?: TourStringOverrides): TourStrings {\n return resolveStrings(DEFAULT_TOUR_STRINGS, contentLocale, overrides, 'en');\n}\n\n/**\n * Writing direction of a locale tag: a script subtag decides (``az-Arab``,\n * ``sd-Deva``), else the language. Set on the overlay with ``lang``, so a tour\n * shown in another language than the page is read and laid out as its own.\n */\nexport function textDir(tag: string): 'rtl' | 'ltr' {\n const [lang, sub = ''] = tag.toLowerCase().split(/[-_]/);\n const rtl = /^[a-z]{4}$/.test(sub) ? /^(arab|hebr|thaa|syrc|nkoo|adlm|rohg)$/.test(sub) : /^(ar|he|iw|fa|ur|ps|sd|ug|yi|ckb|dv)$/.test(lang!);\n return rtl ? 'rtl' : 'ltr';\n}\n\nconst INSTRUCTION: Record<AdvanceKind, keyof TourStrings> = {\n click: 'instructionClick',\n input: 'instructionInput',\n change: 'instructionChange',\n visible: 'instructionVisible',\n manual: 'instructionManual',\n};\n\n/** The generic hint for a step without authored text. */\nexport function instructionFor(kind: AdvanceKind, strings: TourStrings): string {\n return strings[INSTRUCTION[kind]];\n}\n","/**\n * Default look values shared by the guide player and the in-app tour overlay.\n *\n * Constants only, never data: they are interpolated into the ``css`` tagged\n * templates with ``cssValue`` (Lit's ``unsafeCSS``), which concatenates the\n * value verbatim — ``baseStyles.cssText`` is byte-identical to the literal\n * stylesheet it replaced (guard: ``test/ui/guide-styles-stable.test.ts``).\n */\n\nimport { unsafeCSS, type CSSResult } from 'lit';\n\n/** The guide's palette (``--steppy-*`` defaults in ``templates/base-styles.ts``). */\nexport const PALETTE = {\n bg: '#f4f1ea',\n surface: '#fbf9f4',\n chromeBg: '#efece3',\n fg: '#1f1d1a',\n muted: '#8a857c',\n border: '#e1ddd1',\n accent: '#d24f2c',\n accentWeak: 'rgba(210, 79, 44, 0.35)',\n success: '#3a7d44',\n} as const;\n\n/** System font stacks only: offline, no CDN. */\nexport const FONTS = {\n serif: \"ui-serif, Georgia, 'Times New Roman', serif\",\n sans: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n mono: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n} as const;\n\n/** The dark bubble both players draw next to a target (guide tooltip, tour popover). */\nexport const BUBBLE_LOOK = {\n padding: '8px 12px',\n radius: '6px',\n maxWidth: '280px',\n fontSize: '14px',\n lineHeight: '1.4',\n shadow: '0 4px 12px rgba(0, 0, 0, 0.2)',\n} as const;\n\nexport const BUTTON_LOOK = {\n radius: '4px',\n padding: '4px 10px',\n} as const;\n\n/**\n * Tour overlay defaults. The accent differs from the guide's on purpose:\n * ``#d24f2c`` measures 4.29:1 against white text, below WCAG AA for the\n * overlay's buttons; ``#a8410e`` measures 6.13:1 (guard: ``test/tour/small-modules.test.ts``).\n */\nexport const TOUR_DEFAULTS = {\n bubbleBg: PALETTE.fg,\n bubbleFg: PALETTE.surface,\n muted: '#c9c5bd',\n accent: '#a8410e',\n accentFg: '#ffffff',\n focus: '#f09a6a',\n scrim: 'rgba(31, 29, 26, 0.45)',\n radius: BUBBLE_LOOK.radius,\n} as const;\n\n/** A token value inside a ``css`` template (inserted verbatim, never data). */\nexport const cssValue = (value: string | number): CSSResult => unsafeCSS(value);\n","/**\n * Overlay styles. Theming goes through public ``--steppy-*`` custom\n * properties, read into private ``--_pw-*`` ones on ``:host`` and never\n * declared themselves — so a page sets them on ``:root`` or on the element.\n * Geometry comes from properties the tracker writes through CSSOM.\n *\n * Defaults meet WCAG AA (guard: ``test/tour/small-modules.test.ts``). The bubble\n * inherits the app's font unless ``--steppy-font-family`` is set. The\n * bubble's inner layout uses logical properties, so it mirrors under the\n * layer's ``dir`` (an Arabic or Hebrew tour); its placement around the target\n * stays physical.\n */\n\nimport { css } from 'lit';\n\nimport { BUBBLE_LOOK, BUTTON_LOOK, TOUR_DEFAULTS, cssValue } from '../ui/tokens.js';\n\nexport const tourStyles = css`\n :host {\n display: contents;\n --_pw-bg: var(--steppy-tour-bubble-bg, var(--steppy-tooltip-bg, ${cssValue(TOUR_DEFAULTS.bubbleBg)}));\n --_pw-fg: var(--steppy-tour-bubble-fg, var(--steppy-tooltip-fg, ${cssValue(TOUR_DEFAULTS.bubbleFg)}));\n --_pw-muted: var(--steppy-tour-muted, ${cssValue(TOUR_DEFAULTS.muted)});\n --_pw-accent: var(--steppy-tour-accent, ${cssValue(TOUR_DEFAULTS.accent)});\n --_pw-accent-fg: var(--steppy-tour-accent-fg, ${cssValue(TOUR_DEFAULTS.accentFg)});\n --_pw-focus: var(--steppy-tour-focus, ${cssValue(TOUR_DEFAULTS.focus)});\n --_pw-scrim: var(--steppy-tour-scrim, ${cssValue(TOUR_DEFAULTS.scrim)});\n --_pw-radius: var(--steppy-tour-radius, ${cssValue(TOUR_DEFAULTS.radius)});\n }\n .layer {\n position: fixed;\n inset: 0;\n width: auto;\n height: auto;\n max-width: none;\n max-height: none;\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n overflow: visible;\n pointer-events: none;\n z-index: var(--_pw-z, 2147483000);\n }\n .layer::backdrop {\n pointer-events: none;\n background: transparent;\n }\n .spotlight {\n position: absolute;\n left: var(--_pw-sx, 0);\n top: var(--_pw-sy, 0);\n width: var(--_pw-sw, 0);\n height: var(--_pw-sh, 0);\n border-radius: var(--_pw-radius);\n box-shadow:\n 0 0 0 2px var(--_pw-accent),\n 0 0 0 max(100vw, 100vh) var(--_pw-scrim);\n pointer-events: none;\n transition:\n left 0.15s ease,\n top 0.15s ease,\n width 0.15s ease,\n height 0.15s ease;\n }\n .bubble {\n position: absolute;\n box-sizing: border-box;\n width: min(320px, calc(100vw - 16px));\n max-height: calc(100vh - 16px);\n overflow: auto;\n padding: ${cssValue(BUBBLE_LOOK.padding)};\n border-radius: var(--_pw-radius);\n background: var(--_pw-bg);\n color: var(--_pw-fg);\n box-shadow: ${cssValue(BUBBLE_LOOK.shadow)};\n font-family: var(--steppy-font-family, inherit);\n font-size: ${cssValue(BUBBLE_LOOK.fontSize)};\n line-height: ${cssValue(BUBBLE_LOOK.lineHeight)};\n pointer-events: auto;\n visibility: hidden;\n outline: none;\n }\n .bubble[data-placed] {\n visibility: visible;\n }\n .bubble[data-mode='anchored'] {\n left: var(--_pw-x, 0);\n top: var(--_pw-y, 0);\n }\n .bubble[data-mode='centered'] {\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n .bubble[data-mode='sheet-bottom'],\n .bubble[data-mode='sheet-top'] {\n left: 50%;\n transform: translateX(-50%);\n }\n .bubble[data-mode='sheet-bottom'] {\n bottom: calc(8px + var(--_pw-kb, 0px));\n }\n .bubble[data-mode='sheet-top'] {\n top: 8px;\n }\n .bubble[data-yield] {\n pointer-events: none;\n opacity: 0.15;\n }\n .layer[data-offscreen] .spotlight {\n display: none;\n }\n header {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n }\n h2 {\n flex: 1;\n margin: 0 0 4px;\n font-size: 1em;\n font-weight: 600;\n }\n .body {\n margin: 0;\n overflow-wrap: anywhere;\n }\n .body a,\n .guide {\n color: var(--_pw-fg);\n text-decoration: underline;\n }\n .guide {\n display: inline-block;\n margin-top: 6px;\n }\n code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 0.92em;\n }\n footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 10px;\n }\n .progress {\n margin-inline-end: auto;\n color: var(--_pw-muted);\n font-variant-numeric: tabular-nums;\n }\n button {\n font: inherit;\n cursor: pointer;\n border-radius: ${cssValue(BUTTON_LOOK.radius)};\n padding: ${cssValue(BUTTON_LOOK.padding)};\n border: 1px solid transparent;\n }\n button:focus-visible,\n a:focus-visible {\n outline: 2px solid var(--_pw-focus);\n outline-offset: 2px;\n }\n button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .primary {\n background: var(--_pw-accent);\n color: var(--_pw-accent-fg);\n }\n .secondary {\n background: transparent;\n color: var(--_pw-fg);\n border-color: var(--_pw-muted);\n }\n .close {\n margin-inline-start: auto;\n padding: 0 6px;\n background: transparent;\n color: var(--_pw-fg);\n font-size: 1.25em;\n line-height: 1;\n }\n .pill {\n position: absolute;\n inset-inline-end: 16px;\n bottom: 16px;\n display: flex;\n gap: 4px;\n padding: 4px;\n border-radius: 999px;\n background: var(--_pw-bg);\n color: var(--_pw-fg);\n box-shadow: ${cssValue(BUBBLE_LOOK.shadow)};\n font-family: var(--steppy-font-family, inherit);\n font-size: ${cssValue(BUBBLE_LOOK.fontSize)};\n pointer-events: auto;\n }\n .pill .primary {\n border-radius: 999px;\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n }\n @media (prefers-reduced-motion: reduce) {\n .spotlight {\n transition: none;\n }\n }\n @media (forced-colors: active) {\n .spotlight {\n outline: 3px solid Highlight;\n box-shadow: none;\n }\n .bubble,\n .pill {\n border: 1px solid CanvasText;\n }\n }\n @media print {\n .layer {\n display: none;\n }\n }\n`;\n","/**\n * Inline-markdown renderer shared by the guide player and the in-app tour\n * overlay.\n *\n * Mirrors the inline subset of the server-side ``markdown-it`` ``renderInline``\n * filter (``src/steppy/guide.py``, configured ``{html:false, breaks:true,\n * linkify:true}``) used by the step-by-step guide, so the interactive player\n * renders the same content the static guide does:\n *\n * - **bold** / __bold__ , *italic* / _italic_ (recursive — emphasis nests)\n * - `inline code`\n * - [label](url) links — label is parsed recursively\n * - autolinked bare URLs (``https://…`` / ``www.…``) and emails (linkify)\n * - hard line breaks: every ``\\n`` becomes ``<br>`` (``breaks:true``)\n *\n * The manifest carries raw text (it is reused for ``alt``/``aria-label``\n * attributes, where HTML must not appear), so emphasis is rendered here, on the\n * client, only at the visible display sites.\n *\n * Returns an array of literal-string + Lit ``TemplateResult`` parts, meant to be\n * interpolated into an existing parent element (``${renderInlineMarkdown(text)}``,\n * the same shape as ``${items.map(...)}``). Literal text and ``href`` values stay\n * auto-escaped by Lit, and which link URLs become links is decided by a\n * ``LinkPolicy`` — so it is XSS-safe by construction, with no ``unsafeHTML``.\n *\n * Link policies: the guide keeps its historical set (http/https/mailto, a\n * site-relative path, an anchor) minus protocol-relative ``//host`` and\n * ``/\\host``, which browsers resolve to another origin. The tour overlay passes\n * a stricter policy of its own (same-origin routes and the guide origin only,\n * no autolinks). A URL the policy refuses leaves the whole ``[label](url)``\n * literal, exactly as an unmatched link always rendered.\n *\n * Scope is intentionally inline-only (no block constructs — ``renderInline`` does\n * not render lists/headings/blockquotes either, so there is no parity gap). The\n * regex emphasis rule is not markdown-it's full delimiter-run algorithm, so a few\n * pathological mixed-nesting cases (e.g. *italic wrapping **bold***) are not\n * matched; the common cases — bold-containing-italic, adjacent emphasis, links\n * with emphasised labels — all work.\n */\n\nimport { html, type TemplateResult } from 'lit';\n\nexport type MarkdownNode = TemplateResult | string;\n\n/** What a ``[label](url)`` becomes: a new-tab link, or a same-tab one the host routes. */\nexport type LinkTarget =\n | { kind: 'external'; href: string }\n | { kind: 'internal'; href: string; onActivate: (event: MouseEvent) => void };\n\nexport interface LinkPolicy {\n /** The link for ``url``, or ``null`` to leave the markdown literal. */\n link(url: string): LinkTarget | null;\n /** Whether bare URLs and e-mail addresses are turned into links (linkify). */\n autolink: boolean;\n}\n\n// The guide's historical link set, minus protocol-relative \"//host\" and \"/\\host\".\nconst SAFE_GUIDE_URL = /^(?:https?:\\/\\/[^\\s)]+|mailto:[^\\s)]+|\\/(?![/\\\\])[^\\s)]*|#[^\\s)]*)$/;\n\nexport const GUIDE_LINK_POLICY: LinkPolicy = {\n autolink: true,\n link: (url) => (SAFE_GUIDE_URL.test(url) ? { kind: 'external', href: url } : null),\n};\n\n// 1 code | 2 link-label 3 link-url | 4 bold-delim 5 bold | 6 em-delim 7 em | 8 url/www | 9 email\n// The link URL is any run up to \")\" without whitespace; the policy decides\n// whether it becomes a link.\nconst INLINE_SRC =\n '`([^`]+)`|\\\\[([^\\\\]]+)\\\\]\\\\(([^\\\\s)]+)\\\\)|(\\\\*\\\\*|__)(\\\\S(?:.*?\\\\S)?)\\\\4|(\\\\*|_)([^*_\\\\s](?:[^*_]*?[^*_\\\\s])?)\\\\6|(https?:\\\\/\\\\/[^\\\\s<>()]+|www\\\\.[^\\\\s<>()]+)|([\\\\w.+-]+@[\\\\w-]+\\\\.[\\\\w.-]+\\\\w)';\n\nexport function renderInlineMarkdown(src: string, policy: LinkPolicy = GUIDE_LINK_POLICY): MarkdownNode[] {\n const parts: MarkdownNode[] = [];\n // Hard line breaks: breaks:true turns every \\n into <br>.\n const pushText = (t: string) =>\n t.split('\\n').forEach((ln, i) => {\n if (i > 0) parts.push(html`<br />`);\n if (ln) parts.push(ln);\n });\n\n // A fresh regex per call: this function recurses (into emphasis/link content),\n // and a single shared /g regex would have its lastIndex clobbered by the inner\n // call, corrupting this loop. A local instance keeps each level independent.\n const re = new RegExp(INLINE_SRC, 'g');\n let last = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(src))) {\n if (m[2] != null) {\n const target = policy.link(m[3]!);\n if (!target) {\n // Refused: no match at this position, exactly as if the link pattern\n // had not matched — scanning resumes one character later.\n re.lastIndex = m.index + 1;\n continue;\n }\n if (m.index > last) pushText(src.slice(last, m.index));\n parts.push(\n target.kind === 'external'\n ? html`<a href=${target.href} target=\"_blank\" rel=\"noopener noreferrer\"\n >${renderInlineMarkdown(m[2], policy)}</a\n >`\n : html`<a href=${target.href} @click=${target.onActivate}>${renderInlineMarkdown(m[2], policy)}</a>`,\n );\n last = m.index + m[0].length;\n continue;\n }\n if ((m[8] != null || m[9] != null) && !policy.autolink) continue; // stays literal text\n if (m.index > last) pushText(src.slice(last, m.index));\n if (m[1] != null) {\n parts.push(html`<code>${m[1]}</code>`); // code span: no recursion\n } else if (m[4] != null) {\n parts.push(html`<strong>${renderInlineMarkdown(m[5]!, policy)}</strong>`);\n } else if (m[6] != null) {\n parts.push(html`<em>${renderInlineMarkdown(m[7]!, policy)}</em>`);\n } else if (m[8] != null) {\n // Autolink; trim trailing sentence punctuation back out as text (linkify behavior).\n const raw = m[8];\n const trail = (raw.match(/[.,;:!?]+$/) ?? [''])[0];\n const url = trail ? raw.slice(0, -trail.length) : raw;\n const href = url.startsWith('www.') ? `https://${url}` : url;\n parts.push(html`<a href=${href} target=\"_blank\" rel=\"noopener noreferrer\">${url}</a>`);\n if (trail) pushText(trail);\n } else if (m[9] != null) {\n parts.push(html`<a href=${`mailto:${m[9]}`}>${m[9]}</a>`);\n }\n last = m.index + m[0].length;\n }\n if (last < src.length) pushText(src.slice(last));\n return parts;\n}\n","/**\n * The overlay's DOM. Data is only ever bound as text or attribute values\n * (never ``style=``, never HTML), and the UI never carries the app's test-id\n * attribute, so app locators cannot match it.\n *\n * DOM contract (the CI replay and the docs rely on it): the bubble is\n * ``section[part~=\"bubble\"][role=\"dialog\"]`` with ``data-tour-id``,\n * ``data-step-id``, ``data-state`` (``shown`` | ``fallback``) and\n * ``data-advance``; Next is ``part=\"button next primary\"`` on input and manual\n * steps and ``\"button next secondary\"`` on change steps, absent on click and\n * visible steps; the fallback has ``skip`` and ``end``; the pill holds\n * ``resume`` and ``close``.\n */\n\nimport { html, nothing, type TemplateResult } from 'lit';\n\nimport { renderInlineMarkdown, type LinkPolicy } from '../ui/markdown.js';\nimport { format } from '../ui/strings.js';\nimport type { TourStrings } from './strings.js';\nimport { instructionFor } from './strings.js';\nimport type { TourStep } from './validate.js';\n\nexport interface ViewModel {\n mode: 'bubble' | 'pill' | 'none';\n /** The tour file's language and direction, set on the layer (the page's may differ). */\n lang: string;\n dir: 'ltr' | 'rtl';\n tourId: string;\n step: TourStep;\n state: 'shown' | 'fallback';\n /** Spotlight drawn (an anchored step that is showing). */\n anchored: boolean;\n position: { index: number; total: number };\n last: boolean;\n nextEnabled: boolean;\n guideUrl: string | null;\n strings: TourStrings;\n policy: LinkPolicy;\n popover: boolean;\n}\n\nexport interface Handlers {\n press(e: Event): void;\n next(e: MouseEvent): void;\n skip(e: MouseEvent): void;\n end(e: MouseEvent): void;\n close(e: MouseEvent): void;\n resume(e: MouseEvent): void;\n}\n\nconst stop = (e: Event) => e.stopPropagation();\n\nfunction nextButton(v: ViewModel, h: Handlers): TemplateResult | typeof nothing {\n const kind = v.step.advance;\n if (kind === 'click' || kind === 'visible') return nothing;\n const label = v.last && kind === 'manual' ? v.strings.done : v.strings.next;\n const style = kind === 'change' ? 'secondary' : 'primary';\n return html`<button\n part=\"button next ${style}\"\n class=${style}\n ?disabled=${!v.nextEnabled}\n @pointerdown=${h.press}\n @mousedown=${h.press}\n @click=${h.next}\n >\n ${label}\n </button>`;\n}\n\nfunction bubble(v: ViewModel, h: Handlers): TemplateResult {\n const s = v.strings;\n const fallback = v.state === 'fallback';\n const title = fallback ? s.notFoundTitle : v.step.title;\n const body = fallback ? s.notFoundBody : (v.step.text ?? instructionFor(v.step.advance, s));\n const showGuide = v.guideUrl !== null && (fallback || v.last);\n return html`<section\n part=\"bubble\"\n class=\"bubble\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby=${title ? 'pw-title' : nothing}\n aria-label=${title ? nothing : s.dialogLabel}\n aria-describedby=\"pw-body\"\n tabindex=\"-1\"\n data-tour-id=${v.tourId}\n data-step-id=${v.step.id}\n data-state=${v.state}\n data-advance=${v.step.advance}\n @pointerdown=${stop}\n @mousedown=${stop}\n @click=${stop}\n >\n <header>\n ${title ? html`<h2 part=\"title\" id=\"pw-title\">${title}</h2>` : nothing}\n <button part=\"button close\" class=\"close\" aria-label=${s.close} @pointerdown=${h.press} @mousedown=${h.press} @click=${h.close}>\n ×\n </button>\n </header>\n <p part=\"body\" class=\"body\" id=\"pw-body\">${fallback ? body : renderInlineMarkdown(body, v.policy)}</p>\n ${showGuide\n ? html`<a part=\"guide-link\" class=\"guide\" href=${v.guideUrl!} target=\"_blank\" rel=\"noopener noreferrer\">${s.openGuide}</a>`\n : nothing}\n <footer>\n <span part=\"progress\" class=\"progress\">${format(s.progress, { current: v.position.index + 1, total: v.position.total })}</span>\n ${fallback\n ? html`<button part=\"button skip\" class=\"secondary\" @pointerdown=${h.press} @mousedown=${h.press} @click=${h.skip}>\n ${s.skipStep}\n </button>\n <button part=\"button end primary\" class=\"primary\" @pointerdown=${h.press} @mousedown=${h.press} @click=${h.end}>\n ${s.endTour}\n </button>`\n : nextButton(v, h)}\n </footer>\n </section>`;\n}\n\nfunction pill(v: ViewModel, h: Handlers): TemplateResult {\n const s = v.strings;\n return html`<div part=\"pill\" class=\"pill\" role=\"group\" aria-label=${s.paused} @pointerdown=${stop} @mousedown=${stop} @click=${stop}>\n <button part=\"button resume primary\" class=\"primary\" @pointerdown=${h.press} @mousedown=${h.press} @click=${h.resume}>\n ${s.resume}\n </button>\n <button part=\"button close\" class=\"close\" aria-label=${s.close} @pointerdown=${h.press} @mousedown=${h.press} @click=${h.close}>\n ×\n </button>\n </div>`;\n}\n\nexport function renderLayer(v: ViewModel, h: Handlers): TemplateResult {\n return html`<div part=\"layer\" class=\"layer\" lang=${v.lang} dir=${v.dir} popover=${v.popover ? 'manual' : nothing}>\n ${v.mode === 'bubble' && v.anchored && v.state === 'shown' ? html`<div part=\"spotlight\" class=\"spotlight\"></div>` : nothing}\n ${v.mode === 'bubble' ? bubble(v, h) : v.mode === 'pill' ? pill(v, h) : nothing}\n <div class=\"sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"></div>\n </div>`;\n}\n","/**\n * Keeps the spotlight on the target and the bubble next to it while a step is\n * shown. Geometry is written through CSSOM custom properties only (no\n * ``style=`` attributes, which a strict CSP blocks).\n *\n * Driven by capture-phase scroll (which catches scrolling ancestors), resize,\n * the visual viewport, ResizeObserver and a slow poll; ``notify`` coalesces\n * them into one placement per frame. A target that got detached or hidden is\n * re-found by id first; only when that fails is the step reported lost.\n *\n * Invariant: the bubble never covers the spotlight when a side has room for\n * it; otherwise it becomes a sheet at the top or bottom of the viewport, away\n * from the target's centre (where a click lands). A step with nothing to point\n * at is centred, unless that would cover an open app dialog: such a step is\n * usually about the dialog (a confirmation), so it becomes a sheet instead.\n */\n\nimport { inflate, intersect, intersects, placeTooltip, type Rect, type TooltipSide } from '../ui/placement.js';\nimport type { DomAdapter, Viewport } from './dom.js';\nimport { isExpanded } from './signature.js';\n\nexport const SPOT_PAD = 6;\nexport const GAP = 10;\nexport const MARGIN = 8;\nexport const SHEET_BELOW = 640;\nconst POLL_MS = 250;\n\nexport interface TrackerOptions {\n dom: DomAdapter;\n layer: () => HTMLElement | null;\n bubble: () => HTMLElement | null;\n /** The current target, or null for a centred (targetless) step. */\n target: () => Element | null;\n /** Re-find the target by id after it was detached or hidden. */\n refind: () => Element | null;\n preferred: () => TooltipSide | 'auto';\n /** A rect the bubble should not cover when it has a choice (the next step's target). */\n avoid: () => Rect | null;\n /** The app's open dialogs, which a centred bubble moves off. */\n dialogs?: () => Rect[];\n onLost: () => void;\n /** The bubble was placed (it is visible from now on, so it can take focus). */\n onPlaced?: () => void;\n}\n\nexport interface Tracker {\n start(): void;\n stop(): void;\n notify(): void;\n}\n\nconst CLIPS = /^(?:hidden|auto|scroll|clip)$/;\n\n/** Ancestors that clip the target. ``body`` and ``html`` never do: their overflow belongs to the viewport. */\nfunction clippingAncestors(el: Element): Element[] {\n const out: Element[] = [];\n for (let p = el.parentElement; p && p !== document.body && p !== document.documentElement; p = p.parentElement) {\n const cs = getComputedStyle(p);\n if (CLIPS.test(cs.overflowX) || CLIPS.test(cs.overflowY)) out.push(p);\n }\n return out;\n}\n\nexport function createTracker(o: TrackerOptions): Tracker {\n const s = o.dom.scheduler;\n let running = false;\n let frame = 0;\n let poll = 0;\n let clips: Element[] = [];\n let clipsFor: Element | null = null;\n let observer: ResizeObserver | null = null;\n\n const px = (n: number) => `${Math.round(n * 100) / 100}px`;\n\n function tick(): void {\n frame = 0;\n if (!running) return;\n const layer = o.layer();\n const bubble = o.bubble();\n if (!layer || !bubble) return;\n const vp = o.dom.viewport();\n let target = o.target();\n const anchoredStep = target !== null;\n if (target && (!target.isConnected || !o.dom.isVisible(target))) target = o.refind();\n if (anchoredStep && !target) {\n running = false;\n o.onLost();\n return;\n }\n\n bubble.removeAttribute('data-offscreen');\n layer.removeAttribute('data-offscreen');\n layer.style.setProperty('--_pw-kb', px(Math.max(0, window.innerHeight - (vp.y + vp.height))));\n if (!target) return centre(bubble, vp);\n if (clipsFor !== target) {\n clips = clippingAncestors(target);\n clipsFor = target;\n observer?.disconnect();\n observer?.observe(target);\n observer?.observe(bubble);\n }\n let spot: Rect | null = inflate(o.dom.rect(target) ?? { x: 0, y: 0, width: 0, height: 0 }, SPOT_PAD);\n for (const clip of clips) {\n const r = o.dom.rect(clip);\n if (r && spot) spot = intersect(spot, inflate(r, SPOT_PAD));\n }\n spot = spot && intersect(spot, { x: vp.x, y: vp.y, width: vp.width, height: vp.height });\n if (!spot) {\n bubble.setAttribute('data-offscreen', '');\n layer.setAttribute('data-offscreen', '');\n return centre(bubble, vp);\n }\n layer.style.setProperty('--_pw-sx', px(spot.x));\n layer.style.setProperty('--_pw-sy', px(spot.y));\n layer.style.setProperty('--_pw-sw', px(spot.width));\n layer.style.setProperty('--_pw-sh', px(spot.height));\n bubble.toggleAttribute('data-yield', isExpanded(target));\n\n const centreY = spot.y + spot.height / 2;\n const sheet = (): void => setMode(bubble, centreY > vp.y + vp.height / 2 ? 'sheet-top' : 'sheet-bottom', null);\n if (vp.width <= SHEET_BELOW) return sheet();\n const size = o.dom.rect(bubble) ?? { x: 0, y: 0, width: 320, height: 120 };\n const avoid = o.avoid();\n const rel = (r: Rect): Rect => ({ x: r.x - vp.x, y: r.y - vp.y, width: r.width, height: r.height });\n const p = placeTooltip(rel(spot), size, vp, GAP, {\n preferred: o.preferred(),\n margin: MARGIN,\n avoid: avoid ? [rel(avoid)] : [],\n });\n if (p.overlaps) return sheet();\n layer.style.setProperty('--_pw-x', px(p.x + vp.x));\n layer.style.setProperty('--_pw-y', px(p.y + vp.y));\n setMode(bubble, 'anchored', p.side);\n }\n\n /** Centred, or a sheet on the roomier side of the open app dialogs a centred bubble would cover. */\n function centre(bubble: HTMLElement, vp: Viewport): void {\n const size = o.dom.rect(bubble) ?? { x: 0, y: 0, width: 320, height: 120 };\n const centred = {\n x: vp.x + (vp.width - size.width) / 2,\n y: vp.y + (vp.height - size.height) / 2,\n width: size.width,\n height: size.height,\n };\n const covered = (o.dialogs?.() ?? []).filter((r) => intersects(r, centred));\n if (!covered.length) return setMode(bubble, 'centered', null);\n const above = Math.min(...covered.map((r) => r.y)) - vp.y;\n const below = vp.y + vp.height - Math.max(...covered.map((r) => r.y + r.height));\n setMode(bubble, above >= below ? 'sheet-top' : 'sheet-bottom', null);\n }\n\n function setMode(bubble: HTMLElement, mode: string, side: TooltipSide | null): void {\n bubble.setAttribute('data-mode', mode);\n if (side) bubble.setAttribute('data-side', side);\n else bubble.removeAttribute('data-side');\n bubble.setAttribute('data-placed', '');\n o.onPlaced?.();\n }\n\n function notify(): void {\n if (running && !frame) frame = s.raf(tick);\n }\n\n const onScroll = () => notify();\n return {\n start() {\n if (running) return notify();\n running = true;\n clipsFor = null;\n document.addEventListener('scroll', onScroll, { capture: true, passive: true });\n window.addEventListener('resize', onScroll, { passive: true });\n window.visualViewport?.addEventListener('resize', onScroll, { passive: true });\n window.visualViewport?.addEventListener('scroll', onScroll, { passive: true });\n observer = typeof ResizeObserver === 'function' ? new ResizeObserver(onScroll) : null;\n poll = s.setInterval(notify, POLL_MS);\n notify();\n },\n stop() {\n running = false;\n if (frame) s.cancelRaf(frame);\n frame = 0;\n s.clearInterval(poll);\n observer?.disconnect();\n observer = null;\n clipsFor = null;\n document.removeEventListener('scroll', onScroll, { capture: true });\n window.removeEventListener('resize', onScroll);\n window.visualViewport?.removeEventListener('resize', onScroll);\n window.visualViewport?.removeEventListener('scroll', onScroll);\n },\n notify,\n };\n}\n","/**\n * Turns what the user does *in the app* into engine events: document-level\n * capture listeners that never stop or alter the app's own events.\n *\n * - A click whose path holds the current step's test-id advances a ``click``\n * step; a click on a *later* step's target jumps there (performed when that\n * step is itself a click step). The resume record is written synchronously,\n * before any navigation the click may cause; the engine is told on the next\n * task so the app's handlers run first.\n * - ``input`` / ``change`` on an ``input`` step's target enable Next / commit.\n * - Any interaction outside the overlay arms a ``change`` step's watcher.\n * - Escape dismisses the tour unless the app is using it (a dialog, an open\n * popup, ``preventDefault``, an IME composition).\n *\n * Events whose path goes through the overlay are its own UI and are ignored.\n * Untrusted (scripted) events count like trusted ones: the CI replay clicks\n * with synthetic events.\n */\n\nimport type { EngineEvent, EngineState } from './engine.js';\nimport type { TourStep } from './validate.js';\nimport { isExpanded, readFieldValue } from './signature.js';\n\nexport interface TriggerContext {\n host: HTMLElement;\n attr: string;\n state(): EngineState;\n dispatch(e: EngineEvent): void;\n /** The current step's resolved target. */\n target(): Element | null;\n /** Called synchronously when a click advances or jumps: persist the next step. */\n persistAhead(fromIndex: number): void;\n /** Any interaction outside the overlay (arms ``change`` watchers). */\n interacted(): void;\n /** A ``change`` event or a document click: re-check a ``change`` step. */\n tick(): void;\n defer(cb: () => void): void;\n}\n\n/** An app dialog: Escape inside one is the app's, and a centred bubble moves off an open one. */\nexport const APP_DIALOG = 'dialog,[role=dialog],[role=alertdialog],[aria-modal=\"true\"]';\n\nfunction appPath(e: Event, host: HTMLElement): Element[] | null {\n const path = e.composedPath().slice(0, 64);\n if (path.includes(host)) return null;\n return path.filter((n): n is Element => n instanceof Element);\n}\n\nexport function attachTriggers(ctx: TriggerContext): () => void {\n const { host, attr } = ctx;\n const current = (): { s: EngineState; step: TourStep } | null => {\n const s = ctx.state();\n if (!s.loaded || s.phase === 'idle' || s.phase === 'loading' || s.phase === 'entering') return null;\n return { s, step: s.loaded.tour.steps[s.index]! };\n };\n\n const onClick = (e: Event) => {\n const path = appPath(e, host);\n if (!path) return;\n ctx.interacted();\n ctx.tick();\n const cur = current();\n if (!cur) return;\n const { s, step } = cur;\n const ids = new Set(path.map((el) => el.getAttribute(attr)).filter((v): v is string => v !== null));\n const token = s.token;\n if (s.phase === 'showing' && step.advance === 'click' && step.target !== null && ids.has(step.target)) {\n ctx.persistAhead(s.index);\n ctx.defer(() => ctx.dispatch({ type: 'TRIGGER', token, kind: 'click' }));\n return;\n }\n const steps = s.loaded!.tour.steps;\n const to = steps.findIndex((st, j) => j > s.index && s.loaded!.applicable[j] && st.target !== null && ids.has(st.target));\n if (to === -1) return;\n const performed = steps[to]!.advance === 'click';\n if (performed) ctx.persistAhead(to);\n ctx.defer(() => ctx.dispatch({ type: 'JUMP', token, to, performed }));\n };\n\n const inTarget = (e: Event): boolean => {\n const t = ctx.target();\n return t !== null && e.composedPath().includes(t);\n };\n\n const onInput = (e: Event) => {\n if (!appPath(e, host)) return;\n ctx.interacted();\n const cur = current();\n if (cur?.s.phase === 'showing' && cur.step.advance === 'input' && inTarget(e)) {\n ctx.dispatch({ type: 'FIELD', token: cur.s.token, nonEmpty: readFieldValue(ctx.target()!).trim() !== '' });\n }\n };\n\n const onChange = (e: Event) => {\n if (!appPath(e, host)) return;\n ctx.interacted();\n ctx.tick();\n const cur = current();\n if (cur?.s.phase === 'showing' && cur.step.advance === 'input' && inTarget(e)) {\n const token = cur.s.token;\n if (readFieldValue(ctx.target()!).trim() !== '') ctx.defer(() => ctx.dispatch({ type: 'TRIGGER', token, kind: 'input-commit' }));\n }\n };\n\n const onPress = (e: Event) => {\n if (appPath(e, host)) ctx.interacted();\n };\n\n const onEscape = (e: Event) => {\n const k = e as KeyboardEvent;\n if (k.key !== 'Escape' || k.defaultPrevented || k.isComposing) return;\n const cur = current();\n if (!cur) return;\n const path = k.composedPath();\n const ours = path.indexOf(host);\n const appElements = (ours === -1 ? path : path.slice(ours + 1)).filter((n): n is Element => n instanceof Element);\n if (appElements.some((el) => el.matches(`${APP_DIALOG},[aria-expanded=\"true\"]`))) return;\n // Only a target still in the page counts: one inside a dialog the app has\n // since closed is detached, and Escape is the user's again.\n const target = ctx.target();\n if (target?.isConnected && (target.closest(APP_DIALOG) || isExpanded(target))) return;\n ctx.dispatch({ type: 'DISMISS', via: 'escape' });\n };\n\n const opts = { capture: true };\n document.addEventListener('click', onClick, opts);\n document.addEventListener('input', onInput, opts);\n document.addEventListener('change', onChange, opts);\n document.addEventListener('pointerdown', onPress, opts);\n document.addEventListener('mousedown', onPress, opts);\n document.addEventListener('keydown', onPress, opts);\n window.addEventListener('keydown', onEscape);\n return () => {\n document.removeEventListener('click', onClick, opts);\n document.removeEventListener('input', onInput, opts);\n document.removeEventListener('change', onChange, opts);\n document.removeEventListener('pointerdown', onPress, opts);\n document.removeEventListener('mousedown', onPress, opts);\n document.removeEventListener('keydown', onPress, opts);\n window.removeEventListener('keydown', onEscape);\n };\n}\n\n/**\n * Watches a ``change`` step: the value signature is sampled until the user\n * first interacts (so a label the app fills in asynchronously is not taken\n * for a change), then any difference — ignored while a popup is open, since\n * the signature of an open dropdown is not a choice — advances the step.\n */\nexport function watchChange(\n target: Element,\n signature: (el: Element) => string,\n onChange: () => void,\n schedule: { raf(cb: () => void): number; setInterval(cb: () => void, ms: number): number; clearInterval(id: number): void },\n): { arm(): void; tick(): void; stop(): void } {\n let base = signature(target);\n let armed = false;\n let stopped = false;\n let pending = false;\n const tick = () => {\n pending = false;\n if (stopped || isExpanded(target)) return;\n const sig = signature(target);\n if (!armed) {\n base = sig;\n return;\n }\n if (sig !== base) {\n stopped = true;\n cleanup();\n onChange();\n }\n };\n const soon = () => {\n if (!pending && !stopped) {\n pending = true;\n schedule.raf(tick);\n }\n };\n const observer = new MutationObserver(soon);\n observer.observe(target, { attributes: true, characterData: true, childList: true, subtree: true });\n const poll = schedule.setInterval(tick, 300);\n const cleanup = () => {\n observer.disconnect();\n schedule.clearInterval(poll);\n };\n return {\n arm() {\n armed = true;\n },\n tick: soon,\n stop() {\n stopped = true;\n cleanup();\n },\n };\n}\n","/**\n * ``<steppy-tour-host>`` — mount it once in the app shell and call\n * ``start(tourId)``. The element interprets the engine's effects (``engine.ts``)\n * and owns the browser-facing pieces: loader, resolver, tracker, triggers,\n * focus, the live region and the resume record. It renders nothing while no\n * tour runs.\n *\n * Two switches keep it out of the way: the global\n * ``__STEPPY_TOURS_DISABLED__`` (set by generated E2E tests so an app that\n * auto-starts a tour cannot cover what a test clicks; read at call time) and\n * the ``disabled`` property. Either makes ``start()`` a no-op.\n */\n\nimport { LitElement, nothing, type PropertyValues } from 'lit';\n\nimport { TOUR_ACTIVE_SYMBOL_KEY, TOUR_HOST_TAG, TOURS_KILL_SWITCH_GLOBAL } from '../ui/names.js';\nimport type { LinkPolicy } from '../ui/markdown.js';\nimport type { Rect, TooltipSide } from '../ui/placement.js';\nimport type { TourHostApi, TourNavigate, TourPosition, TourStartOptions } from './api.js';\nimport { DEFAULT_BASE_Z_INDEX, DEFAULT_TARGET_TIMEOUT_MS } from './contract.js';\nimport { defaultDom, type DomAdapter } from './dom.js';\nimport {\n initialState,\n isActive,\n position,\n reduce,\n type Effect,\n type EngineEvent,\n type EngineState,\n type TourErrorDetail,\n type WaitMode,\n} from './engine.js';\nimport { emitTourEvent, type TourEventDetailMap } from './events.js';\nimport { raiseLayer, showLayer } from './layer.js';\nimport { loadTour, type LoaderConfig, type LoadOk, type ManifestLoad, type TourSource } from './loader.js';\nimport { createResolver, type Resolver } from './resolver.js';\nimport { basePath, buildRoute, linkHref, matchRoute, toAppPath, toDocumentPath } from './routes.js';\nimport { isComboboxLike, readFieldValue, valueSignature } from './signature.js';\nimport { clearResume, readResume, writeResume } from './storage.js';\nimport { resolveTourStrings, textDir, type TourStringOverrides } from './strings.js';\nimport { tourStyles } from './styles.js';\nimport { renderLayer, type Handlers } from './templates.js';\nimport { createTracker, type Tracker } from './tracker.js';\nimport { APP_DIALOG, attachTriggers, watchChange } from './triggers.js';\nimport { httpOrigin, type TourStep } from './validate.js';\n\nconst ACTIVE = Symbol.for(TOUR_ACTIVE_SYMBOL_KEY);\nconst KEYBOARD_GRACE_MS = 300;\nconst TIMEOUT_MIN = 500;\nconst TIMEOUT_MAX = 120_000;\n\ntype GlobalWithActive = typeof globalThis & { [ACTIVE]?: SteppyTourHost | null } & Record<string, unknown>;\nconst g = globalThis as GlobalWithActive;\n\nconst killSwitch = (): boolean => g[TOURS_KILL_SWITCH_GLOBAL] === true;\n\ninterface Run {\n tourId: string;\n params: Record<string, string>;\n load: LoadOk;\n entryPath: string | null;\n base: string;\n}\n\nexport interface SteppyTourHost {\n addEventListener<K extends keyof TourEventDetailMap>(\n type: K,\n listener: (this: SteppyTourHost, ev: CustomEvent<TourEventDetailMap[K]>) => void,\n options?: boolean | AddEventListenerOptions,\n ): void;\n addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;\n}\n\nexport class SteppyTourHost extends LitElement implements TourHostApi {\n static override styles = tourStyles;\n static override properties = {\n manifest: { type: String },\n fallbackManifest: { type: String, attribute: 'fallback-manifest' },\n buildId: { type: String, attribute: 'build-id' },\n locale: { type: String },\n guideOrigin: { type: String, attribute: 'guide-origin' },\n baseZIndex: { type: Number, attribute: 'base-z-index' },\n targetTimeout: { type: Number, attribute: 'target-timeout' },\n disabled: { type: Boolean, reflect: true },\n source: { attribute: false },\n navigate: { attribute: false },\n strings: { attribute: false },\n };\n\n /** Test seam: geometry and timing. */\n static dom: DomAdapter = defaultDom;\n\n manifest = '';\n fallbackManifest = '';\n buildId = '';\n locale = '';\n guideOrigin = '';\n baseZIndex = DEFAULT_BASE_Z_INDEX;\n targetTimeout = DEFAULT_TARGET_TIMEOUT_MS;\n disabled = false;\n source: TourSource | null = null;\n navigate: TourNavigate | null = null;\n strings: TourStringOverrides | undefined = undefined;\n\n private _s: EngineState = initialState();\n private _queue: EngineEvent[] = [];\n private _dispatching = false;\n private _run: Run | null = null;\n private _cache = new Map<string, Promise<ManifestLoad>>();\n private _resolver: Resolver | null = null;\n private _cancelWait: (() => void) | null = null;\n private _target: Element | null = null;\n private _tracker: Tracker | null = null;\n private _detach: (() => void) | null = null;\n private _change: ReturnType<typeof watchChange> | null = null;\n private _shownKey = '';\n private _shownAt = 0;\n private _pressToken = -1;\n private _focusPending = false;\n private _appFocus: Element | null = null;\n private _swapSeq = 0;\n /** While a tour runs: an app that switches language through ``<html lang>`` alone. */\n private _lang = new MutationObserver(() => {\n if (!this.locale) void this._swapLocale();\n });\n private _policy: LinkPolicy = { autolink: false, link: (url) => this._link(url) };\n private _handlers: Handlers = {\n press: () => {\n this._pressToken = this._s.token;\n },\n next: (e) => this._guarded(e, () => this._dispatch({ type: 'NEXT', token: this._s.token })),\n skip: (e) => this._guarded(e, () => this._dispatch({ type: 'SKIP', token: this._s.token })),\n end: (e) => this._guarded(e, () => this._dispatch({ type: 'DISMISS', via: 'end' })),\n close: (e) => this._guarded(e, () => this._dispatch({ type: 'DISMISS', via: 'close' })),\n resume: (e) => this._guarded(e, () => this._dispatch({ type: 'RESUME', token: this._s.token })),\n };\n\n private get _dom(): DomAdapter {\n return (this.constructor as typeof SteppyTourHost).dom;\n }\n\n // ── Public API ──────────────────────────────────────────────────────────\n\n get isActive(): boolean {\n return isActive(this._s);\n }\n\n get current(): TourPosition | null {\n if (!isActive(this._s) || !this._s.loaded) return null;\n const step = this._s.loaded.tour.steps[this._s.index]!;\n return { tourId: this._s.loaded.tour.id, stepId: step.id, ...position(this._s) };\n }\n\n async start(tourId: string, options: TourStartOptions = {}): Promise<boolean> {\n return this._start(tourId, options, false);\n }\n\n stop(reason?: string): void {\n this._dispatch({ type: 'DISMISS', via: 'api', reason });\n }\n\n next(): void {\n this._dispatch({ type: 'NEXT' });\n }\n\n // ── Lifecycle ───────────────────────────────────────────────────────────\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.style.setProperty('--_pw-z', String(this.baseZIndex));\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n // Deferred: a re-parenting moves the element and reconnects it at once.\n queueMicrotask(() => {\n if (!this.isConnected) this._teardown(false);\n });\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('manifest') || changed.has('fallbackManifest') || changed.has('buildId')) this._cache.clear();\n if (changed.has('baseZIndex')) this.style.setProperty('--_pw-z', String(this.baseZIndex));\n if (changed.has('disabled') && this.disabled && this._s.phase !== 'idle') this._dispatch({ type: 'DISMISS', via: 'disabled' });\n }\n\n protected override updated(changed: PropertyValues<this>): void {\n if (changed.has('locale') && this.isActive) void this._swapLocale();\n if ((changed.has('manifest') || changed.has('fallbackManifest')) && this.hasUpdated) this._tryResume();\n this._afterRender();\n }\n\n protected override firstUpdated(): void {\n this._tryResume();\n }\n\n protected override render() {\n const s = this._s;\n if (!this._run || !s.loaded || !isActive(s)) return nothing;\n const step = s.loaded.tour.steps[s.index]!;\n const mode = s.phase === 'showing' || s.phase === 'fallback' ? 'bubble' : s.phase === 'paused' ? 'pill' : 'none';\n const pos = position(s);\n return renderLayer(\n {\n mode,\n lang: s.loaded.tour.locale.replace(/_/g, '-'),\n dir: textDir(s.loaded.tour.locale),\n tourId: s.loaded.tour.id,\n step,\n state: s.phase === 'fallback' ? 'fallback' : 'shown',\n anchored: s.phase === 'showing' && this._target !== null,\n position: pos,\n last: pos.index === pos.total - 1,\n nextEnabled: step.advance !== 'input' || s.fieldNonEmpty,\n guideUrl: s.loaded.tour.guideUrl,\n strings: resolveTourStrings(s.loaded.tour.locale, this.strings),\n policy: this._policy,\n popover: this._dom.supportsPopover(),\n },\n this._handlers,\n );\n }\n\n // ── Starting ────────────────────────────────────────────────────────────\n\n private async _start(tourId: string, options: TourStartOptions, resumed: boolean): Promise<boolean> {\n try {\n if (killSwitch() || this.disabled) {\n console.info(`[steppy-tour] \"${tourId}\" not started: tours are disabled on this page`);\n return false;\n }\n const other = g[ACTIVE];\n if (other && other !== this) other._dispatch({ type: 'DISMISS', via: 'replaced' });\n if (this._s.phase !== 'idle') this._dispatch({ type: 'DISMISS', via: 'replaced' });\n this._dispatch({ type: 'REQUEST' });\n const token = this._s.token;\n const params = Object.fromEntries(Object.entries(options.params ?? {}).map(([k, v]) => [k, String(v)]));\n const locale = this._preferredLocale();\n const load = await loadTour(this._cfg(locale), tourId);\n if (this._s.token !== token) return false;\n if (!load.ok) return this._fail({ reason: load.reason, fatal: true, message: load.message, tourId, issues: load.issues });\n\n const { tour, manifest } = load;\n const dom = this._dom;\n const layouts = manifest.layouts ?? {};\n const applicable = tour.steps.map((st) => !st.layouts || st.layouts.some((l) => dom.matchMedia(layouts[l]!)));\n const meta = { tourId, buildId: tour.buildId, locale: tour.locale };\n if (!applicable.some(Boolean)) return this._fail({ reason: 'load-failed', fatal: true, message: 'no steps apply to this layout', ...meta });\n let start = applicable.indexOf(true);\n if (options.step !== undefined) {\n const at = tour.steps.findIndex((st) => st.id === options.step);\n if (at >= 0 && applicable[at]) start = at;\n else if (resumed) {\n clearResume();\n return this._fail(null);\n }\n }\n\n const base = basePath(document.baseURI, location.origin);\n let entryPath: string | null = null;\n let all = params;\n if (tour.entry && !resumed) {\n const route = tour.entry.route;\n const here = matchRoute(route, toAppPath(location.pathname, base)) ?? matchRoute(route, location.pathname);\n all = { ...(here ?? {}), ...params };\n if (!here || Object.entries(params).some(([k, v]) => here[k] !== v)) {\n const built = buildRoute(route, all);\n if ('missing' in built) {\n return this._fail({\n reason: 'entry-params',\n fatal: true,\n message: `route ${route} needs ${built.missing.join(', ')}`,\n missing: built.missing,\n ...meta,\n });\n }\n entryPath = toDocumentPath(built.path, base);\n }\n }\n this._run = { tourId, params: all, load, entryPath, base };\n this._resolver = createResolver({ attr: load.testIdAttribute, host: this, dom });\n g[ACTIVE] = this;\n this._dispatch({\n type: 'LOADED',\n loaded: { tour, source: load.source, applicable, start, resumed, navigate: entryPath !== null },\n });\n this._lang.observe(document.documentElement, { attributeFilter: ['lang'] });\n // The app may have changed language while the files loaded (an async i18n\n // init racing a resumed tour): catch up now that there is a run to swap.\n if (this._preferredLocale() !== locale) void this._swapLocale();\n return true;\n } catch (err) {\n console.error('[steppy-tour] start failed', err);\n this._fail({ reason: 'load-failed', fatal: true, message: String(err), tourId });\n return false;\n }\n }\n\n private _fail(error: TourErrorDetail | null): false {\n if (error) this._dispatch({ type: 'LOAD_FAILED', error });\n else this._dispatch({ type: 'DISMISS', via: 'api' });\n return false;\n }\n\n private _tryResume(): void {\n if (this.disabled || killSwitch() || this._s.phase !== 'idle' || g[ACTIVE]) return;\n const key = this._manifestKey();\n const record = key ? readResume(key, Date.now()) : null;\n if (record) void this._start(record.tourId, { params: record.params, step: record.stepId }, true);\n }\n\n private _manifestKey(): string {\n return [this.manifest, this.fallbackManifest].filter(Boolean).join(' ');\n }\n\n /** The host's ``locale``, else the page's ``<html lang>``. */\n private _preferredLocale(): string {\n return this.locale || document.documentElement.lang;\n }\n\n private _cfg(locale: string): LoaderConfig {\n const { manifest, fallbackManifest, buildId, guideOrigin, source } = this;\n return { manifest, fallbackManifest, buildId, locale, guideOrigin, source, cache: this._cache };\n }\n\n /** Reload the running tour in the preferred locale; the last request wins. */\n private async _swapLocale(): Promise<void> {\n const run = this._run;\n if (!run) return;\n const seq = ++this._swapSeq;\n const locale = this._preferredLocale();\n const load = await loadTour(this._cfg(locale), run.tourId);\n if (seq !== this._swapSeq || this._run !== run) return;\n if (load.ok && load.tour.buildId === run.load.tour.buildId) {\n if (load.tour.locale === run.load.tour.locale) return;\n this._dispatch({ type: 'LOCALE', tour: load.tour });\n if (this._s.loaded?.tour === load.tour) {\n run.load = load;\n this._announce();\n return;\n }\n }\n console.warn(`[steppy-tour] locale \"${locale}\" not applied: ${load.ok ? 'the tour differs' : load.message}`);\n }\n\n // ── The engine loop ─────────────────────────────────────────────────────\n\n private _dispatch(event: EngineEvent): void {\n this._queue.push(event);\n if (this._dispatching) return;\n this._dispatching = true;\n const before = this._s;\n try {\n while (this._queue.length) {\n const t = reduce(this._s, this._queue.shift()!);\n this._s = t.state;\n for (const effect of t.effects) this._effect(effect);\n }\n } finally {\n this._dispatching = false;\n }\n if (this._s !== before) this.requestUpdate();\n }\n\n private _effect(e: Effect): void {\n const run = this._run;\n switch (e.type) {\n case 'emit':\n emitTourEvent(this, e.name, e.detail as never);\n break;\n case 'persist':\n if (run) this._persist(e.index);\n break;\n case 'clearPersist':\n clearResume();\n break;\n case 'navigate':\n void this._enter(e.token);\n break;\n case 'wait':\n this._wait(e.mode, e.index, e.token);\n break;\n case 'focus':\n this._focusPending = true;\n break;\n case 'teardown':\n this._teardown(true);\n break;\n case 'load':\n break;\n }\n }\n\n private _persist(index: number): void {\n const run = this._run!;\n const tour = run.load.tour;\n writeResume({\n v: 1,\n tourId: tour.id,\n stepId: tour.steps[index]!.id,\n locale: tour.locale,\n params: run.params,\n buildId: tour.buildId,\n manifestKey: this._manifestKey(),\n savedAt: Date.now(),\n });\n }\n\n private async _enter(token: number): Promise<void> {\n const run = this._run!;\n const path = run.entryPath!;\n const ctx = { appPath: toAppPath(path, run.base), tourId: run.tourId };\n try {\n const hook = this.navigate ?? ((p: string) => location.assign(p));\n await Promise.race([\n Promise.resolve(hook(path, ctx)),\n new Promise((r) => this._dom.scheduler.setTimeout(() => r(undefined), this._timeout())),\n ]);\n this._dispatch({ type: 'ENTER_DONE', token });\n } catch (err) {\n this._dispatch({ type: 'ENTER_FAILED', token, message: `navigation failed: ${String(err)}` });\n }\n }\n\n private _timeout(): number {\n const t = Number(this.targetTimeout);\n return Number.isFinite(t) ? Math.min(TIMEOUT_MAX, Math.max(TIMEOUT_MIN, t)) : DEFAULT_TARGET_TIMEOUT_MS;\n }\n\n private _wait(mode: WaitMode, index: number, token: number): void {\n this._cancelWait?.();\n const step = this._s.loaded!.tour.steps[index]!;\n const resolver = this._resolver!;\n const ids =\n mode === 'resolve' || mode === 'fallback'\n ? [step.advance === 'visible' ? null : step.target, step.waitFor].filter((v): v is string => v !== null)\n : [step.target!];\n const timeoutMs = mode === 'resolve' || mode === 'lost' || mode === 'visible' ? this._timeout() : null;\n this._cancelWait = resolver.wait({\n ids,\n timeoutMs,\n onFound: (found) => {\n this._cancelWait = null;\n // A visible-advance step resolves on its waitFor only: its target may\n // still be missing, and the step then shows centred until it appears.\n this._target = step.target ? (found.get(step.target) ?? resolver.find(step.target)) : null;\n // A pre-filled field enables Next from the start.\n const fieldNonEmpty = step.advance === 'input' && this._target !== null && readFieldValue(this._target).trim() !== '';\n const next: EngineEvent =\n mode === 'resolve' || mode === 'fallback'\n ? { type: 'RESOLVED', token, fieldNonEmpty }\n : mode === 'visible'\n ? { type: 'TRIGGER', token, kind: 'visible' }\n : { type: 'TARGET_BACK', token };\n this._dispatch(next);\n },\n onTimeout: (missing) => {\n this._cancelWait = null;\n if (mode === 'lost') return this._dispatch({ type: 'LOST_TIMEOUT', token });\n const kind = missing === step.waitFor && missing !== step.target ? 'waitFor' : 'target';\n this._dispatch({ type: 'RESOLVE_TIMEOUT', token, testId: missing, kind });\n },\n });\n }\n\n // ── Showing ─────────────────────────────────────────────────────────────\n\n private _layer(): HTMLElement | null {\n return this.renderRoot.querySelector<HTMLElement>('[part~=\"layer\"]');\n }\n\n private _bubble(): HTMLElement | null {\n return this.renderRoot.querySelector<HTMLElement>('[part~=\"bubble\"]');\n }\n\n private _afterRender(): void {\n const s = this._s;\n const layer = this._layer();\n const shown = s.phase === 'showing' || s.phase === 'fallback' || s.phase === 'paused';\n if (!layer || !shown || !s.loaded) {\n this._tracker?.stop();\n this._change?.stop();\n this._change = null;\n if (!isActive(s)) this._shownKey = '';\n return;\n }\n showLayer(layer, this._dom);\n this._ensureTriggers();\n const step = s.loaded.tour.steps[s.index]!;\n const key = `${s.loaded.tour.id}/${s.index}/${s.phase}`;\n const fresh = key !== this._shownKey;\n if (fresh) {\n this._shownKey = key;\n this._shownAt = this._dom.scheduler.now();\n raiseLayer(layer, this._dom);\n if (s.phase === 'showing') this._onStepShown(step);\n this._announce();\n }\n if (s.phase === 'showing' || s.phase === 'fallback') {\n if (!this._tracker) this._tracker = this._makeTracker();\n this._tracker.start();\n this._tracker.notify();\n } else this._tracker?.stop();\n }\n\n /** Manual and fallback steps take focus — once placed: a hidden bubble cannot be focused. */\n private _applyPendingFocus(): void {\n const primary = this._focusPending ? this.renderRoot.querySelector<HTMLElement>('[part~=\"primary\"]') : null;\n if (!primary) return;\n this._focusPending = false;\n primary.focus({ preventScroll: true });\n }\n\n private _onStepShown(step: TourStep): void {\n const target = this._target;\n this._change?.stop();\n this._change = null;\n if (target && step.advance === 'change') {\n const token = this._s.token;\n this._change = watchChange(target, valueSignature, () => this._dispatch({ type: 'TRIGGER', token, kind: 'change' }), this._dom.scheduler);\n }\n if (target) {\n const r = this._dom.rect(target);\n const vp = this._dom.viewport();\n const inside = r && r.x >= vp.x && r.y >= vp.y && r.x + r.width <= vp.x + vp.width && r.y + r.height <= vp.y + vp.height;\n if (!inside) this._dom.scrollIntoView(target, this._dom.reducedMotion());\n }\n // Focus never leaves an app element; it only comes back out of the overlay.\n const active = this._deepActive();\n if (active && this.renderRoot.contains(active) && step.advance !== 'manual') {\n const back = target instanceof HTMLElement ? target : this._appFocus;\n (back as HTMLElement | null)?.focus?.({ preventScroll: true });\n }\n }\n\n private _announce(): void {\n this._dom.scheduler.raf(() => {\n const live = this.renderRoot.querySelector('[role=\"status\"]');\n const bubble = this._bubble();\n if (!live) return;\n live.textContent = '';\n if (this._s.phase === 'paused') live.textContent = resolveTourStrings(this._s.loaded?.tour.locale ?? 'en', this.strings).paused;\n else if (bubble) {\n const part = (p: string) => bubble.querySelector(`[part~=\"${p}\"]`)?.textContent?.trim() ?? '';\n live.textContent = [part('title'), part('body'), part('progress')].filter(Boolean).join(' ');\n }\n });\n }\n\n private _makeTracker(): Tracker {\n return createTracker({\n dom: this._dom,\n layer: () => this._layer(),\n bubble: () => this._bubble(),\n target: () => (this._s.phase === 'showing' ? this._target : null),\n refind: () => {\n const id = this._s.loaded?.tour.steps[this._s.index]?.target;\n const found = id && this._resolver ? this._resolver.find(id) : null;\n if (found) this._target = found;\n return found;\n },\n preferred: () => this._preferredSide(),\n avoid: () => this._nextTargetRect(),\n dialogs: () => this._openDialogs(),\n onPlaced: () => this._applyPendingFocus(),\n onLost: () => {\n // Queued behind any click trigger already deferred: a click whose\n // handler removes its own target (a dialog's Save) advances, it does\n // not lose the step. The stale token then drops this report.\n const token = this._s.token;\n this._dom.scheduler.setTimeout(() => this._dispatch({ type: 'TARGET_LOST', token }), 0);\n },\n });\n }\n\n private _preferredSide(): TooltipSide | 'auto' {\n const step = this._s.loaded?.tour.steps[this._s.index];\n if (step?.placement && step.placement !== 'auto') return step.placement;\n return step?.advance === 'change' && this._target && isComboboxLike(this._target) ? 'top' : 'auto';\n }\n\n private _nextTargetRect(): Rect | null {\n const s = this._s;\n const steps = s.loaded?.tour.steps ?? [];\n const next = steps.find((st, j) => j > s.index && s.loaded!.applicable[j]);\n const el = next?.target && this._resolver ? this._resolver.find(next.target) : null;\n return el ? this._dom.rect(el) : null;\n }\n\n /** The app's open dialogs (the overlay's own bubble is in the shadow root, so never one of them). */\n private _openDialogs(): Rect[] {\n const out: Rect[] = [];\n for (const el of document.querySelectorAll(APP_DIALOG)) {\n const r = this._dom.rect(el);\n if (r) out.push(r);\n }\n return out;\n }\n\n private _ensureTriggers(): void {\n if (this._detach || !this._run) return;\n this._detach = attachTriggers({\n host: this,\n attr: this._run.load.testIdAttribute,\n state: () => this._s,\n dispatch: (e) => this._dispatch(e),\n target: () => this._target,\n persistAhead: (from) => {\n const s = this._s;\n const next = s.loaded!.applicable.findIndex((ok, j) => ok && j > from);\n if (next === -1) clearResume();\n else this._persist(next);\n },\n interacted: () => this._change?.arm(),\n tick: () => this._change?.tick(),\n defer: (cb) => this._dom.scheduler.setTimeout(cb, 0),\n });\n document.addEventListener('focusin', this._onFocusIn, true);\n }\n\n private _onFocusIn = (e: FocusEvent) => {\n if (!e.composedPath().includes(this)) this._appFocus = e.composedPath()[0] as Element;\n };\n\n /** Our buttons: a click counts only if it was pressed on this step (or, by keyboard, after a short grace). */\n private _guarded(e: MouseEvent, act: () => void): void {\n e.stopPropagation();\n const keyboard = e.detail === 0;\n if (keyboard ? this._dom.scheduler.now() - this._shownAt < KEYBOARD_GRACE_MS : this._pressToken !== this._s.token) return;\n act();\n }\n\n private _deepActive(): Element | null {\n let el = document.activeElement;\n while (el?.shadowRoot?.activeElement) el = el.shadowRoot.activeElement;\n return el;\n }\n\n private _teardown(restoreFocus: boolean): void {\n this._cancelWait?.();\n this._cancelWait = null;\n this._tracker?.stop();\n this._tracker = null;\n this._change?.stop();\n this._change = null;\n this._detach?.();\n this._detach = null;\n document.removeEventListener('focusin', this._onFocusIn, true);\n this._lang.disconnect();\n const active = this._deepActive();\n if (restoreFocus && active && this.renderRoot.contains(active) && this._appFocus instanceof HTMLElement) {\n this._appFocus.focus({ preventScroll: true });\n }\n this._target = null;\n this._run = null;\n this._resolver = null;\n this._shownKey = '';\n if (g[ACTIVE] === this) g[ACTIVE] = null;\n if (!restoreFocus && this._s.phase !== 'idle') this._s = { ...initialState(), token: this._s.token + 1 };\n }\n\n // ── Links in step text ──────────────────────────────────────────────────\n\n private _link(url: string): ReturnType<LinkPolicy['link']> {\n const run = this._run;\n const base = run?.base ?? basePath(document.baseURI, location.origin);\n const path = linkHref(url, base, location.origin);\n if (path !== null) {\n return {\n kind: 'internal',\n href: path,\n onActivate: (e: MouseEvent) => {\n if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n e.preventDefault();\n const hook = this.navigate ?? ((p: string) => location.assign(p));\n void Promise.resolve(hook(path, { appPath: toAppPath(path, base), tourId: run?.tourId ?? '' })).catch(() => undefined);\n },\n };\n }\n const origin = httpOrigin(url);\n const trusted = run?.load.guideOrigin ?? null;\n return origin && trusted && origin === trusted ? { kind: 'external', href: url } : null;\n }\n}\n\n/** Register ``<steppy-tour-host>`` once; a second call (or a second copy of the bundle) is a no-op. */\nexport function defineTourHost(): void {\n const existing = customElements.get(TOUR_HOST_TAG);\n if (!existing) customElements.define(TOUR_HOST_TAG, SteppyTourHost);\n else if (existing !== SteppyTourHost) {\n console.warn(`[steppy-tour] <${TOUR_HOST_TAG}> is already defined by another copy of the overlay; keeping that one`);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'steppy-tour-host': SteppyTourHost;\n }\n}\n","/**\n * ``@steppy/player/tour`` — the in-app tour overlay.\n *\n * Importing this module registers ``<steppy-tour-host>`` (once, even if two\n * copies of the bundle load). It touches ``HTMLElement`` at load, so a\n * server-rendered app imports it in the browser only.\n */\n\nimport { defineTourHost } from './host.js';\n\nexport { SteppyTourHost, defineTourHost } from './host.js';\nexport type { TourHostApi, TourNavigate, TourNavigateContext, TourPosition, TourSource, TourStartOptions, TourStringOverrides } from './api.js';\nexport type { TourEventDetailMap, TourEventMeta, TourStepPosition } from './events.js';\nexport type { DismissVia, StepReason, TourErrorDetail, TourSourceKind } from './engine.js';\nexport {\n ADVANCE_KINDS,\n PLACEMENTS,\n TOUR_ERROR_REASONS,\n TOUR_EVENTS,\n TOUR_PARTS,\n TOUR_SCHEMA_VERSION,\n type AdvanceKind,\n type Placement,\n type TourErrorReason,\n type TourEventName,\n type TourPart,\n} from './contract.js';\nexport { TOUR_HOST_TAG, TOURS_KILL_SWITCH_GLOBAL } from '../ui/names.js';\nexport { DEFAULT_TOUR_STRINGS, type TourStrings } from './strings.js';\nexport { validateManifest, validateTour, type TourFile, type TourManifest, type TourStep } from './validate.js';\n\ndefineTourHost();\n"],"names":["t","e","s","o","n$2","r","n","i","S","c","h","a","l","p","d","u","f","b","y$1","y","v","_","m","g","$","x","E","C","P","V","N","I","L","z","H","M","R","k","Z","B","D","TOUR_HOST_TAG","TOURS_MANIFEST_KIND","TOUR_FILE_KIND","TOURS_KILL_SWITCH_GLOBAL","TOUR_RESUME_STORAGE_KEY","TOUR_ACTIVE_SYMBOL_KEY","TOUR_SCHEMA_VERSION","ADVANCE_KINDS","TARGETED_ADVANCE_KINDS","PLACEMENTS","TOUR_EVENTS","TOUR_ERROR_REASONS","TOUR_PARTS","TEST_ID_PATTERN","STEP_ID_PATTERN","TEST_ID_ATTRIBUTE_PATTERN","TOUR_ID_PATTERN","LAYOUT_NAME_PATTERN","ROLE_PATTERN","LOCALE_PATTERN","SRI_PATTERN","ROUTE_PATTERN","MEDIA_QUERY_PATTERN","BUILD_ID_PATTERN","MAX_TOURS","MAX_STEPS","MAX_LOCALES","MAX_LAYOUTS","MAX_TITLE_CHARS","MAX_TEXT_CHARS","MAX_ROUTE_CHARS","MAX_URL_CHARS","MAX_MEDIA_QUERY_CHARS","MAX_TOUR_FILE_BYTES","MAX_MANIFEST_BYTES","DEFAULT_TARGET_TIMEOUT_MS","DEFAULT_BASE_Z_INDEX","OPPOSITE","placeTooltip","hotspot","tooltip","stage","gap","opts","legacyPlace","placeWithOptions","above","below","left","right","verticalNeeded","horizontalNeeded","bestVertical","pick","bestHorizontal","cx","cy","clamp","margin","room","order","sideOrder","fits","side","vertical","main","cross","crossStage","place","xCentred","yCentred","avoid","hits","intersects","fitting","chosen","best","overlaps","preferred","horizontal","rest","lo","hi","intersect","bottom","union","inflate","pad","FOCUSABLE","ownRect","el","effectiveRect","depth","style","acc","child","own","inner","defaultScheduler","cb","id","ms","defaultDom","vv","q","instant","initialState","isActive","position","index","applicable","meta","tour","stepDetail","step","emit","name","detail","resolveStep","reason","state","advanceFrom","from","next","ok","j","TRIGGER_FOR","reduce","none","loaded","base","start","st","effects","visibleWait","api","lost","old","emitTourEvent","host","deepActive","isLayerOpen","showLayer","dom","raiseLayer","active","format","template","vars","key","baseLanguage","tag","lookupLocale","keys","requested","norm","list","wanted","exact","resolveStrings","defaults","locale","overrides","fallback","overrideKey","override","CHROME_STRINGS","MAX_ISSUES","RX","WINDOWS_RESERVED","BAD_PERCENT","isRoutePattern","value","seg","isBuildId","httpOrigin","url","Checker","path","message","rx","max","optional","allowed","check","out","header","root","kind","parseJson","text","err","schemaGate","raw","schema","validateManifest","gate","buildId","testIdAttribute","locales","defaultLocale","guideOrigin","layouts","query","tours","seen","inLocales","files","loc","fp","title","tp","integrity","ip","validateTour","ctx","manifest","entry","guideUrl","origin","tourEntry","steps","ids","layoutNames","target","advanceObj","advance","RANK","LoadError","pickLocale","available","readCapped","res","cap","decoder","decode","bytes","reader","chunks","total","done","all","offset","loadTour","cfg","tourId","baseURI","doFetch","cache","abs","timeoutMs","get","isCross","controller","timer","init","getManifest","pending","parsed","errors","failed","what","bundled","expected","primary","remoteOrigin","ref","got","POLL_MS","MAX_MATCHES","createResolver","attr","find","selector","wait","req","frame","hiddenSince","hiddenTotal","started","attributeFilter","found","missing","stop","hidden","schedule","onVisibility","observer","poll","PARAM","segments","trimmed","matchRoute","pattern","want","have","params","param","routeParams","buildRoute","basePath","toAppPath","documentPath","toDocumentPath","appPath","isSafeRelativeUrl","linkHref","href","CONTROLS","ARIA","LIMIT","controlSig","valueSignature","controls","aria","isExpanded","editableText","editable","readFieldValue","isComboboxLike","RESUME_TTL_MS","store","writeResume","record","clearResume","readResume","manifestKey","now","fresh","DEFAULT_TOUR_STRINGS","resolveTourStrings","contentLocale","textDir","lang","sub","INSTRUCTION","instructionFor","strings","PALETTE","BUBBLE_LOOK","BUTTON_LOOK","TOUR_DEFAULTS","cssValue","unsafeCSS","tourStyles","css","SAFE_GUIDE_URL","GUIDE_LINK_POLICY","INLINE_SRC","renderInlineMarkdown","src","policy","parts","pushText","ln","html","re","last","trail","nextButton","nothing","label","bubble","body","showGuide","pill","renderLayer","SPOT_PAD","GAP","MARGIN","SHEET_BELOW","CLIPS","clippingAncestors","cs","createTracker","running","clips","clipsFor","px","tick","layer","vp","anchoredStep","centre","spot","clip","centreY","sheet","setMode","size","rel","centred","covered","mode","notify","onScroll","APP_DIALOG","attachTriggers","current","onClick","cur","token","to","performed","inTarget","onInput","onChange","onPress","onEscape","ours","watchChange","signature","armed","stopped","sig","cleanup","soon","ACTIVE","KEYBOARD_GRACE_MS","TIMEOUT_MIN","TIMEOUT_MAX","killSwitch","SteppyTourHost","LitElement","options","changed","pos","resumed","other","load","at","entryPath","route","here","built","error","fallbackManifest","source","run","seq","event","before","effect","hook","resolver","fieldNonEmpty","shown","live","part","act","restoreFocus","trusted","defineTourHost","existing"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
1
+ {"version":3,"file":"steppy-tour.js","sources":["../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/lit-html/lit-html.js","../node_modules/lit-element/lit-element.js","../src/ui/names.ts","../src/tour/contract.ts","../src/ui/placement.ts","../src/tour/dom.ts","../src/tour/engine.ts","../src/tour/events.ts","../src/tour/layer.ts","../src/ui/strings.ts","../src/tour/validate.ts","../src/tour/loader.ts","../src/tour/resolver.ts","../src/tour/routes.ts","../src/tour/signature.ts","../src/tour/storage.ts","../src/tour/strings.ts","../src/ui/tokens.ts","../src/tour/theme.ts","../src/tour/styles.ts","../src/ui/markdown.ts","../src/tour/templates.ts","../src/tour/tracker.ts","../src/tour/triggers.ts","../src/tour/host.ts","../src/tour/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.3\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * Product-derived names, the TypeScript twin of ``src/steppy/naming.py``.\n *\n * One literal per line on purpose: ``tests/test_tour_contract_sync.py`` reads\n * this file with regular expressions and fails when a value drifts from the\n * Python side. A future rename edits both files.\n */\n\nexport const PRODUCT = 'steppy';\nexport const TOUR_HOST_TAG = 'steppy-tour-host';\nexport const TOURS_MANIFEST_KIND = 'steppy-tours-manifest';\nexport const TOUR_FILE_KIND = 'steppy-tour';\nexport const TOURS_MANIFEST_FILENAME = 'tours.manifest.json';\nexport const TOURS_KILL_SWITCH_GLOBAL = '__STEPPY_TOURS_DISABLED__';\nexport const TOUR_RESUME_STORAGE_KEY = 'steppy:tour';\n/** ``globalThis[Symbol.for(...)]`` marks the host instance that owns the running tour. */\nexport const TOUR_ACTIVE_SYMBOL_KEY = 'steppy.tour.active';\n/** Prefix of every public CSS custom property (``--steppy-accent`` ...). */\nexport const CSS_TOKEN_PREFIX = '--steppy-';\n","/**\n * In-app tour data contract v1, the TypeScript twin of ``src/steppy/tour_spec.py``.\n *\n * The overlay validates every manifest and tour file against these values\n * (``validate.ts``); the compiler never emits anything they reject.\n * ``tests/test_tour_contract_sync.py`` keeps both sides equal, so every value\n * stays a plain literal: string patterns carry no backslashes, and arrays are\n * written on one line.\n */\n\nexport const TOUR_SCHEMA_VERSION = 1;\n\nexport const ADVANCE_KINDS = ['click', 'input', 'change', 'visible', 'manual'] as const;\nexport const TARGETED_ADVANCE_KINDS = ['click', 'input', 'change', 'visible'] as const;\nexport const PLACEMENTS = ['top', 'bottom', 'left', 'right', 'auto'] as const;\nexport const TOUR_EVENTS = ['tour-start', 'tour-step', 'tour-complete', 'tour-dismiss', 'tour-offpath', 'tour-error'] as const;\nexport const TOUR_ERROR_REASONS = ['target-timeout', 'entry-params', 'load-failed', 'schema-unsupported', 'invalid-data'] as const;\nexport const TOUR_PARTS = ['layer', 'spotlight', 'bubble', 'title', 'body', 'progress', 'button', 'primary', 'secondary', 'next', 'close', 'skip', 'end', 'resume', 'pill', 'guide-link'] as const;\nexport const ATTR_TOUR_ID = 'data-tour-id';\nexport const ATTR_STEP_ID = 'data-step-id';\nexport const ATTR_STATE = 'data-state';\nexport const ATTR_ADVANCE = 'data-advance';\nexport const BUBBLE_STATES = ['shown', 'fallback'] as const;\n/** Languages ``strings.ts`` ships chrome strings for; others need the host's ``strings``. */\nexport const CHROME_STRING_LOCALES = ['en', 'fr', 'nl', 'de'] as const;\n\nexport const TEST_ID_PATTERN = '^[A-Za-z0-9_.:/-]{1,128}$';\nexport const STEP_ID_PATTERN = '^[A-Za-z0-9_.:/-]{1,128}$';\nexport const TEST_ID_ATTRIBUTE_PATTERN = '^data-[a-z0-9-]+$';\nexport const TOUR_ID_PATTERN = '^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$';\nexport const LAYOUT_NAME_PATTERN = '^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$';\nexport const ROLE_PATTERN = '^[A-Za-z0-9_-]{1,64}$';\nexport const LOCALE_PATTERN = '^[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]{1,8}){0,5}$';\nexport const SRI_PATTERN = '^sha384-[A-Za-z0-9+/]{64}$';\nexport const TOUR_FILE_NAME_PATTERN = '^[A-Za-z0-9][A-Za-z0-9_-]{0,63}[.][A-Za-z0-9_-]{1,64}[.]json$';\nexport const ROUTE_PATTERN = '^/$|^(?:/(?::[A-Za-z_][A-Za-z0-9_]{0,63}|[A-Za-z0-9._~%!$&()*+,;=@-]{1,128})){1,32}$';\nexport const MEDIA_QUERY_PATTERN = '^[A-Za-z0-9 :().,<>=/_-]{1,256}$';\nexport const BUILD_ID_PATTERN = '^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,62}[A-Za-z0-9])?$';\n\nexport const MAX_TOURS = 500;\nexport const MAX_STEPS = 100;\nexport const MAX_LOCALES = 32;\nexport const MAX_LAYOUTS = 16;\nexport const MAX_TITLE_CHARS = 200;\nexport const MAX_TEXT_CHARS = 2000;\nexport const MAX_ROUTE_CHARS = 512;\nexport const MAX_URL_CHARS = 2048;\nexport const MAX_MEDIA_QUERY_CHARS = 256;\nexport const MAX_TOUR_FILE_BYTES = 262144;\nexport const MAX_MANIFEST_BYTES = 1048576;\n\n/** Player-only defaults (no Python twin). */\nexport const DEFAULT_TARGET_TIMEOUT_MS = 8000;\nexport const DEFAULT_BASE_Z_INDEX = 2147483000;\n\nexport type AdvanceKind = (typeof ADVANCE_KINDS)[number];\nexport type Placement = (typeof PLACEMENTS)[number];\nexport type TourEventName = (typeof TOUR_EVENTS)[number];\nexport type TourErrorReason = (typeof TOUR_ERROR_REASONS)[number];\nexport type TourPart = (typeof TOUR_PARTS)[number];\n","/**\n * Bubble placement next to a highlighted rect, shared by the guide player's\n * tooltip and the in-app tour popover. Pure math, no DOM.\n *\n * Called without options, ``placeTooltip`` is the guide's historical rule,\n * byte for byte (guard: ``test/ui/placement.test.ts`` against a frozen copy).\n * With options it honours a preferred side, keeps a margin from the stage\n * edges, steers clear of rects to ``avoid`` and reports whether the bubble\n * could not avoid covering the hotspot.\n *\n * ``Rect`` is declared here rather than imported from ``cursor/`` so the tour's\n * type declarations do not pull the cursor animator in.\n */\n\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport type TooltipSide = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TooltipPlacement {\n side: TooltipSide;\n /** Top-left offset, in display space, of the tooltip's bounding box. */\n x: number;\n y: number;\n /** Only with options: true when no side fits and the bubble covers the hotspot. */\n overlaps?: boolean;\n}\n\nexport interface PlaceOptions {\n /** Side to try first; ``auto`` (the default) uses the historical bias. */\n preferred?: TooltipSide | 'auto';\n /** Distance kept from every stage edge (default 0). */\n margin?: number;\n /** Rects a fitting side should not cover (e.g. the next step's target). */\n avoid?: readonly Rect[];\n}\n\ntype Size = { width: number; height: number };\n\nconst OPPOSITE: Record<TooltipSide, TooltipSide> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' };\n\n/**\n * Decide which side of the hotspot the tooltip should sit on. Picks the side\n * with the most room, then biases toward ``bottom`` for ties (matches\n * Guideflow's default).\n *\n * All inputs and outputs are in display space (the same coordinate frame as\n * the hotspot rect).\n */\nexport function placeTooltip(hotspot: Rect, tooltip: Size, stage: Size, gap = 8, opts?: PlaceOptions): TooltipPlacement {\n if (opts === undefined) return legacyPlace(hotspot, tooltip, stage, gap);\n return placeWithOptions(hotspot, tooltip, stage, gap, opts);\n}\n\nfunction legacyPlace(hotspot: Rect, tooltip: Size, stage: Size, gap: number): TooltipPlacement {\n const above = hotspot.y;\n const below = stage.height - (hotspot.y + hotspot.height);\n const left = hotspot.x;\n const right = stage.width - (hotspot.x + hotspot.width);\n\n // Prefer vertical placement (above or below). Only fall back to horizontal\n // when neither vertical side has room for the tooltip's height plus gap.\n const verticalNeeded = tooltip.height + gap;\n const horizontalNeeded = tooltip.width + gap;\n const bestVertical: { side: TooltipSide; room: number } =\n below >= above ? { side: 'bottom', room: below } : { side: 'top', room: above };\n let pick: TooltipSide;\n if (bestVertical.room >= verticalNeeded) {\n pick = bestVertical.side;\n } else {\n const bestHorizontal: { side: TooltipSide; room: number } =\n right >= left ? { side: 'right', room: right } : { side: 'left', room: left };\n pick = bestHorizontal.room >= horizontalNeeded ? bestHorizontal.side : bestVertical.side;\n }\n\n const cx = hotspot.x + hotspot.width / 2;\n const cy = hotspot.y + hotspot.height / 2;\n\n let x = 0;\n let y = 0;\n if (pick === 'bottom') {\n x = clamp(cx - tooltip.width / 2, 0, stage.width - tooltip.width);\n y = Math.min(hotspot.y + hotspot.height + gap, stage.height - tooltip.height);\n } else if (pick === 'top') {\n x = clamp(cx - tooltip.width / 2, 0, stage.width - tooltip.width);\n y = Math.max(0, hotspot.y - tooltip.height - gap);\n } else if (pick === 'right') {\n x = Math.min(hotspot.x + hotspot.width + gap, stage.width - tooltip.width);\n y = clamp(cy - tooltip.height / 2, 0, stage.height - tooltip.height);\n } else {\n x = Math.max(0, hotspot.x - tooltip.width - gap);\n y = clamp(cy - tooltip.height / 2, 0, stage.height - tooltip.height);\n }\n return { side: pick, x, y };\n}\n\nfunction placeWithOptions(hotspot: Rect, tooltip: Size, stage: Size, gap: number, opts: PlaceOptions): TooltipPlacement {\n const margin = opts.margin ?? 0;\n const room: Record<TooltipSide, number> = {\n top: hotspot.y - margin,\n bottom: stage.height - (hotspot.y + hotspot.height) - margin,\n left: hotspot.x - margin,\n right: stage.width - (hotspot.x + hotspot.width) - margin,\n };\n const order = sideOrder(room, opts.preferred ?? 'auto');\n const fits = (side: TooltipSide): boolean => {\n const vertical = side === 'top' || side === 'bottom';\n const main = vertical ? tooltip.height : tooltip.width;\n const cross = vertical ? tooltip.width : tooltip.height;\n const crossStage = vertical ? stage.width : stage.height;\n return room[side] >= main + gap && cross <= crossStage - 2 * margin;\n };\n const place = (side: TooltipSide): TooltipPlacement => {\n const cx = hotspot.x + hotspot.width / 2;\n const cy = hotspot.y + hotspot.height / 2;\n const xCentred = clamp(cx - tooltip.width / 2, margin, stage.width - tooltip.width - margin);\n const yCentred = clamp(cy - tooltip.height / 2, margin, stage.height - tooltip.height - margin);\n if (side === 'bottom') return { side, x: xCentred, y: hotspot.y + hotspot.height + gap };\n if (side === 'top') return { side, x: xCentred, y: hotspot.y - gap - tooltip.height };\n if (side === 'right') return { side, x: hotspot.x + hotspot.width + gap, y: yCentred };\n return { side, x: hotspot.x - gap - tooltip.width, y: yCentred };\n };\n const avoid = opts.avoid ?? [];\n const hits = (p: TooltipPlacement): boolean =>\n avoid.some((r) => intersects({ x: p.x, y: p.y, width: tooltip.width, height: tooltip.height }, r));\n\n const fitting = order.filter(fits).map(place);\n const clear = fitting.filter((p) => !hits(p));\n const chosen = clear[0] ?? fitting[0];\n if (chosen) return { ...chosen, overlaps: false };\n\n // Nothing fits: best effort on the first side in order, kept inside the stage.\n const best = place(order[0]!);\n const x = clamp(best.x, margin, stage.width - tooltip.width - margin);\n const y = clamp(best.y, margin, stage.height - tooltip.height - margin);\n const overlaps = intersects({ x, y, width: tooltip.width, height: tooltip.height }, hotspot);\n return { side: best.side, x, y, overlaps };\n}\n\nfunction sideOrder(room: Record<TooltipSide, number>, preferred: TooltipSide | 'auto'): TooltipSide[] {\n if (preferred === 'auto') {\n const vertical: TooltipSide[] = room.bottom >= room.top ? ['bottom', 'top'] : ['top', 'bottom'];\n const horizontal: TooltipSide[] = room.right >= room.left ? ['right', 'left'] : ['left', 'right'];\n return [...vertical, ...horizontal];\n }\n const rest = (['top', 'bottom', 'left', 'right'] as TooltipSide[])\n .filter((s) => s !== preferred && s !== OPPOSITE[preferred])\n .sort((a, b) => room[b] - room[a]);\n return [preferred, OPPOSITE[preferred], ...rest];\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v));\n}\n\n/** True when ``a`` and ``b`` share a positive area. */\nexport function intersects(a: Rect, b: Rect): boolean {\n return a.x < b.x + b.width && b.x < a.x + a.width && a.y < b.y + b.height && b.y < a.y + a.height;\n}\n\n/** The overlap of ``a`` and ``b``, or ``null`` when they share no area. */\nexport function intersect(a: Rect, b: Rect): Rect | null {\n const x = Math.max(a.x, b.x);\n const y = Math.max(a.y, b.y);\n const right = Math.min(a.x + a.width, b.x + b.width);\n const bottom = Math.min(a.y + a.height, b.y + b.height);\n return right > x && bottom > y ? { x, y, width: right - x, height: bottom - y } : null;\n}\n\n/** The smallest rect containing both. */\nexport function union(a: Rect, b: Rect): Rect {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return {\n x,\n y,\n width: Math.max(a.x + a.width, b.x + b.width) - x,\n height: Math.max(a.y + a.height, b.y + b.height) - y,\n };\n}\n\n/** ``r`` grown by ``pad`` on every side. */\nexport function inflate(r: Rect, pad: number): Rect {\n return { x: r.x - pad, y: r.y - pad, width: r.width + 2 * pad, height: r.height + 2 * pad };\n}\n\nexport function containsPoint(r: Rect, x: number, y: number): boolean {\n return x >= r.x && x <= r.x + r.width && y >= r.y && y <= r.y + r.height;\n}\n","/**\n * Everything the overlay asks the browser about geometry and timing, behind\n * one interface. ``defaultDom`` is the real thing; tests swap\n * ``SteppyTourHost.dom`` for a stub with settable rects and a manual\n * scheduler (happy-dom has no layout, and its rAF escapes fake timers).\n */\n\nimport { union, type Rect } from '../ui/placement.js';\n\nexport interface Scheduler {\n now(): number;\n raf(cb: () => void): number;\n cancelRaf(id: number): void;\n setTimeout(cb: () => void, ms: number): number;\n clearTimeout(id: number): void;\n setInterval(cb: () => void, ms: number): number;\n clearInterval(id: number): void;\n}\n\nexport interface Viewport {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface DomAdapter {\n scheduler: Scheduler;\n /** The element's effective rect (see ``effectiveRect``), or null when it has none. */\n rect(el: Element): Rect | null;\n isVisible(el: Element): boolean;\n /** The visual viewport, in layout-viewport coordinates. */\n viewport(): Viewport;\n matchMedia(query: string): boolean;\n reducedMotion(): boolean;\n scrollIntoView(el: Element, instant: boolean): void;\n supportsPopover(): boolean;\n}\n\nconst FOCUSABLE = 'button,input,select,textarea,a[href],[role=button],[role=combobox],[tabindex]:not([tabindex=\"-1\"])';\n\nfunction ownRect(el: Element): Rect | null {\n const r = el.getBoundingClientRect();\n return r.width > 0 && r.height > 0 ? { x: r.left, y: r.top, width: r.width, height: r.height } : null;\n}\n\n/**\n * Playwright's notion of a visible box, extended for wrapper hosts: an element\n * with ``display: contents`` measures as the union of its children, and an\n * empty 0x0 host (a custom element wrapping a native control) as its first\n * visible focusable descendant.\n */\nexport function effectiveRect(el: Element, depth = 0): Rect | null {\n const style = getComputedStyle(el);\n if (style.visibility === 'hidden') return null;\n if (style.display === 'contents' && depth < 3) {\n let acc: Rect | null = null;\n for (const child of el.children) {\n const r = effectiveRect(child, depth + 1);\n if (r) acc = acc ? union(acc, r) : r;\n }\n return acc;\n }\n const own = ownRect(el);\n if (own || depth >= 3) return own;\n for (const inner of el.querySelectorAll(FOCUSABLE)) {\n const r = ownRect(inner);\n if (r && getComputedStyle(inner).visibility !== 'hidden') return r;\n }\n return null;\n}\n\nexport const defaultScheduler: Scheduler = {\n now: () => performance.now(),\n raf: (cb) => requestAnimationFrame(cb),\n cancelRaf: (id) => cancelAnimationFrame(id),\n setTimeout: (cb, ms) => window.setTimeout(cb, ms),\n clearTimeout: (id) => window.clearTimeout(id),\n setInterval: (cb, ms) => window.setInterval(cb, ms),\n clearInterval: (id) => window.clearInterval(id),\n};\n\nexport const defaultDom: DomAdapter = {\n scheduler: defaultScheduler,\n rect: (el) => effectiveRect(el),\n isVisible: (el) => effectiveRect(el) !== null,\n viewport: () => {\n const vv = window.visualViewport;\n return vv\n ? { x: vv.offsetLeft, y: vv.offsetTop, width: vv.width, height: vv.height }\n : { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight };\n },\n matchMedia: (q) => {\n try {\n return window.matchMedia(q).matches;\n } catch {\n return false;\n }\n },\n reducedMotion: () => defaultDom.matchMedia('(prefers-reduced-motion: reduce)'),\n scrollIntoView: (el, instant) =>\n el.scrollIntoView({ block: 'center', inline: 'nearest', behavior: instant ? 'instant' : 'smooth' } as ScrollIntoViewOptions),\n supportsPopover: () => typeof HTMLElement.prototype.showPopover === 'function',\n};\n","/**\n * The tour state machine, as a pure reducer: ``reduce(state, event)`` returns\n * the next state and the effects the host must carry out (load, navigate, wait\n * for an element, emit an event, persist the resume record, ...). No DOM, no\n * timers — every transition is a unit test.\n *\n * Async results come back as events carrying the ``token`` they were started\n * under; ``token`` changes whenever a step or phase change invalidates pending\n * work, so a late answer from an abandoned wait is dropped instead of moving\n * the tour.\n *\n * Phases: ``idle`` → ``loading`` → (``entering``) → ``resolving`` →\n * ``showing``; a target that does not appear in time puts the step in\n * ``fallback`` (the \"can't find this element\" popover, with Skip / End); a\n * target that disappears while shown goes ``lost``, then ``paused`` (the pill)\n * when it stays away.\n */\n\nimport type { AdvanceKind, TourErrorReason } from './contract.js';\nimport type { Issue, TourFile } from './validate.js';\n\nexport type Phase = 'idle' | 'loading' | 'entering' | 'resolving' | 'showing' | 'lost' | 'fallback' | 'paused';\nexport type StepReason = 'start' | 'advance' | 'jump' | 'skip' | 'resume' | 'recovered';\nexport type DismissVia = 'close' | 'escape' | 'end' | 'api' | 'replaced' | 'disabled';\nexport type TourSourceKind = 'bundled' | 'remote' | 'custom';\nexport type TriggerKind = 'click' | 'input-commit' | 'change' | 'visible';\nexport type WaitMode = 'resolve' | 'fallback' | 'lost' | 'paused' | 'visible';\n\nexport interface Loaded {\n tour: TourFile;\n source: TourSourceKind;\n /** Per step: does it apply to the current layout (``tours.layouts``)? */\n applicable: readonly boolean[];\n start: number;\n resumed: boolean;\n /** The entry route must be navigated to before the first step. */\n navigate: boolean;\n}\n\nexport interface TourErrorDetail {\n reason: TourErrorReason;\n fatal: boolean;\n message: string;\n tourId?: string;\n buildId?: string;\n locale?: string;\n stepId?: string;\n index?: number;\n testId?: string;\n kind?: 'target' | 'waitFor';\n missing?: string[];\n issues?: Issue[];\n}\n\nexport interface EngineState {\n readonly phase: Phase;\n readonly token: number;\n readonly loaded: Loaded | null;\n readonly index: number;\n /** The ``tour-step`` reason to report when the pending step shows. */\n readonly reason: StepReason;\n readonly fieldNonEmpty: boolean;\n}\n\nexport type EngineEvent =\n | { type: 'REQUEST' }\n | { type: 'LOADED'; loaded: Loaded }\n | { type: 'LOAD_FAILED'; error: TourErrorDetail }\n | { type: 'ENTER_DONE'; token: number }\n | { type: 'ENTER_FAILED'; token: number; message: string }\n | { type: 'RESOLVED'; token: number; fieldNonEmpty?: boolean }\n | { type: 'RESOLVE_TIMEOUT'; token: number; testId: string | null; kind: 'target' | 'waitFor' }\n | { type: 'TRIGGER'; token: number; kind: TriggerKind }\n | { type: 'NEXT'; token?: number }\n | { type: 'SKIP'; token: number }\n | { type: 'FIELD'; token: number; nonEmpty: boolean }\n | { type: 'JUMP'; token: number; to: number; performed: boolean }\n | { type: 'TARGET_LOST'; token: number }\n | { type: 'TARGET_BACK'; token: number }\n | { type: 'LOST_TIMEOUT'; token: number }\n | { type: 'RESUME'; token: number }\n | { type: 'DISMISS'; via: DismissVia; reason?: string }\n | { type: 'LOCALE'; tour: TourFile };\n\nexport type Effect =\n | { type: 'load' }\n | { type: 'emit'; name: 'tour-start' | 'tour-step' | 'tour-complete' | 'tour-dismiss' | 'tour-offpath' | 'tour-error'; detail: object }\n | { type: 'persist'; index: number }\n | { type: 'clearPersist' }\n | { type: 'navigate'; token: number }\n | { type: 'wait'; mode: WaitMode; index: number; token: number }\n | { type: 'focus' }\n | { type: 'teardown' };\n\nexport interface Transition {\n state: EngineState;\n effects: Effect[];\n}\n\nexport function initialState(): EngineState {\n return { phase: 'idle', token: 0, loaded: null, index: 0, reason: 'start', fieldNonEmpty: false };\n}\n\nexport const isActive = (s: EngineState): boolean => s.phase !== 'idle' && s.phase !== 'loading';\n\n/** Position among applicable steps (0-based) and their count — what progress shows. */\nexport function position(s: EngineState, index = s.index): { index: number; total: number } {\n const applicable = s.loaded?.applicable ?? [];\n return { index: applicable.slice(0, index).filter(Boolean).length, total: applicable.filter(Boolean).length };\n}\n\nfunction meta(s: EngineState) {\n const tour = s.loaded!.tour;\n return { tourId: tour.id, buildId: tour.buildId, locale: tour.locale };\n}\n\nfunction stepDetail(s: EngineState) {\n const step = s.loaded!.tour.steps[s.index]!;\n return { ...meta(s), stepId: step.id, ...position(s) };\n}\n\nconst emit = (name: Extract<Effect, { type: 'emit' }>['name'], detail: object): Effect => ({ type: 'emit', name, detail });\n\n/** Enter ``index`` in ``resolving`` (a fresh token: every pending wait is void). */\nfunction resolveStep(s: EngineState, index: number, reason: StepReason): Transition {\n const state: EngineState = { ...s, phase: 'resolving', index, reason, token: s.token + 1, fieldNonEmpty: false };\n return { state, effects: [{ type: 'persist', index }, { type: 'wait', mode: 'resolve', index, token: state.token }] };\n}\n\n/** Move past ``from`` to the next applicable step, or complete the tour. */\nfunction advanceFrom(s: EngineState, from: number, reason: StepReason): Transition {\n const applicable = s.loaded!.applicable;\n const next = applicable.findIndex((ok, j) => ok && j > from);\n if (next === -1) {\n const done = { ...initialState(), token: s.token + 1 };\n return {\n state: done,\n effects: [emit('tour-complete', { ...meta(s), total: position(s).total }), { type: 'clearPersist' }, { type: 'teardown' }],\n };\n }\n return resolveStep(s, next, reason);\n}\n\nfunction step(s: EngineState) {\n return s.loaded!.tour.steps[s.index]!;\n}\n\nconst TRIGGER_FOR: Record<TriggerKind, AdvanceKind> = {\n click: 'click',\n 'input-commit': 'input',\n change: 'change',\n visible: 'visible',\n};\n\nexport function reduce(s: EngineState, e: EngineEvent): Transition {\n const none: Transition = { state: s, effects: [] };\n if ('token' in e && e.token !== undefined && e.token !== s.token) return none;\n\n switch (e.type) {\n case 'REQUEST':\n return { state: { ...initialState(), phase: 'loading', token: s.token + 1 }, effects: [{ type: 'load' }] };\n\n case 'LOAD_FAILED':\n if (s.phase !== 'loading') return none;\n return {\n state: { ...initialState(), token: s.token + 1 },\n effects: [emit('tour-error', e.error), { type: 'clearPersist' }, { type: 'teardown' }],\n };\n\n case 'LOADED': {\n if (s.phase !== 'loading') return none;\n const loaded = e.loaded;\n const base: EngineState = { ...s, loaded, index: loaded.start };\n const start = emit('tour-start', {\n ...meta(base),\n total: position(base).total,\n source: loaded.source,\n resumed: loaded.resumed,\n entryNavigated: loaded.navigate,\n });\n const reason: StepReason = loaded.resumed ? 'resume' : 'start';\n if (loaded.navigate) {\n const state: EngineState = { ...base, phase: 'entering', reason, token: s.token + 1 };\n return { state, effects: [start, { type: 'persist', index: loaded.start }, { type: 'navigate', token: state.token }] };\n }\n const t = resolveStep(base, loaded.start, reason);\n return { state: t.state, effects: [start, ...t.effects] };\n }\n\n case 'ENTER_DONE':\n return s.phase === 'entering' ? resolveStep(s, s.index, s.reason) : none;\n\n case 'ENTER_FAILED':\n if (s.phase !== 'entering') return none;\n return {\n state: { ...initialState(), token: s.token + 1 },\n effects: [\n emit('tour-error', { reason: 'entry-params', fatal: true, message: e.message, ...meta(s) }),\n { type: 'clearPersist' },\n { type: 'teardown' },\n ],\n };\n\n case 'RESOLVED': {\n if (s.phase !== 'resolving' && s.phase !== 'fallback') return none;\n const reason: StepReason = s.phase === 'fallback' ? 'recovered' : s.reason;\n const state: EngineState = { ...s, phase: 'showing', reason, token: s.token + 1, fieldNonEmpty: e.fieldNonEmpty ?? false };\n const st = step(state);\n const effects: Effect[] = [emit('tour-step', { ...stepDetail(state), advance: st.advance, reason })];\n if (st.advance === 'manual') effects.push({ type: 'focus' });\n if (st.advance === 'visible') effects.push({ type: 'wait', mode: 'visible', index: s.index, token: state.token });\n return { state, effects };\n }\n\n case 'RESOLVE_TIMEOUT': {\n const visibleWait = s.phase === 'showing' && step(s).advance === 'visible';\n if (s.phase !== 'resolving' && !visibleWait) return none;\n const state: EngineState = { ...s, phase: 'fallback', token: s.token + 1 };\n const detail = { ...stepDetail(state), reason: 'target-timeout', fatal: false, message: 'the target did not appear in time' };\n return {\n state,\n effects: [\n emit('tour-error', { ...detail, ...(e.testId ? { testId: e.testId } : {}), kind: e.kind }),\n { type: 'wait', mode: 'fallback', index: s.index, token: state.token },\n { type: 'focus' },\n ],\n };\n }\n\n case 'TRIGGER':\n if (s.phase !== 'showing' || step(s).advance !== TRIGGER_FOR[e.kind]) return none;\n return advanceFrom(s, s.index, 'advance');\n\n case 'NEXT': {\n const api = e.token === undefined;\n if (s.phase === 'fallback' && api) return advanceFrom(s, s.index, 'skip');\n if (s.phase !== 'showing') return none;\n if (!api && step(s).advance === 'input' && !s.fieldNonEmpty) return none;\n return advanceFrom(s, s.index, 'advance');\n }\n\n case 'SKIP':\n return s.phase === 'fallback' ? advanceFrom(s, s.index, 'skip') : none;\n\n case 'FIELD':\n return s.phase === 'showing' && s.fieldNonEmpty !== e.nonEmpty ? { state: { ...s, fieldNonEmpty: e.nonEmpty }, effects: [] } : none;\n\n case 'JUMP': {\n const active = s.phase === 'showing' || s.phase === 'lost' || s.phase === 'paused' || s.phase === 'fallback';\n if (!active || e.to <= s.index || !s.loaded!.applicable[e.to]) return none;\n return e.performed ? advanceFrom(s, e.to, 'jump') : resolveStep(s, e.to, 'jump');\n }\n\n case 'TARGET_LOST':\n if (s.phase !== 'showing') return none;\n return lost(s);\n\n case 'TARGET_BACK': {\n if (s.phase !== 'lost' && s.phase !== 'paused') return none;\n const state: EngineState = { ...s, phase: 'showing', token: s.token + 1 };\n if (s.phase === 'lost') return { state, effects: [] }; // a silent re-show\n return {\n state: { ...state, reason: 'resume' },\n effects: [emit('tour-step', { ...stepDetail(state), advance: step(state).advance, reason: 'resume' })],\n };\n }\n\n case 'LOST_TIMEOUT': {\n if (s.phase !== 'lost') return none;\n const state: EngineState = { ...s, phase: 'paused', token: s.token + 1 };\n return {\n state,\n effects: [\n emit('tour-offpath', { ...stepDetail(state), reason: 'target-lost' }),\n { type: 'wait', mode: 'paused', index: s.index, token: state.token },\n ],\n };\n }\n\n case 'RESUME':\n return s.phase === 'paused' ? resolveStep(s, s.index, 'resume') : none;\n\n case 'DISMISS': {\n if (s.phase === 'idle') return none;\n const effects: Effect[] = [];\n if (s.loaded && s.phase !== 'loading') {\n effects.push(emit('tour-dismiss', { ...stepDetail(s), via: e.via, ...(e.reason ? { reason: e.reason } : {}) }));\n }\n effects.push({ type: 'clearPersist' }, { type: 'teardown' });\n return { state: { ...initialState(), token: s.token + 1 }, effects };\n }\n\n case 'LOCALE': {\n if (!isActive(s)) return none;\n const old = s.loaded!.tour.steps;\n const same =\n e.tour.steps.length === old.length &&\n e.tour.steps.every((st, i) => st.id === old[i]!.id && st.target === old[i]!.target && st.advance === old[i]!.advance);\n return same ? { state: { ...s, loaded: { ...s.loaded!, tour: e.tour } }, effects: [] } : none;\n }\n }\n}\n\nfunction lost(s: EngineState): Transition {\n const state: EngineState = { ...s, phase: 'lost', token: s.token + 1 };\n return { state, effects: [{ type: 'wait', mode: 'lost', index: s.index, token: state.token }] };\n}\n","/**\n * The six DOM events the overlay dispatches on its host element — bubbling\n * and composed, JSON-only details. Colon-free names on purpose: Angular\n * templates read ``(a:b)`` as a global event target.\n */\n\nimport type { AdvanceKind } from './contract.js';\nimport type { DismissVia, StepReason, TourErrorDetail, TourSourceKind } from './engine.js';\n\nexport interface TourEventMeta {\n tourId: string;\n buildId: string;\n locale: string;\n}\n\nexport interface TourStepPosition extends TourEventMeta {\n stepId: string;\n /** 0-based, counting only the steps that apply to the current layout. */\n index: number;\n total: number;\n}\n\nexport interface TourEventDetailMap {\n 'tour-start': TourEventMeta & { total: number; source: TourSourceKind; resumed: boolean; entryNavigated: boolean };\n 'tour-step': TourStepPosition & { advance: AdvanceKind; reason: StepReason };\n 'tour-complete': TourEventMeta & { total: number };\n 'tour-dismiss': TourStepPosition & { via: DismissVia; reason?: string };\n 'tour-offpath': TourStepPosition & { reason: 'target-lost' };\n 'tour-error': TourErrorDetail;\n}\n\nexport function emitTourEvent<K extends keyof TourEventDetailMap>(host: EventTarget, name: K, detail: TourEventDetailMap[K]): void {\n host.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n}\n","/**\n * Stacking. Where the popover API exists the layer is a ``popover=\"manual\"``\n * element in the browser's top layer — above any z-index the app uses — and\n * every step re-raises it (hide, then show) so it stays above an app dialog\n * opened after it. Elsewhere the layer falls back to ``z-index: var(--_pw-z)``.\n *\n * Known limit: a native ``<dialog>`` opened with ``showModal()`` makes\n * everything outside it inert, the layer included; re-raising does not lift\n * that. Steps advanced by the app's own events still work, the overlay's\n * buttons do not until the dialog closes.\n */\n\nimport type { DomAdapter } from './dom.js';\n\nfunction deepActive(): Element | null {\n let el = document.activeElement;\n while (el?.shadowRoot?.activeElement) el = el.shadowRoot.activeElement;\n return el;\n}\n\nexport function isLayerOpen(el: HTMLElement): boolean {\n try {\n return el.matches(':popover-open');\n } catch {\n return false;\n }\n}\n\nexport function showLayer(el: HTMLElement, dom: DomAdapter): void {\n if (!dom.supportsPopover() || isLayerOpen(el)) return;\n try {\n el.showPopover();\n } catch {\n // Not connected yet or already shown elsewhere: the z-index fallback holds.\n }\n}\n\n/** Move the layer to the top of the top layer, keeping the app's focus where it was. */\nexport function raiseLayer(el: HTMLElement, dom: DomAdapter): void {\n if (!dom.supportsPopover()) return;\n const active = deepActive();\n try {\n if (isLayerOpen(el)) el.hidePopover();\n el.showPopover();\n } catch {\n return;\n }\n if (active instanceof HTMLElement && active.isConnected && deepActive() !== active) active.focus({ preventScroll: true });\n}\n","/**\n * The string mechanism both players share: placeholder formatting, locale\n * lookup with a base-language rung, and the chrome vocabulary they have in\n * common (so \"Next\" reads the same in the guide and in the tour).\n */\n\n/** Replace ``{name}`` placeholders; unknown names stay as written. */\nexport function format(template: string, vars: Record<string, string | number>): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => (key in vars ? String(vars[key]) : `{${key}}`));\n}\n\n/**\n * Bare language subtag, lowercased (``fr-BE`` -> ``fr``). Mirrors Python's\n * ``steppy.locales.base_language``: lenient, never validates.\n */\nexport function baseLanguage(tag: string): string {\n return tag.replace(/_/g, '-').split('-', 1)[0]!.toLowerCase();\n}\n\n/**\n * The key of ``keys`` to use for ``requested``: an exact match (case- and\n * ``_``/``-``-insensitive) first, then the requested tag's base language. The\n * query is only ever truncated, never widened — ``fr`` does not match ``fr-BE``.\n */\nexport function lookupLocale(keys: Iterable<string>, requested: string | null | undefined): string | null {\n if (!requested) return null;\n const norm = (tag: string) => tag.replace(/_/g, '-').toLowerCase();\n const list = [...keys];\n const wanted = norm(requested);\n const exact = list.find((key) => norm(key) === wanted);\n if (exact !== undefined) return exact;\n const base = baseLanguage(requested);\n return list.find((key) => norm(key) === base) ?? null;\n}\n\n/**\n * Bundled ``defaults`` for ``locale`` (else ``fallback``), with the host's\n * sparse per-locale ``overrides`` merged on top. Without an override the\n * bundled object itself is returned.\n */\nexport function resolveStrings<T extends object>(\n defaults: Record<string, T>,\n locale: string,\n overrides?: Partial<Record<string, Partial<T>>>,\n fallback = 'en',\n): T {\n const key = lookupLocale(Object.keys(defaults), locale);\n const base = (key !== null ? defaults[key] : undefined) ?? defaults[fallback]!;\n const overrideKey = overrides ? lookupLocale(Object.keys(overrides), locale) : null;\n const override = overrideKey !== null ? overrides![overrideKey] : undefined;\n return override ? { ...base, ...override } : base;\n}\n\nexport interface ChromeStrings {\n next: string;\n /** Placeholders: ``{current}`` and ``{total}``. */\n progress: string;\n}\n\n/** Chrome words the guide and the tour share, per bundled locale. */\nexport const CHROME_STRINGS: Record<'en' | 'fr' | 'nl' | 'de', ChromeStrings> = {\n en: { next: 'Next', progress: 'Step {current} of {total}' },\n fr: { next: 'Suivant', progress: 'Étape {current} sur {total}' },\n nl: { next: 'Volgende', progress: 'Stap {current} van {total}' },\n de: { next: 'Weiter', progress: 'Schritt {current} von {total}' },\n};\n","/**\n * The overlay's security boundary: every manifest and tour file is validated\n * here before anything renders, and a file that breaks any rule is rejected\n * whole (spec 7.1). Hand-written rather than zod so the tour bundle stays small.\n *\n * Only known keys are copied into fresh objects — unknown keys are ignored, so\n * a newer producer's extra field never breaks an older overlay — but unknown\n * enum values and an unknown schema major are rejected: a tour file is data,\n * never code. The rules mirror ``src/steppy/contracts/tours.py`` (the\n * producer's self-check); ``contracts/fixtures/tours/cases.json`` runs both\n * sides over the same cases.\n */\n\nimport { TOURS_MANIFEST_KIND, TOUR_FILE_KIND } from '../ui/names.js';\nimport {\n ADVANCE_KINDS,\n BUILD_ID_PATTERN,\n LAYOUT_NAME_PATTERN,\n LOCALE_PATTERN,\n MAX_LAYOUTS,\n MAX_LOCALES,\n MAX_MEDIA_QUERY_CHARS,\n MAX_ROUTE_CHARS,\n MAX_STEPS,\n MAX_TEXT_CHARS,\n MAX_TITLE_CHARS,\n MAX_TOURS,\n MAX_URL_CHARS,\n MEDIA_QUERY_PATTERN,\n PLACEMENTS,\n ROLE_PATTERN,\n ROUTE_PATTERN,\n SRI_PATTERN,\n STEP_ID_PATTERN,\n TARGETED_ADVANCE_KINDS,\n TEST_ID_ATTRIBUTE_PATTERN,\n TEST_ID_PATTERN,\n TOUR_ID_PATTERN,\n TOUR_SCHEMA_VERSION,\n type AdvanceKind,\n type Placement,\n} from './contract.js';\n\nexport interface TourEntry {\n readonly route: string;\n}\n\nexport interface ManifestTour {\n readonly id: string;\n readonly role: string;\n readonly title: Readonly<Record<string, string>>;\n readonly entry: TourEntry | null;\n readonly steps: number;\n readonly files: Readonly<Record<string, string>>;\n readonly integrity: Readonly<Record<string, string>>;\n}\n\nexport interface TourManifest {\n readonly buildId: string;\n readonly defaultLocale: string;\n readonly locales: readonly string[];\n readonly testIdAttribute: string;\n readonly guideOrigin: string | null;\n readonly layouts: Readonly<Record<string, string>> | null;\n readonly tours: readonly ManifestTour[];\n}\n\nexport interface TourStep {\n readonly id: string;\n readonly target: string | null;\n readonly advance: AdvanceKind;\n readonly waitFor: string | null;\n readonly title: string | null;\n readonly text: string | null;\n readonly placement: Placement | null;\n readonly layouts: readonly string[] | null;\n}\n\nexport interface TourFile {\n readonly id: string;\n readonly buildId: string;\n readonly locale: string;\n readonly title: string;\n readonly guideUrl: string | null;\n readonly entry: TourEntry | null;\n readonly steps: readonly TourStep[];\n}\n\nexport interface Issue {\n path: string;\n message: string;\n}\n\nexport type FailReason = 'invalid-data' | 'schema-unsupported' | 'load-failed';\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; reason: FailReason; issues: Issue[] };\n\nconst MAX_ISSUES = 20;\nconst RX = {\n testId: new RegExp(TEST_ID_PATTERN),\n stepId: new RegExp(STEP_ID_PATTERN),\n tourId: new RegExp(TOUR_ID_PATTERN),\n attr: new RegExp(TEST_ID_ATTRIBUTE_PATTERN),\n locale: new RegExp(LOCALE_PATTERN),\n layout: new RegExp(LAYOUT_NAME_PATTERN),\n role: new RegExp(ROLE_PATTERN),\n route: new RegExp(ROUTE_PATTERN),\n media: new RegExp(MEDIA_QUERY_PATTERN),\n sri: new RegExp(SRI_PATTERN),\n buildId: new RegExp(BUILD_ID_PATTERN),\n};\nconst WINDOWS_RESERVED = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/i;\nconst BAD_PERCENT = /%(?![0-9A-Fa-f]{2})/;\n\n/** A same-origin, base-relative route pattern (``/invoices/:invoiceId``). */\nexport function isRoutePattern(value: unknown): value is string {\n return (\n typeof value === 'string' &&\n value.length <= MAX_ROUTE_CHARS &&\n RX.route.test(value) &&\n !BAD_PERCENT.test(value) &&\n value\n .split('/')\n .slice(1)\n // ``%2e`` is a dot to a URL parser: ``/%2e%2e/x`` would climb out of the app's base.\n .every((seg) => !/^\\.\\.?$/.test(seg.replace(/%2e/gi, '.')))\n );\n}\n\nexport function isBuildId(value: unknown): value is string {\n return typeof value === 'string' && RX.buildId.test(value) && !WINDOWS_RESERVED.test(value.split('.')[0]!);\n}\n\n/** ``scheme://host[:port]`` of an absolute http(s) URL without credentials, else null. */\nexport function httpOrigin(value: string): string | null {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n return null;\n }\n if ((url.protocol !== 'https:' && url.protocol !== 'http:') || url.username || url.password) return null;\n return url.origin;\n}\n\nclass Checker {\n issues: Issue[] = [];\n fail(path: string, message: string): void {\n if (this.issues.length < MAX_ISSUES) this.issues.push({ path, message });\n }\n get ok(): boolean {\n return this.issues.length === 0;\n }\n obj(v: unknown, path: string): Record<string, unknown> | null {\n if (v !== null && typeof v === 'object' && !Array.isArray(v)) return v as Record<string, unknown>;\n this.fail(path, 'must be an object');\n return null;\n }\n str(v: unknown, path: string, rx?: RegExp): string | null {\n if (typeof v !== 'string') {\n this.fail(path, 'must be a string');\n return null;\n }\n if (rx && !rx.test(v)) {\n this.fail(path, `does not match ${rx.source}`);\n return null;\n }\n return v;\n }\n optStr(v: unknown, path: string, rx?: RegExp): string | null {\n return v === undefined || v === null ? null : this.str(v, path, rx);\n }\n text(v: unknown, path: string, max: number, optional: boolean): string | null {\n if (optional && (v === undefined || v === null)) return null;\n const s = this.str(v, path);\n if (s === null) return null;\n if (!s.trim()) this.fail(path, 'must not be empty');\n else if ([...s].length > max) this.fail(path, `is longer than ${max} characters`);\n return s;\n }\n int(v: unknown, path: string, lo: number, hi: number): number | null {\n if (typeof v === 'number' && Number.isInteger(v) && v >= lo && v <= hi) return v;\n this.fail(path, `must be an integer in ${lo}..${hi}`);\n return null;\n }\n oneOf<T extends string>(v: unknown, path: string, allowed: readonly T[]): T | null {\n if (typeof v === 'string' && (allowed as readonly string[]).includes(v)) return v as T;\n this.fail(path, `must be one of ${allowed.join(', ')}`);\n return null;\n }\n entry(v: unknown, path: string): TourEntry | null {\n if (v === null) return null;\n const o = this.obj(v, path);\n if (!o) return null;\n if (!isRoutePattern(o.route)) {\n this.fail(`${path}.route`, 'is not a same-origin, base-relative route pattern');\n return null;\n }\n return Object.freeze({ route: o.route });\n }\n stringMap(v: unknown, path: string, check: (key: string, value: unknown, p: string) => string | null): Record<string, string> {\n const out: Record<string, string> = {};\n const o = this.obj(v, path);\n if (!o) return out;\n for (const [key, value] of Object.entries(o)) {\n const s = check(key, value, `${path}.${key}`);\n if (s !== null) out[key] = s;\n }\n return Object.freeze(out);\n }\n}\n\nfunction header(c: Checker, root: Record<string, unknown>, kind: string): boolean {\n if (root.kind !== kind) c.fail('kind', `must be \"${kind}\"`);\n return c.ok;\n}\n\n/** Parse JSON text; an HTML body (an SPA fallback page) is a load failure, not bad data. */\nexport function parseJson(text: string): Result<unknown> {\n if (/^\\s*</.test(text)) {\n return { ok: false, reason: 'load-failed', issues: [{ path: '', message: 'received HTML (missing file or SPA fallback?)' }] };\n }\n try {\n return { ok: true, value: JSON.parse(text) as unknown };\n } catch (err) {\n return { ok: false, reason: 'invalid-data', issues: [{ path: '', message: `not JSON: ${String(err)}` }] };\n }\n}\n\nfunction schemaGate(raw: unknown): Result<Record<string, unknown>> {\n const c = new Checker();\n const root = c.obj(raw, '');\n if (!root) return { ok: false, reason: 'invalid-data', issues: c.issues };\n const schema = root.schema;\n if (typeof schema !== 'number' || !Number.isInteger(schema)) {\n return { ok: false, reason: 'invalid-data', issues: [{ path: 'schema', message: 'must be an integer' }] };\n }\n if (schema !== TOUR_SCHEMA_VERSION) {\n return {\n ok: false,\n reason: 'schema-unsupported',\n issues: [{ path: 'schema', message: `schema ${schema} is not supported (this overlay reads ${TOUR_SCHEMA_VERSION})` }],\n };\n }\n return { ok: true, value: root };\n}\n\nexport function validateManifest(raw: unknown): Result<TourManifest> {\n const gate = schemaGate(raw);\n if (!gate.ok) return gate;\n const root = gate.value;\n const c = new Checker();\n if (!header(c, root, TOURS_MANIFEST_KIND)) return { ok: false, reason: 'invalid-data', issues: c.issues };\n\n const buildId = isBuildId(root.buildId) ? root.buildId : (c.fail('buildId', 'is not a build id'), '');\n const testIdAttribute = c.str(root.testIdAttribute, 'testIdAttribute', RX.attr) ?? '';\n const locales: string[] = [];\n // Case and -/_ do not distinguish locales: ``fr-BE`` and ``fr_be`` name one file on most filesystems.\n const key = (l: string) => l.replace(/_/g, '-').toLowerCase();\n if (!Array.isArray(root.locales) || root.locales.length < 1 || root.locales.length > MAX_LOCALES) {\n c.fail('locales', `must list 1..${MAX_LOCALES} locales`);\n } else {\n root.locales.forEach((l, i) => {\n const s = c.str(l, `locales.${i}`, RX.locale);\n if (s !== null) locales.some((x) => key(x) === key(s)) ? c.fail(`locales.${i}`, 'is listed twice') : locales.push(s);\n });\n }\n const defaultLocale = c.str(root.defaultLocale, 'defaultLocale', RX.locale) ?? '';\n if (defaultLocale && !locales.includes(defaultLocale)) c.fail('defaultLocale', 'must be one of locales');\n\n let guideOrigin: string | null = null;\n if (root.guideOrigin !== undefined && root.guideOrigin !== null) {\n const s = c.str(root.guideOrigin, 'guideOrigin');\n if (s !== null && httpOrigin(s) !== s) c.fail('guideOrigin', 'must be an origin only (scheme://host[:port])');\n else guideOrigin = s;\n }\n\n let layouts: Record<string, string> | null = null;\n if (root.layouts !== undefined && root.layouts !== null) {\n layouts = c.stringMap(root.layouts, 'layouts', (name, query, p) => {\n if (!RX.layout.test(name)) return c.fail(p, 'is not a layout name'), null;\n if (typeof query !== 'string' || query.length > MAX_MEDIA_QUERY_CHARS || !RX.media.test(query)) {\n return c.fail(p, 'is not a media query'), null;\n }\n return query;\n });\n const n = Object.keys(layouts).length;\n if (n < 1 || n > MAX_LAYOUTS) c.fail('layouts', `must map 1..${MAX_LAYOUTS} layouts`);\n }\n\n const tours: ManifestTour[] = [];\n const seen = new Set<string>();\n if (!Array.isArray(root.tours) || root.tours.length > MAX_TOURS) {\n c.fail('tours', `must be a list of at most ${MAX_TOURS} tours`);\n } else {\n root.tours.forEach((t, i) => {\n const p = `tours.${i}`;\n const o = c.obj(t, p);\n if (!o) return;\n const id = c.str(o.id, `${p}.id`, RX.tourId);\n if (id !== null) {\n if (seen.has(id.toLowerCase())) c.fail(`${p}.id`, 'is not unique');\n seen.add(id.toLowerCase());\n }\n const inLocales = (key: string, path: string) => locales.includes(key) || (c.fail(path, 'is not one of locales'), false);\n const files = c.stringMap(o.files, `${p}.files`, (loc, name, fp) =>\n !inLocales(loc, fp) ? null : name !== `${id}.${loc}.json` ? (c.fail(fp, `must be \"${id}.${loc}.json\"`), null) : (name as string),\n );\n if (defaultLocale && !Object.hasOwn(files, defaultLocale)) c.fail(`${p}.files`, 'has no file for the default locale');\n const title = c.stringMap(o.title, `${p}.title`, (loc, v, tp) => (inLocales(loc, tp) ? c.text(v, tp, MAX_TITLE_CHARS, false) : null));\n // Every file carries its hash: a remote copy of it is fetched with that hash pinned.\n const integrity = c.stringMap(o.integrity, `${p}.integrity`, (loc, v, ip) =>\n !Object.hasOwn(files, loc) ? (c.fail(ip, 'has no matching file'), null) : c.str(v, ip, RX.sri),\n );\n for (const loc in files) if (!Object.hasOwn(integrity, loc)) c.fail(`${p}.integrity`, `has no hash for \"${loc}\"`);\n const tour: ManifestTour = Object.freeze({\n id: id ?? '',\n role: c.str(o.role, `${p}.role`, RX.role) ?? '',\n title,\n entry: c.entry(o.entry, `${p}.entry`),\n steps: c.int(o.steps, `${p}.steps`, 1, MAX_STEPS) ?? 0,\n files,\n integrity,\n });\n tours.push(tour);\n });\n }\n if (!c.ok) return { ok: false, reason: 'invalid-data', issues: c.issues };\n return {\n ok: true,\n value: Object.freeze({\n buildId,\n defaultLocale,\n locales: Object.freeze(locales),\n testIdAttribute,\n guideOrigin,\n layouts,\n tours: Object.freeze(tours),\n }),\n };\n}\n\nexport interface TourContext {\n manifest: TourManifest;\n entry: ManifestTour;\n locale: string;\n /** The guide origin this overlay trusts for ``guideUrl`` (null: none). */\n guideOrigin: string | null;\n}\n\nexport function validateTour(raw: unknown, ctx: TourContext): Result<TourFile> {\n const gate = schemaGate(raw);\n if (!gate.ok) return gate;\n const root = gate.value;\n const c = new Checker();\n if (!header(c, root, TOUR_FILE_KIND)) return { ok: false, reason: 'invalid-data', issues: c.issues };\n const { manifest, entry } = ctx;\n\n if (root.id !== entry.id) c.fail('id', `must be \"${entry.id}\"`);\n if (!isBuildId(root.buildId) || root.buildId !== manifest.buildId) c.fail('buildId', `must be the manifest's \"${manifest.buildId}\"`);\n if (root.locale !== ctx.locale) c.fail('locale', `must be \"${ctx.locale}\"`);\n const title = c.text(root.title, 'title', MAX_TITLE_CHARS, false) ?? '';\n\n let guideUrl: string | null = null;\n if (root.guideUrl !== undefined && root.guideUrl !== null) {\n const s = c.str(root.guideUrl, 'guideUrl');\n if (s !== null) {\n const origin = s.length <= MAX_URL_CHARS ? httpOrigin(s) : null;\n if (origin === null || ctx.guideOrigin === null || origin !== ctx.guideOrigin) {\n c.fail('guideUrl', 'must be an http(s) URL on the trusted guide origin');\n } else guideUrl = s;\n }\n }\n\n const tourEntry = root.entry === undefined ? (c.fail('entry', 'is required (null for none)'), null) : c.entry(root.entry, 'entry');\n if ((tourEntry?.route ?? null) !== (entry.entry?.route ?? null)) c.fail('entry', \"must equal the manifest's entry\");\n\n const steps: TourStep[] = [];\n const ids = new Set<string>();\n const layoutNames = Object.keys(manifest.layouts ?? {});\n if (!Array.isArray(root.steps) || root.steps.length !== entry.steps || root.steps.length > MAX_STEPS) {\n c.fail('steps', `must be a list of exactly ${entry.steps} steps`);\n } else {\n root.steps.forEach((s, i) => {\n const p = `steps.${i}`;\n const o = c.obj(s, p);\n if (!o) return;\n const id = c.str(o.id, `${p}.id`, RX.stepId) ?? '';\n if (ids.has(id)) c.fail(`${p}.id`, 'is not unique');\n ids.add(id);\n const target = o.target === null ? null : c.str(o.target, `${p}.target`, RX.testId);\n const advanceObj = c.obj(o.advance, `${p}.advance`);\n const advance = advanceObj ? c.oneOf(advanceObj.on, `${p}.advance.on`, ADVANCE_KINDS) : null;\n if (advance && (TARGETED_ADVANCE_KINDS as readonly string[]).includes(advance) && target === null) {\n c.fail(`${p}.target`, `is required for advance \"${advance}\"`);\n }\n let layouts: string[] | null = null;\n if (o.layouts !== undefined && o.layouts !== null) {\n if (!Array.isArray(o.layouts) || o.layouts.length < 1 || o.layouts.length > MAX_LAYOUTS) {\n c.fail(`${p}.layouts`, `must list 1..${MAX_LAYOUTS} layouts`);\n } else {\n layouts = o.layouts.filter((l): l is string => typeof l === 'string' && layoutNames.includes(l));\n if (layouts.length !== o.layouts.length) c.fail(`${p}.layouts`, \"must name the manifest's layouts\");\n }\n }\n steps.push(\n Object.freeze({\n id,\n target,\n advance: advance ?? 'manual',\n waitFor: c.optStr(o.waitFor, `${p}.waitFor`, RX.testId),\n title: c.text(o.title, `${p}.title`, MAX_TITLE_CHARS, true),\n text: c.text(o.text, `${p}.text`, MAX_TEXT_CHARS, true),\n placement: o.placement === undefined || o.placement === null ? null : c.oneOf(o.placement, `${p}.placement`, PLACEMENTS),\n layouts: layouts && Object.freeze(layouts),\n }),\n );\n });\n }\n if (!c.ok) return { ok: false, reason: 'invalid-data', issues: c.issues };\n return {\n ok: true,\n value: Object.freeze({\n id: entry.id,\n buildId: manifest.buildId,\n locale: ctx.locale,\n title,\n guideUrl,\n entry: tourEntry,\n steps: Object.freeze(steps),\n }),\n };\n}\n","/**\n * Loads a tour: the manifest(s), then the tour file for the best locale.\n *\n * Two manifests can be configured. ``fallbackManifest`` is the copy bundled\n * with the app (same origin only). ``manifest`` may point at a remote guide\n * site and may contain ``{buildId}``, filled with the app's build id — the\n * host's ``buildId`` property, else the bundled manifest's — so remote mode\n * only ever fetches the tours of the app's own build. The remote copy is\n * tried first and the bundled copy is the fallback; a remote failure is only\n * logged.\n *\n * Cross-origin requests send no credentials, refuse redirects, and pass the\n * bundled manifest's SRI hash when both copies are the same build, so a\n * tampered remote file is rejected by the browser. Every body is read with a\n * byte cap and an HTML sniff (an SPA answering a missing JSON file with its\n * index page is a load failure, not bad data). Nothing a cross-origin\n * manifest says widens what the bundled one allows: when the bundled manifest\n * is for the same build, any other manifest (remote, or a same-origin proxy)\n * only locates files — the tour, the locale and the SRI hash all come from the\n * bundle, so a tour, locale or case variant the bundle does not pin is never\n * fetched from it.\n */\n\nimport { lookupLocale } from '../ui/strings.js';\nimport { MAX_MANIFEST_BYTES, MAX_TOUR_FILE_BYTES } from './contract.js';\nimport type { TourSourceKind } from './engine.js';\nimport {\n httpOrigin,\n parseJson,\n validateManifest,\n validateTour,\n type FailReason,\n type Issue,\n type ManifestTour,\n type Result,\n type TourFile,\n type TourManifest,\n} from './validate.js';\n\nexport type TourSource = (\n tourId: string,\n locale: string,\n ctx: { buildId: string; manifestUrl: string },\n) => Promise<string | Response | object> | string | Response | object;\n\nexport interface LoaderConfig {\n manifest: string;\n fallbackManifest: string;\n buildId: string;\n /** The locale asked for (host ``locale``, else the page's ``lang``). */\n locale: string;\n /** The host's ``guide-origin``: the only origin trusted without a manifest's say-so. */\n guideOrigin: string;\n source?: TourSource | null;\n fetch?: typeof fetch;\n origin?: string;\n baseURI?: string;\n timeoutMs?: number;\n /** Manifests per resolved URL, kept by the host for the page's lifetime. */\n cache?: Map<string, Promise<ManifestLoad>>;\n}\n\nexport interface LoadOk {\n ok: true;\n manifest: TourManifest;\n manifestUrl: string;\n tour: TourFile;\n locale: string;\n source: TourSourceKind;\n testIdAttribute: string;\n guideOrigin: string | null;\n}\n\nexport interface LoadErr {\n ok: false;\n reason: FailReason;\n message: string;\n issues?: Issue[];\n}\n\nexport type ManifestLoad = (Result<TourManifest> & { url: string }) | (LoadErr & { url: string });\n\nconst RANK: Record<FailReason, number> = { 'load-failed': 0, 'invalid-data': 1, 'schema-unsupported': 2 };\n\nclass LoadError extends Error {\n constructor(\n readonly reason: FailReason,\n message: string,\n ) {\n super(message);\n }\n}\n\n/** Exact tag, then its base language, then the manifest's default, then the first file. */\nexport function pickLocale(available: readonly string[], requested: string, fallback: string): string {\n return lookupLocale(available, requested) ?? (available.includes(fallback) ? fallback : available[0]!);\n}\n\n/** The body as text, refusing more than ``cap`` bytes and invalid UTF-8. */\nexport async function readCapped(res: Response, cap: number): Promise<string> {\n if (!res.ok) throw new LoadError('load-failed', `HTTP ${res.status}`);\n const declared = Number(res.headers.get('content-length') ?? NaN);\n if (declared > cap) throw new LoadError('invalid-data', `the file is larger than ${cap} bytes`);\n const decoder = new TextDecoder('utf-8', { fatal: true });\n const decode = (bytes: Uint8Array) => {\n try {\n return decoder.decode(bytes);\n } catch {\n throw new LoadError('invalid-data', 'the file is not valid UTF-8');\n }\n };\n if (!res.body) {\n const bytes = new Uint8Array(await res.arrayBuffer());\n if (bytes.byteLength > cap) throw new LoadError('invalid-data', `the file is larger than ${cap} bytes`);\n return decode(bytes);\n }\n const reader = res.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > cap) {\n void reader.cancel();\n throw new LoadError('invalid-data', `the file is larger than ${cap} bytes`);\n }\n chunks.push(value);\n }\n const all = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n all.set(c, offset);\n offset += c.byteLength;\n }\n return decode(all);\n}\n\nexport async function loadTour(cfg: LoaderConfig, tourId: string): Promise<LoadOk | LoadErr> {\n const origin = cfg.origin ?? location.origin;\n const baseURI = cfg.baseURI ?? document.baseURI;\n const doFetch = cfg.fetch ?? globalThis.fetch.bind(globalThis);\n const cache = cfg.cache ?? new Map<string, Promise<ManifestLoad>>();\n const abs = (u: string) => new URL(u, baseURI);\n const cross = (u: string) => abs(u).origin !== origin;\n const timeoutMs = cfg.timeoutMs ?? 10_000;\n\n async function get(url: string, kind: 'manifest' | 'tour', integrity?: string): Promise<string> {\n const isCross = cross(url);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const init: RequestInit = {\n credentials: isCross ? 'omit' : 'same-origin',\n mode: isCross ? 'cors' : 'same-origin',\n redirect: isCross ? 'error' : 'follow',\n cache: kind === 'manifest' || !isCross ? 'no-cache' : 'default',\n signal: controller.signal,\n };\n if (integrity) init.integrity = integrity;\n let res: Response;\n try {\n res = await doFetch(abs(url).href, init);\n } catch (err) {\n throw new LoadError('load-failed', `could not fetch ${url}: ${String(err)}`);\n }\n return await readCapped(res, kind === 'manifest' ? MAX_MANIFEST_BYTES : MAX_TOUR_FILE_BYTES);\n } finally {\n clearTimeout(timer);\n }\n }\n\n function getManifest(url: string): Promise<ManifestLoad> {\n const key = abs(url).href;\n let pending = cache.get(key);\n if (!pending) {\n pending = (async (): Promise<ManifestLoad> => {\n try {\n const parsed = parseJson(await get(url, 'manifest'));\n const r = parsed.ok ? validateManifest(parsed.value) : parsed;\n return { ...r, url: key } as ManifestLoad;\n } catch (err) {\n const e = err instanceof LoadError ? err : new LoadError('load-failed', String(err));\n // A network blip is not the manifest's answer: the next start() asks again.\n if (e.reason === 'load-failed') cache.delete(key);\n return { ok: false, reason: e.reason, message: e.message, url: key };\n }\n })();\n cache.set(key, pending);\n }\n return pending;\n }\n\n const errors: LoadErr[] = [];\n const failed = (r: { ok: false; reason: FailReason; issues?: Issue[]; message?: string }, what: string) =>\n errors.push({ ok: false, reason: r.reason, message: r.message ?? `${what}: ${r.issues?.[0]?.path ?? ''} ${r.issues?.[0]?.message ?? ''}`.trim(), issues: r.issues });\n\n let bundled: (TourManifest & { url: string }) | null = null;\n if (cfg.fallbackManifest) {\n if (cross(cfg.fallbackManifest)) {\n errors.push({ ok: false, reason: 'load-failed', message: 'fallbackManifest must be same-origin' });\n } else {\n const r = await getManifest(cfg.fallbackManifest);\n if (r.ok) bundled = { ...r.value, url: r.url };\n else failed(r, 'bundled manifest');\n }\n }\n\n const expected = cfg.buildId || bundled?.buildId || '';\n let primary: (TourManifest & { url: string }) | null = null;\n if (cfg.manifest) {\n if (cfg.manifest.includes('{buildId}') && !expected) {\n errors.push({ ok: false, reason: 'load-failed', message: 'the manifest URL needs a build id ({buildId}) and none is known' });\n } else {\n const r = await getManifest(cfg.manifest.split('{buildId}').join(encodeURIComponent(expected)));\n if (!r.ok) failed(r, 'manifest');\n else if (expected && r.value.buildId !== expected) {\n errors.push({ ok: false, reason: 'invalid-data', message: `the manifest is for build \"${r.value.buildId}\", expected \"${expected}\"` });\n } else primary = { ...r.value, url: r.url };\n if (!r.ok && bundled) console.warn(`[steppy-tour] remote manifest unavailable, using the bundled copy: ${errors.at(-1)?.message}`);\n }\n }\n if (!cfg.manifest && !cfg.fallbackManifest) {\n return { ok: false, reason: 'load-failed', message: 'no manifest is configured (set manifest or fallback-manifest)' };\n }\n\n const remoteOrigin = primary ? new URL(primary.url).origin : null;\n const guideOrigin =\n (cfg.guideOrigin && (httpOrigin(cfg.guideOrigin) ?? cfg.guideOrigin)) ||\n bundled?.guideOrigin ||\n (primary && (!cross(primary.url) || primary.guideOrigin === remoteOrigin) ? primary.guideOrigin : null);\n\n for (const m of [primary, bundled]) {\n if (!m) continue;\n // A manifest that is not the bundled one but is for its build only says\n // where the files are: the bundle picks the tour, the locale and the hash.\n // Keyed on \"not the bundled manifest\" rather than \"cross-origin\", so a\n // same-origin proxy in front of a guide site is pinned too.\n const ref = m !== bundled && bundled?.buildId === m.buildId ? bundled : m;\n const entry: ManifestTour | undefined = ref.tours.find((t) => t.id === tourId);\n if (!entry) {\n errors.push({ ok: false, reason: 'load-failed', message: `no tour \"${tourId}\" in ${ref.url}` });\n } else {\n const locale = pickLocale(Object.keys(entry.files), cfg.locale, ref.defaultLocale);\n const isCross = cross(m.url);\n const integrity = ref !== m || isCross ? entry.integrity[locale] : undefined;\n try {\n let raw: unknown;\n if (cfg.source) {\n const got = await cfg.source(tourId, locale, { buildId: m.buildId, manifestUrl: m.url });\n if (typeof got === 'string' || got instanceof Response) {\n const text = typeof got === 'string' ? got : await readCapped(got, MAX_TOUR_FILE_BYTES);\n if (new TextEncoder().encode(text).byteLength > MAX_TOUR_FILE_BYTES) throw new LoadError('invalid-data', 'the tour file is too large');\n const parsed = parseJson(text);\n if (!parsed.ok) throw new LoadError(parsed.reason, parsed.issues[0]?.message ?? '');\n raw = parsed.value;\n } else raw = got;\n } else {\n const parsed = parseJson(await get(new URL(entry.files[locale]!, m.url).href, 'tour', integrity));\n if (!parsed.ok) throw new LoadError(parsed.reason, parsed.issues[0]?.message ?? '');\n raw = parsed.value;\n }\n const v = validateTour(raw, { manifest: ref, entry, locale, guideOrigin });\n if (v.ok) {\n return {\n ok: true,\n manifest: ref,\n manifestUrl: m.url,\n tour: v.value,\n locale,\n source: cfg.source ? 'custom' : m === primary && isCross ? 'remote' : 'bundled',\n testIdAttribute: bundled?.testIdAttribute ?? m.testIdAttribute,\n guideOrigin,\n };\n }\n failed(v, `tour ${tourId} (${locale})`);\n } catch (err) {\n const e = err instanceof LoadError ? err : new LoadError('load-failed', String(err));\n errors.push({ ok: false, reason: e.reason, message: e.message });\n }\n }\n if (m === primary && bundled) console.warn(`[steppy-tour] remote tour rejected, trying the bundled copy: ${errors.at(-1)?.message}`);\n }\n return errors.reduce((best, e) => (RANK[e.reason] > RANK[best.reason] ? e : best), errors[0] ?? {\n ok: false,\n reason: 'load-failed',\n message: `tour \"${tourId}\" could not be loaded`,\n });\n}\n","/**\n * Test-id resolution: ``[data-testid=\"<id>\"]`` (the manifest's attribute)\n * against the document — light DOM only — skipping the overlay itself, first\n * *visible* match wins.\n *\n * Waiting is event-driven and only runs while the tour needs an element: a\n * document MutationObserver (filtered to attributes that can change\n * visibility, coalesced to one check per frame) plus a slow poll for changes\n * no mutation reports (a stylesheet swap, a CSS transition finishing). Time\n * spent in a background tab does not count against the deadline.\n */\n\nimport type { DomAdapter } from './dom.js';\n\nconst POLL_MS = 250;\nconst MAX_MATCHES = 500;\n\nexport interface WaitRequest {\n ids: readonly string[];\n /** Milliseconds to wait, or null for no deadline. */\n timeoutMs: number | null;\n onFound(found: Map<string, Element>): void;\n /** Called with the first id still missing. */\n onTimeout(missing: string): void;\n}\n\nexport interface Resolver {\n find(id: string): Element | null;\n /** Start waiting; returns the cancel function. */\n wait(req: WaitRequest): () => void;\n}\n\nexport function createResolver(opts: { attr: string; host: Element; dom: DomAdapter }): Resolver {\n const { attr, host, dom } = opts;\n const s = dom.scheduler;\n\n function find(id: string): Element | null {\n const selector = `[${attr}=\"${CSS.escape(id)}\"]`;\n const all = document.querySelectorAll(selector);\n for (let i = 0; i < all.length && i < MAX_MATCHES; i++) {\n const el = all[i]!;\n if (el === host || host.contains(el)) continue;\n if (dom.isVisible(el)) return el;\n }\n return null;\n }\n\n function wait(req: WaitRequest): () => void {\n let done = false;\n let frame = 0;\n let hiddenSince: number | null = document.hidden ? s.now() : null;\n let hiddenTotal = 0;\n const started = s.now();\n const attributeFilter = [attr, 'class', 'style', 'hidden', 'open', 'aria-hidden', 'aria-expanded'];\n\n const check = (): boolean => {\n frame = 0;\n if (done) return true;\n const found = new Map<string, Element>();\n let missing: string | null = null;\n for (const id of req.ids) {\n const el = find(id);\n if (el) found.set(id, el);\n else if (missing === null) missing = id;\n }\n if (missing === null) {\n stop();\n req.onFound(found);\n return true;\n }\n if (req.timeoutMs !== null) {\n const hidden = hiddenSince !== null ? s.now() - hiddenSince : 0;\n if (hiddenSince === null && s.now() - started - hiddenTotal - hidden >= req.timeoutMs) {\n stop();\n req.onTimeout(missing);\n return true;\n }\n }\n return false;\n };\n const schedule = () => {\n if (!frame && !done) frame = s.raf(check);\n };\n const onVisibility = () => {\n if (document.hidden) hiddenSince ??= s.now();\n else if (hiddenSince !== null) {\n hiddenTotal += s.now() - hiddenSince;\n hiddenSince = null;\n }\n };\n const observer = new MutationObserver(schedule);\n const poll = s.setInterval(() => check(), POLL_MS);\n function stop() {\n done = true;\n observer.disconnect();\n s.clearInterval(poll);\n if (frame) s.cancelRaf(frame);\n document.removeEventListener('visibilitychange', onVisibility);\n }\n\n if (!check()) {\n observer.observe(document.documentElement, { childList: true, subtree: true, attributes: true, attributeFilter });\n document.addEventListener('visibilitychange', onVisibility);\n }\n return stop;\n }\n\n return { find, wait };\n}\n","/**\n * Entry routes: match the current location against a tour's ``entry.route``\n * (``/invoices/:invoiceId``), fill its parameters, and translate between app\n * paths (relative to ``<base href>``) and document paths.\n *\n * The compiler strips the app's full URL (path included), so routes are\n * base-relative; an app served under ``/app/`` has documents at\n * ``/app/invoices`` for the route ``/invoices``. Both forms of the current\n * path are tried, so an app without a base element works either way.\n */\n\nexport type RouteParams = Record<string, string>;\n\nconst PARAM = /^:([A-Za-z_][A-Za-z0-9_]{0,63})$/;\n\nfunction segments(path: string): string[] {\n const trimmed = path.length > 1 && path.endsWith('/') ? path.slice(0, -1) : path;\n return trimmed === '/' ? [] : trimmed.split('/').slice(1);\n}\n\n/** Parameters of ``path`` under ``pattern``, or null when it does not match. */\nexport function matchRoute(pattern: string, path: string): RouteParams | null {\n const want = segments(pattern);\n const have = segments(path);\n if (want.length !== have.length) return null;\n const params: RouteParams = {};\n for (let i = 0; i < want.length; i++) {\n const param = PARAM.exec(want[i]!);\n if (!param) {\n if (want[i] !== have[i]) return null;\n continue;\n }\n if (!have[i]) return null;\n try {\n params[param[1]!] = decodeURIComponent(have[i]!);\n } catch {\n return null;\n }\n }\n return params;\n}\n\n/** The route's names, in order (``/a/:x/b/:y`` -> ``['x', 'y']``). */\nexport function routeParams(pattern: string): string[] {\n return segments(pattern).flatMap((seg) => {\n const m = PARAM.exec(seg);\n return m ? [m[1]!] : [];\n });\n}\n\n/** ``pattern`` with its parameters filled (URI-encoded), or the names missing a value. */\nexport function buildRoute(pattern: string, params: Record<string, unknown>): { path: string } | { missing: string[] } {\n const missing = routeParams(pattern).filter((name) => params[name] === undefined || params[name] === null || String(params[name]) === '');\n if (missing.length) return { missing };\n const path = segments(pattern)\n .map((seg) => {\n const m = PARAM.exec(seg);\n return m ? encodeURIComponent(String(params[m[1]!])) : seg;\n })\n .join('/');\n return { path: `/${path}` };\n}\n\n/** The document's base path (``/`` or ``/app/``); ``/`` when the base is cross-origin. */\nexport function basePath(baseURI: string, origin: string): string {\n try {\n const url = new URL(baseURI);\n if (url.origin !== origin) return '/';\n const dir = url.pathname.endsWith('/') ? url.pathname : url.pathname.replace(/[^/]*$/, '');\n return dir || '/';\n } catch {\n return '/';\n }\n}\n\n/** ``/app/invoices`` under base ``/app/`` -> ``/invoices``; paths outside the base are unchanged. */\nexport function toAppPath(documentPath: string, base: string): string {\n if (base === '/' || !documentPath.startsWith(base.slice(0, -1))) return documentPath;\n const rest = documentPath.slice(base.length - 1);\n if (rest !== '' && !rest.startsWith('/')) return documentPath;\n return rest || '/';\n}\n\n/** ``/invoices`` under base ``/app/`` -> ``/app/invoices``. */\nexport function toDocumentPath(appPath: string, base: string): string {\n return base === '/' ? appPath : base.slice(0, -1) + appPath;\n}\n\n/**\n * A link target the tour may follow in the same tab: a site-relative path —\n * not protocol-relative (``//host``, ``/\\host``), no backslash, whitespace or\n * control characters.\n */\nexport function isSafeRelativeUrl(url: string): boolean {\n return /^\\/(?![/\\\\])/.test(url) && !/[\\\\\\s\\u0000-\\u001f\\u007f]/.test(url);\n}\n\n/**\n * The same-tab href for a link in step text, or null. The URL is normalised\n * first and the *result* checked: dot segments (``/.//host``, ``/a/..//host``,\n * ``/%2e%2e//host``) collapse into a protocol-relative ``//host``, which the raw\n * string never looked like.\n */\nexport function linkHref(url: string, base: string, origin: string): string | null {\n if (!isSafeRelativeUrl(url)) return null;\n try {\n const u = new URL(url, origin);\n const href = toDocumentPath(u.pathname, base) + u.search + u.hash;\n return isSafeRelativeUrl(href) && new URL(href, origin).origin === origin ? href : null;\n } catch {\n return null;\n }\n}\n","/**\n * Readers for the ``input`` and ``change`` advance kinds.\n *\n * ``valueSignature`` summarises everything a \"pick a value\" widget can change:\n * native controls inside the target, ARIA state, and the visible label. A\n * component library that sets a value programmatically fires no ``change``\n * event (PrimeNG's select does exactly that), so the overlay compares\n * signatures instead of listening for the event.\n */\n\nconst CONTROLS = 'input,select,textarea';\nconst ARIA = '[aria-checked],[aria-pressed],[aria-selected]';\nconst LIMIT = 50;\n\nfunction controlSig(el: Element): string {\n if (el instanceof HTMLInputElement) {\n if (el.type === 'checkbox' || el.type === 'radio') return `c:${el.checked}`;\n if (el.type === 'file') return `f:${el.files?.length ?? 0}`;\n return `v:${el.value}`;\n }\n if (el instanceof HTMLSelectElement) {\n return `s:${el.multiple ? [...el.options].filter((o) => o.selected).map((o) => o.value).join('|') : el.value}`;\n }\n if (el instanceof HTMLTextAreaElement) return `v:${el.value}`;\n return '';\n}\n\nexport function valueSignature(target: Element): string {\n const controls = [...(target.matches(CONTROLS) ? [target] : []), ...[...target.querySelectorAll(CONTROLS)].slice(0, LIMIT)];\n const aria = [...(target.matches(ARIA) ? [target] : []), ...[...target.querySelectorAll(ARIA)].slice(0, LIMIT)].map(\n (el) =>\n `a:${el.getAttribute('aria-checked') ?? ''}${el.getAttribute('aria-pressed') ?? ''}${el.getAttribute('aria-selected') ?? ''}`,\n );\n const text = `t:${(target.textContent ?? '').replace(/\\s+/g, ' ').trim().slice(0, 500)}`;\n return [...controls.map(controlSig), ...aria, text].join('\\u0001');\n}\n\n/** True while the target, or anything in it, reports an open popup (a dropdown in use). */\nexport function isExpanded(target: Element): boolean {\n return target.matches('[aria-expanded=\"true\"]') || target.querySelector('[aria-expanded=\"true\"]') !== null;\n}\n\nfunction editableText(el: Element): string | null {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) return el.value;\n const editable = el.getAttribute('contenteditable');\n if (el instanceof HTMLElement && (el.isContentEditable || (editable !== null && editable !== 'false'))) {\n return el.textContent ?? '';\n }\n return null;\n}\n\n/** The value an ``input`` step watches: the target's own, else its first field. */\nexport function readFieldValue(target: Element): string {\n const own = editableText(target);\n if (own !== null) return own;\n const inner = target.querySelector(`${CONTROLS},[contenteditable]:not([contenteditable=\"false\"])`);\n return (inner && editableText(inner)) ?? '';\n}\n\n/** A select-like widget, whose popup the bubble should leave room for (placed on top). */\nexport function isComboboxLike(target: Element): boolean {\n const q = 'select,[role=combobox],[aria-haspopup]:not([aria-haspopup=\"false\"])';\n return target.matches(q) || target.querySelector(q) !== null;\n}\n","/**\n * The resume record: which step of which tour is running, kept in\n * ``sessionStorage`` so a full page load (a classic form post, a link the app\n * does not route) picks the tour up where it was. Per tab by design.\n *\n * Every access is wrapped: storage throws in private modes and sandboxed\n * frames, and a tour must keep working without it.\n */\n\nimport { TOUR_RESUME_STORAGE_KEY } from '../ui/names.js';\n\nexport const RESUME_TTL_MS = 30 * 60 * 1000;\n\nexport interface ResumeRecord {\n v: 1;\n tourId: string;\n stepId: string;\n locale: string;\n params: Record<string, string>;\n buildId: string;\n /** The manifest URL(s) the record was made with; another host config ignores it. */\n manifestKey: string;\n savedAt: number;\n}\n\nfunction store(): Storage | null {\n try {\n return globalThis.sessionStorage ?? null;\n } catch {\n return null;\n }\n}\n\nexport function writeResume(record: ResumeRecord): void {\n try {\n store()?.setItem(TOUR_RESUME_STORAGE_KEY, JSON.stringify(record));\n } catch {\n // Quota or access errors: the tour simply will not resume.\n }\n}\n\nexport function clearResume(): void {\n try {\n store()?.removeItem(TOUR_RESUME_STORAGE_KEY);\n } catch {\n // Nothing to clean up then.\n }\n}\n\n/**\n * The stored record when it is well formed, fresh and made for ``manifestKey``.\n * A malformed or expired record is removed; one made by another host\n * configuration is left for that host.\n */\nexport function readResume(manifestKey: string, now: number): ResumeRecord | null {\n let raw: string | null = null;\n try {\n raw = store()?.getItem(TOUR_RESUME_STORAGE_KEY) ?? null;\n } catch {\n return null;\n }\n if (!raw) return null;\n let r: Partial<ResumeRecord> | null = null;\n try {\n r = JSON.parse(raw) as Partial<ResumeRecord>;\n } catch {\n // Unreadable: dropped below.\n }\n const fresh = typeof r?.savedAt === 'number' && now - r.savedAt >= 0 && now - r.savedAt < RESUME_TTL_MS;\n const shaped =\n r !== null &&\n typeof r === 'object' &&\n r.v === 1 &&\n typeof r.tourId === 'string' &&\n typeof r.stepId === 'string' &&\n typeof r.locale === 'string' &&\n typeof r.buildId === 'string' &&\n r.params !== null &&\n typeof r.params === 'object' &&\n Object.values(r.params).every((v) => typeof v === 'string');\n if (!shaped || !fresh) {\n clearResume();\n return null;\n }\n return r!.manifestKey === manifestKey ? (r as ResumeRecord) : null;\n}\n","/**\n * The overlay's chrome strings. They resolve against the *loaded tour file's*\n * locale, never the page's, so the buttons and the step text are always in\n * one language. ``next`` and ``progress`` are the guide player's words\n * (``ui/strings.ts``); a host overrides any key per locale with ``strings``.\n *\n * The ``instruction*`` keys are the generic hint a step shows when its\n * scenario authored no text for that locale (the compiler warns about each).\n */\n\nimport { CHROME_STRINGS, resolveStrings } from '../ui/strings.js';\nimport type { AdvanceKind } from './contract.js';\n\nexport interface TourStrings {\n next: string;\n /** Placeholders: ``{current}`` and ``{total}``. */\n progress: string;\n /** The primary button on the last step. */\n done: string;\n close: string;\n skipStep: string;\n endTour: string;\n resume: string;\n paused: string;\n dialogLabel: string;\n openGuide: string;\n notFoundTitle: string;\n notFoundBody: string;\n instructionClick: string;\n instructionInput: string;\n instructionChange: string;\n instructionVisible: string;\n instructionManual: string;\n}\n\nexport type TourStringOverrides = Partial<Record<string, Partial<TourStrings>>>;\n\nexport const DEFAULT_TOUR_STRINGS: Record<string, TourStrings> = {\n en: {\n ...CHROME_STRINGS.en,\n done: 'Done',\n close: 'Close the tour',\n skipStep: 'Skip this step',\n endTour: 'End the tour',\n resume: 'Resume tour',\n paused: 'Tour paused',\n dialogLabel: 'Guided tour',\n openGuide: 'Open the full guide',\n notFoundTitle: \"Can't find this element\",\n notFoundBody: 'The page may have changed. Skip this step or end the tour.',\n instructionClick: 'Click the highlighted element.',\n instructionInput: 'Fill in the highlighted field.',\n instructionChange: 'Choose a value in the highlighted field.',\n instructionVisible: 'Wait for the highlighted element to appear.',\n instructionManual: 'Select Next to continue.',\n },\n fr: {\n ...CHROME_STRINGS.fr,\n done: 'Terminer',\n close: 'Fermer la visite',\n skipStep: 'Passer cette étape',\n endTour: 'Terminer la visite',\n resume: 'Reprendre la visite',\n paused: 'Visite en pause',\n dialogLabel: 'Visite guidée',\n openGuide: 'Ouvrir le guide complet',\n notFoundTitle: 'Élément introuvable',\n notFoundBody: 'La page a peut-être changé. Passez cette étape ou terminez la visite.',\n instructionClick: \"Cliquez sur l'élément mis en évidence.\",\n instructionInput: 'Remplissez le champ mis en évidence.',\n instructionChange: 'Choisissez une valeur dans le champ mis en évidence.',\n instructionVisible: \"Attendez que l'élément mis en évidence apparaisse.\",\n instructionManual: 'Sélectionnez Suivant pour continuer.',\n },\n nl: {\n ...CHROME_STRINGS.nl,\n done: 'Klaar',\n close: 'Rondleiding sluiten',\n skipStep: 'Deze stap overslaan',\n endTour: 'Rondleiding beëindigen',\n resume: 'Rondleiding hervatten',\n paused: 'Rondleiding gepauzeerd',\n dialogLabel: 'Rondleiding',\n openGuide: 'Volledige gids openen',\n notFoundTitle: 'Dit element is niet gevonden',\n notFoundBody: 'De pagina is mogelijk gewijzigd. Sla deze stap over of beëindig de rondleiding.',\n instructionClick: 'Klik op het gemarkeerde element.',\n instructionInput: 'Vul het gemarkeerde veld in.',\n instructionChange: 'Kies een waarde in het gemarkeerde veld.',\n instructionVisible: 'Wacht tot het gemarkeerde element verschijnt.',\n instructionManual: 'Kies Volgende om verder te gaan.',\n },\n de: {\n ...CHROME_STRINGS.de,\n done: 'Fertig',\n close: 'Tour schließen',\n skipStep: 'Diesen Schritt überspringen',\n endTour: 'Tour beenden',\n resume: 'Tour fortsetzen',\n paused: 'Tour pausiert',\n dialogLabel: 'Geführte Tour',\n openGuide: 'Vollständige Anleitung öffnen',\n notFoundTitle: 'Element nicht gefunden',\n notFoundBody: 'Die Seite hat sich möglicherweise geändert. Überspringen Sie diesen Schritt oder beenden Sie die Tour.',\n instructionClick: 'Klicken Sie auf das hervorgehobene Element.',\n instructionInput: 'Füllen Sie das hervorgehobene Feld aus.',\n instructionChange: 'Wählen Sie im hervorgehobenen Feld einen Wert aus.',\n instructionVisible: 'Warten Sie, bis das hervorgehobene Element erscheint.',\n instructionManual: 'Wählen Sie Weiter, um fortzufahren.',\n },\n};\n\nexport function resolveTourStrings(contentLocale: string, overrides?: TourStringOverrides): TourStrings {\n return resolveStrings(DEFAULT_TOUR_STRINGS, contentLocale, overrides, 'en');\n}\n\n/**\n * Writing direction of a locale tag: a script subtag decides (``az-Arab``,\n * ``sd-Deva``), else the language. Set on the overlay with ``lang``, so a tour\n * shown in another language than the page is read and laid out as its own.\n */\nexport function textDir(tag: string): 'rtl' | 'ltr' {\n const [lang, sub = ''] = tag.toLowerCase().split(/[-_]/);\n const rtl = /^[a-z]{4}$/.test(sub) ? /^(arab|hebr|thaa|syrc|nkoo|adlm|rohg)$/.test(sub) : /^(ar|he|iw|fa|ur|ps|sd|ug|yi|ckb|dv)$/.test(lang!);\n return rtl ? 'rtl' : 'ltr';\n}\n\nconst INSTRUCTION: Record<AdvanceKind, keyof TourStrings> = {\n click: 'instructionClick',\n input: 'instructionInput',\n change: 'instructionChange',\n visible: 'instructionVisible',\n manual: 'instructionManual',\n};\n\n/** The generic hint for a step without authored text. */\nexport function instructionFor(kind: AdvanceKind, strings: TourStrings): string {\n return strings[INSTRUCTION[kind]];\n}\n","/**\n * Default look values shared by the guide player and the in-app tour overlay.\n *\n * Constants only, never data: they are interpolated into the ``css`` tagged\n * templates with ``cssValue`` (Lit's ``unsafeCSS``), which concatenates the\n * value verbatim — ``baseStyles.cssText`` is byte-identical to the literal\n * stylesheet it replaced (guard: ``test/ui/guide-styles-stable.test.ts``).\n */\n\nimport { unsafeCSS, type CSSResult } from 'lit';\n\n/** The guide's palette (``--steppy-*`` defaults in ``templates/base-styles.ts``). */\nexport const PALETTE = {\n bg: '#f4f1ea',\n surface: '#fbf9f4',\n chromeBg: '#efece3',\n fg: '#1f1d1a',\n muted: '#8a857c',\n border: '#e1ddd1',\n accent: '#d24f2c',\n accentWeak: 'rgba(210, 79, 44, 0.35)',\n success: '#3a7d44',\n} as const;\n\n/** System font stacks only: offline, no CDN. */\nexport const FONTS = {\n serif: \"ui-serif, Georgia, 'Times New Roman', serif\",\n sans: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n mono: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n} as const;\n\n/** The dark bubble both players draw next to a target (guide tooltip, tour popover). */\nexport const BUBBLE_LOOK = {\n padding: '8px 12px',\n radius: '6px',\n maxWidth: '280px',\n fontSize: '14px',\n lineHeight: '1.4',\n shadow: '0 4px 12px rgba(0, 0, 0, 0.2)',\n} as const;\n\nexport const BUTTON_LOOK = {\n radius: '4px',\n padding: '4px 10px',\n} as const;\n\n/**\n * Tour overlay defaults. The accent differs from the guide's on purpose:\n * ``#d24f2c`` measures 4.29:1 against white text, below WCAG AA for the\n * overlay's buttons; ``#a8410e`` measures 6.13:1 (guard: ``test/tour/small-modules.test.ts``).\n */\nexport const TOUR_DEFAULTS = {\n bubbleBg: PALETTE.fg,\n bubbleFg: PALETTE.surface,\n muted: '#c9c5bd',\n accent: '#a8410e',\n accentFg: '#ffffff',\n focus: '#f09a6a',\n scrim: 'rgba(31, 29, 26, 0.45)',\n border: 'none',\n radius: BUBBLE_LOOK.radius,\n width: '320px',\n padding: BUBBLE_LOOK.padding,\n shadow: BUBBLE_LOOK.shadow,\n fontFamily: 'inherit',\n fontSize: BUBBLE_LOOK.fontSize,\n lineHeight: BUBBLE_LOOK.lineHeight,\n titleSize: '1em',\n titleWeight: '600',\n buttonRadius: BUTTON_LOOK.radius,\n buttonPadding: BUTTON_LOOK.padding,\n buttonWeight: 'inherit',\n ringWidth: '2px',\n} as const;\n\n/** ``appearance=\"light\"``: a light bubble, same accent; AA-checked like the dark one. */\nexport const TOUR_LIGHT = {\n ...TOUR_DEFAULTS,\n bubbleBg: '#ffffff',\n bubbleFg: PALETTE.fg,\n muted: '#5b6b64',\n focus: '#a8410e',\n border: '1px solid #e1ddd1',\n} as const;\n\n/** A token value inside a ``css`` template (inserted verbatim, never data). */\nexport const cssValue = (value: string | number): CSSResult => unsafeCSS(value);\n","/**\n * The overlay's theme surface: the public ``--steppy-tour-*`` custom\n * properties, and the ``theme`` object that writes them from code.\n *\n * One key list drives the stylesheet (``styles.ts``), the host's ``theme``\n * property and the docs (guard: ``test/tour/theme.test.ts``). Values come from\n * the app only — its stylesheet or the ``theme`` property — never from a tour\n * file, so tour data still cannot reach a style.\n */\n\nexport const TOUR_THEME_KEYS = [\n // Colour\n 'bubbleBg',\n 'bubbleFg',\n 'muted',\n 'accent',\n 'accentFg',\n 'focus',\n 'scrim',\n 'link',\n 'border',\n // Shape and type\n 'radius',\n 'width',\n 'padding',\n 'shadow',\n 'fontFamily',\n 'fontSize',\n 'lineHeight',\n 'titleSize',\n 'titleWeight',\n 'buttonRadius',\n 'buttonPadding',\n 'buttonWeight',\n // Spotlight\n 'ringWidth',\n 'spotlightRadius',\n] as const;\n\nexport type TourThemeKey = (typeof TOUR_THEME_KEYS)[number];\n\n/** Any subset of the keys, as CSS values: ``{ accent: '#0b5cad', width: '360px' }``. */\nexport type TourTheme = Partial<Record<TourThemeKey, string>>;\n\n/** ``dark`` is the default; ``auto`` follows ``prefers-color-scheme``. */\nexport const TOUR_APPEARANCES = ['dark', 'light', 'auto'] as const;\n\nexport type TourAppearance = (typeof TOUR_APPEARANCES)[number];\n\nconst KEYS: ReadonlySet<string> = new Set(TOUR_THEME_KEYS);\n\nexport const kebab = (key: string): string => key.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\n/** ``accentFg`` → ``--steppy-tour-accent-fg``. */\nexport const themeProperty = (key: TourThemeKey): string => `--steppy-tour-${kebab(key)}`;\n\n/** The private property the stylesheet reads (``--_pw-accent-fg``). */\nexport const privateProperty = (key: TourThemeKey): string => `--_pw-${kebab(key)}`;\n\n/** Custom-property declarations for a theme; unknown keys and empty values are dropped. */\nexport function themeDeclarations(theme: TourTheme | null | undefined): Map<string, string> {\n const out = new Map<string, string>();\n if (!theme || typeof theme !== 'object') return out;\n for (const [key, value] of Object.entries(theme)) {\n if (!KEYS.has(key) || typeof value !== 'string' || value.trim() === '') continue;\n out.set(themeProperty(key as TourThemeKey), value.trim());\n }\n return out;\n}\n","/**\n * Overlay styles. Theming goes through public ``--steppy-tour-*`` custom\n * properties (the keys of ``theme.ts``), read into private ``--_pw-*`` ones on\n * ``:host`` and never declared themselves — so a page sets them on ``:root``\n * or on the element, and the host's ``theme`` property sets them inline.\n * ``appearance=\"light\"`` (or ``\"auto\"`` under a light colour scheme) swaps the\n * defaults, never a value the page set. Geometry comes from properties the\n * tracker writes through CSSOM.\n *\n * Defaults meet WCAG AA in both appearances (guard: ``test/tour/small-modules.test.ts``).\n * The bubble inherits the app's font unless ``--steppy-tour-font-family`` (or\n * ``--steppy-font-family``) is set. The bubble's inner layout uses logical\n * properties, so it mirrors under the layer's ``dir`` (an Arabic or Hebrew\n * tour); its placement around the target stays physical.\n */\n\nimport { css, type CSSResult } from 'lit';\n\nimport { TOUR_DEFAULTS, TOUR_LIGHT, cssValue } from '../ui/tokens.js';\nimport { TOUR_THEME_KEYS, privateProperty, themeProperty, type TourThemeKey } from './theme.js';\n\n/** Tokens whose default is another token, so they follow its override. */\nconst DERIVED = {\n link: `var(${privateProperty('bubbleFg')})`,\n spotlightRadius: `var(${privateProperty('radius')})`,\n} as const;\n\ntype Defaults = Record<Exclude<TourThemeKey, keyof typeof DERIVED>, string>;\n\n/** Older or shared properties a token falls back to before its default. */\nconst ALIASES: Partial<Record<TourThemeKey, string>> = {\n bubbleBg: '--steppy-tooltip-bg',\n bubbleFg: '--steppy-tooltip-fg',\n fontFamily: '--steppy-font-family',\n};\n\nconst DARK: Defaults = TOUR_DEFAULTS;\nconst LIGHT: Defaults = TOUR_LIGHT;\n\n/**\n * ``--_pw-x: var(--steppy-tour-x, <default>);`` per key. Given ``base``, only\n * the keys whose default differs from it — derived ones never do.\n */\nfunction privateTokens(defaults: Defaults, base?: Defaults): CSSResult {\n const lines: string[] = [];\n for (const key of TOUR_THEME_KEYS) {\n const derived = key in DERIVED;\n if (base && (derived || base[key as keyof Defaults] === defaults[key as keyof Defaults])) continue;\n const value = derived ? DERIVED[key as keyof typeof DERIVED] : defaults[key as keyof Defaults];\n const alias = ALIASES[key];\n const fallback = alias ? `var(${alias}, ${value})` : value;\n lines.push(`${privateProperty(key)}: var(${themeProperty(key)}, ${fallback});`);\n }\n return cssValue(lines.join('\\n '));\n}\n\nexport const tourStyles = css`\n :host {\n display: contents;\n ${privateTokens(DARK)}\n }\n :host([appearance='light']) {\n ${privateTokens(LIGHT, DARK)}\n }\n @media (prefers-color-scheme: light) {\n :host([appearance='auto']) {\n ${privateTokens(LIGHT, DARK)}\n }\n }\n .layer {\n position: fixed;\n inset: 0;\n width: auto;\n height: auto;\n max-width: none;\n max-height: none;\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n overflow: visible;\n pointer-events: none;\n z-index: var(--_pw-z, 2147483000);\n }\n .layer::backdrop {\n pointer-events: none;\n background: transparent;\n }\n .spotlight {\n position: absolute;\n left: var(--_pw-sx, 0);\n top: var(--_pw-sy, 0);\n width: var(--_pw-sw, 0);\n height: var(--_pw-sh, 0);\n border-radius: var(--_pw-spotlight-radius);\n box-shadow:\n 0 0 0 var(--_pw-ring-width) var(--_pw-accent),\n 0 0 0 max(100vw, 100vh) var(--_pw-scrim);\n pointer-events: none;\n transition:\n left 0.15s ease,\n top 0.15s ease,\n width 0.15s ease,\n height 0.15s ease;\n }\n .bubble {\n position: absolute;\n box-sizing: border-box;\n width: min(var(--_pw-width), calc(100vw - 16px));\n max-height: calc(100vh - 16px);\n overflow: auto;\n padding: var(--_pw-padding);\n border: var(--_pw-border);\n border-radius: var(--_pw-radius);\n background: var(--_pw-bubble-bg);\n color: var(--_pw-bubble-fg);\n box-shadow: var(--_pw-shadow);\n font-family: var(--_pw-font-family);\n font-size: var(--_pw-font-size);\n line-height: var(--_pw-line-height);\n pointer-events: auto;\n visibility: hidden;\n outline: none;\n }\n .bubble[data-placed] {\n visibility: visible;\n }\n .bubble[data-mode='anchored'] {\n left: var(--_pw-x, 0);\n top: var(--_pw-y, 0);\n }\n .bubble[data-mode='centered'] {\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n .bubble[data-mode='sheet-bottom'],\n .bubble[data-mode='sheet-top'] {\n left: 50%;\n transform: translateX(-50%);\n }\n .bubble[data-mode='sheet-bottom'] {\n bottom: calc(8px + var(--_pw-kb, 0px));\n }\n .bubble[data-mode='sheet-top'] {\n top: 8px;\n }\n .bubble[data-yield] {\n pointer-events: none;\n opacity: 0.15;\n }\n .layer[data-offscreen] .spotlight {\n display: none;\n }\n header {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n }\n h2 {\n flex: 1;\n margin: 0 0 4px;\n font-size: var(--_pw-title-size);\n font-weight: var(--_pw-title-weight);\n }\n .body {\n margin: 0;\n overflow-wrap: anywhere;\n }\n .body a,\n .guide {\n color: var(--_pw-link);\n text-decoration: underline;\n }\n .guide {\n display: inline-block;\n margin-top: 6px;\n }\n code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 0.92em;\n }\n footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 10px;\n }\n .progress {\n margin-inline-end: auto;\n color: var(--_pw-muted);\n font-variant-numeric: tabular-nums;\n }\n button {\n font: inherit;\n font-weight: var(--_pw-button-weight);\n cursor: pointer;\n border-radius: var(--_pw-button-radius);\n padding: var(--_pw-button-padding);\n border: 1px solid transparent;\n }\n button:focus-visible,\n a:focus-visible {\n outline: 2px solid var(--_pw-focus);\n outline-offset: 2px;\n }\n button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .primary {\n background: var(--_pw-accent);\n color: var(--_pw-accent-fg);\n }\n .secondary {\n background: transparent;\n color: var(--_pw-bubble-fg);\n border-color: var(--_pw-muted);\n }\n .close {\n margin-inline-start: auto;\n padding: 0 6px;\n background: transparent;\n color: var(--_pw-bubble-fg);\n font-size: 1.25em;\n line-height: 1;\n }\n .pill {\n position: absolute;\n inset-inline-end: 16px;\n bottom: 16px;\n display: flex;\n gap: 4px;\n padding: 4px;\n border-radius: 999px;\n border: var(--_pw-border);\n background: var(--_pw-bubble-bg);\n color: var(--_pw-bubble-fg);\n box-shadow: var(--_pw-shadow);\n font-family: var(--_pw-font-family);\n font-size: var(--_pw-font-size);\n pointer-events: auto;\n }\n .pill .primary {\n border-radius: 999px;\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n }\n @media (prefers-reduced-motion: reduce) {\n .spotlight {\n transition: none;\n }\n }\n @media (forced-colors: active) {\n .spotlight {\n outline: 3px solid Highlight;\n box-shadow: none;\n }\n .bubble,\n .pill {\n border: 1px solid CanvasText;\n }\n }\n @media print {\n .layer {\n display: none;\n }\n }\n`;\n","/**\n * Inline-markdown renderer shared by the guide player and the in-app tour\n * overlay.\n *\n * Mirrors the inline subset of the server-side ``markdown-it`` ``renderInline``\n * filter (``src/steppy/guide.py``, configured ``{html:false, breaks:true,\n * linkify:true}``) used by the step-by-step guide, so the interactive player\n * renders the same content the static guide does:\n *\n * - **bold** / __bold__ , *italic* / _italic_ (recursive — emphasis nests)\n * - `inline code`\n * - [label](url) links — label is parsed recursively\n * - autolinked bare URLs (``https://…`` / ``www.…``) and emails (linkify)\n * - hard line breaks: every ``\\n`` becomes ``<br>`` (``breaks:true``)\n *\n * The manifest carries raw text (it is reused for ``alt``/``aria-label``\n * attributes, where HTML must not appear), so emphasis is rendered here, on the\n * client, only at the visible display sites.\n *\n * Returns an array of literal-string + Lit ``TemplateResult`` parts, meant to be\n * interpolated into an existing parent element (``${renderInlineMarkdown(text)}``,\n * the same shape as ``${items.map(...)}``). Literal text and ``href`` values stay\n * auto-escaped by Lit, and which link URLs become links is decided by a\n * ``LinkPolicy`` — so it is XSS-safe by construction, with no ``unsafeHTML``.\n *\n * Link policies: the guide keeps its historical set (http/https/mailto, a\n * site-relative path, an anchor) minus protocol-relative ``//host`` and\n * ``/\\host``, which browsers resolve to another origin. The tour overlay passes\n * a stricter policy of its own (same-origin routes and the guide origin only,\n * no autolinks). A URL the policy refuses leaves the whole ``[label](url)``\n * literal, exactly as an unmatched link always rendered.\n *\n * Scope is intentionally inline-only (no block constructs — ``renderInline`` does\n * not render lists/headings/blockquotes either, so there is no parity gap). The\n * regex emphasis rule is not markdown-it's full delimiter-run algorithm, so a few\n * pathological mixed-nesting cases (e.g. *italic wrapping **bold***) are not\n * matched; the common cases — bold-containing-italic, adjacent emphasis, links\n * with emphasised labels — all work.\n */\n\nimport { html, type TemplateResult } from 'lit';\n\nexport type MarkdownNode = TemplateResult | string;\n\n/** What a ``[label](url)`` becomes: a new-tab link, or a same-tab one the host routes. */\nexport type LinkTarget =\n | { kind: 'external'; href: string }\n | { kind: 'internal'; href: string; onActivate: (event: MouseEvent) => void };\n\nexport interface LinkPolicy {\n /** The link for ``url``, or ``null`` to leave the markdown literal. */\n link(url: string): LinkTarget | null;\n /** Whether bare URLs and e-mail addresses are turned into links (linkify). */\n autolink: boolean;\n}\n\n// The guide's historical link set, minus protocol-relative \"//host\" and \"/\\host\".\nconst SAFE_GUIDE_URL = /^(?:https?:\\/\\/[^\\s)]+|mailto:[^\\s)]+|\\/(?![/\\\\])[^\\s)]*|#[^\\s)]*)$/;\n\nexport const GUIDE_LINK_POLICY: LinkPolicy = {\n autolink: true,\n link: (url) => (SAFE_GUIDE_URL.test(url) ? { kind: 'external', href: url } : null),\n};\n\n// 1 code | 2 link-label 3 link-url | 4 bold-delim 5 bold | 6 em-delim 7 em | 8 url/www | 9 email\n// The link URL is any run up to \")\" without whitespace; the policy decides\n// whether it becomes a link.\nconst INLINE_SRC =\n '`([^`]+)`|\\\\[([^\\\\]]+)\\\\]\\\\(([^\\\\s)]+)\\\\)|(\\\\*\\\\*|__)(\\\\S(?:.*?\\\\S)?)\\\\4|(\\\\*|_)([^*_\\\\s](?:[^*_]*?[^*_\\\\s])?)\\\\6|(https?:\\\\/\\\\/[^\\\\s<>()]+|www\\\\.[^\\\\s<>()]+)|([\\\\w.+-]+@[\\\\w-]+\\\\.[\\\\w.-]+\\\\w)';\n\nexport function renderInlineMarkdown(src: string, policy: LinkPolicy = GUIDE_LINK_POLICY): MarkdownNode[] {\n const parts: MarkdownNode[] = [];\n // Hard line breaks: breaks:true turns every \\n into <br>.\n const pushText = (t: string) =>\n t.split('\\n').forEach((ln, i) => {\n if (i > 0) parts.push(html`<br />`);\n if (ln) parts.push(ln);\n });\n\n // A fresh regex per call: this function recurses (into emphasis/link content),\n // and a single shared /g regex would have its lastIndex clobbered by the inner\n // call, corrupting this loop. A local instance keeps each level independent.\n const re = new RegExp(INLINE_SRC, 'g');\n let last = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(src))) {\n if (m[2] != null) {\n const target = policy.link(m[3]!);\n if (!target) {\n // Refused: no match at this position, exactly as if the link pattern\n // had not matched — scanning resumes one character later.\n re.lastIndex = m.index + 1;\n continue;\n }\n if (m.index > last) pushText(src.slice(last, m.index));\n parts.push(\n target.kind === 'external'\n ? html`<a href=${target.href} target=\"_blank\" rel=\"noopener noreferrer\"\n >${renderInlineMarkdown(m[2], policy)}</a\n >`\n : html`<a href=${target.href} @click=${target.onActivate}>${renderInlineMarkdown(m[2], policy)}</a>`,\n );\n last = m.index + m[0].length;\n continue;\n }\n if ((m[8] != null || m[9] != null) && !policy.autolink) continue; // stays literal text\n if (m.index > last) pushText(src.slice(last, m.index));\n if (m[1] != null) {\n parts.push(html`<code>${m[1]}</code>`); // code span: no recursion\n } else if (m[4] != null) {\n parts.push(html`<strong>${renderInlineMarkdown(m[5]!, policy)}</strong>`);\n } else if (m[6] != null) {\n parts.push(html`<em>${renderInlineMarkdown(m[7]!, policy)}</em>`);\n } else if (m[8] != null) {\n // Autolink; trim trailing sentence punctuation back out as text (linkify behavior).\n const raw = m[8];\n const trail = (raw.match(/[.,;:!?]+$/) ?? [''])[0];\n const url = trail ? raw.slice(0, -trail.length) : raw;\n const href = url.startsWith('www.') ? `https://${url}` : url;\n parts.push(html`<a href=${href} target=\"_blank\" rel=\"noopener noreferrer\">${url}</a>`);\n if (trail) pushText(trail);\n } else if (m[9] != null) {\n parts.push(html`<a href=${`mailto:${m[9]}`}>${m[9]}</a>`);\n }\n last = m.index + m[0].length;\n }\n if (last < src.length) pushText(src.slice(last));\n return parts;\n}\n","/**\n * The overlay's DOM. Data is only ever bound as text or attribute values\n * (never ``style=``, never HTML), and the UI never carries the app's test-id\n * attribute, so app locators cannot match it.\n *\n * DOM contract (the CI replay and the docs rely on it): the bubble is\n * ``section[part~=\"bubble\"][role=\"dialog\"]`` with ``data-tour-id``,\n * ``data-step-id``, ``data-state`` (``shown`` | ``fallback``) and\n * ``data-advance``; Next is ``part=\"button next primary\"`` on input and manual\n * steps and ``\"button next secondary\"`` on change steps, absent on click and\n * visible steps; the fallback has ``skip`` and ``end``; the pill holds\n * ``resume`` and ``close``.\n */\n\nimport { html, nothing, type TemplateResult } from 'lit';\n\nimport { renderInlineMarkdown, type LinkPolicy } from '../ui/markdown.js';\nimport { format } from '../ui/strings.js';\nimport type { TourStrings } from './strings.js';\nimport { instructionFor } from './strings.js';\nimport type { TourStep } from './validate.js';\n\nexport interface ViewModel {\n mode: 'bubble' | 'pill' | 'none';\n /** The tour file's language and direction, set on the layer (the page's may differ). */\n lang: string;\n dir: 'ltr' | 'rtl';\n tourId: string;\n step: TourStep;\n state: 'shown' | 'fallback';\n /** Spotlight drawn (an anchored step that is showing). */\n anchored: boolean;\n position: { index: number; total: number };\n last: boolean;\n nextEnabled: boolean;\n guideUrl: string | null;\n strings: TourStrings;\n policy: LinkPolicy;\n popover: boolean;\n}\n\nexport interface Handlers {\n press(e: Event): void;\n next(e: MouseEvent): void;\n skip(e: MouseEvent): void;\n end(e: MouseEvent): void;\n close(e: MouseEvent): void;\n resume(e: MouseEvent): void;\n}\n\nconst stop = (e: Event) => e.stopPropagation();\n\nfunction nextButton(v: ViewModel, h: Handlers): TemplateResult | typeof nothing {\n const kind = v.step.advance;\n if (kind === 'click' || kind === 'visible') return nothing;\n const label = v.last && kind === 'manual' ? v.strings.done : v.strings.next;\n const style = kind === 'change' ? 'secondary' : 'primary';\n return html`<button\n part=\"button next ${style}\"\n class=${style}\n ?disabled=${!v.nextEnabled}\n @pointerdown=${h.press}\n @mousedown=${h.press}\n @click=${h.next}\n >\n ${label}\n </button>`;\n}\n\nfunction bubble(v: ViewModel, h: Handlers): TemplateResult {\n const s = v.strings;\n const fallback = v.state === 'fallback';\n const title = fallback ? s.notFoundTitle : v.step.title;\n const body = fallback ? s.notFoundBody : (v.step.text ?? instructionFor(v.step.advance, s));\n const showGuide = v.guideUrl !== null && (fallback || v.last);\n return html`<section\n part=\"bubble\"\n class=\"bubble\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby=${title ? 'pw-title' : nothing}\n aria-label=${title ? nothing : s.dialogLabel}\n aria-describedby=\"pw-body\"\n tabindex=\"-1\"\n data-tour-id=${v.tourId}\n data-step-id=${v.step.id}\n data-state=${v.state}\n data-advance=${v.step.advance}\n @pointerdown=${stop}\n @mousedown=${stop}\n @click=${stop}\n >\n <header>\n ${title ? html`<h2 part=\"title\" id=\"pw-title\">${title}</h2>` : nothing}\n <button part=\"button close\" class=\"close\" aria-label=${s.close} @pointerdown=${h.press} @mousedown=${h.press} @click=${h.close}>\n ×\n </button>\n </header>\n <p part=\"body\" class=\"body\" id=\"pw-body\">${fallback ? body : renderInlineMarkdown(body, v.policy)}</p>\n ${showGuide\n ? html`<a part=\"guide-link\" class=\"guide\" href=${v.guideUrl!} target=\"_blank\" rel=\"noopener noreferrer\">${s.openGuide}</a>`\n : nothing}\n <footer>\n <span part=\"progress\" class=\"progress\">${format(s.progress, { current: v.position.index + 1, total: v.position.total })}</span>\n ${fallback\n ? html`<button part=\"button skip\" class=\"secondary\" @pointerdown=${h.press} @mousedown=${h.press} @click=${h.skip}>\n ${s.skipStep}\n </button>\n <button part=\"button end primary\" class=\"primary\" @pointerdown=${h.press} @mousedown=${h.press} @click=${h.end}>\n ${s.endTour}\n </button>`\n : nextButton(v, h)}\n </footer>\n </section>`;\n}\n\nfunction pill(v: ViewModel, h: Handlers): TemplateResult {\n const s = v.strings;\n return html`<div part=\"pill\" class=\"pill\" role=\"group\" aria-label=${s.paused} @pointerdown=${stop} @mousedown=${stop} @click=${stop}>\n <button part=\"button resume primary\" class=\"primary\" @pointerdown=${h.press} @mousedown=${h.press} @click=${h.resume}>\n ${s.resume}\n </button>\n <button part=\"button close\" class=\"close\" aria-label=${s.close} @pointerdown=${h.press} @mousedown=${h.press} @click=${h.close}>\n ×\n </button>\n </div>`;\n}\n\nexport function renderLayer(v: ViewModel, h: Handlers): TemplateResult {\n return html`<div part=\"layer\" class=\"layer\" lang=${v.lang} dir=${v.dir} popover=${v.popover ? 'manual' : nothing}>\n ${v.mode === 'bubble' && v.anchored && v.state === 'shown' ? html`<div part=\"spotlight\" class=\"spotlight\"></div>` : nothing}\n ${v.mode === 'bubble' ? bubble(v, h) : v.mode === 'pill' ? pill(v, h) : nothing}\n <div class=\"sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"></div>\n </div>`;\n}\n","/**\n * Keeps the spotlight on the target and the bubble next to it while a step is\n * shown. Geometry is written through CSSOM custom properties only (no\n * ``style=`` attributes, which a strict CSP blocks).\n *\n * Driven by capture-phase scroll (which catches scrolling ancestors), resize,\n * the visual viewport, ResizeObserver and a slow poll; ``notify`` coalesces\n * them into one placement per frame. A target that got detached or hidden is\n * re-found by id first; only when that fails is the step reported lost.\n *\n * Invariant: the bubble never covers the spotlight when a side has room for\n * it; otherwise it becomes a sheet at the top or bottom of the viewport, away\n * from the target's centre (where a click lands). A step with nothing to point\n * at is centred, unless that would cover an open app dialog: such a step is\n * usually about the dialog (a confirmation), so it becomes a sheet instead.\n */\n\nimport { inflate, intersect, intersects, placeTooltip, type Rect, type TooltipSide } from '../ui/placement.js';\nimport type { DomAdapter, Viewport } from './dom.js';\nimport { isExpanded } from './signature.js';\n\nexport const SPOT_PAD = 6;\nexport const GAP = 10;\nexport const MARGIN = 8;\nexport const SHEET_BELOW = 640;\nconst POLL_MS = 250;\n\nexport interface TrackerOptions {\n dom: DomAdapter;\n layer: () => HTMLElement | null;\n bubble: () => HTMLElement | null;\n /** The current target, or null for a centred (targetless) step. */\n target: () => Element | null;\n /** Re-find the target by id after it was detached or hidden. */\n refind: () => Element | null;\n preferred: () => TooltipSide | 'auto';\n /** A rect the bubble should not cover when it has a choice (the next step's target). */\n avoid: () => Rect | null;\n /** The app's open dialogs, which a centred bubble moves off. */\n dialogs?: () => Rect[];\n onLost: () => void;\n /** The bubble was placed (it is visible from now on, so it can take focus). */\n onPlaced?: () => void;\n}\n\nexport interface Tracker {\n start(): void;\n stop(): void;\n notify(): void;\n}\n\nconst CLIPS = /^(?:hidden|auto|scroll|clip)$/;\n\n/** Ancestors that clip the target. ``body`` and ``html`` never do: their overflow belongs to the viewport. */\nfunction clippingAncestors(el: Element): Element[] {\n const out: Element[] = [];\n for (let p = el.parentElement; p && p !== document.body && p !== document.documentElement; p = p.parentElement) {\n const cs = getComputedStyle(p);\n if (CLIPS.test(cs.overflowX) || CLIPS.test(cs.overflowY)) out.push(p);\n }\n return out;\n}\n\nexport function createTracker(o: TrackerOptions): Tracker {\n const s = o.dom.scheduler;\n let running = false;\n let frame = 0;\n let poll = 0;\n let clips: Element[] = [];\n let clipsFor: Element | null = null;\n let observer: ResizeObserver | null = null;\n\n const px = (n: number) => `${Math.round(n * 100) / 100}px`;\n\n function tick(): void {\n frame = 0;\n if (!running) return;\n const layer = o.layer();\n const bubble = o.bubble();\n if (!layer || !bubble) return;\n const vp = o.dom.viewport();\n let target = o.target();\n const anchoredStep = target !== null;\n if (target && (!target.isConnected || !o.dom.isVisible(target))) target = o.refind();\n if (anchoredStep && !target) {\n running = false;\n o.onLost();\n return;\n }\n\n bubble.removeAttribute('data-offscreen');\n layer.removeAttribute('data-offscreen');\n layer.style.setProperty('--_pw-kb', px(Math.max(0, window.innerHeight - (vp.y + vp.height))));\n if (!target) return centre(bubble, vp);\n if (clipsFor !== target) {\n clips = clippingAncestors(target);\n clipsFor = target;\n observer?.disconnect();\n observer?.observe(target);\n observer?.observe(bubble);\n }\n let spot: Rect | null = inflate(o.dom.rect(target) ?? { x: 0, y: 0, width: 0, height: 0 }, SPOT_PAD);\n for (const clip of clips) {\n const r = o.dom.rect(clip);\n if (r && spot) spot = intersect(spot, inflate(r, SPOT_PAD));\n }\n spot = spot && intersect(spot, { x: vp.x, y: vp.y, width: vp.width, height: vp.height });\n if (!spot) {\n bubble.setAttribute('data-offscreen', '');\n layer.setAttribute('data-offscreen', '');\n return centre(bubble, vp);\n }\n layer.style.setProperty('--_pw-sx', px(spot.x));\n layer.style.setProperty('--_pw-sy', px(spot.y));\n layer.style.setProperty('--_pw-sw', px(spot.width));\n layer.style.setProperty('--_pw-sh', px(spot.height));\n bubble.toggleAttribute('data-yield', isExpanded(target));\n\n const centreY = spot.y + spot.height / 2;\n const sheet = (): void => setMode(bubble, centreY > vp.y + vp.height / 2 ? 'sheet-top' : 'sheet-bottom', null);\n if (vp.width <= SHEET_BELOW) return sheet();\n const size = o.dom.rect(bubble) ?? { x: 0, y: 0, width: 320, height: 120 };\n const avoid = o.avoid();\n const rel = (r: Rect): Rect => ({ x: r.x - vp.x, y: r.y - vp.y, width: r.width, height: r.height });\n const p = placeTooltip(rel(spot), size, vp, GAP, {\n preferred: o.preferred(),\n margin: MARGIN,\n avoid: avoid ? [rel(avoid)] : [],\n });\n if (p.overlaps) return sheet();\n layer.style.setProperty('--_pw-x', px(p.x + vp.x));\n layer.style.setProperty('--_pw-y', px(p.y + vp.y));\n setMode(bubble, 'anchored', p.side);\n }\n\n /** Centred, or a sheet on the roomier side of the open app dialogs a centred bubble would cover. */\n function centre(bubble: HTMLElement, vp: Viewport): void {\n const size = o.dom.rect(bubble) ?? { x: 0, y: 0, width: 320, height: 120 };\n const centred = {\n x: vp.x + (vp.width - size.width) / 2,\n y: vp.y + (vp.height - size.height) / 2,\n width: size.width,\n height: size.height,\n };\n const covered = (o.dialogs?.() ?? []).filter((r) => intersects(r, centred));\n if (!covered.length) return setMode(bubble, 'centered', null);\n const above = Math.min(...covered.map((r) => r.y)) - vp.y;\n const below = vp.y + vp.height - Math.max(...covered.map((r) => r.y + r.height));\n setMode(bubble, above >= below ? 'sheet-top' : 'sheet-bottom', null);\n }\n\n function setMode(bubble: HTMLElement, mode: string, side: TooltipSide | null): void {\n bubble.setAttribute('data-mode', mode);\n if (side) bubble.setAttribute('data-side', side);\n else bubble.removeAttribute('data-side');\n bubble.setAttribute('data-placed', '');\n o.onPlaced?.();\n }\n\n function notify(): void {\n if (running && !frame) frame = s.raf(tick);\n }\n\n const onScroll = () => notify();\n return {\n start() {\n if (running) return notify();\n running = true;\n clipsFor = null;\n document.addEventListener('scroll', onScroll, { capture: true, passive: true });\n window.addEventListener('resize', onScroll, { passive: true });\n window.visualViewport?.addEventListener('resize', onScroll, { passive: true });\n window.visualViewport?.addEventListener('scroll', onScroll, { passive: true });\n observer = typeof ResizeObserver === 'function' ? new ResizeObserver(onScroll) : null;\n poll = s.setInterval(notify, POLL_MS);\n notify();\n },\n stop() {\n running = false;\n if (frame) s.cancelRaf(frame);\n frame = 0;\n s.clearInterval(poll);\n observer?.disconnect();\n observer = null;\n clipsFor = null;\n document.removeEventListener('scroll', onScroll, { capture: true });\n window.removeEventListener('resize', onScroll);\n window.visualViewport?.removeEventListener('resize', onScroll);\n window.visualViewport?.removeEventListener('scroll', onScroll);\n },\n notify,\n };\n}\n","/**\n * Turns what the user does *in the app* into engine events: document-level\n * capture listeners that never stop or alter the app's own events.\n *\n * - A click whose path holds the current step's test-id advances a ``click``\n * step; a click on a *later* step's target jumps there (performed when that\n * step is itself a click step). The resume record is written synchronously,\n * before any navigation the click may cause; the engine is told on the next\n * task so the app's handlers run first.\n * - ``input`` / ``change`` on an ``input`` step's target enable Next / commit.\n * - Any interaction outside the overlay arms a ``change`` step's watcher.\n * - Escape dismisses the tour unless the app is using it (a dialog, an open\n * popup, ``preventDefault``, an IME composition).\n *\n * Events whose path goes through the overlay are its own UI and are ignored.\n * Untrusted (scripted) events count like trusted ones: the CI replay clicks\n * with synthetic events.\n */\n\nimport type { EngineEvent, EngineState } from './engine.js';\nimport type { TourStep } from './validate.js';\nimport { isExpanded, readFieldValue } from './signature.js';\n\nexport interface TriggerContext {\n host: HTMLElement;\n attr: string;\n state(): EngineState;\n dispatch(e: EngineEvent): void;\n /** The current step's resolved target. */\n target(): Element | null;\n /** Called synchronously when a click advances or jumps: persist the next step. */\n persistAhead(fromIndex: number): void;\n /** Any interaction outside the overlay (arms ``change`` watchers). */\n interacted(): void;\n /** A ``change`` event or a document click: re-check a ``change`` step. */\n tick(): void;\n defer(cb: () => void): void;\n}\n\n/** An app dialog: Escape inside one is the app's, and a centred bubble moves off an open one. */\nexport const APP_DIALOG = 'dialog,[role=dialog],[role=alertdialog],[aria-modal=\"true\"]';\n\nfunction appPath(e: Event, host: HTMLElement): Element[] | null {\n const path = e.composedPath().slice(0, 64);\n if (path.includes(host)) return null;\n return path.filter((n): n is Element => n instanceof Element);\n}\n\nexport function attachTriggers(ctx: TriggerContext): () => void {\n const { host, attr } = ctx;\n const current = (): { s: EngineState; step: TourStep } | null => {\n const s = ctx.state();\n if (!s.loaded || s.phase === 'idle' || s.phase === 'loading' || s.phase === 'entering') return null;\n return { s, step: s.loaded.tour.steps[s.index]! };\n };\n\n const onClick = (e: Event) => {\n const path = appPath(e, host);\n if (!path) return;\n ctx.interacted();\n ctx.tick();\n const cur = current();\n if (!cur) return;\n const { s, step } = cur;\n const ids = new Set(path.map((el) => el.getAttribute(attr)).filter((v): v is string => v !== null));\n const token = s.token;\n if (s.phase === 'showing' && step.advance === 'click' && step.target !== null && ids.has(step.target)) {\n ctx.persistAhead(s.index);\n ctx.defer(() => ctx.dispatch({ type: 'TRIGGER', token, kind: 'click' }));\n return;\n }\n const steps = s.loaded!.tour.steps;\n const to = steps.findIndex((st, j) => j > s.index && s.loaded!.applicable[j] && st.target !== null && ids.has(st.target));\n if (to === -1) return;\n const performed = steps[to]!.advance === 'click';\n if (performed) ctx.persistAhead(to);\n ctx.defer(() => ctx.dispatch({ type: 'JUMP', token, to, performed }));\n };\n\n const inTarget = (e: Event): boolean => {\n const t = ctx.target();\n return t !== null && e.composedPath().includes(t);\n };\n\n const onInput = (e: Event) => {\n if (!appPath(e, host)) return;\n ctx.interacted();\n const cur = current();\n if (cur?.s.phase === 'showing' && cur.step.advance === 'input' && inTarget(e)) {\n ctx.dispatch({ type: 'FIELD', token: cur.s.token, nonEmpty: readFieldValue(ctx.target()!).trim() !== '' });\n }\n };\n\n const onChange = (e: Event) => {\n if (!appPath(e, host)) return;\n ctx.interacted();\n ctx.tick();\n const cur = current();\n if (cur?.s.phase === 'showing' && cur.step.advance === 'input' && inTarget(e)) {\n const token = cur.s.token;\n if (readFieldValue(ctx.target()!).trim() !== '') ctx.defer(() => ctx.dispatch({ type: 'TRIGGER', token, kind: 'input-commit' }));\n }\n };\n\n const onPress = (e: Event) => {\n if (appPath(e, host)) ctx.interacted();\n };\n\n const onEscape = (e: Event) => {\n const k = e as KeyboardEvent;\n if (k.key !== 'Escape' || k.defaultPrevented || k.isComposing) return;\n const cur = current();\n if (!cur) return;\n const path = k.composedPath();\n const ours = path.indexOf(host);\n const appElements = (ours === -1 ? path : path.slice(ours + 1)).filter((n): n is Element => n instanceof Element);\n if (appElements.some((el) => el.matches(`${APP_DIALOG},[aria-expanded=\"true\"]`))) return;\n // Only a target still in the page counts: one inside a dialog the app has\n // since closed is detached, and Escape is the user's again.\n const target = ctx.target();\n if (target?.isConnected && (target.closest(APP_DIALOG) || isExpanded(target))) return;\n ctx.dispatch({ type: 'DISMISS', via: 'escape' });\n };\n\n const opts = { capture: true };\n document.addEventListener('click', onClick, opts);\n document.addEventListener('input', onInput, opts);\n document.addEventListener('change', onChange, opts);\n document.addEventListener('pointerdown', onPress, opts);\n document.addEventListener('mousedown', onPress, opts);\n document.addEventListener('keydown', onPress, opts);\n window.addEventListener('keydown', onEscape);\n return () => {\n document.removeEventListener('click', onClick, opts);\n document.removeEventListener('input', onInput, opts);\n document.removeEventListener('change', onChange, opts);\n document.removeEventListener('pointerdown', onPress, opts);\n document.removeEventListener('mousedown', onPress, opts);\n document.removeEventListener('keydown', onPress, opts);\n window.removeEventListener('keydown', onEscape);\n };\n}\n\n/**\n * Watches a ``change`` step: the value signature is sampled until the user\n * first interacts (so a label the app fills in asynchronously is not taken\n * for a change), then any difference — ignored while a popup is open, since\n * the signature of an open dropdown is not a choice — advances the step.\n */\nexport function watchChange(\n target: Element,\n signature: (el: Element) => string,\n onChange: () => void,\n schedule: { raf(cb: () => void): number; setInterval(cb: () => void, ms: number): number; clearInterval(id: number): void },\n): { arm(): void; tick(): void; stop(): void } {\n let base = signature(target);\n let armed = false;\n let stopped = false;\n let pending = false;\n const tick = () => {\n pending = false;\n if (stopped || isExpanded(target)) return;\n const sig = signature(target);\n if (!armed) {\n base = sig;\n return;\n }\n if (sig !== base) {\n stopped = true;\n cleanup();\n onChange();\n }\n };\n const soon = () => {\n if (!pending && !stopped) {\n pending = true;\n schedule.raf(tick);\n }\n };\n const observer = new MutationObserver(soon);\n observer.observe(target, { attributes: true, characterData: true, childList: true, subtree: true });\n const poll = schedule.setInterval(tick, 300);\n const cleanup = () => {\n observer.disconnect();\n schedule.clearInterval(poll);\n };\n return {\n arm() {\n armed = true;\n },\n tick: soon,\n stop() {\n stopped = true;\n cleanup();\n },\n };\n}\n","/**\n * ``<steppy-tour-host>`` — mount it once in the app shell and call\n * ``start(tourId)``. The element interprets the engine's effects (``engine.ts``)\n * and owns the browser-facing pieces: loader, resolver, tracker, triggers,\n * focus, the live region and the resume record. It renders nothing while no\n * tour runs.\n *\n * Two switches keep it out of the way: the global\n * ``__STEPPY_TOURS_DISABLED__`` (set by generated E2E tests so an app that\n * auto-starts a tour cannot cover what a test clicks; read at call time) and\n * the ``disabled`` property. Either makes ``start()`` a no-op.\n */\n\nimport { LitElement, nothing, type PropertyValues } from 'lit';\n\nimport { TOUR_ACTIVE_SYMBOL_KEY, TOUR_HOST_TAG, TOURS_KILL_SWITCH_GLOBAL } from '../ui/names.js';\nimport type { LinkPolicy } from '../ui/markdown.js';\nimport type { Rect, TooltipSide } from '../ui/placement.js';\nimport type { TourHostApi, TourNavigate, TourPosition, TourStartOptions } from './api.js';\nimport { DEFAULT_BASE_Z_INDEX, DEFAULT_TARGET_TIMEOUT_MS } from './contract.js';\nimport { defaultDom, type DomAdapter } from './dom.js';\nimport {\n initialState,\n isActive,\n position,\n reduce,\n type Effect,\n type EngineEvent,\n type EngineState,\n type TourErrorDetail,\n type WaitMode,\n} from './engine.js';\nimport { emitTourEvent, type TourEventDetailMap } from './events.js';\nimport { raiseLayer, showLayer } from './layer.js';\nimport { loadTour, type LoaderConfig, type LoadOk, type ManifestLoad, type TourSource } from './loader.js';\nimport { createResolver, type Resolver } from './resolver.js';\nimport { basePath, buildRoute, linkHref, matchRoute, toAppPath, toDocumentPath } from './routes.js';\nimport { isComboboxLike, readFieldValue, valueSignature } from './signature.js';\nimport { clearResume, readResume, writeResume } from './storage.js';\nimport { resolveTourStrings, textDir, type TourStringOverrides } from './strings.js';\nimport { tourStyles } from './styles.js';\nimport { themeDeclarations, type TourAppearance, type TourTheme } from './theme.js';\nimport { renderLayer, type Handlers } from './templates.js';\nimport { createTracker, type Tracker } from './tracker.js';\nimport { APP_DIALOG, attachTriggers, watchChange } from './triggers.js';\nimport { httpOrigin, type TourStep } from './validate.js';\n\nconst ACTIVE = Symbol.for(TOUR_ACTIVE_SYMBOL_KEY);\nconst KEYBOARD_GRACE_MS = 300;\nconst TIMEOUT_MIN = 500;\nconst TIMEOUT_MAX = 120_000;\n\ntype GlobalWithActive = typeof globalThis & { [ACTIVE]?: SteppyTourHost | null } & Record<string, unknown>;\nconst g = globalThis as GlobalWithActive;\n\nconst killSwitch = (): boolean => g[TOURS_KILL_SWITCH_GLOBAL] === true;\n\ninterface Run {\n tourId: string;\n params: Record<string, string>;\n load: LoadOk;\n entryPath: string | null;\n base: string;\n}\n\nexport interface SteppyTourHost {\n addEventListener<K extends keyof TourEventDetailMap>(\n type: K,\n listener: (this: SteppyTourHost, ev: CustomEvent<TourEventDetailMap[K]>) => void,\n options?: boolean | AddEventListenerOptions,\n ): void;\n addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;\n}\n\nexport class SteppyTourHost extends LitElement implements TourHostApi {\n static override styles = tourStyles;\n static override properties = {\n manifest: { type: String },\n fallbackManifest: { type: String, attribute: 'fallback-manifest' },\n buildId: { type: String, attribute: 'build-id' },\n locale: { type: String },\n guideOrigin: { type: String, attribute: 'guide-origin' },\n baseZIndex: { type: Number, attribute: 'base-z-index' },\n targetTimeout: { type: Number, attribute: 'target-timeout' },\n disabled: { type: Boolean, reflect: true },\n source: { attribute: false },\n navigate: { attribute: false },\n strings: { attribute: false },\n theme: { attribute: false },\n appearance: { type: String, reflect: true },\n };\n\n /** Test seam: geometry and timing. */\n static dom: DomAdapter = defaultDom;\n\n manifest = '';\n fallbackManifest = '';\n buildId = '';\n locale = '';\n guideOrigin = '';\n baseZIndex = DEFAULT_BASE_Z_INDEX;\n targetTimeout = DEFAULT_TARGET_TIMEOUT_MS;\n disabled = false;\n source: TourSource | null = null;\n navigate: TourNavigate | null = null;\n strings: TourStringOverrides | undefined = undefined;\n theme: TourTheme | undefined = undefined;\n appearance: TourAppearance = 'dark';\n\n private _s: EngineState = initialState();\n private _queue: EngineEvent[] = [];\n private _dispatching = false;\n private _run: Run | null = null;\n private _cache = new Map<string, Promise<ManifestLoad>>();\n private _resolver: Resolver | null = null;\n private _cancelWait: (() => void) | null = null;\n private _target: Element | null = null;\n private _tracker: Tracker | null = null;\n private _detach: (() => void) | null = null;\n private _change: ReturnType<typeof watchChange> | null = null;\n private _shownKey = '';\n private _shownAt = 0;\n private _pressToken = -1;\n private _focusPending = false;\n private _appFocus: Element | null = null;\n private _swapSeq = 0;\n /** The custom properties ``theme`` wrote last, so a changed theme removes the ones it dropped. */\n private _themed = new Set<string>();\n /** While a tour runs: an app that switches language through ``<html lang>`` alone. */\n private _lang = new MutationObserver(() => {\n if (!this.locale) void this._swapLocale();\n });\n private _policy: LinkPolicy = { autolink: false, link: (url) => this._link(url) };\n private _handlers: Handlers = {\n press: () => {\n this._pressToken = this._s.token;\n },\n next: (e) => this._guarded(e, () => this._dispatch({ type: 'NEXT', token: this._s.token })),\n skip: (e) => this._guarded(e, () => this._dispatch({ type: 'SKIP', token: this._s.token })),\n end: (e) => this._guarded(e, () => this._dispatch({ type: 'DISMISS', via: 'end' })),\n close: (e) => this._guarded(e, () => this._dispatch({ type: 'DISMISS', via: 'close' })),\n resume: (e) => this._guarded(e, () => this._dispatch({ type: 'RESUME', token: this._s.token })),\n };\n\n private get _dom(): DomAdapter {\n return (this.constructor as typeof SteppyTourHost).dom;\n }\n\n // ── Public API ──────────────────────────────────────────────────────────\n\n get isActive(): boolean {\n return isActive(this._s);\n }\n\n get current(): TourPosition | null {\n if (!isActive(this._s) || !this._s.loaded) return null;\n const step = this._s.loaded.tour.steps[this._s.index]!;\n return { tourId: this._s.loaded.tour.id, stepId: step.id, ...position(this._s) };\n }\n\n async start(tourId: string, options: TourStartOptions = {}): Promise<boolean> {\n return this._start(tourId, options, false);\n }\n\n stop(reason?: string): void {\n this._dispatch({ type: 'DISMISS', via: 'api', reason });\n }\n\n next(): void {\n this._dispatch({ type: 'NEXT' });\n }\n\n // ── Lifecycle ───────────────────────────────────────────────────────────\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.style.setProperty('--_pw-z', String(this.baseZIndex));\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n // Deferred: a re-parenting moves the element and reconnects it at once.\n queueMicrotask(() => {\n if (!this.isConnected) this._teardown(false);\n });\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('manifest') || changed.has('fallbackManifest') || changed.has('buildId')) this._cache.clear();\n if (changed.has('baseZIndex')) this.style.setProperty('--_pw-z', String(this.baseZIndex));\n if (changed.has('theme')) this._applyTheme();\n if (changed.has('disabled') && this.disabled && this._s.phase !== 'idle') this._dispatch({ type: 'DISMISS', via: 'disabled' });\n }\n\n protected override updated(changed: PropertyValues<this>): void {\n if (changed.has('locale') && this.isActive) void this._swapLocale();\n if ((changed.has('manifest') || changed.has('fallbackManifest')) && this.hasUpdated) this._tryResume();\n this._afterRender();\n }\n\n protected override firstUpdated(): void {\n this._tryResume();\n }\n\n protected override render() {\n const s = this._s;\n if (!this._run || !s.loaded || !isActive(s)) return nothing;\n const step = s.loaded.tour.steps[s.index]!;\n const mode = s.phase === 'showing' || s.phase === 'fallback' ? 'bubble' : s.phase === 'paused' ? 'pill' : 'none';\n const pos = position(s);\n return renderLayer(\n {\n mode,\n lang: s.loaded.tour.locale.replace(/_/g, '-'),\n dir: textDir(s.loaded.tour.locale),\n tourId: s.loaded.tour.id,\n step,\n state: s.phase === 'fallback' ? 'fallback' : 'shown',\n anchored: s.phase === 'showing' && this._target !== null,\n position: pos,\n last: pos.index === pos.total - 1,\n nextEnabled: step.advance !== 'input' || s.fieldNonEmpty,\n guideUrl: s.loaded.tour.guideUrl,\n strings: resolveTourStrings(s.loaded.tour.locale, this.strings),\n policy: this._policy,\n popover: this._dom.supportsPopover(),\n },\n this._handlers,\n );\n }\n\n /** Inline custom properties win over the page's ``:root`` and element rules. */\n private _applyTheme(): void {\n const next = themeDeclarations(this.theme);\n for (const prop of this._themed) if (!next.has(prop)) this.style.removeProperty(prop);\n for (const [prop, value] of next) this.style.setProperty(prop, value);\n this._themed = new Set(next.keys());\n }\n\n // ── Starting ────────────────────────────────────────────────────────────\n\n private async _start(tourId: string, options: TourStartOptions, resumed: boolean): Promise<boolean> {\n try {\n if (killSwitch() || this.disabled) {\n console.info(`[steppy-tour] \"${tourId}\" not started: tours are disabled on this page`);\n return false;\n }\n const other = g[ACTIVE];\n if (other && other !== this) other._dispatch({ type: 'DISMISS', via: 'replaced' });\n if (this._s.phase !== 'idle') this._dispatch({ type: 'DISMISS', via: 'replaced' });\n this._dispatch({ type: 'REQUEST' });\n const token = this._s.token;\n const params = Object.fromEntries(Object.entries(options.params ?? {}).map(([k, v]) => [k, String(v)]));\n const locale = this._preferredLocale();\n const load = await loadTour(this._cfg(locale), tourId);\n if (this._s.token !== token) return false;\n if (!load.ok) return this._fail({ reason: load.reason, fatal: true, message: load.message, tourId, issues: load.issues });\n\n const { tour, manifest } = load;\n const dom = this._dom;\n const layouts = manifest.layouts ?? {};\n const applicable = tour.steps.map((st) => !st.layouts || st.layouts.some((l) => dom.matchMedia(layouts[l]!)));\n const meta = { tourId, buildId: tour.buildId, locale: tour.locale };\n if (!applicable.some(Boolean)) return this._fail({ reason: 'load-failed', fatal: true, message: 'no steps apply to this layout', ...meta });\n let start = applicable.indexOf(true);\n if (options.step !== undefined) {\n const at = tour.steps.findIndex((st) => st.id === options.step);\n if (at >= 0 && applicable[at]) start = at;\n else if (resumed) {\n clearResume();\n return this._fail(null);\n }\n }\n\n const base = basePath(document.baseURI, location.origin);\n let entryPath: string | null = null;\n let all = params;\n if (tour.entry && !resumed) {\n const route = tour.entry.route;\n const here = matchRoute(route, toAppPath(location.pathname, base)) ?? matchRoute(route, location.pathname);\n all = { ...(here ?? {}), ...params };\n if (!here || Object.entries(params).some(([k, v]) => here[k] !== v)) {\n const built = buildRoute(route, all);\n if ('missing' in built) {\n return this._fail({\n reason: 'entry-params',\n fatal: true,\n message: `route ${route} needs ${built.missing.join(', ')}`,\n missing: built.missing,\n ...meta,\n });\n }\n entryPath = toDocumentPath(built.path, base);\n }\n }\n this._run = { tourId, params: all, load, entryPath, base };\n this._resolver = createResolver({ attr: load.testIdAttribute, host: this, dom });\n g[ACTIVE] = this;\n this._dispatch({\n type: 'LOADED',\n loaded: { tour, source: load.source, applicable, start, resumed, navigate: entryPath !== null },\n });\n this._lang.observe(document.documentElement, { attributeFilter: ['lang'] });\n // The app may have changed language while the files loaded (an async i18n\n // init racing a resumed tour): catch up now that there is a run to swap.\n if (this._preferredLocale() !== locale) void this._swapLocale();\n return true;\n } catch (err) {\n console.error('[steppy-tour] start failed', err);\n this._fail({ reason: 'load-failed', fatal: true, message: String(err), tourId });\n return false;\n }\n }\n\n private _fail(error: TourErrorDetail | null): false {\n if (error) this._dispatch({ type: 'LOAD_FAILED', error });\n else this._dispatch({ type: 'DISMISS', via: 'api' });\n return false;\n }\n\n private _tryResume(): void {\n if (this.disabled || killSwitch() || this._s.phase !== 'idle' || g[ACTIVE]) return;\n const key = this._manifestKey();\n const record = key ? readResume(key, Date.now()) : null;\n if (record) void this._start(record.tourId, { params: record.params, step: record.stepId }, true);\n }\n\n private _manifestKey(): string {\n return [this.manifest, this.fallbackManifest].filter(Boolean).join(' ');\n }\n\n /** The host's ``locale``, else the page's ``<html lang>``. */\n private _preferredLocale(): string {\n return this.locale || document.documentElement.lang;\n }\n\n private _cfg(locale: string): LoaderConfig {\n const { manifest, fallbackManifest, buildId, guideOrigin, source } = this;\n return { manifest, fallbackManifest, buildId, locale, guideOrigin, source, cache: this._cache };\n }\n\n /** Reload the running tour in the preferred locale; the last request wins. */\n private async _swapLocale(): Promise<void> {\n const run = this._run;\n if (!run) return;\n const seq = ++this._swapSeq;\n const locale = this._preferredLocale();\n const load = await loadTour(this._cfg(locale), run.tourId);\n if (seq !== this._swapSeq || this._run !== run) return;\n if (load.ok && load.tour.buildId === run.load.tour.buildId) {\n if (load.tour.locale === run.load.tour.locale) return;\n this._dispatch({ type: 'LOCALE', tour: load.tour });\n if (this._s.loaded?.tour === load.tour) {\n run.load = load;\n this._announce();\n return;\n }\n }\n console.warn(`[steppy-tour] locale \"${locale}\" not applied: ${load.ok ? 'the tour differs' : load.message}`);\n }\n\n // ── The engine loop ─────────────────────────────────────────────────────\n\n private _dispatch(event: EngineEvent): void {\n this._queue.push(event);\n if (this._dispatching) return;\n this._dispatching = true;\n const before = this._s;\n try {\n while (this._queue.length) {\n const t = reduce(this._s, this._queue.shift()!);\n this._s = t.state;\n for (const effect of t.effects) this._effect(effect);\n }\n } finally {\n this._dispatching = false;\n }\n if (this._s !== before) this.requestUpdate();\n }\n\n private _effect(e: Effect): void {\n const run = this._run;\n switch (e.type) {\n case 'emit':\n emitTourEvent(this, e.name, e.detail as never);\n break;\n case 'persist':\n if (run) this._persist(e.index);\n break;\n case 'clearPersist':\n clearResume();\n break;\n case 'navigate':\n void this._enter(e.token);\n break;\n case 'wait':\n this._wait(e.mode, e.index, e.token);\n break;\n case 'focus':\n this._focusPending = true;\n break;\n case 'teardown':\n this._teardown(true);\n break;\n case 'load':\n break;\n }\n }\n\n private _persist(index: number): void {\n const run = this._run!;\n const tour = run.load.tour;\n writeResume({\n v: 1,\n tourId: tour.id,\n stepId: tour.steps[index]!.id,\n locale: tour.locale,\n params: run.params,\n buildId: tour.buildId,\n manifestKey: this._manifestKey(),\n savedAt: Date.now(),\n });\n }\n\n private async _enter(token: number): Promise<void> {\n const run = this._run!;\n const path = run.entryPath!;\n const ctx = { appPath: toAppPath(path, run.base), tourId: run.tourId };\n try {\n const hook = this.navigate ?? ((p: string) => location.assign(p));\n await Promise.race([\n Promise.resolve(hook(path, ctx)),\n new Promise((r) => this._dom.scheduler.setTimeout(() => r(undefined), this._timeout())),\n ]);\n this._dispatch({ type: 'ENTER_DONE', token });\n } catch (err) {\n this._dispatch({ type: 'ENTER_FAILED', token, message: `navigation failed: ${String(err)}` });\n }\n }\n\n private _timeout(): number {\n const t = Number(this.targetTimeout);\n return Number.isFinite(t) ? Math.min(TIMEOUT_MAX, Math.max(TIMEOUT_MIN, t)) : DEFAULT_TARGET_TIMEOUT_MS;\n }\n\n private _wait(mode: WaitMode, index: number, token: number): void {\n this._cancelWait?.();\n const step = this._s.loaded!.tour.steps[index]!;\n const resolver = this._resolver!;\n const ids =\n mode === 'resolve' || mode === 'fallback'\n ? [step.advance === 'visible' ? null : step.target, step.waitFor].filter((v): v is string => v !== null)\n : [step.target!];\n const timeoutMs = mode === 'resolve' || mode === 'lost' || mode === 'visible' ? this._timeout() : null;\n this._cancelWait = resolver.wait({\n ids,\n timeoutMs,\n onFound: (found) => {\n this._cancelWait = null;\n // A visible-advance step resolves on its waitFor only: its target may\n // still be missing, and the step then shows centred until it appears.\n this._target = step.target ? (found.get(step.target) ?? resolver.find(step.target)) : null;\n // A pre-filled field enables Next from the start.\n const fieldNonEmpty = step.advance === 'input' && this._target !== null && readFieldValue(this._target).trim() !== '';\n const next: EngineEvent =\n mode === 'resolve' || mode === 'fallback'\n ? { type: 'RESOLVED', token, fieldNonEmpty }\n : mode === 'visible'\n ? { type: 'TRIGGER', token, kind: 'visible' }\n : { type: 'TARGET_BACK', token };\n this._dispatch(next);\n },\n onTimeout: (missing) => {\n this._cancelWait = null;\n if (mode === 'lost') return this._dispatch({ type: 'LOST_TIMEOUT', token });\n const kind = missing === step.waitFor && missing !== step.target ? 'waitFor' : 'target';\n this._dispatch({ type: 'RESOLVE_TIMEOUT', token, testId: missing, kind });\n },\n });\n }\n\n // ── Showing ─────────────────────────────────────────────────────────────\n\n private _layer(): HTMLElement | null {\n return this.renderRoot.querySelector<HTMLElement>('[part~=\"layer\"]');\n }\n\n private _bubble(): HTMLElement | null {\n return this.renderRoot.querySelector<HTMLElement>('[part~=\"bubble\"]');\n }\n\n private _afterRender(): void {\n const s = this._s;\n const layer = this._layer();\n const shown = s.phase === 'showing' || s.phase === 'fallback' || s.phase === 'paused';\n if (!layer || !shown || !s.loaded) {\n this._tracker?.stop();\n this._change?.stop();\n this._change = null;\n if (!isActive(s)) this._shownKey = '';\n return;\n }\n showLayer(layer, this._dom);\n this._ensureTriggers();\n const step = s.loaded.tour.steps[s.index]!;\n const key = `${s.loaded.tour.id}/${s.index}/${s.phase}`;\n const fresh = key !== this._shownKey;\n if (fresh) {\n this._shownKey = key;\n this._shownAt = this._dom.scheduler.now();\n raiseLayer(layer, this._dom);\n if (s.phase === 'showing') this._onStepShown(step);\n this._announce();\n }\n if (s.phase === 'showing' || s.phase === 'fallback') {\n if (!this._tracker) this._tracker = this._makeTracker();\n this._tracker.start();\n this._tracker.notify();\n } else this._tracker?.stop();\n }\n\n /** Manual and fallback steps take focus — once placed: a hidden bubble cannot be focused. */\n private _applyPendingFocus(): void {\n const primary = this._focusPending ? this.renderRoot.querySelector<HTMLElement>('[part~=\"primary\"]') : null;\n if (!primary) return;\n this._focusPending = false;\n primary.focus({ preventScroll: true });\n }\n\n private _onStepShown(step: TourStep): void {\n const target = this._target;\n this._change?.stop();\n this._change = null;\n if (target && step.advance === 'change') {\n const token = this._s.token;\n this._change = watchChange(target, valueSignature, () => this._dispatch({ type: 'TRIGGER', token, kind: 'change' }), this._dom.scheduler);\n }\n if (target) {\n const r = this._dom.rect(target);\n const vp = this._dom.viewport();\n const inside = r && r.x >= vp.x && r.y >= vp.y && r.x + r.width <= vp.x + vp.width && r.y + r.height <= vp.y + vp.height;\n if (!inside) this._dom.scrollIntoView(target, this._dom.reducedMotion());\n }\n // Focus never leaves an app element; it only comes back out of the overlay.\n const active = this._deepActive();\n if (active && this.renderRoot.contains(active) && step.advance !== 'manual') {\n const back = target instanceof HTMLElement ? target : this._appFocus;\n (back as HTMLElement | null)?.focus?.({ preventScroll: true });\n }\n }\n\n private _announce(): void {\n this._dom.scheduler.raf(() => {\n const live = this.renderRoot.querySelector('[role=\"status\"]');\n const bubble = this._bubble();\n if (!live) return;\n live.textContent = '';\n if (this._s.phase === 'paused') live.textContent = resolveTourStrings(this._s.loaded?.tour.locale ?? 'en', this.strings).paused;\n else if (bubble) {\n const part = (p: string) => bubble.querySelector(`[part~=\"${p}\"]`)?.textContent?.trim() ?? '';\n live.textContent = [part('title'), part('body'), part('progress')].filter(Boolean).join(' ');\n }\n });\n }\n\n private _makeTracker(): Tracker {\n return createTracker({\n dom: this._dom,\n layer: () => this._layer(),\n bubble: () => this._bubble(),\n target: () => (this._s.phase === 'showing' ? this._target : null),\n refind: () => {\n const id = this._s.loaded?.tour.steps[this._s.index]?.target;\n const found = id && this._resolver ? this._resolver.find(id) : null;\n if (found) this._target = found;\n return found;\n },\n preferred: () => this._preferredSide(),\n avoid: () => this._nextTargetRect(),\n dialogs: () => this._openDialogs(),\n onPlaced: () => this._applyPendingFocus(),\n onLost: () => {\n // Queued behind any click trigger already deferred: a click whose\n // handler removes its own target (a dialog's Save) advances, it does\n // not lose the step. The stale token then drops this report.\n const token = this._s.token;\n this._dom.scheduler.setTimeout(() => this._dispatch({ type: 'TARGET_LOST', token }), 0);\n },\n });\n }\n\n private _preferredSide(): TooltipSide | 'auto' {\n const step = this._s.loaded?.tour.steps[this._s.index];\n if (step?.placement && step.placement !== 'auto') return step.placement;\n return step?.advance === 'change' && this._target && isComboboxLike(this._target) ? 'top' : 'auto';\n }\n\n private _nextTargetRect(): Rect | null {\n const s = this._s;\n const steps = s.loaded?.tour.steps ?? [];\n const next = steps.find((st, j) => j > s.index && s.loaded!.applicable[j]);\n const el = next?.target && this._resolver ? this._resolver.find(next.target) : null;\n return el ? this._dom.rect(el) : null;\n }\n\n /** The app's open dialogs (the overlay's own bubble is in the shadow root, so never one of them). */\n private _openDialogs(): Rect[] {\n const out: Rect[] = [];\n for (const el of document.querySelectorAll(APP_DIALOG)) {\n const r = this._dom.rect(el);\n if (r) out.push(r);\n }\n return out;\n }\n\n private _ensureTriggers(): void {\n if (this._detach || !this._run) return;\n this._detach = attachTriggers({\n host: this,\n attr: this._run.load.testIdAttribute,\n state: () => this._s,\n dispatch: (e) => this._dispatch(e),\n target: () => this._target,\n persistAhead: (from) => {\n const s = this._s;\n const next = s.loaded!.applicable.findIndex((ok, j) => ok && j > from);\n if (next === -1) clearResume();\n else this._persist(next);\n },\n interacted: () => this._change?.arm(),\n tick: () => this._change?.tick(),\n defer: (cb) => this._dom.scheduler.setTimeout(cb, 0),\n });\n document.addEventListener('focusin', this._onFocusIn, true);\n }\n\n private _onFocusIn = (e: FocusEvent) => {\n if (!e.composedPath().includes(this)) this._appFocus = e.composedPath()[0] as Element;\n };\n\n /** Our buttons: a click counts only if it was pressed on this step (or, by keyboard, after a short grace). */\n private _guarded(e: MouseEvent, act: () => void): void {\n e.stopPropagation();\n const keyboard = e.detail === 0;\n if (keyboard ? this._dom.scheduler.now() - this._shownAt < KEYBOARD_GRACE_MS : this._pressToken !== this._s.token) return;\n act();\n }\n\n private _deepActive(): Element | null {\n let el = document.activeElement;\n while (el?.shadowRoot?.activeElement) el = el.shadowRoot.activeElement;\n return el;\n }\n\n private _teardown(restoreFocus: boolean): void {\n this._cancelWait?.();\n this._cancelWait = null;\n this._tracker?.stop();\n this._tracker = null;\n this._change?.stop();\n this._change = null;\n this._detach?.();\n this._detach = null;\n document.removeEventListener('focusin', this._onFocusIn, true);\n this._lang.disconnect();\n const active = this._deepActive();\n if (restoreFocus && active && this.renderRoot.contains(active) && this._appFocus instanceof HTMLElement) {\n this._appFocus.focus({ preventScroll: true });\n }\n this._target = null;\n this._run = null;\n this._resolver = null;\n this._shownKey = '';\n if (g[ACTIVE] === this) g[ACTIVE] = null;\n if (!restoreFocus && this._s.phase !== 'idle') this._s = { ...initialState(), token: this._s.token + 1 };\n }\n\n // ── Links in step text ──────────────────────────────────────────────────\n\n private _link(url: string): ReturnType<LinkPolicy['link']> {\n const run = this._run;\n const base = run?.base ?? basePath(document.baseURI, location.origin);\n const path = linkHref(url, base, location.origin);\n if (path !== null) {\n return {\n kind: 'internal',\n href: path,\n onActivate: (e: MouseEvent) => {\n if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n e.preventDefault();\n const hook = this.navigate ?? ((p: string) => location.assign(p));\n void Promise.resolve(hook(path, { appPath: toAppPath(path, base), tourId: run?.tourId ?? '' })).catch(() => undefined);\n },\n };\n }\n const origin = httpOrigin(url);\n const trusted = run?.load.guideOrigin ?? null;\n return origin && trusted && origin === trusted ? { kind: 'external', href: url } : null;\n }\n}\n\n/** Register ``<steppy-tour-host>`` once; a second call (or a second copy of the bundle) is a no-op. */\nexport function defineTourHost(): void {\n const existing = customElements.get(TOUR_HOST_TAG);\n if (!existing) customElements.define(TOUR_HOST_TAG, SteppyTourHost);\n else if (existing !== SteppyTourHost) {\n console.warn(`[steppy-tour] <${TOUR_HOST_TAG}> is already defined by another copy of the overlay; keeping that one`);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'steppy-tour-host': SteppyTourHost;\n }\n}\n","/**\n * ``@steppy/player/tour`` — the in-app tour overlay.\n *\n * Importing this module registers ``<steppy-tour-host>`` (once, even if two\n * copies of the bundle load). It touches ``HTMLElement`` at load, so a\n * server-rendered app imports it in the browser only.\n */\n\nimport { defineTourHost } from './host.js';\n\nexport { SteppyTourHost, defineTourHost } from './host.js';\nexport type { TourHostApi, TourNavigate, TourNavigateContext, TourPosition, TourSource, TourStartOptions, TourStringOverrides } from './api.js';\nexport { TOUR_APPEARANCES, TOUR_THEME_KEYS, themeProperty, type TourAppearance, type TourTheme, type TourThemeKey } from './theme.js';\nexport type { TourEventDetailMap, TourEventMeta, TourStepPosition } from './events.js';\nexport type { DismissVia, StepReason, TourErrorDetail, TourSourceKind } from './engine.js';\nexport {\n ADVANCE_KINDS,\n PLACEMENTS,\n TOUR_ERROR_REASONS,\n TOUR_EVENTS,\n TOUR_PARTS,\n TOUR_SCHEMA_VERSION,\n type AdvanceKind,\n type Placement,\n type TourErrorReason,\n type TourEventName,\n type TourPart,\n} from './contract.js';\nexport { TOUR_HOST_TAG, TOURS_KILL_SWITCH_GLOBAL } from '../ui/names.js';\nexport { DEFAULT_TOUR_STRINGS, type TourStrings } from './strings.js';\nexport { validateManifest, validateTour, type TourFile, type TourManifest, type TourStep } from './validate.js';\n\ndefineTourHost();\n"],"names":["t","e","s","o","n$2","r","n","i","S","c","h","a","l","p","d","u","f","b","y$1","y","v","_","m","g","$","x","E","C","P","V","N","I","L","z","H","M","R","k","Z","B","D","TOUR_HOST_TAG","TOURS_MANIFEST_KIND","TOUR_FILE_KIND","TOURS_KILL_SWITCH_GLOBAL","TOUR_RESUME_STORAGE_KEY","TOUR_ACTIVE_SYMBOL_KEY","TOUR_SCHEMA_VERSION","ADVANCE_KINDS","TARGETED_ADVANCE_KINDS","PLACEMENTS","TOUR_EVENTS","TOUR_ERROR_REASONS","TOUR_PARTS","TEST_ID_PATTERN","STEP_ID_PATTERN","TEST_ID_ATTRIBUTE_PATTERN","TOUR_ID_PATTERN","LAYOUT_NAME_PATTERN","ROLE_PATTERN","LOCALE_PATTERN","SRI_PATTERN","ROUTE_PATTERN","MEDIA_QUERY_PATTERN","BUILD_ID_PATTERN","MAX_TOURS","MAX_STEPS","MAX_LOCALES","MAX_LAYOUTS","MAX_TITLE_CHARS","MAX_TEXT_CHARS","MAX_ROUTE_CHARS","MAX_URL_CHARS","MAX_MEDIA_QUERY_CHARS","MAX_TOUR_FILE_BYTES","MAX_MANIFEST_BYTES","DEFAULT_TARGET_TIMEOUT_MS","DEFAULT_BASE_Z_INDEX","OPPOSITE","placeTooltip","hotspot","tooltip","stage","gap","opts","legacyPlace","placeWithOptions","above","below","left","right","verticalNeeded","horizontalNeeded","bestVertical","pick","bestHorizontal","cx","cy","clamp","margin","room","order","sideOrder","fits","side","vertical","main","cross","crossStage","place","xCentred","yCentred","avoid","hits","intersects","fitting","chosen","best","overlaps","preferred","horizontal","rest","lo","hi","intersect","bottom","union","inflate","pad","FOCUSABLE","ownRect","el","effectiveRect","depth","style","acc","child","own","inner","defaultScheduler","cb","id","ms","defaultDom","vv","q","instant","initialState","isActive","position","index","applicable","meta","tour","stepDetail","step","emit","name","detail","resolveStep","reason","state","advanceFrom","from","next","ok","j","TRIGGER_FOR","reduce","none","loaded","base","start","st","effects","visibleWait","api","lost","old","emitTourEvent","host","deepActive","isLayerOpen","showLayer","dom","raiseLayer","active","format","template","vars","key","baseLanguage","tag","lookupLocale","keys","requested","norm","list","wanted","exact","resolveStrings","defaults","locale","overrides","fallback","overrideKey","override","CHROME_STRINGS","MAX_ISSUES","RX","WINDOWS_RESERVED","BAD_PERCENT","isRoutePattern","value","seg","isBuildId","httpOrigin","url","Checker","path","message","rx","max","optional","allowed","check","out","header","root","kind","parseJson","text","err","schemaGate","raw","schema","validateManifest","gate","buildId","testIdAttribute","locales","defaultLocale","guideOrigin","layouts","query","tours","seen","inLocales","files","loc","fp","title","tp","integrity","ip","validateTour","ctx","manifest","entry","guideUrl","origin","tourEntry","steps","ids","layoutNames","target","advanceObj","advance","RANK","LoadError","pickLocale","available","readCapped","res","cap","decoder","decode","bytes","reader","chunks","total","done","all","offset","loadTour","cfg","tourId","baseURI","doFetch","cache","abs","timeoutMs","get","isCross","controller","timer","init","getManifest","pending","parsed","errors","failed","what","bundled","expected","primary","remoteOrigin","ref","got","POLL_MS","MAX_MATCHES","createResolver","attr","find","selector","wait","req","frame","hiddenSince","hiddenTotal","started","attributeFilter","found","missing","stop","hidden","schedule","onVisibility","observer","poll","PARAM","segments","trimmed","matchRoute","pattern","want","have","params","param","routeParams","buildRoute","basePath","toAppPath","documentPath","toDocumentPath","appPath","isSafeRelativeUrl","linkHref","href","CONTROLS","ARIA","LIMIT","controlSig","valueSignature","controls","aria","isExpanded","editableText","editable","readFieldValue","isComboboxLike","RESUME_TTL_MS","store","writeResume","record","clearResume","readResume","manifestKey","now","fresh","DEFAULT_TOUR_STRINGS","resolveTourStrings","contentLocale","textDir","lang","sub","INSTRUCTION","instructionFor","strings","PALETTE","BUBBLE_LOOK","BUTTON_LOOK","TOUR_DEFAULTS","TOUR_LIGHT","cssValue","unsafeCSS","TOUR_THEME_KEYS","TOUR_APPEARANCES","KEYS","kebab","themeProperty","privateProperty","themeDeclarations","theme","DERIVED","ALIASES","DARK","LIGHT","privateTokens","lines","derived","alias","tourStyles","css","SAFE_GUIDE_URL","GUIDE_LINK_POLICY","INLINE_SRC","renderInlineMarkdown","src","policy","parts","pushText","ln","html","re","last","trail","nextButton","nothing","label","bubble","body","showGuide","pill","renderLayer","SPOT_PAD","GAP","MARGIN","SHEET_BELOW","CLIPS","clippingAncestors","cs","createTracker","running","clips","clipsFor","px","tick","layer","vp","anchoredStep","centre","spot","clip","centreY","sheet","setMode","size","rel","centred","covered","mode","notify","onScroll","APP_DIALOG","attachTriggers","current","onClick","cur","token","to","performed","inTarget","onInput","onChange","onPress","onEscape","ours","watchChange","signature","armed","stopped","sig","cleanup","soon","ACTIVE","KEYBOARD_GRACE_MS","TIMEOUT_MIN","TIMEOUT_MAX","killSwitch","SteppyTourHost","LitElement","options","changed","pos","prop","resumed","other","load","at","entryPath","route","here","built","error","fallbackManifest","source","run","seq","event","before","effect","hook","resolver","fieldNonEmpty","shown","live","part","act","restoreFocus","trusted","defineTourHost","existing"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}