@kodaris/krubble-app-components 1.0.107 → 1.0.108

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":"krubble-app.umd.min.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","../../../node_modules/@lit/reactive-element/decorators/custom-element.js","../../../node_modules/@lit/reactive-element/decorators/property.js","../../../node_modules/@lit/reactive-element/decorators/state.js","../../../node_modules/@lit/reactive-element/decorators/query.js","../../../node_modules/@lit/reactive-element/decorators/base.js","../../../node_modules/lit-html/directive.js","../../../node_modules/lit-html/directives/unsafe-html.js","../../../node_modules/lit-html/directives/class-map.js","scaffold/nav-item-edit.js","scaffold.js","screen-nav.js","screen-detail.js","subbar.js","router.js","../../../node_modules/lit-html/directives/style-map.js","../../../node_modules/lit-html/directive-helpers.js","../../../node_modules/lit-html/directives/repeat.js","../../../node_modules/marked/lib/marked.esm.js","chatbot.js"],"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.2\");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 * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","import{desc as t}from\"./base.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function e(e,r){return(n,s,i)=>{const o=t=>t.renderRoot?.querySelector(e)??null;if(r){const{get:e,set:r}=\"object\"==typeof s?n:i??(()=>{const t=Symbol();return{get(){return this[t]},set(e){this[t]=e}}})();return t(n,s,{get(){let t=e.call(this);return void 0===t&&(t=o(this),(null!==t||this.hasUpdated)&&r.call(this,t)),t}})}return t(n,s,{get(){return o(this)}})}}export{e as query};\n//# sourceMappingURL=query.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst e=(e,t,c)=>(c.configurable=!0,c.enumerable=!0,Reflect.decorate&&\"object\"!=typeof t&&Object.defineProperty(e,t,c),c);export{e as desc};\n//# sourceMappingURL=base.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{nothing as t,noChange as i}from\"../lit-html.js\";import{directive as r,Directive as s,PartType as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends s{constructor(i){if(super(i),this.it=t,i.type!==n.CHILD)throw Error(this.constructor.directiveName+\"() can only be used in child bindings\")}render(r){if(r===t||null==r)return this._t=void 0,this.it=r;if(r===i)return r;if(\"string\"!=typeof r)throw Error(this.constructor.directiveName+\"() called with a non-string value\");if(r===this.it)return this._t;this.it=r;const s=[r];return s.raw=s,this._t={_$litType$:this.constructor.resultType,strings:s,values:[]}}}e.directiveName=\"unsafeHTML\",e.resultType=1;const o=r(e);export{e as UnsafeHTMLDirective,o as unsafeHTML};\n//# sourceMappingURL=unsafe-html.js.map\n","import{noChange as t}from\"../lit-html.js\";import{directive as s,Directive as i,PartType as r}from\"../directive.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const e=s(class extends i{constructor(t){if(super(t),t.type!==r.ATTRIBUTE||\"class\"!==t.name||t.strings?.length>2)throw Error(\"`classMap()` can only be used in the `class` attribute and must be the only part in the attribute.\")}render(t){return\" \"+Object.keys(t).filter(s=>t[s]).join(\" \")+\" \"}update(s,[i]){if(void 0===this.st){this.st=new Set,void 0!==s.strings&&(this.nt=new Set(s.strings.join(\" \").split(/\\s/).filter(t=>\"\"!==t)));for(const t in i)i[t]&&!this.nt?.has(t)&&this.st.add(t);return this.render(i)}const r=s.element.classList;for(const t of this.st)t in i||(r.remove(t),this.st.delete(t));for(const t in i){const s=!!i[t];s===this.st.has(t)||this.nt?.has(t)||(s?(r.add(t),this.st.add(t)):(r.remove(t),this.st.delete(t)))}return t}});export{e as classMap};\n//# sourceMappingURL=class-map.js.map\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html, css } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport '@kodaris/krubble-components';\nlet KRNavItemEdit = class KRNavItemEdit extends LitElement {\n constructor() {\n super(...arguments);\n this.label = '';\n this.icon = '';\n this.url = '';\n this.active = true;\n }\n connectedCallback() {\n super.connectedCallback();\n if (this.data) {\n this.label = this.data.label || '';\n this.icon = this.data.icon || '';\n this.url = this.data.url || '';\n this.active = this.data.active !== false;\n }\n }\n handleLabelInput(e) {\n const textField = e.target;\n this.label = textField.value;\n }\n handleIconInput(e) {\n const textField = e.target;\n this.icon = textField.value;\n }\n handleUrlInput(e) {\n const textField = e.target;\n this.url = textField.value;\n }\n handleActiveChange(e) {\n this.active = e.target.checked;\n }\n handleCancel() {\n this.dialogRef.close(undefined);\n }\n handleSave() {\n this.dialogRef.close({\n label: this.label,\n icon: this.icon || undefined,\n url: this.url || undefined,\n active: this.active,\n });\n }\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleSave();\n }\n }\n render() {\n return html `\n <h2>Edit Navigation Item</h2>\n\n <div class=\"form-group\">\n <kr-text-field\n label=\"Label\"\n name=\"label\"\n .value=${this.label}\n @input=${this.handleLabelInput}\n @keydown=${this.handleKeyDown}\n placeholder=\"Enter label\"\n ></kr-text-field>\n </div>\n\n <div class=\"form-group\">\n <kr-text-field\n label=\"Icon (emoji or SVG)\"\n name=\"icon\"\n .value=${this.icon}\n @input=${this.handleIconInput}\n @keydown=${this.handleKeyDown}\n placeholder=\"e.g. 📊 or <svg>...</svg>\"\n ></kr-text-field>\n </div>\n\n <div class=\"form-group\">\n <kr-text-field\n label=\"URL\"\n name=\"url\"\n .value=${this.url}\n @input=${this.handleUrlInput}\n @keydown=${this.handleKeyDown}\n placeholder=\"e.g. /ci/my-page or https://...\"\n ></kr-text-field>\n </div>\n\n <div class=\"form-group\">\n <div class=\"checkbox-group\">\n <input\n type=\"checkbox\"\n id=\"active\"\n .checked=${this.active}\n @change=${this.handleActiveChange}\n />\n <label class=\"checkbox-label\" for=\"active\">Visible in navigation</label>\n </div>\n </div>\n\n <div class=\"actions\">\n <button class=\"btn-cancel\" @click=${this.handleCancel}>Cancel</button>\n <button class=\"btn-save\" @click=${this.handleSave}>Save</button>\n </div>\n `;\n }\n};\nKRNavItemEdit.styles = css `\n :host {\n display: block;\n width: 360px;\n padding: 24px;\n color: rgba(255, 255, 255, 0.9);\n\n /* Dark theme for kr-text-field */\n --kr-text-field-label-color: rgba(255, 255, 255, 0.7);\n --kr-text-field-border-color: rgba(255, 255, 255, 0.1);\n --kr-text-field-bg: rgba(255, 255, 255, 0.05);\n --kr-text-field-color: #ffffff;\n --kr-text-field-focus-border-color: #beea4e;\n --kr-text-field-focus-ring-color: rgba(190, 234, 78, 0.1);\n --kr-text-field-placeholder-color: rgba(255, 255, 255, 0.3);\n --kr-text-field-helper-color: rgba(255, 255, 255, 0.5);\n }\n\n h2 {\n margin: 0 0 24px 0;\n font-size: 18px;\n font-weight: 600;\n color: #ffffff;\n }\n\n .form-group {\n margin-bottom: 20px;\n }\n\n .checkbox-group {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n accent-color: #beea4e;\n cursor: pointer;\n }\n\n .checkbox-label {\n font-size: 14px;\n color: rgba(255, 255, 255, 0.9);\n cursor: pointer;\n }\n\n .actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n margin-top: 28px;\n }\n\n button {\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .btn-cancel {\n background: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.1);\n color: rgba(255, 255, 255, 0.8);\n }\n\n .btn-cancel:hover {\n background: rgba(255, 255, 255, 0.1);\n color: #ffffff;\n }\n\n .btn-save {\n background: #beea4e;\n border: none;\n color: #10172a;\n }\n\n .btn-save:hover {\n background: #d4f472;\n }\n `;\n__decorate([\n state()\n], KRNavItemEdit.prototype, \"label\", void 0);\n__decorate([\n state()\n], KRNavItemEdit.prototype, \"icon\", void 0);\n__decorate([\n state()\n], KRNavItemEdit.prototype, \"url\", void 0);\n__decorate([\n state()\n], KRNavItemEdit.prototype, \"active\", void 0);\nKRNavItemEdit = __decorate([\n customElement('kr-nav-item-edit')\n], KRNavItemEdit);\nexport { KRNavItemEdit };\n//# sourceMappingURL=nav-item-edit.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KRContextMenu, KRDialog } from '@kodaris/krubble-components';\nimport { KRHttp } from '@kodaris/krubble-http';\nimport { KRNavItemEdit } from './scaffold/nav-item-edit.js';\n/**\n * Application shell component with nav drawer and main content area.\n *\n * ## Features\n * - Collapsible navigation drawer with hierarchical items (groups and items)\n * - User profile display in footer with customization menu\n * - Edit mode for customizing navigation (rename, reorder, hide items, add custom items)\n * - Drag and drop reordering in edit mode\n * - Persistence of customizations via preference API (global/organization level)\n *\n * ## Nav Customization\n * Users can customize the navigation by clicking their profile and selecting\n * \"Customize Navigation\". This enters edit mode where users can:\n * - Right-click items to edit label, icon, or visibility\n * - Right-click to add new items above/below existing items\n * - Drag and drop to reorder items or move them between groups\n *\n * Customizations are stored globally and apply to all users.\n *\n * ## Preference Storage\n * Preferences are stored as JSON with the following structure:\n * ```json\n * {\n * \"nav\": {\n * \"itemId\": { \"label\": \"Custom Label\", \"icon\": \"...\", \"active\": true, \"order\": 0 },\n * \"custom-123\": { \"type\": \"item\", \"label\": \"New Item\", \"url\": \"/path\", ... }\n * }\n * }\n * ```\n *\n * The `nav` object is a delta - it only contains overrides for existing items\n * or definitions for custom items (prefixed with \"custom-\").\n *\n * ## API Endpoints Used\n * - GET `/api/system/preference/json/scaffold?global=true` - load preferences\n * - POST `/api/system/preference/json/scaffold?global=true` - create new preference\n * - PUT `/api/system/preference/json/scaffold/{uuid}?global=true` - update existing preference\n *\n * @slot - The main content\n *\n * @property {string} logo - URL for the logo image\n * @property {string} label - Title text to display instead of logo\n * @property {'light'|'dark'} scheme - Color scheme: 'light' (default) or 'dark'\n * @property {KRNavItem[]} nav - Navigation items as JSON array\n * @property {KRUser} user - User profile data\n * @property {boolean} navEnabled - Whether to show the nav drawer (menu toggle remains visible when false)\n * @property {'employee'|'customer'} user-type - User type. Customers skip all `/api/system` calls since that endpoint is employee-only. Defaults to 'employee'.\n *\n *\n * TODO\n * - Don't hardcode breadcrumbs\n * - Look at renderNormalFooter and renderEditFooter and see if that is what we want to do\n */\nlet KRScaffold = class KRScaffold extends LitElement {\n constructor() {\n super();\n /**\n * Default icon for nav items without an icon (shown at top level)\n */\n this.defaultNavItemIcon = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><circle cx=\"12\" cy=\"12\" r=\"10\"/></svg>';\n this.originalFetch = null;\n this.originalXhrOpen = null;\n this.navItemDragPreview = null;\n this.navItemDragStartY = 0;\n this.isNavItemDragging = false;\n this.navItemDragExpandTimeout = null;\n this.navInitialized = false;\n this.logo = '';\n this.label = '';\n /**\n * URL to navigate to when clicking the logo/title. Defaults to '/'.\n */\n this.homeUrl = '/';\n this.scheme = 'light';\n this.nav = [];\n this.navIconsDisplayed = false;\n this.navExpanded = false;\n this.user = null;\n /**\n * Whether to show the subbar with menu toggle\n */\n this.subbar = false;\n /**\n * Whether to hide the navigation drawer.\n * Menu toggle button remains visible and emits menu-click events.\n */\n this.navEnabled = true;\n /**\n * User type. Set to 'customer' to skip all /api/system calls — customers don't have access to that endpoint.\n */\n this.userType = 'employee';\n /**\n * Breadcrumbs to display in the subbar\n */\n this.breadcrumbs = [];\n this.navItemsExpanded = new Set();\n this.navQuery = '';\n this.activeNavItemId = null;\n this.isNavScrolled = false;\n this.isNavOpened = localStorage.getItem('kr-scaffold-nav-opened') !== 'false';\n this.isEditing = false;\n this.isUserMenuOpen = false;\n this.pref = { nav: {} };\n this.draggedNavItemId = null;\n this.navItemDropTargetId = null;\n this.navItemDropPosition = 'above';\n this.pendingRequests = 0;\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseUp = this.handleMouseUp.bind(this);\n }\n connectedCallback() {\n super.connectedCallback();\n this.installFetchInterceptor();\n }\n // Attributes are not reflected into properties until after the first update,\n // so loadPref() must run here (not connectedCallback) for user-type to be set.\n firstUpdated() {\n this.loadPref();\n }\n updated(changedProperties) {\n super.updated(changedProperties);\n if (changedProperties.has('nav') && this.nav.length > 0) {\n this.updateActiveNavItem();\n if (this.navExpanded && !this.navInitialized) {\n this.navInitialized = true;\n this.getComputedNav()\n .filter(item => item.type === 'group')\n .forEach(group => this.navItemsExpanded.add(group.id));\n }\n }\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n this.uninstallFetchInterceptor();\n }\n /**\n * Installs global interceptors for fetch and XMLHttpRequest to track pending HTTP requests.\n * Updates `pendingRequests` state when requests start/complete.\n */\n installFetchInterceptor() {\n if (this.originalFetch) {\n return;\n }\n const scaffold = this;\n // Intercept fetch\n this.originalFetch = window.fetch.bind(window);\n const originalFetch = this.originalFetch; // Capture in local scope to avoid null reference after uninstall\n window.fetch = function (...args) {\n scaffold.pendingRequests++;\n return originalFetch(...args).finally(() => {\n scaffold.pendingRequests--;\n });\n };\n // Intercept XMLHttpRequest\n this.originalXhrOpen = XMLHttpRequest.prototype.open;\n const originalXhrOpen = this.originalXhrOpen; // Capture in local scope to avoid null reference after uninstall\n XMLHttpRequest.prototype.open = function (method, url, async = true, username, password) {\n scaffold.pendingRequests++;\n this.addEventListener('loadend', () => {\n scaffold.pendingRequests--;\n }, { once: true });\n return originalXhrOpen.call(this, method, url, async, username, password);\n };\n }\n /**\n * Restores the original fetch and XMLHttpRequest functions.\n */\n uninstallFetchInterceptor() {\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n if (this.originalXhrOpen) {\n XMLHttpRequest.prototype.open = this.originalXhrOpen;\n this.originalXhrOpen = null;\n }\n }\n /**\n * Resolves a navigation URL by prepending the base href.\n *\n * This method is used for:\n * 1. Setting href attributes on anchor elements (so Cmd/Ctrl+click opens correct URL in new tab)\n * 2. Comparing URLs with window.location.pathname in updateActiveNavItem()\n *\n * The original item.url is kept intact (without base href) and passed to Angular\n * via the nav-item-click event. Angular Router expects paths relative to base,\n * so it handles the base href internally.\n *\n * Example with base href \"/operations/\":\n * - item.url = \"/settings\" (used for Angular routing)\n * - resolveUrl(item) = \"/operations/settings\" (used for href and URL comparison)\n */\n resolveUrl(item) {\n if (!item.url) {\n return '#';\n }\n // External URLs - return as-is\n if (item.external) {\n return item.url;\n }\n // Remove leading slash from url if present, then combine with base\n let path = item.url;\n if (item.url.startsWith('/')) {\n path = item.url.slice(1);\n }\n const baseHref = document.querySelector('base')?.getAttribute('href') || '/';\n if (baseHref.endsWith('/')) {\n return baseHref + path;\n }\n return baseHref + '/' + path;\n }\n // =========================================================================\n // Navigation Data\n // =========================================================================\n /**\n * Returns the computed navigation as a flat array with preferences applied.\n *\n * Transforms the hierarchical `nav` property into a flat list where each item\n * has a `parentId` reference instead of nested `children`. Merges user\n * preference overrides (label, icon, url, active, order, parentId) and\n * includes any custom items added via the edit dialog.\n *\n * @returns Flat array of nav items with preferences applied\n */\n getComputedNav() {\n const result = [];\n this.nav.forEach((item, index) => {\n const override = this.pref.nav[item.id];\n result.push({\n ...item,\n ...override,\n order: override?.order ?? item.order ?? index,\n parentId: override?.parentId ?? null,\n });\n // Add children if group\n if (item.type === 'group' && item.children) {\n item.children.forEach((child, childIndex) => {\n const childOverride = this.pref.nav[child.id];\n let parentId = item.id;\n if (childOverride?.parentId !== undefined) {\n parentId = childOverride.parentId;\n }\n result.push({\n ...child,\n ...childOverride,\n order: childOverride?.order ?? child.order ?? childIndex,\n parentId,\n });\n });\n }\n });\n // Add custom items from pref\n Object.entries(this.pref.nav).forEach(([id, item]) => {\n if (id.startsWith('custom') && item.type && item.label) {\n result.push({\n id,\n type: item.type,\n label: item.label,\n icon: item.icon,\n url: item.url,\n active: item.active,\n order: item.order ?? result.length,\n parentId: item.parentId ?? null,\n });\n }\n });\n return result;\n }\n /**\n * Returns nav items for a given parent, filtered and sorted for rendering.\n *\n * Filters the computed nav to items matching the parentId, sorts by order,\n * hides inactive items in normal mode, and applies the search query filter.\n * Groups are shown if their label matches or if they have matching children.\n *\n * @param parentId - The parent ID to filter by (null for top-level items)\n * @returns Filtered and sorted nav items ready for rendering\n */\n getNavItemChildren(parentId) {\n let items = this.getComputedNav()\n .filter(item => item.parentId === parentId)\n .sort((a, b) => a.order - b.order);\n // In normal mode, filter out hidden items\n if (!this.isEditing) {\n items = items.filter(item => item.active !== false);\n }\n // Apply search filter\n if (this.navQuery) {\n const query = this.navQuery.toLowerCase();\n const allItems = this.getComputedNav();\n // If we're getting children of a group, check if parent group name matches query\n // If so, show all children without filtering\n if (parentId !== null) {\n const parentGroup = allItems.find(item => item.id === parentId);\n if (parentGroup?.label.toLowerCase().includes(query)) {\n return items; // Show all children when group name matches\n }\n }\n items = items.filter(item => {\n if (item.type === 'group') {\n // Show group if its label matches OR if it has matching children\n return item.label.toLowerCase().includes(query) || allItems.some(child => child.parentId === item.id &&\n child.active !== false &&\n child.label.toLowerCase().includes(query));\n }\n // Show item if its label matches\n return item.label.toLowerCase().includes(query);\n });\n }\n return items;\n }\n // =========================================================================\n // Navigation Search\n // =========================================================================\n /**\n * Handles search input changes for filtering nav items.\n *\n * When a search query is entered, automatically expands any groups that\n * contain matching children so users can see the results. When the search\n * is cleared, collapses all groups back to their default state.\n *\n * @param e - The input event from the search field\n */\n handleNavQueryChange(e) {\n this.navQuery = e.target.value;\n // Expand all groups when searching so matching children are visible\n // (groups without matching children won't be rendered anyway)\n if (this.navQuery) {\n this.getComputedNav().forEach(item => {\n if (item.type === 'group') {\n this.navItemsExpanded.add(item.id);\n }\n });\n }\n else {\n // Collapse all when search is cleared\n this.navItemsExpanded.clear();\n }\n }\n /**\n * Clears the search query.\n */\n handleNavQueryClear() {\n this.navQuery = '';\n this.navItemsExpanded.clear();\n }\n // =========================================================================\n // Navigation Interaction\n // =========================================================================\n handleMenuClick() {\n this.isNavOpened = !this.isNavOpened;\n localStorage.setItem('kr-scaffold-nav-opened', String(this.isNavOpened));\n }\n /**\n * Handles click on the nav header (logo/title) to navigate home.\n * Dispatches a nav-item-click event so Angular can intercept and route.\n */\n handleNavHeaderClick() {\n // Clear active state since we're going home\n this.activeNavItemId = null;\n const navEvent = new CustomEvent('nav-item-click', {\n detail: { item: { url: this.homeUrl } },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n this.dispatchEvent(navEvent);\n // If no listener prevented default, navigate natively\n if (!navEvent.defaultPrevented) {\n window.location.href = this.homeUrl;\n }\n }\n /**\n * Handles scroll on nav content to show/hide header shadow.\n */\n handleNavScroll(e) {\n this.isNavScrolled = e.target.scrollTop > 0;\n }\n /**\n * Expand a nav group by id. Public so consumers can keep a group open after\n * adding it dynamically — the scaffold only auto-expands groups once at startup,\n * so a group added later (e.g. an async \"Recent\" list) would otherwise stay\n * collapsed. Idempotent; a no-op if the group is already expanded.\n */\n expandNavGroup(groupId) {\n if (this.navItemsExpanded.has(groupId)) {\n return;\n }\n this.navItemsExpanded.add(groupId);\n this.requestUpdate();\n }\n /**\n * Handles click events on navigation items.\n *\n * For groups, toggles the expanded/collapsed state.\n * For items, dispatches a cancelable `nav-item-click` custom event.\n *\n * If a listener calls `preventDefault()` on the custom event, native browser\n * navigation is prevented. Otherwise, the default `<a href>` navigation\n * proceeds normally.\n *\n * The `@krubble/angular` package provides `KRScaffoldDirective` which\n * automatically listens for this event and handles navigation using\n * Angular's router. Import `KrubbleModule` in your Angular app to enable\n * SPA navigation without page reloads.\n *\n * @param e - The original click event\n * @param item - The nav item that was clicked\n */\n handleNavItemClick(e, item) {\n if (item.type === 'group') {\n // Animate the group's height with the Web Animations API. Collapsing removes\n // `nav-group--expanded` only once the animation finishes; expanding adds it\n // up front so there's a height to animate from.\n const navItem = this.shadowRoot?.querySelector(`.nav-item[data-id=\"${item.id}\"]`);\n const groupEl = navItem?.nextElementSibling;\n if (!groupEl) {\n return;\n }\n if (this.navItemsExpanded.has(item.id)) {\n this.navItemsExpanded.delete(item.id);\n groupEl.animate([\n { height: `${groupEl.scrollHeight}px` },\n { height: '0px' }\n ], {\n duration: 300,\n easing: 'ease-in-out'\n }).onfinish = () => {\n groupEl.classList.remove('nav-group--expanded');\n };\n }\n else {\n this.navItemsExpanded.add(item.id);\n groupEl.classList.add('nav-group--expanded');\n groupEl.animate([\n { height: '0px' },\n { height: `${groupEl.scrollHeight}px` }\n ], {\n duration: 300,\n easing: 'ease-in-out'\n });\n }\n this.requestUpdate();\n }\n else {\n // Allow Ctrl/Cmd+click and middle-click to open in new tab without SPA navigation\n if (e.ctrlKey || e.metaKey || e.button === 1) {\n return;\n }\n // Set active item immediately on click for instant visual feedback\n this.activeNavItemId = item.id;\n const navEvent = new CustomEvent('nav-item-click', {\n detail: { item },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n this.dispatchEvent(navEvent);\n // If a listener called preventDefault(), prevent the native navigation\n // (e.g., SPA router handles navigation)\n if (navEvent.defaultPrevented) {\n e.preventDefault();\n }\n }\n }\n /**\n * Updates the active nav item highlight based on the current URL.\n *\n * Compares the first path segment of `window.location.pathname` with each\n * nav item's URL to find a match. When found, highlights that item and\n * expands its parent group if nested.\n *\n * Called automatically by `KRScaffoldDirective` on Angular route changes.\n */\n updateActiveNavItem() {\n const currentPath = window.location.pathname;\n const allItems = this.getComputedNav().filter(item => item.type === 'item' && item.url);\n // Find the best match - prefer longer/more specific URL matches\n let activeItem = null;\n let longestMatch = 0;\n for (const item of allItems) {\n // Use resolveUrl because currentPath includes base href\n const url = this.resolveUrl(item);\n if (currentPath.startsWith(url) && url.length > longestMatch) {\n activeItem = item;\n longestMatch = url.length;\n }\n }\n if (activeItem) {\n this.activeNavItemId = activeItem.id;\n if (activeItem.parentId) {\n this.navItemsExpanded.add(activeItem.parentId);\n }\n }\n else {\n this.activeNavItemId = null;\n }\n }\n // =========================================================================\n // Navigation Customization\n // =========================================================================\n handleEditCancel() {\n this.isEditing = false;\n // Reload to revert changes\n this.loadPref();\n }\n handlePrefReset() {\n this.pref.nav = {};\n }\n handlePrefSave() {\n if (this.userType === 'customer') {\n return;\n }\n let url = '/api/system/preference/json/scaffold?global=true';\n let method = 'POST';\n if (this.pref.uuid) {\n url = `/api/system/preference/json/scaffold/${this.pref.uuid}?global=true`;\n method = 'PUT';\n }\n KRHttp.fetch({\n url,\n method,\n body: JSON.stringify({ nav: this.pref.nav }),\n })\n .then((response) => response.json())\n .then((data) => {\n this.pref = data.data;\n this.isEditing = false;\n })\n .catch((error) => {\n console.error('Failed to save nav customizations:', error);\n });\n }\n loadPref() {\n if (this.userType === 'customer') {\n return;\n }\n KRHttp.fetch({\n url: '/api/system/preference/json/scaffold?global=true',\n method: 'GET',\n })\n .then((response) => response.json())\n .then((data) => {\n const pref = data?.data?.[0];\n if (pref) {\n this.pref = pref;\n }\n })\n .catch(() => {\n // No preferences saved yet\n });\n }\n handleNavItemContextMenu(e, item) {\n if (!this.isEditing) {\n return;\n }\n e.preventDefault();\n KRContextMenu.open({\n x: e.clientX,\n y: e.clientY,\n items: [\n {\n id: 'edit',\n label: 'Edit Item'\n },\n {\n id: 'divider-1',\n label: '',\n divider: true\n },\n {\n id: 'add-above',\n label: 'Add Item Above'\n },\n {\n id: 'add-below',\n label: 'Add Item Below'\n },\n ],\n }).then((result) => {\n if (!result) {\n return;\n }\n switch (result.id) {\n case 'edit':\n this.openNavItemEdit(item);\n break;\n case 'add-above':\n this.addNavItem(item, 'above');\n break;\n case 'add-below':\n this.addNavItem(item, 'below');\n break;\n }\n });\n }\n /**\n * Opens the nav item edit dialog for customizing an item's properties.\n *\n * Opens `KRNavItemEdit` dialog pre-populated with the item's current values.\n * When the user saves, merges the result into the nav delta to persist\n * customizations like label, icon, URL, and visibility.\n *\n * @param item - The nav item to edit\n */\n openNavItemEdit(item) {\n KRDialog.open(KRNavItemEdit, { data: item }).afterClosed().then((res) => {\n const result = res;\n if (!result) {\n return;\n }\n if (!this.pref.nav[item.id]) {\n this.pref.nav[item.id] = {};\n }\n this.pref.nav[item.id] = {\n ...this.pref.nav[item.id],\n ...result\n };\n this.requestUpdate();\n });\n }\n /**\n * Adds a new custom nav item relative to an existing item.\n *\n * Creates a placeholder item in the nav delta, shifts existing siblings\n * to make room, then opens the edit dialog so the user can configure\n * the new item's label, icon, and URL.\n *\n * @param targetItem - The existing item to position relative to\n * @param position - Whether to insert 'above' or 'below' the target item\n */\n addNavItem(targetItem, position) {\n const customId = `custom-${Date.now()}`;\n const siblings = this.getComputedNav()\n .filter(i => i.parentId === targetItem.parentId)\n .sort((a, b) => a.order - b.order);\n const targetIndex = siblings.findIndex(i => i.id === targetItem.id);\n let newOrder;\n if (position === 'above') {\n newOrder = targetIndex;\n }\n else {\n newOrder = targetIndex + 1;\n }\n // Shift existing items to make room for the new item\n siblings.forEach((sibling, index) => {\n if (index >= newOrder) {\n if (!this.pref.nav[sibling.id]) {\n this.pref.nav[sibling.id] = {};\n }\n this.pref.nav[sibling.id].order = index + 1;\n }\n });\n // Add the new item and open edit dialog\n const newItem = {\n id: customId,\n type: 'item',\n label: 'New Item',\n order: newOrder,\n parentId: targetItem.parentId,\n active: true,\n };\n this.pref.nav[customId] = newItem;\n this.requestUpdate();\n this.openNavItemEdit(newItem);\n }\n // =========================================================================\n // Navigation Drag & Drop\n // =========================================================================\n /**\n * Initiates a potential drag operation when mouse is pressed on a nav item.\n *\n * Only active in edit mode. Records the starting position and sets up\n * document-level listeners for mouse move and mouse up events. The actual\n * drag doesn't start until the mouse moves more than 5 pixels.\n *\n * @param e - The mouse event\n * @param item - The nav item being pressed\n */\n handleNavItemMouseDown(e, item) {\n if (!this.isEditing) {\n return;\n }\n e.preventDefault();\n this.draggedNavItemId = item.id;\n this.navItemDragStartY = e.clientY;\n this.isNavItemDragging = false;\n document.addEventListener('mousemove', this.boundHandleMouseMove);\n document.addEventListener('mouseup', this.boundHandleMouseUp);\n }\n /**\n * Handles mouse movement during a nav item drag operation.\n *\n * Initiates dragging after the mouse moves more than 5 pixels (to distinguish\n * from clicks), creates a floating preview element that follows the cursor,\n * and updates the drop target indicator based on mouse position.\n *\n * @param e - The mouse event\n */\n handleMouseMove(e) {\n if (!this.draggedNavItemId) {\n return;\n }\n // Start dragging after moving a few pixels (to distinguish from clicks)\n if (!this.isNavItemDragging && Math.abs(e.clientY - this.navItemDragStartY) > 5) {\n this.isNavItemDragging = true;\n this.classList.add('kr-scaffold--dragging');\n // Create drag preview\n const draggedItem = this.getComputedNav().find(i => i.id === this.draggedNavItemId);\n if (draggedItem) {\n this.navItemDragPreview = document.createElement('div');\n this.navItemDragPreview.className = 'nav-item-drag-preview';\n this.navItemDragPreview.textContent = draggedItem.label;\n this.navItemDragPreview.style.left = `${e.clientX + 10}px`;\n this.navItemDragPreview.style.top = `${e.clientY - 20}px`;\n this.shadowRoot?.appendChild(this.navItemDragPreview);\n }\n }\n if (!this.isNavItemDragging) {\n return;\n }\n // Update preview position\n if (this.navItemDragPreview) {\n this.navItemDragPreview.style.left = `${e.clientX + 10}px`;\n this.navItemDragPreview.style.top = `${e.clientY - 20}px`;\n }\n // Find drop target based on mouse position\n this.updateNavItemDropTarget(e);\n }\n /**\n * Handles the end of a nav item drag operation.\n *\n * Removes document-level mouse listeners, executes the drop if there's a valid\n * target, and cleans up all drag-related state.\n */\n handleMouseUp() {\n document.removeEventListener('mousemove', this.boundHandleMouseMove);\n document.removeEventListener('mouseup', this.boundHandleMouseUp);\n if (this.isNavItemDragging && this.navItemDropTargetId) {\n this.executeNavItemDrop();\n }\n // Reset all drag state\n this.draggedNavItemId = null;\n this.navItemDropTargetId = null;\n this.isNavItemDragging = false;\n this.classList.remove('kr-scaffold--dragging');\n if (this.navItemDragPreview) {\n this.navItemDragPreview.remove();\n this.navItemDragPreview = null;\n }\n this.clearNavItemDragExpandTimeout();\n this.requestUpdate();\n }\n /**\n * Determines where a dragged nav item would be dropped based on mouse position.\n *\n * Loops through all nav items and checks if the mouse is hovering over one.\n * For groups, the item is divided into thirds (above/center/below) where\n * \"center\" means drop into the group. For regular items, it's halves (above/below).\n *\n * Also handles auto-expanding collapsed groups when hovering over their center,\n * and validates drops (e.g., prevents dropping a group into another group).\n *\n * Updates `navItemDropTargetId` and `navItemDropPosition` state which are used to render\n * visual drop indicators in the UI.\n *\n * @param e - The mouse event from dragging\n */\n updateNavItemDropTarget(e) {\n // Get all nav items in shadow DOM\n const navItems = this.shadowRoot?.querySelectorAll('.nav-item[data-id]');\n if (!navItems) {\n return;\n }\n let foundTarget = false;\n navItems.forEach((el) => {\n const rect = el.getBoundingClientRect();\n const itemId = el.getAttribute('data-id');\n if (!itemId || itemId === this.draggedNavItemId) {\n return;\n }\n // Skip if mouse is outside this element\n if (e.clientX < rect.left || e.clientX > rect.right ||\n e.clientY < rect.top || e.clientY > rect.bottom) {\n return;\n }\n const item = this.getComputedNav().find(i => i.id === itemId);\n if (!item) {\n return;\n }\n const y = e.clientY - rect.top;\n let position;\n // Determine drop position based on mouse Y position within the item.\n // Groups are divided into thirds: top=above, middle=center (drop into), bottom=below.\n // Regular items are divided in half: top=above, bottom=below.\n if (item.type === 'group') {\n if (y < rect.height / 3) {\n // Top third - drop above the group\n position = 'above';\n this.clearNavItemDragExpandTimeout();\n }\n else if (y > (rect.height * 2) / 3) {\n // Bottom third - drop below the group\n position = 'below';\n this.clearNavItemDragExpandTimeout();\n }\n else {\n // Middle third - drop into the group (as a child)\n position = 'center';\n // Auto-expand collapsed groups after a delay. The 500ms wait keeps groups\n // from expanding too eagerly when the user is just passing over them, and\n // the check inside confirms they're still on this group's center.\n if (!this.navItemsExpanded.has(item.id) && !this.navItemDragExpandTimeout) {\n this.navItemDragExpandTimeout = window.setTimeout(() => {\n if (this.navItemDropTargetId === item.id && this.navItemDropPosition === 'center') {\n this.navItemsExpanded.add(item.id);\n this.requestUpdate();\n }\n this.navItemDragExpandTimeout = null;\n }, 500);\n }\n }\n }\n else {\n // Regular items only support above/below, not center\n if (y < rect.height / 2) {\n position = 'above';\n }\n else {\n position = 'below';\n }\n this.clearNavItemDragExpandTimeout();\n }\n // Determine what the new parent would be\n let newParentId;\n if (position === 'center') {\n newParentId = item.id;\n }\n else {\n newParentId = item.parentId;\n }\n const draggedItem = this.getComputedNav().find(i => i.id === this.draggedNavItemId);\n // Don't show drop indicator if invalid drop:\n // 1. Can't drop an item into itself (newParentId === draggedNavItemId)\n // 2. Groups can only exist at the top level, so prevent dropping a group into another group (newParentId !== null means it would be nested)\n if (newParentId === this.draggedNavItemId || (draggedItem?.type === 'group' && newParentId !== null)) {\n this.navItemDropTargetId = null;\n this.clearNavItemDragExpandTimeout();\n return;\n }\n // Valid drop target found - store the target item and position (above/below/center)\n // so the UI can render the drop indicator in the correct location\n this.navItemDropTargetId = item.id;\n this.navItemDropPosition = position;\n foundTarget = true;\n });\n // Mouse is not over any valid nav item - clear the drop indicator\n // (e.g., user dragged outside the nav area or over empty space)\n if (!foundTarget) {\n this.navItemDropTargetId = null;\n this.clearNavItemDragExpandTimeout();\n }\n this.requestUpdate();\n }\n /**\n * Cancels the pending auto-expand timeout for nav groups during drag.\n * Called when the user moves away from a group's center or stops dragging.\n */\n clearNavItemDragExpandTimeout() {\n if (this.navItemDragExpandTimeout) {\n clearTimeout(this.navItemDragExpandTimeout);\n this.navItemDragExpandTimeout = null;\n }\n }\n /**\n * Executes the drop operation after a nav item drag completes.\n *\n * Calculates the new position and parent for the dragged item based on\n * the drop target and position (above/below/center). Updates the navDelta\n * with new order values for the dragged item and shifts siblings as needed.\n */\n executeNavItemDrop() {\n if (!this.draggedNavItemId || !this.navItemDropTargetId) {\n return;\n }\n const allItems = this.getComputedNav();\n const draggedItem = allItems.find(i => i.id === this.draggedNavItemId);\n const targetItem = allItems.find(i => i.id === this.navItemDropTargetId);\n if (!draggedItem || !targetItem) {\n return;\n }\n // Determine the new parentId for the dragged item\n let newParentId;\n if (this.navItemDropPosition === 'center' && targetItem.type === 'group') {\n if (targetItem.id === this.draggedNavItemId) {\n return;\n }\n newParentId = targetItem.id;\n }\n else {\n newParentId = targetItem.parentId;\n }\n if (newParentId === this.draggedNavItemId) {\n return;\n }\n // Get siblings in the destination parent\n const siblings = allItems\n .filter(i => i.parentId === newParentId && i.id !== this.draggedNavItemId)\n .sort((a, b) => a.order - b.order);\n const navDelta = this.pref.nav;\n // Calculate the new order\n let newOrder;\n if (this.navItemDropPosition === 'center') {\n // Dropping into a group - place at the end of its children\n if (siblings.length > 0) {\n newOrder = Math.max(...siblings.map(s => s.order)) + 1;\n }\n else {\n newOrder = 0;\n }\n }\n else {\n // Find where the target item is in the sorted siblings list\n const targetIndex = siblings.findIndex(i => i.id === targetItem.id);\n // Determine insert position based on drop position (above/below target)\n if (targetIndex === -1) {\n newOrder = 0;\n }\n else if (this.navItemDropPosition === 'above') {\n newOrder = targetIndex;\n }\n else {\n newOrder = targetIndex + 1;\n }\n // Shift existing siblings to make room for the dropped item.\n // Items at or after the insert position get their order bumped up by 1.\n siblings.forEach((sibling, index) => {\n if (!navDelta[sibling.id]) {\n navDelta[sibling.id] = {};\n }\n if (index >= newOrder) {\n navDelta[sibling.id].order = index + 1;\n }\n else {\n navDelta[sibling.id].order = index;\n }\n });\n }\n // Update the dragged item's position and parent in the delta\n if (!navDelta[this.draggedNavItemId]) {\n navDelta[this.draggedNavItemId] = {};\n }\n navDelta[this.draggedNavItemId].order = newOrder;\n navDelta[this.draggedNavItemId].parentId = newParentId;\n // Persist changes and trigger re-render\n this.pref.nav = navDelta;\n this.requestUpdate();\n }\n // =========================================================================\n // User Menu\n // =========================================================================\n handleUserMenuToggle() {\n this.isUserMenuOpen = !this.isUserMenuOpen;\n }\n handleCustomize() {\n this.isUserMenuOpen = false;\n this.isEditing = true;\n }\n // =========================================================================\n // Rendering\n // =========================================================================\n renderNormalFooter() {\n if (!this.user) {\n return nothing;\n }\n const initials = this.user.name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n // todo - use a reusable menu component\n return html `\n <div class=\"user-menu-container\">\n ${this.isUserMenuOpen ? html `\n <div class=\"user-menu\">\n <button class=\"user-menu__item\" @click=${this.handleCustomize}>\n Customize Navigation\n </button>\n </div>\n ` : nothing}\n <div class=\"user\" @click=${this.handleUserMenuToggle}>\n <div class=\"user__avatar\">\n ${this.user.avatar\n ? html `<img src=${this.user.avatar} alt=${this.user.name} />`\n : initials}\n </div>\n <div class=\"user__info\">\n <div class=\"user__name\">${this.user.name}</div>\n ${this.user.email ? html `<div class=\"user__email\">${this.user.email}</div>` : nothing}\n </div>\n </div>\n </div>\n `;\n }\n // todo - review\n renderEditFooter() {\n return html `\n <div class=\"edit-actions\">\n <button class=\"edit-actions__btn edit-actions__btn--primary\" @click=${this.handlePrefSave}>\n Save\n </button>\n <div class=\"edit-actions__secondary\">\n <button class=\"edit-actions__btn\" @click=${this.handlePrefReset}>\n Reset\n </button>\n <button class=\"edit-actions__btn\" @click=${this.handleEditCancel}>\n Cancel\n </button>\n </div>\n </div>\n `;\n }\n /**\n * Renders a navigation item as either a group or a link.\n *\n * Groups render as expandable `<button>` elements with a chevron indicator and\n * nested children. Items render as `<a>` anchor links with href navigation.\n *\n * Both types support drag-and-drop reordering in edit mode, context menus for\n * customization, and visual indicators for active/hidden/drop-target states.\n *\n * Icons use SVG strings and fall back to `defaultNavItemIcon` when not provided.\n * Icons are only rendered for top-level items, not for children nested within groups.\n *\n * @param item - The flat nav item data to render\n * @param isChild - Whether this item is nested within a group (affects icon rendering)\n * @returns Lit HTML template for the nav item\n */\n renderNavItem(item, isChild = false) {\n if (item.type === 'section') {\n return html `\n <div class=\"nav-section\">${item.label}</div>\n `;\n }\n if (item.type === 'group') {\n const children = this.getNavItemChildren(item.id);\n return html `\n <button\n class=${classMap({\n 'nav-item': true,\n 'nav-item--expanded': this.navItemsExpanded.has(item.id),\n 'nav-item--hidden': this.isEditing && item.active === false,\n 'nav-item--drop-above': this.navItemDropTargetId === item.id && this.navItemDropPosition === 'above',\n 'nav-item--drop-below': this.navItemDropTargetId === item.id && this.navItemDropPosition === 'below',\n 'nav-item--drop-center': this.navItemDropTargetId === item.id && this.navItemDropPosition === 'center',\n })}\n data-id=\"${item.id}\"\n @mousedown=${(e) => this.handleNavItemMouseDown(e, item)}\n @click=${(e) => this.handleNavItemClick(e, item)}\n @contextmenu=${(e) => this.handleNavItemContextMenu(e, item)}\n >\n ${this.navIconsDisplayed ? html `<span class=\"nav-item__icon\">${unsafeHTML(item.icon || this.defaultNavItemIcon)}</span>` : nothing}\n <span class=\"nav-item__label\">${item.label}</span>\n <svg\n class=\"nav-item__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path\n d=\"M6 9l6 6 6-6\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n <div class=${classMap({\n 'nav-group': true,\n 'nav-group--expanded': this.navItemsExpanded.has(item.id),\n })}>\n ${children.map((child) => this.renderNavItem(child, true))}\n </div>\n `;\n }\n return html `\n <a\n class=${classMap({\n 'nav-item': true,\n 'nav-item--active': this.activeNavItemId === item.id,\n 'nav-item--hidden': this.isEditing && item.active === false,\n 'nav-item--drop-above': this.navItemDropTargetId === item.id && this.navItemDropPosition === 'above',\n 'nav-item--drop-below': this.navItemDropTargetId === item.id && this.navItemDropPosition === 'below',\n })}\n data-id=\"${item.id}\"\n href=${this.resolveUrl(item)}\n target=${item.external ? '_blank' : nothing}\n @mousedown=${(e) => this.handleNavItemMouseDown(e, item)}\n @click=${(e) => this.handleNavItemClick(e, item)}\n @contextmenu=${(e) => this.handleNavItemContextMenu(e, item)}\n >\n ${this.navIconsDisplayed && !isChild ? html `<span class=\"nav-item__icon\">${unsafeHTML(item.icon || this.defaultNavItemIcon)}</span>` : nothing}\n <span class=\"nav-item__label\">${item.label}</span>\n </a>\n `;\n }\n // todo - don't hardcode breadcrumbs\n render() {\n const topLevelItems = this.getNavItemChildren(null);\n // Use unfiltered count to determine if search should show (so it doesn't disappear while typing)\n const totalTopLevelItems = this.getComputedNav().filter(item => item.parentId === null).length;\n return html `\n <div class=${classMap({\n 'progress': true,\n 'progress--loading': this.pendingRequests > 0,\n })}>\n <div class=\"progress__track\"></div>\n <div class=\"progress__bar progress__bar--primary\">\n <span class=\"progress__bar-inner\"></span>\n </div>\n <div class=\"progress__bar progress__bar--secondary\">\n <span class=\"progress__bar-inner\"></span>\n </div>\n </div>\n \n ${this.subbar ? html `\n <kr-subbar\n menu\n .breadcrumbs=${this.breadcrumbs}\n @menu-click=${this.handleMenuClick}\n >\n <slot name=\"subbar\"></slot>\n </kr-subbar>\n ` : nothing}\n\n <div class=\"wrapper\">\n ${this.navEnabled ? html `\n <nav class=${classMap({\n 'nav': true,\n 'nav--scrolled': this.isNavScrolled,\n 'nav--opened': !this.subbar || this.isNavOpened,\n })}>\n <div class=\"nav-header\" @click=${this.handleNavHeaderClick}>\n ${this.label\n ? html `<span class=\"nav-title\">${this.label}</span>`\n : this.logo\n ? html `<img\n class=\"nav-logo\"\n src=${this.logo}\n alt=\"Logo\"\n />`\n : nothing}\n </div>\n <div class=\"nav-content\" @scroll=${this.handleNavScroll}>\n ${totalTopLevelItems > 20 ? html `\n <div class=\"nav-search\">\n <div class=\"nav-search__wrapper\">\n <span class=\"nav-search__icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\n </svg>\n </span>\n <input\n class=\"nav-search__input\"\n type=\"text\"\n placeholder=\"Search...\"\n .value=${this.navQuery}\n @input=${this.handleNavQueryChange}\n />\n ${this.navQuery ? html `\n <button class=\"nav-search__clear\" @click=${this.handleNavQueryClear}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\n </svg>\n </button>\n ` : nothing}\n </div>\n </div>\n ` : nothing}\n <div class=\"nav-items\">\n ${topLevelItems.map((item) => this.renderNavItem(item))}\n </div>\n </div>\n <!-- <div class=\"nav-footer\">\n ${this.isEditing ? this.renderEditFooter() : this.renderNormalFooter()}\n </div> -->\n </nav>\n ` : nothing}\n\n <main class=\"main\">\n <slot></slot>\n </main>\n </div>\n \n `;\n }\n};\nKRScaffold.styles = css `\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n font-size: 14px;\n --kr-scaffold-nav-width: 250px;\n\n /* Default to light scheme */\n --kr-scaffold-nav-bg: #F3F7FC;\n --kr-scaffold-nav-text: #000000;\n --kr-scaffold-nav-text-active: #000000;\n --kr-scaffold-nav-hover: #f3f4f6;\n --kr-scaffold-nav-active-bg: #e5e7eb;\n --kr-scaffold-nav-border: rgb(229, 229, 228);\n --kr-scaffold-nav-divider: #e5e7eb;\n --kr-scaffold-nav-search-bg: #ffffff;\n --kr-scaffold-nav-search-border: #d1d5db;\n }\n\n /* Dark scheme */\n :host([scheme=\"dark\"]) {\n --kr-scaffold-nav-bg: #10172a;\n --kr-scaffold-nav-text: rgb(255 255 255 / 80%);\n --kr-scaffold-nav-text-active: #ffffff;\n --kr-scaffold-nav-hover: rgba(255, 255, 255, 0.05);\n --kr-scaffold-nav-active-bg: rgb(255 255 255 / 12%);\n --kr-scaffold-nav-border: transparent;\n --kr-scaffold-nav-divider: rgba(255, 255, 255, 0.06);\n --kr-scaffold-nav-search-bg: rgba(255, 255, 255, 0.15);\n --kr-scaffold-nav-search-border: rgba(255, 255, 255, 0.3);\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n /* Nav */\n .nav {\n width: var(--kr-scaffold-nav-width);\n background: var(--kr-scaffold-nav-bg);\n color: var(--kr-scaffold-nav-text);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-right: 1px solid var(--kr-scaffold-nav-border);\n transition: margin-left 0.3s ease;\n margin-left: calc(-1 * var(--kr-scaffold-nav-width));\n flex: 1;\n max-width: var(--kr-scaffold-nav-width);\n }\n\n .nav--opened {\n margin-left: 0;\n }\n\n .wrapper {\n display: flex;\n flex: 1;\n min-height: 0;\n max-height: 100%;\n height: 100%;\n }\n\n .nav-header {\n padding: 20px;\n display: flex;\n align-items: center;\n position: relative;\n z-index: 1;\n transition: box-shadow 0.2s ease;\n cursor: pointer;\n }\n\n .nav--scrolled .nav-header {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n }\n\n .nav-logo {\n max-width: 100%;\n height: 32px;\n }\n\n .nav-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--kr-scaffold-nav-text-active);\n letter-spacing: .2px;\n }\n\n .nav-search {\n padding: 4px 0 8px;\n }\n\n .nav-search__wrapper {\n display: flex;\n align-items: center;\n background: var(--kr-scaffold-nav-search-bg);\n border-radius: 8px;\n padding: 0 12px;\n height: 40px;\n gap: 8px;\n border: 1px solid var(--kr-scaffold-nav-search-border);\n transition: all 0.15s ease;\n }\n\n .nav-search__icon {\n width: 18px;\n height: 18px;\n flex-shrink: 0;\n opacity: 0.6;\n }\n\n .nav-search__icon svg {\n width: 100%;\n height: 100%;\n fill: currentColor;\n }\n\n .nav-search__input {\n flex: 1;\n background: none;\n border: none;\n outline: none;\n color: var(--kr-scaffold-nav-text-active);\n font-size: 13px;\n font-family: inherit;\n min-width: 0;\n }\n\n .nav-search__input::placeholder {\n color: var(--kr-scaffold-nav-text);\n opacity: 0.7;\n }\n\n .nav-search__clear {\n width: 18px;\n height: 18px;\n padding: 0;\n background: none;\n border: none;\n color: var(--kr-scaffold-nav-text);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0.6;\n transition: opacity 0.15s ease;\n }\n\n .nav-search__clear:hover {\n opacity: 1;\n }\n\n .nav-search__clear svg {\n width: 100%;\n height: 100%;\n fill: currentColor;\n }\n\n .nav-content {\n flex: 1;\n overflow-y: auto;\n padding: 0 9px 12px 8px;\n }\n\n .nav-footer {\n padding: 12px;\n border-top: 1px solid var(--kr-scaffold-nav-divider);\n }\n\n .user {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .user:hover {\n background: var(--kr-scaffold-nav-hover);\n }\n\n .user__avatar {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: var(--kr-scaffold-avatar-bg, #beea4e);\n color: var(--kr-scaffold-avatar-text, #10172a);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n font-weight: 600;\n flex-shrink: 0;\n overflow: hidden;\n }\n\n .user__avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .user__info {\n flex: 1;\n min-width: 0;\n }\n\n .user__name {\n font-size: 13px;\n font-weight: 500;\n color: var(--kr-scaffold-nav-text-active);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .user__email {\n font-size: 12px;\n color: var(--kr-scaffold-nav-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .user-menu-container {\n position: relative;\n }\n\n .user-menu {\n position: absolute;\n bottom: 100%;\n left: 0;\n right: 0;\n margin-bottom: 8px;\n background: var(--kr-scaffold-nav-bg);\n border: 1px solid var(--kr-scaffold-nav-divider);\n border-radius: 8px;\n padding: 4px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);\n }\n\n .user-menu__item {\n display: block;\n width: 100%;\n padding: 10px 12px;\n background: none;\n border: none;\n color: var(--kr-scaffold-nav-text);\n font-size: 13px;\n font-family: inherit;\n text-align: left;\n cursor: pointer;\n border-radius: 6px;\n transition: background 0.15s ease;\n }\n\n .user-menu__item:hover {\n background: var(--kr-scaffold-nav-hover);\n color: var(--kr-scaffold-nav-text-active);\n }\n\n .user-menu__divider {\n height: 1px;\n background: var(--kr-scaffold-nav-divider);\n margin: 4px 0;\n }\n\n /* Main */\n .main {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n background: transparent;\n display: flex;\n flex-direction: column;\n }\n\n .breadcrumbs {\n height: 32px;\n padding: 0 16px;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #6b7280;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n\n .breadcrumbs a {\n color: #6b7280;\n text-decoration: none;\n }\n\n .breadcrumbs a:hover {\n color: #111827;\n text-decoration: underline;\n }\n\n .breadcrumbs__separator {\n color: #d1d5db;\n }\n\n .breadcrumbs__current {\n color: #111827;\n font-weight: 500;\n }\n\n .main__content {\n flex: 1;\n overflow-y: auto;\n }\n\n /* Nav Items */\n .nav-items {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .nav-item {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 0 12px;\n height: 32px;\n border-radius: 8px;\n color: var(--kr-scaffold-nav-text);\n text-decoration: none;\n cursor: pointer;\n border: none;\n background: none;\n width: 100%;\n text-align: left;\n font-size: 13px;\n font-weight: 400;\n font-family: inherit;\n transition: all 0.15s ease;\n }\n\n .nav-item:hover {\n background: #F3F7FC;\n color: var(--kr-scaffold-nav-text-active);\n }\n\n .nav-item--active,\n .nav-item--active:hover {\n background: #e1e9f6;\n color: #1a2332;\n font-weight: 700;\n }\n\n .nav-item__icon {\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .nav-item__icon svg {\n width: 16px;\n height: 16px;\n fill: currentColor;\n }\n\n .nav-item__label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n letter-spacing: 0.14px;\n }\n\n .nav-item__chevron {\n width: 16px;\n height: 16px;\n transition: transform 0.2s ease;\n transform: rotate(-90deg);\n stroke: currentColor;\n }\n\n .nav-item--expanded .nav-item__chevron {\n transform: rotate(0deg);\n }\n\n .nav-group {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n height: 0;\n }\n\n .nav-group--expanded {\n height: auto;\n }\n\n .nav-group .nav-item {\n padding: 0 12px 0 44px;\n height: 32px;\n font-size: 13px;\n font-weight: 400;\n margin-top: 2px;\n flex-shrink: 0;\n }\n\n .nav-group .nav-item--active,\n .nav-group .nav-item--active:hover {\n font-weight: 700;\n }\n\n .nav-group .nav-item:first-child {\n margin-top: 0;\n }\n\n /* Nav items in groups when icons are hidden */\n :host(:not([nav-icons-displayed])) .nav-group .nav-item {\n padding-left: 24px;\n }\n\n /* Sections */\n .nav-section {\n padding: 16px 12px 8px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.55px;\n color: var(--kr-scaffold-nav-text);\n opacity: 0.6;\n }\n\n .nav-section:first-child {\n padding-top: 0;\n }\n\n /* Edit mode actions */\n .edit-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .edit-actions__btn {\n display: block;\n width: 100%;\n padding: 10px 12px;\n background: var(--kr-scaffold-nav-hover);\n border: none;\n color: var(--kr-scaffold-nav-text);\n font-size: 13px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n border-radius: 6px;\n transition: background 0.15s ease;\n }\n\n .edit-actions__btn:hover {\n background: var(--kr-scaffold-nav-active-bg);\n color: var(--kr-scaffold-nav-text-active);\n }\n\n .edit-actions__btn--primary {\n background: #beea4e;\n color: #10172a;\n }\n\n .edit-actions__btn--primary:hover {\n background: #d4f472;\n color: #10172a;\n }\n\n .edit-actions__secondary {\n display: flex;\n gap: 8px;\n }\n\n .edit-actions__secondary .edit-actions__btn {\n flex: 1;\n }\n\n /* Hidden/inactive items in edit mode */\n .nav-item--hidden {\n opacity: 0.4;\n font-style: italic;\n }\n\n .nav-item--hidden:hover {\n opacity: 0.6;\n }\n\n /* Dragging state */\n :host(.kr-scaffold--dragging),\n :host(.kr-scaffold--dragging) * {\n cursor: grabbing;\n user-select: none;\n }\n\n .nav-item-drag-preview {\n position: fixed;\n pointer-events: none;\n z-index: 1000;\n opacity: 0.9;\n background: var(--kr-scaffold-nav-bg);\n border: 1px solid var(--kr-scaffold-nav-divider);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);\n padding: 0 12px;\n height: 40px;\n min-width: 200px;\n display: flex;\n align-items: center;\n gap: 16px;\n color: var(--kr-scaffold-nav-text-active);\n font-size: 13px;\n font-weight: 500;\n }\n\n /* Drop indicator */\n .nav-item--drop-above,\n .nav-item--drop-below,\n .nav-item--drop-center {\n position: relative;\n }\n\n .nav-item--drop-above::before,\n .nav-item--drop-below::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n height: 2px;\n background: #beea4e;\n }\n\n .nav-item--drop-above::before {\n top: 0;\n }\n\n .nav-item--drop-below::after {\n bottom: 0;\n }\n\n .nav-item--drop-center {\n background: var(--kr-scaffold-nav-active-bg);\n }\n\n .breadcrumbs {\n height: 32px;\n padding: 0 16px;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #6b7280;\n //background: #f9fafb;\n background: #beea4e;\n border-top: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n\n .breadcrumbs a {\n //color: #6b7280;\n color: #10172a;\n font-size: 13px;\n font-weight: 600;\n text-decoration: none;\n }\n\n .breadcrumbs a:hover {\n color: #111827;\n text-decoration: underline;\n }\n\n .breadcrumbs__separator {\n color: #d1d5db;\n }\n\n .breadcrumbs__current {\n color: #111827;\n font-weight: 500;\n }\n\n /* Progress bar */\n .progress {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n overflow-x: hidden;\n z-index: 1000;\n display: none;\n }\n\n .progress--loading {\n display: block;\n }\n\n .progress__track {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 100%;\n background: rgba(190, 234, 78, 0.3);\n }\n\n .progress__bar {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 100%;\n transform-origin: left center;\n }\n\n .progress__bar-inner {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n background: #beea4e;\n }\n\n .progress__bar--primary {\n left: -145.166611%;\n }\n\n .progress--loading .progress__bar--primary {\n animation: progress-primary-translate 2s infinite linear;\n }\n\n .progress--loading .progress__bar--primary .progress__bar-inner {\n animation: progress-primary-scale 2s infinite linear;\n }\n\n .progress__bar--secondary {\n left: -54.888891%;\n }\n\n .progress--loading .progress__bar--secondary {\n animation: progress-secondary-translate 2s infinite linear;\n }\n\n .progress--loading .progress__bar--secondary .progress__bar-inner {\n animation: progress-secondary-scale 2s infinite linear;\n }\n\n @keyframes progress-primary-translate {\n 0% {\n transform: translateX(0);\n }\n 20% {\n animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819);\n transform: translateX(0);\n }\n 59.15% {\n animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);\n transform: translateX(83.67142%);\n }\n 100% {\n transform: translateX(200.611057%);\n }\n }\n\n @keyframes progress-primary-scale {\n 0% {\n transform: scaleX(0.08);\n }\n 36.65% {\n animation-timing-function: cubic-bezier(0.334731, 0.12482, 0.785844, 1);\n transform: scaleX(0.08);\n }\n 69.15% {\n animation-timing-function: cubic-bezier(0.06, 0.11, 0.6, 1);\n transform: scaleX(0.661479);\n }\n 100% {\n transform: scaleX(0.08);\n }\n }\n\n @keyframes progress-secondary-translate {\n 0% {\n animation-timing-function: cubic-bezier(0.15, 0, 0.515058, 0.409685);\n transform: translateX(0);\n }\n 25% {\n animation-timing-function: cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);\n transform: translateX(37.651913%);\n }\n 48.35% {\n animation-timing-function: cubic-bezier(0.4, 0.627035, 0.6, 0.902026);\n transform: translateX(84.386165%);\n }\n 100% {\n transform: translateX(160.277782%);\n }\n }\n\n @keyframes progress-secondary-scale {\n 0% {\n animation-timing-function: cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);\n transform: scaleX(0.08);\n }\n 19.15% {\n animation-timing-function: cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);\n transform: scaleX(0.457104);\n }\n 44.15% {\n animation-timing-function: cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);\n transform: scaleX(0.72796);\n }\n 100% {\n transform: scaleX(0.08);\n }\n }\n `;\n__decorate([\n property({ type: String })\n], KRScaffold.prototype, \"logo\", void 0);\n__decorate([\n property({ type: String })\n], KRScaffold.prototype, \"label\", void 0);\n__decorate([\n property({\n type: String,\n attribute: 'home-url'\n })\n], KRScaffold.prototype, \"homeUrl\", void 0);\n__decorate([\n property({\n type: String,\n reflect: true\n })\n], KRScaffold.prototype, \"scheme\", void 0);\n__decorate([\n property({ type: Array })\n], KRScaffold.prototype, \"nav\", void 0);\n__decorate([\n property({\n type: Boolean,\n attribute: 'nav-icons-displayed',\n reflect: true\n })\n], KRScaffold.prototype, \"navIconsDisplayed\", void 0);\n__decorate([\n property({\n type: Boolean,\n attribute: 'nav-expanded'\n })\n], KRScaffold.prototype, \"navExpanded\", void 0);\n__decorate([\n property({ type: Object })\n], KRScaffold.prototype, \"user\", void 0);\n__decorate([\n property({ type: Boolean })\n], KRScaffold.prototype, \"subbar\", void 0);\n__decorate([\n property({\n type: Boolean,\n attribute: 'nav-enabled'\n })\n], KRScaffold.prototype, \"navEnabled\", void 0);\n__decorate([\n property({\n type: String,\n attribute: 'user-type'\n })\n], KRScaffold.prototype, \"userType\", void 0);\n__decorate([\n property({ type: Array })\n], KRScaffold.prototype, \"breadcrumbs\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"navItemsExpanded\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"navQuery\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"activeNavItemId\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"isNavScrolled\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"isNavOpened\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"isEditing\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"isUserMenuOpen\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"pref\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"draggedNavItemId\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"navItemDropTargetId\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"navItemDropPosition\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"pendingRequests\", void 0);\nKRScaffold = __decorate([\n customElement('kr-scaffold')\n], KRScaffold);\nexport { KRScaffold };\n//# sourceMappingURL=scaffold.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\n/**\n * Secondary navigation component for screens within the scaffold.\n * Provides a simple nav drawer for sub-navigation within a page/screen.\n * Typically used when viewing details of a specific entity (e.g., Company, Contact).\n *\n * ## Usage\n * ```html\n * <kr-screen-nav\n * label=\"Acme Corporation\"\n * subLabel=\"Company\"\n * .items=${[\n * { id: 'overview', label: 'Overview', url: '/companies/123/overview' },\n * { id: 'contacts', label: 'Contacts', url: '/companies/123/contacts' },\n * { id: 'activity', label: 'Activity', url: '/companies/123/activity' },\n * ]}\n * activeId=\"overview\"\n * >\n * <div>Screen content here</div>\n * </kr-screen-nav>\n * ```\n *\n * @slot - The main screen content\n *\n * @property {string} label - Main label (e.g., entity name like \"Acme Corporation\")\n * @property {string} subLabel - Sub label (e.g., entity type like \"Company\")\n * @property {KRScreenNavItem[]} items - Navigation items as JSON array\n * @property {string} activeId - Currently active item ID\n */\nlet KRScreenNav = class KRScreenNav extends LitElement {\n constructor() {\n super(...arguments);\n /**\n * Main label (e.g., entity name like \"Acme Corporation\")\n */\n this.label = '';\n /**\n * Sub label (e.g., entity type like \"Company\")\n */\n this.subLabel = '';\n /**\n * Navigation items\n */\n this.items = [];\n /**\n * Currently active item ID. Auto-detected from the URL by default.\n * Can be set explicitly by the parent to override.\n */\n this.activeId = '';\n this.handlePopstate = () => {\n this.syncActiveFromUrl();\n };\n }\n connectedCallback() {\n super.connectedCallback();\n // Defer so property bindings (.items) have been applied\n requestAnimationFrame(() => this.syncActiveFromUrl());\n window.addEventListener('popstate', this.handlePopstate);\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener('popstate', this.handlePopstate);\n }\n /**\n * Handles click events on navigation items.\n *\n * Dispatches a cancelable `nav-item-click` custom event.\n * If a listener calls `preventDefault()` on the custom event, native browser\n * navigation is prevented. Otherwise, the default `<a href>` navigation\n * proceeds normally.\n *\n * The `@krubble/angular` package provides `KRScreenNavDirective` which\n * automatically listens for this event and handles navigation using\n * Angular's router.\n *\n * @param e - The original click event\n * @param item - The nav item that was clicked\n */\n handleNavItemClick(e, item) {\n const navEvent = new CustomEvent('nav-item-click', {\n detail: { item },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n this.dispatchEvent(navEvent);\n // If a listener called preventDefault(), prevent the native navigation\n if (navEvent.defaultPrevented) {\n e.preventDefault();\n }\n this.activeId = item.id;\n }\n syncActiveFromUrl() {\n const pathname = window.location.pathname;\n const match = this.items.find((item) => {\n if (!item.url) {\n return false;\n }\n // Absolute URL — exact match\n if (item.url.startsWith('/')) {\n return pathname === item.url;\n }\n // Relative URL — match against the end of the pathname\n return pathname.endsWith('/' + item.url);\n });\n if (match) {\n this.activeId = match.id;\n }\n }\n render() {\n return html `\n <nav class=\"nav\">\n ${this.label ? html `\n <div class=\"nav-header\">\n <div class=\"nav-header__text\">\n ${this.subLabel ? html `<div class=\"nav-header__subtitle\">${this.subLabel}</div>` : nothing}\n <div class=\"nav-header__title\">${this.label}</div>\n </div>\n </div>\n ` : nothing}\n <div class=\"nav-content\">\n <div class=\"nav-items\">\n ${this.items.map((item) => html `\n <a\n class=${classMap({\n 'nav-item': true,\n 'nav-item--active': item.id === this.activeId\n })}\n href=${item.url || '#'}\n @click=${(e) => this.handleNavItemClick(e, item)}\n >\n ${item.label}\n </a>\n `)}\n </div>\n </div>\n </nav>\n <main class=\"content\">\n <div class=\"content__main\">\n <slot></slot>\n </div>\n </main>\n `;\n }\n};\nKRScreenNav.styles = css `\n :host {\n display: flex;\n height: 100%;\n }\n\n .nav {\n width: 200px;\n background: white;\n border-right: 1px solid #e5e7eb;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n }\n\n .nav-header {\n padding: 20px 16px 16px;\n }\n\n .nav-header__text {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .nav-header__title {\n font-size: 20px;\n font-weight: 600;\n color: #111827;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n }\n\n .nav-header__subtitle {\n font-size: 12px;\n font-weight: 400;\n color: rgb(0 0 0 / 70%);\n line-height: 1;\n }\n\n .nav-content {\n flex: 1;\n overflow-y: auto;\n padding: 0 0 12px;\n }\n\n .nav-items {\n display: flex;\n flex-direction: column;\n padding: 0 8px;\n }\n\n .nav-item {\n display: block;\n padding: 0 12px;\n height: 32px;\n line-height: 32px;\n letter-spacing: 0.13px;\n color: rgb(32, 33, 36);\n text-decoration: none;\n font-size: 13px;\n font-weight: 400;\n font-family: inherit;\n border-radius: 8px;\n transition: all 0.15s ease;\n }\n\n .nav-item:hover {\n background: rgba(0, 0, 0, 0.04);\n color: #163052;\n }\n\n .nav-item--active {\n background: #e1e9f6;\n color: #1a2332;\n font-weight: 700;\n }\n\n .content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .content__main {\n flex: 1;\n overflow-y: auto;\n }\n `;\n__decorate([\n property({ type: String })\n], KRScreenNav.prototype, \"label\", void 0);\n__decorate([\n property({ type: String })\n], KRScreenNav.prototype, \"subLabel\", void 0);\n__decorate([\n property({ type: Array })\n], KRScreenNav.prototype, \"items\", void 0);\n__decorate([\n property({ type: String })\n], KRScreenNav.prototype, \"activeId\", void 0);\nKRScreenNav = __decorate([\n customElement('kr-screen-nav')\n], KRScreenNav);\nexport { KRScreenNav };\n//# sourceMappingURL=screen-nav.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n/**\n * Detail screen component for viewing/editing entity details.\n * Displays a form-like layout with labeled fields centered in a single column.\n *\n * ## Usage\n * ```html\n * <kr-screen-detail title=\"Company Details\">\n * <kr-button slot=\"actions\">Save</kr-button>\n * <kr-text-field label=\"Company Name\" value=\"Acme Corporation\"></kr-text-field>\n * <kr-text-field label=\"Industry\" value=\"Technology\"></kr-text-field>\n * <kr-text-field label=\"Website\" value=\"https://acme.com\"></kr-text-field>\n * </kr-screen-detail>\n * ```\n *\n * @slot - Form fields and content (centered, max-width 480px)\n * @slot actions - Action buttons displayed in the header on the right\n *\n * @property {string} title - Section title (e.g., \"Company Details\")\n */\nlet KRScreenDetail = class KRScreenDetail extends LitElement {\n constructor() {\n super(...arguments);\n /**\n * Section title\n */\n this.title = '';\n }\n render() {\n return html `\n <div class=\"header\">\n <h2 class=\"header__title\">${this.title}</h2>\n <div class=\"header__actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n <div class=\"content\">\n <div class=\"content__inner\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n};\nKRScreenDetail.styles = css `\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n\n .header {\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 24px;\n background: #ffffff;\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n\n .header__title {\n font-size: 18px;\n font-weight: 600;\n color: #111827;\n margin: 0;\n }\n\n .header__actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n display: flex;\n justify-content: center;\n }\n\n .content__inner {\n width: 100%;\n max-width: 700px;\n }\n `;\n__decorate([\n property({ type: String })\n], KRScreenDetail.prototype, \"title\", void 0);\nKRScreenDetail = __decorate([\n customElement('kr-screen-detail')\n], KRScreenDetail);\nexport { KRScreenDetail };\n//# sourceMappingURL=screen-detail.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\n/**\n * Secondary bar component that sits below the main app bar.\n *\n * @slot - Content to display in the subbar (right side)\n */\nlet KRSubbar = class KRSubbar extends LitElement {\n constructor() {\n super(...arguments);\n /**\n * Array of breadcrumb items to display\n */\n this.breadcrumbs = [];\n /**\n * Whether to show the menu icon\n */\n this.menu = false;\n }\n _handleMenuClick() {\n this.dispatchEvent(new CustomEvent('menu-click', {\n bubbles: true,\n composed: true\n }));\n }\n /**\n * Handles click on a breadcrumb link.\n * Dispatches a cancelable event so SPA routers can intercept.\n */\n _handleBreadcrumbClick(e, crumb, isCurrent) {\n // Don't navigate if it's the current/last breadcrumb\n if (isCurrent || !crumb.url) {\n e.preventDefault();\n return;\n }\n // Allow Ctrl/Cmd+click and middle-click to open in new tab without SPA navigation\n if (e.ctrlKey || e.metaKey || e.button === 1) {\n return;\n }\n const breadcrumbEvent = new CustomEvent('breadcrumb-click', {\n detail: { breadcrumb: crumb },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n this.dispatchEvent(breadcrumbEvent);\n // If a listener called preventDefault(), prevent the native navigation\n if (breadcrumbEvent.defaultPrevented) {\n e.preventDefault();\n }\n }\n render() {\n return html `\n ${this.menu ? html `\n <div class=\"menu\" @click=${this._handleMenuClick}>\n <svg\n class=\"menu__icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <line\n x1=\"3\"\n y1=\"6\"\n x2=\"21\"\n y2=\"6\"\n ></line>\n <line\n x1=\"3\"\n y1=\"12\"\n x2=\"21\"\n y2=\"12\"\n ></line>\n <line\n x1=\"3\"\n y1=\"18\"\n x2=\"21\"\n y2=\"18\"\n ></line>\n </svg>\n </div>\n ` : nothing}\n <div class=\"breadcrumbs\">\n ${this.breadcrumbs.map((crumb, index) => {\n const isCurrent = index === this.breadcrumbs.length - 1;\n // The href gets the base href prepended so Cmd/Ctrl+click opens the right\n // URL in a new tab. crumb.url itself is left intact (base-relative) and\n // passed to Angular via breadcrumb-click — its Router applies the base\n // itself. e.g. base \"/operations/\" + crumb.url \"/settings\" ->\n // \"/operations/settings\".\n const baseHref = document.querySelector('base')?.getAttribute('href') || '/';\n let href = '#';\n if (crumb.url) {\n let path = crumb.url;\n if (crumb.url.startsWith('/')) {\n path = crumb.url.slice(1);\n }\n href = baseHref + path;\n if (!baseHref.endsWith('/')) {\n href = baseHref + '/' + path;\n }\n }\n return html `\n ${index > 0 ? html `<span class=\"breadcrumb-separator\">/</span>` : ''}\n <a\n class=${classMap({\n 'breadcrumb': true,\n 'breadcrumb--current': isCurrent\n })}\n href=${href}\n @click=${(e) => this._handleBreadcrumbClick(e, crumb, isCurrent)}\n >${crumb.label}</a>\n `;\n })}\n </div>\n <div class=\"content\">\n <slot></slot>\n </div>\n\n `;\n }\n};\nKRSubbar.styles = css `\n :host {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n height: 40px;\n background: #E2E9F6;\n border-bottom: 1px solid rgb(229, 229, 228);\n align-items: center;\n padding: 0 16px;\n width: 100%;\n flex-shrink: 0;\n }\n\n .breadcrumbs {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n flex: 1;\n }\n\n .breadcrumb {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n font-size: 13px;\n }\n\n .breadcrumb:hover {\n text-decoration: underline;\n }\n\n .breadcrumb--current {\n cursor: default;\n }\n\n .breadcrumb--current:hover {\n text-decoration: none;\n }\n\n .breadcrumb-separator {\n color: #9ca3af;\n font-size: 12px;\n }\n\n .content {\n display: flex;\n align-items: center;\n margin-left: auto;\n }\n\n .menu {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n margin-right: 8px;\n cursor: pointer;\n }\n\n .menu__icon {\n width: 18px;\n height: 18px;\n }\n `;\n__decorate([\n property({ type: Array })\n], KRSubbar.prototype, \"breadcrumbs\", void 0);\n__decorate([\n property({ type: Boolean })\n], KRSubbar.prototype, \"menu\", void 0);\nKRSubbar = __decorate([\n customElement('kr-subbar')\n], KRSubbar);\nexport { KRSubbar };\n//# sourceMappingURL=subbar.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nexport class KRRouter {\n static configure(config) {\n KRRouter.base = config.base;\n KRRouter.routes = config.routes;\n // Intercept <a> clicks for client-side navigation\n window.addEventListener('click', (e) => {\n const anchor = e.composedPath().find(el => el instanceof HTMLAnchorElement);\n if (!anchor) {\n return;\n }\n if (anchor.origin !== window.location.origin) {\n return;\n }\n if (!anchor.pathname.startsWith(KRRouter.base)) {\n return;\n }\n e.preventDefault();\n KRRouter.navigate(anchor.pathname);\n });\n }\n static navigate(path) {\n let fullPath = path;\n if (!path.startsWith('/')) {\n fullPath = KRRouter.base + '/' + path;\n }\n window.history.pushState({}, '', fullPath);\n window.dispatchEvent(new PopStateEvent('popstate'));\n }\n static getParams() {\n const matched = KRRouter.matchAll();\n const params = {};\n for (const match of matched) {\n for (const key in match.params) {\n params[key] = decodeURIComponent(match.params[key]);\n }\n }\n return params;\n }\n static outlet(level) {\n const matched = KRRouter.matchAll();\n if (level >= matched.length) {\n return null;\n }\n const match = matched[level];\n const tag = match.route.component;\n const cached = KRRouter.elementCache.get(level + ':' + tag);\n if (cached) {\n return cached;\n }\n // Clear old cache entry for this level\n for (const key of KRRouter.elementCache.keys()) {\n if (key.startsWith(level + ':')) {\n KRRouter.elementCache.delete(key);\n }\n }\n const el = document.createElement(tag);\n KRRouter.elementCache.set(level + ':' + tag, el);\n return el;\n }\n static matchAll() {\n const path = window.location.pathname;\n let relative = path;\n if (path.startsWith(KRRouter.base)) {\n relative = path.slice(KRRouter.base.length);\n }\n const segments = relative.split('/').filter(s => s);\n return KRRouter.matchRoutes(KRRouter.routes, segments);\n }\n static matchRoutes(routes, segments) {\n for (const route of routes) {\n const routeSegments = route.path.split('/').filter(s => s);\n if (routeSegments.length === 0 && segments.length === 0) {\n return [{\n route,\n params: {}\n }];\n }\n if (routeSegments.length === 0) {\n continue;\n }\n if (segments.length < routeSegments.length) {\n continue;\n }\n const params = {};\n let matched = true;\n for (let i = 0; i < routeSegments.length; i++) {\n if (routeSegments[i].startsWith(':')) {\n params[routeSegments[i].slice(1)] = segments[i];\n }\n else if (routeSegments[i] !== segments[i]) {\n matched = false;\n break;\n }\n }\n if (!matched) {\n continue;\n }\n const remaining = segments.slice(routeSegments.length);\n // If there are remaining segments but no children, this route doesn't fully match — try next route\n if (remaining.length > 0 && !route.children) {\n continue;\n }\n const result = [{\n route,\n params\n }];\n if (route.children && remaining.length > 0) {\n const childMatches = KRRouter.matchRoutes(route.children, remaining);\n if (childMatches.length > 0) {\n result.push(...childMatches);\n return result;\n }\n }\n // No remaining segments + default child — redirect\n if (route.children && remaining.length === 0 && route.default) {\n window.history.replaceState({}, '', window.location.pathname + '/' + route.default);\n const childMatches = KRRouter.matchRoutes(route.children, [route.default]);\n if (childMatches.length > 0) {\n result.push(...childMatches);\n return result;\n }\n }\n return result;\n }\n return [];\n }\n}\nKRRouter.base = '';\nKRRouter.routes = [];\nKRRouter.elementCache = new Map();\nlet KRRouterOutlet = class KRRouterOutlet extends LitElement {\n constructor() {\n super(...arguments);\n this.level = -1;\n this.handlePopState = () => {\n this.requestUpdate();\n };\n }\n connectedCallback() {\n super.connectedCallback();\n this.level = this.detectLevel();\n window.addEventListener('popstate', this.handlePopState);\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener('popstate', this.handlePopState);\n }\n detectLevel() {\n let level = 0;\n let node = this;\n while (node) {\n if (node instanceof ShadowRoot) {\n node = node.host;\n continue;\n }\n if (node instanceof HTMLElement && node.tagName === 'KR-ROUTER-OUTLET' && node !== this) {\n level++;\n }\n if (node instanceof HTMLElement) {\n node = node.parentNode;\n }\n else {\n node = null;\n }\n }\n return level;\n }\n render() {\n const el = KRRouter.outlet(this.level);\n if (!el) {\n return html ``;\n }\n return html `${el}`;\n }\n};\nKRRouterOutlet.styles = css `\n :host {\n display: block;\n height: 100%;\n }\n `;\nKRRouterOutlet = __decorate([\n customElement('kr-router-outlet')\n], KRRouterOutlet);\nexport { KRRouterOutlet };\n//# sourceMappingURL=router.js.map","import{noChange as t}from\"../lit-html.js\";import{directive as e,Directive as r,PartType as s}from\"../directive.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const n=\"important\",i=\" !\"+n,o=e(class extends r{constructor(t){if(super(t),t.type!==s.ATTRIBUTE||\"style\"!==t.name||t.strings?.length>2)throw Error(\"The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.\")}render(t){return Object.keys(t).reduce((e,r)=>{const s=t[r];return null==s?e:e+`${r=r.includes(\"-\")?r:r.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,\"-$&\").toLowerCase()}:${s};`},\"\")}update(e,[r]){const{style:s}=e.element;if(void 0===this.ft)return this.ft=new Set(Object.keys(r)),this.render(r);for(const t of this.ft)null==r[t]&&(this.ft.delete(t),t.includes(\"-\")?s.removeProperty(t):s[t]=null);for(const t in r){const e=r[t];if(null!=e){this.ft.add(t);const r=\"string\"==typeof e&&e.endsWith(i);t.includes(\"-\")||r?s.setProperty(t,r?e.slice(0,-11):e,r?n:\"\"):s[t]=e}}return t}});export{o as styleMap};\n//# sourceMappingURL=style-map.js.map\n","import{_$LH as o}from\"./lit-html.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{I:t}=o,i=o=>o,n=o=>null===o||\"object\"!=typeof o&&\"function\"!=typeof o,e={HTML:1,SVG:2,MATHML:3},l=(o,t)=>void 0===t?void 0!==o?._$litType$:o?._$litType$===t,d=o=>null!=o?._$litType$?.h,c=o=>void 0!==o?._$litDirective$,f=o=>o?._$litDirective$,r=o=>void 0===o.strings,s=()=>document.createComment(\"\"),v=(o,n,e)=>{const l=o._$AA.parentNode,d=void 0===n?o._$AB:n._$AA;if(void 0===e){const i=l.insertBefore(s(),d),n=l.insertBefore(s(),d);e=new t(i,n,o,o.options)}else{const t=e._$AB.nextSibling,n=e._$AM,c=n!==o;if(c){let t;e._$AQ?.(o),e._$AM=o,void 0!==e._$AP&&(t=o._$AU)!==n._$AU&&e._$AP(t)}if(t!==d||c){let o=e._$AA;for(;o!==t;){const t=i(o).nextSibling;i(l).insertBefore(o,d),o=t}}}return e},u=(o,t,i=o)=>(o._$AI(t,i),o),m={},p=(o,t=m)=>o._$AH=t,M=o=>o._$AH,h=o=>{o._$AR(),o._$AA.remove()},j=o=>{o._$AR()};export{e as TemplateResultType,j as clearPart,M as getCommittedValue,f as getDirectiveClass,v as insertPart,d as isCompiledTemplateResult,c as isDirectiveResult,n as isPrimitive,r as isSingleExpression,l as isTemplateResult,h as removePart,u as setChildPartValue,p as setCommittedValue};\n//# sourceMappingURL=directive-helpers.js.map\n","import{noChange as e}from\"../lit-html.js\";import{directive as s,Directive as t,PartType as r}from\"../directive.js\";import{getCommittedValue as l,setChildPartValue as o,insertPart as i,removePart as n,setCommittedValue as f}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst u=(e,s,t)=>{const r=new Map;for(let l=s;l<=t;l++)r.set(e[l],l);return r},c=s(class extends t{constructor(e){if(super(e),e.type!==r.CHILD)throw Error(\"repeat() can only be used in text expressions\")}dt(e,s,t){let r;void 0===t?t=s:void 0!==s&&(r=s);const l=[],o=[];let i=0;for(const s of e)l[i]=r?r(s,i):i,o[i]=t(s,i),i++;return{values:o,keys:l}}render(e,s,t){return this.dt(e,s,t).values}update(s,[t,r,c]){const d=l(s),{values:p,keys:a}=this.dt(t,r,c);if(!Array.isArray(d))return this.ut=a,p;const h=this.ut??=[],v=[];let m,y,x=0,j=d.length-1,k=0,w=p.length-1;for(;x<=j&&k<=w;)if(null===d[x])x++;else if(null===d[j])j--;else if(h[x]===a[k])v[k]=o(d[x],p[k]),x++,k++;else if(h[j]===a[w])v[w]=o(d[j],p[w]),j--,w--;else if(h[x]===a[w])v[w]=o(d[x],p[w]),i(s,v[w+1],d[x]),x++,w--;else if(h[j]===a[k])v[k]=o(d[j],p[k]),i(s,d[x],d[j]),j--,k++;else if(void 0===m&&(m=u(a,k,w),y=u(h,x,j)),m.has(h[x]))if(m.has(h[j])){const e=y.get(a[k]),t=void 0!==e?d[e]:null;if(null===t){const e=i(s,d[x]);o(e,p[k]),v[k]=e}else v[k]=o(t,p[k]),i(s,d[x],t),d[e]=null;k++}else n(d[j]),j--;else n(d[x]),x++;for(;k<=w;){const e=i(s,v[w+1]);o(e,p[k]),v[k++]=e}for(;x<=j;){const e=d[x++];null!==e&&n(e)}return this.ut=a,f(s,v),e}});export{c as repeat};\n//# sourceMappingURL=repeat.js.map\n","/**\n * marked v12.0.2 - a markdown parser\n * Copyright (c) 2011-2024, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\n/**\n * Gets the original marked default options.\n */\nfunction _getDefaults() {\n return {\n async: false,\n breaks: false,\n extensions: null,\n gfm: true,\n hooks: null,\n pedantic: false,\n renderer: null,\n silent: false,\n tokenizer: null,\n walkTokens: null\n };\n}\nlet _defaults = _getDefaults();\nfunction changeDefaults(newDefaults) {\n _defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = new RegExp(escapeTest.source, 'g');\nconst escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nconst escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\nconst escapeReplacements = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape$1(html, encode) {\n if (encode) {\n if (escapeTest.test(html)) {\n return html.replace(escapeReplace, getEscapeReplacement);\n }\n }\n else {\n if (escapeTestNoEncode.test(html)) {\n return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n return html;\n}\nconst unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\nfunction unescape(html) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon')\n return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\nconst caret = /(^|[^\\[])\\^/g;\nfunction edit(regex, opt) {\n let source = typeof regex === 'string' ? regex : regex.source;\n opt = opt || '';\n const obj = {\n replace: (name, val) => {\n let valSource = typeof val === 'string' ? val : val.source;\n valSource = valSource.replace(caret, '$1');\n source = source.replace(name, valSource);\n return obj;\n },\n getRegex: () => {\n return new RegExp(source, opt);\n }\n };\n return obj;\n}\nfunction cleanUrl(href) {\n try {\n href = encodeURI(href).replace(/%25/g, '%');\n }\n catch (e) {\n return null;\n }\n return href;\n}\nconst noopTest = { exec: () => null };\nfunction splitCells(tableRow, count) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n let escaped = false;\n let curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\')\n escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n }\n else {\n // add space before unescaped |\n return ' |';\n }\n }), cells = row.split(/ \\|/);\n let i = 0;\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) {\n cells.shift();\n }\n if (cells.length > 0 && !cells[cells.length - 1].trim()) {\n cells.pop();\n }\n if (count) {\n if (cells.length > count) {\n cells.splice(count);\n }\n else {\n while (cells.length < count)\n cells.push('');\n }\n }\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n }\n return cells;\n}\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n }\n else if (currChar !== c && invert) {\n suffLen++;\n }\n else {\n break;\n }\n }\n return str.slice(0, l - suffLen);\n}\nfunction findClosingBracket(str, b) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n let level = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\\\') {\n i++;\n }\n else if (str[i] === b[0]) {\n level++;\n }\n else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n const href = link.href;\n const title = link.title ? escape$1(link.title) : null;\n const text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n if (cap[0].charAt(0) !== '!') {\n lexer.state.inLink = true;\n const token = {\n type: 'link',\n raw,\n href,\n title,\n text,\n tokens: lexer.inlineTokens(text)\n };\n lexer.state.inLink = false;\n return token;\n }\n return {\n type: 'image',\n raw,\n href,\n title,\n text: escape$1(text)\n };\n}\nfunction indentCodeCompensation(raw, text) {\n const matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n if (matchIndentToCode === null) {\n return text;\n }\n const indentToCode = matchIndentToCode[1];\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(/^\\s+/);\n if (matchIndentInNode === null) {\n return node;\n }\n const [indentInNode] = matchIndentInNode;\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n return node;\n })\n .join('\\n');\n}\n/**\n * Tokenizer\n */\nclass _Tokenizer {\n options;\n rules; // set by the lexer\n lexer; // set by the lexer\n constructor(options) {\n this.options = options || _defaults;\n }\n space(src) {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0]\n };\n }\n }\n code(src) {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const text = cap[0].replace(/^ {1,4}/gm, '');\n return {\n type: 'code',\n raw: cap[0],\n codeBlockStyle: 'indented',\n text: !this.options.pedantic\n ? rtrim(text, '\\n')\n : text\n };\n }\n }\n fences(src) {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '');\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n text\n };\n }\n }\n heading(src) {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n // remove trailing #s\n if (/#$/.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n }\n else if (!trimmed || / $/.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[1].length,\n text,\n tokens: this.lexer.inline(text)\n };\n }\n }\n hr(src) {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: cap[0]\n };\n }\n }\n blockquote(src) {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n // precede setext continuation with 4 spaces so it isn't a setext\n let text = cap[0].replace(/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g, '\\n $1');\n text = rtrim(text.replace(/^ *>[ \\t]?/gm, ''), '\\n');\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n const tokens = this.lexer.blockTokens(text);\n this.lexer.state.top = top;\n return {\n type: 'blockquote',\n raw: cap[0],\n tokens,\n text\n };\n }\n }\n list(src) {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n const list = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: []\n };\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n // Get next list item\n const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`);\n let raw = '';\n let itemContents = '';\n let endsWithBlankLine = false;\n // Check if current bullet point can start a new List Item\n while (src) {\n let endEarly = false;\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n raw = cap[0];\n src = src.substring(raw.length);\n let line = cap[2].split('\\n', 1)[0].replace(/^\\t+/, (t) => ' '.repeat(3 * t.length));\n let nextLine = src.split('\\n', 1)[0];\n let indent = 0;\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimStart();\n }\n else {\n indent = cap[2].search(/[^ ]/); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += cap[1].length;\n }\n let blankLine = false;\n if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line\n raw += nextLine + '\\n';\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n if (!endEarly) {\n const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`);\n const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`);\n const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`);\n const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);\n // Check if following lines should be included in List Item\n while (src) {\n const rawLine = src.split('\\n', 1)[0];\n nextLine = rawLine;\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' ');\n }\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n // Horizontal rule found\n if (hrRegex.test(src)) {\n break;\n }\n if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLine.slice(indent);\n }\n else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n // paragraph continuation unless last line was a different block level element\n if (line.search(/[^ ]/) >= 4) { // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n itemContents += '\\n' + nextLine;\n }\n if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n blankLine = true;\n }\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n line = nextLine.slice(indent);\n }\n }\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n }\n else if (/\\n *\\n *$/.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n let istask = null;\n let ischecked;\n // Check for task list items\n if (this.options.gfm) {\n istask = /^\\[[ xX]\\] /.exec(itemContents);\n if (istask) {\n ischecked = istask[0] !== '[ ] ';\n itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n }\n }\n list.items.push({\n type: 'list_item',\n raw,\n task: !!istask,\n checked: ischecked,\n loose: false,\n text: itemContents,\n tokens: []\n });\n list.raw += raw;\n }\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n list.items[list.items.length - 1].raw = raw.trimEnd();\n (list.items[list.items.length - 1]).text = itemContents.trimEnd();\n list.raw = list.raw.trimEnd();\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n for (let i = 0; i < list.items.length; i++) {\n this.lexer.state.top = false;\n list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n if (!list.loose) {\n // Check if list should be loose\n const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\\n.*\\n/.test(t.raw));\n list.loose = hasMultipleLineBreaks;\n }\n }\n // Set all items to loose if list is loose\n if (list.loose) {\n for (let i = 0; i < list.items.length; i++) {\n list.items[i].loose = true;\n }\n }\n return list;\n }\n }\n html(src) {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const token = {\n type: 'html',\n block: true,\n raw: cap[0],\n pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n text: cap[0]\n };\n return token;\n }\n }\n def(src) {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n const tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n return {\n type: 'def',\n tag,\n raw: cap[0],\n href,\n title\n };\n }\n }\n table(src) {\n const cap = this.rules.block.table.exec(src);\n if (!cap) {\n return;\n }\n if (!/[:|]/.test(cap[2])) {\n // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n return;\n }\n const headers = splitCells(cap[1]);\n const aligns = cap[2].replace(/^\\||\\| *$/g, '').split('|');\n const rows = cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : [];\n const item = {\n type: 'table',\n raw: cap[0],\n header: [],\n align: [],\n rows: []\n };\n if (headers.length !== aligns.length) {\n // header and align columns must be equal, rows can be different.\n return;\n }\n for (const align of aligns) {\n if (/^ *-+: *$/.test(align)) {\n item.align.push('right');\n }\n else if (/^ *:-+: *$/.test(align)) {\n item.align.push('center');\n }\n else if (/^ *:-+ *$/.test(align)) {\n item.align.push('left');\n }\n else {\n item.align.push(null);\n }\n }\n for (const header of headers) {\n item.header.push({\n text: header,\n tokens: this.lexer.inline(header)\n });\n }\n for (const row of rows) {\n item.rows.push(splitCells(row, item.header.length).map(cell => {\n return {\n text: cell,\n tokens: this.lexer.inline(cell)\n };\n }));\n }\n return item;\n }\n lheading(src) {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1],\n tokens: this.lexer.inline(cap[1])\n };\n }\n }\n paragraph(src) {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text,\n tokens: this.lexer.inline(text)\n };\n }\n }\n text(src) {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0])\n };\n }\n }\n escape(src) {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: escape$1(cap[1])\n };\n }\n }\n tag(src) {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n this.lexer.state.inLink = true;\n }\n else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n }\n else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n return {\n type: 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n block: false,\n text: cap[0]\n };\n }\n }\n link(src) {\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(/>$/.test(trimmedUrl))) {\n return;\n }\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n }\n else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n if (link) {\n href = link[1];\n title = link[3];\n }\n }\n else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n href = href.trim();\n if (/^</.test(href)) {\n if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n }\n else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title\n }, cap[0], this.lexer);\n }\n }\n reflink(src, links) {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n const linkString = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n const link = links[linkString.toLowerCase()];\n if (!link) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text\n };\n }\n return outputLink(cap, link, cap[0], this.lexer);\n }\n }\n emStrong(src, maskedSrc, prevChar = '') {\n let match = this.rules.inline.emStrongLDelim.exec(src);\n if (!match)\n return;\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[3] && prevChar.match(/[\\p{L}\\p{N}]/u))\n return;\n const nextChar = match[1] || match[2] || '';\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n endReg.lastIndex = 0;\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n if (!rDelim)\n continue; // skip single * in __abc*abc__\n rLength = [...rDelim].length;\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n }\n else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n }\n delimTotal -= rLength;\n if (delimTotal > 0)\n continue; // Haven't found enough closing delimiters\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n // char length can be >1 for unicode characters;\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = raw.slice(1, -1);\n return {\n type: 'em',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text)\n };\n }\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text)\n };\n }\n }\n }\n codespan(src) {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(/\\n/g, ' ');\n const hasNonSpaceChars = /[^ ]/.test(text);\n const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n text = escape$1(text, true);\n return {\n type: 'codespan',\n raw: cap[0],\n text\n };\n }\n }\n br(src) {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0]\n };\n }\n }\n del(src) {\n const cap = this.rules.inline.del.exec(src);\n if (cap) {\n return {\n type: 'del',\n raw: cap[0],\n text: cap[2],\n tokens: this.lexer.inlineTokens(cap[2])\n };\n }\n }\n autolink(src) {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = escape$1(cap[1]);\n href = 'mailto:' + text;\n }\n else {\n text = escape$1(cap[1]);\n href = text;\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text\n }\n ]\n };\n }\n }\n url(src) {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = escape$1(cap[0]);\n href = 'mailto:' + text;\n }\n else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n } while (prevCapZero !== cap[0]);\n text = escape$1(cap[0]);\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n }\n else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text\n }\n ]\n };\n }\n }\n inlineText(src) {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n let text;\n if (this.lexer.state.inRawBlock) {\n text = cap[0];\n }\n else {\n text = escape$1(cap[0]);\n }\n return {\n type: 'text',\n raw: cap[0],\n text\n };\n }\n }\n}\n\n/**\n * Block-Level Grammar\n */\nconst newline = /^(?: *(?:\\n|$))+/;\nconst blockCode = /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nconst lheading = edit(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, / {4}/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n *)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/)\n .replace('label', _blockLabel)\n .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n .getRegex();\nconst list = edit(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/)\n .replace(/bull/g, bullet)\n .getRegex();\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit('^ {0,3}(?:' // optional indentation\n + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n + ')', 'i')\n .replace('comment', _comment)\n .replace('tag', _tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\nconst paragraph = edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n .replace('paragraph', paragraph)\n .getRegex();\n/**\n * Normal Block Grammar\n */\nconst blockNormal = {\n blockquote,\n code: blockCode,\n def,\n fences,\n heading,\n hr,\n html,\n lheading,\n list,\n newline,\n paragraph,\n table: noopTest,\n text: blockText\n};\n/**\n * GFM Block Grammar\n */\nconst gfmTable = edit('^ *([^\\\\n ].*)\\\\n' // Header\n + ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('blockquote', ' {0,3}>')\n .replace('code', ' {4}[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // tables can be interrupted by type (6) html blocks\n .getRegex();\nconst blockGfm = {\n ...blockNormal,\n table: gfmTable,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('table', gfmTable) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex()\n};\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\nconst blockPedantic = {\n ...blockNormal,\n html: edit('^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', _comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', lheading)\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .replace('|tag', '')\n .getRegex()\n};\n/**\n * Inline-Level Grammar\n */\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = '\\\\p{P}\\\\p{S}';\nconst punctuation = edit(/^((?![*_])[\\spunctuation])/, 'u')\n .replace(/punctuation/g, _punctuation).getRegex();\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = /\\[[^[\\]]*?\\]\\([^\\(\\)]*?\\)|`[^`]*?`|<[^<>]*?>/g;\nconst emStrongLDelim = edit(/^(?:\\*+(?:((?!\\*)[punct])|[^\\s*]))|^_+(?:((?!_)[punct])|([^\\s_]))/, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\nconst emStrongRDelimAst = edit('^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n + '|[^*]+(?=[^*])' // Consume to delim\n + '|(?!\\\\*)[punct](\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n + '|[^punct\\\\s](\\\\*+)(?!\\\\*)(?=[punct\\\\s]|$)' // (2) a***#, a*** can only be a Right Delimiter\n + '|(?!\\\\*)[punct\\\\s](\\\\*+)(?=[^punct\\\\s])' // (3) #***a, ***a can only be Left Delimiter\n + '|[\\\\s](\\\\*+)(?!\\\\*)(?=[punct])' // (4) ***# can only be Left Delimiter\n + '|(?!\\\\*)[punct](\\\\*+)(?!\\\\*)(?=[punct])' // (5) #***# can be either Left or Right Delimiter\n + '|[^punct\\\\s](\\\\*+)(?=[^punct\\\\s])', 'gu') // (6) a***a can be either Left or Right Delimiter\n .replace(/punct/g, _punctuation)\n .getRegex();\n// (6) Not allowed for _\nconst emStrongRDelimUnd = edit('^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n + '|[^_]+(?=[^_])' // Consume to delim\n + '|(?!_)[punct](_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n + '|[^punct\\\\s](_+)(?!_)(?=[punct\\\\s]|$)' // (2) a___#, a___ can only be a Right Delimiter\n + '|(?!_)[punct\\\\s](_+)(?=[^punct\\\\s])' // (3) #___a, ___a can only be Left Delimiter\n + '|[\\\\s](_+)(?!_)(?=[punct])' // (4) ___# can only be Left Delimiter\n + '|(?!_)[punct](_+)(?!_)(?=[punct])', 'gu') // (5) #___# can be either Left or Right Delimiter\n .replace(/punct/g, _punctuation)\n .getRegex();\nconst anyPunctuation = edit(/\\\\([punct])/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n .getRegex();\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit('^comment'\n + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n .replace('comment', _inlineComment)\n .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n .getRegex();\nconst _inlineLabel = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/)\n .replace('label', _inlineLabel)\n .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/)\n .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n .getRegex();\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _inlineLabel)\n .replace('ref', _blockLabel)\n .getRegex();\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _blockLabel)\n .getRegex();\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n .replace('reflink', reflink)\n .replace('nolink', nolink)\n .getRegex();\n/**\n * Normal Inline Grammar\n */\nconst inlineNormal = {\n _backpedal: noopTest, // only used for GFM url\n anyPunctuation,\n autolink,\n blockSkip,\n br,\n code: inlineCode,\n del: noopTest,\n emStrongLDelim,\n emStrongRDelimAst,\n emStrongRDelimUnd,\n escape,\n link,\n nolink,\n punctuation,\n reflink,\n reflinkSearch,\n tag,\n text: inlineText,\n url: noopTest\n};\n/**\n * Pedantic Inline Grammar\n */\nconst inlinePedantic = {\n ...inlineNormal,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', _inlineLabel)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', _inlineLabel)\n .getRegex()\n};\n/**\n * GFM Inline Grammar\n */\nconst inlineGfm = {\n ...inlineNormal,\n escape: edit(escape).replace('])', '~|])').getRegex(),\n url: edit(/^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/, 'i')\n .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)\n .getRegex(),\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/\n};\n/**\n * GFM + Line Breaks Inline Grammar\n */\nconst inlineBreaks = {\n ...inlineGfm,\n br: edit(br).replace('{2,}', '*').getRegex(),\n text: edit(inlineGfm.text)\n .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n .replace(/\\{2,\\}/g, '*')\n .getRegex()\n};\n/**\n * exports\n */\nconst block = {\n normal: blockNormal,\n gfm: blockGfm,\n pedantic: blockPedantic\n};\nconst inline = {\n normal: inlineNormal,\n gfm: inlineGfm,\n breaks: inlineBreaks,\n pedantic: inlinePedantic\n};\n\n/**\n * Block Lexer\n */\nclass _Lexer {\n tokens;\n options;\n state;\n tokenizer;\n inlineQueue;\n constructor(options) {\n // TokenList cannot be created in one go\n this.tokens = [];\n this.tokens.links = Object.create(null);\n this.options = options || _defaults;\n this.options.tokenizer = this.options.tokenizer || new _Tokenizer();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n top: true\n };\n const rules = {\n block: block.normal,\n inline: inline.normal\n };\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n }\n else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n }\n else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline\n };\n }\n /**\n * Static Lex Method\n */\n static lex(src, options) {\n const lexer = new _Lexer(options);\n return lexer.lex(src);\n }\n /**\n * Static Lex Inline Method\n */\n static lexInline(src, options) {\n const lexer = new _Lexer(options);\n return lexer.inlineTokens(src);\n }\n /**\n * Preprocessing\n */\n lex(src) {\n src = src\n .replace(/\\r\\n|\\r/g, '\\n');\n this.blockTokens(src, this.tokens);\n for (let i = 0; i < this.inlineQueue.length; i++) {\n const next = this.inlineQueue[i];\n this.inlineTokens(next.src, next.tokens);\n }\n this.inlineQueue = [];\n return this.tokens;\n }\n blockTokens(src, tokens = []) {\n if (this.options.pedantic) {\n src = src.replace(/\\t/g, ' ').replace(/^ +$/gm, '');\n }\n else {\n src = src.replace(/^( *)(\\t+)/gm, (_, leading, tabs) => {\n return leading + ' '.repeat(tabs.length);\n });\n }\n let token;\n let lastToken;\n let cutSrc;\n let lastParagraphClipped;\n while (src) {\n if (this.options.extensions\n && this.options.extensions.block\n && this.options.extensions.block.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n if (token.raw.length === 1 && tokens.length > 0) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unnecessary paragraph tags\n tokens[tokens.length - 1].raw += '\\n';\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n // An indented code block cannot interrupt a paragraph.\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title\n };\n }\n continue;\n }\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n lastToken = tokens[tokens.length - 1];\n if (lastParagraphClipped && lastToken.type === 'paragraph') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else {\n tokens.push(token);\n }\n lastParagraphClipped = (cutSrc.length !== src.length);\n src = src.substring(token.raw.length);\n continue;\n }\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n this.state.top = true;\n return tokens;\n }\n inline(src, tokens = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n /**\n * Lexing/Compiling\n */\n inlineTokens(src, tokens = []) {\n let token, lastToken, cutSrc;\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n let match;\n let keepPrevChar, prevChar;\n // Mask out reflinks\n if (this.tokens.links) {\n const links = Object.keys(this.tokens.links);\n if (links.length > 0) {\n while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n }\n // Mask out other blocks\n while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n }\n // Mask out escaped characters\n while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n }\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n // extensions\n if (this.options.extensions\n && this.options.extensions.inline\n && this.options.extensions.inline.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // del (gfm)\n if (token = this.tokenizer.del(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // autolink\n if (token = this.tokenizer.autolink(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n return tokens;\n }\n}\n\n/**\n * Renderer\n */\nclass _Renderer {\n options;\n constructor(options) {\n this.options = options || _defaults;\n }\n code(code, infostring, escaped) {\n const lang = (infostring || '').match(/^\\S*/)?.[0];\n code = code.replace(/\\n$/, '') + '\\n';\n if (!lang) {\n return '<pre><code>'\n + (escaped ? code : escape$1(code, true))\n + '</code></pre>\\n';\n }\n return '<pre><code class=\"language-'\n + escape$1(lang)\n + '\">'\n + (escaped ? code : escape$1(code, true))\n + '</code></pre>\\n';\n }\n blockquote(quote) {\n return `<blockquote>\\n${quote}</blockquote>\\n`;\n }\n html(html, block) {\n return html;\n }\n heading(text, level, raw) {\n // ignore IDs\n return `<h${level}>${text}</h${level}>\\n`;\n }\n hr() {\n return '<hr>\\n';\n }\n list(body, ordered, start) {\n const type = ordered ? 'ol' : 'ul';\n const startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startatt + '>\\n' + body + '</' + type + '>\\n';\n }\n listitem(text, task, checked) {\n return `<li>${text}</li>\\n`;\n }\n checkbox(checked) {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\">';\n }\n paragraph(text) {\n return `<p>${text}</p>\\n`;\n }\n table(header, body) {\n if (body)\n body = `<tbody>${body}</tbody>`;\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n';\n }\n tablerow(content) {\n return `<tr>\\n${content}</tr>\\n`;\n }\n tablecell(content, flags) {\n const type = flags.header ? 'th' : 'td';\n const tag = flags.align\n ? `<${type} align=\"${flags.align}\">`\n : `<${type}>`;\n return tag + content + `</${type}>\\n`;\n }\n /**\n * span level renderer\n */\n strong(text) {\n return `<strong>${text}</strong>`;\n }\n em(text) {\n return `<em>${text}</em>`;\n }\n codespan(text) {\n return `<code>${text}</code>`;\n }\n br() {\n return '<br>';\n }\n del(text) {\n return `<del>${text}</del>`;\n }\n link(href, title, text) {\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text;\n }\n href = cleanHref;\n let out = '<a href=\"' + href + '\"';\n if (title) {\n out += ' title=\"' + title + '\"';\n }\n out += '>' + text + '</a>';\n return out;\n }\n image(href, title, text) {\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text;\n }\n href = cleanHref;\n let out = `<img src=\"${href}\" alt=\"${text}\"`;\n if (title) {\n out += ` title=\"${title}\"`;\n }\n out += '>';\n return out;\n }\n text(text) {\n return text;\n }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass _TextRenderer {\n // no need for block level renderers\n strong(text) {\n return text;\n }\n em(text) {\n return text;\n }\n codespan(text) {\n return text;\n }\n del(text) {\n return text;\n }\n html(text) {\n return text;\n }\n text(text) {\n return text;\n }\n link(href, title, text) {\n return '' + text;\n }\n image(href, title, text) {\n return '' + text;\n }\n br() {\n return '';\n }\n}\n\n/**\n * Parsing & Compiling\n */\nclass _Parser {\n options;\n renderer;\n textRenderer;\n constructor(options) {\n this.options = options || _defaults;\n this.options.renderer = this.options.renderer || new _Renderer();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.textRenderer = new _TextRenderer();\n }\n /**\n * Static Parse Method\n */\n static parse(tokens, options) {\n const parser = new _Parser(options);\n return parser.parse(tokens);\n }\n /**\n * Static Parse Inline Method\n */\n static parseInline(tokens, options) {\n const parser = new _Parser(options);\n return parser.parseInline(tokens);\n }\n /**\n * Parse Loop\n */\n parse(tokens, top = true) {\n let out = '';\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n const genericToken = token;\n const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(genericToken.type)) {\n out += ret || '';\n continue;\n }\n }\n switch (token.type) {\n case 'space': {\n continue;\n }\n case 'hr': {\n out += this.renderer.hr();\n continue;\n }\n case 'heading': {\n const headingToken = token;\n out += this.renderer.heading(this.parseInline(headingToken.tokens), headingToken.depth, unescape(this.parseInline(headingToken.tokens, this.textRenderer)));\n continue;\n }\n case 'code': {\n const codeToken = token;\n out += this.renderer.code(codeToken.text, codeToken.lang, !!codeToken.escaped);\n continue;\n }\n case 'table': {\n const tableToken = token;\n let header = '';\n // header\n let cell = '';\n for (let j = 0; j < tableToken.header.length; j++) {\n cell += this.renderer.tablecell(this.parseInline(tableToken.header[j].tokens), { header: true, align: tableToken.align[j] });\n }\n header += this.renderer.tablerow(cell);\n let body = '';\n for (let j = 0; j < tableToken.rows.length; j++) {\n const row = tableToken.rows[j];\n cell = '';\n for (let k = 0; k < row.length; k++) {\n cell += this.renderer.tablecell(this.parseInline(row[k].tokens), { header: false, align: tableToken.align[k] });\n }\n body += this.renderer.tablerow(cell);\n }\n out += this.renderer.table(header, body);\n continue;\n }\n case 'blockquote': {\n const blockquoteToken = token;\n const body = this.parse(blockquoteToken.tokens);\n out += this.renderer.blockquote(body);\n continue;\n }\n case 'list': {\n const listToken = token;\n const ordered = listToken.ordered;\n const start = listToken.start;\n const loose = listToken.loose;\n let body = '';\n for (let j = 0; j < listToken.items.length; j++) {\n const item = listToken.items[j];\n const checked = item.checked;\n const task = item.task;\n let itemBody = '';\n if (item.task) {\n const checkbox = this.renderer.checkbox(!!checked);\n if (loose) {\n if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n }\n }\n else {\n item.tokens.unshift({\n type: 'text',\n text: checkbox + ' '\n });\n }\n }\n else {\n itemBody += checkbox + ' ';\n }\n }\n itemBody += this.parse(item.tokens, loose);\n body += this.renderer.listitem(itemBody, task, !!checked);\n }\n out += this.renderer.list(body, ordered, start);\n continue;\n }\n case 'html': {\n const htmlToken = token;\n out += this.renderer.html(htmlToken.text, htmlToken.block);\n continue;\n }\n case 'paragraph': {\n const paragraphToken = token;\n out += this.renderer.paragraph(this.parseInline(paragraphToken.tokens));\n continue;\n }\n case 'text': {\n let textToken = token;\n let body = textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text;\n while (i + 1 < tokens.length && tokens[i + 1].type === 'text') {\n textToken = tokens[++i];\n body += '\\n' + (textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text);\n }\n out += top ? this.renderer.paragraph(body) : body;\n continue;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '';\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens, renderer) {\n renderer = renderer || this.renderer;\n let out = '';\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n const ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n out += ret || '';\n continue;\n }\n }\n switch (token.type) {\n case 'escape': {\n const escapeToken = token;\n out += renderer.text(escapeToken.text);\n break;\n }\n case 'html': {\n const tagToken = token;\n out += renderer.html(tagToken.text);\n break;\n }\n case 'link': {\n const linkToken = token;\n out += renderer.link(linkToken.href, linkToken.title, this.parseInline(linkToken.tokens, renderer));\n break;\n }\n case 'image': {\n const imageToken = token;\n out += renderer.image(imageToken.href, imageToken.title, imageToken.text);\n break;\n }\n case 'strong': {\n const strongToken = token;\n out += renderer.strong(this.parseInline(strongToken.tokens, renderer));\n break;\n }\n case 'em': {\n const emToken = token;\n out += renderer.em(this.parseInline(emToken.tokens, renderer));\n break;\n }\n case 'codespan': {\n const codespanToken = token;\n out += renderer.codespan(codespanToken.text);\n break;\n }\n case 'br': {\n out += renderer.br();\n break;\n }\n case 'del': {\n const delToken = token;\n out += renderer.del(this.parseInline(delToken.tokens, renderer));\n break;\n }\n case 'text': {\n const textToken = token;\n out += renderer.text(textToken.text);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '';\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n}\n\nclass _Hooks {\n options;\n constructor(options) {\n this.options = options || _defaults;\n }\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens'\n ]);\n /**\n * Process markdown before marked\n */\n preprocess(markdown) {\n return markdown;\n }\n /**\n * Process HTML after marked is finished\n */\n postprocess(html) {\n return html;\n }\n /**\n * Process all tokens before walk tokens\n */\n processAllTokens(tokens) {\n return tokens;\n }\n}\n\nclass Marked {\n defaults = _getDefaults();\n options = this.setOptions;\n parse = this.#parseMarkdown(_Lexer.lex, _Parser.parse);\n parseInline = this.#parseMarkdown(_Lexer.lexInline, _Parser.parseInline);\n Parser = _Parser;\n Renderer = _Renderer;\n TextRenderer = _TextRenderer;\n Lexer = _Lexer;\n Tokenizer = _Tokenizer;\n Hooks = _Hooks;\n constructor(...args) {\n this.use(...args);\n }\n /**\n * Run callback for every token\n */\n walkTokens(tokens, callback) {\n let values = [];\n for (const token of tokens) {\n values = values.concat(callback.call(this, token));\n switch (token.type) {\n case 'table': {\n const tableToken = token;\n for (const cell of tableToken.header) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n for (const row of tableToken.rows) {\n for (const cell of row) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n }\n break;\n }\n case 'list': {\n const listToken = token;\n values = values.concat(this.walkTokens(listToken.items, callback));\n break;\n }\n default: {\n const genericToken = token;\n if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n const tokens = genericToken[childTokens].flat(Infinity);\n values = values.concat(this.walkTokens(tokens, callback));\n });\n }\n else if (genericToken.tokens) {\n values = values.concat(this.walkTokens(genericToken.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n use(...args) {\n const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack };\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if ('renderer' in ext) { // Renderer extensions\n const prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function (...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n }\n else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if ('tokenizer' in ext) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n const extLevel = extensions[ext.level];\n if (extLevel) {\n extLevel.unshift(ext.tokenizer);\n }\n else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n }\n else {\n extensions.startBlock = [ext.start];\n }\n }\n else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n }\n else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = this.defaults.renderer || new _Renderer(this.defaults);\n for (const prop in pack.renderer) {\n if (!(prop in renderer)) {\n throw new Error(`renderer '${prop}' does not exist`);\n }\n if (prop === 'options') {\n // ignore options property\n continue;\n }\n const rendererProp = prop;\n const rendererFunc = pack.renderer[rendererProp];\n const prevRenderer = renderer[rendererProp];\n // Replace renderer with func to run extension, but fall back if false\n renderer[rendererProp] = (...args) => {\n let ret = rendererFunc.apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return ret || '';\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);\n for (const prop in pack.tokenizer) {\n if (!(prop in tokenizer)) {\n throw new Error(`tokenizer '${prop}' does not exist`);\n }\n if (['options', 'rules', 'lexer'].includes(prop)) {\n // ignore options, rules, and lexer properties\n continue;\n }\n const tokenizerProp = prop;\n const tokenizerFunc = pack.tokenizer[tokenizerProp];\n const prevTokenizer = tokenizer[tokenizerProp];\n // Replace tokenizer with func to run extension, but fall back if false\n // @ts-expect-error cannot type tokenizer function dynamically\n tokenizer[tokenizerProp] = (...args) => {\n let ret = tokenizerFunc.apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n const hooks = this.defaults.hooks || new _Hooks();\n for (const prop in pack.hooks) {\n if (!(prop in hooks)) {\n throw new Error(`hook '${prop}' does not exist`);\n }\n if (prop === 'options') {\n // ignore options property\n continue;\n }\n const hooksProp = prop;\n const hooksFunc = pack.hooks[hooksProp];\n const prevHook = hooks[hooksProp];\n if (_Hooks.passThroughHooks.has(prop)) {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (arg) => {\n if (this.defaults.async) {\n return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => {\n return prevHook.call(hooks, ret);\n });\n }\n const ret = hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n }\n else {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (...args) => {\n let ret = hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n }\n opts.hooks = hooks;\n }\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = this.defaults.walkTokens;\n const packWalktokens = pack.walkTokens;\n opts.walkTokens = function (token) {\n let values = [];\n values.push(packWalktokens.call(this, token));\n if (walkTokens) {\n values = values.concat(walkTokens.call(this, token));\n }\n return values;\n };\n }\n this.defaults = { ...this.defaults, ...opts };\n });\n return this;\n }\n setOptions(opt) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n lexer(src, options) {\n return _Lexer.lex(src, options ?? this.defaults);\n }\n parser(tokens, options) {\n return _Parser.parse(tokens, options ?? this.defaults);\n }\n #parseMarkdown(lexer, parser) {\n return (src, options) => {\n const origOpt = { ...options };\n const opt = { ...this.defaults, ...origOpt };\n // Show warning if an extension set async to true but the parse was called with async: false\n if (this.defaults.async === true && origOpt.async === false) {\n if (!opt.silent) {\n console.warn('marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored.');\n }\n opt.async = true;\n }\n const throwError = this.#onError(!!opt.silent, !!opt.async);\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected'));\n }\n if (opt.hooks) {\n opt.hooks.options = opt;\n }\n if (opt.async) {\n return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)\n .then(src => lexer(src, opt))\n .then(tokens => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens)\n .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)\n .then(tokens => parser(tokens, opt))\n .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)\n .catch(throwError);\n }\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src);\n }\n let tokens = lexer(src, opt);\n if (opt.hooks) {\n tokens = opt.hooks.processAllTokens(tokens);\n }\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n let html = parser(tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html);\n }\n return html;\n }\n catch (e) {\n return throwError(e);\n }\n };\n }\n #onError(silent, async) {\n return (e) => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n if (silent) {\n const msg = '<p>An error occurred:</p><pre>'\n + escape$1(e.message + '', true)\n + '</pre>';\n if (async) {\n return Promise.resolve(msg);\n }\n return msg;\n }\n if (async) {\n return Promise.reject(e);\n }\n throw e;\n };\n }\n}\n\nconst markedInstance = new Marked();\nfunction marked(src, opt) {\n return markedInstance.parse(src, opt);\n}\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n marked.setOptions = function (options) {\n markedInstance.setOptions(options);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n };\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\nmarked.defaults = _defaults;\n/**\n * Use Extension\n */\nmarked.use = function (...args) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n/**\n * Run callback for every token\n */\nmarked.walkTokens = function (tokens, callback) {\n return markedInstance.walkTokens(tokens, callback);\n};\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\nconst options = marked.options;\nconst setOptions = marked.setOptions;\nconst use = marked.use;\nconst walkTokens = marked.walkTokens;\nconst parseInline = marked.parseInline;\nconst parse = marked;\nconst parser = _Parser.parse;\nconst lexer = _Lexer.lex;\n\nexport { _Hooks as Hooks, _Lexer as Lexer, Marked, _Parser as Parser, _Renderer as Renderer, _TextRenderer as TextRenderer, _Tokenizer as Tokenizer, _defaults as defaults, _getDefaults as getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens };\n//# sourceMappingURL=marked.esm.js.map\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { marked } from 'marked';\n// Importing these named exports also registers their custom elements\n// (kr-dialog, kr-tab-group, kr-tab, kr-text-field) used by the browse dialog.\nimport { KRFilePreview } from '@kodaris/krubble-components';\nimport { KRHttp } from '@kodaris/krubble-http';\n/** Image extensions the chatbot renders as thumbnails (used when MIME is absent). */\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'webp'];\n/**\n * Video extensions the picker accepts. The AI cannot watch video — these upload\n * and store for playback and tool use only, and the backend tells the model so.\n * Matches what kr-file-preview can play back.\n */\nconst VIDEO_EXTENSIONS = ['mp4', 'webm', 'ogg', 'mov'];\n/**\n * File extensions the picker accepts. Mirrors what the backend can read: the\n * document/spreadsheet family Bedrock ingests, the plain-text family read as\n * fallback, and the image formats. Videos are accepted for upload/storage even\n * though the model can't read them. This is a UX convenience — the backend\n * accepts anything and just tells the model when a type can't be read.\n */\nconst ACCEPTED_FILE_EXTENSIONS = [\n 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'csv', 'html', 'md', 'txt', 'json', 'xml',\n ...IMAGE_EXTENSIONS,\n ...VIDEO_EXTENSIONS,\n];\n/**\n * AI chatbot component with SSE streaming.\n *\n * Accepts a `send` callback that returns a streaming Response (SSE format).\n * Parses the stream for text tokens, status updates, and errors.\n * Dispatches a `stream-event` custom event for every SSE message so consumers can react.\n *\n * ## SSE Stream Format\n * The component expects `data:` lines with JSON payloads containing a `type` field:\n * - `STATUS` — `{ type: \"STATUS\", message: \"Thinking...\" }`\n * - `RESPONSE_PART` — `{ type: \"RESPONSE_PART\", message: \"token text\" }`\n * - `TOOL_RESULT` — `{ type: \"TOOL_RESULT\", message: \"tool_name\", data: {...} }`\n * - `ERROR` — `{ type: \"ERROR\", message: \"Something went wrong\" }`\n * - `HEARTBEAT` — `{ type: \"HEARTBEAT\" }` (ignored)\n *\n * The final event should include `finished: true` to signal stream completion.\n *\n * ## Usage\n * ```html\n * <kr-chatbot\n * label=\"AI Assistant\"\n * .send=${(params) => {\n * return fetch('/api/ai/chat/stream', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json', 'Accept': 'text/event-stream' },\n * credentials: 'include',\n * body: JSON.stringify({ userText: params.message })\n * });\n * }}\n * ></kr-chatbot>\n * ```\n *\n * @slot - Optional slot content displayed above the messages area\n *\n * @fires message-submit - When the user sends a message. Cancelable. Detail: `{ message: string }`\n * @fires stream-event - Dispatched for every SSE message received. Detail contains the parsed event data.\n * @fires conversation-created - When a turn with no target creates a new conversation and the chatbot pins it. Detail: `{ conversation }` (the full conversation object).\n * @fires conversation-title - When the server sends the generated title for a new conversation (end of its first turn). The header label is already updated; this is for consumers with their own chrome to sync (breadcrumbs, tab titles). Detail: `{ title }`.\n */\nlet KRChatbot = class KRChatbot extends LitElement {\n constructor() {\n super(...arguments);\n // --- Private properties ---\n this._reader = null;\n this._decoder = new TextDecoder();\n this._buffer = '';\n this._userHasScrolledUp = false;\n this._isDragging = false;\n this._isResizing = false;\n this._overlay = null;\n this._resizeDir = '';\n this._dragStartX = 0;\n this._dragStartY = 0;\n this._dragStartLeft = 0;\n this._dragStartTop = 0;\n this._resizeStartW = 0;\n this._resizeStartH = 0;\n /** Cursor X at debug-drawer resize start. */\n this._debugResizeStartX = 0;\n /** Debug-drawer width at resize start. */\n this._debugResizeStartW = 0;\n /** Counter for depth-aware dragenter/dragleave tracking. */\n this._dragDepth = 0;\n /** Monotonic id source for pending attachments. */\n this._pendingSeq = 0;\n /**\n * The `aiAnalyze` mode for the next picked files — set when the attach action\n * opens the picker (true = \"Attach Files\", false = \"Attach Files for\n * Reference\"), read by the file-input change handler. Not reactive: it's read\n * synchronously in the change handler, never rendered.\n */\n this._pendingAttachAnalyze = true;\n /**\n * Request-id guards for skill searches — bumped on each search so out-of-order\n * responses are dropped (mirrors the kr-combo-box `_requestId` pattern). Org and\n * global searches run concurrently into separate buffers, so each has its own.\n */\n this._orgSkillRequestId = 0;\n this._globalSkillRequestId = 0;\n this._invocableSkillRequestId = 0;\n /**\n * Codes of global skills with an in-flight enable/disable request. The `+`\n * button reads this to show a pending state and ignore repeat clicks. Mutated\n * in place; call requestUpdate() after changing it to re-render.\n */\n this._globalSkillPending = new Set();\n /**\n * The live Web Speech recognizer while dictating, else null. Not reactive —\n * `_isDictating` drives the UI; this is just the handle used to stop it.\n */\n this._speechRecognition = null;\n /**\n * The composer text as it stood when dictation started. Each `result` event\n * re-reports the whole utterance (final + interim), so the value is rebuilt as\n * this base + the transcript rather than appended to — appending would repeat\n * the interim text on every event.\n */\n this._speechBaseValue = '';\n /**\n * Transcript of utterances the recognizer has marked final this session.\n * Held separately because `results` is pruned in continuous mode on some\n * browsers; without this, earlier sentences would vanish mid-dictation.\n */\n this._speechFinalTranscript = '';\n // --- @property (public API) ---\n /**\n * Callback function for sending messages. Receives the user's message and\n * current conversation history. Must return a Response with a streaming SSE body.\n *\n * Optional — when not set, the chatbot uses its built-in default that streams\n * from the Kodaris Bedrock conversation endpoints. Set this to override.\n */\n this.send = null;\n /**\n * Callback function called on init to load existing conversation messages.\n * Must return a Promise that resolves with an array of KRChatbotMessage.\n *\n * Optional — when not set, the chatbot uses its built-in default that loads\n * existing messages from the Kodaris Bedrock conversation. Set this to override.\n */\n this.load = null;\n /**\n * Conversation messages. Can be set externally for initial messages.\n * Updated internally as the conversation progresses.\n */\n this.messages = [];\n /**\n * Header label text.\n */\n this.label = 'Kat';\n /**\n * Input placeholder text.\n */\n this.placeholder = 'Type a message...';\n /**\n * Whether the chat panel is open. Only relevant in floating mode.\n */\n this.opened = false;\n /**\n * Hide the built-in floating toggle button. Use this when an external\n * control (e.g. the site-editor bar) owns opening the chat — the panel is\n * then driven via the `open()` / `close()` / `toggle()` methods.\n */\n this.hideToggle = false;\n /**\n * Layout mode.\n * - `'floating'` (default): the chatbot is a fixed bottom-right widget with a\n * toggle button, and the panel can be dragged and resized. This is the\n * traditional chat-widget appearance.\n * - `'inline'`: the chatbot drops its fixed positioning and fills its parent\n * container (100% width/height, no border radius/shadow, no toggle, no\n * drag/resize). The panel is always open. Use this to embed the chat as a\n * full page or panel region.\n */\n this.variant = 'floating';\n /**\n * The conversation this chatbot's turns target (backend `conversationID`).\n *\n * - Set → every turn is sent with this `conversationID`, so the chat continues\n * that specific conversation.\n * - Unset → the first turn is sent with `createNew: true` (a fresh\n * conversation); the component then resolves the new conversation's id (via\n * `/conversation/last`) and pins it here so the rest of the session stays one\n * conversation instead of spawning a new one per message.\n *\n * Only used by the built-in `send` default; a custom `send` owns its own\n * targeting.\n */\n this.conversationId = null;\n // --- @state (internal) ---\n this._inputValue = '';\n this._isStreaming = false;\n this._error = '';\n /**\n * User-facing context warning text (`CONVERSATION_TOKEN_WARNING`). Shown as a\n * dismissible banner in all variants. Carries only friendly guidance, no numbers.\n */\n this._contextWarning = '';\n /**\n * True once the conversation hit the context-window limit\n * (`CONVERSATION_LIMIT_REACHED`, or `contextExceeded` on load). Drives a\n * blocking \"start a new conversation\" notice. User-facing, all variants.\n */\n this._contextLimitReached = false;\n /** Server-provided limit text (`CONVERSATION_LIMIT_REACHED`), if any. */\n this._contextLimitMessage = '';\n /**\n * INTERNAL-ONLY latest telemetry snapshot (last-value-wins). Populated from\n * `TOKEN_USAGE` events during streaming and hydrated from the conversation\n * DTO on load. Only surfaced in the `inline` variant's debug panel.\n */\n this._telemetry = null;\n /**\n * INTERNAL-ONLY per-iteration telemetry log for the debug panel's verbose\n * table. Append-only within a turn; reset at the start of each send. Each row\n * may be augmented with its `CACHE_CHECKPOINT` info.\n */\n this._iterationLog = [];\n /** Latest cache-checkpoint info keyed by iteration, for the verbose table. */\n this._cacheCheckpoints = {};\n /** Whether the internal debug panel is expanded (off by default). */\n this._debugPanelOpen = false;\n /** Current width of the debug drawer in px (user-resizable, persisted). */\n this._debugDrawerWidth = 430;\n /** True while the user is dragging the debug drawer's resize handle. */\n this._isDebugResizing = false;\n /** Files staged in the composer, before the message is sent. */\n this._pendingConversationFiles = [];\n /** True while a file is being dragged over the panel (shows the drop overlay). */\n this._isDraggingFile = false;\n /** Whether the `/` skill menu is open above the composer. */\n this._skillMenuOpened = false;\n /** Current `/` query (text after the slash), sent to `_searchOrgSkills`. */\n this._skillQuery = '';\n /**\n * Latest org skill search results (this instance's own skills). Backs the\n * browse dialog's \"Your Org\" tab only — global skills never appear here.\n */\n this._orgSkills = [];\n /**\n * Latest shared-Kodaris (global) skill results, for the browse dialog's\n * \"Kodaris\" tab. Kept separate from `_orgSkills` so switching tabs shows\n * fresh results immediately instead of the other tab's stale list — the browse\n * search fills both buffers at once.\n */\n this._globalSkills = [];\n /**\n * Latest results for the `/` composer menu — everything the current user can\n * actually invoke, merged and role-filtered server-side by\n * `/conversation/availableSkills`. A separate buffer from the two browse-tab lists\n * so installed globals in the menu never leak into the \"Your Org\" tab.\n */\n this._invocableSkills = [];\n /**\n * AI framework UI config flags fetched from `aiFrameworkConfig` on connect.\n * `debugTelemetryEnabled` (same server-side gate as TOKEN_USAGE emission) turns\n * on the debug drawer toggle and the `/test-context-warning` / `/test-context-limit` composer\n * options — known up front, before any message.\n */\n this._aiFrameworkConfig = {};\n /** Highlighted item in the skill menu for keyboard navigation (-1 = none). */\n this._skillHighlighted = 0;\n /** Index of the message whose copy button just flashed \"Copied\" (-1 = none). */\n this._copiedIndex = -1;\n /** Whether the \"Browse all skills\" dialog is open. */\n this._skillBrowseOpened = false;\n /**\n * Active tab in the browse dialog. `org` shows `_orgSkills` (this instance's\n * skills); `kodaris` shows `_globalSkills` (the shared global catalog).\n */\n this._skillBrowseSource = 'org';\n /** Search text in the browse dialog, routed to the active tab's search. */\n this._skillBrowseQuery = '';\n /** True while the mic is live and speech is being transcribed into the composer. */\n this._isDictating = false;\n /**\n * Close the `/` skill menu when the click lands outside it.\n *\n * Bound at the document because a click anywhere — including outside this\n * component entirely — should dismiss the menu. `composedPath()` rather than\n * `e.target` since the menu lives in this component's shadow root, where\n * `target` on a document listener is retargeted to the host element and every\n * inside click would look like an outside one.\n */\n this._handleDocumentClick = (e) => {\n if (!this._skillMenuOpened) {\n return;\n }\n // Excluded: the textarea, since clicking it keeps editing the same `/` command\n // and dismissing there would fight the user still typing it; and the plus\n // button, which owns the menu's open/close itself. The plus exclusion matters\n // in both directions — this listener runs after the button's own handler, so\n // without it a click that just opened the menu would immediately close it\n // again, and a click meant to toggle it shut would be double-handled.\n const path = e.composedPath();\n if (path.some((el) => el instanceof HTMLElement && (el.classList.contains('skill-menu') || el.classList.contains('input') || el.classList.contains('input-plus')))) {\n return;\n }\n this._skillMenuOpened = false;\n };\n this._handleMouseMove = (e) => {\n if (this._isDragging) {\n let newLeft = this._dragStartLeft + (e.clientX - this._dragStartX);\n let newTop = this._dragStartTop + (e.clientY - this._dragStartY);\n const w = this._panelEl.offsetWidth;\n newLeft = Math.max(-w + 48, Math.min(newLeft, window.innerWidth - 48));\n newTop = Math.max(0, Math.min(newTop, window.innerHeight - 48));\n this._panelEl.style.left = newLeft + 'px';\n this._panelEl.style.top = newTop + 'px';\n }\n else if (this._isResizing) {\n const dx = e.clientX - this._dragStartX;\n const dy = e.clientY - this._dragStartY;\n const minW = 340;\n const minH = 380;\n const maxW = window.innerWidth * 0.9;\n const maxH = window.innerHeight - 72;\n let newW = this._resizeStartW;\n let newH = this._resizeStartH;\n let newLeft = this._dragStartLeft;\n let newTop = this._dragStartTop;\n if (this._resizeDir.includes('e')) {\n newW = Math.max(minW, Math.min(this._resizeStartW + dx, maxW));\n }\n if (this._resizeDir.includes('w')) {\n newW = Math.max(minW, Math.min(this._resizeStartW - dx, maxW));\n newLeft = this._dragStartLeft + (this._resizeStartW - newW);\n }\n if (this._resizeDir.includes('s')) {\n newH = Math.max(minH, Math.min(this._resizeStartH + dy, maxH));\n }\n if (this._resizeDir.includes('n')) {\n newH = Math.max(minH, Math.min(this._resizeStartH - dy, maxH));\n newTop = this._dragStartTop + (this._resizeStartH - newH);\n }\n newLeft = Math.max(0, newLeft);\n newTop = Math.max(0, newTop);\n this._panelEl.style.width = newW + 'px';\n this._panelEl.style.height = newH + 'px';\n this._panelEl.style.left = newLeft + 'px';\n this._panelEl.style.top = newTop + 'px';\n }\n };\n this._handleMouseUp = () => {\n if (this._isDragging) {\n this._isDragging = false;\n this._panelEl.classList.remove('panel--dragging');\n }\n if (this._isResizing) {\n this._isResizing = false;\n this._panelEl.classList.remove('panel--resizing');\n }\n if (this._overlay) {\n this._overlay.style.display = 'none';\n }\n document.removeEventListener('mousemove', this._handleMouseMove);\n document.removeEventListener('mouseup', this._handleMouseUp);\n this._saveState();\n };\n this._handleDebugResizeMouseMove = (e) => {\n if (!this._isDebugResizing) {\n return;\n }\n // Handle is on the drawer's left edge; dragging left (negative dx) widens it.\n const dx = e.clientX - this._debugResizeStartX;\n const minW = 300;\n // Never let the chat column shrink below 300px — cap the drawer at the\n // container width minus that reserved chat width.\n const minChatWidth = 300;\n const maxW = Math.max(minW, this.offsetWidth - minChatWidth);\n this._debugDrawerWidth = Math.max(minW, Math.min(this._debugResizeStartW - dx, maxW));\n };\n this._handleDebugResizeMouseUp = () => {\n this._isDebugResizing = false;\n document.removeEventListener('mousemove', this._handleDebugResizeMouseMove);\n document.removeEventListener('mouseup', this._handleDebugResizeMouseUp);\n this._saveState();\n };\n }\n // --- Lifecycle ---\n connectedCallback() {\n super.connectedCallback();\n // Default to loading a conversation's messages when the consumer hasn't\n // provided their own `load`. With `conversationId` set we rebuild that\n // conversation; with none set the user wants a NEW conversation, so we start\n // blank (no resume — the first message creates one via `send`). Rows already\n // match KRChatbotMessage ({ type, content }); we only parse each row's\n // `conversationFileIDs` (a JSON array string of ids) into `conversationFiles`.\n if (!this.load) {\n this.load = () => {\n if (this.conversationId == null) {\n return Promise.resolve([]);\n }\n return KRHttp.fetch({ url: `/api/system/conversation/${this.conversationId}/messages` })\n .then((r) => r.json())\n .then((res) => Promise.all((res?.data || []).map((msg) => {\n // Resolve this message's `conversationFileIDs` (a JSON array string of\n // ids) into full file objects — each fetch response IS the\n // KRChatbotConversationFile (id + niceName + mimeType), and niceName\n // drives the previewer's file-type detection. A failed fetch drops\n // that file rather than rendering a broken thumbnail.\n let ids = [];\n try {\n ids = JSON.parse(msg.conversationFileIDs || '[]');\n }\n catch { /* no/invalid attachments — leave empty */ }\n if (!ids.length) {\n return Promise.resolve(msg);\n }\n return Promise.all(ids.map((id) => KRHttp.fetch({ url: `/api/system/conversationFile/${id}` })\n .then((r) => r.json())\n .then((meta) => meta?.data)\n .catch(() => null)))\n .then((files) => {\n msg.conversationFiles = files.filter((f) => f != null);\n return msg;\n });\n })));\n };\n }\n this.load().then((messages) => {\n if (messages && messages.length) {\n this.messages = messages;\n }\n }).catch(() => { });\n // Fetch the framework config on load (debugTelemetryEnabled, v2ChatEnabled,\n // registryServer). debugTelemetryEnabled gates the debug affordances and is\n // known before any message.\n KRHttp.fetch({\n url: '/api/system/integration/aws/bedrock/aiFrameworkConfig',\n })\n .then((r) => r.json())\n .then((res) => {\n this._aiFrameworkConfig = res?.data || {};\n })\n .catch(() => { });\n // Inline mode fills its container and is always open — the floating widget's\n // toggle/drag/resize state doesn't apply, but the composer message and debug\n // drawer state (restored inside _restoreState) do.\n if (this.variant === 'inline') {\n this.opened = true;\n }\n this._restoreState();\n document.addEventListener('click', this._handleDocumentClick);\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this._reader) {\n this._reader.cancel();\n this._reader = null;\n }\n document.removeEventListener('mousemove', this._handleMouseMove);\n document.removeEventListener('mouseup', this._handleMouseUp);\n document.removeEventListener('click', this._handleDocumentClick);\n // Release the mic if the chatbot is torn down mid-dictation — otherwise the\n // recognizer keeps the browser's recording indicator lit with nothing to\n // transcribe into. abort() (not stop()) since the discarded text has nowhere to go.\n if (this._speechRecognition) {\n this._speechRecognition.abort();\n this._speechRecognition = null;\n this._isDictating = false;\n }\n // Release any object URLs still held by staged attachments.\n this._pendingConversationFiles.forEach((p) => {\n if (p.previewUrl) {\n URL.revokeObjectURL(p.previewUrl);\n }\n });\n }\n updated(changed) {\n if (changed.has('messages')) {\n if (!this._userHasScrolledUp && !this._isStreaming && this._messagesEl) {\n requestAnimationFrame(() => {\n if (this._messagesEl) {\n this._messagesEl.scrollTop = this._messagesEl.scrollHeight;\n }\n });\n }\n }\n if (changed.has('opened') && this.opened && this._inputEl) {\n setTimeout(() => {\n if (this._inputEl) {\n this._inputEl.focus();\n }\n }, 200);\n }\n // Position the fixed skill menu above the composer, following the krubble\n // select-field pattern (fixed element positioned from the trigger's rect).\n if (this._skillMenuOpened) {\n this._positionSkillMenu();\n }\n // Keep the keyboard-highlighted skill scrolled into view.\n if (changed.has('_skillHighlighted') && this._skillMenuOpened) {\n this._skillMenuEl\n ?.querySelector('.skill-menu__item--highlighted')\n ?.scrollIntoView({ block: 'nearest' });\n }\n }\n /** Anchor the fixed skill menu to the composer, opening upward above it. */\n _positionSkillMenu() {\n requestAnimationFrame(() => {\n if (!this._skillMenuEl || !this._inputWrapperEl) {\n return;\n }\n const inputRect = this._inputWrapperEl.getBoundingClientRect();\n this._skillMenuEl.style.left = inputRect.left + 'px';\n this._skillMenuEl.style.width = inputRect.width + 'px';\n // Bound the menu by the chat panel's own top edge so it stays within the\n // widget. In floating mode that keeps it inside the card; in inline mode the\n // panel top sits just below the app header/breadcrumb, so it stays clear of\n // those too. An 8px gap keeps it off both edges.\n const topLimit = this._panelEl.getBoundingClientRect().top + 8;\n const spaceAbove = inputRect.top - 8 - topLimit;\n this._skillMenuEl.style.maxHeight = spaceAbove + 'px';\n // Measure after the cap is applied so the upward anchor uses the real\n // height, then clamp the top edge to the panel bound.\n const menuRect = this._skillMenuEl.getBoundingClientRect();\n const top = Math.max(topLimit, inputRect.top - menuRect.height - 8);\n this._skillMenuEl.style.top = top + 'px';\n });\n }\n // --- Public methods ---\n /**\n * Stops the current stream without clearing the conversation.\n */\n stop() {\n this._handleStop();\n }\n /** Whether a turn is in flight — true from send until the stream ends. */\n isStreaming() {\n return this._isStreaming;\n }\n /** Open the chat panel. */\n open() {\n if (!this.opened) {\n this._handleToggle();\n }\n }\n /** Close the chat panel. */\n close() {\n if (this.opened) {\n this._handleToggle();\n }\n }\n /** Toggle the chat panel open/closed. */\n toggle() {\n this._handleToggle();\n }\n // --- Private methods ---\n /**\n * Shows a full-viewport transparent overlay during drag/resize operations.\n *\n * This overlay solves a critical rendering issue when the chatbot is used inside\n * a page that contains iframes (e.g., the AI editor shell where the page content\n * is rendered in an iframe and the chatbot floats on top).\n *\n * Without the overlay, modifying the iframe's `pointer-events` style during drag\n * (to prevent it from swallowing mousemove events) causes Chrome to recalculate\n * compositing layers. This layer recalculation blocks the browser from repainting\n * the chatbot panel's style changes (width/height/position) even though they are\n * correctly applied to the DOM. The result is that the panel appears frozen while\n * the user drags, despite the inline styles updating on every mousemove.\n *\n * The overlay approach avoids this entirely: instead of touching the iframe's styles,\n * we place a transparent div (z-index 9999) above the iframe but below the chatbot\n * (z-index 10000). This div intercepts all mouse events that would otherwise hit the\n * iframe, without triggering any compositing layer changes on the iframe itself.\n */\n _showOverlay() {\n if (!this._overlay) {\n this._overlay = document.createElement('div');\n this._overlay.style.cssText = 'position:fixed; inset:0; z-index:9999; display:none;';\n document.body.appendChild(this._overlay);\n }\n this._overlay.style.display = 'block';\n }\n _handleHeaderMouseDown(e) {\n // Inline mode fills its parent — dragging the panel doesn't apply.\n if (this.variant === 'inline') {\n return;\n }\n // Ignore clicks on buttons inside the header\n if (e.target.closest('button')) {\n return;\n }\n if (!this._panelEl) {\n return;\n }\n this._isDragging = true;\n this._panelEl.classList.add('panel--dragging');\n this._showOverlay();\n const rect = this._panelEl.getBoundingClientRect();\n this._panelEl.style.left = rect.left + 'px';\n this._panelEl.style.top = rect.top + 'px';\n this._panelEl.style.right = 'auto';\n this._panelEl.style.bottom = 'auto';\n this._panelEl.style.position = 'fixed';\n this._dragStartX = e.clientX;\n this._dragStartY = e.clientY;\n this._dragStartLeft = rect.left;\n this._dragStartTop = rect.top;\n e.preventDefault();\n document.addEventListener('mousemove', this._handleMouseMove);\n document.addEventListener('mouseup', this._handleMouseUp);\n }\n _handleResizeMouseDown(e) {\n // Inline mode fills its parent — resizing the panel doesn't apply.\n if (this.variant === 'inline') {\n return;\n }\n if (!this._panelEl) {\n return;\n }\n this._isResizing = true;\n this._resizeDir = e.currentTarget.dataset.dir || '';\n this._panelEl.classList.add('panel--resizing');\n this._showOverlay();\n const rect = this._panelEl.getBoundingClientRect();\n this._panelEl.style.left = rect.left + 'px';\n this._panelEl.style.top = rect.top + 'px';\n this._panelEl.style.right = 'auto';\n this._panelEl.style.bottom = 'auto';\n this._panelEl.style.position = 'fixed';\n this._dragStartX = e.clientX;\n this._dragStartY = e.clientY;\n this._dragStartLeft = rect.left;\n this._dragStartTop = rect.top;\n this._resizeStartW = rect.width;\n this._resizeStartH = rect.height;\n e.preventDefault();\n e.stopPropagation();\n document.addEventListener('mousemove', this._handleMouseMove);\n document.addEventListener('mouseup', this._handleMouseUp);\n }\n _handleToggle() {\n this.opened = !this.opened;\n if (this.opened && this._panelEl) {\n this._applyStoredLayout();\n }\n this._saveState();\n }\n _saveState() {\n try {\n const state = {\n opened: String(this.opened),\n message: this._inputValue,\n debugPanelOpen: String(this._debugPanelOpen),\n debugDrawerWidth: String(this._debugDrawerWidth),\n };\n if (this._panelEl) {\n const s = this._panelEl.style;\n if (s.left) {\n state.left = s.left;\n }\n if (s.top) {\n state.top = s.top;\n }\n if (s.width) {\n state.width = s.width;\n }\n if (s.height) {\n state.height = s.height;\n }\n if (s.position) {\n state.position = s.position;\n }\n }\n localStorage.setItem('kr-chatbot-state', JSON.stringify(state));\n }\n catch { /* localStorage not available */ }\n }\n _restoreState() {\n try {\n const raw = localStorage.getItem('kr-chatbot-state');\n if (!raw) {\n return;\n }\n const state = JSON.parse(raw);\n // Draft text and the debug drawer are persisted for all variants.\n // A lone `/` is dropped — it's the in-progress half of a menu interaction,\n // not a draft, and restoring it would revive a stale menu the user never\n // used. Anything with an actual command after the slash (`/code`, `/code do\n // the thing`) is a real draft and restores normally. Trimmed before testing\n // so a stray space around the slash doesn't defeat the check.\n if (typeof state.message === 'string' && state.message.trim() !== '/') {\n this._inputValue = state.message;\n }\n this._debugPanelOpen = state.debugPanelOpen === 'true';\n const w = Number(state.debugDrawerWidth);\n if (w >= 300) {\n this._debugDrawerWidth = w;\n }\n // The floating widget's open/layout state doesn't apply to inline mode.\n if (this.variant !== 'inline' && state.opened === 'true') {\n this.opened = true;\n // Apply layout after first render\n this.updateComplete.then(() => this._applyStoredLayout());\n }\n }\n catch { /* localStorage not available */ }\n }\n _applyStoredLayout() {\n try {\n const raw = localStorage.getItem('kr-chatbot-state');\n if (!raw || !this._panelEl) {\n return;\n }\n const state = JSON.parse(raw);\n if (state.position) {\n this._panelEl.style.position = state.position;\n }\n if (state.left) {\n this._panelEl.style.left = state.left;\n }\n if (state.top) {\n this._panelEl.style.top = state.top;\n }\n if (state.width) {\n this._panelEl.style.width = state.width;\n }\n if (state.height) {\n this._panelEl.style.height = state.height;\n }\n }\n catch { /* localStorage not available */ }\n }\n _handleInputChange(e) {\n this._inputValue = e.target.value;\n this._saveState();\n // Auto-resize textarea\n const textarea = e.target;\n textarea.style.height = 'auto';\n textarea.style.height = Math.min(textarea.scrollHeight, 120) + 'px';\n // Open the skill menu while the message is a `/` command being typed (a\n // leading slash with no space yet). The text after the slash is the search\n // query, run server-side via `_searchInvocableSkills`.\n // (org skills + installed globals — everything invocable by /code)\n const slashMatch = this._inputValue.match(/^\\/(\\S*)$/);\n if (slashMatch) {\n this._skillMenuOpened = true;\n this._skillQuery = slashMatch[1];\n this._skillHighlighted = 0;\n this._searchInvocableSkills(this._skillQuery);\n }\n else {\n this._skillMenuOpened = false;\n }\n }\n _handleKeyDown(e) {\n // When the skill menu is open, arrow keys / Enter / Escape drive it. The top\n // actions (Attach Files, Attach Files for Reference, Browse All Skills, plus\n // the two debug test triggers when enabled) come first, then the filtered\n // skills — all one navigable list.\n if (this._skillMenuOpened) {\n const debugActions = this.variant === 'inline' && this._aiFrameworkConfig.debugTelemetryEnabled === true;\n let actionCount = 3;\n if (debugActions) {\n actionCount = 5;\n }\n const count = actionCount + this._invocableSkills.length;\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n this._skillHighlighted = (this._skillHighlighted + 1) % count;\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n this._skillHighlighted = (this._skillHighlighted - 1 + count) % count;\n return;\n }\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n this._activateSkillMenuItem(this._skillHighlighted);\n return;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n this._skillMenuOpened = false;\n return;\n }\n }\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n this._handleSubmit();\n }\n }\n /** Run the skill-menu item at the given flat index (actions first, then skills). */\n _activateSkillMenuItem(index) {\n const debugActions = this.variant === 'inline' && this._aiFrameworkConfig.debugTelemetryEnabled === true;\n let actionCount = 3;\n if (debugActions) {\n actionCount = 5;\n }\n if (index === 0) {\n this._openFilePicker(true);\n return;\n }\n if (index === 1) {\n this._openFilePicker(false);\n return;\n }\n if (index === 2) {\n this._handleSkillBrowseOpen();\n return;\n }\n if (debugActions && index === 3) {\n this._skillMenuOpened = false;\n this._send({\n message: '/test-context-warning',\n conversationFiles: [],\n });\n return;\n }\n if (debugActions && index === 4) {\n this._skillMenuOpened = false;\n this._send({\n message: '/test-context-limit',\n conversationFiles: [],\n });\n return;\n }\n const skill = this._invocableSkills[index - actionCount];\n if (skill) {\n this._handleSkillSelect(skill);\n }\n }\n // --- Skills ---\n /**\n * Search the Kodaris AI skills index and store the results in `_orgSkills` — the\n * browse dialog's \"Your Org\" tab. Mirrors the backend's own skill search (BM25\n * over name^3/description^2/instructions, active-only). An empty query uses\n * match_all — multi_match with an empty string matches nothing, so the \"show\n * everything\" case needs it.\n *\n * Follows the kr-combo-box `_fetch` pattern: a request-id guard drops responses\n * that arrive out of order. `/aiskills/search` returns a raw OpenSearch response,\n * so we lift each hit's `_source` (already in KRChatbotSkill shape) out.\n */\n _searchOrgSkills(query) {\n this._orgSkillRequestId++;\n const requestId = this._orgSkillRequestId;\n const trimmed = query.trim();\n // An empty query matches everything; otherwise substring-match the query\n // against name/code/description. We use case-insensitive wildcard queries on\n // the `.raw` keyword subfields so \"ord\" matches anywhere in \"Create Order\"\n // (a plain match/multi_match only matches whole tokens). Escape the wildcard\n // specials so user input is treated literally, then wrap with `*...*`.\n let must = { match_all: {} };\n if (trimmed) {\n must = {\n bool: {\n should: [\n {\n wildcard: {\n 'name.raw': {\n value: `*${trimmed.replace(/([*?\\\\])/g, '\\\\$1')}*`,\n case_insensitive: true,\n }\n }\n },\n {\n wildcard: {\n 'code.raw': {\n value: `*${trimmed.replace(/([*?\\\\])/g, '\\\\$1')}*`,\n case_insensitive: true,\n }\n }\n },\n {\n wildcard: {\n 'description.raw': {\n value: `*${trimmed.replace(/([*?\\\\])/g, '\\\\$1')}*`,\n case_insensitive: true,\n }\n }\n },\n ],\n minimum_should_match: 1,\n },\n };\n }\n KRHttp.fetch({\n url: '/api/system/opensearch/aiskills/search',\n method: 'POST',\n body: {\n size: 100,\n query: {\n bool: {\n must: [must],\n filter: [{ term: { active: true } }],\n // The \"Your Org\" tab lists only this instance's own skills. Globally-\n // published skills belong to the \"Kodaris\" tab (fed by the registry),\n // so exclude them here. Documents without the field aren't matched by\n // the term, so ordinary org skills are kept.\n must_not: [{ term: { globalPublished: true } }],\n },\n },\n },\n })\n .then((r) => r.json())\n .then((res) => {\n // Ignore a stale response superseded by a newer search.\n if (requestId !== this._orgSkillRequestId) {\n return;\n }\n this._orgSkills = (res?.data?.hits?.hits || []).map((hit) => hit._source);\n })\n .catch((error) => {\n console.error('kr-chatbot: skill search failed', error);\n });\n }\n /**\n * Load the skills for the `/` composer menu into `_invocableSkills` from\n * `/conversation/availableSkills` — this instance's own skills plus the installed\n * global ones, already merged, role-filtered and ranked by the server. That's the\n * same set the model sees via `list_skills`, so the menu can't offer a skill the\n * chat would then refuse.\n *\n * Not the `aiskills` endpoints the browse dialog's Org tab uses: those require a\n * skill-authoring role, which an ordinary chat user doesn't have.\n *\n * Request-id guard drops responses that arrive out of order (kr-combo-box `_fetch`\n * pattern).\n */\n _searchInvocableSkills(query) {\n this._invocableSkillRequestId++;\n const requestId = this._invocableSkillRequestId;\n KRHttp.fetch({\n url: '/api/system/conversation/availableSkills',\n method: 'POST',\n body: { query: query.trim() },\n })\n .then((r) => r.json())\n .then((res) => {\n // Ignore a stale response superseded by a newer search.\n if (requestId !== this._invocableSkillRequestId) {\n return;\n }\n this._invocableSkills = (res?.data || []);\n })\n .catch((error) => {\n console.error('kr-chatbot: invocable skill search failed', error);\n });\n }\n /**\n * Load the browse dialog's \"Kodaris\" tab into `_globalSkills` — the full Kodaris\n * catalog, installed or not, each row carrying `enabled` = installed here.\n *\n * Uses `/conversation/globalSkillCatalog` rather than the `/aiskills/global/search`\n * twin, which requires a skill-authoring role an ordinary chat user doesn't have.\n * Both return the same catalog in `KRChatbotSkill` shape\n * (`data: [{ code, name, description, enabled }]`), so no `_source` lifting is needed.\n */\n _searchGlobalSkills(query) {\n this._globalSkillRequestId++;\n const requestId = this._globalSkillRequestId;\n KRHttp.fetch({\n url: '/api/system/conversation/globalSkillCatalog',\n method: 'POST',\n body: { query: query.trim() },\n })\n .then((r) => r.json())\n .then((res) => {\n // Ignore a stale response superseded by a newer search.\n if (requestId !== this._globalSkillRequestId) {\n return;\n }\n this._globalSkills = (res?.data || []);\n })\n .catch((error) => {\n console.error('kr-chatbot: global skill search failed', error);\n });\n }\n /**\n * Enable or disable a global skill on this instance via\n * `/aiskills/global/{code}/enabled`, then reflect the server's result on the\n * matching card. Ignores clicks while a request for the same code is pending.\n */\n _handleGlobalSkillEnable(skill, e) {\n // The card body inserts the skill; the install button must not also do that.\n e.stopPropagation();\n if (this._globalSkillPending.has(skill.code)) {\n return;\n }\n // Drive the clicked button's own spinner (KRButton disables itself while\n // loading, so a second click can't fire until the request settles).\n const btn = e.currentTarget;\n this._globalSkillPending.add(skill.code);\n btn?.showLoading();\n KRHttp.fetch({\n url: `/api/system/opensearch/aiskills/global/${encodeURIComponent(skill.code)}/enabled`,\n method: 'POST',\n body: { enabled: !skill.enabled },\n })\n .then((r) => r.json())\n .then((res) => {\n // Reflect the server's returned flag on the card. The button label/style\n // re-render from skill.enabled; reset() clears the spinner to idle.\n skill.enabled = res?.data?.enabled;\n btn?.reset();\n this.requestUpdate();\n })\n .catch((error) => {\n console.error('kr-chatbot: global skill enable failed', error);\n btn?.showError('Error');\n })\n .finally(() => {\n this._globalSkillPending.delete(skill.code);\n });\n }\n /** The `+` button toggles the skill/attachment menu open (showing all skills). */\n _handlePlusClick() {\n if (this._skillMenuOpened) {\n this._skillMenuOpened = false;\n return;\n }\n this._skillQuery = '';\n this._skillHighlighted = 0;\n this._skillMenuOpened = true;\n this._searchInvocableSkills('');\n }\n /**\n * The mic button toggles dictation. Speech is transcribed straight into the\n * composer as editable text — the user still reviews and presses send, so a\n * misheard word is fixable and nothing is sent by voice alone.\n *\n * Recognition runs entirely in the browser's Web Speech API (Chrome/Edge send\n * audio to Google's service, Safari to Apple's). No audio reaches Kodaris, and\n * there's no backend call or cost on our side.\n */\n _handleMicClick() {\n // Second click stops. `stop()` flushes the pending utterance as a final\n // result, so the last words aren't lost; onend clears the state.\n if (this._speechRecognition) {\n this._speechRecognition.stop();\n return;\n }\n // Prefixed in Chrome/Edge/Safari; the unprefixed name is checked first for\n // whenever they drop the prefix. The mic button isn't rendered without one of\n // these, so reaching here unsupported means a mid-session change — bail quietly.\n const SpeechRecognitionCtor = window.SpeechRecognition || window.webkitSpeechRecognition;\n if (!SpeechRecognitionCtor) {\n return;\n }\n const recognition = new SpeechRecognitionCtor();\n // Keep listening through natural pauses — a chat message is often several\n // sentences, and the default stops at the first one.\n recognition.continuous = true;\n // Show words as they're recognized rather than only at end of utterance.\n recognition.interimResults = true;\n // `lang` is deliberately left unset so the recognizer follows the page/OS\n // language, which is correct for every consumer of this component.\n // Dictation ADDS to whatever is already typed rather than replacing it, so\n // the user can type half a message and speak the rest. The separating space\n // is part of the base so the transcript never runs into the existing word.\n this._speechBaseValue = this._inputValue;\n if (this._speechBaseValue && !this._speechBaseValue.endsWith(' ')) {\n this._speechBaseValue += ' ';\n }\n this._speechFinalTranscript = '';\n recognition.onresult = (e) => {\n // Everything from resultIndex on is new since the last event: finalized\n // pieces move to _speechFinalTranscript permanently, while non-final ones\n // are rebuilt each event because the browser revises its guess as it hears\n // more. Rebuilding the whole value (base + final + interim) is what keeps\n // those revisions from stacking up as duplicated text.\n let interim = '';\n for (let i = e.resultIndex; i < e.results.length; i++) {\n if (e.results[i].isFinal) {\n this._speechFinalTranscript += e.results[i][0].transcript;\n }\n else {\n interim += e.results[i][0].transcript;\n }\n }\n this._inputValue = this._speechBaseValue + this._speechFinalTranscript + interim;\n this._saveState();\n // Grow the textarea as dictated text wraps — the same clamp the typing path\n // uses, since @input doesn't fire for programmatic value changes.\n if (this._inputEl) {\n this._inputEl.style.height = 'auto';\n this._inputEl.style.height = Math.min(this._inputEl.scrollHeight, 120) + 'px';\n }\n };\n recognition.onerror = (e) => {\n // Denied mic permission is the one error worth explaining — the user has to\n // fix it in browser settings, and the button would otherwise look broken.\n if (e.error === 'not-allowed' || e.error === 'service-not-allowed') {\n this._error = 'Microphone access is blocked. Allow it in your browser settings to use voice input.';\n return;\n }\n // `no-speech` (silence) and `aborted` (user stopped) are normal; anything\n // else is a transient service hiccup. onend still runs, so the mic resets.\n };\n // Fires on stop(), on error, and when the browser ends recognition on its own\n // (e.g. a long silence) — the single place the live state is torn down.\n recognition.onend = () => {\n this._speechRecognition = null;\n this._isDictating = false;\n };\n // start() is what triggers the browser's mic permission prompt.\n this._speechRecognition = recognition;\n this._isDictating = true;\n this._error = '';\n recognition.start();\n this._inputEl?.focus();\n }\n /** Insert `/code ` into the composer and focus it, ready for the message. */\n _handleSkillSelect(skill) {\n // A global skill must be installed before it can be chosen — inserting /code\n // for one not enabled on this instance would just fail. `enabled` is only set\n // on global skills (false = not installed); org skills leave it undefined and\n // are always selectable. So an uninstalled global card click does nothing.\n if (skill.enabled === false) {\n return;\n }\n this._inputValue = `/${skill.code} `;\n this._saveState();\n this._skillMenuOpened = false;\n this._skillBrowseOpened = false;\n this._inputEl?.focus();\n }\n /** Activate a skill card via keyboard (Enter/Space), since it's a div role=button. */\n _handleSkillCardKeydown(e, skill) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._handleSkillSelect(skill);\n }\n }\n /** Copy a message's text to the clipboard and briefly flash \"Copied\". */\n _handleCopyMessage(content, index) {\n navigator.clipboard.writeText(content).then(() => {\n this._copiedIndex = index;\n setTimeout(() => {\n if (this._copiedIndex === index) {\n this._copiedIndex = -1;\n }\n }, 2000);\n }).catch(() => { });\n }\n _handleSkillBrowseOpen() {\n this._skillMenuOpened = false;\n this._skillBrowseQuery = '';\n this._skillBrowseOpened = true;\n // Fill both tabs up front so switching between them is instant, not stale.\n this._searchOrgSkills('');\n this._searchGlobalSkills('');\n }\n _handleSkillBrowseClose() {\n this._skillBrowseOpened = false;\n }\n _handleSkillBrowseSearch(e) {\n this._skillBrowseQuery = e.target.value;\n // Filter both catalogs so whichever tab the user switches to is already current.\n this._searchOrgSkills(this._skillBrowseQuery);\n this._searchGlobalSkills(this._skillBrowseQuery);\n }\n _handleSkillBrowseTabChange(e) {\n // Both buffers are kept current by open/search, so switching just swaps which\n // one is shown — no re-search needed.\n this._skillBrowseSource = e.detail.activeTabId;\n }\n // --- Attachments ---\n /**\n * Open the OS file picker. `aiAnalyze` records which attach action was used so\n * the change handler stages the picked files in the right mode: true for\n * \"Attach Files\" (the model reads them), false for \"Attach Files for Reference\"\n * (attached for a tool to act on — the model is told about them but not asked\n * to read them). Chosen once at the picker, so selecting 30 files never means\n * toggling 30 chips.\n */\n _openFilePicker(aiAnalyze = true) {\n // Close the skill/attachment menu — opening the OS file picker is the end of\n // the menu interaction, and the picker is a separate window so the menu would\n // otherwise linger open behind it (and after a file is chosen).\n this._skillMenuOpened = false;\n // A lone `/` was only the means of reaching this action, so it shouldn't be\n // left behind in the composer once the picker opens. Nothing else is touched:\n // a real command (`/code`) stays because `/code` plus an attachment is a valid\n // invocation, and the plus button reaches this same method with an arbitrary\n // draft in the composer, which must survive.\n if (this._inputValue.trim() === '/') {\n this._inputValue = '';\n this._saveState();\n }\n this._pendingAttachAnalyze = aiAnalyze;\n this._fileInputEl?.click();\n }\n _handleFileInputChange(e) {\n const input = e.target;\n if (input.files) {\n this._addFiles(input.files, this._pendingAttachAnalyze);\n }\n // Reset so picking the same file again re-fires change.\n input.value = '';\n }\n _handlePaste(e) {\n const items = e.clipboardData?.items;\n if (!items) {\n return;\n }\n const files = [];\n for (let i = 0; i < items.length; i++) {\n if (items[i].kind === 'file') {\n const file = items[i].getAsFile();\n if (file) {\n files.push(file);\n }\n }\n }\n if (files.length) {\n e.preventDefault();\n this._addFiles(files);\n }\n }\n _handleDragEnter(e) {\n if (!this._hasFiles(e)) {\n return;\n }\n e.preventDefault();\n this._dragDepth++;\n this._isDraggingFile = true;\n }\n _handleDragOver(e) {\n if (!this._hasFiles(e)) {\n return;\n }\n // Required so the drop event fires.\n e.preventDefault();\n }\n _handleDragLeave(e) {\n if (!this._hasFiles(e)) {\n return;\n }\n this._dragDepth--;\n if (this._dragDepth <= 0) {\n this._dragDepth = 0;\n this._isDraggingFile = false;\n }\n }\n _handleDrop(e) {\n if (!this._hasFiles(e)) {\n return;\n }\n e.preventDefault();\n this._dragDepth = 0;\n this._isDraggingFile = false;\n if (e.dataTransfer?.files) {\n this._addFiles(e.dataTransfer.files);\n }\n }\n _hasFiles(e) {\n return Array.from(e.dataTransfer?.types || []).includes('Files');\n }\n /** Lower-cased extension of a filename (without the dot), or '' if none. */\n _getFileExtension(name) {\n const dot = name.lastIndexOf('.');\n if (dot < 0) {\n return '';\n }\n return name.slice(dot + 1).toLowerCase();\n }\n /**\n * Stage a set of files in the composer (held locally until send). `aiAnalyze`\n * comes from which attach action was used — true for \"Attach Files\" (the model\n * reads them), false for \"Attach Files for Reference\" (tool-only, not read).\n * Drag-and-drop and paste default to analyze.\n */\n _addFiles(fileList, aiAnalyze = true) {\n // Only accept what the picker's `accept` filter allows (extension-based, so a\n // drag/paste can't sneak in a type the picker itself wouldn't offer).\n const files = Array.from(fileList).filter((f) => ACCEPTED_FILE_EXTENSIONS.includes(this._getFileExtension(f.name)));\n if (!files.length) {\n return;\n }\n files.forEach((file) => {\n // Only images get a local preview thumbnail; documents (and videos, which are\n // tiles too) render an icon. Prefer the File's MIME, falling back to the\n // extension when it's absent.\n let previewUrl;\n if (file.type.startsWith('image/') || IMAGE_EXTENSIONS.includes(this._getFileExtension(file.name))) {\n previewUrl = URL.createObjectURL(file);\n }\n const pending = {\n localId: 'att-' + this._pendingSeq++,\n file,\n name: file.name,\n mimeType: file.type,\n previewUrl,\n aiAnalyze,\n };\n this._pendingConversationFiles = [...this._pendingConversationFiles, pending];\n });\n }\n _handlePendingRemove(localId) {\n const target = this._pendingConversationFiles.find((p) => p.localId === localId);\n if (target?.previewUrl) {\n URL.revokeObjectURL(target.previewUrl);\n }\n this._pendingConversationFiles = this._pendingConversationFiles.filter((p) => p.localId !== localId);\n }\n _clearPending() {\n this._pendingConversationFiles.forEach((p) => {\n if (p.previewUrl) {\n URL.revokeObjectURL(p.previewUrl);\n }\n });\n this._pendingConversationFiles = [];\n }\n /** Open the shared full-screen previewer for a message attachment (image or video). */\n _handleFileOpen(file) {\n // Use the local preview if the upload hasn't finished yet; otherwise the\n // backend view URL (prefixed with the base URL — a raw fetch of a relative\n // path would hit the page origin, e.g. the dev server, not the backend).\n // The previewer picks image vs video playback off the name's extension, so\n // niceName has to carry it — hence the generic fallback keeps no extension\n // only when there's no name at all.\n const src = file.previewUrl\n || `${KRHttp.getBaseUrl()}/api/system/conversationFile/${file.conversationFileID}/view`;\n const preview = KRFilePreview.open({\n src,\n name: file.niceName || 'file',\n });\n // The previewer's download button only fires a `download` event — the\n // consumer performs the actual download. Hit the view endpoint with\n // `?download=true` (Content-Disposition: attachment) in a new tab.\n preview.addEventListener('download', () => {\n window.open(`${KRHttp.getBaseUrl()}/api/system/conversationFile/${file.conversationFileID}/view?download=true`, '_blank');\n });\n }\n _handleSubmit() {\n if (this._isStreaming) {\n return;\n }\n const messageText = this._inputValue.trim();\n const pending = this._pendingConversationFiles;\n // Allow sending an image with no text, but require at least one of them.\n if (!messageText && !pending.length) {\n return;\n }\n // The files sent to the backend, each paired with its analyze flag. Sent\n // files are shown once the conversation reloads and they come back as stored\n // conversation files; the just-sent message itself carries text only.\n const conversationFiles = pending.map((p) => ({\n file: p.file,\n aiAnalyze: p.aiAnalyze,\n }));\n const submitEvent = new CustomEvent('message-submit', {\n detail: {\n message: messageText,\n conversationFiles,\n },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n this.dispatchEvent(submitEvent);\n if (submitEvent.defaultPrevented) {\n return;\n }\n this._send({\n message: messageText,\n conversationFiles\n });\n }\n /**\n * Append the user message and stream the response. Split out of `_handleSubmit`\n * so debug test triggers can send a specific message without going through the\n * composer input. `_handleSubmit` owns reading/validating the composer and\n * firing the cancelable `message-submit` event; this owns the send + stream.\n */\n _send(params) {\n const userMessage = {\n type: 'user',\n content: params.message,\n };\n // Attach the staged files' local previews to the message so its thumbnails\n // show INSTANTLY, without waiting on the upload. Each carries a temporary\n // previewUrl (images only; documents render an icon from mimeType) and\n // conversationFileID -1 as a placeholder; the built-in send swaps these for\n // the real server files once the upload returns.\n if (this._pendingConversationFiles.length) {\n userMessage.conversationFiles = this._pendingConversationFiles.map((p) => ({\n conversationFileID: -1,\n niceName: p.name,\n mimeType: p.mimeType,\n aiAnalyze: p.aiAnalyze,\n previewUrl: p.previewUrl,\n }));\n }\n // The message is on its way, so stop the mic if it's still live — otherwise\n // it would keep transcribing into the now-cleared composer. abort() rather\n // than stop() because a trailing pending utterance belongs to the message\n // just sent; flushing it would drop stray words into the next one.\n if (this._speechRecognition) {\n this._speechRecognition.abort();\n }\n this.messages = [...this.messages, userMessage];\n this._inputValue = '';\n this._saveState();\n this._error = '';\n this._userHasScrolledUp = false;\n // Clear the composer, but DON'T revoke the preview object URLs — the sent\n // message now renders them until the upload's real files replace them.\n this._pendingConversationFiles = [];\n // Reset textarea height\n if (this._inputEl) {\n this._inputEl.style.height = 'auto';\n }\n // Add empty assistant message to stream into\n this.messages = [...this.messages, {\n type: 'assistant',\n content: '',\n }];\n this._isStreaming = true;\n // Scroll user's message to the top (Gemini-style).\n // Set min-height on the assistant message = container height so there's enough\n // scroll room below the user message to push it to the top.\n this.updateComplete.then(() => {\n if (!this._messagesEl) {\n return;\n }\n // Clear min-height from previous responses\n this._messagesEl.querySelectorAll('.message--assistant').forEach((el) => {\n el.style.minHeight = '';\n });\n const allMsgEls = this._messagesEl.querySelectorAll('.message');\n const userMsgEl = allMsgEls[this.messages.length - 2];\n const assistantMsgEl = allMsgEls[this.messages.length - 1];\n if (assistantMsgEl) {\n assistantMsgEl.style.minHeight = this._messagesEl.clientHeight + 'px';\n }\n if (userMsgEl) {\n this._messagesEl.scrollTop = userMsgEl.offsetTop - this._messagesEl.offsetTop - 24;\n }\n });\n // Default to streaming from the Kodaris Bedrock conversation endpoints when\n // the consumer hasn't provided their own `send`.\n if (!this.send) {\n this.send = (params) => {\n // Images are upload-first: each file is stored as a conversation file\n // (type LIBRARY — the format lives in mimeType), then the resulting\n // conversationFileIDs are attached to the message via `fileIds` on the\n // normal JSON stream call. There is no multipart chat endpoint. With no\n // images the upload resolves to an empty list immediately; a failed\n // upload is dropped so an undefined id never reaches `fileIds`.\n let uploaded = Promise.resolve([]);\n if (params.conversationFiles.length) {\n uploaded = Promise.all(params.conversationFiles.map(({ file, aiAnalyze }) => {\n const form = new FormData();\n form.append('file', file);\n form.append('type', 'LIBRARY');\n form.append('niceName', file.name);\n // Reference-only files (from \"Attach Files for Reference\") aren't read\n // by the model — the endpoint defaults aiAnalyze=true, so only send\n // the flag when it's false.\n if (!aiAnalyze) {\n form.append('aiAnalyze', 'false');\n }\n return KRHttp.fetch({\n url: '/api/system/conversationFile/upload',\n method: 'POST',\n body: form,\n })\n .then((r) => r.json())\n // Keep the whole file DTO the upload returns (id + niceName +\n // mimeType + …), not just the id — it's attached to the sent message\n // below so the attachment shows immediately.\n .then((res) => res.data);\n }));\n }\n return uploaded.then((files) => {\n // Replace the just-sent user message's local previews with the real\n // uploaded files (backed by the stored file's view URL). The last user\n // message is the one _send appended before the trailing empty assistant\n // message; revoke its now-defunct preview object URLs first.\n if (files.length) {\n for (let i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].type === 'user') {\n (this.messages[i].conversationFiles || []).forEach((f) => {\n if (f.previewUrl) {\n URL.revokeObjectURL(f.previewUrl);\n }\n });\n this.messages[i].conversationFiles = files;\n this.requestUpdate();\n break;\n }\n }\n }\n // Conversation targeting: continue `conversationId` when set, else\n // start a fresh conversation (createNew) for this turn. The pin below\n // means createNew only fires on the very first untargeted turn.\n const body = {\n userText: params.message,\n fileIds: files.map((f) => f.conversationFileID),\n };\n if (this.conversationId != null) {\n body.conversationID = this.conversationId;\n }\n else {\n body.createNew = true;\n }\n return KRHttp.fetch({\n url: '/api/system/integration/aws/bedrock/stream/invokeModelForConversationWithState',\n method: 'POST',\n headers: { Accept: 'text/event-stream' },\n body,\n }).then((response) => {\n // Pin the session to the conversation this turn used. The stream\n // doesn't echo the resolved id, so when we let the server create one\n // (no conversationId set) we resolve it via `/last` and keep it, so\n // subsequent turns continue this conversation instead of each sending\n // createNew and spawning a new one. Best-effort, fire-and-forget: a\n // failure leaves it unpinned and the next turn resolves server-side.\n if (this.conversationId == null) {\n KRHttp.fetch({ url: '/api/system/conversation/last' })\n .then((r) => r.json())\n .then((res) => {\n const conversation = res?.data;\n const id = conversation?.conversationID;\n if (typeof id === 'number') {\n this.conversationId = id;\n // Announce the newly-created conversation so consumers can react\n // (e.g. update the route from /chat/new to /chat/{id}). The full\n // conversation object is passed, not just the id, so consumers\n // have the title/timestamps too.\n this.dispatchEvent(new CustomEvent('conversation-created', {\n detail: { conversation },\n bubbles: true,\n composed: true,\n }));\n }\n })\n .catch(() => { });\n }\n return response;\n });\n });\n };\n }\n this.send({\n message: params.message,\n messages: this.messages.slice(0, -1),\n conversationFiles: params.conversationFiles,\n }).then((response) => {\n if (!response.ok) {\n this._handleStreamError('Request failed: ' + response.status);\n return;\n }\n if (!response.body) {\n this._handleStreamError('No response body');\n return;\n }\n this._reader = response.body.getReader();\n this._decoder = new TextDecoder();\n this._buffer = '';\n this._readStreamChunk();\n }).catch((err) => {\n if (err.name !== 'AbortError') {\n this._handleStreamError(err.message);\n }\n });\n }\n _handleStop() {\n if (this._reader) {\n this._reader.cancel();\n this._reader = null;\n }\n this._isStreaming = false;\n }\n _handleMessagesScroll(e) {\n const container = e.target;\n const distanceFromBottom = container.scrollHeight - container.scrollTop - container.clientHeight;\n if (distanceFromBottom > 50) {\n this._userHasScrolledUp = true;\n }\n else {\n this._userHasScrolledUp = false;\n }\n }\n _handleErrorDismiss() {\n this._error = '';\n }\n _handleContextWarningDismiss() {\n this._contextWarning = '';\n }\n _handleToggleDebugPanel() {\n this._debugPanelOpen = !this._debugPanelOpen;\n this._saveState();\n }\n _handleDebugResizeMouseDown(e) {\n this._isDebugResizing = true;\n this._debugResizeStartX = e.clientX;\n this._debugResizeStartW = this._debugDrawerWidth;\n e.preventDefault();\n e.stopPropagation();\n document.addEventListener('mousemove', this._handleDebugResizeMouseMove);\n document.addEventListener('mouseup', this._handleDebugResizeMouseUp);\n }\n _readStreamChunk() {\n if (!this._reader) {\n return;\n }\n this._reader.read().then((result) => {\n if (result.done) {\n this._isStreaming = false;\n this._reader = null;\n return;\n }\n this._buffer = this._buffer + this._decoder.decode(result.value, { stream: true });\n const events = this._buffer.split('\\n\\n');\n this._buffer = events.pop() || '';\n for (let i = 0; i < events.length; i++) {\n if (!events[i].trim()) {\n continue;\n }\n const lines = events[i].split('\\n');\n for (let j = 0; j < lines.length; j++) {\n if (!lines[j].startsWith('data:')) {\n continue;\n }\n const raw = lines[j].slice(5).trim();\n if (!raw) {\n continue;\n }\n let data;\n try {\n data = JSON.parse(raw);\n }\n catch {\n continue;\n }\n // Dispatch a generic event for every SSE message so consumers can listen and react\n this.dispatchEvent(new CustomEvent('stream-event', {\n detail: data,\n bubbles: true,\n composed: true,\n }));\n if (data.type === 'REASONING_PART') {\n if (data.message) {\n const lastIndex = this.messages.length - 1;\n if (lastIndex >= 0 && this.messages[lastIndex].type === 'assistant') {\n if (!this.messages[lastIndex].reasoning) {\n this.messages[lastIndex].reasoning = '';\n }\n this.messages[lastIndex].reasoning += String(data.message);\n this.requestUpdate();\n }\n }\n }\n else if (data.type === 'RESPONSE_PART') {\n if (data.message) {\n const lastIndex = this.messages.length - 1;\n if (lastIndex >= 0 && this.messages[lastIndex].type === 'assistant') {\n this.messages[lastIndex].content += String(data.message);\n this.requestUpdate();\n }\n }\n }\n else if (data.type === 'ERROR') {\n this._handleStreamError(String(data.message || 'Unknown error'));\n }\n else if (data.type === 'CONVERSATION_TOKEN_WARNING') {\n // User-facing: friendly \"conversation is getting long\" guidance.\n // Text only, never sent to the model — render verbatim as a banner.\n this._contextWarning = String(data.message || '');\n }\n else if (data.type === 'CONVERSATION_TITLE') {\n // The server generated a real title for a brand-new conversation\n // (it was created with a truncated first-message placeholder that we\n // deliberately never show). Adopt it as the header label and pass it\n // up so consumers can update their own chrome, e.g. a breadcrumb.\n if (data.data) {\n const title = String(data.data.title || '');\n if (title) {\n this.label = title;\n this.dispatchEvent(new CustomEvent('conversation-title', {\n detail: { title },\n bubbles: true,\n composed: true,\n }));\n }\n }\n }\n else if (data.type === 'CONVERSATION_LIMIT_REACHED') {\n // User-facing hard stop. Carries finished:true (handled below).\n // Clear any soft warning so we don't double-message the user.\n this._contextLimitReached = true;\n this._contextLimitMessage = String(data.message || '');\n this._contextWarning = '';\n }\n else if (data.type === 'TOKEN_USAGE') {\n // INTERNAL-ONLY debug telemetry. Update the panel snapshot and the\n // per-iteration log; never render as a chat bubble.\n if (data.data) {\n const usage = data.data;\n this._telemetry = usage;\n // A new turn starts at iteration 1 — clear the prior turn's log\n // only now (not at send), so it stays visible until fresh data\n // actually arrives rather than blanking out on submit.\n if (usage.iteration === 1) {\n this._iterationLog = [usage];\n this._cacheCheckpoints = {};\n }\n else {\n this._iterationLog = [...this._iterationLog, usage];\n }\n }\n }\n else if (data.type === 'CACHE_CHECKPOINT') {\n // INTERNAL-ONLY debug telemetry. Records when/under which mode the\n // history checkpoint was placed, keyed by iteration for the table.\n if (data.data) {\n const checkpoint = data.data;\n this._cacheCheckpoints = {\n ...this._cacheCheckpoints,\n [checkpoint.iteration]: checkpoint,\n };\n }\n }\n if (data.finished) {\n this._isStreaming = false;\n this._reader = null;\n }\n }\n }\n this._readStreamChunk();\n }).catch((err) => {\n if (err.name !== 'AbortError') {\n this._handleStreamError(err.message);\n }\n });\n }\n _handleStreamError(message) {\n this._isStreaming = false;\n this._error = message;\n if (this._reader) {\n this._reader.cancel();\n this._reader = null;\n }\n // Remove the empty assistant message if it has no content\n if (this.messages.length > 0) {\n const lastMessage = this.messages[this.messages.length - 1];\n if (lastMessage.type === 'assistant' && !lastMessage.content) {\n this.messages = this.messages.slice(0, -1);\n }\n }\n }\n // --- Render ---\n /** The `/` skill menu shown above the composer while typing a slash command. */\n _renderSkillMenu() {\n const skills = this._invocableSkills;\n // Debug test triggers are extra actions after Attach Files / Browse. The\n // flat keyboard index counts actions first, then skills, so the skills'\n // index offset is the number of actions shown.\n const debugActions = this.variant === 'inline' && this._aiFrameworkConfig.debugTelemetryEnabled === true;\n let actionCount = 3;\n if (debugActions) {\n actionCount = 5;\n }\n return html `\n <div class=\"skill-menu\">\n <div class=\"skill-menu__actions\">\n <button\n class=${classMap({\n 'skill-menu__action': true,\n 'skill-menu__item--highlighted': this._skillHighlighted === 0,\n })}\n @click=${() => this._openFilePicker(true)}\n >\n <span class=\"skill-menu__name\">Attach Files</span>\n <span class=\"skill-menu__desc\">The AI reads these files</span>\n </button>\n <button\n class=${classMap({\n 'skill-menu__action': true,\n 'skill-menu__item--highlighted': this._skillHighlighted === 1,\n })}\n @click=${() => this._openFilePicker(false)}\n >\n <span class=\"skill-menu__name\">Attach Files for Reference</span>\n <span class=\"skill-menu__desc\">Attached for a tool — not read by the AI</span>\n </button>\n <button\n class=${classMap({\n 'skill-menu__action': true,\n 'skill-menu__item--highlighted': this._skillHighlighted === 2,\n })}\n @click=${this._handleSkillBrowseOpen}\n >\n Browse All Skills\n </button>\n ${debugActions ? html `\n <button\n class=${classMap({\n 'skill-menu__action': true,\n 'skill-menu__item--highlighted': this._skillHighlighted === 3,\n })}\n @click=${() => this._activateSkillMenuItem(3)}\n >\n Test Context Warning\n </button>\n <button\n class=${classMap({\n 'skill-menu__action': true,\n 'skill-menu__item--highlighted': this._skillHighlighted === 4,\n })}\n @click=${() => this._activateSkillMenuItem(4)}\n >\n Test Context Limit\n </button>\n ` : nothing}\n </div>\n ${skills.length ? html `\n <ul class=\"skill-menu__list\">\n ${skills.map((skill, index) => html `\n <li>\n <button\n class=${classMap({\n 'skill-menu__item': true,\n 'skill-menu__item--highlighted': index + actionCount === this._skillHighlighted,\n })}\n @click=${() => this._handleSkillSelect(skill)}\n >\n <span class=\"skill-menu__name\">${skill.name}</span>\n ${skill.description ? html `\n <span class=\"skill-menu__desc\">${skill.description}</span>\n ` : nothing}\n </button>\n </li>\n `)}\n </ul>\n ` : nothing}\n </div>\n `;\n }\n /** The \"Browse all skills\" dialog — a searchable grid of Org / Kodaris cards. */\n _renderSkillBrowse() {\n return html `\n <kr-dialog\n opened\n label=\"Browse Skills\"\n width=\"720px\"\n @close=${this._handleSkillBrowseClose}\n >\n <div class=\"skill-browse\">\n <kr-text-field\n placeholder=\"Search skills...\"\n .value=${this._skillBrowseQuery}\n @input=${this._handleSkillBrowseSearch}\n ></kr-text-field>\n <kr-tab-group\n active-tab-id=${this._skillBrowseSource}\n @tab-change=${this._handleSkillBrowseTabChange}\n >\n <kr-tab id=\"org\" label=\"Your Org\">\n ${this._renderSkillGrid()}\n </kr-tab>\n <kr-tab id=\"kodaris\" label=\"Kodaris\">\n ${this._renderSkillGrid(true)}\n </kr-tab>\n </kr-tab-group>\n </div>\n </kr-dialog>\n `;\n }\n /**\n * The card grid of skill search results for the browse dialog. Clicking a card\n * inserts `/code ` into the composer. In the shared-Kodaris (`global`) tab each\n * card also gets a footer row with an Enabled toggle that installs/removes the\n * skill on this instance.\n */\n _renderSkillGrid(global = false) {\n let skills = this._orgSkills;\n if (global) {\n skills = this._globalSkills;\n }\n if (!skills.length) {\n return nothing;\n }\n return html `\n <div class=\"skill-browse__grid\">\n ${skills.map((skill) => html `\n <div\n class=\"skill-card\"\n role=\"button\"\n tabindex=\"0\"\n @click=${() => this._handleSkillSelect(skill)}\n @keydown=${(e) => this._handleSkillCardKeydown(e, skill)}\n >\n <span class=\"skill-card__name\">${skill.name}</span>\n ${skill.description ? html `\n <span class=\"skill-card__desc\">${skill.description}</span>\n ` : nothing}\n ${global ? html `\n <div class=\"skill-card__footer\">\n <span class=\"skill-card__price\">Free</span>\n <kr-button\n class=\"skill-card__install-btn\"\n size=\"small\"\n variant=${skill.enabled ? 'outline' : 'flat'}\n color=${skill.enabled ? 'secondary' : 'primary'}\n @click=${(e) => this._handleGlobalSkillEnable(skill, e)}\n >${skill.enabled ? 'Uninstall' : 'Install'}</kr-button>\n </div>\n ` : nothing}\n </div>\n `)}\n </div>\n `;\n }\n /**\n * Render a user message, highlighting a leading `/skill-code` token (like the\n * way Claude highlights slash commands). The composer only inserts valid skill\n * codes, so any leading slash token is treated as one.\n */\n _renderUserContent(content) {\n const match = content.match(/^\\/(\\S+)(\\s[\\s\\S]*)?$/);\n if (match) {\n return html `<span class=\"message-skill\">/${match[1]}</span>${match[2] || ''}`;\n }\n return content;\n }\n /** Compact integer formatting for the debug panel (e.g. 88928 → \"88,928\"). */\n _fmtTokens(n) {\n if (n == null || isNaN(n)) {\n return '—';\n }\n return n.toLocaleString('en-US');\n }\n /** Approximate USD formatting for the debug panel (e.g. 0.1434 → \"~$0.1434\"). */\n _fmtCost(n) {\n if (n == null || isNaN(n)) {\n return '—';\n }\n return '~$' + n.toFixed(4);\n }\n /**\n * INTERNAL-ONLY debug telemetry panel. Rendered only in the inline variant\n * (guarded by the caller) and only when the user has toggled it open. Shows\n * three scopes from the latest TOKEN_USAGE event — context gauge, this turn,\n * lifetime — plus a verbose per-iteration table. Never customer-facing.\n */\n _renderDebugPanel() {\n return html `\n <div\n class=${classMap({\n 'debug-drawer': true,\n 'debug-drawer--open': this._debugPanelOpen,\n 'debug-drawer--resizing': this._isDebugResizing,\n })}\n style=${styleMap({ width: `${this._debugDrawerWidth}px` })}\n >\n <div\n class=\"debug-drawer__resize\"\n @mousedown=${this._handleDebugResizeMouseDown}\n ></div>\n <div class=\"debug-drawer__header\">\n <span class=\"debug-drawer__title\">Debug</span>\n <button\n class=\"header-action\"\n @click=${this._handleToggleDebugPanel}\n title=\"Close debug panel\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"2\"\n stroke=\"currentColor\"\n class=\"header-action-icon\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M6 18 18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n <div class=\"debug-drawer__body\">\n ${this._telemetry ? html `\n <div class=\"debug-section\">\n <div class=\"debug-section__label\">Context</div>\n <div class=\"debug-gauge\">\n <div class=\"debug-gauge__bar\">\n <div\n class=\"debug-gauge__fill\"\n style=${styleMap({ width: `${Math.min(100, Math.max(0, this._telemetry.contextUsedPercent || 0))}%` })}\n ></div>\n </div>\n <span class=\"debug-gauge__text\">\n ${this._fmtTokens(this._telemetry.currentContextTokens)} / ${this._fmtTokens(this._telemetry.contextWindowTokens)}\n · ${this._telemetry.contextUsedPercent ?? 0}%\n </span>\n </div>\n </div>\n\n <div class=\"debug-section\">\n <div class=\"debug-section__label\">This turn</div>\n <div class=\"debug-metrics\">\n <span class=\"debug-metrics__key\">Input</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.turnInputTokens)}</span>\n <span class=\"debug-metrics__key\">Output</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.turnOutputTokens)}</span>\n <span class=\"debug-metrics__key\">Cache read</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.turnCacheReadTokens)}</span>\n <span class=\"debug-metrics__key\">Hit rate</span>\n <span class=\"debug-metrics__val\">${this._telemetry.turnHitRate ?? '—'}%</span>\n <span class=\"debug-metrics__key\">Cost</span>\n <span class=\"debug-metrics__val debug-cost\">${this._fmtCost(this._telemetry.turnCostUsd)}</span>\n </div>\n </div>\n\n <div class=\"debug-section\">\n <div class=\"debug-section__label\">Lifetime</div>\n <div class=\"debug-metrics\">\n <span class=\"debug-metrics__key\">Input</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.conversationInputTokens)}</span>\n <span class=\"debug-metrics__key\">Output</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.conversationOutputTokens)}</span>\n <span class=\"debug-metrics__key\">Cache read</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.conversationCacheReadTokens)}</span>\n <span class=\"debug-metrics__key\">Cache write</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.conversationCacheWriteTokens)}</span>\n <span class=\"debug-metrics__key\">Cost so far</span>\n <span class=\"debug-metrics__val debug-cost\">${this._fmtCost(this._telemetry.conversationCostUsd)}</span>\n </div>\n </div>\n ` : html `\n <div class=\"debug-empty\">No telemetry yet — send a message to populate.</div>\n `}\n\n ${this._iterationLog.length ? html `\n <div class=\"debug-section\">\n <div class=\"debug-section__label\">Iterations (this turn)</div>\n <div class=\"debug-iterations-scroll\">\n <table class=\"debug-iterations\">\n <thead>\n <tr>\n <th>#</th>\n <th>In</th>\n <th>Out</th>\n <th>Cache R</th>\n <th>Cache W</th>\n <th>Hit</th>\n <th>Cost</th>\n <th>Ckpt</th>\n </tr>\n </thead>\n <tbody>\n ${this._iterationLog.map((it) => {\n const ckpt = this._cacheCheckpoints[it.iteration];\n return html `\n <tr>\n <td>${it.iteration}</td>\n <td>${this._fmtTokens(it.iterationInput)}</td>\n <td>${this._fmtTokens(it.iterationOutput)}</td>\n <td>${this._fmtTokens(it.iterationCacheRead)}</td>\n <td>${this._fmtTokens(it.iterationCacheWrite)}</td>\n <td>${it.iterationHitRate ?? '—'}%</td>\n <td class=\"debug-cost\">${this._fmtCost(it.iterationCostUsd)}</td>\n <td>${ckpt ? ckpt.mode : '—'}</td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n </div>\n </div>\n ` : nothing}\n </div>\n </div>\n `;\n }\n render() {\n // Debug affordances (drawer toggle, drawer, /test-* options) require the\n // inline variant AND the server-side debug flag from aiFrameworkConfig.\n const isDebugEnabled = this.variant === 'inline' && this._aiFrameworkConfig.debugTelemetryEnabled === true;\n return html `\n ${(this.hideToggle || this.variant === 'inline') ? nothing : html `\n <button\n class=${classMap({\n 'toggle': true,\n 'toggle--hidden': this.opened,\n })}\n @click=${this._handleToggle}\n title=\"Open chat\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n class=\"toggle-icon\"\n >\n <path d=\"M12 2C6.48 2 2 6.03 2 11c0 2.61 1.19 4.94 3.05 6.55L4 22l4.8-2.4C9.82 19.85 10.88 20 12 20c5.52 0 10-4.03 10-9S17.52 2 12 2z\"/>\n <path d=\"M8 11h.01M12 11h.01M16 11h.01\" stroke-width=\"2.5\"/>\n </svg>\n </button>\n `}\n\n <div\n class=${classMap({\n 'panel': true,\n 'panel--opened': this.opened,\n 'panel--resizing-debug': this._isDebugResizing,\n })}\n style=${styleMap(isDebugEnabled && this._debugPanelOpen ? { paddingRight: `${this._debugDrawerWidth}px` } : {})}\n @dragenter=${this._handleDragEnter}\n @dragover=${this._handleDragOver}\n @dragleave=${this._handleDragLeave}\n @drop=${this._handleDrop}\n >\n ${this._isDraggingFile ? html `\n <div class=\"drop-overlay\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5m-13.5-9L12 3m0 0 4.5 4.5M12 3v13.5\"\n />\n </svg>\n <span>Drop images to attach</span>\n </div>\n ` : nothing}\n ${this.variant === 'inline' ? nothing : html `\n <div\n class=\"resize resize--n\"\n data-dir=\"n\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--s\"\n data-dir=\"s\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--w\"\n data-dir=\"w\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--e\"\n data-dir=\"e\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--nw\"\n data-dir=\"nw\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--ne\"\n data-dir=\"ne\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--sw\"\n data-dir=\"sw\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--se\"\n data-dir=\"se\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n `}\n <div class=\"header\" @mousedown=${this._handleHeaderMouseDown}>\n <div class=\"header-left\">\n <div class=\"header-info\">\n <span class=\"header-title\">${this.label}</span>\n </div>\n </div>\n <div class=\"header-actions\">\n ${isDebugEnabled ? html `\n <button\n class=${classMap({\n 'header-action': true,\n 'header-action--active': this._debugPanelOpen,\n })}\n @click=${this._handleToggleDebugPanel}\n title=\"Debug telemetry\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"header-action-icon\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M3.75 3v11.25A2.25 2.25 0 0 0 6 16.5h2.25M3.75 3h-1.5m1.5 0h16.5m0 0h1.5m-1.5 0v11.25A2.25 2.25 0 0 1 18 16.5h-2.25m-7.5 0h7.5m-7.5 0-1 3m8.5-3 1 3m0 0 .5 1.5m-.5-1.5h-9.5m0 0-.5 1.5M9 11.25v1.5M12 9v3.75m3-6v6\"\n />\n </svg>\n </button>\n ` : nothing}\n ${this.variant === 'inline' ? nothing : html `\n <button\n class=\"header-action\"\n @click=${this._handleToggle}\n title=\"Close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"2\"\n stroke=\"currentColor\"\n class=\"header-action-icon\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M6 18 18 6M6 6l12 12\"\n />\n </svg>\n </button>\n `}\n </div>\n </div>\n\n <div class=\"messages\" @scroll=${this._handleMessagesScroll}>\n <div class=\"messages-inner\">\n ${this.messages.length === 0 ? html `\n <div class=\"empty\">\n <span class=\"empty-text\">What can I help you with?</span>\n </div>\n ` : nothing}\n ${this.messages.map((msg, index) => html `\n <div class=${classMap({\n 'message': true,\n 'message--user': msg.type === 'user',\n 'message--assistant': msg.type === 'assistant',\n })}>\n ${msg.reasoning ? html `\n <details class=\"reasoning\">\n <summary>Thinking</summary>\n <div class=\"reasoning-content\">${msg.reasoning}</div>\n </details>\n ` : nothing}\n ${msg.conversationFiles && msg.conversationFiles.length ? html `\n <div class=\"attachments\">\n ${msg.conversationFiles.map((file) => {\n const fileName = file.niceName || file.name || 'File';\n // A stored file is an image by its MIME when it has one, else\n // by its extension.\n let isImage = IMAGE_EXTENSIONS.includes(this._getFileExtension(fileName));\n if (file.mimeType) {\n isImage = file.mimeType.startsWith('image/');\n }\n // An image shows its thumbnail; everything else shows a\n // file-type tile. Both open the previewer on click — it renders\n // images, video, PDFs, and text inline, and shows a download\n // tile for the rest (Office formats), so a click always does\n // something useful.\n if (isImage) {\n return html `\n <button\n class=\"attachment\"\n type=\"button\"\n title=${file.niceName || 'View image'}\n @click=${() => this._handleFileOpen(file)}\n >\n <img\n src=${file.previewUrl || `${KRHttp.getBaseUrl()}/api/system/conversationFile/${file.conversationFileID}/view`}\n alt=${file.niceName || ''}\n />\n </button>\n `;\n }\n return html `\n <button\n class=\"attachment attachment--doc attachment--openable\"\n type=\"button\"\n title=${fileName}\n @click=${() => this._handleFileOpen(file)}\n >\n <span class=\"attachment__type\">${this._getFileExtension(fileName) || 'File'}</span>\n <span class=\"attachment__name\">${fileName}</span>\n </button>\n `;\n })}\n </div>\n ` : nothing}\n ${msg.content ? html `\n <div class=\"message-content\">\n ${msg.type === 'user'\n ? this._renderUserContent(msg.content)\n : unsafeHTML(marked.parse(msg.content, { breaks: true }))}\n </div>\n ` : nothing}\n ${msg.type === 'assistant' && this._isStreaming && msg === this.messages[this.messages.length - 1] ? html `\n <div class=\"typing\">\n <span></span>\n <span></span>\n <span></span>\n </div>\n ` : nothing}\n ${msg.content ? html `\n <button\n class=\"message-copy\"\n title=${this._copiedIndex === index ? 'Copied' : 'Copy'}\n @click=${() => this._handleCopyMessage(msg.content, index)}\n >\n ${this._copiedIndex === index ? html `\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n ` : html `\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect\n x=\"9\"\n y=\"9\"\n width=\"13\"\n height=\"13\"\n rx=\"2\"\n />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n `}\n </button>\n ` : nothing}\n </div>\n `)}\n </div>\n </div>\n\n ${this._error ? html `\n <div class=\"error\">\n <span>${this._error}</span>\n <button class=\"error-dismiss\" @click=${this._handleErrorDismiss}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"2\"\n stroke=\"currentColor\"\n class=\"error-dismiss-icon\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M6 18 18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n ` : this._contextLimitReached ? html `\n <div class=\"context-limit\" role=\"alert\">\n ${this._contextLimitMessage\n || 'This conversation has reached its limit. Please start a new one to continue.'}\n </div>\n ` : this._contextWarning ? html `\n <div class=\"context-warning\" role=\"status\">\n <span>${this._contextWarning}</span>\n <button\n class=\"context-warning-dismiss\"\n title=\"Dismiss\"\n @click=${this._handleContextWarningDismiss}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"2\"\n stroke=\"currentColor\"\n class=\"context-warning-dismiss-icon\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M6 18 18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n ` : nothing}\n\n <div class=\"footer\">\n ${this._pendingConversationFiles.length ? html `\n <div class=\"composer-attachments\">\n ${repeat(this._pendingConversationFiles, (p) => p.localId, (p) => html `\n <div\n class=${classMap({\n chip: true,\n 'chip--doc': !p.previewUrl,\n })}\n title=${p.name}\n >\n <div\n class=${classMap({\n 'chip-body': true,\n 'chip-body--image': Boolean(p.previewUrl),\n })}\n >\n ${p.previewUrl\n ? html `<img src=${p.previewUrl} alt=${p.name} />`\n : html `\n <span class=\"chip-type\">${this._getFileExtension(p.name) || 'File'}</span>\n <span class=\"chip-name\">${p.name}</span>\n `}\n </div>\n <button\n class=\"chip-remove\"\n title=\"Remove\"\n @click=${() => this._handlePendingRemove(p.localId)}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.75\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M6 18 18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n `)}\n </div>\n ` : nothing}\n <input\n class=\"file-input\"\n type=\"file\"\n accept=${ACCEPTED_FILE_EXTENSIONS.map((ext) => '.' + ext).join(',')}\n multiple\n hidden\n @change=${this._handleFileInputChange}\n />\n ${this._skillMenuOpened ? this._renderSkillMenu() : nothing}\n <div class=\"input-wrapper\">\n <button\n class=\"input-plus\"\n @click=${this._handlePlusClick}\n >+</button>\n <textarea\n class=\"input\"\n .value=${this._inputValue}\n placeholder=${this.placeholder}\n rows=\"1\"\n @input=${this._handleInputChange}\n @keydown=${this._handleKeyDown}\n @paste=${this._handlePaste}\n ></textarea>\n ${window.SpeechRecognition || window.webkitSpeechRecognition ? html `\n ${this._isDictating ? html `\n <button\n class=\"mic-stop\"\n title=\"Stop dictation\"\n aria-label=\"Stop dictation\"\n @click=${this._handleMicClick}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n class=\"mic-stop-icon\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"6\"\n y=\"6\"\n width=\"12\"\n height=\"12\"\n rx=\"2\"\n />\n </svg>\n </button>\n ` : html `\n <button\n class=\"mic\"\n title=\"Dictate a message\"\n aria-label=\"Dictate a message\"\n @click=${this._handleMicClick}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"mic-icon\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 15a3 3 0 0 0 3-3V6a3 3 0 0 0-6 0v6a3 3 0 0 0 3 3Z\"/>\n <path d=\"M19 11a7 7 0 0 1-14 0\"/>\n <path d=\"M12 18v3\"/>\n </svg>\n </button>\n `}\n ` : nothing}\n ${this._isStreaming ? html `\n <button\n class=\"stop\"\n @click=${this._handleStop}\n title=\"Stop generating\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n class=\"stop-icon\"\n >\n <rect\n x=\"6\"\n y=\"6\"\n width=\"12\"\n height=\"12\"\n rx=\"2\"\n />\n </svg>\n </button>\n ` : html `\n <button\n class=${classMap({\n 'send': true,\n 'send--disabled': !this._inputValue.trim() && !this._pendingConversationFiles.length,\n })}\n @click=${this._handleSubmit}\n title=\"Send message\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n class=\"send-icon\"\n >\n <path d=\"M12 19V5M5 12l7-7 7 7\"/>\n </svg>\n </button>\n `}\n </div>\n </div>\n ${this._skillBrowseOpened ? this._renderSkillBrowse() : nothing}\n ${isDebugEnabled ? this._renderDebugPanel() : nothing}\n </div>\n `;\n }\n};\nKRChatbot.styles = css `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host {\n display: block;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.6;\n\n --kr-chatbot-primary: #163052;\n --kr-chatbot-primary-hover: #1e4068;\n --kr-chatbot-bg: #ffffff;\n --kr-chatbot-border: #d9d9d9;\n --kr-chatbot-text: #1a1a2e;\n --kr-chatbot-text-secondary: #64668b;\n --kr-chatbot-user-bg: #e9e9e980;\n --kr-chatbot-error-bg: #fef2f2;\n --kr-chatbot-error-text: #dc2626;\n --kr-chatbot-success: #00b894;\n --kr-chatbot-toggle-size: 56px;\n --kr-chatbot-panel-width: 440px;\n --kr-chatbot-panel-height: 620px;\n }\n\n :host {\n position: fixed;\n bottom: 24px;\n right: 24px;\n z-index: 10000;\n }\n\n /* Toggle button */\n .toggle {\n width: var(--kr-chatbot-toggle-size);\n height: var(--kr-chatbot-toggle-size);\n border-radius: 18px;\n background: var(--kr-chatbot-primary);\n color: white;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 24px rgba(22, 48, 82, 0.4);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .toggle:hover {\n transform: scale(1.05);\n box-shadow: 0 6px 32px rgba(22, 48, 82, 0.5);\n }\n\n .toggle--hidden {\n transform: scale(0);\n opacity: 0;\n pointer-events: none;\n }\n\n .toggle-icon {\n width: 26px;\n height: 26px;\n }\n\n /* Panel */\n .panel {\n display: none;\n flex-direction: column;\n background: var(--kr-chatbot-bg);\n overflow: hidden;\n position: absolute;\n bottom: 0;\n right: 0;\n width: var(--kr-chatbot-panel-width);\n height: var(--kr-chatbot-panel-height);\n max-height: calc(100vh - 72px);\n border-radius: 16px;\n box-shadow: 0 8px 40px rgba(0, 0, 0, 0.08), 0 2px 12px rgba(0, 0, 0, 0.04);\n border: 1px solid rgba(0, 0, 0, 0.08);\n animation: chatbot-panel-in 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n transform-origin: bottom right;\n }\n\n .panel--opened {\n display: flex;\n }\n\n /* Inline mode: fill the parent container instead of floating bottom-right. */\n :host([variant='inline']) {\n position: static;\n bottom: auto;\n right: auto;\n z-index: auto;\n height: 100%;\n }\n\n :host([variant='inline']) .panel {\n position: relative;\n bottom: auto;\n right: auto;\n width: 100%;\n height: 100%;\n max-height: none;\n border-radius: 0;\n box-shadow: none;\n border: none;\n animation: none;\n }\n\n @keyframes chatbot-panel-in {\n from {\n opacity: 0;\n transform: scale(0.92) translateY(20px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n }\n\n /* Header */\n .header {\n padding: 0 16px 0 24px;\n height: 64px;\n background: #ffffff;\n color: #000000;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .header-info {\n display: flex;\n flex-direction: column;\n }\n\n .header-title {\n font-size: 16px;\n font-weight: 600;\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .header-action {\n width: 32px;\n height: 32px;\n background: transparent;\n border: none;\n color: rgb(0 0 0 / 70%);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s;\n }\n\n .header-action:hover {\n background: rgba(0, 0, 0, 0.05);\n color: #000000;\n }\n\n .header-action--active {\n background: rgba(0, 0, 0, 0.08);\n color: #000000;\n }\n\n .header-action-icon {\n width: 20px;\n height: 20px;\n }\n\n /* Messages */\n /* Full-width scroll container — keeps the scrollbar at the panel edge. */\n .messages {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n scroll-behavior: smooth;\n background: white;\n }\n\n /* Centered, width-capped column that actually holds the messages. */\n .messages-inner {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 36px;\n padding: 32px;\n width: 100%;\n max-width: 768px;\n margin-left: auto;\n margin-right: auto;\n }\n\n .empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--kr-chatbot-text-secondary);\n gap: 8px;\n }\n\n .empty-text {\n font-size: 14px;\n color: rgb(0 0 0 / 80%);\n }\n\n .message {\n position: relative;\n display: flex;\n flex-direction: column;\n max-width: 100%;\n animation: chatbot-msg-in 0.3s ease-out;\n /* Reserve room for the copy button INSIDE the message box (so the button is\n part of the message's hover region — no dead zone to cross), then cancel\n that space for layout so message spacing is unchanged. */\n padding-bottom: 30px;\n margin-bottom: -30px;\n }\n\n /* The reserved padding overhangs into the next message; lift the hovered one\n so its copy button isn't covered by (or stealing hover from) the sibling. */\n .message:hover {\n z-index: 1;\n }\n\n @keyframes chatbot-msg-in {\n from {\n opacity: 0;\n transform: translateY(6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .message--user {\n align-self: flex-end;\n align-items: flex-end;\n max-width: 85%;\n }\n\n .message--assistant {\n align-self: flex-start;\n gap: 24px;\n }\n\n /* anywhere, NOT break-word: both break a long unbreakable run (a pasted URL) for\n layout, but only anywhere also shrinks the element's intrinsic min-content width.\n With break-word the URL still reports its full unbroken width as the minimum,\n which sizes this shrink-to-fit bubble past .messages-inner's 768px cap and\n overflows the page horizontally. */\n .message-content {\n line-height: 1.7;\n overflow-wrap: anywhere;\n }\n\n .message--user .message-content {\n display: inline-block;\n background: var(--kr-chatbot-user-bg);\n color: #000000;\n padding: 10px 16px;\n border-radius: 20px;\n border-bottom-right-radius: 6px;\n font-size: 14px;\n }\n\n /* Highlighted leading /skill token in a sent user message. Monospace + a\n stronger color makes it read as a distinct command without a pill. */\n .message-skill {\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, Menlo, Consolas, monospace;\n font-weight: 600;\n color: #b45309;\n }\n\n /* Per-message copy button. Sits in the message's reserved bottom padding —\n inside the hover box, so moving the cursor down onto it never leaves the\n message. Height is reserved (via the message padding) so spacing doesn't\n jump; only opacity toggles on hover. */\n .message-copy {\n position: absolute;\n bottom: 0;\n left: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n padding: 0;\n background: none;\n border: none;\n border-radius: 6px;\n color: #000000;\n cursor: pointer;\n opacity: 0;\n transition: opacity 0.15s, background-color 0.15s, color 0.15s;\n }\n\n .message--user .message-copy {\n left: auto;\n right: 0;\n }\n\n .message:hover .message-copy,\n .message-copy:focus-visible {\n opacity: 1;\n }\n\n .message-copy:hover {\n background: rgba(0, 0, 0, 0.06);\n }\n\n .message-copy svg {\n width: 14px;\n height: 14px;\n }\n\n .message--assistant .message-content {\n background: transparent;\n color: #000000;\n padding: 0;\n font-size: 14px;\n }\n\n .message--assistant .message-content pre {\n background: #1e1e1e;\n color: #d4d4d4;\n padding: 12px;\n border-radius: 6px;\n overflow-x: auto;\n margin: 8px 0;\n font-size: 13px;\n line-height: 1.4;\n }\n\n .message--assistant .message-content code {\n font-family: 'SF Mono', 'Fira Code', Monaco, monospace;\n font-size: 13px;\n }\n\n .message--assistant .message-content :not(pre) > code {\n background: rgba(0, 0, 0, 0.06);\n padding: 2px 5px;\n border-radius: 3px;\n }\n\n .message--assistant .message-content strong {\n font-weight: 600;\n }\n\n .message--assistant .message-content p {\n margin: 0 0 8px 0;\n }\n\n .message--assistant .message-content p:last-child {\n margin-bottom: 0;\n }\n\n /* Reasoning */\n .reasoning {\n border-radius: 6px;\n background: rgb(244 244 244 / 80%);\n font-size: 12px;\n }\n\n .reasoning summary {\n cursor: pointer;\n padding: 6px 10px 6px 10px;\n color: black;\n user-select: none;\n }\n\n .reasoning-content {\n padding: 6px 10px 10px;\n color: black;\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n\n .typing {\n display: flex;\n gap: 4px;\n padding: 4px 0;\n }\n\n .typing span {\n width: 6px;\n height: 6px;\n background: var(--kr-chatbot-text-secondary);\n border-radius: 50%;\n animation: chatbot-typing 1.4s infinite;\n opacity: 0.4;\n }\n\n .typing span:nth-child(2) {\n animation-delay: 0.2s;\n }\n\n .typing span:nth-child(3) {\n animation-delay: 0.4s;\n }\n\n @keyframes chatbot-typing {\n 0%, 60%, 100% {\n opacity: 0.4;\n transform: translateY(0);\n }\n 30% {\n opacity: 1;\n transform: translateY(-4px);\n }\n }\n\n /* Error */\n .error {\n padding: 8px 16px;\n background: var(--kr-chatbot-error-bg);\n color: var(--kr-chatbot-error-text);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .error-dismiss {\n background: none;\n border: none;\n color: var(--kr-chatbot-error-text);\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .error-dismiss-icon {\n width: 14px;\n height: 14px;\n }\n\n /* Context warning banner (user-facing, dismissible, non-blocking) */\n .context-warning {\n /* Match the message text column: 768px cap minus its 32px side padding\n (704px), and viewport minus that padding on narrower screens. */\n width: 100%;\n max-width: 735px;\n margin: 8px auto 0;\n padding: 10px 14px;\n border: 1px solid #fde68a;\n border-radius: 8px;\n background: #fffbeb;\n color: #92400e;\n font-size: 13px;\n line-height: 1.4;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n flex-shrink: 0;\n }\n\n .context-warning-dismiss {\n background: none;\n border: none;\n color: #92400e;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n opacity: 0.7;\n }\n\n .context-warning-dismiss:hover {\n opacity: 1;\n }\n\n .context-warning-dismiss-icon {\n width: 14px;\n height: 14px;\n }\n\n /* Context-limit notice (user-facing, blocking — steers to a new conversation) */\n .context-limit {\n /* Match the message text column: 768px cap minus its 32px side padding\n (704px), and viewport minus that padding on narrower screens. */\n width: 100%;\n max-width: 735px;\n margin: 8px auto 0;\n padding: 10px 14px;\n border: 1px solid #fecaca;\n border-radius: 8px;\n background: var(--kr-chatbot-error-bg);\n color: var(--kr-chatbot-error-text);\n font-size: 13px;\n line-height: 1.4;\n flex-shrink: 0;\n }\n\n /*\n * INTERNAL-ONLY debug telemetry drawer. A layout drawer docked to the right\n * of the inline chat — the chat column shrinks to make room; it does not\n * overlay. Closed by default (width 0), animates open. Not customer-facing —\n * token counts, cache internals, and approximate cost estimates for internal\n * debugging. Styled to match the chatbot's light theme (Inter, design tokens).\n */\n /*\n * The chat column reserves space for the drawer by animating padding-right,\n * so opening the drawer shrinks the chat (header/messages/composer) rather\n * than overlaying it. Only applies in inline mode.\n */\n :host([variant='inline']) .panel {\n transition: padding-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n /* Track the cursor 1:1 while dragging the drawer's resize handle. */\n :host([variant='inline']) .panel--resizing-debug {\n transition: none;\n }\n\n .debug-drawer {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n background: var(--kr-chatbot-bg);\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n color: #000000;\n z-index: 5;\n }\n\n /* While dragging the resize handle, suppress the slide transition so the\n drawer tracks the cursor 1:1. */\n .debug-drawer--resizing {\n transition: none;\n }\n\n .debug-drawer--open {\n transform: translateX(0);\n box-shadow: -4px 0 20px rgba(10, 26, 46, 0.07);\n }\n\n /* Left-edge grab handle for resizing the drawer. */\n .debug-drawer__resize {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 10px;\n cursor: ew-resize;\n z-index: 10;\n }\n\n .debug-drawer__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 12px 0 20px;\n height: 64px;\n flex-shrink: 0;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n }\n\n .debug-drawer__title {\n font-size: 14px;\n font-weight: 600;\n color: #000000;\n }\n\n .debug-drawer__body {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 4px 0;\n }\n\n .debug-section {\n padding: 14px 20px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.06);\n }\n\n .debug-section:last-child {\n border-bottom: none;\n }\n\n .debug-section__label {\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: #000000;\n font-size: 11px;\n font-weight: 600;\n margin-bottom: 10px;\n }\n\n /* Context-fullness gauge */\n .debug-gauge {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .debug-gauge__bar {\n flex: 1;\n height: 8px;\n border-radius: 4px;\n background: rgb(244 244 244 / 100%);\n overflow: hidden;\n }\n\n .debug-gauge__fill {\n height: 100%;\n border-radius: 4px;\n background: var(--kr-chatbot-primary);\n transition: width 0.3s ease;\n }\n\n .debug-gauge__text {\n color: #000000;\n font-size: 12px;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n }\n\n /* Metric rows */\n .debug-metrics {\n display: grid;\n grid-template-columns: auto 1fr;\n column-gap: 12px;\n row-gap: 7px;\n font-size: 13px;\n }\n\n .debug-metrics__key {\n color: #000000;\n }\n\n .debug-metrics__val {\n color: #000000;\n text-align: right;\n font-variant-numeric: tabular-nums;\n }\n\n .debug-cost {\n font-weight: 600;\n }\n\n /* Per-iteration table (verbose). The wrapper scrolls horizontally on its own\n so a wide table never forces the whole drawer to scroll sideways. */\n .debug-iterations-scroll {\n overflow-x: auto;\n max-width: 100%;\n }\n\n .debug-iterations {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n }\n\n .debug-iterations th,\n .debug-iterations td {\n padding: 5px 6px;\n text-align: right;\n white-space: nowrap;\n }\n\n .debug-iterations th {\n color: #000000;\n font-weight: 600;\n border-bottom: 1px solid rgba(0, 0, 0, 0.10);\n }\n\n .debug-iterations tbody tr:not(:last-child) td {\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n }\n\n .debug-iterations td:first-child,\n .debug-iterations th:first-child {\n text-align: left;\n }\n\n .debug-empty {\n color: #000000;\n padding: 20px;\n font-size: 13px;\n text-align: center;\n }\n\n /* Footer / Input */\n .footer {\n padding: 16px 16px 16px;\n flex-shrink: 0;\n background: white;\n width: 100%;\n max-width: 768px;\n margin-left: auto;\n margin-right: auto;\n }\n\n /* Inline mode: keep the composer clear of the bottom edge. */\n :host([variant='inline']) .footer {\n padding-bottom: 40px;\n }\n\n .input-wrapper {\n display: flex;\n align-items: center;\n gap: 4px;\n background: white;\n border: 1px solid var(--kr-chatbot-border);\n border-radius: 26px;\n padding: 6px;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .input-wrapper:focus-within {\n border-color: #b0b0b0;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.04);\n }\n\n /* Inline mode: keep the border and add a soft floating shadow (ChatGPT/Gemini style). */\n :host([variant='inline']) .input-wrapper {\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06), 0 8px 24px rgba(0, 0, 0, 0.1);\n }\n\n :host([variant='inline']) .input-wrapper:focus-within {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 12px 32px rgba(0, 0, 0, 0.14);\n }\n\n .input-plus {\n width: 34px;\n height: 34px;\n border: none;\n background: transparent;\n color: var(--kr-chatbot-text);\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n font-size: 20px;\n font-weight: 300;\n transition: background 0.15s;\n }\n\n .input-plus:hover {\n background: #f8f9fc;\n }\n\n .input {\n flex: 1;\n border: none;\n outline: none;\n resize: none;\n font-family: inherit;\n font-size: 15px;\n line-height: 1.5;\n padding: 4px 0;\n min-height: 26px;\n max-height: 120px;\n background: transparent;\n color: black;\n }\n\n .input::placeholder {\n color: #b0b0b0;\n }\n\n /* margin-right rather than a wider .input-wrapper gap, which would also push\n the plus button and textarea apart. Applied to both mic states so the\n spacing doesn't shift when dictation swaps one for the other. */\n .mic,\n .mic-stop {\n margin-right: 4px;\n }\n\n .mic {\n width: 34px;\n height: 34px;\n border: none;\n background: transparent;\n color: var(--kr-chatbot-text);\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: background 0.15s, color 0.15s;\n }\n\n .mic:hover {\n background: #f8f9fc;\n }\n\n .mic-icon {\n width: 21px;\n height: 21px;\n }\n\n /* Dictation swaps the mic for this stop button, sitting in the mic's slot so\n the composer's layout is unchanged and the textarea stays visible with the\n transcript streaming into it. Structurally identical to .stop; only the\n colors differ — dictation isn't an error state, so it takes a neutral grey\n instead of the error red, and that also keeps it distinct from the solid\n send button sitting right beside it. The icon is dark rather than white\n because white on this grey wouldn't meet contrast. */\n .mic-stop {\n width: 34px;\n height: 34px;\n border-radius: 50%;\n background: #eae7e7;\n color: #1f1f1f;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.15s;\n }\n\n .mic-stop:hover {\n background: #ded9d9;\n }\n\n /* Larger than .stop-icon's 14px: the rect fills only half its 24-unit\n viewBox, so the drawn square is half this value. */\n .mic-stop-icon {\n width: 20px;\n height: 20px;\n }\n\n .send {\n width: 34px;\n height: 34px;\n border-radius: 50%;\n background: var(--kr-chatbot-primary);\n color: white;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.15s;\n }\n\n .send:hover {\n background: var(--kr-chatbot-primary-hover);\n }\n\n .send--disabled {\n opacity: 0.4;\n cursor: default;\n }\n\n .send--disabled:hover {\n background: var(--kr-chatbot-primary);\n }\n\n .send-icon {\n width: 16px;\n height: 16px;\n }\n\n .stop {\n width: 34px;\n height: 34px;\n border-radius: 50%;\n background: var(--kr-chatbot-error-text);\n color: white;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.15s;\n }\n\n .stop:hover {\n background: #b91c1c;\n }\n\n .stop-icon {\n width: 14px;\n height: 14px;\n }\n\n /* Header drag cursor */\n .header {\n cursor: grab;\n user-select: none;\n }\n\n .header:active {\n cursor: grabbing;\n }\n\n /* Inline mode isn't draggable — don't show the grab/hand cursor. */\n :host([variant='inline']) .header,\n :host([variant='inline']) .header:active {\n cursor: default;\n }\n\n /* Drag / Resize states */\n .panel--dragging,\n .panel--resizing {\n transition: none;\n user-select: none;\n }\n\n .panel--dragging {\n box-shadow: 0 32px 96px rgba(0, 0, 0, 0.18), 0 12px 40px rgba(0, 0, 0, 0.1);\n }\n\n /* Resize handles */\n .resize {\n position: absolute;\n z-index: 10;\n }\n\n .resize--n { top: -4px; left: 12px; right: 12px; height: 8px; cursor: n-resize; }\n .resize--s { bottom: -4px; left: 12px; right: 12px; height: 8px; cursor: s-resize; }\n .resize--w { left: -4px; top: 12px; bottom: 12px; width: 8px; cursor: w-resize; }\n .resize--e { right: -4px; top: 12px; bottom: 12px; width: 8px; cursor: e-resize; }\n .resize--nw { top: -4px; left: -4px; width: 16px; height: 16px; cursor: nw-resize; }\n .resize--ne { top: -4px; right: -4px; width: 16px; height: 16px; cursor: ne-resize; }\n .resize--sw { bottom: -4px; left: -4px; width: 16px; height: 16px; cursor: sw-resize; }\n .resize--se { bottom: -4px; right: -4px; width: 16px; height: 16px; cursor: se-resize; }\n\n /* Attachment thumbnails inside a sent message bubble */\n .attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .message--user .attachments {\n justify-content: flex-end;\n margin-bottom: 24px;\n }\n\n /* A sent attachment is the same tile as the composer chip, so a file looks\n identical before and after sending. */\n .attachment {\n width: 112px;\n height: 112px;\n border-radius: 20px;\n overflow: hidden;\n background: #f2f0f0;\n border: none;\n cursor: zoom-in;\n flex-shrink: 0;\n padding: 0;\n }\n\n .attachment img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n /* Non-image attachment in a sent message — file-type label above the filename. */\n .attachment--doc {\n display: flex;\n flex-direction: column;\n padding: 16px 14px;\n box-sizing: border-box;\n text-align: left;\n }\n\n /* Opens the previewer on click — same affordance as the composer's doc chip. */\n .attachment--openable {\n cursor: pointer;\n }\n\n .attachment--openable:hover {\n background: #dfdddd;\n }\n\n .attachment__type {\n font-size: 13px;\n line-height: 1.2;\n color: #444746;\n text-transform: uppercase;\n flex-shrink: 0;\n }\n\n .attachment__name {\n margin-top: auto;\n font-size: 13px;\n line-height: 1.25;\n color: #000;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow-wrap: anywhere;\n }\n\n /* Skill menu (opened by typing '/'). Fixed + JS-positioned above the\n composer, following the krubble select-field dropdown pattern. */\n .skill-menu {\n position: fixed;\n z-index: 10000;\n background: white;\n border: 1px solid #9ba7b6;\n border-radius: 8px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n /* max-height is set dynamically to the space above the composer. */\n }\n\n /* Floating mode is a compact card — use a lighter shadow and softer border. */\n :host(:not([variant='inline'])) .skill-menu {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n border-color: #b0b0b0;\n }\n\n .skill-menu__list {\n list-style: none;\n margin: 0;\n padding: 8px 0;\n overflow-y: auto;\n }\n\n .skill-menu__item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n width: 100%;\n padding: 8px 16px;\n background: none;\n border: none;\n text-align: left;\n cursor: pointer;\n font: inherit;\n color: #000000;\n }\n\n\n /* Floating mode is a compact card — tighten name/description spacing. */\n :host(:not([variant='inline'])) .skill-menu__item {\n gap: 1px;\n }\n\n .skill-menu__name {\n font-weight: 500;\n }\n\n /* Floating mode is a compact card — shrink the skill name a touch. */\n :host(:not([variant='inline'])) .skill-menu__name {\n font-size: 13px;\n }\n\n .skill-menu__desc {\n font-size: 12px;\n color: #000000;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .skill-menu__actions {\n display: flex;\n flex-direction: column;\n padding: 8px 0;\n border-bottom: 1px solid #eee;\n flex-shrink: 0;\n }\n\n .skill-menu__action {\n display: flex;\n flex-direction: column;\n gap: 2px;\n width: 100%;\n padding: 6px 16px;\n background: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n color: var(--kr-chatbot-primary);\n font-weight: 500;\n }\n\n /* Secondary line on an attach action (e.g. \"reads these files\") — muted,\n not the primary accent, so it reads as a hint under the action label. */\n .skill-menu__action .skill-menu__desc {\n font-weight: 400;\n color: #6b7280;\n }\n\n /* Highlight (keyboard) and hover (mouse) are independent — either shades the\n row. Declared after the base rules so it wins the cascade for both the\n action buttons and the skill items. */\n .skill-menu__action.skill-menu__item--highlighted,\n .skill-menu__item.skill-menu__item--highlighted,\n .skill-menu__action:hover,\n .skill-menu__item:hover {\n background: #f3f4f6;\n }\n\n /* Browse-all dialog body. Owns the height so the dialog is the same size on\n every tab; the search is fixed and the card grid flexes/scrolls to fill. */\n .skill-browse {\n display: flex;\n flex-direction: column;\n height: 70vh;\n }\n\n .skill-browse kr-text-field {\n display: block;\n margin: 20px 20px 16px;\n flex-shrink: 0;\n }\n\n .skill-browse kr-tab-group {\n flex: 1;\n min-height: 0;\n }\n\n /* The grid is the scroller and spans the full width, so its scrollbar sits\n flush against the dialog edge; padding-right insets the cards from it. */\n .skill-browse__grid {\n height: 100%;\n overflow-y: auto;\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n grid-auto-rows: min-content;\n align-content: start;\n gap: 12px;\n padding: 16px 20px 20px;\n }\n\n .skill-card {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 14px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n text-align: left;\n cursor: pointer;\n font: inherit;\n color: #000000;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n }\n\n .skill-card:hover {\n border-color: var(--kr-chatbot-primary);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n /* Footer row on global skill cards: install button on the left, price on the\n right. margin-top:auto pins it to the bottom so cards in a row align their\n footers regardless of description length. Negative horizontal margins\n (matching the card's 14px padding) pull the top border out to the full\n card width; the content is re-padded horizontally to stay inset. */\n .skill-card__footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-top: 8px;\n margin-left: -14px;\n margin-right: -14px;\n padding: 14px 14px 0;\n border-top: 1px solid #e5e7eb;\n }\n\n .skill-card__price {\n font-size: 13px;\n font-weight: 600;\n color: #000000;\n }\n\n .skill-card__name {\n font-weight: 600;\n }\n\n .skill-card__desc {\n font-size: 12px;\n color: #000000;\n /* Clamp to 3 lines so a long description doesn't make one card tower over\n its row-mates in the grid. */\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .skill-browse__empty {\n height: 100%;\n padding: 32px;\n text-align: center;\n color: #000000;\n }\n\n /* Composer attachment chips (pre-send) */\n .composer-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 0 6px 10px;\n }\n\n /* Every attachment — image or document — is the same square tile, so a mixed\n row reads as one uniform set. */\n .chip {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 112px;\n height: 112px;\n border-radius: 20px;\n overflow: hidden;\n background: #f2f0f0;\n flex-shrink: 0;\n transition: background 0.28s ease;\n }\n\n .chip--doc {\n cursor: pointer;\n }\n\n .chip--doc:hover {\n background: #dfdddd;\n }\n\n /* The preview body — an image fills the tile; a document shows its file-type\n label above the filename, both left-aligned. */\n .chip-body {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n padding: 16px 14px;\n box-sizing: border-box;\n overflow: hidden;\n }\n\n /* An image fills the whole tile, so it needs no padding around it. */\n .chip-body--image {\n padding: 0;\n }\n\n .chip img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n /* File-type label (PDF, XLSX, …) — sits at the top of the tile. */\n .chip-type {\n font-size: 13px;\n line-height: 1.2;\n color: #444746;\n text-transform: uppercase;\n flex-shrink: 0;\n }\n\n /* Filename — pinned to the bottom of the tile, wrapping to at most three\n lines before it ellipsizes. */\n .chip-name {\n margin-top: auto;\n font-size: 13px;\n line-height: 1.25;\n color: #000;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow-wrap: anywhere;\n }\n\n /* Remove button — a bare X in the tile's top-right corner, revealed only when\n the tile (or the button itself) is hovered or keyboard-focused. */\n .chip-remove {\n position: absolute;\n /* Inset matches .chip-body's padding so the X sits the same distance from\n the right edge as the file-type label does from the left. */\n top: 14px;\n right: 14px;\n width: 15px;\n height: 15px;\n border: none;\n background: none;\n color: #444746;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n line-height: 1;\n flex-shrink: 0;\n opacity: 0;\n transition: opacity 0.28s ease;\n }\n\n .chip:hover .chip-remove,\n .chip-remove:focus-visible {\n opacity: 1;\n }\n\n .chip-remove:hover {\n color: #000;\n }\n\n .chip-remove svg {\n width: 15px;\n height: 15px;\n }\n\n /* Drag-and-drop overlay */\n .drop-overlay {\n position: absolute;\n inset: 0;\n z-index: 20;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n gap: 10px;\n /* Frosted, mostly-opaque surface so the chat content behind is masked\n and doesn't clash with the overlay label. */\n background: rgba(255, 255, 255, 0.92);\n backdrop-filter: blur(3px);\n border: 2px dashed var(--kr-chatbot-primary);\n border-radius: 16px;\n color: var(--kr-chatbot-primary);\n font-weight: 600;\n font-size: 15px;\n pointer-events: none;\n }\n\n .drop-overlay svg {\n width: 32px;\n height: 32px;\n }\n\n `;\n__decorate([\n property({ attribute: false })\n], KRChatbot.prototype, \"send\", void 0);\n__decorate([\n property({ attribute: false })\n], KRChatbot.prototype, \"load\", void 0);\n__decorate([\n property({ attribute: false })\n], KRChatbot.prototype, \"messages\", void 0);\n__decorate([\n property({ type: String })\n], KRChatbot.prototype, \"label\", void 0);\n__decorate([\n property({ type: String })\n], KRChatbot.prototype, \"placeholder\", void 0);\n__decorate([\n property({\n type: Boolean,\n reflect: true\n })\n], KRChatbot.prototype, \"opened\", void 0);\n__decorate([\n property({\n type: Boolean,\n attribute: 'hide-toggle',\n reflect: true\n })\n], KRChatbot.prototype, \"hideToggle\", void 0);\n__decorate([\n property({\n type: String,\n reflect: true\n })\n], KRChatbot.prototype, \"variant\", void 0);\n__decorate([\n property({\n type: Number,\n attribute: 'conversation-id',\n reflect: true\n })\n], KRChatbot.prototype, \"conversationId\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_inputValue\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_isStreaming\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_error\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_contextWarning\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_contextLimitReached\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_contextLimitMessage\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_telemetry\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_iterationLog\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_cacheCheckpoints\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_debugPanelOpen\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_debugDrawerWidth\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_isDebugResizing\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_pendingConversationFiles\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_isDraggingFile\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_skillMenuOpened\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_skillQuery\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_orgSkills\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_globalSkills\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_invocableSkills\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_aiFrameworkConfig\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_skillHighlighted\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_copiedIndex\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_skillBrowseOpened\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_skillBrowseSource\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_skillBrowseQuery\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_isDictating\", void 0);\n__decorate([\n query('.panel')\n], KRChatbot.prototype, \"_panelEl\", void 0);\n__decorate([\n query('.messages')\n], KRChatbot.prototype, \"_messagesEl\", void 0);\n__decorate([\n query('.input')\n], KRChatbot.prototype, \"_inputEl\", void 0);\n__decorate([\n query('.file-input')\n], KRChatbot.prototype, \"_fileInputEl\", void 0);\n__decorate([\n query('.input-wrapper')\n], KRChatbot.prototype, \"_inputWrapperEl\", void 0);\n__decorate([\n query('.skill-menu')\n], KRChatbot.prototype, \"_skillMenuEl\", void 0);\nKRChatbot = __decorate([\n customElement('kr-chatbot')\n], KRChatbot);\nexport { KRChatbot };\n//# sourceMappingURL=chatbot.js.map"],"names":["t","globalThis","e","ShadowRoot","ShadyCSS","nativeShadow","Document","prototype","CSSStyleSheet","s","Symbol","o","WeakMap","n$4","constructor","this","_$cssResult$","Error","cssText","styleSheet","length","get","replaceSync","set","toString","i","reduce","n","c","cssRules","r","is","defineProperty","getOwnPropertyDescriptor","h","getOwnPropertyNames","getOwnPropertySymbols","getPrototypeOf","Object","a","trustedTypes","l","emptyScript","p","reactiveElementPolyfillSupport","d","u","toAttribute","Boolean","Array","JSON","stringify","fromAttribute","Number","parse","f","b","attribute","type","String","converter","reflect","useDefault","hasChanged","metadata","litPropertyMetadata","y$1","HTMLElement","addInitializer","_$Ei","push","observedAttributes","finalize","_$Eh","keys","createProperty","state","hasOwnProperty","create","wrapped","elementProperties","noAccessor","getPropertyDescriptor","call","requestUpdate","configurable","enumerable","getPropertyOptions","Map","finalized","properties","_$Eu","elementStyles","finalizeStyles","styles","isArray","Set","flat","reverse","unshift","toLowerCase","super","_$Ep","isUpdatePending","hasUpdated","_$Em","_$Ev","_$ES","Promise","enableUpdating","_$AL","_$E_","forEach","addController","_$EO","add","renderRoot","isConnected","hostConnected","removeController","delete","size","createRenderRoot","shadowRoot","attachShadow","shadowRootOptions","adoptedStyleSheets","map","document","createElement","litNonce","setAttribute","textContent","appendChild","connectedCallback","disconnectedCallback","hostDisconnected","attributeChangedCallback","_$AK","_$ET","removeAttribute","_$Ej","hasAttribute","C","_$EP","has","_$Eq","reject","scheduleUpdate","performUpdate","shouldUpdate","willUpdate","hostUpdate","update","_$EM","_$AE","hostUpdated","firstUpdated","updated","updateComplete","getUpdateComplete","y","mode","ReactiveElement","reactiveElementVersions","createPolicy","createHTML","Math","random","toFixed","slice","createComment","v","_","m","RegExp","g","$","_$litType$","strings","values","x","E","for","A","P","createTreeWalker","V","S","parts","lastIndex","exec","test","startsWith","N","el","currentNode","content","firstChild","replaceWith","childNodes","nextNode","nodeType","hasAttributes","getAttributeNames","endsWith","getAttribute","split","index","name","ctor","I","L","z","H","tagName","append","data","indexOf","innerHTML","M","_$Co","_$Cl","_$litDirective$","_$AO","_$AT","_$AS","R","_$AV","_$AN","_$AD","_$AM","parentNode","_$AU","creationScope","importNode","k","nextSibling","Z","_$AI","_$Cv","_$AH","_$AA","_$AB","options","startNode","endNode","_$AR","T","iterator","O","insertBefore","createTextNode","_$AC","_$AP","remove","setConnected","element","fill","j","arguments","toggleAttribute","capture","once","passive","removeEventListener","addEventListener","handleEvent","host","B","litHtmlPolyfillSupport","litHtmlVersions","renderOptions","_$Do","renderBefore","render","_$litPart$","_$litElement$","litElementHydrateSupport","LitElement","litElementPolyfillSupport","litElementVersions","customElements","define","kind","init","Reflect","decorate","querySelector","i$2","_$Ct","_$Ci","e$1","it","directiveName","_t","raw","resultType","filter","join","st","nt","classList","__decorate","decorators","target","key","desc","KRNavItemEdit","label","icon","url","active","handleLabelInput","textField","value","handleIconInput","handleUrlInput","handleActiveChange","checked","handleCancel","dialogRef","close","undefined","handleSave","handleKeyDown","html","css","customElement","KRScaffold","i$3","defaultNavItemIcon","originalFetch","originalXhrOpen","navItemDragPreview","navItemDragStartY","isNavItemDragging","navItemDragExpandTimeout","navInitialized","logo","homeUrl","scheme","nav","navIconsDisplayed","navExpanded","user","subbar","navEnabled","userType","breadcrumbs","navItemsExpanded","navQuery","activeNavItemId","isNavScrolled","isNavOpened","localStorage","getItem","isEditing","isUserMenuOpen","pref","draggedNavItemId","navItemDropTargetId","navItemDropPosition","pendingRequests","boundHandleMouseMove","handleMouseMove","bind","boundHandleMouseUp","handleMouseUp","installFetchInterceptor","loadPref","changedProperties","updateActiveNavItem","getComputedNav","item","group","id","uninstallFetchInterceptor","scaffold","window","fetch","args","finally","XMLHttpRequest","open","method","async","username","password","resolveUrl","external","path","baseHref","result","override","order","parentId","children","child","childIndex","childOverride","entries","getNavItemChildren","items","sort","query","allItems","parentGroup","find","includes","some","handleNavQueryChange","clear","handleNavQueryClear","handleMenuClick","setItem","handleNavHeaderClick","navEvent","CustomEvent","detail","bubbles","composed","cancelable","dispatchEvent","defaultPrevented","location","href","handleNavScroll","scrollTop","expandNavGroup","groupId","handleNavItemClick","navItem","groupEl","nextElementSibling","animate","height","scrollHeight","duration","easing","onfinish","ctrlKey","metaKey","button","preventDefault","currentPath","pathname","activeItem","longestMatch","handleEditCancel","handlePrefReset","handlePrefSave","uuid","KRHttp","body","then","response","json","catch","error","console","handleNavItemContextMenu","KRContextMenu","clientX","clientY","divider","openNavItemEdit","addNavItem","KRDialog","afterClosed","res","targetItem","position","customId","Date","now","siblings","targetIndex","findIndex","newOrder","sibling","newItem","handleNavItemMouseDown","abs","draggedItem","className","style","left","top","updateNavItemDropTarget","executeNavItemDrop","clearNavItemDragExpandTimeout","navItems","querySelectorAll","foundTarget","rect","getBoundingClientRect","itemId","right","bottom","newParentId","setTimeout","clearTimeout","navDelta","max","handleUserMenuToggle","handleCustomize","renderNormalFooter","nothing","initials","part","toUpperCase","avatar","email","renderEditFooter","renderNavItem","isChild","classMap","unsafeHTML","topLevelItems","totalTopLevelItems","progress","i$6","property","__decorate$5","KRScreenNav","subLabel","activeId","handlePopstate","syncActiveFromUrl","requestAnimationFrame","match","__decorate$4","KRScreenDetail","title","__decorate$3","KRSubbar","menu","_handleMenuClick","_handleBreadcrumbClick","crumb","isCurrent","breadcrumbEvent","breadcrumb","__decorate$2","KRRouter","configure","config","base","routes","anchor","composedPath","HTMLAnchorElement","origin","navigate","fullPath","history","pushState","PopStateEvent","getParams","matched","matchAll","params","decodeURIComponent","outlet","level","tag","route","component","cached","elementCache","relative","segments","matchRoutes","routeSegments","remaining","childMatches","default","replaceState","KRRouterOutlet","handlePopState","detectLevel","node","__decorate$1","replace","ft","removeProperty","setProperty","_$AQ","dt","ut","w","_getDefaults","breaks","extensions","gfm","hooks","pedantic","renderer","silent","tokenizer","walkTokens","_defaults","changeDefaults","newDefaults","escapeTest","escapeReplace","source","escapeTestNoEncode","escapeReplaceNoEncode","escapeReplacements","getEscapeReplacement","ch","escape$1","encode","unescapeTest","unescape","charAt","fromCharCode","parseInt","substring","caret","edit","regex","opt","obj","val","valSource","getRegex","cleanUrl","encodeURI","noopTest","splitCells","tableRow","count","cells","offset","str","escaped","curr","trim","shift","pop","splice","rtrim","invert","suffLen","outputLink","cap","link","lexer","text","inLink","token","tokens","inlineTokens","_Tokenizer","rules","space","src","block","newline","code","codeBlockStyle","fences","matchIndentToCode","indentToCode","matchIndentInNode","indentInNode","indentCodeCompensation","lang","inline","anyPunctuation","heading","trimmed","depth","hr","blockquote","blockTokens","list","bull","isordered","ordered","start","loose","itemRegex","itemContents","endsWithBlankLine","endEarly","line","repeat","nextLine","indent","trimStart","search","blankLine","nextBulletRegex","min","hrRegex","fencesBeginRegex","headingBeginRegex","rawLine","ischecked","istask","task","trimEnd","spacers","hasMultipleLineBreaks","pre","def","table","headers","aligns","rows","header","align","row","cell","lheading","paragraph","escape","inRawBlock","trimmedUrl","rtrimSlash","lastParenIndex","findClosingBracket","linkLen","reflink","links","nolink","emStrong","maskedSrc","prevChar","emStrongLDelim","punctuation","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","emStrongRDelimAst","emStrongRDelimUnd","lastCharLength","codespan","hasNonSpaceChars","hasSpaceCharsOnBothEnds","br","del","autolink","prevCapZero","_backpedal","inlineText","bullet","_paragraph","_blockLabel","_tag","_comment","blockNormal","gfmTable","blockGfm","blockPedantic","_punctuation","_inlineComment","_inlineLabel","inlineNormal","blockSkip","reflinkSearch","inlinePedantic","inlineGfm","inlineBreaks","normal","_Lexer","inlineQueue","lex","lexInline","next","lastToken","cutSrc","lastParagraphClipped","leading","tabs","extTokenizer","startBlock","startIndex","Infinity","tempSrc","tempStart","getStartIndex","errMsg","charCodeAt","keepPrevChar","lastIndexOf","startInline","_Renderer","infostring","quote","listitem","checkbox","tablerow","tablecell","flags","strong","em","cleanHref","out","image","_TextRenderer","_Parser","textRenderer","parseInline","renderers","genericToken","ret","parser","headingToken","codeToken","tableToken","blockquoteToken","listToken","itemBody","htmlToken","paragraphToken","textToken","escapeToken","tagToken","linkToken","imageToken","strongToken","emToken","codespanToken","delToken","_Hooks","static","preprocess","markdown","postprocess","processAllTokens","markedInstance","defaults","setOptions","parseMarkdown","Parser","Renderer","TextRenderer","Lexer","Tokenizer","Hooks","use","callback","concat","childTokens","pack","opts","ext","prevRenderer","apply","extLevel","prop","rendererProp","rendererFunc","tokenizerProp","tokenizerFunc","prevTokenizer","hooksProp","hooksFunc","prevHook","passThroughHooks","arg","resolve","packWalktokens","origOpt","warn","throwError","onError","all","message","msg","marked","getDefaults","IMAGE_EXTENSIONS","ACCEPTED_FILE_EXTENSIONS","KRChatbot","_reader","_decoder","TextDecoder","_buffer","_userHasScrolledUp","_isDragging","_isResizing","_overlay","_resizeDir","_dragStartX","_dragStartY","_dragStartLeft","_dragStartTop","_resizeStartW","_resizeStartH","_debugResizeStartX","_debugResizeStartW","_dragDepth","_pendingSeq","_pendingAttachAnalyze","_orgSkillRequestId","_globalSkillRequestId","_invocableSkillRequestId","_globalSkillPending","_speechRecognition","_speechBaseValue","_speechFinalTranscript","send","load","messages","placeholder","opened","hideToggle","variant","conversationId","_inputValue","_isStreaming","_error","_contextWarning","_contextLimitReached","_contextLimitMessage","_telemetry","_iterationLog","_cacheCheckpoints","_debugPanelOpen","_debugDrawerWidth","_isDebugResizing","_pendingConversationFiles","_isDraggingFile","_skillMenuOpened","_skillQuery","_orgSkills","_globalSkills","_invocableSkills","_aiFrameworkConfig","_skillHighlighted","_copiedIndex","_skillBrowseOpened","_skillBrowseSource","_skillBrowseQuery","_isDictating","_handleDocumentClick","contains","_handleMouseMove","newLeft","newTop","_panelEl","offsetWidth","innerWidth","innerHeight","dx","dy","minW","minH","maxW","maxH","newW","newH","width","_handleMouseUp","display","_saveState","_handleDebugResizeMouseMove","_handleDebugResizeMouseUp","ids","conversationFileIDs","meta","files","conversationFiles","_restoreState","cancel","abort","previewUrl","URL","revokeObjectURL","changed","_messagesEl","_inputEl","focus","_positionSkillMenu","_skillMenuEl","scrollIntoView","_inputWrapperEl","inputRect","topLimit","spaceAbove","maxHeight","menuRect","stop","_handleStop","isStreaming","_handleToggle","toggle","_showOverlay","_handleHeaderMouseDown","closest","_handleResizeMouseDown","currentTarget","dataset","dir","stopPropagation","_applyStoredLayout","debugPanelOpen","debugDrawerWidth","_handleInputChange","textarea","slashMatch","_searchInvocableSkills","_handleKeyDown","actionCount","debugTelemetryEnabled","shiftKey","_activateSkillMenuItem","_handleSubmit","debugActions","_openFilePicker","_handleSkillBrowseOpen","_send","skill","_handleSkillSelect","_searchOrgSkills","requestId","must","match_all","bool","should","wildcard","case_insensitive","minimum_should_match","term","must_not","globalPublished","hits","hit","_source","_searchGlobalSkills","_handleGlobalSkillEnable","btn","showLoading","encodeURIComponent","enabled","reset","showError","_handlePlusClick","_handleMicClick","SpeechRecognitionCtor","SpeechRecognition","webkitSpeechRecognition","recognition","continuous","interimResults","onresult","interim","resultIndex","results","isFinal","transcript","onerror","onend","_handleSkillCardKeydown","_handleCopyMessage","navigator","clipboard","writeText","_handleSkillBrowseClose","_handleSkillBrowseSearch","_handleSkillBrowseTabChange","activeTabId","aiAnalyze","_fileInputEl","click","_handleFileInputChange","input","_addFiles","_handlePaste","clipboardData","file","getAsFile","_handleDragEnter","_hasFiles","_handleDragOver","_handleDragLeave","_handleDrop","dataTransfer","from","types","_getFileExtension","dot","fileList","createObjectURL","pending","localId","mimeType","_handlePendingRemove","_clearPending","_handleFileOpen","conversationFileID","KRFilePreview","niceName","messageText","submitEvent","userMessage","minHeight","allMsgEls","userMsgEl","assistantMsgEl","clientHeight","offsetTop","uploaded","form","FormData","userText","fileIds","conversationID","createNew","Accept","conversation","ok","getReader","_readStreamChunk","_handleStreamError","status","err","_handleMessagesScroll","container","distanceFromBottom","_handleErrorDismiss","_handleContextWarningDismiss","_handleToggleDebugPanel","_handleDebugResizeMouseDown","read","done","decode","stream","events","lines","reasoning","usage","iteration","checkpoint","finished","lastMessage","_renderSkillMenu","skills","description","_renderSkillBrowse","_renderSkillGrid","global","_renderUserContent","_fmtTokens","isNaN","toLocaleString","_fmtCost","_renderDebugPanel","styleMap","contextUsedPercent","currentContextTokens","contextWindowTokens","turnInputTokens","turnOutputTokens","turnCacheReadTokens","turnHitRate","turnCostUsd","conversationInputTokens","conversationOutputTokens","conversationCacheReadTokens","conversationCacheWriteTokens","conversationCostUsd","ckpt","iterationInput","iterationOutput","iterationCacheRead","iterationCacheWrite","iterationHitRate","iterationCostUsd","isDebugEnabled","panel","paddingRight","fileName","isImage","chip"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,18,19,20,21]}
1
+ {"version":3,"file":"krubble-app.umd.min.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","../../../node_modules/@lit/reactive-element/decorators/custom-element.js","../../../node_modules/@lit/reactive-element/decorators/property.js","../../../node_modules/@lit/reactive-element/decorators/state.js","../../../node_modules/@lit/reactive-element/decorators/query.js","../../../node_modules/@lit/reactive-element/decorators/base.js","../../../node_modules/lit-html/directive.js","../../../node_modules/lit-html/directives/unsafe-html.js","../../../node_modules/lit-html/directives/class-map.js","scaffold/nav-item-edit.js","scaffold.js","screen-nav.js","screen-detail.js","subbar.js","router.js","../../../node_modules/lit-html/directives/style-map.js","../../../node_modules/lit-html/directive-helpers.js","../../../node_modules/lit-html/directives/repeat.js","../../../node_modules/marked/lib/marked.esm.js","chatbot.js"],"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.2\");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 * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","import{desc as t}from\"./base.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function e(e,r){return(n,s,i)=>{const o=t=>t.renderRoot?.querySelector(e)??null;if(r){const{get:e,set:r}=\"object\"==typeof s?n:i??(()=>{const t=Symbol();return{get(){return this[t]},set(e){this[t]=e}}})();return t(n,s,{get(){let t=e.call(this);return void 0===t&&(t=o(this),(null!==t||this.hasUpdated)&&r.call(this,t)),t}})}return t(n,s,{get(){return o(this)}})}}export{e as query};\n//# sourceMappingURL=query.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst e=(e,t,c)=>(c.configurable=!0,c.enumerable=!0,Reflect.decorate&&\"object\"!=typeof t&&Object.defineProperty(e,t,c),c);export{e as desc};\n//# sourceMappingURL=base.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{nothing as t,noChange as i}from\"../lit-html.js\";import{directive as r,Directive as s,PartType as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends s{constructor(i){if(super(i),this.it=t,i.type!==n.CHILD)throw Error(this.constructor.directiveName+\"() can only be used in child bindings\")}render(r){if(r===t||null==r)return this._t=void 0,this.it=r;if(r===i)return r;if(\"string\"!=typeof r)throw Error(this.constructor.directiveName+\"() called with a non-string value\");if(r===this.it)return this._t;this.it=r;const s=[r];return s.raw=s,this._t={_$litType$:this.constructor.resultType,strings:s,values:[]}}}e.directiveName=\"unsafeHTML\",e.resultType=1;const o=r(e);export{e as UnsafeHTMLDirective,o as unsafeHTML};\n//# sourceMappingURL=unsafe-html.js.map\n","import{noChange as t}from\"../lit-html.js\";import{directive as s,Directive as i,PartType as r}from\"../directive.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const e=s(class extends i{constructor(t){if(super(t),t.type!==r.ATTRIBUTE||\"class\"!==t.name||t.strings?.length>2)throw Error(\"`classMap()` can only be used in the `class` attribute and must be the only part in the attribute.\")}render(t){return\" \"+Object.keys(t).filter(s=>t[s]).join(\" \")+\" \"}update(s,[i]){if(void 0===this.st){this.st=new Set,void 0!==s.strings&&(this.nt=new Set(s.strings.join(\" \").split(/\\s/).filter(t=>\"\"!==t)));for(const t in i)i[t]&&!this.nt?.has(t)&&this.st.add(t);return this.render(i)}const r=s.element.classList;for(const t of this.st)t in i||(r.remove(t),this.st.delete(t));for(const t in i){const s=!!i[t];s===this.st.has(t)||this.nt?.has(t)||(s?(r.add(t),this.st.add(t)):(r.remove(t),this.st.delete(t)))}return t}});export{e as classMap};\n//# sourceMappingURL=class-map.js.map\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html, css } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport '@kodaris/krubble-components';\nlet KRNavItemEdit = class KRNavItemEdit extends LitElement {\n constructor() {\n super(...arguments);\n this.label = '';\n this.icon = '';\n this.url = '';\n this.active = true;\n }\n connectedCallback() {\n super.connectedCallback();\n if (this.data) {\n this.label = this.data.label || '';\n this.icon = this.data.icon || '';\n this.url = this.data.url || '';\n this.active = this.data.active !== false;\n }\n }\n handleLabelInput(e) {\n const textField = e.target;\n this.label = textField.value;\n }\n handleIconInput(e) {\n const textField = e.target;\n this.icon = textField.value;\n }\n handleUrlInput(e) {\n const textField = e.target;\n this.url = textField.value;\n }\n handleActiveChange(e) {\n this.active = e.target.checked;\n }\n handleCancel() {\n this.dialogRef.close(undefined);\n }\n handleSave() {\n this.dialogRef.close({\n label: this.label,\n icon: this.icon || undefined,\n url: this.url || undefined,\n active: this.active,\n });\n }\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleSave();\n }\n }\n render() {\n return html `\n <h2>Edit Navigation Item</h2>\n\n <div class=\"form-group\">\n <kr-text-field\n label=\"Label\"\n name=\"label\"\n .value=${this.label}\n @input=${this.handleLabelInput}\n @keydown=${this.handleKeyDown}\n placeholder=\"Enter label\"\n ></kr-text-field>\n </div>\n\n <div class=\"form-group\">\n <kr-text-field\n label=\"Icon (emoji or SVG)\"\n name=\"icon\"\n .value=${this.icon}\n @input=${this.handleIconInput}\n @keydown=${this.handleKeyDown}\n placeholder=\"e.g. 📊 or <svg>...</svg>\"\n ></kr-text-field>\n </div>\n\n <div class=\"form-group\">\n <kr-text-field\n label=\"URL\"\n name=\"url\"\n .value=${this.url}\n @input=${this.handleUrlInput}\n @keydown=${this.handleKeyDown}\n placeholder=\"e.g. /ci/my-page or https://...\"\n ></kr-text-field>\n </div>\n\n <div class=\"form-group\">\n <div class=\"checkbox-group\">\n <input\n type=\"checkbox\"\n id=\"active\"\n .checked=${this.active}\n @change=${this.handleActiveChange}\n />\n <label class=\"checkbox-label\" for=\"active\">Visible in navigation</label>\n </div>\n </div>\n\n <div class=\"actions\">\n <button class=\"btn-cancel\" @click=${this.handleCancel}>Cancel</button>\n <button class=\"btn-save\" @click=${this.handleSave}>Save</button>\n </div>\n `;\n }\n};\nKRNavItemEdit.styles = css `\n :host {\n display: block;\n width: 360px;\n padding: 24px;\n color: rgba(255, 255, 255, 0.9);\n\n /* Dark theme for kr-text-field */\n --kr-text-field-label-color: rgba(255, 255, 255, 0.7);\n --kr-text-field-border-color: rgba(255, 255, 255, 0.1);\n --kr-text-field-bg: rgba(255, 255, 255, 0.05);\n --kr-text-field-color: #ffffff;\n --kr-text-field-focus-border-color: #beea4e;\n --kr-text-field-focus-ring-color: rgba(190, 234, 78, 0.1);\n --kr-text-field-placeholder-color: rgba(255, 255, 255, 0.3);\n --kr-text-field-helper-color: rgba(255, 255, 255, 0.5);\n }\n\n h2 {\n margin: 0 0 24px 0;\n font-size: 18px;\n font-weight: 600;\n color: #ffffff;\n }\n\n .form-group {\n margin-bottom: 20px;\n }\n\n .checkbox-group {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n accent-color: #beea4e;\n cursor: pointer;\n }\n\n .checkbox-label {\n font-size: 14px;\n color: rgba(255, 255, 255, 0.9);\n cursor: pointer;\n }\n\n .actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n margin-top: 28px;\n }\n\n button {\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .btn-cancel {\n background: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.1);\n color: rgba(255, 255, 255, 0.8);\n }\n\n .btn-cancel:hover {\n background: rgba(255, 255, 255, 0.1);\n color: #ffffff;\n }\n\n .btn-save {\n background: #beea4e;\n border: none;\n color: #10172a;\n }\n\n .btn-save:hover {\n background: #d4f472;\n }\n `;\n__decorate([\n state()\n], KRNavItemEdit.prototype, \"label\", void 0);\n__decorate([\n state()\n], KRNavItemEdit.prototype, \"icon\", void 0);\n__decorate([\n state()\n], KRNavItemEdit.prototype, \"url\", void 0);\n__decorate([\n state()\n], KRNavItemEdit.prototype, \"active\", void 0);\nKRNavItemEdit = __decorate([\n customElement('kr-nav-item-edit')\n], KRNavItemEdit);\nexport { KRNavItemEdit };\n//# sourceMappingURL=nav-item-edit.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KRContextMenu, KRDialog } from '@kodaris/krubble-components';\nimport { KRHttp } from '@kodaris/krubble-http';\nimport { KRNavItemEdit } from './scaffold/nav-item-edit.js';\n/**\n * Application shell component with nav drawer and main content area.\n *\n * ## Features\n * - Collapsible navigation drawer with hierarchical items (groups and items)\n * - User profile display in footer with customization menu\n * - Edit mode for customizing navigation (rename, reorder, hide items, add custom items)\n * - Drag and drop reordering in edit mode\n * - Persistence of customizations via preference API (global/organization level)\n *\n * ## Nav Customization\n * Users can customize the navigation by clicking their profile and selecting\n * \"Customize Navigation\". This enters edit mode where users can:\n * - Right-click items to edit label, icon, or visibility\n * - Right-click to add new items above/below existing items\n * - Drag and drop to reorder items or move them between groups\n *\n * Customizations are stored globally and apply to all users.\n *\n * ## Preference Storage\n * Preferences are stored as JSON with the following structure:\n * ```json\n * {\n * \"nav\": {\n * \"itemId\": { \"label\": \"Custom Label\", \"icon\": \"...\", \"active\": true, \"order\": 0 },\n * \"custom-123\": { \"type\": \"item\", \"label\": \"New Item\", \"url\": \"/path\", ... }\n * }\n * }\n * ```\n *\n * The `nav` object is a delta - it only contains overrides for existing items\n * or definitions for custom items (prefixed with \"custom-\").\n *\n * ## API Endpoints Used\n * - GET `/api/system/preference/json/scaffold?global=true` - load preferences\n * - POST `/api/system/preference/json/scaffold?global=true` - create new preference\n * - PUT `/api/system/preference/json/scaffold/{uuid}?global=true` - update existing preference\n *\n * @slot - The main content\n *\n * @property {string} logo - URL for the logo image\n * @property {string} label - Title text to display instead of logo\n * @property {'light'|'dark'} scheme - Color scheme: 'light' (default) or 'dark'\n * @property {KRNavItem[]} nav - Navigation items as JSON array\n * @property {KRUser} user - User profile data\n * @property {boolean} navEnabled - Whether to show the nav drawer (menu toggle remains visible when false)\n * @property {'employee'|'customer'} user-type - User type. Customers skip all `/api/system` calls since that endpoint is employee-only. Defaults to 'employee'.\n *\n *\n * TODO\n * - Don't hardcode breadcrumbs\n * - Look at renderNormalFooter and renderEditFooter and see if that is what we want to do\n */\nlet KRScaffold = class KRScaffold extends LitElement {\n constructor() {\n super();\n /**\n * Default icon for nav items without an icon (shown at top level)\n */\n this.defaultNavItemIcon = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><circle cx=\"12\" cy=\"12\" r=\"10\"/></svg>';\n this.originalFetch = null;\n this.originalXhrOpen = null;\n this.navItemDragPreview = null;\n this.navItemDragStartY = 0;\n this.isNavItemDragging = false;\n this.navItemDragExpandTimeout = null;\n this.navInitialized = false;\n this.logo = '';\n this.label = '';\n /**\n * URL to navigate to when clicking the logo/title. Defaults to '/'.\n */\n this.homeUrl = '/';\n this.scheme = 'light';\n this.nav = [];\n this.navIconsDisplayed = false;\n this.navExpanded = false;\n this.user = null;\n /**\n * Whether to show the subbar with menu toggle\n */\n this.subbar = false;\n /**\n * Whether to hide the navigation drawer.\n * Menu toggle button remains visible and emits menu-click events.\n */\n this.navEnabled = true;\n /**\n * User type. Set to 'customer' to skip all /api/system calls — customers don't have access to that endpoint.\n */\n this.userType = 'employee';\n /**\n * Breadcrumbs to display in the subbar\n */\n this.breadcrumbs = [];\n this.navItemsExpanded = new Set();\n this.navQuery = '';\n this.activeNavItemId = null;\n this.isNavScrolled = false;\n this.isNavOpened = localStorage.getItem('kr-scaffold-nav-opened') !== 'false';\n this.isEditing = false;\n this.isUserMenuOpen = false;\n this.pref = { nav: {} };\n this.draggedNavItemId = null;\n this.navItemDropTargetId = null;\n this.navItemDropPosition = 'above';\n this.pendingRequests = 0;\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseUp = this.handleMouseUp.bind(this);\n }\n connectedCallback() {\n super.connectedCallback();\n this.installFetchInterceptor();\n }\n // Attributes are not reflected into properties until after the first update,\n // so loadPref() must run here (not connectedCallback) for user-type to be set.\n firstUpdated() {\n this.loadPref();\n }\n updated(changedProperties) {\n super.updated(changedProperties);\n if (changedProperties.has('nav') && this.nav.length > 0) {\n this.updateActiveNavItem();\n if (this.navExpanded && !this.navInitialized) {\n this.navInitialized = true;\n this.getComputedNav()\n .filter(item => item.type === 'group')\n .forEach(group => this.navItemsExpanded.add(group.id));\n }\n }\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n this.uninstallFetchInterceptor();\n }\n /**\n * Installs global interceptors for fetch and XMLHttpRequest to track pending HTTP requests.\n * Updates `pendingRequests` state when requests start/complete.\n */\n installFetchInterceptor() {\n if (this.originalFetch) {\n return;\n }\n const scaffold = this;\n // Intercept fetch\n this.originalFetch = window.fetch.bind(window);\n const originalFetch = this.originalFetch; // Capture in local scope to avoid null reference after uninstall\n window.fetch = function (...args) {\n scaffold.pendingRequests++;\n return originalFetch(...args).finally(() => {\n scaffold.pendingRequests--;\n });\n };\n // Intercept XMLHttpRequest\n this.originalXhrOpen = XMLHttpRequest.prototype.open;\n const originalXhrOpen = this.originalXhrOpen; // Capture in local scope to avoid null reference after uninstall\n XMLHttpRequest.prototype.open = function (method, url, async = true, username, password) {\n scaffold.pendingRequests++;\n this.addEventListener('loadend', () => {\n scaffold.pendingRequests--;\n }, { once: true });\n return originalXhrOpen.call(this, method, url, async, username, password);\n };\n }\n /**\n * Restores the original fetch and XMLHttpRequest functions.\n */\n uninstallFetchInterceptor() {\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n if (this.originalXhrOpen) {\n XMLHttpRequest.prototype.open = this.originalXhrOpen;\n this.originalXhrOpen = null;\n }\n }\n /**\n * Resolves a navigation URL by prepending the base href.\n *\n * This method is used for:\n * 1. Setting href attributes on anchor elements (so Cmd/Ctrl+click opens correct URL in new tab)\n * 2. Comparing URLs with window.location.pathname in updateActiveNavItem()\n *\n * The original item.url is kept intact (without base href) and passed to Angular\n * via the nav-item-click event. Angular Router expects paths relative to base,\n * so it handles the base href internally.\n *\n * Example with base href \"/operations/\":\n * - item.url = \"/settings\" (used for Angular routing)\n * - resolveUrl(item) = \"/operations/settings\" (used for href and URL comparison)\n */\n resolveUrl(item) {\n if (!item.url) {\n return '#';\n }\n // External URLs - return as-is\n if (item.external) {\n return item.url;\n }\n // Remove leading slash from url if present, then combine with base\n let path = item.url;\n if (item.url.startsWith('/')) {\n path = item.url.slice(1);\n }\n const baseHref = document.querySelector('base')?.getAttribute('href') || '/';\n if (baseHref.endsWith('/')) {\n return baseHref + path;\n }\n return baseHref + '/' + path;\n }\n // =========================================================================\n // Navigation Data\n // =========================================================================\n /**\n * Returns the computed navigation as a flat array with preferences applied.\n *\n * Transforms the hierarchical `nav` property into a flat list where each item\n * has a `parentId` reference instead of nested `children`. Merges user\n * preference overrides (label, icon, url, active, order, parentId) and\n * includes any custom items added via the edit dialog.\n *\n * @returns Flat array of nav items with preferences applied\n */\n getComputedNav() {\n const result = [];\n this.nav.forEach((item, index) => {\n const override = this.pref.nav[item.id];\n result.push({\n ...item,\n ...override,\n order: override?.order ?? item.order ?? index,\n parentId: override?.parentId ?? null,\n });\n // Add children if group\n if (item.type === 'group' && item.children) {\n item.children.forEach((child, childIndex) => {\n const childOverride = this.pref.nav[child.id];\n let parentId = item.id;\n if (childOverride?.parentId !== undefined) {\n parentId = childOverride.parentId;\n }\n result.push({\n ...child,\n ...childOverride,\n order: childOverride?.order ?? child.order ?? childIndex,\n parentId,\n });\n });\n }\n });\n // Add custom items from pref\n Object.entries(this.pref.nav).forEach(([id, item]) => {\n if (id.startsWith('custom') && item.type && item.label) {\n result.push({\n id,\n type: item.type,\n label: item.label,\n icon: item.icon,\n url: item.url,\n active: item.active,\n order: item.order ?? result.length,\n parentId: item.parentId ?? null,\n });\n }\n });\n return result;\n }\n /**\n * Returns nav items for a given parent, filtered and sorted for rendering.\n *\n * Filters the computed nav to items matching the parentId, sorts by order,\n * hides inactive items in normal mode, and applies the search query filter.\n * Groups are shown if their label matches or if they have matching children.\n *\n * @param parentId - The parent ID to filter by (null for top-level items)\n * @returns Filtered and sorted nav items ready for rendering\n */\n getNavItemChildren(parentId) {\n let items = this.getComputedNav()\n .filter(item => item.parentId === parentId)\n .sort((a, b) => a.order - b.order);\n // In normal mode, filter out hidden items\n if (!this.isEditing) {\n items = items.filter(item => item.active !== false);\n }\n // Apply search filter\n if (this.navQuery) {\n const query = this.navQuery.toLowerCase();\n const allItems = this.getComputedNav();\n // If we're getting children of a group, check if parent group name matches query\n // If so, show all children without filtering\n if (parentId !== null) {\n const parentGroup = allItems.find(item => item.id === parentId);\n if (parentGroup?.label.toLowerCase().includes(query)) {\n return items; // Show all children when group name matches\n }\n }\n items = items.filter(item => {\n if (item.type === 'group') {\n // Show group if its label matches OR if it has matching children\n return item.label.toLowerCase().includes(query) || allItems.some(child => child.parentId === item.id &&\n child.active !== false &&\n child.label.toLowerCase().includes(query));\n }\n // Show item if its label matches\n return item.label.toLowerCase().includes(query);\n });\n }\n return items;\n }\n // =========================================================================\n // Navigation Search\n // =========================================================================\n /**\n * Handles search input changes for filtering nav items.\n *\n * When a search query is entered, automatically expands any groups that\n * contain matching children so users can see the results. When the search\n * is cleared, collapses all groups back to their default state.\n *\n * @param e - The input event from the search field\n */\n handleNavQueryChange(e) {\n this.navQuery = e.target.value;\n // Expand all groups when searching so matching children are visible\n // (groups without matching children won't be rendered anyway)\n if (this.navQuery) {\n this.getComputedNav().forEach(item => {\n if (item.type === 'group') {\n this.navItemsExpanded.add(item.id);\n }\n });\n }\n else {\n // Collapse all when search is cleared\n this.navItemsExpanded.clear();\n }\n }\n /**\n * Clears the search query.\n */\n handleNavQueryClear() {\n this.navQuery = '';\n this.navItemsExpanded.clear();\n }\n // =========================================================================\n // Navigation Interaction\n // =========================================================================\n handleMenuClick() {\n this.isNavOpened = !this.isNavOpened;\n localStorage.setItem('kr-scaffold-nav-opened', String(this.isNavOpened));\n }\n /**\n * Handles click on the nav header (logo/title) to navigate home.\n * Dispatches a nav-item-click event so Angular can intercept and route.\n */\n handleNavHeaderClick() {\n // Clear active state since we're going home\n this.activeNavItemId = null;\n const navEvent = new CustomEvent('nav-item-click', {\n detail: { item: { url: this.homeUrl } },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n this.dispatchEvent(navEvent);\n // If no listener prevented default, navigate natively\n if (!navEvent.defaultPrevented) {\n window.location.href = this.homeUrl;\n }\n }\n /**\n * Handles scroll on nav content to show/hide header shadow.\n */\n handleNavScroll(e) {\n this.isNavScrolled = e.target.scrollTop > 0;\n }\n /**\n * Expand a nav group by id. Public so consumers can keep a group open after\n * adding it dynamically — the scaffold only auto-expands groups once at startup,\n * so a group added later (e.g. an async \"Recent\" list) would otherwise stay\n * collapsed. Idempotent; a no-op if the group is already expanded.\n */\n expandNavGroup(groupId) {\n if (this.navItemsExpanded.has(groupId)) {\n return;\n }\n this.navItemsExpanded.add(groupId);\n this.requestUpdate();\n }\n /**\n * Handles click events on navigation items.\n *\n * For groups, toggles the expanded/collapsed state.\n * For items, dispatches a cancelable `nav-item-click` custom event.\n *\n * If a listener calls `preventDefault()` on the custom event, native browser\n * navigation is prevented. Otherwise, the default `<a href>` navigation\n * proceeds normally.\n *\n * The `@krubble/angular` package provides `KRScaffoldDirective` which\n * automatically listens for this event and handles navigation using\n * Angular's router. Import `KrubbleModule` in your Angular app to enable\n * SPA navigation without page reloads.\n *\n * @param e - The original click event\n * @param item - The nav item that was clicked\n */\n handleNavItemClick(e, item) {\n if (item.type === 'group') {\n // Animate the group's height with the Web Animations API. Collapsing removes\n // `nav-group--expanded` only once the animation finishes; expanding adds it\n // up front so there's a height to animate from.\n const navItem = this.shadowRoot?.querySelector(`.nav-item[data-id=\"${item.id}\"]`);\n const groupEl = navItem?.nextElementSibling;\n if (!groupEl) {\n return;\n }\n if (this.navItemsExpanded.has(item.id)) {\n this.navItemsExpanded.delete(item.id);\n groupEl.animate([\n { height: `${groupEl.scrollHeight}px` },\n { height: '0px' }\n ], {\n duration: 300,\n easing: 'ease-in-out'\n }).onfinish = () => {\n groupEl.classList.remove('nav-group--expanded');\n };\n }\n else {\n this.navItemsExpanded.add(item.id);\n groupEl.classList.add('nav-group--expanded');\n groupEl.animate([\n { height: '0px' },\n { height: `${groupEl.scrollHeight}px` }\n ], {\n duration: 300,\n easing: 'ease-in-out'\n });\n }\n this.requestUpdate();\n }\n else {\n // Allow Ctrl/Cmd+click and middle-click to open in new tab without SPA navigation\n if (e.ctrlKey || e.metaKey || e.button === 1) {\n return;\n }\n // Set active item immediately on click for instant visual feedback\n this.activeNavItemId = item.id;\n const navEvent = new CustomEvent('nav-item-click', {\n detail: { item },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n this.dispatchEvent(navEvent);\n // If a listener called preventDefault(), prevent the native navigation\n // (e.g., SPA router handles navigation)\n if (navEvent.defaultPrevented) {\n e.preventDefault();\n }\n }\n }\n /**\n * Updates the active nav item highlight based on the current URL.\n *\n * Compares the first path segment of `window.location.pathname` with each\n * nav item's URL to find a match. When found, highlights that item and\n * expands its parent group if nested.\n *\n * Called automatically by `KRScaffoldDirective` on Angular route changes.\n */\n updateActiveNavItem() {\n const currentPath = window.location.pathname;\n const allItems = this.getComputedNav().filter(item => item.type === 'item' && item.url);\n // Find the best match - prefer longer/more specific URL matches\n let activeItem = null;\n let longestMatch = 0;\n for (const item of allItems) {\n // Use resolveUrl because currentPath includes base href\n const url = this.resolveUrl(item);\n if (currentPath.startsWith(url) && url.length > longestMatch) {\n activeItem = item;\n longestMatch = url.length;\n }\n }\n if (activeItem) {\n this.activeNavItemId = activeItem.id;\n if (activeItem.parentId) {\n this.navItemsExpanded.add(activeItem.parentId);\n }\n }\n else {\n this.activeNavItemId = null;\n }\n }\n // =========================================================================\n // Navigation Customization\n // =========================================================================\n handleEditCancel() {\n this.isEditing = false;\n // Reload to revert changes\n this.loadPref();\n }\n handlePrefReset() {\n this.pref.nav = {};\n }\n handlePrefSave() {\n if (this.userType === 'customer') {\n return;\n }\n let url = '/api/system/preference/json/scaffold?global=true';\n let method = 'POST';\n if (this.pref.uuid) {\n url = `/api/system/preference/json/scaffold/${this.pref.uuid}?global=true`;\n method = 'PUT';\n }\n KRHttp.fetch({\n url,\n method,\n body: JSON.stringify({ nav: this.pref.nav }),\n })\n .then((response) => response.json())\n .then((data) => {\n this.pref = data.data;\n this.isEditing = false;\n })\n .catch((error) => {\n console.error('Failed to save nav customizations:', error);\n });\n }\n loadPref() {\n if (this.userType === 'customer') {\n return;\n }\n KRHttp.fetch({\n url: '/api/system/preference/json/scaffold?global=true',\n method: 'GET',\n })\n .then((response) => response.json())\n .then((data) => {\n const pref = data?.data?.[0];\n if (pref) {\n this.pref = pref;\n }\n })\n .catch(() => {\n // No preferences saved yet\n });\n }\n handleNavItemContextMenu(e, item) {\n if (!this.isEditing) {\n return;\n }\n e.preventDefault();\n KRContextMenu.open({\n x: e.clientX,\n y: e.clientY,\n items: [\n {\n id: 'edit',\n label: 'Edit Item'\n },\n {\n id: 'divider-1',\n label: '',\n divider: true\n },\n {\n id: 'add-above',\n label: 'Add Item Above'\n },\n {\n id: 'add-below',\n label: 'Add Item Below'\n },\n ],\n }).then((result) => {\n if (!result) {\n return;\n }\n switch (result.id) {\n case 'edit':\n this.openNavItemEdit(item);\n break;\n case 'add-above':\n this.addNavItem(item, 'above');\n break;\n case 'add-below':\n this.addNavItem(item, 'below');\n break;\n }\n });\n }\n /**\n * Opens the nav item edit dialog for customizing an item's properties.\n *\n * Opens `KRNavItemEdit` dialog pre-populated with the item's current values.\n * When the user saves, merges the result into the nav delta to persist\n * customizations like label, icon, URL, and visibility.\n *\n * @param item - The nav item to edit\n */\n openNavItemEdit(item) {\n KRDialog.open(KRNavItemEdit, { data: item }).afterClosed().then((res) => {\n const result = res;\n if (!result) {\n return;\n }\n if (!this.pref.nav[item.id]) {\n this.pref.nav[item.id] = {};\n }\n this.pref.nav[item.id] = {\n ...this.pref.nav[item.id],\n ...result\n };\n this.requestUpdate();\n });\n }\n /**\n * Adds a new custom nav item relative to an existing item.\n *\n * Creates a placeholder item in the nav delta, shifts existing siblings\n * to make room, then opens the edit dialog so the user can configure\n * the new item's label, icon, and URL.\n *\n * @param targetItem - The existing item to position relative to\n * @param position - Whether to insert 'above' or 'below' the target item\n */\n addNavItem(targetItem, position) {\n const customId = `custom-${Date.now()}`;\n const siblings = this.getComputedNav()\n .filter(i => i.parentId === targetItem.parentId)\n .sort((a, b) => a.order - b.order);\n const targetIndex = siblings.findIndex(i => i.id === targetItem.id);\n let newOrder;\n if (position === 'above') {\n newOrder = targetIndex;\n }\n else {\n newOrder = targetIndex + 1;\n }\n // Shift existing items to make room for the new item\n siblings.forEach((sibling, index) => {\n if (index >= newOrder) {\n if (!this.pref.nav[sibling.id]) {\n this.pref.nav[sibling.id] = {};\n }\n this.pref.nav[sibling.id].order = index + 1;\n }\n });\n // Add the new item and open edit dialog\n const newItem = {\n id: customId,\n type: 'item',\n label: 'New Item',\n order: newOrder,\n parentId: targetItem.parentId,\n active: true,\n };\n this.pref.nav[customId] = newItem;\n this.requestUpdate();\n this.openNavItemEdit(newItem);\n }\n // =========================================================================\n // Navigation Drag & Drop\n // =========================================================================\n /**\n * Initiates a potential drag operation when mouse is pressed on a nav item.\n *\n * Only active in edit mode. Records the starting position and sets up\n * document-level listeners for mouse move and mouse up events. The actual\n * drag doesn't start until the mouse moves more than 5 pixels.\n *\n * @param e - The mouse event\n * @param item - The nav item being pressed\n */\n handleNavItemMouseDown(e, item) {\n if (!this.isEditing) {\n return;\n }\n e.preventDefault();\n this.draggedNavItemId = item.id;\n this.navItemDragStartY = e.clientY;\n this.isNavItemDragging = false;\n document.addEventListener('mousemove', this.boundHandleMouseMove);\n document.addEventListener('mouseup', this.boundHandleMouseUp);\n }\n /**\n * Handles mouse movement during a nav item drag operation.\n *\n * Initiates dragging after the mouse moves more than 5 pixels (to distinguish\n * from clicks), creates a floating preview element that follows the cursor,\n * and updates the drop target indicator based on mouse position.\n *\n * @param e - The mouse event\n */\n handleMouseMove(e) {\n if (!this.draggedNavItemId) {\n return;\n }\n // Start dragging after moving a few pixels (to distinguish from clicks)\n if (!this.isNavItemDragging && Math.abs(e.clientY - this.navItemDragStartY) > 5) {\n this.isNavItemDragging = true;\n this.classList.add('kr-scaffold--dragging');\n // Create drag preview\n const draggedItem = this.getComputedNav().find(i => i.id === this.draggedNavItemId);\n if (draggedItem) {\n this.navItemDragPreview = document.createElement('div');\n this.navItemDragPreview.className = 'nav-item-drag-preview';\n this.navItemDragPreview.textContent = draggedItem.label;\n this.navItemDragPreview.style.left = `${e.clientX + 10}px`;\n this.navItemDragPreview.style.top = `${e.clientY - 20}px`;\n this.shadowRoot?.appendChild(this.navItemDragPreview);\n }\n }\n if (!this.isNavItemDragging) {\n return;\n }\n // Update preview position\n if (this.navItemDragPreview) {\n this.navItemDragPreview.style.left = `${e.clientX + 10}px`;\n this.navItemDragPreview.style.top = `${e.clientY - 20}px`;\n }\n // Find drop target based on mouse position\n this.updateNavItemDropTarget(e);\n }\n /**\n * Handles the end of a nav item drag operation.\n *\n * Removes document-level mouse listeners, executes the drop if there's a valid\n * target, and cleans up all drag-related state.\n */\n handleMouseUp() {\n document.removeEventListener('mousemove', this.boundHandleMouseMove);\n document.removeEventListener('mouseup', this.boundHandleMouseUp);\n if (this.isNavItemDragging && this.navItemDropTargetId) {\n this.executeNavItemDrop();\n }\n // Reset all drag state\n this.draggedNavItemId = null;\n this.navItemDropTargetId = null;\n this.isNavItemDragging = false;\n this.classList.remove('kr-scaffold--dragging');\n if (this.navItemDragPreview) {\n this.navItemDragPreview.remove();\n this.navItemDragPreview = null;\n }\n this.clearNavItemDragExpandTimeout();\n this.requestUpdate();\n }\n /**\n * Determines where a dragged nav item would be dropped based on mouse position.\n *\n * Loops through all nav items and checks if the mouse is hovering over one.\n * For groups, the item is divided into thirds (above/center/below) where\n * \"center\" means drop into the group. For regular items, it's halves (above/below).\n *\n * Also handles auto-expanding collapsed groups when hovering over their center,\n * and validates drops (e.g., prevents dropping a group into another group).\n *\n * Updates `navItemDropTargetId` and `navItemDropPosition` state which are used to render\n * visual drop indicators in the UI.\n *\n * @param e - The mouse event from dragging\n */\n updateNavItemDropTarget(e) {\n // Get all nav items in shadow DOM\n const navItems = this.shadowRoot?.querySelectorAll('.nav-item[data-id]');\n if (!navItems) {\n return;\n }\n let foundTarget = false;\n navItems.forEach((el) => {\n const rect = el.getBoundingClientRect();\n const itemId = el.getAttribute('data-id');\n if (!itemId || itemId === this.draggedNavItemId) {\n return;\n }\n // Skip if mouse is outside this element\n if (e.clientX < rect.left || e.clientX > rect.right ||\n e.clientY < rect.top || e.clientY > rect.bottom) {\n return;\n }\n const item = this.getComputedNav().find(i => i.id === itemId);\n if (!item) {\n return;\n }\n const y = e.clientY - rect.top;\n let position;\n // Determine drop position based on mouse Y position within the item.\n // Groups are divided into thirds: top=above, middle=center (drop into), bottom=below.\n // Regular items are divided in half: top=above, bottom=below.\n if (item.type === 'group') {\n if (y < rect.height / 3) {\n // Top third - drop above the group\n position = 'above';\n this.clearNavItemDragExpandTimeout();\n }\n else if (y > (rect.height * 2) / 3) {\n // Bottom third - drop below the group\n position = 'below';\n this.clearNavItemDragExpandTimeout();\n }\n else {\n // Middle third - drop into the group (as a child)\n position = 'center';\n // Auto-expand collapsed groups after a delay. The 500ms wait keeps groups\n // from expanding too eagerly when the user is just passing over them, and\n // the check inside confirms they're still on this group's center.\n if (!this.navItemsExpanded.has(item.id) && !this.navItemDragExpandTimeout) {\n this.navItemDragExpandTimeout = window.setTimeout(() => {\n if (this.navItemDropTargetId === item.id && this.navItemDropPosition === 'center') {\n this.navItemsExpanded.add(item.id);\n this.requestUpdate();\n }\n this.navItemDragExpandTimeout = null;\n }, 500);\n }\n }\n }\n else {\n // Regular items only support above/below, not center\n if (y < rect.height / 2) {\n position = 'above';\n }\n else {\n position = 'below';\n }\n this.clearNavItemDragExpandTimeout();\n }\n // Determine what the new parent would be\n let newParentId;\n if (position === 'center') {\n newParentId = item.id;\n }\n else {\n newParentId = item.parentId;\n }\n const draggedItem = this.getComputedNav().find(i => i.id === this.draggedNavItemId);\n // Don't show drop indicator if invalid drop:\n // 1. Can't drop an item into itself (newParentId === draggedNavItemId)\n // 2. Groups can only exist at the top level, so prevent dropping a group into another group (newParentId !== null means it would be nested)\n if (newParentId === this.draggedNavItemId || (draggedItem?.type === 'group' && newParentId !== null)) {\n this.navItemDropTargetId = null;\n this.clearNavItemDragExpandTimeout();\n return;\n }\n // Valid drop target found - store the target item and position (above/below/center)\n // so the UI can render the drop indicator in the correct location\n this.navItemDropTargetId = item.id;\n this.navItemDropPosition = position;\n foundTarget = true;\n });\n // Mouse is not over any valid nav item - clear the drop indicator\n // (e.g., user dragged outside the nav area or over empty space)\n if (!foundTarget) {\n this.navItemDropTargetId = null;\n this.clearNavItemDragExpandTimeout();\n }\n this.requestUpdate();\n }\n /**\n * Cancels the pending auto-expand timeout for nav groups during drag.\n * Called when the user moves away from a group's center or stops dragging.\n */\n clearNavItemDragExpandTimeout() {\n if (this.navItemDragExpandTimeout) {\n clearTimeout(this.navItemDragExpandTimeout);\n this.navItemDragExpandTimeout = null;\n }\n }\n /**\n * Executes the drop operation after a nav item drag completes.\n *\n * Calculates the new position and parent for the dragged item based on\n * the drop target and position (above/below/center). Updates the navDelta\n * with new order values for the dragged item and shifts siblings as needed.\n */\n executeNavItemDrop() {\n if (!this.draggedNavItemId || !this.navItemDropTargetId) {\n return;\n }\n const allItems = this.getComputedNav();\n const draggedItem = allItems.find(i => i.id === this.draggedNavItemId);\n const targetItem = allItems.find(i => i.id === this.navItemDropTargetId);\n if (!draggedItem || !targetItem) {\n return;\n }\n // Determine the new parentId for the dragged item\n let newParentId;\n if (this.navItemDropPosition === 'center' && targetItem.type === 'group') {\n if (targetItem.id === this.draggedNavItemId) {\n return;\n }\n newParentId = targetItem.id;\n }\n else {\n newParentId = targetItem.parentId;\n }\n if (newParentId === this.draggedNavItemId) {\n return;\n }\n // Get siblings in the destination parent\n const siblings = allItems\n .filter(i => i.parentId === newParentId && i.id !== this.draggedNavItemId)\n .sort((a, b) => a.order - b.order);\n const navDelta = this.pref.nav;\n // Calculate the new order\n let newOrder;\n if (this.navItemDropPosition === 'center') {\n // Dropping into a group - place at the end of its children\n if (siblings.length > 0) {\n newOrder = Math.max(...siblings.map(s => s.order)) + 1;\n }\n else {\n newOrder = 0;\n }\n }\n else {\n // Find where the target item is in the sorted siblings list\n const targetIndex = siblings.findIndex(i => i.id === targetItem.id);\n // Determine insert position based on drop position (above/below target)\n if (targetIndex === -1) {\n newOrder = 0;\n }\n else if (this.navItemDropPosition === 'above') {\n newOrder = targetIndex;\n }\n else {\n newOrder = targetIndex + 1;\n }\n // Shift existing siblings to make room for the dropped item.\n // Items at or after the insert position get their order bumped up by 1.\n siblings.forEach((sibling, index) => {\n if (!navDelta[sibling.id]) {\n navDelta[sibling.id] = {};\n }\n if (index >= newOrder) {\n navDelta[sibling.id].order = index + 1;\n }\n else {\n navDelta[sibling.id].order = index;\n }\n });\n }\n // Update the dragged item's position and parent in the delta\n if (!navDelta[this.draggedNavItemId]) {\n navDelta[this.draggedNavItemId] = {};\n }\n navDelta[this.draggedNavItemId].order = newOrder;\n navDelta[this.draggedNavItemId].parentId = newParentId;\n // Persist changes and trigger re-render\n this.pref.nav = navDelta;\n this.requestUpdate();\n }\n // =========================================================================\n // User Menu\n // =========================================================================\n handleUserMenuToggle() {\n this.isUserMenuOpen = !this.isUserMenuOpen;\n }\n handleCustomize() {\n this.isUserMenuOpen = false;\n this.isEditing = true;\n }\n // =========================================================================\n // Rendering\n // =========================================================================\n renderNormalFooter() {\n if (!this.user) {\n return nothing;\n }\n const initials = this.user.name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n // todo - use a reusable menu component\n return html `\n <div class=\"user-menu-container\">\n ${this.isUserMenuOpen ? html `\n <div class=\"user-menu\">\n <button class=\"user-menu__item\" @click=${this.handleCustomize}>\n Customize Navigation\n </button>\n </div>\n ` : nothing}\n <div class=\"user\" @click=${this.handleUserMenuToggle}>\n <div class=\"user__avatar\">\n ${this.user.avatar\n ? html `<img src=${this.user.avatar} alt=${this.user.name} />`\n : initials}\n </div>\n <div class=\"user__info\">\n <div class=\"user__name\">${this.user.name}</div>\n ${this.user.email ? html `<div class=\"user__email\">${this.user.email}</div>` : nothing}\n </div>\n </div>\n </div>\n `;\n }\n // todo - review\n renderEditFooter() {\n return html `\n <div class=\"edit-actions\">\n <button class=\"edit-actions__btn edit-actions__btn--primary\" @click=${this.handlePrefSave}>\n Save\n </button>\n <div class=\"edit-actions__secondary\">\n <button class=\"edit-actions__btn\" @click=${this.handlePrefReset}>\n Reset\n </button>\n <button class=\"edit-actions__btn\" @click=${this.handleEditCancel}>\n Cancel\n </button>\n </div>\n </div>\n `;\n }\n /**\n * Renders a navigation item as either a group or a link.\n *\n * Groups render as expandable `<button>` elements with a chevron indicator and\n * nested children. Items render as `<a>` anchor links with href navigation.\n *\n * Both types support drag-and-drop reordering in edit mode, context menus for\n * customization, and visual indicators for active/hidden/drop-target states.\n *\n * Icons use SVG strings and fall back to `defaultNavItemIcon` when not provided.\n * Icons are only rendered for top-level items, not for children nested within groups.\n *\n * @param item - The flat nav item data to render\n * @param isChild - Whether this item is nested within a group (affects icon rendering)\n * @returns Lit HTML template for the nav item\n */\n renderNavItem(item, isChild = false) {\n if (item.type === 'section') {\n return html `\n <div class=\"nav-section\">${item.label}</div>\n `;\n }\n if (item.type === 'group') {\n const children = this.getNavItemChildren(item.id);\n return html `\n <button\n class=${classMap({\n 'nav-item': true,\n 'nav-item--expanded': this.navItemsExpanded.has(item.id),\n 'nav-item--hidden': this.isEditing && item.active === false,\n 'nav-item--drop-above': this.navItemDropTargetId === item.id && this.navItemDropPosition === 'above',\n 'nav-item--drop-below': this.navItemDropTargetId === item.id && this.navItemDropPosition === 'below',\n 'nav-item--drop-center': this.navItemDropTargetId === item.id && this.navItemDropPosition === 'center',\n })}\n data-id=\"${item.id}\"\n @mousedown=${(e) => this.handleNavItemMouseDown(e, item)}\n @click=${(e) => this.handleNavItemClick(e, item)}\n @contextmenu=${(e) => this.handleNavItemContextMenu(e, item)}\n >\n ${this.navIconsDisplayed ? html `<span class=\"nav-item__icon\">${unsafeHTML(item.icon || this.defaultNavItemIcon)}</span>` : nothing}\n <span class=\"nav-item__label\">${item.label}</span>\n <svg\n class=\"nav-item__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path\n d=\"M6 9l6 6 6-6\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n <div class=${classMap({\n 'nav-group': true,\n 'nav-group--expanded': this.navItemsExpanded.has(item.id),\n })}>\n ${children.map((child) => this.renderNavItem(child, true))}\n </div>\n `;\n }\n return html `\n <a\n class=${classMap({\n 'nav-item': true,\n 'nav-item--active': this.activeNavItemId === item.id,\n 'nav-item--hidden': this.isEditing && item.active === false,\n 'nav-item--drop-above': this.navItemDropTargetId === item.id && this.navItemDropPosition === 'above',\n 'nav-item--drop-below': this.navItemDropTargetId === item.id && this.navItemDropPosition === 'below',\n })}\n data-id=\"${item.id}\"\n href=${this.resolveUrl(item)}\n target=${item.external ? '_blank' : nothing}\n @mousedown=${(e) => this.handleNavItemMouseDown(e, item)}\n @click=${(e) => this.handleNavItemClick(e, item)}\n @contextmenu=${(e) => this.handleNavItemContextMenu(e, item)}\n >\n ${this.navIconsDisplayed && !isChild ? html `<span class=\"nav-item__icon\">${unsafeHTML(item.icon || this.defaultNavItemIcon)}</span>` : nothing}\n <span class=\"nav-item__label\">${item.label}</span>\n </a>\n `;\n }\n // todo - don't hardcode breadcrumbs\n render() {\n const topLevelItems = this.getNavItemChildren(null);\n // Use unfiltered count to determine if search should show (so it doesn't disappear while typing)\n const totalTopLevelItems = this.getComputedNav().filter(item => item.parentId === null).length;\n return html `\n <div class=${classMap({\n 'progress': true,\n 'progress--loading': this.pendingRequests > 0,\n })}>\n <div class=\"progress__track\"></div>\n <div class=\"progress__bar progress__bar--primary\">\n <span class=\"progress__bar-inner\"></span>\n </div>\n <div class=\"progress__bar progress__bar--secondary\">\n <span class=\"progress__bar-inner\"></span>\n </div>\n </div>\n \n ${this.subbar ? html `\n <kr-subbar\n menu\n .breadcrumbs=${this.breadcrumbs}\n @menu-click=${this.handleMenuClick}\n >\n <slot name=\"subbar\"></slot>\n </kr-subbar>\n ` : nothing}\n\n <div class=\"wrapper\">\n ${this.navEnabled ? html `\n <nav class=${classMap({\n 'nav': true,\n 'nav--scrolled': this.isNavScrolled,\n 'nav--opened': !this.subbar || this.isNavOpened,\n })}>\n <div class=\"nav-header\" @click=${this.handleNavHeaderClick}>\n ${this.label\n ? html `<span class=\"nav-title\">${this.label}</span>`\n : this.logo\n ? html `<img\n class=\"nav-logo\"\n src=${this.logo}\n alt=\"Logo\"\n />`\n : nothing}\n </div>\n <div class=\"nav-content\" @scroll=${this.handleNavScroll}>\n ${totalTopLevelItems > 20 ? html `\n <div class=\"nav-search\">\n <div class=\"nav-search__wrapper\">\n <span class=\"nav-search__icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\n </svg>\n </span>\n <input\n class=\"nav-search__input\"\n type=\"text\"\n placeholder=\"Search...\"\n .value=${this.navQuery}\n @input=${this.handleNavQueryChange}\n />\n ${this.navQuery ? html `\n <button class=\"nav-search__clear\" @click=${this.handleNavQueryClear}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\n </svg>\n </button>\n ` : nothing}\n </div>\n </div>\n ` : nothing}\n <div class=\"nav-items\">\n ${topLevelItems.map((item) => this.renderNavItem(item))}\n </div>\n </div>\n <!-- <div class=\"nav-footer\">\n ${this.isEditing ? this.renderEditFooter() : this.renderNormalFooter()}\n </div> -->\n </nav>\n ` : nothing}\n\n <main class=\"main\">\n <slot></slot>\n </main>\n </div>\n \n `;\n }\n};\nKRScaffold.styles = css `\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n font-size: 14px;\n --kr-scaffold-nav-width: 250px;\n\n /* Default to light scheme */\n --kr-scaffold-nav-bg: #F3F7FC;\n --kr-scaffold-nav-text: #000000;\n --kr-scaffold-nav-text-active: #000000;\n --kr-scaffold-nav-hover: #f3f4f6;\n --kr-scaffold-nav-active-bg: #e5e7eb;\n --kr-scaffold-nav-border: rgb(229, 229, 228);\n --kr-scaffold-nav-divider: #e5e7eb;\n --kr-scaffold-nav-search-bg: #ffffff;\n --kr-scaffold-nav-search-border: #d1d5db;\n }\n\n /* Dark scheme */\n :host([scheme=\"dark\"]) {\n --kr-scaffold-nav-bg: #10172a;\n --kr-scaffold-nav-text: rgb(255 255 255 / 80%);\n --kr-scaffold-nav-text-active: #ffffff;\n --kr-scaffold-nav-hover: rgba(255, 255, 255, 0.05);\n --kr-scaffold-nav-active-bg: rgb(255 255 255 / 12%);\n --kr-scaffold-nav-border: transparent;\n --kr-scaffold-nav-divider: rgba(255, 255, 255, 0.06);\n --kr-scaffold-nav-search-bg: rgba(255, 255, 255, 0.15);\n --kr-scaffold-nav-search-border: rgba(255, 255, 255, 0.3);\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n /* Nav */\n .nav {\n width: var(--kr-scaffold-nav-width);\n background: var(--kr-scaffold-nav-bg);\n color: var(--kr-scaffold-nav-text);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-right: 1px solid var(--kr-scaffold-nav-border);\n transition: margin-left 0.3s ease;\n margin-left: calc(-1 * var(--kr-scaffold-nav-width));\n flex: 1;\n max-width: var(--kr-scaffold-nav-width);\n }\n\n .nav--opened {\n margin-left: 0;\n }\n\n .wrapper {\n display: flex;\n flex: 1;\n min-height: 0;\n max-height: 100%;\n height: 100%;\n }\n\n .nav-header {\n padding: 20px;\n display: flex;\n align-items: center;\n position: relative;\n z-index: 1;\n transition: box-shadow 0.2s ease;\n cursor: pointer;\n }\n\n .nav--scrolled .nav-header {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n }\n\n .nav-logo {\n max-width: 100%;\n height: 32px;\n }\n\n .nav-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--kr-scaffold-nav-text-active);\n letter-spacing: .2px;\n }\n\n .nav-search {\n padding: 4px 0 8px;\n }\n\n .nav-search__wrapper {\n display: flex;\n align-items: center;\n background: var(--kr-scaffold-nav-search-bg);\n border-radius: 8px;\n padding: 0 12px;\n height: 40px;\n gap: 8px;\n border: 1px solid var(--kr-scaffold-nav-search-border);\n transition: all 0.15s ease;\n }\n\n .nav-search__icon {\n width: 18px;\n height: 18px;\n flex-shrink: 0;\n opacity: 0.6;\n }\n\n .nav-search__icon svg {\n width: 100%;\n height: 100%;\n fill: currentColor;\n }\n\n .nav-search__input {\n flex: 1;\n background: none;\n border: none;\n outline: none;\n color: var(--kr-scaffold-nav-text-active);\n font-size: 13px;\n font-family: inherit;\n min-width: 0;\n }\n\n .nav-search__input::placeholder {\n color: var(--kr-scaffold-nav-text);\n opacity: 0.7;\n }\n\n .nav-search__clear {\n width: 18px;\n height: 18px;\n padding: 0;\n background: none;\n border: none;\n color: var(--kr-scaffold-nav-text);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0.6;\n transition: opacity 0.15s ease;\n }\n\n .nav-search__clear:hover {\n opacity: 1;\n }\n\n .nav-search__clear svg {\n width: 100%;\n height: 100%;\n fill: currentColor;\n }\n\n .nav-content {\n flex: 1;\n overflow-y: auto;\n padding: 0 9px 12px 8px;\n }\n\n .nav-footer {\n padding: 12px;\n border-top: 1px solid var(--kr-scaffold-nav-divider);\n }\n\n .user {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .user:hover {\n background: var(--kr-scaffold-nav-hover);\n }\n\n .user__avatar {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: var(--kr-scaffold-avatar-bg, #beea4e);\n color: var(--kr-scaffold-avatar-text, #10172a);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n font-weight: 600;\n flex-shrink: 0;\n overflow: hidden;\n }\n\n .user__avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .user__info {\n flex: 1;\n min-width: 0;\n }\n\n .user__name {\n font-size: 13px;\n font-weight: 500;\n color: var(--kr-scaffold-nav-text-active);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .user__email {\n font-size: 12px;\n color: var(--kr-scaffold-nav-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .user-menu-container {\n position: relative;\n }\n\n .user-menu {\n position: absolute;\n bottom: 100%;\n left: 0;\n right: 0;\n margin-bottom: 8px;\n background: var(--kr-scaffold-nav-bg);\n border: 1px solid var(--kr-scaffold-nav-divider);\n border-radius: 8px;\n padding: 4px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);\n }\n\n .user-menu__item {\n display: block;\n width: 100%;\n padding: 10px 12px;\n background: none;\n border: none;\n color: var(--kr-scaffold-nav-text);\n font-size: 13px;\n font-family: inherit;\n text-align: left;\n cursor: pointer;\n border-radius: 6px;\n transition: background 0.15s ease;\n }\n\n .user-menu__item:hover {\n background: var(--kr-scaffold-nav-hover);\n color: var(--kr-scaffold-nav-text-active);\n }\n\n .user-menu__divider {\n height: 1px;\n background: var(--kr-scaffold-nav-divider);\n margin: 4px 0;\n }\n\n /* Main */\n .main {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n background: transparent;\n display: flex;\n flex-direction: column;\n }\n\n .breadcrumbs {\n height: 32px;\n padding: 0 16px;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #6b7280;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n\n .breadcrumbs a {\n color: #6b7280;\n text-decoration: none;\n }\n\n .breadcrumbs a:hover {\n color: #111827;\n text-decoration: underline;\n }\n\n .breadcrumbs__separator {\n color: #d1d5db;\n }\n\n .breadcrumbs__current {\n color: #111827;\n font-weight: 500;\n }\n\n .main__content {\n flex: 1;\n overflow-y: auto;\n }\n\n /* Nav Items */\n .nav-items {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .nav-item {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 0 12px;\n height: 32px;\n border-radius: 8px;\n color: var(--kr-scaffold-nav-text);\n text-decoration: none;\n cursor: pointer;\n border: none;\n background: none;\n width: 100%;\n text-align: left;\n font-size: 13px;\n font-weight: 400;\n font-family: inherit;\n transition: all 0.15s ease;\n }\n\n .nav-item:hover {\n background: #F3F7FC;\n color: var(--kr-scaffold-nav-text-active);\n }\n\n .nav-item--active,\n .nav-item--active:hover {\n background: #e1e9f6;\n color: #1a2332;\n font-weight: 700;\n }\n\n .nav-item__icon {\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .nav-item__icon svg {\n width: 16px;\n height: 16px;\n fill: currentColor;\n }\n\n .nav-item__label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n letter-spacing: 0.14px;\n }\n\n .nav-item__chevron {\n width: 16px;\n height: 16px;\n transition: transform 0.2s ease;\n transform: rotate(-90deg);\n stroke: currentColor;\n }\n\n .nav-item--expanded .nav-item__chevron {\n transform: rotate(0deg);\n }\n\n .nav-group {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n height: 0;\n }\n\n .nav-group--expanded {\n height: auto;\n }\n\n .nav-group .nav-item {\n padding: 0 12px 0 44px;\n height: 32px;\n font-size: 13px;\n font-weight: 400;\n margin-top: 2px;\n flex-shrink: 0;\n }\n\n .nav-group .nav-item--active,\n .nav-group .nav-item--active:hover {\n font-weight: 700;\n }\n\n .nav-group .nav-item:first-child {\n margin-top: 0;\n }\n\n /* Nav items in groups when icons are hidden */\n :host(:not([nav-icons-displayed])) .nav-group .nav-item {\n padding-left: 24px;\n }\n\n /* Sections */\n .nav-section {\n padding: 16px 12px 8px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.55px;\n color: var(--kr-scaffold-nav-text);\n opacity: 0.6;\n }\n\n .nav-section:first-child {\n padding-top: 0;\n }\n\n /* Edit mode actions */\n .edit-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .edit-actions__btn {\n display: block;\n width: 100%;\n padding: 10px 12px;\n background: var(--kr-scaffold-nav-hover);\n border: none;\n color: var(--kr-scaffold-nav-text);\n font-size: 13px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n border-radius: 6px;\n transition: background 0.15s ease;\n }\n\n .edit-actions__btn:hover {\n background: var(--kr-scaffold-nav-active-bg);\n color: var(--kr-scaffold-nav-text-active);\n }\n\n .edit-actions__btn--primary {\n background: #beea4e;\n color: #10172a;\n }\n\n .edit-actions__btn--primary:hover {\n background: #d4f472;\n color: #10172a;\n }\n\n .edit-actions__secondary {\n display: flex;\n gap: 8px;\n }\n\n .edit-actions__secondary .edit-actions__btn {\n flex: 1;\n }\n\n /* Hidden/inactive items in edit mode */\n .nav-item--hidden {\n opacity: 0.4;\n font-style: italic;\n }\n\n .nav-item--hidden:hover {\n opacity: 0.6;\n }\n\n /* Dragging state */\n :host(.kr-scaffold--dragging),\n :host(.kr-scaffold--dragging) * {\n cursor: grabbing;\n user-select: none;\n }\n\n .nav-item-drag-preview {\n position: fixed;\n pointer-events: none;\n z-index: 1000;\n opacity: 0.9;\n background: var(--kr-scaffold-nav-bg);\n border: 1px solid var(--kr-scaffold-nav-divider);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);\n padding: 0 12px;\n height: 40px;\n min-width: 200px;\n display: flex;\n align-items: center;\n gap: 16px;\n color: var(--kr-scaffold-nav-text-active);\n font-size: 13px;\n font-weight: 500;\n }\n\n /* Drop indicator */\n .nav-item--drop-above,\n .nav-item--drop-below,\n .nav-item--drop-center {\n position: relative;\n }\n\n .nav-item--drop-above::before,\n .nav-item--drop-below::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n height: 2px;\n background: #beea4e;\n }\n\n .nav-item--drop-above::before {\n top: 0;\n }\n\n .nav-item--drop-below::after {\n bottom: 0;\n }\n\n .nav-item--drop-center {\n background: var(--kr-scaffold-nav-active-bg);\n }\n\n .breadcrumbs {\n height: 32px;\n padding: 0 16px;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #6b7280;\n //background: #f9fafb;\n background: #beea4e;\n border-top: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n\n .breadcrumbs a {\n //color: #6b7280;\n color: #10172a;\n font-size: 13px;\n font-weight: 600;\n text-decoration: none;\n }\n\n .breadcrumbs a:hover {\n color: #111827;\n text-decoration: underline;\n }\n\n .breadcrumbs__separator {\n color: #d1d5db;\n }\n\n .breadcrumbs__current {\n color: #111827;\n font-weight: 500;\n }\n\n /* Progress bar */\n .progress {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n overflow-x: hidden;\n z-index: 1000;\n display: none;\n }\n\n .progress--loading {\n display: block;\n }\n\n .progress__track {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 100%;\n background: rgba(190, 234, 78, 0.3);\n }\n\n .progress__bar {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 100%;\n transform-origin: left center;\n }\n\n .progress__bar-inner {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n background: #beea4e;\n }\n\n .progress__bar--primary {\n left: -145.166611%;\n }\n\n .progress--loading .progress__bar--primary {\n animation: progress-primary-translate 2s infinite linear;\n }\n\n .progress--loading .progress__bar--primary .progress__bar-inner {\n animation: progress-primary-scale 2s infinite linear;\n }\n\n .progress__bar--secondary {\n left: -54.888891%;\n }\n\n .progress--loading .progress__bar--secondary {\n animation: progress-secondary-translate 2s infinite linear;\n }\n\n .progress--loading .progress__bar--secondary .progress__bar-inner {\n animation: progress-secondary-scale 2s infinite linear;\n }\n\n @keyframes progress-primary-translate {\n 0% {\n transform: translateX(0);\n }\n 20% {\n animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819);\n transform: translateX(0);\n }\n 59.15% {\n animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);\n transform: translateX(83.67142%);\n }\n 100% {\n transform: translateX(200.611057%);\n }\n }\n\n @keyframes progress-primary-scale {\n 0% {\n transform: scaleX(0.08);\n }\n 36.65% {\n animation-timing-function: cubic-bezier(0.334731, 0.12482, 0.785844, 1);\n transform: scaleX(0.08);\n }\n 69.15% {\n animation-timing-function: cubic-bezier(0.06, 0.11, 0.6, 1);\n transform: scaleX(0.661479);\n }\n 100% {\n transform: scaleX(0.08);\n }\n }\n\n @keyframes progress-secondary-translate {\n 0% {\n animation-timing-function: cubic-bezier(0.15, 0, 0.515058, 0.409685);\n transform: translateX(0);\n }\n 25% {\n animation-timing-function: cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);\n transform: translateX(37.651913%);\n }\n 48.35% {\n animation-timing-function: cubic-bezier(0.4, 0.627035, 0.6, 0.902026);\n transform: translateX(84.386165%);\n }\n 100% {\n transform: translateX(160.277782%);\n }\n }\n\n @keyframes progress-secondary-scale {\n 0% {\n animation-timing-function: cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);\n transform: scaleX(0.08);\n }\n 19.15% {\n animation-timing-function: cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);\n transform: scaleX(0.457104);\n }\n 44.15% {\n animation-timing-function: cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);\n transform: scaleX(0.72796);\n }\n 100% {\n transform: scaleX(0.08);\n }\n }\n `;\n__decorate([\n property({ type: String })\n], KRScaffold.prototype, \"logo\", void 0);\n__decorate([\n property({ type: String })\n], KRScaffold.prototype, \"label\", void 0);\n__decorate([\n property({\n type: String,\n attribute: 'home-url'\n })\n], KRScaffold.prototype, \"homeUrl\", void 0);\n__decorate([\n property({\n type: String,\n reflect: true\n })\n], KRScaffold.prototype, \"scheme\", void 0);\n__decorate([\n property({ type: Array })\n], KRScaffold.prototype, \"nav\", void 0);\n__decorate([\n property({\n type: Boolean,\n attribute: 'nav-icons-displayed',\n reflect: true\n })\n], KRScaffold.prototype, \"navIconsDisplayed\", void 0);\n__decorate([\n property({\n type: Boolean,\n attribute: 'nav-expanded'\n })\n], KRScaffold.prototype, \"navExpanded\", void 0);\n__decorate([\n property({ type: Object })\n], KRScaffold.prototype, \"user\", void 0);\n__decorate([\n property({ type: Boolean })\n], KRScaffold.prototype, \"subbar\", void 0);\n__decorate([\n property({\n type: Boolean,\n attribute: 'nav-enabled'\n })\n], KRScaffold.prototype, \"navEnabled\", void 0);\n__decorate([\n property({\n type: String,\n attribute: 'user-type'\n })\n], KRScaffold.prototype, \"userType\", void 0);\n__decorate([\n property({ type: Array })\n], KRScaffold.prototype, \"breadcrumbs\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"navItemsExpanded\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"navQuery\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"activeNavItemId\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"isNavScrolled\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"isNavOpened\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"isEditing\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"isUserMenuOpen\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"pref\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"draggedNavItemId\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"navItemDropTargetId\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"navItemDropPosition\", void 0);\n__decorate([\n state()\n], KRScaffold.prototype, \"pendingRequests\", void 0);\nKRScaffold = __decorate([\n customElement('kr-scaffold')\n], KRScaffold);\nexport { KRScaffold };\n//# sourceMappingURL=scaffold.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\n/**\n * Secondary navigation component for screens within the scaffold.\n * Provides a simple nav drawer for sub-navigation within a page/screen.\n * Typically used when viewing details of a specific entity (e.g., Company, Contact).\n *\n * ## Usage\n * ```html\n * <kr-screen-nav\n * label=\"Acme Corporation\"\n * subLabel=\"Company\"\n * .items=${[\n * { id: 'overview', label: 'Overview', url: '/companies/123/overview' },\n * { id: 'contacts', label: 'Contacts', url: '/companies/123/contacts' },\n * { id: 'activity', label: 'Activity', url: '/companies/123/activity' },\n * ]}\n * activeId=\"overview\"\n * >\n * <div>Screen content here</div>\n * </kr-screen-nav>\n * ```\n *\n * @slot - The main screen content\n *\n * @property {string} label - Main label (e.g., entity name like \"Acme Corporation\")\n * @property {string} subLabel - Sub label (e.g., entity type like \"Company\")\n * @property {KRScreenNavItem[]} items - Navigation items as JSON array\n * @property {string} activeId - Currently active item ID\n */\nlet KRScreenNav = class KRScreenNav extends LitElement {\n constructor() {\n super(...arguments);\n /**\n * Main label (e.g., entity name like \"Acme Corporation\")\n */\n this.label = '';\n /**\n * Sub label (e.g., entity type like \"Company\")\n */\n this.subLabel = '';\n /**\n * Navigation items\n */\n this.items = [];\n /**\n * Currently active item ID. Auto-detected from the URL by default.\n * Can be set explicitly by the parent to override.\n */\n this.activeId = '';\n this.handlePopstate = () => {\n this.syncActiveFromUrl();\n };\n }\n connectedCallback() {\n super.connectedCallback();\n // Defer so property bindings (.items) have been applied\n requestAnimationFrame(() => this.syncActiveFromUrl());\n window.addEventListener('popstate', this.handlePopstate);\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener('popstate', this.handlePopstate);\n }\n /**\n * Handles click events on navigation items.\n *\n * Dispatches a cancelable `nav-item-click` custom event.\n * If a listener calls `preventDefault()` on the custom event, native browser\n * navigation is prevented. Otherwise, the default `<a href>` navigation\n * proceeds normally.\n *\n * The `@krubble/angular` package provides `KRScreenNavDirective` which\n * automatically listens for this event and handles navigation using\n * Angular's router.\n *\n * @param e - The original click event\n * @param item - The nav item that was clicked\n */\n handleNavItemClick(e, item) {\n const navEvent = new CustomEvent('nav-item-click', {\n detail: { item },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n this.dispatchEvent(navEvent);\n // If a listener called preventDefault(), prevent the native navigation\n if (navEvent.defaultPrevented) {\n e.preventDefault();\n }\n this.activeId = item.id;\n }\n syncActiveFromUrl() {\n const pathname = window.location.pathname;\n const match = this.items.find((item) => {\n if (!item.url) {\n return false;\n }\n // Absolute URL — exact match\n if (item.url.startsWith('/')) {\n return pathname === item.url;\n }\n // Relative URL — match against the end of the pathname\n return pathname.endsWith('/' + item.url);\n });\n if (match) {\n this.activeId = match.id;\n }\n }\n render() {\n return html `\n <nav class=\"nav\">\n ${this.label ? html `\n <div class=\"nav-header\">\n <div class=\"nav-header__text\">\n ${this.subLabel ? html `<div class=\"nav-header__subtitle\">${this.subLabel}</div>` : nothing}\n <div class=\"nav-header__title\">${this.label}</div>\n </div>\n </div>\n ` : nothing}\n <div class=\"nav-content\">\n <div class=\"nav-items\">\n ${this.items.map((item) => html `\n <a\n class=${classMap({\n 'nav-item': true,\n 'nav-item--active': item.id === this.activeId\n })}\n href=${item.url || '#'}\n @click=${(e) => this.handleNavItemClick(e, item)}\n >\n ${item.label}\n </a>\n `)}\n </div>\n </div>\n </nav>\n <main class=\"content\">\n <div class=\"content__main\">\n <slot></slot>\n </div>\n </main>\n `;\n }\n};\nKRScreenNav.styles = css `\n :host {\n display: flex;\n height: 100%;\n }\n\n .nav {\n width: 200px;\n background: white;\n border-right: 1px solid #e5e7eb;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n }\n\n .nav-header {\n padding: 20px 16px 16px;\n }\n\n .nav-header__text {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .nav-header__title {\n font-size: 20px;\n font-weight: 600;\n color: #111827;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n }\n\n .nav-header__subtitle {\n font-size: 12px;\n font-weight: 400;\n color: rgb(0 0 0 / 70%);\n line-height: 1;\n }\n\n .nav-content {\n flex: 1;\n overflow-y: auto;\n padding: 0 0 12px;\n }\n\n .nav-items {\n display: flex;\n flex-direction: column;\n padding: 0 8px;\n }\n\n .nav-item {\n display: block;\n padding: 0 12px;\n height: 32px;\n line-height: 32px;\n letter-spacing: 0.13px;\n color: rgb(32, 33, 36);\n text-decoration: none;\n font-size: 13px;\n font-weight: 400;\n font-family: inherit;\n border-radius: 8px;\n transition: all 0.15s ease;\n }\n\n .nav-item:hover {\n background: rgba(0, 0, 0, 0.04);\n color: #163052;\n }\n\n .nav-item--active {\n background: #e1e9f6;\n color: #1a2332;\n font-weight: 700;\n }\n\n .content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .content__main {\n flex: 1;\n overflow-y: auto;\n }\n `;\n__decorate([\n property({ type: String })\n], KRScreenNav.prototype, \"label\", void 0);\n__decorate([\n property({ type: String })\n], KRScreenNav.prototype, \"subLabel\", void 0);\n__decorate([\n property({ type: Array })\n], KRScreenNav.prototype, \"items\", void 0);\n__decorate([\n property({ type: String })\n], KRScreenNav.prototype, \"activeId\", void 0);\nKRScreenNav = __decorate([\n customElement('kr-screen-nav')\n], KRScreenNav);\nexport { KRScreenNav };\n//# sourceMappingURL=screen-nav.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n/**\n * Detail screen component for viewing/editing entity details.\n * Displays a form-like layout with labeled fields centered in a single column.\n *\n * ## Usage\n * ```html\n * <kr-screen-detail title=\"Company Details\">\n * <kr-button slot=\"actions\">Save</kr-button>\n * <kr-text-field label=\"Company Name\" value=\"Acme Corporation\"></kr-text-field>\n * <kr-text-field label=\"Industry\" value=\"Technology\"></kr-text-field>\n * <kr-text-field label=\"Website\" value=\"https://acme.com\"></kr-text-field>\n * </kr-screen-detail>\n * ```\n *\n * @slot - Form fields and content (centered, max-width 480px)\n * @slot actions - Action buttons displayed in the header on the right\n *\n * @property {string} title - Section title (e.g., \"Company Details\")\n */\nlet KRScreenDetail = class KRScreenDetail extends LitElement {\n constructor() {\n super(...arguments);\n /**\n * Section title\n */\n this.title = '';\n }\n render() {\n return html `\n <div class=\"header\">\n <h2 class=\"header__title\">${this.title}</h2>\n <div class=\"header__actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n <div class=\"content\">\n <div class=\"content__inner\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n};\nKRScreenDetail.styles = css `\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n\n .header {\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 24px;\n background: #ffffff;\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n\n .header__title {\n font-size: 18px;\n font-weight: 600;\n color: #111827;\n margin: 0;\n }\n\n .header__actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n display: flex;\n justify-content: center;\n }\n\n .content__inner {\n width: 100%;\n max-width: 700px;\n }\n `;\n__decorate([\n property({ type: String })\n], KRScreenDetail.prototype, \"title\", void 0);\nKRScreenDetail = __decorate([\n customElement('kr-screen-detail')\n], KRScreenDetail);\nexport { KRScreenDetail };\n//# sourceMappingURL=screen-detail.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\n/**\n * Secondary bar component that sits below the main app bar.\n *\n * @slot - Content to display in the subbar (right side)\n */\nlet KRSubbar = class KRSubbar extends LitElement {\n constructor() {\n super(...arguments);\n /**\n * Array of breadcrumb items to display\n */\n this.breadcrumbs = [];\n /**\n * Whether to show the menu icon\n */\n this.menu = false;\n }\n _handleMenuClick() {\n this.dispatchEvent(new CustomEvent('menu-click', {\n bubbles: true,\n composed: true\n }));\n }\n /**\n * Handles click on a breadcrumb link.\n * Dispatches a cancelable event so SPA routers can intercept.\n */\n _handleBreadcrumbClick(e, crumb, isCurrent) {\n // Don't navigate if it's the current/last breadcrumb\n if (isCurrent || !crumb.url) {\n e.preventDefault();\n return;\n }\n // Allow Ctrl/Cmd+click and middle-click to open in new tab without SPA navigation\n if (e.ctrlKey || e.metaKey || e.button === 1) {\n return;\n }\n const breadcrumbEvent = new CustomEvent('breadcrumb-click', {\n detail: { breadcrumb: crumb },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n this.dispatchEvent(breadcrumbEvent);\n // If a listener called preventDefault(), prevent the native navigation\n if (breadcrumbEvent.defaultPrevented) {\n e.preventDefault();\n }\n }\n render() {\n return html `\n ${this.menu ? html `\n <div class=\"menu\" @click=${this._handleMenuClick}>\n <svg\n class=\"menu__icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <line\n x1=\"3\"\n y1=\"6\"\n x2=\"21\"\n y2=\"6\"\n ></line>\n <line\n x1=\"3\"\n y1=\"12\"\n x2=\"21\"\n y2=\"12\"\n ></line>\n <line\n x1=\"3\"\n y1=\"18\"\n x2=\"21\"\n y2=\"18\"\n ></line>\n </svg>\n </div>\n ` : nothing}\n <div class=\"breadcrumbs\">\n ${this.breadcrumbs.map((crumb, index) => {\n const isCurrent = index === this.breadcrumbs.length - 1;\n // The href gets the base href prepended so Cmd/Ctrl+click opens the right\n // URL in a new tab. crumb.url itself is left intact (base-relative) and\n // passed to Angular via breadcrumb-click — its Router applies the base\n // itself. e.g. base \"/operations/\" + crumb.url \"/settings\" ->\n // \"/operations/settings\".\n const baseHref = document.querySelector('base')?.getAttribute('href') || '/';\n let href = '#';\n if (crumb.url) {\n let path = crumb.url;\n if (crumb.url.startsWith('/')) {\n path = crumb.url.slice(1);\n }\n href = baseHref + path;\n if (!baseHref.endsWith('/')) {\n href = baseHref + '/' + path;\n }\n }\n return html `\n ${index > 0 ? html `<span class=\"breadcrumb-separator\">/</span>` : ''}\n <a\n class=${classMap({\n 'breadcrumb': true,\n 'breadcrumb--current': isCurrent\n })}\n href=${href}\n @click=${(e) => this._handleBreadcrumbClick(e, crumb, isCurrent)}\n >${crumb.label}</a>\n `;\n })}\n </div>\n <div class=\"content\">\n <slot></slot>\n </div>\n\n `;\n }\n};\nKRSubbar.styles = css `\n :host {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n height: 40px;\n background: #E2E9F6;\n border-bottom: 1px solid rgb(229, 229, 228);\n align-items: center;\n padding: 0 16px;\n width: 100%;\n flex-shrink: 0;\n }\n\n .breadcrumbs {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n flex: 1;\n }\n\n .breadcrumb {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n font-size: 13px;\n }\n\n .breadcrumb:hover {\n text-decoration: underline;\n }\n\n .breadcrumb--current {\n cursor: default;\n }\n\n .breadcrumb--current:hover {\n text-decoration: none;\n }\n\n .breadcrumb-separator {\n color: #9ca3af;\n font-size: 12px;\n }\n\n .content {\n display: flex;\n align-items: center;\n margin-left: auto;\n }\n\n .menu {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n margin-right: 8px;\n cursor: pointer;\n }\n\n .menu__icon {\n width: 18px;\n height: 18px;\n }\n `;\n__decorate([\n property({ type: Array })\n], KRSubbar.prototype, \"breadcrumbs\", void 0);\n__decorate([\n property({ type: Boolean })\n], KRSubbar.prototype, \"menu\", void 0);\nKRSubbar = __decorate([\n customElement('kr-subbar')\n], KRSubbar);\nexport { KRSubbar };\n//# sourceMappingURL=subbar.js.map","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nexport class KRRouter {\n static configure(config) {\n KRRouter.base = config.base;\n KRRouter.routes = config.routes;\n // Intercept <a> clicks for client-side navigation\n window.addEventListener('click', (e) => {\n const anchor = e.composedPath().find(el => el instanceof HTMLAnchorElement);\n if (!anchor) {\n return;\n }\n if (anchor.origin !== window.location.origin) {\n return;\n }\n if (!anchor.pathname.startsWith(KRRouter.base)) {\n return;\n }\n e.preventDefault();\n KRRouter.navigate(anchor.pathname);\n });\n }\n static navigate(path) {\n let fullPath = path;\n if (!path.startsWith('/')) {\n fullPath = KRRouter.base + '/' + path;\n }\n window.history.pushState({}, '', fullPath);\n window.dispatchEvent(new PopStateEvent('popstate'));\n }\n static getParams() {\n const matched = KRRouter.matchAll();\n const params = {};\n for (const match of matched) {\n for (const key in match.params) {\n params[key] = decodeURIComponent(match.params[key]);\n }\n }\n return params;\n }\n static outlet(level) {\n const matched = KRRouter.matchAll();\n if (level >= matched.length) {\n return null;\n }\n const match = matched[level];\n const tag = match.route.component;\n const cached = KRRouter.elementCache.get(level + ':' + tag);\n if (cached) {\n return cached;\n }\n // Clear old cache entry for this level\n for (const key of KRRouter.elementCache.keys()) {\n if (key.startsWith(level + ':')) {\n KRRouter.elementCache.delete(key);\n }\n }\n const el = document.createElement(tag);\n KRRouter.elementCache.set(level + ':' + tag, el);\n return el;\n }\n static matchAll() {\n const path = window.location.pathname;\n let relative = path;\n if (path.startsWith(KRRouter.base)) {\n relative = path.slice(KRRouter.base.length);\n }\n const segments = relative.split('/').filter(s => s);\n return KRRouter.matchRoutes(KRRouter.routes, segments);\n }\n static matchRoutes(routes, segments) {\n for (const route of routes) {\n const routeSegments = route.path.split('/').filter(s => s);\n if (routeSegments.length === 0 && segments.length === 0) {\n return [{\n route,\n params: {}\n }];\n }\n if (routeSegments.length === 0) {\n continue;\n }\n if (segments.length < routeSegments.length) {\n continue;\n }\n const params = {};\n let matched = true;\n for (let i = 0; i < routeSegments.length; i++) {\n if (routeSegments[i].startsWith(':')) {\n params[routeSegments[i].slice(1)] = segments[i];\n }\n else if (routeSegments[i] !== segments[i]) {\n matched = false;\n break;\n }\n }\n if (!matched) {\n continue;\n }\n const remaining = segments.slice(routeSegments.length);\n // If there are remaining segments but no children, this route doesn't fully match — try next route\n if (remaining.length > 0 && !route.children) {\n continue;\n }\n const result = [{\n route,\n params\n }];\n if (route.children && remaining.length > 0) {\n const childMatches = KRRouter.matchRoutes(route.children, remaining);\n if (childMatches.length > 0) {\n result.push(...childMatches);\n return result;\n }\n }\n // No remaining segments + default child — redirect\n if (route.children && remaining.length === 0 && route.default) {\n window.history.replaceState({}, '', window.location.pathname + '/' + route.default);\n const childMatches = KRRouter.matchRoutes(route.children, [route.default]);\n if (childMatches.length > 0) {\n result.push(...childMatches);\n return result;\n }\n }\n return result;\n }\n return [];\n }\n}\nKRRouter.base = '';\nKRRouter.routes = [];\nKRRouter.elementCache = new Map();\nlet KRRouterOutlet = class KRRouterOutlet extends LitElement {\n constructor() {\n super(...arguments);\n this.level = -1;\n this.handlePopState = () => {\n this.requestUpdate();\n };\n }\n connectedCallback() {\n super.connectedCallback();\n this.level = this.detectLevel();\n window.addEventListener('popstate', this.handlePopState);\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener('popstate', this.handlePopState);\n }\n detectLevel() {\n let level = 0;\n let node = this;\n while (node) {\n if (node instanceof ShadowRoot) {\n node = node.host;\n continue;\n }\n if (node instanceof HTMLElement && node.tagName === 'KR-ROUTER-OUTLET' && node !== this) {\n level++;\n }\n if (node instanceof HTMLElement) {\n node = node.parentNode;\n }\n else {\n node = null;\n }\n }\n return level;\n }\n render() {\n const el = KRRouter.outlet(this.level);\n if (!el) {\n return html ``;\n }\n return html `${el}`;\n }\n};\nKRRouterOutlet.styles = css `\n :host {\n display: block;\n height: 100%;\n }\n `;\nKRRouterOutlet = __decorate([\n customElement('kr-router-outlet')\n], KRRouterOutlet);\nexport { KRRouterOutlet };\n//# sourceMappingURL=router.js.map","import{noChange as t}from\"../lit-html.js\";import{directive as e,Directive as r,PartType as s}from\"../directive.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const n=\"important\",i=\" !\"+n,o=e(class extends r{constructor(t){if(super(t),t.type!==s.ATTRIBUTE||\"style\"!==t.name||t.strings?.length>2)throw Error(\"The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.\")}render(t){return Object.keys(t).reduce((e,r)=>{const s=t[r];return null==s?e:e+`${r=r.includes(\"-\")?r:r.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,\"-$&\").toLowerCase()}:${s};`},\"\")}update(e,[r]){const{style:s}=e.element;if(void 0===this.ft)return this.ft=new Set(Object.keys(r)),this.render(r);for(const t of this.ft)null==r[t]&&(this.ft.delete(t),t.includes(\"-\")?s.removeProperty(t):s[t]=null);for(const t in r){const e=r[t];if(null!=e){this.ft.add(t);const r=\"string\"==typeof e&&e.endsWith(i);t.includes(\"-\")||r?s.setProperty(t,r?e.slice(0,-11):e,r?n:\"\"):s[t]=e}}return t}});export{o as styleMap};\n//# sourceMappingURL=style-map.js.map\n","import{_$LH as o}from\"./lit-html.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{I:t}=o,i=o=>o,n=o=>null===o||\"object\"!=typeof o&&\"function\"!=typeof o,e={HTML:1,SVG:2,MATHML:3},l=(o,t)=>void 0===t?void 0!==o?._$litType$:o?._$litType$===t,d=o=>null!=o?._$litType$?.h,c=o=>void 0!==o?._$litDirective$,f=o=>o?._$litDirective$,r=o=>void 0===o.strings,s=()=>document.createComment(\"\"),v=(o,n,e)=>{const l=o._$AA.parentNode,d=void 0===n?o._$AB:n._$AA;if(void 0===e){const i=l.insertBefore(s(),d),n=l.insertBefore(s(),d);e=new t(i,n,o,o.options)}else{const t=e._$AB.nextSibling,n=e._$AM,c=n!==o;if(c){let t;e._$AQ?.(o),e._$AM=o,void 0!==e._$AP&&(t=o._$AU)!==n._$AU&&e._$AP(t)}if(t!==d||c){let o=e._$AA;for(;o!==t;){const t=i(o).nextSibling;i(l).insertBefore(o,d),o=t}}}return e},u=(o,t,i=o)=>(o._$AI(t,i),o),m={},p=(o,t=m)=>o._$AH=t,M=o=>o._$AH,h=o=>{o._$AR(),o._$AA.remove()},j=o=>{o._$AR()};export{e as TemplateResultType,j as clearPart,M as getCommittedValue,f as getDirectiveClass,v as insertPart,d as isCompiledTemplateResult,c as isDirectiveResult,n as isPrimitive,r as isSingleExpression,l as isTemplateResult,h as removePart,u as setChildPartValue,p as setCommittedValue};\n//# sourceMappingURL=directive-helpers.js.map\n","import{noChange as e}from\"../lit-html.js\";import{directive as s,Directive as t,PartType as r}from\"../directive.js\";import{getCommittedValue as l,setChildPartValue as o,insertPart as i,removePart as n,setCommittedValue as f}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst u=(e,s,t)=>{const r=new Map;for(let l=s;l<=t;l++)r.set(e[l],l);return r},c=s(class extends t{constructor(e){if(super(e),e.type!==r.CHILD)throw Error(\"repeat() can only be used in text expressions\")}dt(e,s,t){let r;void 0===t?t=s:void 0!==s&&(r=s);const l=[],o=[];let i=0;for(const s of e)l[i]=r?r(s,i):i,o[i]=t(s,i),i++;return{values:o,keys:l}}render(e,s,t){return this.dt(e,s,t).values}update(s,[t,r,c]){const d=l(s),{values:p,keys:a}=this.dt(t,r,c);if(!Array.isArray(d))return this.ut=a,p;const h=this.ut??=[],v=[];let m,y,x=0,j=d.length-1,k=0,w=p.length-1;for(;x<=j&&k<=w;)if(null===d[x])x++;else if(null===d[j])j--;else if(h[x]===a[k])v[k]=o(d[x],p[k]),x++,k++;else if(h[j]===a[w])v[w]=o(d[j],p[w]),j--,w--;else if(h[x]===a[w])v[w]=o(d[x],p[w]),i(s,v[w+1],d[x]),x++,w--;else if(h[j]===a[k])v[k]=o(d[j],p[k]),i(s,d[x],d[j]),j--,k++;else if(void 0===m&&(m=u(a,k,w),y=u(h,x,j)),m.has(h[x]))if(m.has(h[j])){const e=y.get(a[k]),t=void 0!==e?d[e]:null;if(null===t){const e=i(s,d[x]);o(e,p[k]),v[k]=e}else v[k]=o(t,p[k]),i(s,d[x],t),d[e]=null;k++}else n(d[j]),j--;else n(d[x]),x++;for(;k<=w;){const e=i(s,v[w+1]);o(e,p[k]),v[k++]=e}for(;x<=j;){const e=d[x++];null!==e&&n(e)}return this.ut=a,f(s,v),e}});export{c as repeat};\n//# sourceMappingURL=repeat.js.map\n","/**\n * marked v12.0.2 - a markdown parser\n * Copyright (c) 2011-2024, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\n/**\n * Gets the original marked default options.\n */\nfunction _getDefaults() {\n return {\n async: false,\n breaks: false,\n extensions: null,\n gfm: true,\n hooks: null,\n pedantic: false,\n renderer: null,\n silent: false,\n tokenizer: null,\n walkTokens: null\n };\n}\nlet _defaults = _getDefaults();\nfunction changeDefaults(newDefaults) {\n _defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = new RegExp(escapeTest.source, 'g');\nconst escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nconst escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\nconst escapeReplacements = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape$1(html, encode) {\n if (encode) {\n if (escapeTest.test(html)) {\n return html.replace(escapeReplace, getEscapeReplacement);\n }\n }\n else {\n if (escapeTestNoEncode.test(html)) {\n return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n return html;\n}\nconst unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\nfunction unescape(html) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon')\n return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\nconst caret = /(^|[^\\[])\\^/g;\nfunction edit(regex, opt) {\n let source = typeof regex === 'string' ? regex : regex.source;\n opt = opt || '';\n const obj = {\n replace: (name, val) => {\n let valSource = typeof val === 'string' ? val : val.source;\n valSource = valSource.replace(caret, '$1');\n source = source.replace(name, valSource);\n return obj;\n },\n getRegex: () => {\n return new RegExp(source, opt);\n }\n };\n return obj;\n}\nfunction cleanUrl(href) {\n try {\n href = encodeURI(href).replace(/%25/g, '%');\n }\n catch (e) {\n return null;\n }\n return href;\n}\nconst noopTest = { exec: () => null };\nfunction splitCells(tableRow, count) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n let escaped = false;\n let curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\')\n escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n }\n else {\n // add space before unescaped |\n return ' |';\n }\n }), cells = row.split(/ \\|/);\n let i = 0;\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) {\n cells.shift();\n }\n if (cells.length > 0 && !cells[cells.length - 1].trim()) {\n cells.pop();\n }\n if (count) {\n if (cells.length > count) {\n cells.splice(count);\n }\n else {\n while (cells.length < count)\n cells.push('');\n }\n }\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n }\n return cells;\n}\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n }\n else if (currChar !== c && invert) {\n suffLen++;\n }\n else {\n break;\n }\n }\n return str.slice(0, l - suffLen);\n}\nfunction findClosingBracket(str, b) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n let level = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\\\') {\n i++;\n }\n else if (str[i] === b[0]) {\n level++;\n }\n else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n const href = link.href;\n const title = link.title ? escape$1(link.title) : null;\n const text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n if (cap[0].charAt(0) !== '!') {\n lexer.state.inLink = true;\n const token = {\n type: 'link',\n raw,\n href,\n title,\n text,\n tokens: lexer.inlineTokens(text)\n };\n lexer.state.inLink = false;\n return token;\n }\n return {\n type: 'image',\n raw,\n href,\n title,\n text: escape$1(text)\n };\n}\nfunction indentCodeCompensation(raw, text) {\n const matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n if (matchIndentToCode === null) {\n return text;\n }\n const indentToCode = matchIndentToCode[1];\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(/^\\s+/);\n if (matchIndentInNode === null) {\n return node;\n }\n const [indentInNode] = matchIndentInNode;\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n return node;\n })\n .join('\\n');\n}\n/**\n * Tokenizer\n */\nclass _Tokenizer {\n options;\n rules; // set by the lexer\n lexer; // set by the lexer\n constructor(options) {\n this.options = options || _defaults;\n }\n space(src) {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0]\n };\n }\n }\n code(src) {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const text = cap[0].replace(/^ {1,4}/gm, '');\n return {\n type: 'code',\n raw: cap[0],\n codeBlockStyle: 'indented',\n text: !this.options.pedantic\n ? rtrim(text, '\\n')\n : text\n };\n }\n }\n fences(src) {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '');\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n text\n };\n }\n }\n heading(src) {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n // remove trailing #s\n if (/#$/.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n }\n else if (!trimmed || / $/.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[1].length,\n text,\n tokens: this.lexer.inline(text)\n };\n }\n }\n hr(src) {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: cap[0]\n };\n }\n }\n blockquote(src) {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n // precede setext continuation with 4 spaces so it isn't a setext\n let text = cap[0].replace(/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g, '\\n $1');\n text = rtrim(text.replace(/^ *>[ \\t]?/gm, ''), '\\n');\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n const tokens = this.lexer.blockTokens(text);\n this.lexer.state.top = top;\n return {\n type: 'blockquote',\n raw: cap[0],\n tokens,\n text\n };\n }\n }\n list(src) {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n const list = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: []\n };\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n // Get next list item\n const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`);\n let raw = '';\n let itemContents = '';\n let endsWithBlankLine = false;\n // Check if current bullet point can start a new List Item\n while (src) {\n let endEarly = false;\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n raw = cap[0];\n src = src.substring(raw.length);\n let line = cap[2].split('\\n', 1)[0].replace(/^\\t+/, (t) => ' '.repeat(3 * t.length));\n let nextLine = src.split('\\n', 1)[0];\n let indent = 0;\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimStart();\n }\n else {\n indent = cap[2].search(/[^ ]/); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += cap[1].length;\n }\n let blankLine = false;\n if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line\n raw += nextLine + '\\n';\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n if (!endEarly) {\n const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`);\n const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`);\n const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`);\n const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);\n // Check if following lines should be included in List Item\n while (src) {\n const rawLine = src.split('\\n', 1)[0];\n nextLine = rawLine;\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' ');\n }\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n // Horizontal rule found\n if (hrRegex.test(src)) {\n break;\n }\n if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLine.slice(indent);\n }\n else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n // paragraph continuation unless last line was a different block level element\n if (line.search(/[^ ]/) >= 4) { // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n itemContents += '\\n' + nextLine;\n }\n if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n blankLine = true;\n }\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n line = nextLine.slice(indent);\n }\n }\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n }\n else if (/\\n *\\n *$/.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n let istask = null;\n let ischecked;\n // Check for task list items\n if (this.options.gfm) {\n istask = /^\\[[ xX]\\] /.exec(itemContents);\n if (istask) {\n ischecked = istask[0] !== '[ ] ';\n itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n }\n }\n list.items.push({\n type: 'list_item',\n raw,\n task: !!istask,\n checked: ischecked,\n loose: false,\n text: itemContents,\n tokens: []\n });\n list.raw += raw;\n }\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n list.items[list.items.length - 1].raw = raw.trimEnd();\n (list.items[list.items.length - 1]).text = itemContents.trimEnd();\n list.raw = list.raw.trimEnd();\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n for (let i = 0; i < list.items.length; i++) {\n this.lexer.state.top = false;\n list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n if (!list.loose) {\n // Check if list should be loose\n const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\\n.*\\n/.test(t.raw));\n list.loose = hasMultipleLineBreaks;\n }\n }\n // Set all items to loose if list is loose\n if (list.loose) {\n for (let i = 0; i < list.items.length; i++) {\n list.items[i].loose = true;\n }\n }\n return list;\n }\n }\n html(src) {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const token = {\n type: 'html',\n block: true,\n raw: cap[0],\n pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n text: cap[0]\n };\n return token;\n }\n }\n def(src) {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n const tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n return {\n type: 'def',\n tag,\n raw: cap[0],\n href,\n title\n };\n }\n }\n table(src) {\n const cap = this.rules.block.table.exec(src);\n if (!cap) {\n return;\n }\n if (!/[:|]/.test(cap[2])) {\n // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n return;\n }\n const headers = splitCells(cap[1]);\n const aligns = cap[2].replace(/^\\||\\| *$/g, '').split('|');\n const rows = cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : [];\n const item = {\n type: 'table',\n raw: cap[0],\n header: [],\n align: [],\n rows: []\n };\n if (headers.length !== aligns.length) {\n // header and align columns must be equal, rows can be different.\n return;\n }\n for (const align of aligns) {\n if (/^ *-+: *$/.test(align)) {\n item.align.push('right');\n }\n else if (/^ *:-+: *$/.test(align)) {\n item.align.push('center');\n }\n else if (/^ *:-+ *$/.test(align)) {\n item.align.push('left');\n }\n else {\n item.align.push(null);\n }\n }\n for (const header of headers) {\n item.header.push({\n text: header,\n tokens: this.lexer.inline(header)\n });\n }\n for (const row of rows) {\n item.rows.push(splitCells(row, item.header.length).map(cell => {\n return {\n text: cell,\n tokens: this.lexer.inline(cell)\n };\n }));\n }\n return item;\n }\n lheading(src) {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1],\n tokens: this.lexer.inline(cap[1])\n };\n }\n }\n paragraph(src) {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text,\n tokens: this.lexer.inline(text)\n };\n }\n }\n text(src) {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0])\n };\n }\n }\n escape(src) {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: escape$1(cap[1])\n };\n }\n }\n tag(src) {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n this.lexer.state.inLink = true;\n }\n else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n }\n else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n return {\n type: 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n block: false,\n text: cap[0]\n };\n }\n }\n link(src) {\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(/>$/.test(trimmedUrl))) {\n return;\n }\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n }\n else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n if (link) {\n href = link[1];\n title = link[3];\n }\n }\n else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n href = href.trim();\n if (/^</.test(href)) {\n if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n }\n else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title\n }, cap[0], this.lexer);\n }\n }\n reflink(src, links) {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n const linkString = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n const link = links[linkString.toLowerCase()];\n if (!link) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text\n };\n }\n return outputLink(cap, link, cap[0], this.lexer);\n }\n }\n emStrong(src, maskedSrc, prevChar = '') {\n let match = this.rules.inline.emStrongLDelim.exec(src);\n if (!match)\n return;\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[3] && prevChar.match(/[\\p{L}\\p{N}]/u))\n return;\n const nextChar = match[1] || match[2] || '';\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n endReg.lastIndex = 0;\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n if (!rDelim)\n continue; // skip single * in __abc*abc__\n rLength = [...rDelim].length;\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n }\n else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n }\n delimTotal -= rLength;\n if (delimTotal > 0)\n continue; // Haven't found enough closing delimiters\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n // char length can be >1 for unicode characters;\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = raw.slice(1, -1);\n return {\n type: 'em',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text)\n };\n }\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text)\n };\n }\n }\n }\n codespan(src) {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(/\\n/g, ' ');\n const hasNonSpaceChars = /[^ ]/.test(text);\n const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n text = escape$1(text, true);\n return {\n type: 'codespan',\n raw: cap[0],\n text\n };\n }\n }\n br(src) {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0]\n };\n }\n }\n del(src) {\n const cap = this.rules.inline.del.exec(src);\n if (cap) {\n return {\n type: 'del',\n raw: cap[0],\n text: cap[2],\n tokens: this.lexer.inlineTokens(cap[2])\n };\n }\n }\n autolink(src) {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = escape$1(cap[1]);\n href = 'mailto:' + text;\n }\n else {\n text = escape$1(cap[1]);\n href = text;\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text\n }\n ]\n };\n }\n }\n url(src) {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = escape$1(cap[0]);\n href = 'mailto:' + text;\n }\n else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n } while (prevCapZero !== cap[0]);\n text = escape$1(cap[0]);\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n }\n else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text\n }\n ]\n };\n }\n }\n inlineText(src) {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n let text;\n if (this.lexer.state.inRawBlock) {\n text = cap[0];\n }\n else {\n text = escape$1(cap[0]);\n }\n return {\n type: 'text',\n raw: cap[0],\n text\n };\n }\n }\n}\n\n/**\n * Block-Level Grammar\n */\nconst newline = /^(?: *(?:\\n|$))+/;\nconst blockCode = /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nconst lheading = edit(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, / {4}/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n *)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/)\n .replace('label', _blockLabel)\n .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n .getRegex();\nconst list = edit(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/)\n .replace(/bull/g, bullet)\n .getRegex();\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit('^ {0,3}(?:' // optional indentation\n + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n + ')', 'i')\n .replace('comment', _comment)\n .replace('tag', _tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\nconst paragraph = edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n .replace('paragraph', paragraph)\n .getRegex();\n/**\n * Normal Block Grammar\n */\nconst blockNormal = {\n blockquote,\n code: blockCode,\n def,\n fences,\n heading,\n hr,\n html,\n lheading,\n list,\n newline,\n paragraph,\n table: noopTest,\n text: blockText\n};\n/**\n * GFM Block Grammar\n */\nconst gfmTable = edit('^ *([^\\\\n ].*)\\\\n' // Header\n + ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('blockquote', ' {0,3}>')\n .replace('code', ' {4}[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // tables can be interrupted by type (6) html blocks\n .getRegex();\nconst blockGfm = {\n ...blockNormal,\n table: gfmTable,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('table', gfmTable) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex()\n};\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\nconst blockPedantic = {\n ...blockNormal,\n html: edit('^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', _comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', lheading)\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .replace('|tag', '')\n .getRegex()\n};\n/**\n * Inline-Level Grammar\n */\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = '\\\\p{P}\\\\p{S}';\nconst punctuation = edit(/^((?![*_])[\\spunctuation])/, 'u')\n .replace(/punctuation/g, _punctuation).getRegex();\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = /\\[[^[\\]]*?\\]\\([^\\(\\)]*?\\)|`[^`]*?`|<[^<>]*?>/g;\nconst emStrongLDelim = edit(/^(?:\\*+(?:((?!\\*)[punct])|[^\\s*]))|^_+(?:((?!_)[punct])|([^\\s_]))/, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\nconst emStrongRDelimAst = edit('^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n + '|[^*]+(?=[^*])' // Consume to delim\n + '|(?!\\\\*)[punct](\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n + '|[^punct\\\\s](\\\\*+)(?!\\\\*)(?=[punct\\\\s]|$)' // (2) a***#, a*** can only be a Right Delimiter\n + '|(?!\\\\*)[punct\\\\s](\\\\*+)(?=[^punct\\\\s])' // (3) #***a, ***a can only be Left Delimiter\n + '|[\\\\s](\\\\*+)(?!\\\\*)(?=[punct])' // (4) ***# can only be Left Delimiter\n + '|(?!\\\\*)[punct](\\\\*+)(?!\\\\*)(?=[punct])' // (5) #***# can be either Left or Right Delimiter\n + '|[^punct\\\\s](\\\\*+)(?=[^punct\\\\s])', 'gu') // (6) a***a can be either Left or Right Delimiter\n .replace(/punct/g, _punctuation)\n .getRegex();\n// (6) Not allowed for _\nconst emStrongRDelimUnd = edit('^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n + '|[^_]+(?=[^_])' // Consume to delim\n + '|(?!_)[punct](_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n + '|[^punct\\\\s](_+)(?!_)(?=[punct\\\\s]|$)' // (2) a___#, a___ can only be a Right Delimiter\n + '|(?!_)[punct\\\\s](_+)(?=[^punct\\\\s])' // (3) #___a, ___a can only be Left Delimiter\n + '|[\\\\s](_+)(?!_)(?=[punct])' // (4) ___# can only be Left Delimiter\n + '|(?!_)[punct](_+)(?!_)(?=[punct])', 'gu') // (5) #___# can be either Left or Right Delimiter\n .replace(/punct/g, _punctuation)\n .getRegex();\nconst anyPunctuation = edit(/\\\\([punct])/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n .getRegex();\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit('^comment'\n + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n .replace('comment', _inlineComment)\n .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n .getRegex();\nconst _inlineLabel = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/)\n .replace('label', _inlineLabel)\n .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/)\n .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n .getRegex();\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _inlineLabel)\n .replace('ref', _blockLabel)\n .getRegex();\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _blockLabel)\n .getRegex();\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n .replace('reflink', reflink)\n .replace('nolink', nolink)\n .getRegex();\n/**\n * Normal Inline Grammar\n */\nconst inlineNormal = {\n _backpedal: noopTest, // only used for GFM url\n anyPunctuation,\n autolink,\n blockSkip,\n br,\n code: inlineCode,\n del: noopTest,\n emStrongLDelim,\n emStrongRDelimAst,\n emStrongRDelimUnd,\n escape,\n link,\n nolink,\n punctuation,\n reflink,\n reflinkSearch,\n tag,\n text: inlineText,\n url: noopTest\n};\n/**\n * Pedantic Inline Grammar\n */\nconst inlinePedantic = {\n ...inlineNormal,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', _inlineLabel)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', _inlineLabel)\n .getRegex()\n};\n/**\n * GFM Inline Grammar\n */\nconst inlineGfm = {\n ...inlineNormal,\n escape: edit(escape).replace('])', '~|])').getRegex(),\n url: edit(/^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/, 'i')\n .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)\n .getRegex(),\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/\n};\n/**\n * GFM + Line Breaks Inline Grammar\n */\nconst inlineBreaks = {\n ...inlineGfm,\n br: edit(br).replace('{2,}', '*').getRegex(),\n text: edit(inlineGfm.text)\n .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n .replace(/\\{2,\\}/g, '*')\n .getRegex()\n};\n/**\n * exports\n */\nconst block = {\n normal: blockNormal,\n gfm: blockGfm,\n pedantic: blockPedantic\n};\nconst inline = {\n normal: inlineNormal,\n gfm: inlineGfm,\n breaks: inlineBreaks,\n pedantic: inlinePedantic\n};\n\n/**\n * Block Lexer\n */\nclass _Lexer {\n tokens;\n options;\n state;\n tokenizer;\n inlineQueue;\n constructor(options) {\n // TokenList cannot be created in one go\n this.tokens = [];\n this.tokens.links = Object.create(null);\n this.options = options || _defaults;\n this.options.tokenizer = this.options.tokenizer || new _Tokenizer();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n top: true\n };\n const rules = {\n block: block.normal,\n inline: inline.normal\n };\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n }\n else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n }\n else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline\n };\n }\n /**\n * Static Lex Method\n */\n static lex(src, options) {\n const lexer = new _Lexer(options);\n return lexer.lex(src);\n }\n /**\n * Static Lex Inline Method\n */\n static lexInline(src, options) {\n const lexer = new _Lexer(options);\n return lexer.inlineTokens(src);\n }\n /**\n * Preprocessing\n */\n lex(src) {\n src = src\n .replace(/\\r\\n|\\r/g, '\\n');\n this.blockTokens(src, this.tokens);\n for (let i = 0; i < this.inlineQueue.length; i++) {\n const next = this.inlineQueue[i];\n this.inlineTokens(next.src, next.tokens);\n }\n this.inlineQueue = [];\n return this.tokens;\n }\n blockTokens(src, tokens = []) {\n if (this.options.pedantic) {\n src = src.replace(/\\t/g, ' ').replace(/^ +$/gm, '');\n }\n else {\n src = src.replace(/^( *)(\\t+)/gm, (_, leading, tabs) => {\n return leading + ' '.repeat(tabs.length);\n });\n }\n let token;\n let lastToken;\n let cutSrc;\n let lastParagraphClipped;\n while (src) {\n if (this.options.extensions\n && this.options.extensions.block\n && this.options.extensions.block.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n if (token.raw.length === 1 && tokens.length > 0) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unnecessary paragraph tags\n tokens[tokens.length - 1].raw += '\\n';\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n // An indented code block cannot interrupt a paragraph.\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title\n };\n }\n continue;\n }\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n lastToken = tokens[tokens.length - 1];\n if (lastParagraphClipped && lastToken.type === 'paragraph') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else {\n tokens.push(token);\n }\n lastParagraphClipped = (cutSrc.length !== src.length);\n src = src.substring(token.raw.length);\n continue;\n }\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n this.state.top = true;\n return tokens;\n }\n inline(src, tokens = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n /**\n * Lexing/Compiling\n */\n inlineTokens(src, tokens = []) {\n let token, lastToken, cutSrc;\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n let match;\n let keepPrevChar, prevChar;\n // Mask out reflinks\n if (this.tokens.links) {\n const links = Object.keys(this.tokens.links);\n if (links.length > 0) {\n while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n }\n // Mask out other blocks\n while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n }\n // Mask out escaped characters\n while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n }\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n // extensions\n if (this.options.extensions\n && this.options.extensions.inline\n && this.options.extensions.inline.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // del (gfm)\n if (token = this.tokenizer.del(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // autolink\n if (token = this.tokenizer.autolink(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n return tokens;\n }\n}\n\n/**\n * Renderer\n */\nclass _Renderer {\n options;\n constructor(options) {\n this.options = options || _defaults;\n }\n code(code, infostring, escaped) {\n const lang = (infostring || '').match(/^\\S*/)?.[0];\n code = code.replace(/\\n$/, '') + '\\n';\n if (!lang) {\n return '<pre><code>'\n + (escaped ? code : escape$1(code, true))\n + '</code></pre>\\n';\n }\n return '<pre><code class=\"language-'\n + escape$1(lang)\n + '\">'\n + (escaped ? code : escape$1(code, true))\n + '</code></pre>\\n';\n }\n blockquote(quote) {\n return `<blockquote>\\n${quote}</blockquote>\\n`;\n }\n html(html, block) {\n return html;\n }\n heading(text, level, raw) {\n // ignore IDs\n return `<h${level}>${text}</h${level}>\\n`;\n }\n hr() {\n return '<hr>\\n';\n }\n list(body, ordered, start) {\n const type = ordered ? 'ol' : 'ul';\n const startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startatt + '>\\n' + body + '</' + type + '>\\n';\n }\n listitem(text, task, checked) {\n return `<li>${text}</li>\\n`;\n }\n checkbox(checked) {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\">';\n }\n paragraph(text) {\n return `<p>${text}</p>\\n`;\n }\n table(header, body) {\n if (body)\n body = `<tbody>${body}</tbody>`;\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n';\n }\n tablerow(content) {\n return `<tr>\\n${content}</tr>\\n`;\n }\n tablecell(content, flags) {\n const type = flags.header ? 'th' : 'td';\n const tag = flags.align\n ? `<${type} align=\"${flags.align}\">`\n : `<${type}>`;\n return tag + content + `</${type}>\\n`;\n }\n /**\n * span level renderer\n */\n strong(text) {\n return `<strong>${text}</strong>`;\n }\n em(text) {\n return `<em>${text}</em>`;\n }\n codespan(text) {\n return `<code>${text}</code>`;\n }\n br() {\n return '<br>';\n }\n del(text) {\n return `<del>${text}</del>`;\n }\n link(href, title, text) {\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text;\n }\n href = cleanHref;\n let out = '<a href=\"' + href + '\"';\n if (title) {\n out += ' title=\"' + title + '\"';\n }\n out += '>' + text + '</a>';\n return out;\n }\n image(href, title, text) {\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text;\n }\n href = cleanHref;\n let out = `<img src=\"${href}\" alt=\"${text}\"`;\n if (title) {\n out += ` title=\"${title}\"`;\n }\n out += '>';\n return out;\n }\n text(text) {\n return text;\n }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass _TextRenderer {\n // no need for block level renderers\n strong(text) {\n return text;\n }\n em(text) {\n return text;\n }\n codespan(text) {\n return text;\n }\n del(text) {\n return text;\n }\n html(text) {\n return text;\n }\n text(text) {\n return text;\n }\n link(href, title, text) {\n return '' + text;\n }\n image(href, title, text) {\n return '' + text;\n }\n br() {\n return '';\n }\n}\n\n/**\n * Parsing & Compiling\n */\nclass _Parser {\n options;\n renderer;\n textRenderer;\n constructor(options) {\n this.options = options || _defaults;\n this.options.renderer = this.options.renderer || new _Renderer();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.textRenderer = new _TextRenderer();\n }\n /**\n * Static Parse Method\n */\n static parse(tokens, options) {\n const parser = new _Parser(options);\n return parser.parse(tokens);\n }\n /**\n * Static Parse Inline Method\n */\n static parseInline(tokens, options) {\n const parser = new _Parser(options);\n return parser.parseInline(tokens);\n }\n /**\n * Parse Loop\n */\n parse(tokens, top = true) {\n let out = '';\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n const genericToken = token;\n const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(genericToken.type)) {\n out += ret || '';\n continue;\n }\n }\n switch (token.type) {\n case 'space': {\n continue;\n }\n case 'hr': {\n out += this.renderer.hr();\n continue;\n }\n case 'heading': {\n const headingToken = token;\n out += this.renderer.heading(this.parseInline(headingToken.tokens), headingToken.depth, unescape(this.parseInline(headingToken.tokens, this.textRenderer)));\n continue;\n }\n case 'code': {\n const codeToken = token;\n out += this.renderer.code(codeToken.text, codeToken.lang, !!codeToken.escaped);\n continue;\n }\n case 'table': {\n const tableToken = token;\n let header = '';\n // header\n let cell = '';\n for (let j = 0; j < tableToken.header.length; j++) {\n cell += this.renderer.tablecell(this.parseInline(tableToken.header[j].tokens), { header: true, align: tableToken.align[j] });\n }\n header += this.renderer.tablerow(cell);\n let body = '';\n for (let j = 0; j < tableToken.rows.length; j++) {\n const row = tableToken.rows[j];\n cell = '';\n for (let k = 0; k < row.length; k++) {\n cell += this.renderer.tablecell(this.parseInline(row[k].tokens), { header: false, align: tableToken.align[k] });\n }\n body += this.renderer.tablerow(cell);\n }\n out += this.renderer.table(header, body);\n continue;\n }\n case 'blockquote': {\n const blockquoteToken = token;\n const body = this.parse(blockquoteToken.tokens);\n out += this.renderer.blockquote(body);\n continue;\n }\n case 'list': {\n const listToken = token;\n const ordered = listToken.ordered;\n const start = listToken.start;\n const loose = listToken.loose;\n let body = '';\n for (let j = 0; j < listToken.items.length; j++) {\n const item = listToken.items[j];\n const checked = item.checked;\n const task = item.task;\n let itemBody = '';\n if (item.task) {\n const checkbox = this.renderer.checkbox(!!checked);\n if (loose) {\n if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n }\n }\n else {\n item.tokens.unshift({\n type: 'text',\n text: checkbox + ' '\n });\n }\n }\n else {\n itemBody += checkbox + ' ';\n }\n }\n itemBody += this.parse(item.tokens, loose);\n body += this.renderer.listitem(itemBody, task, !!checked);\n }\n out += this.renderer.list(body, ordered, start);\n continue;\n }\n case 'html': {\n const htmlToken = token;\n out += this.renderer.html(htmlToken.text, htmlToken.block);\n continue;\n }\n case 'paragraph': {\n const paragraphToken = token;\n out += this.renderer.paragraph(this.parseInline(paragraphToken.tokens));\n continue;\n }\n case 'text': {\n let textToken = token;\n let body = textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text;\n while (i + 1 < tokens.length && tokens[i + 1].type === 'text') {\n textToken = tokens[++i];\n body += '\\n' + (textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text);\n }\n out += top ? this.renderer.paragraph(body) : body;\n continue;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '';\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens, renderer) {\n renderer = renderer || this.renderer;\n let out = '';\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n const ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n out += ret || '';\n continue;\n }\n }\n switch (token.type) {\n case 'escape': {\n const escapeToken = token;\n out += renderer.text(escapeToken.text);\n break;\n }\n case 'html': {\n const tagToken = token;\n out += renderer.html(tagToken.text);\n break;\n }\n case 'link': {\n const linkToken = token;\n out += renderer.link(linkToken.href, linkToken.title, this.parseInline(linkToken.tokens, renderer));\n break;\n }\n case 'image': {\n const imageToken = token;\n out += renderer.image(imageToken.href, imageToken.title, imageToken.text);\n break;\n }\n case 'strong': {\n const strongToken = token;\n out += renderer.strong(this.parseInline(strongToken.tokens, renderer));\n break;\n }\n case 'em': {\n const emToken = token;\n out += renderer.em(this.parseInline(emToken.tokens, renderer));\n break;\n }\n case 'codespan': {\n const codespanToken = token;\n out += renderer.codespan(codespanToken.text);\n break;\n }\n case 'br': {\n out += renderer.br();\n break;\n }\n case 'del': {\n const delToken = token;\n out += renderer.del(this.parseInline(delToken.tokens, renderer));\n break;\n }\n case 'text': {\n const textToken = token;\n out += renderer.text(textToken.text);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '';\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n}\n\nclass _Hooks {\n options;\n constructor(options) {\n this.options = options || _defaults;\n }\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens'\n ]);\n /**\n * Process markdown before marked\n */\n preprocess(markdown) {\n return markdown;\n }\n /**\n * Process HTML after marked is finished\n */\n postprocess(html) {\n return html;\n }\n /**\n * Process all tokens before walk tokens\n */\n processAllTokens(tokens) {\n return tokens;\n }\n}\n\nclass Marked {\n defaults = _getDefaults();\n options = this.setOptions;\n parse = this.#parseMarkdown(_Lexer.lex, _Parser.parse);\n parseInline = this.#parseMarkdown(_Lexer.lexInline, _Parser.parseInline);\n Parser = _Parser;\n Renderer = _Renderer;\n TextRenderer = _TextRenderer;\n Lexer = _Lexer;\n Tokenizer = _Tokenizer;\n Hooks = _Hooks;\n constructor(...args) {\n this.use(...args);\n }\n /**\n * Run callback for every token\n */\n walkTokens(tokens, callback) {\n let values = [];\n for (const token of tokens) {\n values = values.concat(callback.call(this, token));\n switch (token.type) {\n case 'table': {\n const tableToken = token;\n for (const cell of tableToken.header) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n for (const row of tableToken.rows) {\n for (const cell of row) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n }\n break;\n }\n case 'list': {\n const listToken = token;\n values = values.concat(this.walkTokens(listToken.items, callback));\n break;\n }\n default: {\n const genericToken = token;\n if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n const tokens = genericToken[childTokens].flat(Infinity);\n values = values.concat(this.walkTokens(tokens, callback));\n });\n }\n else if (genericToken.tokens) {\n values = values.concat(this.walkTokens(genericToken.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n use(...args) {\n const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack };\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if ('renderer' in ext) { // Renderer extensions\n const prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function (...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n }\n else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if ('tokenizer' in ext) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n const extLevel = extensions[ext.level];\n if (extLevel) {\n extLevel.unshift(ext.tokenizer);\n }\n else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n }\n else {\n extensions.startBlock = [ext.start];\n }\n }\n else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n }\n else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = this.defaults.renderer || new _Renderer(this.defaults);\n for (const prop in pack.renderer) {\n if (!(prop in renderer)) {\n throw new Error(`renderer '${prop}' does not exist`);\n }\n if (prop === 'options') {\n // ignore options property\n continue;\n }\n const rendererProp = prop;\n const rendererFunc = pack.renderer[rendererProp];\n const prevRenderer = renderer[rendererProp];\n // Replace renderer with func to run extension, but fall back if false\n renderer[rendererProp] = (...args) => {\n let ret = rendererFunc.apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return ret || '';\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);\n for (const prop in pack.tokenizer) {\n if (!(prop in tokenizer)) {\n throw new Error(`tokenizer '${prop}' does not exist`);\n }\n if (['options', 'rules', 'lexer'].includes(prop)) {\n // ignore options, rules, and lexer properties\n continue;\n }\n const tokenizerProp = prop;\n const tokenizerFunc = pack.tokenizer[tokenizerProp];\n const prevTokenizer = tokenizer[tokenizerProp];\n // Replace tokenizer with func to run extension, but fall back if false\n // @ts-expect-error cannot type tokenizer function dynamically\n tokenizer[tokenizerProp] = (...args) => {\n let ret = tokenizerFunc.apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n const hooks = this.defaults.hooks || new _Hooks();\n for (const prop in pack.hooks) {\n if (!(prop in hooks)) {\n throw new Error(`hook '${prop}' does not exist`);\n }\n if (prop === 'options') {\n // ignore options property\n continue;\n }\n const hooksProp = prop;\n const hooksFunc = pack.hooks[hooksProp];\n const prevHook = hooks[hooksProp];\n if (_Hooks.passThroughHooks.has(prop)) {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (arg) => {\n if (this.defaults.async) {\n return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => {\n return prevHook.call(hooks, ret);\n });\n }\n const ret = hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n }\n else {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (...args) => {\n let ret = hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n }\n opts.hooks = hooks;\n }\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = this.defaults.walkTokens;\n const packWalktokens = pack.walkTokens;\n opts.walkTokens = function (token) {\n let values = [];\n values.push(packWalktokens.call(this, token));\n if (walkTokens) {\n values = values.concat(walkTokens.call(this, token));\n }\n return values;\n };\n }\n this.defaults = { ...this.defaults, ...opts };\n });\n return this;\n }\n setOptions(opt) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n lexer(src, options) {\n return _Lexer.lex(src, options ?? this.defaults);\n }\n parser(tokens, options) {\n return _Parser.parse(tokens, options ?? this.defaults);\n }\n #parseMarkdown(lexer, parser) {\n return (src, options) => {\n const origOpt = { ...options };\n const opt = { ...this.defaults, ...origOpt };\n // Show warning if an extension set async to true but the parse was called with async: false\n if (this.defaults.async === true && origOpt.async === false) {\n if (!opt.silent) {\n console.warn('marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored.');\n }\n opt.async = true;\n }\n const throwError = this.#onError(!!opt.silent, !!opt.async);\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected'));\n }\n if (opt.hooks) {\n opt.hooks.options = opt;\n }\n if (opt.async) {\n return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)\n .then(src => lexer(src, opt))\n .then(tokens => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens)\n .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)\n .then(tokens => parser(tokens, opt))\n .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)\n .catch(throwError);\n }\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src);\n }\n let tokens = lexer(src, opt);\n if (opt.hooks) {\n tokens = opt.hooks.processAllTokens(tokens);\n }\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n let html = parser(tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html);\n }\n return html;\n }\n catch (e) {\n return throwError(e);\n }\n };\n }\n #onError(silent, async) {\n return (e) => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n if (silent) {\n const msg = '<p>An error occurred:</p><pre>'\n + escape$1(e.message + '', true)\n + '</pre>';\n if (async) {\n return Promise.resolve(msg);\n }\n return msg;\n }\n if (async) {\n return Promise.reject(e);\n }\n throw e;\n };\n }\n}\n\nconst markedInstance = new Marked();\nfunction marked(src, opt) {\n return markedInstance.parse(src, opt);\n}\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n marked.setOptions = function (options) {\n markedInstance.setOptions(options);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n };\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\nmarked.defaults = _defaults;\n/**\n * Use Extension\n */\nmarked.use = function (...args) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n/**\n * Run callback for every token\n */\nmarked.walkTokens = function (tokens, callback) {\n return markedInstance.walkTokens(tokens, callback);\n};\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\nconst options = marked.options;\nconst setOptions = marked.setOptions;\nconst use = marked.use;\nconst walkTokens = marked.walkTokens;\nconst parseInline = marked.parseInline;\nconst parse = marked;\nconst parser = _Parser.parse;\nconst lexer = _Lexer.lex;\n\nexport { _Hooks as Hooks, _Lexer as Lexer, Marked, _Parser as Parser, _Renderer as Renderer, _TextRenderer as TextRenderer, _Tokenizer as Tokenizer, _defaults as defaults, _getDefaults as getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens };\n//# sourceMappingURL=marked.esm.js.map\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { marked } from 'marked';\n// Importing these named exports also registers their custom elements\n// (kr-dialog, kr-tab-group, kr-tab, kr-text-field) used by the browse dialog.\nimport { KRFilePreview, KRSnackbar } from '@kodaris/krubble-components';\nimport { KRHttp } from '@kodaris/krubble-http';\n/** Image extensions the chatbot renders as thumbnails (used when MIME is absent). */\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'webp'];\n/**\n * Video extensions the picker accepts. The AI cannot watch video — these upload\n * and store for playback and tool use only, and the backend tells the model so.\n * Matches what kr-file-preview can play back.\n */\nconst VIDEO_EXTENSIONS = ['mp4', 'webm', 'ogg', 'mov'];\n/**\n * File extensions the picker accepts. Mirrors what the backend can read: the\n * document/spreadsheet family Bedrock ingests, the plain-text family read as\n * fallback, and the image formats. Videos are accepted for upload/storage even\n * though the model can't read them. This is a UX convenience — the backend\n * accepts anything and just tells the model when a type can't be read.\n */\nconst ACCEPTED_FILE_EXTENSIONS = [\n 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'csv', 'html', 'md', 'txt', 'json', 'xml',\n ...IMAGE_EXTENSIONS,\n ...VIDEO_EXTENSIONS,\n];\n/**\n * AI chatbot component with SSE streaming.\n *\n * Accepts a `send` callback that returns a streaming Response (SSE format).\n * Parses the stream for text tokens, status updates, and errors.\n * Dispatches a `stream-event` custom event for every SSE message so consumers can react.\n *\n * ## SSE Stream Format\n * The component expects `data:` lines with JSON payloads containing a `type` field:\n * - `STATUS` — `{ type: \"STATUS\", message: \"Thinking...\" }`\n * - `RESPONSE_PART` — `{ type: \"RESPONSE_PART\", message: \"token text\" }`\n * - `TOOL_RESULT` — `{ type: \"TOOL_RESULT\", message: \"tool_name\", data: {...} }`\n * - `ERROR` — `{ type: \"ERROR\", message: \"Something went wrong\" }`\n * - `HEARTBEAT` — `{ type: \"HEARTBEAT\" }` (ignored)\n *\n * The final event should include `finished: true` to signal stream completion.\n *\n * ## Usage\n * ```html\n * <kr-chatbot\n * label=\"AI Assistant\"\n * .send=${(params) => {\n * return fetch('/api/ai/chat/stream', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json', 'Accept': 'text/event-stream' },\n * credentials: 'include',\n * body: JSON.stringify({ userText: params.message })\n * });\n * }}\n * ></kr-chatbot>\n * ```\n *\n * @slot - Optional slot content displayed above the messages area\n *\n * @fires message-submit - When the user sends a message. Cancelable. Detail: `{ message: string }`\n * @fires stream-event - Dispatched for every SSE message received. Detail contains the parsed event data.\n * @fires conversation-created - When a turn with no target creates a new conversation and the chatbot pins it. Detail: `{ conversation }` (the full conversation object).\n * @fires conversation-title - When the server sends the generated title for a new conversation (end of its first turn). The header label is already updated; this is for consumers with their own chrome to sync (breadcrumbs, tab titles). Detail: `{ title }`.\n */\nlet KRChatbot = class KRChatbot extends LitElement {\n constructor() {\n super(...arguments);\n // --- Private properties ---\n this._reader = null;\n this._decoder = new TextDecoder();\n this._buffer = '';\n this._userHasScrolledUp = false;\n this._isDragging = false;\n this._isResizing = false;\n this._overlay = null;\n this._resizeDir = '';\n this._dragStartX = 0;\n this._dragStartY = 0;\n this._dragStartLeft = 0;\n this._dragStartTop = 0;\n this._resizeStartW = 0;\n this._resizeStartH = 0;\n /** Cursor X at debug-drawer resize start. */\n this._debugResizeStartX = 0;\n /** Debug-drawer width at resize start. */\n this._debugResizeStartW = 0;\n /** Counter for depth-aware dragenter/dragleave tracking. */\n this._dragDepth = 0;\n /** Monotonic id source for pending attachments. */\n this._pendingSeq = 0;\n /**\n * The `aiAnalyze` mode for the next picked files — set when the attach action\n * opens the picker (true = \"Attach Files\", false = \"Attach Files for\n * Reference\"), read by the file-input change handler. Not reactive: it's read\n * synchronously in the change handler, never rendered.\n */\n this._pendingAttachAnalyze = true;\n /**\n * Request-id guards for skill searches — bumped on each search so out-of-order\n * responses are dropped (mirrors the kr-combo-box `_requestId` pattern). Org and\n * global searches run concurrently into separate buffers, so each has its own.\n */\n this._orgSkillRequestId = 0;\n this._globalSkillRequestId = 0;\n this._invocableSkillRequestId = 0;\n /**\n * Codes of global skills with an in-flight enable/disable request. The `+`\n * button reads this to show a pending state and ignore repeat clicks. Mutated\n * in place; call requestUpdate() after changing it to re-render.\n */\n this._globalSkillPending = new Set();\n /**\n * The live Web Speech recognizer while dictating, else null. Not reactive —\n * `_isDictating` drives the UI; this is just the handle used to stop it.\n */\n this._speechRecognition = null;\n /**\n * The composer text as it stood when dictation started. Each `result` event\n * re-reports the whole utterance (final + interim), so the value is rebuilt as\n * this base + the transcript rather than appended to — appending would repeat\n * the interim text on every event.\n */\n this._speechBaseValue = '';\n /**\n * Transcript of utterances the recognizer has marked final this session.\n * Held separately because `results` is pruned in continuous mode on some\n * browsers; without this, earlier sentences would vanish mid-dictation.\n */\n this._speechFinalTranscript = '';\n // --- @property (public API) ---\n /**\n * Callback function for sending messages. Receives the user's message and\n * current conversation history. Must return a Response with a streaming SSE body.\n *\n * Optional — when not set, the chatbot uses its built-in default that streams\n * from the Kodaris Bedrock conversation endpoints. Set this to override.\n */\n this.send = null;\n /**\n * Callback function called on init to load existing conversation messages.\n * Must return a Promise that resolves with an array of KRChatbotMessage.\n *\n * Optional — when not set, the chatbot uses its built-in default that loads\n * existing messages from the Kodaris Bedrock conversation. Set this to override.\n */\n this.load = null;\n /**\n * Conversation messages. Can be set externally for initial messages.\n * Updated internally as the conversation progresses.\n */\n this.messages = [];\n /**\n * Header label text.\n */\n this.label = 'Kat';\n /**\n * Input placeholder text.\n */\n this.placeholder = 'Type a message...';\n /**\n * Whether the chat panel is open. Only relevant in floating mode.\n */\n this.opened = false;\n /**\n * Hide the built-in floating toggle button. Use this when an external\n * control (e.g. the site-editor bar) owns opening the chat — the panel is\n * then driven via the `open()` / `close()` / `toggle()` methods.\n */\n this.hideToggle = false;\n /**\n * Layout mode.\n * - `'floating'` (default): the chatbot is a fixed bottom-right widget with a\n * toggle button, and the panel can be dragged and resized. This is the\n * traditional chat-widget appearance.\n * - `'inline'`: the chatbot drops its fixed positioning and fills its parent\n * container (100% width/height, no border radius/shadow, no toggle, no\n * drag/resize). The panel is always open. Use this to embed the chat as a\n * full page or panel region.\n */\n this.variant = 'floating';\n /**\n * The conversation this chatbot's turns target (backend `conversationID`).\n *\n * - Set → every turn is sent with this `conversationID`, so the chat continues\n * that specific conversation.\n * - Unset → the first turn is sent with `createNew: true` (a fresh\n * conversation); the component then resolves the new conversation's id (via\n * `/conversation/last`) and pins it here so the rest of the session stays one\n * conversation instead of spawning a new one per message.\n *\n * Only used by the built-in `send` default; a custom `send` owns its own\n * targeting.\n */\n this.conversationId = null;\n // --- @state (internal) ---\n this._inputValue = '';\n this._isStreaming = false;\n this._error = '';\n /**\n * User-facing context warning text (`CONVERSATION_TOKEN_WARNING`). Shown as a\n * dismissible banner in all variants. Carries only friendly guidance, no numbers.\n */\n this._contextWarning = '';\n /**\n * True once the conversation hit the context-window limit\n * (`CONVERSATION_LIMIT_REACHED`, or `contextExceeded` on load). Drives a\n * blocking \"start a new conversation\" notice. User-facing, all variants.\n */\n this._contextLimitReached = false;\n /** Server-provided limit text (`CONVERSATION_LIMIT_REACHED`), if any. */\n this._contextLimitMessage = '';\n /**\n * INTERNAL-ONLY latest telemetry snapshot (last-value-wins). Populated from\n * `TOKEN_USAGE` events during streaming and hydrated from the conversation\n * DTO on load. Only surfaced in the `inline` variant's debug panel.\n */\n this._telemetry = null;\n /**\n * INTERNAL-ONLY per-iteration telemetry log for the debug panel's verbose\n * table. Append-only within a turn; reset at the start of each send. Each row\n * may be augmented with its `CACHE_CHECKPOINT` info.\n */\n this._iterationLog = [];\n /** Latest cache-checkpoint info keyed by iteration, for the verbose table. */\n this._cacheCheckpoints = {};\n /** Whether the internal debug panel is expanded (off by default). */\n this._debugPanelOpen = false;\n /** Current width of the debug drawer in px (user-resizable, persisted). */\n this._debugDrawerWidth = 430;\n /** True while the user is dragging the debug drawer's resize handle. */\n this._isDebugResizing = false;\n /** Files staged in the composer, before the message is sent. */\n this._pendingConversationFiles = [];\n /** True while a file is being dragged over the panel (shows the drop overlay). */\n this._isDraggingFile = false;\n /** Whether the `/` skill menu is open above the composer. */\n this._skillMenuOpened = false;\n /** Current `/` query (text after the slash), sent to `_searchOrgSkills`. */\n this._skillQuery = '';\n /**\n * Latest org skill search results (this instance's own skills). Backs the\n * browse dialog's \"Your Org\" tab only — global skills never appear here.\n */\n this._orgSkills = [];\n /**\n * Latest shared-Kodaris (global) skill results, for the browse dialog's\n * \"Kodaris\" tab. Kept separate from `_orgSkills` so switching tabs shows\n * fresh results immediately instead of the other tab's stale list — the browse\n * search fills both buffers at once.\n */\n this._globalSkills = [];\n /**\n * Latest results for the `/` composer menu — everything the current user can\n * actually invoke, merged and role-filtered server-side by\n * `/conversation/availableSkills`. A separate buffer from the two browse-tab lists\n * so installed globals in the menu never leak into the \"Your Org\" tab.\n */\n this._invocableSkills = [];\n /**\n * AI framework UI config flags fetched from `aiFrameworkConfig` on connect.\n * `debugTelemetryEnabled` (same server-side gate as TOKEN_USAGE emission) turns\n * on the debug drawer toggle and the `/test-context-warning` / `/test-context-limit` composer\n * options — known up front, before any message.\n */\n this._aiFrameworkConfig = {};\n /** Highlighted item in the skill menu for keyboard navigation (-1 = none). */\n this._skillHighlighted = 0;\n /** Index of the message whose copy button just flashed \"Copied\" (-1 = none). */\n this._copiedIndex = -1;\n /** Whether the \"Browse all skills\" dialog is open. */\n this._skillBrowseOpened = false;\n /**\n * Active tab in the browse dialog. `org` shows `_orgSkills` (this instance's\n * skills); `kodaris` shows `_globalSkills` (the shared global catalog).\n */\n this._skillBrowseSource = 'org';\n /** Search text in the browse dialog, routed to the active tab's search. */\n this._skillBrowseQuery = '';\n /** True while the mic is live and speech is being transcribed into the composer. */\n this._isDictating = false;\n /**\n * Close the `/` skill menu when the click lands outside it.\n *\n * Bound at the document because a click anywhere — including outside this\n * component entirely — should dismiss the menu. `composedPath()` rather than\n * `e.target` since the menu lives in this component's shadow root, where\n * `target` on a document listener is retargeted to the host element and every\n * inside click would look like an outside one.\n */\n this._handleDocumentClick = (e) => {\n if (!this._skillMenuOpened) {\n return;\n }\n // Excluded: the textarea, since clicking it keeps editing the same `/` command\n // and dismissing there would fight the user still typing it; and the plus\n // button, which owns the menu's open/close itself. The plus exclusion matters\n // in both directions — this listener runs after the button's own handler, so\n // without it a click that just opened the menu would immediately close it\n // again, and a click meant to toggle it shut would be double-handled.\n const path = e.composedPath();\n if (path.some((el) => el instanceof HTMLElement && (el.classList.contains('skill-menu') || el.classList.contains('input') || el.classList.contains('input-plus')))) {\n return;\n }\n this._skillMenuOpened = false;\n };\n this._handleMouseMove = (e) => {\n if (this._isDragging) {\n let newLeft = this._dragStartLeft + (e.clientX - this._dragStartX);\n let newTop = this._dragStartTop + (e.clientY - this._dragStartY);\n const w = this._panelEl.offsetWidth;\n newLeft = Math.max(-w + 48, Math.min(newLeft, window.innerWidth - 48));\n newTop = Math.max(0, Math.min(newTop, window.innerHeight - 48));\n this._panelEl.style.left = newLeft + 'px';\n this._panelEl.style.top = newTop + 'px';\n }\n else if (this._isResizing) {\n const dx = e.clientX - this._dragStartX;\n const dy = e.clientY - this._dragStartY;\n const minW = 340;\n const minH = 380;\n const maxW = window.innerWidth * 0.9;\n const maxH = window.innerHeight - 72;\n let newW = this._resizeStartW;\n let newH = this._resizeStartH;\n let newLeft = this._dragStartLeft;\n let newTop = this._dragStartTop;\n if (this._resizeDir.includes('e')) {\n newW = Math.max(minW, Math.min(this._resizeStartW + dx, maxW));\n }\n if (this._resizeDir.includes('w')) {\n newW = Math.max(minW, Math.min(this._resizeStartW - dx, maxW));\n newLeft = this._dragStartLeft + (this._resizeStartW - newW);\n }\n if (this._resizeDir.includes('s')) {\n newH = Math.max(minH, Math.min(this._resizeStartH + dy, maxH));\n }\n if (this._resizeDir.includes('n')) {\n newH = Math.max(minH, Math.min(this._resizeStartH - dy, maxH));\n newTop = this._dragStartTop + (this._resizeStartH - newH);\n }\n newLeft = Math.max(0, newLeft);\n newTop = Math.max(0, newTop);\n this._panelEl.style.width = newW + 'px';\n this._panelEl.style.height = newH + 'px';\n this._panelEl.style.left = newLeft + 'px';\n this._panelEl.style.top = newTop + 'px';\n }\n };\n this._handleMouseUp = () => {\n if (this._isDragging) {\n this._isDragging = false;\n this._panelEl.classList.remove('panel--dragging');\n }\n if (this._isResizing) {\n this._isResizing = false;\n this._panelEl.classList.remove('panel--resizing');\n }\n if (this._overlay) {\n this._overlay.style.display = 'none';\n }\n document.removeEventListener('mousemove', this._handleMouseMove);\n document.removeEventListener('mouseup', this._handleMouseUp);\n this._saveState();\n };\n this._handleDebugResizeMouseMove = (e) => {\n if (!this._isDebugResizing) {\n return;\n }\n // Handle is on the drawer's left edge; dragging left (negative dx) widens it.\n const dx = e.clientX - this._debugResizeStartX;\n const minW = 300;\n // Never let the chat column shrink below 300px — cap the drawer at the\n // container width minus that reserved chat width.\n const minChatWidth = 300;\n const maxW = Math.max(minW, this.offsetWidth - minChatWidth);\n this._debugDrawerWidth = Math.max(minW, Math.min(this._debugResizeStartW - dx, maxW));\n };\n this._handleDebugResizeMouseUp = () => {\n this._isDebugResizing = false;\n document.removeEventListener('mousemove', this._handleDebugResizeMouseMove);\n document.removeEventListener('mouseup', this._handleDebugResizeMouseUp);\n this._saveState();\n };\n }\n // --- Lifecycle ---\n connectedCallback() {\n super.connectedCallback();\n // Default to loading a conversation's messages when the consumer hasn't\n // provided their own `load`. With `conversationId` set we rebuild that\n // conversation; with none set the user wants a NEW conversation, so we start\n // blank (no resume — the first message creates one via `send`). Rows already\n // match KRChatbotMessage ({ type, content }); we only parse each row's\n // `conversationFileIDs` (a JSON array string of ids) into `conversationFiles`.\n if (!this.load) {\n this.load = () => {\n if (this.conversationId == null) {\n return Promise.resolve([]);\n }\n return KRHttp.fetch({ url: `/api/system/conversation/${this.conversationId}/messages` })\n .then((r) => r.json())\n .then((res) => Promise.all((res?.data || []).map((msg) => {\n // Resolve this message's `conversationFileIDs` (a JSON array string of\n // ids) into full file objects — each fetch response IS the\n // KRChatbotConversationFile (id + niceName + mimeType), and niceName\n // drives the previewer's file-type detection. A failed fetch drops\n // that file rather than rendering a broken thumbnail.\n let ids = [];\n try {\n ids = JSON.parse(msg.conversationFileIDs || '[]');\n }\n catch { /* no/invalid attachments — leave empty */ }\n if (!ids.length) {\n return Promise.resolve(msg);\n }\n return Promise.all(ids.map((id) => KRHttp.fetch({ url: `/api/system/conversationFile/${id}` })\n .then((r) => r.json())\n .then((meta) => meta?.data)\n .catch(() => null)))\n .then((files) => {\n msg.conversationFiles = files.filter((f) => f != null);\n return msg;\n });\n })));\n };\n }\n this.load().then((messages) => {\n if (messages && messages.length) {\n this.messages = messages;\n }\n }).catch(() => { });\n // Fetch the framework config on load (debugTelemetryEnabled, v2ChatEnabled,\n // registryServer). debugTelemetryEnabled gates the debug affordances and is\n // known before any message.\n KRHttp.fetch({\n url: '/api/system/integration/aws/bedrock/aiFrameworkConfig',\n })\n .then((r) => r.json())\n .then((res) => {\n this._aiFrameworkConfig = res?.data || {};\n })\n .catch(() => { });\n // Inline mode fills its container and is always open — the floating widget's\n // toggle/drag/resize state doesn't apply, but the composer message and debug\n // drawer state (restored inside _restoreState) do.\n if (this.variant === 'inline') {\n this.opened = true;\n }\n this._restoreState();\n document.addEventListener('click', this._handleDocumentClick);\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this._reader) {\n this._reader.cancel();\n this._reader = null;\n }\n document.removeEventListener('mousemove', this._handleMouseMove);\n document.removeEventListener('mouseup', this._handleMouseUp);\n document.removeEventListener('click', this._handleDocumentClick);\n // Release the mic if the chatbot is torn down mid-dictation — otherwise the\n // recognizer keeps the browser's recording indicator lit with nothing to\n // transcribe into. abort() (not stop()) since the discarded text has nowhere to go.\n if (this._speechRecognition) {\n this._speechRecognition.abort();\n this._speechRecognition = null;\n this._isDictating = false;\n }\n // Release any object URLs still held by staged attachments.\n this._pendingConversationFiles.forEach((p) => {\n if (p.previewUrl) {\n URL.revokeObjectURL(p.previewUrl);\n }\n });\n }\n updated(changed) {\n if (changed.has('messages')) {\n if (!this._userHasScrolledUp && !this._isStreaming && this._messagesEl) {\n requestAnimationFrame(() => {\n if (this._messagesEl) {\n this._messagesEl.scrollTop = this._messagesEl.scrollHeight;\n }\n });\n }\n }\n if (changed.has('opened') && this.opened && this._inputEl) {\n setTimeout(() => {\n if (this._inputEl) {\n this._inputEl.focus();\n }\n }, 200);\n }\n // Position the fixed skill menu above the composer, following the krubble\n // select-field pattern (fixed element positioned from the trigger's rect).\n if (this._skillMenuOpened) {\n this._positionSkillMenu();\n }\n // Keep the keyboard-highlighted skill scrolled into view.\n if (changed.has('_skillHighlighted') && this._skillMenuOpened) {\n this._skillMenuEl\n ?.querySelector('.skill-menu__item--highlighted')\n ?.scrollIntoView({ block: 'nearest' });\n }\n }\n /** Anchor the fixed skill menu to the composer, opening upward above it. */\n _positionSkillMenu() {\n requestAnimationFrame(() => {\n if (!this._skillMenuEl || !this._inputWrapperEl) {\n return;\n }\n const inputRect = this._inputWrapperEl.getBoundingClientRect();\n this._skillMenuEl.style.left = inputRect.left + 'px';\n this._skillMenuEl.style.width = inputRect.width + 'px';\n // Bound the menu by the chat panel's own top edge so it stays within the\n // widget. In floating mode that keeps it inside the card; in inline mode the\n // panel top sits just below the app header/breadcrumb, so it stays clear of\n // those too. An 8px gap keeps it off both edges.\n const topLimit = this._panelEl.getBoundingClientRect().top + 8;\n const spaceAbove = inputRect.top - 8 - topLimit;\n this._skillMenuEl.style.maxHeight = spaceAbove + 'px';\n // Measure after the cap is applied so the upward anchor uses the real\n // height, then clamp the top edge to the panel bound.\n const menuRect = this._skillMenuEl.getBoundingClientRect();\n const top = Math.max(topLimit, inputRect.top - menuRect.height - 8);\n this._skillMenuEl.style.top = top + 'px';\n });\n }\n // --- Public methods ---\n /**\n * Stops the current stream without clearing the conversation.\n */\n stop() {\n this._handleStop();\n }\n /** Whether a turn is in flight — true from send until the stream ends. */\n isStreaming() {\n return this._isStreaming;\n }\n /** Open the chat panel. */\n open() {\n if (!this.opened) {\n this._handleToggle();\n }\n }\n /** Close the chat panel. */\n close() {\n if (this.opened) {\n this._handleToggle();\n }\n }\n /** Toggle the chat panel open/closed. */\n toggle() {\n this._handleToggle();\n }\n // --- Private methods ---\n /**\n * Shows a full-viewport transparent overlay during drag/resize operations.\n *\n * This overlay solves a critical rendering issue when the chatbot is used inside\n * a page that contains iframes (e.g., the AI editor shell where the page content\n * is rendered in an iframe and the chatbot floats on top).\n *\n * Without the overlay, modifying the iframe's `pointer-events` style during drag\n * (to prevent it from swallowing mousemove events) causes Chrome to recalculate\n * compositing layers. This layer recalculation blocks the browser from repainting\n * the chatbot panel's style changes (width/height/position) even though they are\n * correctly applied to the DOM. The result is that the panel appears frozen while\n * the user drags, despite the inline styles updating on every mousemove.\n *\n * The overlay approach avoids this entirely: instead of touching the iframe's styles,\n * we place a transparent div (z-index 9999) above the iframe but below the chatbot\n * (z-index 10000). This div intercepts all mouse events that would otherwise hit the\n * iframe, without triggering any compositing layer changes on the iframe itself.\n */\n _showOverlay() {\n if (!this._overlay) {\n this._overlay = document.createElement('div');\n this._overlay.style.cssText = 'position:fixed; inset:0; z-index:9999; display:none;';\n document.body.appendChild(this._overlay);\n }\n this._overlay.style.display = 'block';\n }\n _handleHeaderMouseDown(e) {\n // Inline mode fills its parent — dragging the panel doesn't apply.\n if (this.variant === 'inline') {\n return;\n }\n // Ignore clicks on buttons inside the header\n if (e.target.closest('button')) {\n return;\n }\n if (!this._panelEl) {\n return;\n }\n this._isDragging = true;\n this._panelEl.classList.add('panel--dragging');\n this._showOverlay();\n const rect = this._panelEl.getBoundingClientRect();\n this._panelEl.style.left = rect.left + 'px';\n this._panelEl.style.top = rect.top + 'px';\n this._panelEl.style.right = 'auto';\n this._panelEl.style.bottom = 'auto';\n this._panelEl.style.position = 'fixed';\n this._dragStartX = e.clientX;\n this._dragStartY = e.clientY;\n this._dragStartLeft = rect.left;\n this._dragStartTop = rect.top;\n e.preventDefault();\n document.addEventListener('mousemove', this._handleMouseMove);\n document.addEventListener('mouseup', this._handleMouseUp);\n }\n _handleResizeMouseDown(e) {\n // Inline mode fills its parent — resizing the panel doesn't apply.\n if (this.variant === 'inline') {\n return;\n }\n if (!this._panelEl) {\n return;\n }\n this._isResizing = true;\n this._resizeDir = e.currentTarget.dataset.dir || '';\n this._panelEl.classList.add('panel--resizing');\n this._showOverlay();\n const rect = this._panelEl.getBoundingClientRect();\n this._panelEl.style.left = rect.left + 'px';\n this._panelEl.style.top = rect.top + 'px';\n this._panelEl.style.right = 'auto';\n this._panelEl.style.bottom = 'auto';\n this._panelEl.style.position = 'fixed';\n this._dragStartX = e.clientX;\n this._dragStartY = e.clientY;\n this._dragStartLeft = rect.left;\n this._dragStartTop = rect.top;\n this._resizeStartW = rect.width;\n this._resizeStartH = rect.height;\n e.preventDefault();\n e.stopPropagation();\n document.addEventListener('mousemove', this._handleMouseMove);\n document.addEventListener('mouseup', this._handleMouseUp);\n }\n _handleToggle() {\n this.opened = !this.opened;\n if (this.opened && this._panelEl) {\n this._applyStoredLayout();\n }\n this._saveState();\n }\n _saveState() {\n try {\n const state = {\n opened: String(this.opened),\n message: this._inputValue,\n debugPanelOpen: String(this._debugPanelOpen),\n debugDrawerWidth: String(this._debugDrawerWidth),\n };\n if (this._panelEl) {\n const s = this._panelEl.style;\n if (s.left) {\n state.left = s.left;\n }\n if (s.top) {\n state.top = s.top;\n }\n if (s.width) {\n state.width = s.width;\n }\n if (s.height) {\n state.height = s.height;\n }\n if (s.position) {\n state.position = s.position;\n }\n }\n localStorage.setItem('kr-chatbot-state', JSON.stringify(state));\n }\n catch { /* localStorage not available */ }\n }\n _restoreState() {\n try {\n const raw = localStorage.getItem('kr-chatbot-state');\n if (!raw) {\n return;\n }\n const state = JSON.parse(raw);\n // Draft text and the debug drawer are persisted for all variants.\n // A lone `/` is dropped — it's the in-progress half of a menu interaction,\n // not a draft, and restoring it would revive a stale menu the user never\n // used. Anything with an actual command after the slash (`/code`, `/code do\n // the thing`) is a real draft and restores normally. Trimmed before testing\n // so a stray space around the slash doesn't defeat the check.\n if (typeof state.message === 'string' && state.message.trim() !== '/') {\n this._inputValue = state.message;\n }\n this._debugPanelOpen = state.debugPanelOpen === 'true';\n const w = Number(state.debugDrawerWidth);\n if (w >= 300) {\n this._debugDrawerWidth = w;\n }\n // The floating widget's open/layout state doesn't apply to inline mode.\n if (this.variant !== 'inline' && state.opened === 'true') {\n this.opened = true;\n // Apply layout after first render\n this.updateComplete.then(() => this._applyStoredLayout());\n }\n }\n catch { /* localStorage not available */ }\n }\n _applyStoredLayout() {\n try {\n const raw = localStorage.getItem('kr-chatbot-state');\n if (!raw || !this._panelEl) {\n return;\n }\n const state = JSON.parse(raw);\n if (state.position) {\n this._panelEl.style.position = state.position;\n }\n if (state.left) {\n this._panelEl.style.left = state.left;\n }\n if (state.top) {\n this._panelEl.style.top = state.top;\n }\n if (state.width) {\n this._panelEl.style.width = state.width;\n }\n if (state.height) {\n this._panelEl.style.height = state.height;\n }\n }\n catch { /* localStorage not available */ }\n }\n _handleInputChange(e) {\n this._inputValue = e.target.value;\n this._saveState();\n // Auto-resize textarea\n const textarea = e.target;\n textarea.style.height = 'auto';\n textarea.style.height = Math.min(textarea.scrollHeight, 120) + 'px';\n // Open the skill menu while the message is a `/` command being typed (a\n // leading slash with no space yet). The text after the slash is the search\n // query, run server-side via `_searchInvocableSkills`.\n // (org skills + installed globals — everything invocable by /code)\n const slashMatch = this._inputValue.match(/^\\/(\\S*)$/);\n if (slashMatch) {\n this._skillMenuOpened = true;\n this._skillQuery = slashMatch[1];\n this._skillHighlighted = 0;\n this._searchInvocableSkills(this._skillQuery);\n }\n else {\n this._skillMenuOpened = false;\n }\n }\n _handleKeyDown(e) {\n // When the skill menu is open, arrow keys / Enter / Escape drive it. The top\n // actions (Attach Files, Attach Files for Reference, Browse All Skills, plus\n // the two debug test triggers when enabled) come first, then the filtered\n // skills — all one navigable list.\n if (this._skillMenuOpened) {\n const debugActions = this.variant === 'inline' && this._aiFrameworkConfig.debugTelemetryEnabled === true;\n let actionCount = 3;\n if (debugActions) {\n actionCount = 5;\n }\n const count = actionCount + this._invocableSkills.length;\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n this._skillHighlighted = (this._skillHighlighted + 1) % count;\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n this._skillHighlighted = (this._skillHighlighted - 1 + count) % count;\n return;\n }\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n this._activateSkillMenuItem(this._skillHighlighted);\n return;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n this._skillMenuOpened = false;\n return;\n }\n }\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n this._handleSubmit();\n }\n }\n /** Run the skill-menu item at the given flat index (actions first, then skills). */\n _activateSkillMenuItem(index) {\n const debugActions = this.variant === 'inline' && this._aiFrameworkConfig.debugTelemetryEnabled === true;\n let actionCount = 3;\n if (debugActions) {\n actionCount = 5;\n }\n if (index === 0) {\n this._openFilePicker(true);\n return;\n }\n if (index === 1) {\n this._openFilePicker(false);\n return;\n }\n if (index === 2) {\n this._handleSkillBrowseOpen();\n return;\n }\n if (debugActions && index === 3) {\n this._skillMenuOpened = false;\n this._send({\n message: '/test-context-warning',\n conversationFiles: [],\n });\n return;\n }\n if (debugActions && index === 4) {\n this._skillMenuOpened = false;\n this._send({\n message: '/test-context-limit',\n conversationFiles: [],\n });\n return;\n }\n const skill = this._invocableSkills[index - actionCount];\n if (skill) {\n this._handleSkillSelect(skill);\n }\n }\n // --- Skills ---\n /**\n * Load the browse dialog's \"Your Org\" tab into `_orgSkills` from\n * `/conversation/localSkillList` — this instance's own active skills, already\n * role-filtered to what the caller may run and ranked by the server.\n *\n * Not the `aiskills` search endpoint: that requires a skill-authoring role\n * (`skillView`/`skillEdit`), so an ordinary chat user got a 403 and an empty\n * tab. This one only needs a logged-in employee. It also means the query\n * matching, active-only filter and \"exclude globally-published\" rule all live\n * server-side instead of being rebuilt as OpenSearch DSL here.\n *\n * EXCEPTION — on kodaris.com this list also carries that instance's own\n * globally-published skills (flagged `global: true`), because there is no\n * Kodaris tab there for them to appear on.\n *\n * Request-id guard drops responses that arrive out of order (kr-combo-box\n * `_fetch` pattern).\n */\n _searchOrgSkills(query) {\n this._orgSkillRequestId++;\n const requestId = this._orgSkillRequestId;\n KRHttp.fetch({\n url: '/api/system/conversation/localSkillList',\n method: 'POST',\n body: { query: query.trim() },\n })\n .then((r) => r.json())\n .then((res) => {\n // Ignore a stale response superseded by a newer search.\n if (requestId !== this._orgSkillRequestId) {\n return;\n }\n this._orgSkills = (res?.data || []);\n })\n .catch((error) => {\n console.error('kr-chatbot: skill search failed', error);\n });\n }\n /**\n * Load the skills for the `/` composer menu into `_invocableSkills` from\n * `/conversation/availableSkills` — this instance's own skills plus the installed\n * global ones, already merged, role-filtered and ranked by the server. That's the\n * same set the model sees via `list_skills`, so the menu can't offer a skill the\n * chat would then refuse.\n *\n * Not the `aiskills` endpoints the browse dialog's Org tab uses: those require a\n * skill-authoring role, which an ordinary chat user doesn't have.\n *\n * Request-id guard drops responses that arrive out of order (kr-combo-box `_fetch`\n * pattern).\n */\n _searchInvocableSkills(query) {\n this._invocableSkillRequestId++;\n const requestId = this._invocableSkillRequestId;\n KRHttp.fetch({\n url: '/api/system/conversation/availableSkills',\n method: 'POST',\n body: { query: query.trim() },\n })\n .then((r) => r.json())\n .then((res) => {\n // Ignore a stale response superseded by a newer search.\n if (requestId !== this._invocableSkillRequestId) {\n return;\n }\n this._invocableSkills = (res?.data || []);\n })\n .catch((error) => {\n console.error('kr-chatbot: invocable skill search failed', error);\n });\n }\n /**\n * Load the browse dialog's \"Kodaris\" tab into `_globalSkills` — the whole\n * published Kodaris catalog for discovery, installed or not, runnable by this\n * user or not. Each row carries `enabled` (installed here), `canEnable` (may\n * install it) and `canRun` (roles allow invoking it).\n *\n * Uses `/conversation/globalSkillList` rather than the `/aiskills/global/search`\n * twin, which requires a skill-authoring role an ordinary chat user doesn't have.\n *\n * Returns `[]` — not an error — when there's no reachable registry, and always\n * on kodaris.com, which IS the catalog source and so has no remote to pull. The\n * tab itself is hidden there (see `_renderSkillBrowse`).\n */\n _searchGlobalSkills(query) {\n this._globalSkillRequestId++;\n const requestId = this._globalSkillRequestId;\n KRHttp.fetch({\n url: '/api/system/conversation/globalSkillList',\n method: 'POST',\n body: { query: query.trim() },\n })\n .then((r) => r.json())\n .then((res) => {\n // Ignore a stale response superseded by a newer search.\n if (requestId !== this._globalSkillRequestId) {\n return;\n }\n this._globalSkills = (res?.data || []);\n })\n .catch((error) => {\n console.error('kr-chatbot: global skill search failed', error);\n });\n }\n /**\n * Enable or disable a global skill on this instance via\n * `/aiskills/global/{code}/enabled`, then reflect the server's result on the\n * matching card. Ignores clicks while a request for the same code is pending.\n */\n _handleGlobalSkillEnable(skill, e) {\n // The card body inserts the skill; the install button must not also do that.\n e.stopPropagation();\n // The button is shown to everyone so the catalog reads the same for all users,\n // but the enable endpoint requires administrator/superuser/skillEdit. Without\n // it, say who to ask instead of firing a request that comes back 403.\n if (!skill.canEnable) {\n KRSnackbar.show({\n title: 'Permission Required',\n message: 'You do not have permission to install skills. Please contact your site administrator.',\n type: 'error',\n });\n return;\n }\n if (this._globalSkillPending.has(skill.code)) {\n return;\n }\n // Drive the clicked button's own spinner (KRButton disables itself while\n // loading, so a second click can't fire until the request settles).\n const btn = e.currentTarget;\n this._globalSkillPending.add(skill.code);\n btn?.showLoading();\n KRHttp.fetch({\n url: `/api/system/opensearch/aiskills/global/${encodeURIComponent(skill.code)}/enabled`,\n method: 'POST',\n body: { enabled: !skill.enabled },\n })\n .then((r) => r.json())\n .then((res) => {\n // Reflect the server's returned flag on the card. The button label/style\n // re-render from skill.enabled; reset() clears the spinner to idle.\n skill.enabled = res?.data?.enabled;\n btn?.reset();\n this.requestUpdate();\n })\n .catch((error) => {\n console.error('kr-chatbot: global skill enable failed', error);\n btn?.showError('Error');\n })\n .finally(() => {\n this._globalSkillPending.delete(skill.code);\n });\n }\n /** The `+` button toggles the skill/attachment menu open (showing all skills). */\n _handlePlusClick() {\n if (this._skillMenuOpened) {\n this._skillMenuOpened = false;\n return;\n }\n this._skillQuery = '';\n this._skillHighlighted = 0;\n this._skillMenuOpened = true;\n this._searchInvocableSkills('');\n }\n /**\n * The mic button toggles dictation. Speech is transcribed straight into the\n * composer as editable text — the user still reviews and presses send, so a\n * misheard word is fixable and nothing is sent by voice alone.\n *\n * Recognition runs entirely in the browser's Web Speech API (Chrome/Edge send\n * audio to Google's service, Safari to Apple's). No audio reaches Kodaris, and\n * there's no backend call or cost on our side.\n */\n _handleMicClick() {\n // Second click stops. `stop()` flushes the pending utterance as a final\n // result, so the last words aren't lost; onend clears the state.\n if (this._speechRecognition) {\n this._speechRecognition.stop();\n return;\n }\n // Prefixed in Chrome/Edge/Safari; the unprefixed name is checked first for\n // whenever they drop the prefix. The mic button isn't rendered without one of\n // these, so reaching here unsupported means a mid-session change — bail quietly.\n const SpeechRecognitionCtor = window.SpeechRecognition || window.webkitSpeechRecognition;\n if (!SpeechRecognitionCtor) {\n return;\n }\n const recognition = new SpeechRecognitionCtor();\n // Keep listening through natural pauses — a chat message is often several\n // sentences, and the default stops at the first one.\n recognition.continuous = true;\n // Show words as they're recognized rather than only at end of utterance.\n recognition.interimResults = true;\n // `lang` is deliberately left unset so the recognizer follows the page/OS\n // language, which is correct for every consumer of this component.\n // Dictation ADDS to whatever is already typed rather than replacing it, so\n // the user can type half a message and speak the rest. The separating space\n // is part of the base so the transcript never runs into the existing word.\n this._speechBaseValue = this._inputValue;\n if (this._speechBaseValue && !this._speechBaseValue.endsWith(' ')) {\n this._speechBaseValue += ' ';\n }\n this._speechFinalTranscript = '';\n recognition.onresult = (e) => {\n // Everything from resultIndex on is new since the last event: finalized\n // pieces move to _speechFinalTranscript permanently, while non-final ones\n // are rebuilt each event because the browser revises its guess as it hears\n // more. Rebuilding the whole value (base + final + interim) is what keeps\n // those revisions from stacking up as duplicated text.\n let interim = '';\n for (let i = e.resultIndex; i < e.results.length; i++) {\n if (e.results[i].isFinal) {\n this._speechFinalTranscript += e.results[i][0].transcript;\n }\n else {\n interim += e.results[i][0].transcript;\n }\n }\n this._inputValue = this._speechBaseValue + this._speechFinalTranscript + interim;\n this._saveState();\n // Grow the textarea as dictated text wraps — the same clamp the typing path\n // uses, since @input doesn't fire for programmatic value changes.\n if (this._inputEl) {\n this._inputEl.style.height = 'auto';\n this._inputEl.style.height = Math.min(this._inputEl.scrollHeight, 120) + 'px';\n }\n };\n recognition.onerror = (e) => {\n // Denied mic permission is the one error worth explaining — the user has to\n // fix it in browser settings, and the button would otherwise look broken.\n if (e.error === 'not-allowed' || e.error === 'service-not-allowed') {\n this._error = 'Microphone access is blocked. Allow it in your browser settings to use voice input.';\n return;\n }\n // `no-speech` (silence) and `aborted` (user stopped) are normal; anything\n // else is a transient service hiccup. onend still runs, so the mic resets.\n };\n // Fires on stop(), on error, and when the browser ends recognition on its own\n // (e.g. a long silence) — the single place the live state is torn down.\n recognition.onend = () => {\n this._speechRecognition = null;\n this._isDictating = false;\n };\n // start() is what triggers the browser's mic permission prompt.\n this._speechRecognition = recognition;\n this._isDictating = true;\n this._error = '';\n recognition.start();\n this._inputEl?.focus();\n }\n /**\n /** Insert `/code ` into the composer and focus it, ready for the message. */\n _handleSkillSelect(skill) {\n // The user's roles don't allow this skill — inserting /code would just fail in the\n // chat. Name the roles that would grant it, so the user knows what to ask for and\n // whoever grants it knows what to give.\n if (skill.canRun === false) {\n let message = `You do not have access to \"${skill.name}\". Ask your site administrator to grant it.`;\n if (skill.allowedRoles?.length) {\n message = `\"${skill.name}\" requires the ${skill.allowedRoles.join(' or ')} role. Ask your site administrator to grant it.`;\n }\n KRSnackbar.show({\n title: 'Access Required',\n message: message,\n type: 'error',\n });\n return;\n }\n // A global skill nobody has installed here yet isn't runnable either — point at the\n // Install button rather than appearing to ignore the click. Local skills carry no\n // install state, so this only applies to global ones.\n if (skill.global && !skill.enabled) {\n KRSnackbar.show({\n title: 'Not Installed',\n message: `\"${skill.name}\" has to be installed on this site before you can use it — use the Install button on the card.`,\n type: 'info',\n });\n return;\n }\n this._inputValue = `/${skill.code} `;\n this._saveState();\n this._skillMenuOpened = false;\n this._skillBrowseOpened = false;\n this._inputEl?.focus();\n }\n /** Activate a skill card via keyboard (Enter/Space), since it's a div role=button. */\n _handleSkillCardKeydown(e, skill) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._handleSkillSelect(skill);\n }\n }\n /** Copy a message's text to the clipboard and briefly flash \"Copied\". */\n _handleCopyMessage(content, index) {\n navigator.clipboard.writeText(content).then(() => {\n this._copiedIndex = index;\n setTimeout(() => {\n if (this._copiedIndex === index) {\n this._copiedIndex = -1;\n }\n }, 2000);\n }).catch(() => { });\n }\n _handleSkillBrowseOpen() {\n this._skillMenuOpened = false;\n this._skillBrowseQuery = '';\n this._skillBrowseOpened = true;\n // Fill both tabs up front so switching between them is instant, not stale.\n // The Kodaris tab isn't rendered on the registry server, so skip its fetch there.\n this._searchOrgSkills('');\n if (this._aiFrameworkConfig.registryServer !== true) {\n this._searchGlobalSkills('');\n }\n }\n _handleSkillBrowseClose() {\n this._skillBrowseOpened = false;\n }\n _handleSkillBrowseSearch(e) {\n this._skillBrowseQuery = e.target.value;\n // Filter both catalogs so whichever tab the user switches to is already current.\n this._searchOrgSkills(this._skillBrowseQuery);\n if (this._aiFrameworkConfig.registryServer !== true) {\n this._searchGlobalSkills(this._skillBrowseQuery);\n }\n }\n _handleSkillBrowseTabChange(e) {\n // Both buffers are kept current by open/search, so switching just swaps which\n // one is shown — no re-search needed.\n this._skillBrowseSource = e.detail.activeTabId;\n }\n // --- Attachments ---\n /**\n * Open the OS file picker. `aiAnalyze` records which attach action was used so\n * the change handler stages the picked files in the right mode: true for\n * \"Attach Files\" (the model reads them), false for \"Attach Files for Reference\"\n * (attached for a tool to act on — the model is told about them but not asked\n * to read them). Chosen once at the picker, so selecting 30 files never means\n * toggling 30 chips.\n */\n _openFilePicker(aiAnalyze = true) {\n // Close the skill/attachment menu — opening the OS file picker is the end of\n // the menu interaction, and the picker is a separate window so the menu would\n // otherwise linger open behind it (and after a file is chosen).\n this._skillMenuOpened = false;\n // A lone `/` was only the means of reaching this action, so it shouldn't be\n // left behind in the composer once the picker opens. Nothing else is touched:\n // a real command (`/code`) stays because `/code` plus an attachment is a valid\n // invocation, and the plus button reaches this same method with an arbitrary\n // draft in the composer, which must survive.\n if (this._inputValue.trim() === '/') {\n this._inputValue = '';\n this._saveState();\n }\n this._pendingAttachAnalyze = aiAnalyze;\n this._fileInputEl?.click();\n }\n _handleFileInputChange(e) {\n const input = e.target;\n if (input.files) {\n this._addFiles(input.files, this._pendingAttachAnalyze);\n }\n // Reset so picking the same file again re-fires change.\n input.value = '';\n }\n _handlePaste(e) {\n const items = e.clipboardData?.items;\n if (!items) {\n return;\n }\n const files = [];\n for (let i = 0; i < items.length; i++) {\n if (items[i].kind === 'file') {\n const file = items[i].getAsFile();\n if (file) {\n files.push(file);\n }\n }\n }\n if (files.length) {\n e.preventDefault();\n this._addFiles(files);\n }\n }\n _handleDragEnter(e) {\n if (!this._hasFiles(e)) {\n return;\n }\n e.preventDefault();\n this._dragDepth++;\n this._isDraggingFile = true;\n }\n _handleDragOver(e) {\n if (!this._hasFiles(e)) {\n return;\n }\n // Required so the drop event fires.\n e.preventDefault();\n }\n _handleDragLeave(e) {\n if (!this._hasFiles(e)) {\n return;\n }\n this._dragDepth--;\n if (this._dragDepth <= 0) {\n this._dragDepth = 0;\n this._isDraggingFile = false;\n }\n }\n _handleDrop(e) {\n if (!this._hasFiles(e)) {\n return;\n }\n e.preventDefault();\n this._dragDepth = 0;\n this._isDraggingFile = false;\n if (e.dataTransfer?.files) {\n this._addFiles(e.dataTransfer.files);\n }\n }\n _hasFiles(e) {\n return Array.from(e.dataTransfer?.types || []).includes('Files');\n }\n /** Lower-cased extension of a filename (without the dot), or '' if none. */\n _getFileExtension(name) {\n const dot = name.lastIndexOf('.');\n if (dot < 0) {\n return '';\n }\n return name.slice(dot + 1).toLowerCase();\n }\n /**\n * Stage a set of files in the composer (held locally until send). `aiAnalyze`\n * comes from which attach action was used — true for \"Attach Files\" (the model\n * reads them), false for \"Attach Files for Reference\" (tool-only, not read).\n * Drag-and-drop and paste default to analyze.\n */\n _addFiles(fileList, aiAnalyze = true) {\n // Only accept what the picker's `accept` filter allows (extension-based, so a\n // drag/paste can't sneak in a type the picker itself wouldn't offer).\n const files = Array.from(fileList).filter((f) => ACCEPTED_FILE_EXTENSIONS.includes(this._getFileExtension(f.name)));\n if (!files.length) {\n return;\n }\n files.forEach((file) => {\n // Only images get a local preview thumbnail; documents (and videos, which are\n // tiles too) render an icon. Prefer the File's MIME, falling back to the\n // extension when it's absent.\n let previewUrl;\n if (file.type.startsWith('image/') || IMAGE_EXTENSIONS.includes(this._getFileExtension(file.name))) {\n previewUrl = URL.createObjectURL(file);\n }\n const pending = {\n localId: 'att-' + this._pendingSeq++,\n file,\n name: file.name,\n mimeType: file.type,\n previewUrl,\n aiAnalyze,\n };\n this._pendingConversationFiles = [...this._pendingConversationFiles, pending];\n });\n }\n _handlePendingRemove(localId) {\n const target = this._pendingConversationFiles.find((p) => p.localId === localId);\n if (target?.previewUrl) {\n URL.revokeObjectURL(target.previewUrl);\n }\n this._pendingConversationFiles = this._pendingConversationFiles.filter((p) => p.localId !== localId);\n }\n _clearPending() {\n this._pendingConversationFiles.forEach((p) => {\n if (p.previewUrl) {\n URL.revokeObjectURL(p.previewUrl);\n }\n });\n this._pendingConversationFiles = [];\n }\n /** Open the shared full-screen previewer for a message attachment (image or video). */\n _handleFileOpen(file) {\n // Use the local preview if the upload hasn't finished yet; otherwise the\n // backend view URL (prefixed with the base URL — a raw fetch of a relative\n // path would hit the page origin, e.g. the dev server, not the backend).\n // The previewer picks image vs video playback off the name's extension, so\n // niceName has to carry it — hence the generic fallback keeps no extension\n // only when there's no name at all.\n const src = file.previewUrl\n || `${KRHttp.getBaseUrl()}/api/system/conversationFile/${file.conversationFileID}/view`;\n const preview = KRFilePreview.open({\n src,\n name: file.niceName || 'file',\n });\n // The previewer's download button only fires a `download` event — the\n // consumer performs the actual download. Hit the view endpoint with\n // `?download=true` (Content-Disposition: attachment) in a new tab.\n preview.addEventListener('download', () => {\n window.open(`${KRHttp.getBaseUrl()}/api/system/conversationFile/${file.conversationFileID}/view?download=true`, '_blank');\n });\n }\n _handleSubmit() {\n if (this._isStreaming) {\n return;\n }\n const messageText = this._inputValue.trim();\n const pending = this._pendingConversationFiles;\n // Allow sending an image with no text, but require at least one of them.\n if (!messageText && !pending.length) {\n return;\n }\n // The files sent to the backend, each paired with its analyze flag. Sent\n // files are shown once the conversation reloads and they come back as stored\n // conversation files; the just-sent message itself carries text only.\n const conversationFiles = pending.map((p) => ({\n file: p.file,\n aiAnalyze: p.aiAnalyze,\n }));\n const submitEvent = new CustomEvent('message-submit', {\n detail: {\n message: messageText,\n conversationFiles,\n },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n this.dispatchEvent(submitEvent);\n if (submitEvent.defaultPrevented) {\n return;\n }\n this._send({\n message: messageText,\n conversationFiles\n });\n }\n /**\n * Append the user message and stream the response. Split out of `_handleSubmit`\n * so debug test triggers can send a specific message without going through the\n * composer input. `_handleSubmit` owns reading/validating the composer and\n * firing the cancelable `message-submit` event; this owns the send + stream.\n */\n _send(params) {\n const userMessage = {\n type: 'user',\n content: params.message,\n };\n // Attach the staged files' local previews to the message so its thumbnails\n // show INSTANTLY, without waiting on the upload. Each carries a temporary\n // previewUrl (images only; documents render an icon from mimeType) and\n // conversationFileID -1 as a placeholder; the built-in send swaps these for\n // the real server files once the upload returns.\n if (this._pendingConversationFiles.length) {\n userMessage.conversationFiles = this._pendingConversationFiles.map((p) => ({\n conversationFileID: -1,\n niceName: p.name,\n mimeType: p.mimeType,\n aiAnalyze: p.aiAnalyze,\n previewUrl: p.previewUrl,\n }));\n }\n // The message is on its way, so stop the mic if it's still live — otherwise\n // it would keep transcribing into the now-cleared composer. abort() rather\n // than stop() because a trailing pending utterance belongs to the message\n // just sent; flushing it would drop stray words into the next one.\n if (this._speechRecognition) {\n this._speechRecognition.abort();\n }\n this.messages = [...this.messages, userMessage];\n this._inputValue = '';\n this._saveState();\n this._error = '';\n this._userHasScrolledUp = false;\n // Clear the composer, but DON'T revoke the preview object URLs — the sent\n // message now renders them until the upload's real files replace them.\n this._pendingConversationFiles = [];\n // Reset textarea height\n if (this._inputEl) {\n this._inputEl.style.height = 'auto';\n }\n // Add empty assistant message to stream into\n this.messages = [...this.messages, {\n type: 'assistant',\n content: '',\n }];\n this._isStreaming = true;\n // Scroll user's message to the top (Gemini-style).\n // Set min-height on the assistant message = container height so there's enough\n // scroll room below the user message to push it to the top.\n this.updateComplete.then(() => {\n if (!this._messagesEl) {\n return;\n }\n // Clear min-height from previous responses\n this._messagesEl.querySelectorAll('.message--assistant').forEach((el) => {\n el.style.minHeight = '';\n });\n const allMsgEls = this._messagesEl.querySelectorAll('.message');\n const userMsgEl = allMsgEls[this.messages.length - 2];\n const assistantMsgEl = allMsgEls[this.messages.length - 1];\n if (assistantMsgEl) {\n assistantMsgEl.style.minHeight = this._messagesEl.clientHeight + 'px';\n }\n if (userMsgEl) {\n this._messagesEl.scrollTop = userMsgEl.offsetTop - this._messagesEl.offsetTop - 24;\n }\n });\n // Default to streaming from the Kodaris Bedrock conversation endpoints when\n // the consumer hasn't provided their own `send`.\n if (!this.send) {\n this.send = (params) => {\n // Images are upload-first: each file is stored as a conversation file\n // (type LIBRARY — the format lives in mimeType), then the resulting\n // conversationFileIDs are attached to the message via `fileIds` on the\n // normal JSON stream call. There is no multipart chat endpoint. With no\n // images the upload resolves to an empty list immediately; a failed\n // upload is dropped so an undefined id never reaches `fileIds`.\n let uploaded = Promise.resolve([]);\n if (params.conversationFiles.length) {\n uploaded = Promise.all(params.conversationFiles.map(({ file, aiAnalyze }) => {\n const form = new FormData();\n form.append('file', file);\n form.append('type', 'LIBRARY');\n form.append('niceName', file.name);\n // Reference-only files (from \"Attach Files for Reference\") aren't read\n // by the model — the endpoint defaults aiAnalyze=true, so only send\n // the flag when it's false.\n if (!aiAnalyze) {\n form.append('aiAnalyze', 'false');\n }\n return KRHttp.fetch({\n url: '/api/system/conversationFile/upload',\n method: 'POST',\n body: form,\n })\n .then((r) => r.json())\n // Keep the whole file DTO the upload returns (id + niceName +\n // mimeType + …), not just the id — it's attached to the sent message\n // below so the attachment shows immediately.\n .then((res) => res.data);\n }));\n }\n return uploaded.then((files) => {\n // Replace the just-sent user message's local previews with the real\n // uploaded files (backed by the stored file's view URL). The last user\n // message is the one _send appended before the trailing empty assistant\n // message; revoke its now-defunct preview object URLs first.\n if (files.length) {\n for (let i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].type === 'user') {\n (this.messages[i].conversationFiles || []).forEach((f) => {\n if (f.previewUrl) {\n URL.revokeObjectURL(f.previewUrl);\n }\n });\n this.messages[i].conversationFiles = files;\n this.requestUpdate();\n break;\n }\n }\n }\n // Conversation targeting: continue `conversationId` when set, else\n // start a fresh conversation (createNew) for this turn. The pin below\n // means createNew only fires on the very first untargeted turn.\n const body = {\n userText: params.message,\n fileIds: files.map((f) => f.conversationFileID),\n };\n // Ground the model in where the user is and what they've highlighted.\n // Only sent when present so an empty selection / failed capture doesn't\n // add noise to the request.\n if (params.pageContext) {\n body.pageContext = params.pageContext;\n }\n if (params.selectionContext) {\n body.selectionContext = params.selectionContext;\n }\n if (this.conversationId != null) {\n body.conversationID = this.conversationId;\n }\n else {\n body.createNew = true;\n }\n return KRHttp.fetch({\n url: '/api/system/integration/aws/bedrock/stream/invokeModelForConversationWithState',\n method: 'POST',\n headers: { Accept: 'text/event-stream' },\n body,\n }).then((response) => {\n // Pin the session to the conversation this turn used. The stream\n // doesn't echo the resolved id, so when we let the server create one\n // (no conversationId set) we resolve it via `/last` and keep it, so\n // subsequent turns continue this conversation instead of each sending\n // createNew and spawning a new one. Best-effort, fire-and-forget: a\n // failure leaves it unpinned and the next turn resolves server-side.\n if (this.conversationId == null) {\n KRHttp.fetch({ url: '/api/system/conversation/last' })\n .then((r) => r.json())\n .then((res) => {\n const conversation = res?.data;\n const id = conversation?.conversationID;\n if (typeof id === 'number') {\n this.conversationId = id;\n // Announce the newly-created conversation so consumers can react\n // (e.g. update the route from /chat/new to /chat/{id}). The full\n // conversation object is passed, not just the id, so consumers\n // have the title/timestamps too.\n this.dispatchEvent(new CustomEvent('conversation-created', {\n detail: { conversation },\n bubbles: true,\n composed: true,\n }));\n }\n })\n .catch(() => { });\n }\n return response;\n });\n });\n };\n }\n // Capture where the user is and what they've highlighted at send time (not\n // earlier — selection is transient and the route may have changed since the\n // panel opened), so every turn grounds the model in the user's current spot.\n const context = this._captureContext();\n this.send({\n message: params.message,\n messages: this.messages.slice(0, -1),\n conversationFiles: params.conversationFiles,\n pageContext: context.pageContext,\n selectionContext: context.selectionContext,\n }).then((response) => {\n if (!response.ok) {\n this._handleStreamError('Request failed: ' + response.status);\n return;\n }\n if (!response.body) {\n this._handleStreamError('No response body');\n return;\n }\n this._reader = response.body.getReader();\n this._decoder = new TextDecoder();\n this._buffer = '';\n this._readStreamChunk();\n }).catch((err) => {\n if (err.name !== 'AbortError') {\n this._handleStreamError(err.message);\n }\n });\n }\n /**\n * Capture ambient \"where is the user / what are they looking at\" context at\n * send time, so the AI is grounded without the host passing anything in.\n *\n * Two universal sources that exist on every page the chatbot mounts in:\n * - `pageContext` — the location (full url, which already carries the path and\n * query) and title, plus, when the page renders the server-side\n * `#kodaris-page` JSON island (storefront content pages do), its parsed\n * contents (page name/type/ids). A page without the island still yields url\n * + title, so context is never empty on a real page.\n * - `selectionContext` — the text the user currently has highlighted, read\n * live here because a selection is transient (it may be gone a moment later).\n *\n * Both are returned as strings because that's what the backend `ModelForText`\n * fields (`pageContext` / `selectionContext`) accept. Capture is best-effort:\n * any failure yields an empty string for that field rather than blocking send.\n */\n _captureContext() {\n let pageContext = '';\n try {\n const page = {\n url: window.location.href,\n title: document.title,\n };\n // Structured page context is opt-in by convention: a page that renders the\n // `#kodaris-page` island gets its name/type/ids folded in for free. The\n // island's text is JSON; a malformed/absent island just leaves it out.\n const island = document.getElementById('kodaris-page');\n if (island && island.textContent) {\n try {\n page.page = JSON.parse(island.textContent);\n }\n catch { /* island present but not valid JSON — location context still stands */ }\n }\n pageContext = JSON.stringify(page);\n }\n catch { /* leave pageContext empty — never block a send on context capture */ }\n let selectionContext = '';\n try {\n const selection = window.getSelection();\n if (selection) {\n selectionContext = selection.toString().trim();\n }\n }\n catch { /* leave selectionContext empty */ }\n return {\n pageContext,\n selectionContext,\n };\n }\n _handleStop() {\n if (this._reader) {\n this._reader.cancel();\n this._reader = null;\n }\n this._isStreaming = false;\n }\n _handleMessagesScroll(e) {\n const container = e.target;\n const distanceFromBottom = container.scrollHeight - container.scrollTop - container.clientHeight;\n if (distanceFromBottom > 50) {\n this._userHasScrolledUp = true;\n }\n else {\n this._userHasScrolledUp = false;\n }\n }\n _handleErrorDismiss() {\n this._error = '';\n }\n _handleContextWarningDismiss() {\n this._contextWarning = '';\n }\n _handleToggleDebugPanel() {\n this._debugPanelOpen = !this._debugPanelOpen;\n this._saveState();\n }\n _handleDebugResizeMouseDown(e) {\n this._isDebugResizing = true;\n this._debugResizeStartX = e.clientX;\n this._debugResizeStartW = this._debugDrawerWidth;\n e.preventDefault();\n e.stopPropagation();\n document.addEventListener('mousemove', this._handleDebugResizeMouseMove);\n document.addEventListener('mouseup', this._handleDebugResizeMouseUp);\n }\n _readStreamChunk() {\n if (!this._reader) {\n return;\n }\n this._reader.read().then((result) => {\n if (result.done) {\n this._isStreaming = false;\n this._reader = null;\n return;\n }\n this._buffer = this._buffer + this._decoder.decode(result.value, { stream: true });\n const events = this._buffer.split('\\n\\n');\n this._buffer = events.pop() || '';\n for (let i = 0; i < events.length; i++) {\n if (!events[i].trim()) {\n continue;\n }\n const lines = events[i].split('\\n');\n for (let j = 0; j < lines.length; j++) {\n if (!lines[j].startsWith('data:')) {\n continue;\n }\n const raw = lines[j].slice(5).trim();\n if (!raw) {\n continue;\n }\n let data;\n try {\n data = JSON.parse(raw);\n }\n catch {\n continue;\n }\n // Dispatch a generic event for every SSE message so consumers can listen and react\n this.dispatchEvent(new CustomEvent('stream-event', {\n detail: data,\n bubbles: true,\n composed: true,\n }));\n if (data.type === 'REASONING_PART') {\n if (data.message) {\n const lastIndex = this.messages.length - 1;\n if (lastIndex >= 0 && this.messages[lastIndex].type === 'assistant') {\n if (!this.messages[lastIndex].reasoning) {\n this.messages[lastIndex].reasoning = '';\n }\n this.messages[lastIndex].reasoning += String(data.message);\n this.requestUpdate();\n }\n }\n }\n else if (data.type === 'RESPONSE_PART') {\n if (data.message) {\n const lastIndex = this.messages.length - 1;\n if (lastIndex >= 0 && this.messages[lastIndex].type === 'assistant') {\n this.messages[lastIndex].content += String(data.message);\n this.requestUpdate();\n }\n }\n }\n else if (data.type === 'ERROR') {\n this._handleStreamError(String(data.message || 'Unknown error'));\n }\n else if (data.type === 'CONVERSATION_TOKEN_WARNING') {\n // User-facing: friendly \"conversation is getting long\" guidance.\n // Text only, never sent to the model — render verbatim as a banner.\n this._contextWarning = String(data.message || '');\n }\n else if (data.type === 'CONVERSATION_TITLE') {\n // The server generated a real title for a brand-new conversation\n // (it was created with a truncated first-message placeholder that we\n // deliberately never show). Adopt it as the header label and pass it\n // up so consumers can update their own chrome, e.g. a breadcrumb.\n if (data.data) {\n const title = String(data.data.title || '');\n if (title) {\n this.label = title;\n this.dispatchEvent(new CustomEvent('conversation-title', {\n detail: { title },\n bubbles: true,\n composed: true,\n }));\n }\n }\n }\n else if (data.type === 'CONVERSATION_LIMIT_REACHED') {\n // User-facing hard stop. Carries finished:true (handled below).\n // Clear any soft warning so we don't double-message the user.\n this._contextLimitReached = true;\n this._contextLimitMessage = String(data.message || '');\n this._contextWarning = '';\n }\n else if (data.type === 'TOKEN_USAGE') {\n // INTERNAL-ONLY debug telemetry. Update the panel snapshot and the\n // per-iteration log; never render as a chat bubble.\n if (data.data) {\n const usage = data.data;\n this._telemetry = usage;\n // A new turn starts at iteration 1 — clear the prior turn's log\n // only now (not at send), so it stays visible until fresh data\n // actually arrives rather than blanking out on submit.\n if (usage.iteration === 1) {\n this._iterationLog = [usage];\n this._cacheCheckpoints = {};\n }\n else {\n this._iterationLog = [...this._iterationLog, usage];\n }\n }\n }\n else if (data.type === 'CACHE_CHECKPOINT') {\n // INTERNAL-ONLY debug telemetry. Records when/under which mode the\n // history checkpoint was placed, keyed by iteration for the table.\n if (data.data) {\n const checkpoint = data.data;\n this._cacheCheckpoints = {\n ...this._cacheCheckpoints,\n [checkpoint.iteration]: checkpoint,\n };\n }\n }\n if (data.finished) {\n this._isStreaming = false;\n this._reader = null;\n }\n }\n }\n this._readStreamChunk();\n }).catch((err) => {\n if (err.name !== 'AbortError') {\n this._handleStreamError(err.message);\n }\n });\n }\n _handleStreamError(message) {\n this._isStreaming = false;\n this._error = message;\n if (this._reader) {\n this._reader.cancel();\n this._reader = null;\n }\n // Remove the empty assistant message if it has no content\n if (this.messages.length > 0) {\n const lastMessage = this.messages[this.messages.length - 1];\n if (lastMessage.type === 'assistant' && !lastMessage.content) {\n this.messages = this.messages.slice(0, -1);\n }\n }\n }\n // --- Render ---\n /** The `/` skill menu shown above the composer while typing a slash command. */\n _renderSkillMenu() {\n const skills = this._invocableSkills;\n // Debug test triggers are extra actions after Attach Files / Browse. The\n // flat keyboard index counts actions first, then skills, so the skills'\n // index offset is the number of actions shown.\n const debugActions = this.variant === 'inline' && this._aiFrameworkConfig.debugTelemetryEnabled === true;\n let actionCount = 3;\n if (debugActions) {\n actionCount = 5;\n }\n return html `\n <div class=\"skill-menu\">\n <div class=\"skill-menu__actions\">\n <button\n class=${classMap({\n 'skill-menu__action': true,\n 'skill-menu__item--highlighted': this._skillHighlighted === 0,\n })}\n @click=${() => this._openFilePicker(true)}\n >\n <span class=\"skill-menu__name\">Attach Files</span>\n <span class=\"skill-menu__desc\">The AI reads these files</span>\n </button>\n <button\n class=${classMap({\n 'skill-menu__action': true,\n 'skill-menu__item--highlighted': this._skillHighlighted === 1,\n })}\n @click=${() => this._openFilePicker(false)}\n >\n <span class=\"skill-menu__name\">Attach Files for Reference</span>\n <span class=\"skill-menu__desc\">Attached for a tool — not read by the AI</span>\n </button>\n <button\n class=${classMap({\n 'skill-menu__action': true,\n 'skill-menu__item--highlighted': this._skillHighlighted === 2,\n })}\n @click=${this._handleSkillBrowseOpen}\n >\n Browse All Skills\n </button>\n ${debugActions ? html `\n <button\n class=${classMap({\n 'skill-menu__action': true,\n 'skill-menu__item--highlighted': this._skillHighlighted === 3,\n })}\n @click=${() => this._activateSkillMenuItem(3)}\n >\n Test Context Warning\n </button>\n <button\n class=${classMap({\n 'skill-menu__action': true,\n 'skill-menu__item--highlighted': this._skillHighlighted === 4,\n })}\n @click=${() => this._activateSkillMenuItem(4)}\n >\n Test Context Limit\n </button>\n ` : nothing}\n </div>\n ${skills.length ? html `\n <ul class=\"skill-menu__list\">\n ${skills.map((skill, index) => html `\n <li>\n <button\n class=${classMap({\n 'skill-menu__item': true,\n 'skill-menu__item--highlighted': index + actionCount === this._skillHighlighted,\n })}\n @click=${() => this._handleSkillSelect(skill)}\n >\n <span class=\"skill-menu__name\">${skill.name}</span>\n ${skill.description ? html `\n <span class=\"skill-menu__desc\">${skill.description}</span>\n ` : nothing}\n </button>\n </li>\n `)}\n </ul>\n ` : nothing}\n </div>\n `;\n }\n /**\n * The \"Browse all skills\" dialog — a searchable grid of Org / Kodaris cards.\n *\n * The Kodaris tab is omitted on the registry server (kodaris.com): that instance\n * IS the catalog source, so `globalSkillList` has no remote to pull and always\n * returns `[]`. Its own published skills appear on the Your Org tab instead,\n * carrying a \"Global\" badge.\n */\n _renderSkillBrowse() {\n return html `\n <kr-dialog\n opened\n label=\"Browse Skills\"\n width=\"720px\"\n @close=${this._handleSkillBrowseClose}\n >\n <div class=\"skill-browse\">\n <kr-text-field\n placeholder=\"Search skills...\"\n .value=${this._skillBrowseQuery}\n @input=${this._handleSkillBrowseSearch}\n ></kr-text-field>\n <kr-tab-group\n active-tab-id=${this._skillBrowseSource}\n @tab-change=${this._handleSkillBrowseTabChange}\n >\n <kr-tab id=\"org\" label=\"Your Org\">\n ${this._renderSkillGrid()}\n </kr-tab>\n ${this._aiFrameworkConfig.registryServer === true ? nothing : html `\n <kr-tab id=\"kodaris\" label=\"Kodaris\">\n ${this._renderSkillGrid(true)}\n </kr-tab>\n `}\n </kr-tab-group>\n </div>\n </kr-dialog>\n `;\n }\n /**\n * The card grid of skill search results for the browse dialog. Clicking a card\n * inserts `/code ` into the composer. In the shared-Kodaris (`global`) tab each\n * card also gets a footer row with an Install/Uninstall button.\n *\n * The Kodaris tab is the whole published catalog, deliberately NOT role-filtered so\n * users can discover skills they don't have yet. So a card there can be in one of two\n * non-runnable states — the user's roles don't allow it (`canRun: false`), or it isn't\n * installed here (not `enabled`). Neither looks clickable; clicking either explains\n * why via `_handleSkillSelect`.\n */\n _renderSkillGrid(global = false) {\n let skills = this._orgSkills;\n if (global) {\n skills = this._globalSkills;\n }\n if (!skills.length) {\n return nothing;\n }\n return html `\n <div class=\"skill-browse__grid\">\n ${skills.map((skill) => html `\n <div\n class=${classMap({\n 'skill-card': true,\n 'skill-card--unavailable': skill.canRun === false || (!!skill.global && !skill.enabled),\n })}\n role=\"button\"\n tabindex=\"0\"\n @click=${() => this._handleSkillSelect(skill)}\n @keydown=${(e) => this._handleSkillCardKeydown(e, skill)}\n >\n <span class=\"skill-card__name\">${skill.name}</span>\n ${skill.description ? html `\n <span class=\"skill-card__desc\">${skill.description}</span>\n ` : nothing}\n ${!global && skill.global ? html `\n <span class=\"skill-card__badge\">Global</span>\n ` : nothing}\n ${global ? html `\n <div class=\"skill-card__footer\">\n <span class=\"skill-card__price\">Free</span>\n <kr-button\n class=\"skill-card__install-btn\"\n size=\"small\"\n variant=${skill.enabled ? 'outline' : 'flat'}\n color=${skill.enabled ? 'secondary' : 'primary'}\n @click=${(e) => this._handleGlobalSkillEnable(skill, e)}\n >${skill.enabled ? 'Uninstall' : 'Install'}</kr-button>\n </div>\n ` : nothing}\n </div>\n `)}\n </div>\n `;\n }\n /**\n * Render a user message, highlighting a leading `/skill-code` token (like the\n * way Claude highlights slash commands). The composer only inserts valid skill\n * codes, so any leading slash token is treated as one.\n */\n _renderUserContent(content) {\n const match = content.match(/^\\/(\\S+)(\\s[\\s\\S]*)?$/);\n if (match) {\n return html `<span class=\"message-skill\">/${match[1]}</span>${match[2] || ''}`;\n }\n return content;\n }\n /** Compact integer formatting for the debug panel (e.g. 88928 → \"88,928\"). */\n _fmtTokens(n) {\n if (n == null || isNaN(n)) {\n return '—';\n }\n return n.toLocaleString('en-US');\n }\n /** Approximate USD formatting for the debug panel (e.g. 0.1434 → \"~$0.1434\"). */\n _fmtCost(n) {\n if (n == null || isNaN(n)) {\n return '—';\n }\n return '~$' + n.toFixed(4);\n }\n /**\n * INTERNAL-ONLY debug telemetry panel. Rendered only in the inline variant\n * (guarded by the caller) and only when the user has toggled it open. Shows\n * three scopes from the latest TOKEN_USAGE event — context gauge, this turn,\n * lifetime — plus a verbose per-iteration table. Never customer-facing.\n */\n _renderDebugPanel() {\n return html `\n <div\n class=${classMap({\n 'debug-drawer': true,\n 'debug-drawer--open': this._debugPanelOpen,\n 'debug-drawer--resizing': this._isDebugResizing,\n })}\n style=${styleMap({ width: `${this._debugDrawerWidth}px` })}\n >\n <div\n class=\"debug-drawer__resize\"\n @mousedown=${this._handleDebugResizeMouseDown}\n ></div>\n <div class=\"debug-drawer__header\">\n <span class=\"debug-drawer__title\">Debug</span>\n <button\n class=\"header-action\"\n @click=${this._handleToggleDebugPanel}\n title=\"Close debug panel\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"2\"\n stroke=\"currentColor\"\n class=\"header-action-icon\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M6 18 18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n <div class=\"debug-drawer__body\">\n ${this._telemetry ? html `\n <div class=\"debug-section\">\n <div class=\"debug-section__label\">Context</div>\n <div class=\"debug-gauge\">\n <div class=\"debug-gauge__bar\">\n <div\n class=\"debug-gauge__fill\"\n style=${styleMap({ width: `${Math.min(100, Math.max(0, this._telemetry.contextUsedPercent || 0))}%` })}\n ></div>\n </div>\n <span class=\"debug-gauge__text\">\n ${this._fmtTokens(this._telemetry.currentContextTokens)} / ${this._fmtTokens(this._telemetry.contextWindowTokens)}\n · ${this._telemetry.contextUsedPercent ?? 0}%\n </span>\n </div>\n </div>\n\n <div class=\"debug-section\">\n <div class=\"debug-section__label\">This turn</div>\n <div class=\"debug-metrics\">\n <span class=\"debug-metrics__key\">Input</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.turnInputTokens)}</span>\n <span class=\"debug-metrics__key\">Output</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.turnOutputTokens)}</span>\n <span class=\"debug-metrics__key\">Cache read</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.turnCacheReadTokens)}</span>\n <span class=\"debug-metrics__key\">Hit rate</span>\n <span class=\"debug-metrics__val\">${this._telemetry.turnHitRate ?? '—'}%</span>\n <span class=\"debug-metrics__key\">Cost</span>\n <span class=\"debug-metrics__val debug-cost\">${this._fmtCost(this._telemetry.turnCostUsd)}</span>\n </div>\n </div>\n\n <div class=\"debug-section\">\n <div class=\"debug-section__label\">Lifetime</div>\n <div class=\"debug-metrics\">\n <span class=\"debug-metrics__key\">Input</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.conversationInputTokens)}</span>\n <span class=\"debug-metrics__key\">Output</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.conversationOutputTokens)}</span>\n <span class=\"debug-metrics__key\">Cache read</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.conversationCacheReadTokens)}</span>\n <span class=\"debug-metrics__key\">Cache write</span>\n <span class=\"debug-metrics__val\">${this._fmtTokens(this._telemetry.conversationCacheWriteTokens)}</span>\n <span class=\"debug-metrics__key\">Cost so far</span>\n <span class=\"debug-metrics__val debug-cost\">${this._fmtCost(this._telemetry.conversationCostUsd)}</span>\n </div>\n </div>\n ` : html `\n <div class=\"debug-empty\">No telemetry yet — send a message to populate.</div>\n `}\n\n ${this._iterationLog.length ? html `\n <div class=\"debug-section\">\n <div class=\"debug-section__label\">Iterations (this turn)</div>\n <div class=\"debug-iterations-scroll\">\n <table class=\"debug-iterations\">\n <thead>\n <tr>\n <th>#</th>\n <th>In</th>\n <th>Out</th>\n <th>Cache R</th>\n <th>Cache W</th>\n <th>Hit</th>\n <th>Cost</th>\n <th>Ckpt</th>\n </tr>\n </thead>\n <tbody>\n ${this._iterationLog.map((it) => {\n const ckpt = this._cacheCheckpoints[it.iteration];\n return html `\n <tr>\n <td>${it.iteration}</td>\n <td>${this._fmtTokens(it.iterationInput)}</td>\n <td>${this._fmtTokens(it.iterationOutput)}</td>\n <td>${this._fmtTokens(it.iterationCacheRead)}</td>\n <td>${this._fmtTokens(it.iterationCacheWrite)}</td>\n <td>${it.iterationHitRate ?? '—'}%</td>\n <td class=\"debug-cost\">${this._fmtCost(it.iterationCostUsd)}</td>\n <td>${ckpt ? ckpt.mode : '—'}</td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n </div>\n </div>\n ` : nothing}\n </div>\n </div>\n `;\n }\n render() {\n // Debug affordances (drawer toggle, drawer, /test-* options) require the\n // inline variant AND the server-side debug flag from aiFrameworkConfig.\n const isDebugEnabled = this.variant === 'inline' && this._aiFrameworkConfig.debugTelemetryEnabled === true;\n return html `\n ${(this.hideToggle || this.variant === 'inline') ? nothing : html `\n <button\n class=${classMap({\n 'toggle': true,\n 'toggle--hidden': this.opened,\n })}\n @click=${this._handleToggle}\n title=\"Open chat\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n class=\"toggle-icon\"\n >\n <path d=\"M12 2C6.48 2 2 6.03 2 11c0 2.61 1.19 4.94 3.05 6.55L4 22l4.8-2.4C9.82 19.85 10.88 20 12 20c5.52 0 10-4.03 10-9S17.52 2 12 2z\"/>\n <path d=\"M8 11h.01M12 11h.01M16 11h.01\" stroke-width=\"2.5\"/>\n </svg>\n </button>\n `}\n\n <div\n class=${classMap({\n 'panel': true,\n 'panel--opened': this.opened,\n 'panel--resizing-debug': this._isDebugResizing,\n })}\n style=${styleMap(isDebugEnabled && this._debugPanelOpen ? { paddingRight: `${this._debugDrawerWidth}px` } : {})}\n @dragenter=${this._handleDragEnter}\n @dragover=${this._handleDragOver}\n @dragleave=${this._handleDragLeave}\n @drop=${this._handleDrop}\n >\n ${this._isDraggingFile ? html `\n <div class=\"drop-overlay\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5m-13.5-9L12 3m0 0 4.5 4.5M12 3v13.5\"\n />\n </svg>\n <span>Drop images to attach</span>\n </div>\n ` : nothing}\n ${this.variant === 'inline' ? nothing : html `\n <div\n class=\"resize resize--n\"\n data-dir=\"n\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--s\"\n data-dir=\"s\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--w\"\n data-dir=\"w\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--e\"\n data-dir=\"e\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--nw\"\n data-dir=\"nw\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--ne\"\n data-dir=\"ne\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--sw\"\n data-dir=\"sw\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n <div\n class=\"resize resize--se\"\n data-dir=\"se\"\n @mousedown=${this._handleResizeMouseDown}\n ></div>\n `}\n <div class=\"header\" @mousedown=${this._handleHeaderMouseDown}>\n <div class=\"header-left\">\n <div class=\"header-info\">\n <span class=\"header-title\">${this.label}</span>\n </div>\n </div>\n <div class=\"header-actions\">\n ${isDebugEnabled ? html `\n <button\n class=${classMap({\n 'header-action': true,\n 'header-action--active': this._debugPanelOpen,\n })}\n @click=${this._handleToggleDebugPanel}\n title=\"Debug telemetry\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"header-action-icon\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M3.75 3v11.25A2.25 2.25 0 0 0 6 16.5h2.25M3.75 3h-1.5m1.5 0h16.5m0 0h1.5m-1.5 0v11.25A2.25 2.25 0 0 1 18 16.5h-2.25m-7.5 0h7.5m-7.5 0-1 3m8.5-3 1 3m0 0 .5 1.5m-.5-1.5h-9.5m0 0-.5 1.5M9 11.25v1.5M12 9v3.75m3-6v6\"\n />\n </svg>\n </button>\n ` : nothing}\n ${this.variant === 'inline' ? nothing : html `\n <button\n class=\"header-action\"\n @click=${this._handleToggle}\n title=\"Close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"2\"\n stroke=\"currentColor\"\n class=\"header-action-icon\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M6 18 18 6M6 6l12 12\"\n />\n </svg>\n </button>\n `}\n </div>\n </div>\n\n <div class=\"messages\" @scroll=${this._handleMessagesScroll}>\n <div class=\"messages-inner\">\n ${this.messages.length === 0 ? html `\n <div class=\"empty\">\n <span class=\"empty-text\">What can I help you with?</span>\n </div>\n ` : nothing}\n ${this.messages.map((msg, index) => html `\n <div class=${classMap({\n 'message': true,\n 'message--user': msg.type === 'user',\n 'message--assistant': msg.type === 'assistant',\n })}>\n ${msg.reasoning ? html `\n <details class=\"reasoning\">\n <summary>Thinking</summary>\n <div class=\"reasoning-content\">${msg.reasoning}</div>\n </details>\n ` : nothing}\n ${msg.conversationFiles && msg.conversationFiles.length ? html `\n <div class=\"attachments\">\n ${msg.conversationFiles.map((file) => {\n const fileName = file.niceName || file.name || 'File';\n // A stored file is an image by its MIME when it has one, else\n // by its extension.\n let isImage = IMAGE_EXTENSIONS.includes(this._getFileExtension(fileName));\n if (file.mimeType) {\n isImage = file.mimeType.startsWith('image/');\n }\n // An image shows its thumbnail; everything else shows a\n // file-type tile. Both open the previewer on click — it renders\n // images, video, PDFs, and text inline, and shows a download\n // tile for the rest (Office formats), so a click always does\n // something useful.\n if (isImage) {\n return html `\n <button\n class=\"attachment\"\n type=\"button\"\n title=${file.niceName || 'View image'}\n @click=${() => this._handleFileOpen(file)}\n >\n <img\n src=${file.previewUrl || `${KRHttp.getBaseUrl()}/api/system/conversationFile/${file.conversationFileID}/view`}\n alt=${file.niceName || ''}\n />\n </button>\n `;\n }\n return html `\n <button\n class=\"attachment attachment--doc attachment--openable\"\n type=\"button\"\n title=${fileName}\n @click=${() => this._handleFileOpen(file)}\n >\n <span class=\"attachment__type\">${this._getFileExtension(fileName) || 'File'}</span>\n <span class=\"attachment__name\">${fileName}</span>\n </button>\n `;\n })}\n </div>\n ` : nothing}\n ${msg.content ? html `\n <div class=\"message-content\">\n ${msg.type === 'user'\n ? this._renderUserContent(msg.content)\n : unsafeHTML(marked.parse(msg.content, { breaks: true }))}\n </div>\n ` : nothing}\n ${msg.type === 'assistant' && this._isStreaming && msg === this.messages[this.messages.length - 1] ? html `\n <div class=\"typing\">\n <span></span>\n <span></span>\n <span></span>\n </div>\n ` : nothing}\n ${msg.content ? html `\n <button\n class=\"message-copy\"\n title=${this._copiedIndex === index ? 'Copied' : 'Copy'}\n @click=${() => this._handleCopyMessage(msg.content, index)}\n >\n ${this._copiedIndex === index ? html `\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n ` : html `\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect\n x=\"9\"\n y=\"9\"\n width=\"13\"\n height=\"13\"\n rx=\"2\"\n />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n `}\n </button>\n ` : nothing}\n </div>\n `)}\n </div>\n </div>\n\n ${this._error ? html `\n <div class=\"error\">\n <span>${this._error}</span>\n <button class=\"error-dismiss\" @click=${this._handleErrorDismiss}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"2\"\n stroke=\"currentColor\"\n class=\"error-dismiss-icon\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M6 18 18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n ` : this._contextLimitReached ? html `\n <div class=\"context-limit\" role=\"alert\">\n ${this._contextLimitMessage\n || 'This conversation has reached its limit. Please start a new one to continue.'}\n </div>\n ` : this._contextWarning ? html `\n <div class=\"context-warning\" role=\"status\">\n <span>${this._contextWarning}</span>\n <button\n class=\"context-warning-dismiss\"\n title=\"Dismiss\"\n @click=${this._handleContextWarningDismiss}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"2\"\n stroke=\"currentColor\"\n class=\"context-warning-dismiss-icon\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M6 18 18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n ` : nothing}\n\n <div class=\"footer\">\n ${this._pendingConversationFiles.length ? html `\n <div class=\"composer-attachments\">\n ${repeat(this._pendingConversationFiles, (p) => p.localId, (p) => html `\n <div\n class=${classMap({\n chip: true,\n 'chip--doc': !p.previewUrl,\n })}\n title=${p.name}\n >\n <div\n class=${classMap({\n 'chip-body': true,\n 'chip-body--image': Boolean(p.previewUrl),\n })}\n >\n ${p.previewUrl\n ? html `<img src=${p.previewUrl} alt=${p.name} />`\n : html `\n <span class=\"chip-type\">${this._getFileExtension(p.name) || 'File'}</span>\n <span class=\"chip-name\">${p.name}</span>\n `}\n </div>\n <button\n class=\"chip-remove\"\n title=\"Remove\"\n @click=${() => this._handlePendingRemove(p.localId)}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.75\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M6 18 18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n `)}\n </div>\n ` : nothing}\n <input\n class=\"file-input\"\n type=\"file\"\n accept=${ACCEPTED_FILE_EXTENSIONS.map((ext) => '.' + ext).join(',')}\n multiple\n hidden\n @change=${this._handleFileInputChange}\n />\n ${this._skillMenuOpened ? this._renderSkillMenu() : nothing}\n <div class=\"input-wrapper\">\n <button\n class=\"input-plus\"\n @click=${this._handlePlusClick}\n >+</button>\n <textarea\n class=\"input\"\n .value=${this._inputValue}\n placeholder=${this.placeholder}\n rows=\"1\"\n @input=${this._handleInputChange}\n @keydown=${this._handleKeyDown}\n @paste=${this._handlePaste}\n ></textarea>\n ${window.SpeechRecognition || window.webkitSpeechRecognition ? html `\n ${this._isDictating ? html `\n <button\n class=\"mic-stop\"\n title=\"Stop dictation\"\n aria-label=\"Stop dictation\"\n @click=${this._handleMicClick}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n class=\"mic-stop-icon\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"6\"\n y=\"6\"\n width=\"12\"\n height=\"12\"\n rx=\"2\"\n />\n </svg>\n </button>\n ` : html `\n <button\n class=\"mic\"\n title=\"Dictate a message\"\n aria-label=\"Dictate a message\"\n @click=${this._handleMicClick}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"mic-icon\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 15a3 3 0 0 0 3-3V6a3 3 0 0 0-6 0v6a3 3 0 0 0 3 3Z\"/>\n <path d=\"M19 11a7 7 0 0 1-14 0\"/>\n <path d=\"M12 18v3\"/>\n </svg>\n </button>\n `}\n ` : nothing}\n ${this._isStreaming ? html `\n <button\n class=\"stop\"\n @click=${this._handleStop}\n title=\"Stop generating\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n class=\"stop-icon\"\n >\n <rect\n x=\"6\"\n y=\"6\"\n width=\"12\"\n height=\"12\"\n rx=\"2\"\n />\n </svg>\n </button>\n ` : html `\n <button\n class=${classMap({\n 'send': true,\n 'send--disabled': !this._inputValue.trim() && !this._pendingConversationFiles.length,\n })}\n @click=${this._handleSubmit}\n title=\"Send message\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n class=\"send-icon\"\n >\n <path d=\"M12 19V5M5 12l7-7 7 7\"/>\n </svg>\n </button>\n `}\n </div>\n </div>\n ${this._skillBrowseOpened ? this._renderSkillBrowse() : nothing}\n ${isDebugEnabled ? this._renderDebugPanel() : nothing}\n </div>\n `;\n }\n};\nKRChatbot.styles = css `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host {\n display: block;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.6;\n\n --kr-chatbot-primary: #163052;\n --kr-chatbot-primary-hover: #1e4068;\n --kr-chatbot-bg: #ffffff;\n --kr-chatbot-border: #d9d9d9;\n --kr-chatbot-text: #1a1a2e;\n --kr-chatbot-text-secondary: #64668b;\n --kr-chatbot-user-bg: #e9e9e980;\n --kr-chatbot-error-bg: #fef2f2;\n --kr-chatbot-error-text: #dc2626;\n --kr-chatbot-success: #00b894;\n --kr-chatbot-toggle-size: 56px;\n --kr-chatbot-panel-width: 440px;\n --kr-chatbot-panel-height: 620px;\n }\n\n :host {\n position: fixed;\n bottom: 24px;\n right: 24px;\n z-index: 10000;\n }\n\n /* Toggle button */\n .toggle {\n width: var(--kr-chatbot-toggle-size);\n height: var(--kr-chatbot-toggle-size);\n border-radius: 18px;\n background: var(--kr-chatbot-primary);\n color: white;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 24px rgba(22, 48, 82, 0.4);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .toggle:hover {\n transform: scale(1.05);\n box-shadow: 0 6px 32px rgba(22, 48, 82, 0.5);\n }\n\n .toggle--hidden {\n transform: scale(0);\n opacity: 0;\n pointer-events: none;\n }\n\n .toggle-icon {\n width: 26px;\n height: 26px;\n }\n\n /* Panel */\n .panel {\n display: none;\n flex-direction: column;\n background: var(--kr-chatbot-bg);\n overflow: hidden;\n position: absolute;\n bottom: 0;\n right: 0;\n width: var(--kr-chatbot-panel-width);\n height: var(--kr-chatbot-panel-height);\n max-height: calc(100vh - 72px);\n border-radius: 16px;\n box-shadow: 0 8px 40px rgba(0, 0, 0, 0.08), 0 2px 12px rgba(0, 0, 0, 0.04);\n border: 1px solid rgba(0, 0, 0, 0.08);\n animation: chatbot-panel-in 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n transform-origin: bottom right;\n }\n\n .panel--opened {\n display: flex;\n }\n\n /* Inline mode: fill the parent container instead of floating bottom-right. */\n :host([variant='inline']) {\n position: static;\n bottom: auto;\n right: auto;\n z-index: auto;\n height: 100%;\n }\n\n :host([variant='inline']) .panel {\n position: relative;\n bottom: auto;\n right: auto;\n width: 100%;\n height: 100%;\n max-height: none;\n border-radius: 0;\n box-shadow: none;\n border: none;\n animation: none;\n }\n\n @keyframes chatbot-panel-in {\n from {\n opacity: 0;\n transform: scale(0.92) translateY(20px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n }\n\n /* Header */\n .header {\n padding: 0 16px 0 24px;\n height: 64px;\n background: #ffffff;\n color: #000000;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .header-info {\n display: flex;\n flex-direction: column;\n }\n\n .header-title {\n font-size: 16px;\n font-weight: 600;\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .header-action {\n width: 32px;\n height: 32px;\n background: transparent;\n border: none;\n color: rgb(0 0 0 / 70%);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s;\n }\n\n .header-action:hover {\n background: rgba(0, 0, 0, 0.05);\n color: #000000;\n }\n\n .header-action--active {\n background: rgba(0, 0, 0, 0.08);\n color: #000000;\n }\n\n .header-action-icon {\n width: 20px;\n height: 20px;\n }\n\n /* Messages */\n /* Full-width scroll container — keeps the scrollbar at the panel edge. */\n .messages {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n scroll-behavior: smooth;\n background: white;\n }\n\n /* Centered, width-capped column that actually holds the messages. */\n .messages-inner {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 36px;\n padding: 32px;\n width: 100%;\n max-width: 768px;\n margin-left: auto;\n margin-right: auto;\n }\n\n .empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--kr-chatbot-text-secondary);\n gap: 8px;\n }\n\n .empty-text {\n font-size: 14px;\n color: rgb(0 0 0 / 80%);\n }\n\n .message {\n position: relative;\n display: flex;\n flex-direction: column;\n max-width: 100%;\n animation: chatbot-msg-in 0.3s ease-out;\n /* Reserve room for the copy button INSIDE the message box (so the button is\n part of the message's hover region — no dead zone to cross), then cancel\n that space for layout so message spacing is unchanged. */\n padding-bottom: 30px;\n margin-bottom: -30px;\n }\n\n /* The reserved padding overhangs into the next message; lift the hovered one\n so its copy button isn't covered by (or stealing hover from) the sibling. */\n .message:hover {\n z-index: 1;\n }\n\n @keyframes chatbot-msg-in {\n from {\n opacity: 0;\n transform: translateY(6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .message--user {\n align-self: flex-end;\n align-items: flex-end;\n max-width: 85%;\n }\n\n .message--assistant {\n align-self: flex-start;\n gap: 24px;\n }\n\n /* anywhere, NOT break-word: both break a long unbreakable run (a pasted URL) for\n layout, but only anywhere also shrinks the element's intrinsic min-content width.\n With break-word the URL still reports its full unbroken width as the minimum,\n which sizes this shrink-to-fit bubble past .messages-inner's 768px cap and\n overflows the page horizontally. */\n .message-content {\n line-height: 1.7;\n overflow-wrap: anywhere;\n }\n\n .message--user .message-content {\n display: inline-block;\n background: var(--kr-chatbot-user-bg);\n color: #000000;\n padding: 10px 16px;\n border-radius: 20px;\n border-bottom-right-radius: 6px;\n font-size: 14px;\n }\n\n /* Highlighted leading /skill token in a sent user message. Monospace + a\n stronger color makes it read as a distinct command without a pill. */\n .message-skill {\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, Menlo, Consolas, monospace;\n font-weight: 600;\n color: #b45309;\n }\n\n /* Per-message copy button. Sits in the message's reserved bottom padding —\n inside the hover box, so moving the cursor down onto it never leaves the\n message. Height is reserved (via the message padding) so spacing doesn't\n jump; only opacity toggles on hover. */\n .message-copy {\n position: absolute;\n bottom: 0;\n left: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n padding: 0;\n background: none;\n border: none;\n border-radius: 6px;\n color: #000000;\n cursor: pointer;\n opacity: 0;\n transition: opacity 0.15s, background-color 0.15s, color 0.15s;\n }\n\n .message--user .message-copy {\n left: auto;\n right: 0;\n }\n\n .message:hover .message-copy,\n .message-copy:focus-visible {\n opacity: 1;\n }\n\n .message-copy:hover {\n background: rgba(0, 0, 0, 0.06);\n }\n\n .message-copy svg {\n width: 14px;\n height: 14px;\n }\n\n .message--assistant .message-content {\n background: transparent;\n color: #000000;\n padding: 0;\n font-size: 14px;\n }\n\n .message--assistant .message-content pre {\n background: #1e1e1e;\n color: #d4d4d4;\n padding: 12px;\n border-radius: 6px;\n overflow-x: auto;\n margin: 8px 0;\n font-size: 13px;\n line-height: 1.4;\n }\n\n .message--assistant .message-content code {\n font-family: 'SF Mono', 'Fira Code', Monaco, monospace;\n font-size: 13px;\n }\n\n .message--assistant .message-content :not(pre) > code {\n background: rgba(0, 0, 0, 0.06);\n padding: 2px 5px;\n border-radius: 3px;\n }\n\n .message--assistant .message-content strong {\n font-weight: 600;\n }\n\n .message--assistant .message-content p {\n margin: 0 0 8px 0;\n }\n\n .message--assistant .message-content p:last-child {\n margin-bottom: 0;\n }\n\n /* Reasoning */\n .reasoning {\n border-radius: 6px;\n background: rgb(244 244 244 / 80%);\n font-size: 12px;\n }\n\n .reasoning summary {\n cursor: pointer;\n padding: 6px 10px 6px 10px;\n color: black;\n user-select: none;\n }\n\n .reasoning-content {\n padding: 6px 10px 10px;\n color: black;\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n\n .typing {\n display: flex;\n gap: 4px;\n padding: 4px 0;\n }\n\n .typing span {\n width: 6px;\n height: 6px;\n background: var(--kr-chatbot-text-secondary);\n border-radius: 50%;\n animation: chatbot-typing 1.4s infinite;\n opacity: 0.4;\n }\n\n .typing span:nth-child(2) {\n animation-delay: 0.2s;\n }\n\n .typing span:nth-child(3) {\n animation-delay: 0.4s;\n }\n\n @keyframes chatbot-typing {\n 0%, 60%, 100% {\n opacity: 0.4;\n transform: translateY(0);\n }\n 30% {\n opacity: 1;\n transform: translateY(-4px);\n }\n }\n\n /* Error */\n .error {\n padding: 8px 16px;\n background: var(--kr-chatbot-error-bg);\n color: var(--kr-chatbot-error-text);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .error-dismiss {\n background: none;\n border: none;\n color: var(--kr-chatbot-error-text);\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .error-dismiss-icon {\n width: 14px;\n height: 14px;\n }\n\n /* Context warning banner (user-facing, dismissible, non-blocking) */\n .context-warning {\n /* Match the message text column: 768px cap minus its 32px side padding\n (704px), and viewport minus that padding on narrower screens. */\n width: 100%;\n max-width: 735px;\n margin: 8px auto 0;\n padding: 10px 14px;\n border: 1px solid #fde68a;\n border-radius: 8px;\n background: #fffbeb;\n color: #92400e;\n font-size: 13px;\n line-height: 1.4;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n flex-shrink: 0;\n }\n\n .context-warning-dismiss {\n background: none;\n border: none;\n color: #92400e;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n opacity: 0.7;\n }\n\n .context-warning-dismiss:hover {\n opacity: 1;\n }\n\n .context-warning-dismiss-icon {\n width: 14px;\n height: 14px;\n }\n\n /* Context-limit notice (user-facing, blocking — steers to a new conversation) */\n .context-limit {\n /* Match the message text column: 768px cap minus its 32px side padding\n (704px), and viewport minus that padding on narrower screens. */\n width: 100%;\n max-width: 735px;\n margin: 8px auto 0;\n padding: 10px 14px;\n border: 1px solid #fecaca;\n border-radius: 8px;\n background: var(--kr-chatbot-error-bg);\n color: var(--kr-chatbot-error-text);\n font-size: 13px;\n line-height: 1.4;\n flex-shrink: 0;\n }\n\n /*\n * INTERNAL-ONLY debug telemetry drawer. A layout drawer docked to the right\n * of the inline chat — the chat column shrinks to make room; it does not\n * overlay. Closed by default (width 0), animates open. Not customer-facing —\n * token counts, cache internals, and approximate cost estimates for internal\n * debugging. Styled to match the chatbot's light theme (Inter, design tokens).\n */\n /*\n * The chat column reserves space for the drawer by animating padding-right,\n * so opening the drawer shrinks the chat (header/messages/composer) rather\n * than overlaying it. Only applies in inline mode.\n */\n :host([variant='inline']) .panel {\n transition: padding-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n /* Track the cursor 1:1 while dragging the drawer's resize handle. */\n :host([variant='inline']) .panel--resizing-debug {\n transition: none;\n }\n\n .debug-drawer {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n background: var(--kr-chatbot-bg);\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n color: #000000;\n z-index: 5;\n }\n\n /* While dragging the resize handle, suppress the slide transition so the\n drawer tracks the cursor 1:1. */\n .debug-drawer--resizing {\n transition: none;\n }\n\n .debug-drawer--open {\n transform: translateX(0);\n box-shadow: -4px 0 20px rgba(10, 26, 46, 0.07);\n }\n\n /* Left-edge grab handle for resizing the drawer. */\n .debug-drawer__resize {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 10px;\n cursor: ew-resize;\n z-index: 10;\n }\n\n .debug-drawer__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 12px 0 20px;\n height: 64px;\n flex-shrink: 0;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n }\n\n .debug-drawer__title {\n font-size: 14px;\n font-weight: 600;\n color: #000000;\n }\n\n .debug-drawer__body {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 4px 0;\n }\n\n .debug-section {\n padding: 14px 20px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.06);\n }\n\n .debug-section:last-child {\n border-bottom: none;\n }\n\n .debug-section__label {\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: #000000;\n font-size: 11px;\n font-weight: 600;\n margin-bottom: 10px;\n }\n\n /* Context-fullness gauge */\n .debug-gauge {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .debug-gauge__bar {\n flex: 1;\n height: 8px;\n border-radius: 4px;\n background: rgb(244 244 244 / 100%);\n overflow: hidden;\n }\n\n .debug-gauge__fill {\n height: 100%;\n border-radius: 4px;\n background: var(--kr-chatbot-primary);\n transition: width 0.3s ease;\n }\n\n .debug-gauge__text {\n color: #000000;\n font-size: 12px;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n }\n\n /* Metric rows */\n .debug-metrics {\n display: grid;\n grid-template-columns: auto 1fr;\n column-gap: 12px;\n row-gap: 7px;\n font-size: 13px;\n }\n\n .debug-metrics__key {\n color: #000000;\n }\n\n .debug-metrics__val {\n color: #000000;\n text-align: right;\n font-variant-numeric: tabular-nums;\n }\n\n .debug-cost {\n font-weight: 600;\n }\n\n /* Per-iteration table (verbose). The wrapper scrolls horizontally on its own\n so a wide table never forces the whole drawer to scroll sideways. */\n .debug-iterations-scroll {\n overflow-x: auto;\n max-width: 100%;\n }\n\n .debug-iterations {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n }\n\n .debug-iterations th,\n .debug-iterations td {\n padding: 5px 6px;\n text-align: right;\n white-space: nowrap;\n }\n\n .debug-iterations th {\n color: #000000;\n font-weight: 600;\n border-bottom: 1px solid rgba(0, 0, 0, 0.10);\n }\n\n .debug-iterations tbody tr:not(:last-child) td {\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n }\n\n .debug-iterations td:first-child,\n .debug-iterations th:first-child {\n text-align: left;\n }\n\n .debug-empty {\n color: #000000;\n padding: 20px;\n font-size: 13px;\n text-align: center;\n }\n\n /* Footer / Input */\n .footer {\n padding: 16px 16px 16px;\n flex-shrink: 0;\n background: white;\n width: 100%;\n max-width: 768px;\n margin-left: auto;\n margin-right: auto;\n }\n\n /* Inline mode: keep the composer clear of the bottom edge. */\n :host([variant='inline']) .footer {\n padding-bottom: 40px;\n }\n\n .input-wrapper {\n display: flex;\n align-items: center;\n gap: 4px;\n background: white;\n border: 1px solid var(--kr-chatbot-border);\n border-radius: 26px;\n padding: 6px;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .input-wrapper:focus-within {\n border-color: #b0b0b0;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.04);\n }\n\n /* Inline mode: keep the border and add a soft floating shadow (ChatGPT/Gemini style). */\n :host([variant='inline']) .input-wrapper {\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06), 0 8px 24px rgba(0, 0, 0, 0.1);\n }\n\n :host([variant='inline']) .input-wrapper:focus-within {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 12px 32px rgba(0, 0, 0, 0.14);\n }\n\n .input-plus {\n width: 34px;\n height: 34px;\n border: none;\n background: transparent;\n color: var(--kr-chatbot-text);\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n font-size: 20px;\n font-weight: 300;\n transition: background 0.15s;\n }\n\n .input-plus:hover {\n background: #f8f9fc;\n }\n\n .input {\n flex: 1;\n border: none;\n outline: none;\n resize: none;\n font-family: inherit;\n font-size: 15px;\n line-height: 1.5;\n padding: 4px 0;\n min-height: 26px;\n max-height: 120px;\n background: transparent;\n color: black;\n }\n\n .input::placeholder {\n color: #b0b0b0;\n }\n\n /* margin-right rather than a wider .input-wrapper gap, which would also push\n the plus button and textarea apart. Applied to both mic states so the\n spacing doesn't shift when dictation swaps one for the other. */\n .mic,\n .mic-stop {\n margin-right: 4px;\n }\n\n .mic {\n width: 34px;\n height: 34px;\n border: none;\n background: transparent;\n color: var(--kr-chatbot-text);\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: background 0.15s, color 0.15s;\n }\n\n .mic:hover {\n background: #f8f9fc;\n }\n\n .mic-icon {\n width: 21px;\n height: 21px;\n }\n\n /* Dictation swaps the mic for this stop button, sitting in the mic's slot so\n the composer's layout is unchanged and the textarea stays visible with the\n transcript streaming into it. Structurally identical to .stop; only the\n colors differ — dictation isn't an error state, so it takes a neutral grey\n instead of the error red, and that also keeps it distinct from the solid\n send button sitting right beside it. The icon is dark rather than white\n because white on this grey wouldn't meet contrast. */\n .mic-stop {\n width: 34px;\n height: 34px;\n border-radius: 50%;\n background: #eae7e7;\n color: #1f1f1f;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.15s;\n }\n\n .mic-stop:hover {\n background: #ded9d9;\n }\n\n /* Larger than .stop-icon's 14px: the rect fills only half its 24-unit\n viewBox, so the drawn square is half this value. */\n .mic-stop-icon {\n width: 20px;\n height: 20px;\n }\n\n .send {\n width: 34px;\n height: 34px;\n border-radius: 50%;\n background: var(--kr-chatbot-primary);\n color: white;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.15s;\n }\n\n .send:hover {\n background: var(--kr-chatbot-primary-hover);\n }\n\n .send--disabled {\n opacity: 0.4;\n cursor: default;\n }\n\n .send--disabled:hover {\n background: var(--kr-chatbot-primary);\n }\n\n .send-icon {\n width: 16px;\n height: 16px;\n }\n\n .stop {\n width: 34px;\n height: 34px;\n border-radius: 50%;\n background: var(--kr-chatbot-error-text);\n color: white;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.15s;\n }\n\n .stop:hover {\n background: #b91c1c;\n }\n\n .stop-icon {\n width: 14px;\n height: 14px;\n }\n\n /* Header drag cursor */\n .header {\n cursor: grab;\n user-select: none;\n }\n\n .header:active {\n cursor: grabbing;\n }\n\n /* Inline mode isn't draggable — don't show the grab/hand cursor. */\n :host([variant='inline']) .header,\n :host([variant='inline']) .header:active {\n cursor: default;\n }\n\n /* Drag / Resize states */\n .panel--dragging,\n .panel--resizing {\n transition: none;\n user-select: none;\n }\n\n .panel--dragging {\n box-shadow: 0 32px 96px rgba(0, 0, 0, 0.18), 0 12px 40px rgba(0, 0, 0, 0.1);\n }\n\n /* Resize handles */\n .resize {\n position: absolute;\n z-index: 10;\n }\n\n .resize--n { top: -4px; left: 12px; right: 12px; height: 8px; cursor: n-resize; }\n .resize--s { bottom: -4px; left: 12px; right: 12px; height: 8px; cursor: s-resize; }\n .resize--w { left: -4px; top: 12px; bottom: 12px; width: 8px; cursor: w-resize; }\n .resize--e { right: -4px; top: 12px; bottom: 12px; width: 8px; cursor: e-resize; }\n .resize--nw { top: -4px; left: -4px; width: 16px; height: 16px; cursor: nw-resize; }\n .resize--ne { top: -4px; right: -4px; width: 16px; height: 16px; cursor: ne-resize; }\n .resize--sw { bottom: -4px; left: -4px; width: 16px; height: 16px; cursor: sw-resize; }\n .resize--se { bottom: -4px; right: -4px; width: 16px; height: 16px; cursor: se-resize; }\n\n /* Attachment thumbnails inside a sent message bubble */\n .attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .message--user .attachments {\n justify-content: flex-end;\n margin-bottom: 24px;\n }\n\n /* A sent attachment is the same tile as the composer chip, so a file looks\n identical before and after sending. */\n .attachment {\n width: 112px;\n height: 112px;\n border-radius: 20px;\n overflow: hidden;\n background: #f2f0f0;\n border: none;\n cursor: zoom-in;\n flex-shrink: 0;\n padding: 0;\n }\n\n .attachment img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n /* Non-image attachment in a sent message — file-type label above the filename. */\n .attachment--doc {\n display: flex;\n flex-direction: column;\n padding: 16px 14px;\n box-sizing: border-box;\n text-align: left;\n }\n\n /* Opens the previewer on click — same affordance as the composer's doc chip. */\n .attachment--openable {\n cursor: pointer;\n }\n\n .attachment--openable:hover {\n background: #dfdddd;\n }\n\n .attachment__type {\n font-size: 13px;\n line-height: 1.2;\n color: #444746;\n text-transform: uppercase;\n flex-shrink: 0;\n }\n\n .attachment__name {\n margin-top: auto;\n font-size: 13px;\n line-height: 1.25;\n color: #000;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow-wrap: anywhere;\n }\n\n /* Skill menu (opened by typing '/'). Fixed + JS-positioned above the\n composer, following the krubble select-field dropdown pattern. */\n .skill-menu {\n position: fixed;\n z-index: 10000;\n background: white;\n border: 1px solid #9ba7b6;\n border-radius: 8px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n /* max-height is set dynamically to the space above the composer. */\n }\n\n /* Floating mode is a compact card — use a lighter shadow and softer border. */\n :host(:not([variant='inline'])) .skill-menu {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n border-color: #b0b0b0;\n }\n\n .skill-menu__list {\n list-style: none;\n margin: 0;\n padding: 8px 0;\n overflow-y: auto;\n }\n\n .skill-menu__item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n width: 100%;\n padding: 8px 16px;\n background: none;\n border: none;\n text-align: left;\n cursor: pointer;\n font: inherit;\n color: #000000;\n }\n\n\n /* Floating mode is a compact card — tighten name/description spacing. */\n :host(:not([variant='inline'])) .skill-menu__item {\n gap: 1px;\n }\n\n .skill-menu__name {\n font-weight: 500;\n }\n\n /* Floating mode is a compact card — shrink the skill name a touch. */\n :host(:not([variant='inline'])) .skill-menu__name {\n font-size: 13px;\n }\n\n .skill-menu__desc {\n font-size: 12px;\n color: #000000;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .skill-menu__actions {\n display: flex;\n flex-direction: column;\n padding: 8px 0;\n border-bottom: 1px solid #eee;\n flex-shrink: 0;\n }\n\n .skill-menu__action {\n display: flex;\n flex-direction: column;\n gap: 2px;\n width: 100%;\n padding: 6px 16px;\n background: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n color: var(--kr-chatbot-primary);\n font-weight: 500;\n }\n\n /* Secondary line on an attach action (e.g. \"reads these files\") — muted,\n not the primary accent, so it reads as a hint under the action label. */\n .skill-menu__action .skill-menu__desc {\n font-weight: 400;\n color: #6b7280;\n }\n\n /* Highlight (keyboard) and hover (mouse) are independent — either shades the\n row. Declared after the base rules so it wins the cascade for both the\n action buttons and the skill items. */\n .skill-menu__action.skill-menu__item--highlighted,\n .skill-menu__item.skill-menu__item--highlighted,\n .skill-menu__action:hover,\n .skill-menu__item:hover {\n background: #f3f4f6;\n }\n\n /* Browse-all dialog body. Owns the height so the dialog is the same size on\n every tab; the search is fixed and the card grid flexes/scrolls to fill. */\n .skill-browse {\n display: flex;\n flex-direction: column;\n height: 70vh;\n }\n\n .skill-browse kr-text-field {\n display: block;\n margin: 20px 20px 16px;\n flex-shrink: 0;\n }\n\n .skill-browse kr-tab-group {\n flex: 1;\n min-height: 0;\n }\n\n /* The grid is the scroller and spans the full width, so its scrollbar sits\n flush against the dialog edge; padding-right insets the cards from it. */\n .skill-browse__grid {\n height: 100%;\n overflow-y: auto;\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n grid-auto-rows: min-content;\n align-content: start;\n gap: 12px;\n padding: 16px 20px 20px;\n }\n\n .skill-card {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 14px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n text-align: left;\n cursor: pointer;\n font: inherit;\n color: #000000;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n }\n\n .skill-card:hover {\n border-color: var(--kr-chatbot-primary);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n\n /* A Kodaris-tab card the user can't invoke — not in their roles, or not installed\n here yet. Clicking it does nothing, so it drops the pointer cursor and the hover\n highlight. The Install button inside keeps its own pointer cursor. */\n .skill-card--unavailable {\n cursor: default;\n }\n\n .skill-card--unavailable:hover {\n border-color: #e5e7eb;\n box-shadow: none;\n }\n\n /* Marks a globally-published skill listed on the Your Org tab — only happens on\n kodaris.com, which has no Kodaris tab for its own published skills. */\n .skill-card__badge {\n align-self: flex-start;\n padding: 2px 8px;\n border-radius: 10px;\n background: #f3f4f6;\n font-size: 11px;\n font-weight: 600;\n color: #000000;\n }\n\n /* Footer row on global skill cards: install button on the left, price on the\n right. margin-top:auto pins it to the bottom so cards in a row align their\n footers regardless of description length. Negative horizontal margins\n (matching the card's 14px padding) pull the top border out to the full\n card width; the content is re-padded horizontally to stay inset. */\n .skill-card__footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-top: 8px;\n margin-left: -14px;\n margin-right: -14px;\n padding: 14px 14px 0;\n border-top: 1px solid #e5e7eb;\n }\n\n .skill-card__price {\n font-size: 13px;\n font-weight: 600;\n color: #000000;\n }\n\n .skill-card__name {\n font-weight: 600;\n }\n\n .skill-card__desc {\n font-size: 12px;\n color: #000000;\n /* Clamp to 3 lines so a long description doesn't make one card tower over\n its row-mates in the grid. */\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .skill-browse__empty {\n height: 100%;\n padding: 32px;\n text-align: center;\n color: #000000;\n }\n\n /* Composer attachment chips (pre-send) */\n .composer-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 0 6px 10px;\n }\n\n /* Every attachment — image or document — is the same square tile, so a mixed\n row reads as one uniform set. */\n .chip {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 112px;\n height: 112px;\n border-radius: 20px;\n overflow: hidden;\n background: #f2f0f0;\n flex-shrink: 0;\n transition: background 0.28s ease;\n }\n\n .chip--doc {\n cursor: pointer;\n }\n\n .chip--doc:hover {\n background: #dfdddd;\n }\n\n /* The preview body — an image fills the tile; a document shows its file-type\n label above the filename, both left-aligned. */\n .chip-body {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n padding: 16px 14px;\n box-sizing: border-box;\n overflow: hidden;\n }\n\n /* An image fills the whole tile, so it needs no padding around it. */\n .chip-body--image {\n padding: 0;\n }\n\n .chip img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n /* File-type label (PDF, XLSX, …) — sits at the top of the tile. */\n .chip-type {\n font-size: 13px;\n line-height: 1.2;\n color: #444746;\n text-transform: uppercase;\n flex-shrink: 0;\n }\n\n /* Filename — pinned to the bottom of the tile, wrapping to at most three\n lines before it ellipsizes. */\n .chip-name {\n margin-top: auto;\n font-size: 13px;\n line-height: 1.25;\n color: #000;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow-wrap: anywhere;\n }\n\n /* Remove button — a bare X in the tile's top-right corner, revealed only when\n the tile (or the button itself) is hovered or keyboard-focused. */\n .chip-remove {\n position: absolute;\n /* Inset matches .chip-body's padding so the X sits the same distance from\n the right edge as the file-type label does from the left. */\n top: 14px;\n right: 14px;\n width: 15px;\n height: 15px;\n border: none;\n background: none;\n color: #444746;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n line-height: 1;\n flex-shrink: 0;\n opacity: 0;\n transition: opacity 0.28s ease;\n }\n\n .chip:hover .chip-remove,\n .chip-remove:focus-visible {\n opacity: 1;\n }\n\n .chip-remove:hover {\n color: #000;\n }\n\n .chip-remove svg {\n width: 15px;\n height: 15px;\n }\n\n /* Drag-and-drop overlay */\n .drop-overlay {\n position: absolute;\n inset: 0;\n z-index: 20;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n gap: 10px;\n /* Frosted, mostly-opaque surface so the chat content behind is masked\n and doesn't clash with the overlay label. */\n background: rgba(255, 255, 255, 0.92);\n backdrop-filter: blur(3px);\n border: 2px dashed var(--kr-chatbot-primary);\n border-radius: 16px;\n color: var(--kr-chatbot-primary);\n font-weight: 600;\n font-size: 15px;\n pointer-events: none;\n }\n\n .drop-overlay svg {\n width: 32px;\n height: 32px;\n }\n\n `;\n__decorate([\n property({ attribute: false })\n], KRChatbot.prototype, \"send\", void 0);\n__decorate([\n property({ attribute: false })\n], KRChatbot.prototype, \"load\", void 0);\n__decorate([\n property({ attribute: false })\n], KRChatbot.prototype, \"messages\", void 0);\n__decorate([\n property({ type: String })\n], KRChatbot.prototype, \"label\", void 0);\n__decorate([\n property({ type: String })\n], KRChatbot.prototype, \"placeholder\", void 0);\n__decorate([\n property({\n type: Boolean,\n reflect: true\n })\n], KRChatbot.prototype, \"opened\", void 0);\n__decorate([\n property({\n type: Boolean,\n attribute: 'hide-toggle',\n reflect: true\n })\n], KRChatbot.prototype, \"hideToggle\", void 0);\n__decorate([\n property({\n type: String,\n reflect: true\n })\n], KRChatbot.prototype, \"variant\", void 0);\n__decorate([\n property({\n type: Number,\n attribute: 'conversation-id',\n reflect: true\n })\n], KRChatbot.prototype, \"conversationId\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_inputValue\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_isStreaming\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_error\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_contextWarning\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_contextLimitReached\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_contextLimitMessage\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_telemetry\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_iterationLog\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_cacheCheckpoints\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_debugPanelOpen\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_debugDrawerWidth\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_isDebugResizing\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_pendingConversationFiles\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_isDraggingFile\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_skillMenuOpened\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_skillQuery\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_orgSkills\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_globalSkills\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_invocableSkills\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_aiFrameworkConfig\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_skillHighlighted\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_copiedIndex\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_skillBrowseOpened\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_skillBrowseSource\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_skillBrowseQuery\", void 0);\n__decorate([\n state()\n], KRChatbot.prototype, \"_isDictating\", void 0);\n__decorate([\n query('.panel')\n], KRChatbot.prototype, \"_panelEl\", void 0);\n__decorate([\n query('.messages')\n], KRChatbot.prototype, \"_messagesEl\", void 0);\n__decorate([\n query('.input')\n], KRChatbot.prototype, \"_inputEl\", void 0);\n__decorate([\n query('.file-input')\n], KRChatbot.prototype, \"_fileInputEl\", void 0);\n__decorate([\n query('.input-wrapper')\n], KRChatbot.prototype, \"_inputWrapperEl\", void 0);\n__decorate([\n query('.skill-menu')\n], KRChatbot.prototype, \"_skillMenuEl\", void 0);\nKRChatbot = __decorate([\n customElement('kr-chatbot')\n], KRChatbot);\nexport { KRChatbot };\n//# sourceMappingURL=chatbot.js.map"],"names":["t","globalThis","e","ShadowRoot","ShadyCSS","nativeShadow","Document","prototype","CSSStyleSheet","s","Symbol","o","WeakMap","n$4","constructor","this","_$cssResult$","Error","cssText","styleSheet","length","get","replaceSync","set","toString","i","reduce","n","c","cssRules","r","is","defineProperty","getOwnPropertyDescriptor","h","getOwnPropertyNames","getOwnPropertySymbols","getPrototypeOf","Object","a","trustedTypes","l","emptyScript","p","reactiveElementPolyfillSupport","d","u","toAttribute","Boolean","Array","JSON","stringify","fromAttribute","Number","parse","f","b","attribute","type","String","converter","reflect","useDefault","hasChanged","metadata","litPropertyMetadata","y$1","HTMLElement","addInitializer","_$Ei","push","observedAttributes","finalize","_$Eh","keys","createProperty","state","hasOwnProperty","create","wrapped","elementProperties","noAccessor","getPropertyDescriptor","call","requestUpdate","configurable","enumerable","getPropertyOptions","Map","finalized","properties","_$Eu","elementStyles","finalizeStyles","styles","isArray","Set","flat","reverse","unshift","toLowerCase","super","_$Ep","isUpdatePending","hasUpdated","_$Em","_$Ev","_$ES","Promise","enableUpdating","_$AL","_$E_","forEach","addController","_$EO","add","renderRoot","isConnected","hostConnected","removeController","delete","size","createRenderRoot","shadowRoot","attachShadow","shadowRootOptions","adoptedStyleSheets","map","document","createElement","litNonce","setAttribute","textContent","appendChild","connectedCallback","disconnectedCallback","hostDisconnected","attributeChangedCallback","_$AK","_$ET","removeAttribute","_$Ej","hasAttribute","C","_$EP","has","_$Eq","reject","scheduleUpdate","performUpdate","shouldUpdate","willUpdate","hostUpdate","update","_$EM","_$AE","hostUpdated","firstUpdated","updated","updateComplete","getUpdateComplete","y","mode","ReactiveElement","reactiveElementVersions","createPolicy","createHTML","Math","random","toFixed","slice","createComment","v","_","m","RegExp","g","$","_$litType$","strings","values","x","E","for","A","P","createTreeWalker","V","S","parts","lastIndex","exec","test","startsWith","N","el","currentNode","content","firstChild","replaceWith","childNodes","nextNode","nodeType","hasAttributes","getAttributeNames","endsWith","getAttribute","split","index","name","ctor","I","L","z","H","tagName","append","data","indexOf","innerHTML","M","_$Co","_$Cl","_$litDirective$","_$AO","_$AT","_$AS","R","_$AV","_$AN","_$AD","_$AM","parentNode","_$AU","creationScope","importNode","k","nextSibling","Z","_$AI","_$Cv","_$AH","_$AA","_$AB","options","startNode","endNode","_$AR","T","iterator","O","insertBefore","createTextNode","_$AC","_$AP","remove","setConnected","element","fill","j","arguments","toggleAttribute","capture","once","passive","removeEventListener","addEventListener","handleEvent","host","B","litHtmlPolyfillSupport","litHtmlVersions","renderOptions","_$Do","renderBefore","render","_$litPart$","_$litElement$","litElementHydrateSupport","LitElement","litElementPolyfillSupport","litElementVersions","customElements","define","kind","init","Reflect","decorate","querySelector","i$2","_$Ct","_$Ci","e$1","it","directiveName","_t","raw","resultType","filter","join","st","nt","classList","__decorate","decorators","target","key","desc","KRNavItemEdit","label","icon","url","active","handleLabelInput","textField","value","handleIconInput","handleUrlInput","handleActiveChange","checked","handleCancel","dialogRef","close","undefined","handleSave","handleKeyDown","html","css","customElement","KRScaffold","i$3","defaultNavItemIcon","originalFetch","originalXhrOpen","navItemDragPreview","navItemDragStartY","isNavItemDragging","navItemDragExpandTimeout","navInitialized","logo","homeUrl","scheme","nav","navIconsDisplayed","navExpanded","user","subbar","navEnabled","userType","breadcrumbs","navItemsExpanded","navQuery","activeNavItemId","isNavScrolled","isNavOpened","localStorage","getItem","isEditing","isUserMenuOpen","pref","draggedNavItemId","navItemDropTargetId","navItemDropPosition","pendingRequests","boundHandleMouseMove","handleMouseMove","bind","boundHandleMouseUp","handleMouseUp","installFetchInterceptor","loadPref","changedProperties","updateActiveNavItem","getComputedNav","item","group","id","uninstallFetchInterceptor","scaffold","window","fetch","args","finally","XMLHttpRequest","open","method","async","username","password","resolveUrl","external","path","baseHref","result","override","order","parentId","children","child","childIndex","childOverride","entries","getNavItemChildren","items","sort","query","allItems","parentGroup","find","includes","some","handleNavQueryChange","clear","handleNavQueryClear","handleMenuClick","setItem","handleNavHeaderClick","navEvent","CustomEvent","detail","bubbles","composed","cancelable","dispatchEvent","defaultPrevented","location","href","handleNavScroll","scrollTop","expandNavGroup","groupId","handleNavItemClick","navItem","groupEl","nextElementSibling","animate","height","scrollHeight","duration","easing","onfinish","ctrlKey","metaKey","button","preventDefault","currentPath","pathname","activeItem","longestMatch","handleEditCancel","handlePrefReset","handlePrefSave","uuid","KRHttp","body","then","response","json","catch","error","console","handleNavItemContextMenu","KRContextMenu","clientX","clientY","divider","openNavItemEdit","addNavItem","KRDialog","afterClosed","res","targetItem","position","customId","Date","now","siblings","targetIndex","findIndex","newOrder","sibling","newItem","handleNavItemMouseDown","abs","draggedItem","className","style","left","top","updateNavItemDropTarget","executeNavItemDrop","clearNavItemDragExpandTimeout","navItems","querySelectorAll","foundTarget","rect","getBoundingClientRect","itemId","right","bottom","newParentId","setTimeout","clearTimeout","navDelta","max","handleUserMenuToggle","handleCustomize","renderNormalFooter","nothing","initials","part","toUpperCase","avatar","email","renderEditFooter","renderNavItem","isChild","classMap","unsafeHTML","topLevelItems","totalTopLevelItems","progress","i$6","property","__decorate$5","KRScreenNav","subLabel","activeId","handlePopstate","syncActiveFromUrl","requestAnimationFrame","match","__decorate$4","KRScreenDetail","title","__decorate$3","KRSubbar","menu","_handleMenuClick","_handleBreadcrumbClick","crumb","isCurrent","breadcrumbEvent","breadcrumb","__decorate$2","KRRouter","configure","config","base","routes","anchor","composedPath","HTMLAnchorElement","origin","navigate","fullPath","history","pushState","PopStateEvent","getParams","matched","matchAll","params","decodeURIComponent","outlet","level","tag","route","component","cached","elementCache","relative","segments","matchRoutes","routeSegments","remaining","childMatches","default","replaceState","KRRouterOutlet","handlePopState","detectLevel","node","__decorate$1","replace","ft","removeProperty","setProperty","_$AQ","dt","ut","w","_getDefaults","breaks","extensions","gfm","hooks","pedantic","renderer","silent","tokenizer","walkTokens","_defaults","changeDefaults","newDefaults","escapeTest","escapeReplace","source","escapeTestNoEncode","escapeReplaceNoEncode","escapeReplacements","getEscapeReplacement","ch","escape$1","encode","unescapeTest","unescape","charAt","fromCharCode","parseInt","substring","caret","edit","regex","opt","obj","val","valSource","getRegex","cleanUrl","encodeURI","noopTest","splitCells","tableRow","count","cells","offset","str","escaped","curr","trim","shift","pop","splice","rtrim","invert","suffLen","outputLink","cap","link","lexer","text","inLink","token","tokens","inlineTokens","_Tokenizer","rules","space","src","block","newline","code","codeBlockStyle","fences","matchIndentToCode","indentToCode","matchIndentInNode","indentInNode","indentCodeCompensation","lang","inline","anyPunctuation","heading","trimmed","depth","hr","blockquote","blockTokens","list","bull","isordered","ordered","start","loose","itemRegex","itemContents","endsWithBlankLine","endEarly","line","repeat","nextLine","indent","trimStart","search","blankLine","nextBulletRegex","min","hrRegex","fencesBeginRegex","headingBeginRegex","rawLine","ischecked","istask","task","trimEnd","spacers","hasMultipleLineBreaks","pre","def","table","headers","aligns","rows","header","align","row","cell","lheading","paragraph","escape","inRawBlock","trimmedUrl","rtrimSlash","lastParenIndex","findClosingBracket","linkLen","reflink","links","nolink","emStrong","maskedSrc","prevChar","emStrongLDelim","punctuation","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","emStrongRDelimAst","emStrongRDelimUnd","lastCharLength","codespan","hasNonSpaceChars","hasSpaceCharsOnBothEnds","br","del","autolink","prevCapZero","_backpedal","inlineText","bullet","_paragraph","_blockLabel","_tag","_comment","blockNormal","gfmTable","blockGfm","blockPedantic","_punctuation","_inlineComment","_inlineLabel","inlineNormal","blockSkip","reflinkSearch","inlinePedantic","inlineGfm","inlineBreaks","normal","_Lexer","inlineQueue","lex","lexInline","next","lastToken","cutSrc","lastParagraphClipped","leading","tabs","extTokenizer","startBlock","startIndex","Infinity","tempSrc","tempStart","getStartIndex","errMsg","charCodeAt","keepPrevChar","lastIndexOf","startInline","_Renderer","infostring","quote","listitem","checkbox","tablerow","tablecell","flags","strong","em","cleanHref","out","image","_TextRenderer","_Parser","textRenderer","parseInline","renderers","genericToken","ret","parser","headingToken","codeToken","tableToken","blockquoteToken","listToken","itemBody","htmlToken","paragraphToken","textToken","escapeToken","tagToken","linkToken","imageToken","strongToken","emToken","codespanToken","delToken","_Hooks","static","preprocess","markdown","postprocess","processAllTokens","markedInstance","defaults","setOptions","parseMarkdown","Parser","Renderer","TextRenderer","Lexer","Tokenizer","Hooks","use","callback","concat","childTokens","pack","opts","ext","prevRenderer","apply","extLevel","prop","rendererProp","rendererFunc","tokenizerProp","tokenizerFunc","prevTokenizer","hooksProp","hooksFunc","prevHook","passThroughHooks","arg","resolve","packWalktokens","origOpt","warn","throwError","onError","all","message","msg","marked","getDefaults","IMAGE_EXTENSIONS","ACCEPTED_FILE_EXTENSIONS","KRChatbot","_reader","_decoder","TextDecoder","_buffer","_userHasScrolledUp","_isDragging","_isResizing","_overlay","_resizeDir","_dragStartX","_dragStartY","_dragStartLeft","_dragStartTop","_resizeStartW","_resizeStartH","_debugResizeStartX","_debugResizeStartW","_dragDepth","_pendingSeq","_pendingAttachAnalyze","_orgSkillRequestId","_globalSkillRequestId","_invocableSkillRequestId","_globalSkillPending","_speechRecognition","_speechBaseValue","_speechFinalTranscript","send","load","messages","placeholder","opened","hideToggle","variant","conversationId","_inputValue","_isStreaming","_error","_contextWarning","_contextLimitReached","_contextLimitMessage","_telemetry","_iterationLog","_cacheCheckpoints","_debugPanelOpen","_debugDrawerWidth","_isDebugResizing","_pendingConversationFiles","_isDraggingFile","_skillMenuOpened","_skillQuery","_orgSkills","_globalSkills","_invocableSkills","_aiFrameworkConfig","_skillHighlighted","_copiedIndex","_skillBrowseOpened","_skillBrowseSource","_skillBrowseQuery","_isDictating","_handleDocumentClick","contains","_handleMouseMove","newLeft","newTop","_panelEl","offsetWidth","innerWidth","innerHeight","dx","dy","minW","minH","maxW","maxH","newW","newH","width","_handleMouseUp","display","_saveState","_handleDebugResizeMouseMove","_handleDebugResizeMouseUp","ids","conversationFileIDs","meta","files","conversationFiles","_restoreState","cancel","abort","previewUrl","URL","revokeObjectURL","changed","_messagesEl","_inputEl","focus","_positionSkillMenu","_skillMenuEl","scrollIntoView","_inputWrapperEl","inputRect","topLimit","spaceAbove","maxHeight","menuRect","stop","_handleStop","isStreaming","_handleToggle","toggle","_showOverlay","_handleHeaderMouseDown","closest","_handleResizeMouseDown","currentTarget","dataset","dir","stopPropagation","_applyStoredLayout","debugPanelOpen","debugDrawerWidth","_handleInputChange","textarea","slashMatch","_searchInvocableSkills","_handleKeyDown","actionCount","debugTelemetryEnabled","shiftKey","_activateSkillMenuItem","_handleSubmit","debugActions","_openFilePicker","_handleSkillBrowseOpen","_send","skill","_handleSkillSelect","_searchOrgSkills","requestId","_searchGlobalSkills","_handleGlobalSkillEnable","canEnable","KRSnackbar","btn","showLoading","encodeURIComponent","enabled","reset","showError","_handlePlusClick","_handleMicClick","SpeechRecognitionCtor","SpeechRecognition","webkitSpeechRecognition","recognition","continuous","interimResults","onresult","interim","resultIndex","results","isFinal","transcript","onerror","onend","canRun","allowedRoles","global","_handleSkillCardKeydown","_handleCopyMessage","navigator","clipboard","writeText","registryServer","_handleSkillBrowseClose","_handleSkillBrowseSearch","_handleSkillBrowseTabChange","activeTabId","aiAnalyze","_fileInputEl","click","_handleFileInputChange","input","_addFiles","_handlePaste","clipboardData","file","getAsFile","_handleDragEnter","_hasFiles","_handleDragOver","_handleDragLeave","_handleDrop","dataTransfer","from","types","_getFileExtension","dot","fileList","createObjectURL","pending","localId","mimeType","_handlePendingRemove","_clearPending","_handleFileOpen","conversationFileID","KRFilePreview","niceName","messageText","submitEvent","userMessage","minHeight","allMsgEls","userMsgEl","assistantMsgEl","clientHeight","offsetTop","uploaded","form","FormData","userText","fileIds","pageContext","selectionContext","conversationID","createNew","Accept","conversation","context","_captureContext","ok","getReader","_readStreamChunk","_handleStreamError","status","err","page","island","getElementById","selection","getSelection","_handleMessagesScroll","container","distanceFromBottom","_handleErrorDismiss","_handleContextWarningDismiss","_handleToggleDebugPanel","_handleDebugResizeMouseDown","read","done","decode","stream","events","lines","reasoning","usage","iteration","checkpoint","finished","lastMessage","_renderSkillMenu","skills","description","_renderSkillBrowse","_renderSkillGrid","_renderUserContent","_fmtTokens","isNaN","toLocaleString","_fmtCost","_renderDebugPanel","styleMap","contextUsedPercent","currentContextTokens","contextWindowTokens","turnInputTokens","turnOutputTokens","turnCacheReadTokens","turnHitRate","turnCostUsd","conversationInputTokens","conversationOutputTokens","conversationCacheReadTokens","conversationCacheWriteTokens","conversationCostUsd","ckpt","iterationInput","iterationOutput","iterationCacheRead","iterationCacheWrite","iterationHitRate","iterationCostUsd","isDebugEnabled","panel","paddingRight","fileName","isImage","chip"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,18,19,20,21]}