@syntrologie/runtime-sdk 2.2.0-canary.8 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/actions/types.d.ts +7 -0
- package/dist/antiFlicker.d.ts +2 -0
- package/dist/apps/builtinRuntimeModules.generated.d.ts +20 -0
- package/dist/{chunk-MEBUEMEZ.js → chunk-V4MDQX67.js} +2868 -1417
- package/dist/chunk-V4MDQX67.js.map +7 -0
- package/dist/configFetcher.d.ts +3 -1
- package/dist/context/ContextManager.d.ts +4 -0
- package/dist/diagnostics/service-worker-check.d.ts +23 -0
- package/dist/editorLoader.d.ts +8 -2
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1563 -12
- package/dist/index.js.map +4 -4
- package/dist/integrations/gtm-bridge.d.ts +36 -0
- package/dist/navigation/NavigationMonitor.d.ts +45 -0
- package/dist/overlays/runtime/utils/AnchorWatcher.d.ts +22 -0
- package/dist/overlays/types.d.ts +2 -0
- package/dist/react.js +1 -1
- package/dist/runtime.d.ts +3 -0
- package/dist/smart-canvas.esm.js +62 -36
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +15828 -23049
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +62 -36
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/telemetry/adapters/posthog.d.ts +19 -0
- package/dist/telemetry/consent.d.ts +62 -0
- package/dist/version.d.ts +1 -1
- package/dist/widgets/WidgetRegistry.d.ts +10 -0
- package/package.json +13 -4
- package/schema/canvas-config.schema.json +124 -22
- package/scripts/syntroReactPlugin.mjs +113 -0
- package/dist/adaptives/adaptive-chatbot/index.js +0 -9
- package/dist/adaptives/adaptive-chatbot/index.js.map +0 -7
- package/dist/adaptives/adaptive-content/index.js +0 -22
- package/dist/adaptives/adaptive-content/index.js.map +0 -7
- package/dist/adaptives/adaptive-faq/index.js +0 -28
- package/dist/adaptives/adaptive-faq/index.js.map +0 -7
- package/dist/adaptives/adaptive-gamification/index.js +0 -2
- package/dist/adaptives/adaptive-gamification/index.js.map +0 -7
- package/dist/adaptives/adaptive-nav/index.js +0 -27
- package/dist/adaptives/adaptive-nav/index.js.map +0 -7
- package/dist/adaptives/adaptive-overlays/index.js +0 -94
- package/dist/adaptives/adaptive-overlays/index.js.map +0 -7
- package/dist/chunk-MEBUEMEZ.js.map +0 -7
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
function S(...e){return e.filter(Boolean).join(" ")}function Te(){return typeof SynOS<"u"&&SynOS.React||{}}function Fe(e,t,a){var l=Te(),o=t||{},d=o.children;return delete o.children,a!==void 0&&(o.key=a),Array.isArray(d)?l.createElement.apply(null,[e,o].concat(d)):d!==void 0?l.createElement(e,o,d):l.createElement(e,o)}var s=Fe,i=Fe,Z=Te().Fragment;function H(){return typeof SynOS<"u"&&SynOS.React||{}}var ce=new Proxy({},{get:function(e,t){return H()[t]}});function w(){return H().useState.apply(null,arguments)}function P(){return H().useEffect.apply(null,arguments)}function _(){return H().useMemo.apply(null,arguments)}function C(){return H().useCallback.apply(null,arguments)}function V(){return H().useRef.apply(null,arguments)}function qe(){return H().useReducer.apply(null,arguments)}function Y(){return H().createElement.apply(null,arguments)}function se(){return H().forwardRef.apply(null,arguments)}var ee=H(),Xa=ee.Fragment,ja=ee.Suspense,Ka=ee.Children,Za=ee.Component,Qa=ee.PureComponent;function da(){return typeof SynOS<"u"&&SynOS.ReactDOM||{}}var Ya=new Proxy({},{get:function(e,t){return da()[t]}});var v={id:"id",class:"class",tag:"tag",attribute:"attribute",nthchild:"nthchild",nthoftype:"nthoftype"};var fa="CssSelectorGenerator";function ue(e="unknown problem",...t){console.warn(`${fa}: ${e}`,...t)}var nt={selectors:[v.id,v.class,v.tag,v.attribute],includeTag:!1,whitelist:[],blacklist:[],combineWithinSelector:!0,combineBetweenSelectors:!0,root:null,maxCombinations:Number.POSITIVE_INFINITY,maxCandidates:Number.POSITIVE_INFINITY,useScope:!1};function Ee(e){return e instanceof RegExp}function ia(e){return e.replace(/[|\\{}()[\]^$+?.]/g,"\\$&").replace(/\*/g,".+")}function pe(e){let t=e.map(a=>{if(Ee(a))return l=>a.test(l);if(typeof a=="function")return l=>{let o=a(l);return typeof o!="boolean"?(ue("pattern matcher function invalid","Provided pattern matching function does not return boolean. It's result will be ignored.",a),!1):o};if(typeof a=="string"){let l=new RegExp("^"+ia(a)+"$");return o=>l.test(o)}return ue("pattern matcher invalid","Pattern matching only accepts strings, regular expressions and/or functions. This item is invalid and will be ignored.",a),()=>!1});return a=>t.some(l=>l(a))}var pa=new RegExp(["^$","\\s"].join("|")),ma=new RegExp(["^$"].join("|")),Oe=[v.nthoftype,v.tag,v.id,v.class,v.attribute,v.nthchild];var kt=pe(["class","id","ng-*"]);var Co="3a".toUpperCase();var Ne=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Sa=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,a,l)=>l?l.toUpperCase():a.toLowerCase()),xe=e=>{let t=Sa(e);return t.charAt(0).toUpperCase()+t.slice(1)},fe=(...e)=>e.filter((t,a,l)=>!!t&&t.trim()!==""&&l.indexOf(t)===a).join(" ").trim(),Ge=e=>{for(let t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0};var We={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var ze=se(({color:e="currentColor",size:t=24,strokeWidth:a=2,absoluteStrokeWidth:l,className:o="",children:d,iconNode:f,...n},p)=>Y("svg",{ref:p,...We,width:t,height:t,stroke:e,strokeWidth:l?Number(a)*24/Number(t):a,className:fe("lucide",o),...!d&&!Ge(n)&&{"aria-hidden":"true"},...n},[...f.map(([m,g])=>Y(m,g)),...Array.isArray(d)?d:[d]]));var Ve=(e,t)=>{let a=se(({className:l,...o},d)=>Y(ze,{ref:d,iconNode:t,className:fe(`lucide-${Ne(xe(e))}`,`lucide-${e}`,l),...o}));return a.displayName=xe(e),a};var ba=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],Q=Ve("check",ba);function Le({found:e}){return s("span",{className:S("se-w-2 se-h-2 se-rounded-full se-shrink-0 se-inline-block",e?"se-bg-green-4":"se-bg-text-tertiary"),title:e?"Found on this page":"Not found on this page"})}function ge({count:e,children:t}){let[a,l]=w(!1);return i("div",{className:"se-mt-4 se-cursor-pointer se-select-none",children:[i("div",{role:"button",tabIndex:0,className:"se-text-xs se-font-semibold se-text-text-tertiary se-flex se-items-center se-gap-1.5 se-cursor-pointer",onClick:()=>l(!a),onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&l(!a)},children:[s("span",{children:a?"\u25BE":"\u25B8"}),i("span",{children:["Dismissed (",e,")"]})]}),a&&s("div",{className:"se-mt-1.5",children:t})]})}function Ie({children:e}){return s("div",{className:"se-flex-1 se-overflow-auto se-p-6",children:e})}function he({children:e,itemKey:t,onClick:a,onMouseEnter:l,onMouseLeave:o,className:d,validated:f}){return s("div",{"data-item-key":t,onClick:a,onMouseEnter:l,onMouseLeave:o,className:S("se-py-2 se-px-2.5 se-rounded-lg se-border se-bg-card-bg se-shadow-sm se-mb-1 se-text-sm se-text-text-primary",f?"se-border-green-4/40 se-shadow-glow-green":"se-border-border-primary",a&&"se-cursor-pointer hover:se-border-border-primary/80 hover:se-bg-sidebar-hover se-transition-colors",d),children:e})}function Ce({onSave:e,onPublish:t}){return i("div",{className:"se-py-3 se-px-4 se-border-t se-border-border-primary se-flex se-gap-2",children:[s("button",{onClick:e,className:"se-flex-1 se-h-10 se-px-4 se-py-2 se-rounded-md se-bg-btn-neutral se-text-btn-neutral-text se-border se-border-btn-neutral-border hover:se-text-btn-neutral-text-hover se-text-sm se-font-medium se-cursor-pointer se-inline-flex se-items-center se-justify-center focus-visible:se-shadow-focus-primary focus-visible:se-outline-none",children:"Save Draft"}),s("button",{onClick:t,className:"se-flex-1 se-h-10 se-px-4 se-py-2 se-rounded-md se-border-none se-bg-btn-primary se-text-btn-primary-text hover:se-bg-btn-primary-hover se-text-sm se-font-medium se-cursor-pointer se-inline-flex se-items-center se-justify-center focus-visible:se-shadow-focus-primary focus-visible:se-outline-none",children:"Publish"})]})}function Se({title:e,subtitle:t}){return i("div",{className:"se-px-4 se-pt-3 se-pb-2",children:[s("h2",{className:"se-m-0 se-text-base se-font-semibold se-text-text-primary",children:e}),t&&s("p",{className:"se-mt-0.5 se-mb-0 se-text-xs se-text-text-secondary",children:t})]})}function X({label:e,className:t,...a}){return i("div",{children:[e&&s("label",{className:"se-text-sm se-font-medium se-text-input-field-text-label se-mb-1 se-block",children:e}),s("input",{...a,className:S("se-w-full se-py-2 se-px-3 se-rounded-lg se-border se-border-input-field-border se-bg-slate-grey-3 se-text-text-primary se-text-sm se-font-[inherit] se-mb-2 se-box-border","placeholder:se-text-input-field-text-placeholder","focus:se-border-input-field-border-selected focus:se-outline-none focus:se-shadow-focus-primary","disabled:se-bg-input-field-bg-disabled disabled:se-cursor-not-allowed disabled:se-opacity-50",t)})]})}function be({children:e}){return s("div",{className:"se-flex se-flex-col se-h-full se-font-sans",children:e})}function we({message:e}){return s("div",{className:"se-text-center se-py-8 se-px-4 se-text-text-secondary se-text-sm",children:e})}function ka({current:e,target:t}){let a=Math.min(100,Math.round(e/Math.max(t,1)*100));return i("div",{className:"se-flex se-items-center se-gap-0.5",children:[s("span",{className:"se-inline-block se-w-8 se-h-1 se-rounded-full se-bg-white/10",title:`${e}/${t} (${a}%)`,children:s("span",{className:S("se-block se-h-full se-rounded-full se-transition-all",a>=100?"se-bg-green-4":"se-bg-blue-4"),style:{width:`${a}%`}})}),i("span",{className:"se-text-[9px] se-text-text-tertiary",children:[e,"/",t]})]})}function ya({cs:e,isLast:t}){let a=!!e.formatted.progress,l=!e.passed&&a&&e.formatted.progress.current>0;return i("div",{className:"se-flex se-items-center se-gap-0",children:[i("div",{className:"se-flex se-flex-col se-items-center se-min-w-0",children:[s("div",{"data-journey-node":!0,"data-passed":e.passed?"true":"false",className:S("se-w-4 se-h-4 se-rounded-full se-border-2 se-flex se-items-center se-justify-center se-shrink-0",e.passed?"se-bg-green-4 se-border-green-4":l?"se-bg-blue-4 se-border-blue-4":"se-bg-transparent se-border-white/20"),children:e.passed&&s(Q,{className:"se-w-2.5 se-h-2.5 se-text-white"})}),s("span",{className:"se-text-[9px] se-text-text-tertiary se-truncate se-max-w-[60px] se-text-center se-mt-0.5",title:e.formatted.instruction,children:e.formatted.shortLabel}),a&&s(ka,{current:e.formatted.progress.current,target:e.formatted.progress.target})]}),!t&&s("div",{"data-journey-line":!0,className:S("se-h-0.5 se-w-4 se-self-start se-mt-2 se-shrink-0",e.passed?"se-bg-green-4":"se-bg-white/10")})]})}function ke({status:e}){if(!e||e.conditions.length===0)return s("div",{className:"se-mt-1 se-text-[10px] se-text-text-tertiary se-italic",children:"Always Present"});let{conditions:t}=e,a=t.every(o=>o.passed),l=t.length>1;return i("div",{className:"se-mt-1",children:[s("div",{className:"se-flex se-items-start",children:t.map((o,d)=>s(ya,{cs:o,isLast:d===t.length-1},d))}),a&&l&&i("div",{className:"se-flex se-items-center se-gap-1 se-mt-1 se-text-[10px] se-text-green-4",children:[s(Q,{className:"se-w-3 se-h-3"}),s("span",{children:"All conditions met"})]})]})}function ye({label:e,count:t,className:a}){return i("div",{className:S("se-text-xs se-font-bold se-text-text-primary se-uppercase se-tracking-wide se-py-1 se-pb-2 se-flex se-items-center se-justify-between",a),children:[s("span",{children:e}),s("span",{className:"se-text-xs se-text-text-secondary se-bg-badge-slate-bg se-px-1.5 se-py-0.5 se-rounded-lg",children:t})]})}function j(e){switch(e){case"gte":return"\u2265";case"lte":return"\u2264";case"gt":return">";case"lt":return"<";case"eq":return"=";default:return e}}function Pa(e){return e.replace(/[-_]/g," ").toLowerCase()}function va(e){return e.replace(/\/?\*+$/,"/").replace(/\/\/$/,"/")}var Aa=/page.?view/i,Da=/click/i;function Pe(e,t){switch(e.type){case"event_count":{let a=e.key,l=e.operator,o=e.count,d=t??0,f=Pa(a),n,p;if(Aa.test(f)){let m=f.replace(/\s*page\s*views?\s*/i,"").trim();n=m?`View ${m} pages ${o}+ times`:`View pages ${o}+ times`,p=`View ${o}+ times`}else if(Da.test(f)){let m=f.replace(/\s*clicks?\s*/i,"").trim();n=m?`Click ${m} ${o}+ times`:`Click ${o}+ times`,p=`${o}+ clicks`}else{let m=f.trim().split(" ").filter(g=>g).pop()||"events";n=`Reach ${o}+ ${f} events`,p=`${o}+ ${m}s`}return{label:`${a} ${j(l)} ${o}`,instruction:n,shortLabel:p,progress:{current:d,target:o,operator:l}}}case"page_url":{let a=e.url,l=va(a),d=a!==l?`Visit a ${l} page`:`Visit ${l}`;return{label:`${a}`,instruction:d,shortLabel:l}}case"anchor_visible":{let a=e.anchorId,l=e.state;return{label:`${a} (${l})`,instruction:`Scroll until ${a} is ${l}`,shortLabel:`${a}`}}case"event_occurred":{let a=e.eventName;return{label:`${a}`,instruction:`Trigger a ${a} event`,shortLabel:`${a}`}}case"state_equals":{let a=e.key,l=e.value===void 0?"undefined":JSON.stringify(e.value);return{label:`${a} = ${l}`,instruction:`${a} equals ${l}`,shortLabel:`${a}`}}case"viewport":{let a=[];e.minWidth!==void 0&&a.push(`w ${j("gte")} ${e.minWidth}px`),e.maxWidth!==void 0&&a.push(`w ${j("lte")} ${e.maxWidth}px`),e.minHeight!==void 0&&a.push(`h ${j("gte")} ${e.minHeight}px`),e.maxHeight!==void 0&&a.push(`h ${j("lte")} ${e.maxHeight}px`);let l=a.join(", ")||"any viewport",o=a.length>0?`Use a viewport ${a.join(" and ")}`:"Use a viewport of any size",d=a.length>0?a[0]:"Any size";return{label:l,instruction:o,shortLabel:d}}case"session_metric":{let a=e.key,l=e.operator,o=e.threshold;return{label:`${a} ${j(l)} ${o}`,instruction:`${a} reaches ${o}+`,shortLabel:`${a} ${o}+`}}case"dismissed":{let a=e.inverted,o=e.key||"this";return{label:a?"not dismissed":"dismissed",instruction:a?`Do not dismiss ${o}`:`Dismiss ${o}`,shortLabel:a?"Not dismissed":"Dismissed"}}case"cooldown_active":{let a=e.inverted;return{label:a?"cooldown inactive":"cooldown active",instruction:a?"Wait for cooldown to expire":"Cooldown is active",shortLabel:a?"Cooldown done":"Cooldown active"}}case"frequency_limit":{let a=e.inverted,l=e.limit;return{label:`shown ${j(a?"lt":"gte")} ${l} times`,instruction:a?`Shown fewer than ${l} times`:`Shown ${l}+ times`,shortLabel:a?`< ${l} views`:`${l}+ views`}}case"route":{let a=e.routeId;return{label:`${a}`,instruction:`Navigate to ${a} route`,shortLabel:`${a}`}}default:return{label:`${e.type}`,instruction:`${e.type}`,shortLabel:`${e.type}`}}}function $e(){return window.SynOS?.handle?.runtime??null}function Ba(e,t){let a=t.context.get(),l=e.type,o=!1,d;switch(l){case"event_count":{if(!t.accumulator)break;let n=e.key,p=e.withinMs,m=t.accumulator.getCount(n,p);d=m;let g=e.count;switch(e.operator){case"gte":o=m>=g;break;case"lte":o=m<=g;break;case"eq":o=m===g;break;case"gt":o=m>g;break;case"lt":o=m<g;break}break}case"page_url":{let p=e.url.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,".*").replace(/\*/g,"[^/]*");o=new RegExp(`^${p}$`).test(a.page.url);break}case"route":o=a.page.routeId===e.routeId;break;case"anchor_visible":{let p=a.anchors?.find(m=>m.anchorId===e.anchorId);switch(e.state){case"visible":o=p?.visible===!0;break;case"present":o=p?.present===!0;break;case"absent":o=!p?.present;break}break}case"event_occurred":o=t.events?.hasRecentEvent(e.eventName,e.withinMs??6e4)??!1;break;case"viewport":{let{width:n,height:p}=a.viewport;o=!0,e.minWidth!==void 0&&n<e.minWidth&&(o=!1),e.maxWidth!==void 0&&n>e.maxWidth&&(o=!1),e.minHeight!==void 0&&p<e.minHeight&&(o=!1),e.maxHeight!==void 0&&p>e.maxHeight&&(o=!1);break}case"session_metric":{let n=t.state?.getSessionMetric(e.key)??0,p=e.threshold;switch(e.operator){case"gte":o=n>=p;break;case"lte":o=n<=p;break;case"eq":o=n===p;break;case"gt":o=n>p;break;case"lt":o=n<p;break}break}case"dismissed":o=e.inverted?!(t.state?.isDismissed(e.key)??!1):t.state?.isDismissed(e.key)??!1;break;case"cooldown_active":o=e.inverted?!(t.state?.isCooldownActive(e.key)??!1):t.state?.isCooldownActive(e.key)??!1;break;case"frequency_limit":{let p=(t.state?.getFrequencyCount(e.key)??0)>=e.limit;o=e.inverted?!p:p;break}}let f=Pe(e,d);return{passed:o,cs:{type:l,passed:o,formatted:f}}}function Ma(e,t){if(e.type!=="rules"||!e.rules?.length)return{visible:!!e.default,isFallback:!0,conditions:[]};let a=[];for(let l of e.rules){let o=!0;for(let d of l.conditions){let{passed:f,cs:n}=Ba(d,t);a.push(n),f||(o=!1)}if(o)return{visible:l.value,isFallback:!1,conditions:a}}return{visible:e.default??!1,isFallback:!0,conditions:a}}function ve(e){let[t,a]=w(new Map),l=V(e);l.current=e;let o=C(()=>{let d=$e();if(!d)return;let f=new Map;for(let n of l.current)n.showWhen?f.set(n.id,Ma(n.showWhen,d)):f.set(n.id,null);a(f)},[]);return P(()=>{o();let d=$e(),f=[];d?.accumulator&&f.push(d.accumulator.subscribe(o));let n=setInterval(o,2e3);return()=>{f.forEach(p=>p()),clearInterval(n)}},[o]),t}function Ra(e,t){return e.length<=t?e:`${e.slice(0,t).trimEnd()}...`}function Ta(e){return typeof e=="object"&&e!==null&&e.type==="rules"&&Array.isArray(e.rules)}function _e(e){if(!e||!Ta(e))return"All pages";let t=[],a=[];for(let o of e.rules)for(let d of o.conditions)d.type==="page_url"&&typeof d.url=="string"&&t.push(d.url),d.type==="anchor_visible"&&typeof d.anchorId=="string"&&a.push(d.anchorId);let l=[];return t.length>0&&l.push(t[0]),a.length>0&&l.push(a[0]),l.length>0?l.join(" \xB7 "):"All pages"}function Xe(e){let t=e.config.icon||"\u{1F9ED}",a=Ra(e.config.title,30);return`${t} ${a}`}var Fa=["nav","navigation"];function J(e){return Fa.some(t=>e.kind.startsWith(`${t}:`))}function qa(e){return typeof e=="object"&&e!==null&&e.type==="rules"&&Array.isArray(e.rules)}function De(e){if(!e||!qa(e))return{pagePatterns:[],anchorSelectors:[],hasTargeting:!1};let t=new Set,a=new Set;for(let o of e.rules)for(let d of o.conditions){let f=d;f.type==="page_url"&&typeof f.url=="string"?t.add(f.url):f.type==="anchor_visible"&&typeof f.anchorId=="string"&&a.add(f.anchorId)}let l=t.size>0||a.size>0;return{pagePatterns:[...t],anchorSelectors:[...a],hasTargeting:l}}function Ea(e){return De(e).pagePatterns[0]||null}function Oa(e){return De(e).anchorSelectors[0]||null}function je(e){return(e.actions||[]).filter(J).map((a,l)=>({key:String(l),index:l,summary:Xe(a),trigger:_e(a.showWhen),rationale:a.rationale,firstAnchor:Oa(a.showWhen),tip:a}))}function Ae(e,t){let a=(e.actions||[]).filter(J);return{...e,actions:a.filter((l,o)=>!t.has(String(o)))}}function Ha(e,t){let[a,l]=w(new Map),o=V(e);return o.current=e,P(()=>{let d=()=>{let n=new Map,p=t();for(let m of o.current){let g=De(m.tip.showWhen),M=!0;g.pagePatterns.length>0&&(M=g.pagePatterns.some(R=>new RegExp(`^${R.replace(/\*\*/g,".*").replace(/(?<!\.)(\*)/g,"[^/]*")}$`).test(p)));let D=!1,b=null;if(m.firstAnchor)try{b=document.querySelector(m.firstAnchor),D=b!==null}catch{}else D=M;n.set(m.key,{found:M&&D,element:b})}l(n)};d();let f=setInterval(d,2e3);return window.addEventListener("popstate",d),()=>{clearInterval(f),window.removeEventListener("popstate",d)}},[t]),a}function Ua({config:e,onChange:t,editor:a}){let l=e,[o,d]=w(()=>a.getDismissedKeys?.()??new Set),[f,n]=w(null),[p,m]=w("after"),[g,M]=w(null);P(()=>{a.setDismissedKeys?.(o)},[o,a]),P(()=>{let u=a.previewMode;if(u)if(u==="before"){let h=new Set(je(l).map(T=>T.key)),x=Ae(l,h);a.previewConfig(x)}else a.previewConfig(e)},[a.previewMode]);let D=V(!1);P(()=>{D.current||(D.current=!0,a.initialEditKey!=null&&n(String(a.initialEditKey)),a.clearInitialState?.())},[a]);let b=je(l),R=b.filter(u=>!o.has(u.key)),W=b.filter(u=>o.has(u.key)),z=R.length,c=_(()=>b.map(u=>({id:u.key,showWhen:u.tip.showWhen})),[b]),L=ve(c),k=Ha(b,a.getCurrentRoute),E=R.filter(u=>k.get(u.key)?.found).length,G=C(u=>{d(h=>{let x=new Set(h);return x.add(u),x}),f===u&&n(null)},[f]),$=C(u=>{d(h=>{let x=new Set(h);return x.delete(u),x})},[]),O=C(u=>{n(u.key)},[]),le=C(u=>{let h=Ea(u.tip.showWhen);h&&a.navigateTo(h),u.firstAnchor&&a.highlightElement(u.firstAnchor)},[a]),Re=C(()=>{n(null),m("after"),a.previewConfig(e),a.clearHighlight()},[a,e]);P(()=>(a.setBackHandler?.(f!==null?Re:null),()=>a.setBackHandler?.(null)),[f,Re,a]);let Va=C(u=>{if(m(u),u==="before"){let h=Ae(l,new Set([f]));a.previewConfig(h)}else a.previewConfig(e)},[l,f,a,e]),K=C((u,h,x)=>{let T=(l.actions||[]).filter(J).slice(),y={...T[u],config:{...T[u].config}};y.config[h]=x,T[u]=y;let la=(l.actions||[]).filter(ua=>!J(ua)),sa={...l,actions:[...la,...T]};t(sa),a.setDirty(!0)},[l,t,a]),ea=C(()=>{if(o.size>0){let u=Ae(l,o);t(u)}a.publish()},[o,l,t,a]),aa=C(u=>{M(u.key),u.firstAnchor&&a.highlightElement(u.firstAnchor)},[a]),ta=C(()=>{M(null),a.clearHighlight()},[a]),oa=u=>{let x=(l.actions||[]).filter(J)[u];if(!x)return null;let T=b.find(y=>y.key===String(u));return i("div",{className:"se-py-1",children:[T&&T.trigger!=="All pages"&&i("button",{type:"button","data-trigger":!0,className:"se-flex se-items-center se-gap-1 se-text-[11px] se-text-slate-grey-8 se-cursor-pointer se-mb-1 se-border-none se-bg-transparent se-p-0 se-text-left",onClick:()=>le(T),children:[s("span",{children:"\u{1F4CD}"}),s("span",{children:T.trigger})]}),s(X,{label:"Title",value:x.config.title,onChange:y=>K(u,"title",y.target.value)}),s(X,{label:"Description",value:x.config.description,onChange:y=>K(u,"description",y.target.value)}),s(X,{label:"Link URL",value:x.config.href||"",onChange:y=>K(u,"href",y.target.value),placeholder:"Optional"}),s(X,{label:"Icon",value:x.config.icon||"",onChange:y=>K(u,"icon",y.target.value),placeholder:"e.g., \\u{1f9ed}"}),s(X,{label:"Category",value:x.config.category||"",onChange:y=>K(u,"category",y.target.value),placeholder:"Optional"}),i("label",{className:"se-flex se-items-center se-gap-2 se-text-xs se-text-slate-grey-8 se-mb-2",children:[s("input",{type:"checkbox",checked:x.config.external||!1,onChange:y=>K(u,"external",y.target.checked)}),"Open in new tab"]}),s("span",{className:"se-text-[11px] se-font-semibold se-text-slate-grey-7 se-mb-1 se-block",children:"AI Rationale"}),s("div",{className:"se-p-2 se-rounded se-border se-border-dashed se-border-white/15 se-bg-white/[0.02] se-text-slate-grey-8 se-text-xs se-mb-2",children:x.rationale?x.rationale.why:"N/A"})]})},ra=`${z} tip${z!==1?"s":""}${z>0?` (${E} found on this page)`:""}`;return i(be,{children:[s(Se,{title:"Navigation Tips",subtitle:ra,onBack:()=>a.navigateHome()}),s(Ie,{children:f!==null?(()=>{let u=Number(f),h=b.find(x=>x.key===f);return i(Z,{children:[i("div",{className:"se-flex se-items-center se-gap-2 se-mb-3 se-text-[13px] se-font-semibold se-text-slate-grey-10",children:[s("span",{children:"\u{1F9ED}"}),s("span",{children:h?.summary})]}),oa(u)]})})():i(Z,{children:[b.length===0&&s(we,{message:"No tips configured."}),R.length>0&&i(Z,{children:[s(ye,{label:"TIPS",count:R.length}),R.map(u=>{let h=k.get(u.key);return i(he,{itemKey:u.key,onClick:()=>O(u),onMouseEnter:()=>aa(u),onMouseLeave:ta,children:[u.trigger!=="All pages"&&i("button",{type:"button","data-trigger":!0,className:"se-flex se-items-center se-gap-1 se-text-[11px] se-text-slate-grey-8 se-cursor-pointer se-mb-1 se-border-none se-bg-transparent se-p-0 se-text-left",onClick:x=>{x.stopPropagation(),le(u)},children:[s("span",{children:"\u{1F4CD}"}),s("span",{children:u.trigger})]}),i("div",{"data-card-body":!0,role:"button",tabIndex:0,className:"se-flex se-items-center se-gap-2 se-cursor-pointer",onClick:()=>O(u),onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&O(u)},children:[s(Le,{found:h?.found??!1}),s("span",{className:"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap",children:u.summary}),s("button",{type:"button",className:"se-py-0.5 se-px-1.5 se-rounded se-border-none se-bg-transparent se-text-slate-grey-7 se-text-sm se-cursor-pointer se-shrink-0 se-leading-none",onClick:x=>{x.stopPropagation(),G(u.key)},title:"Dismiss this tip",children:"\xD7"})]}),i("div",{className:"se-text-[10px] se-text-slate-grey-7 se-mt-1",children:["WHY: ",u.rationale?u.rationale.why:"N/A"]}),s(ke,{status:L.get(u.key)??null})]},u.key)})]}),W.length>0&&s(ge,{count:W.length,children:W.map(u=>i("div",{className:"se-flex se-items-center se-gap-2 se-py-1.5 se-px-2.5 se-rounded-md se-border se-border-white/[0.03] se-bg-transparent se-mb-0.5 se-cursor-pointer se-text-xs se-text-slate-grey-6 se-opacity-60",children:[s("span",{className:"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap se-line-through",children:u.summary}),s("button",{type:"button",className:"se-py-0.5 se-px-1.5 se-rounded se-border-none se-bg-transparent se-text-blue-5 se-text-[11px] se-cursor-pointer se-shrink-0 se-leading-none",onClick:h=>{h.stopPropagation(),$(u.key)},children:"Restore"})]},u.key))})]})}),s(Ce,{onSave:()=>a.save(),onPublish:ea})]})}var Ke={title:"Navigation Tips",icon:"\u{1F9ED}",description:"Navigation tips accordion with per-item visibility"};var Ze=Ua;var U={white:"#ffffff",black:"#000000"},B={0:"#2c0b0a",1:"#5b1715",2:"#89221f",3:"#b72e2a",4:"#d44844",5:"#dd6d69",6:"#e5918f",7:"#eeb6b4",8:"#f6dada",9:"#faebea"},r={0:"#07080a",1:"#0f1318",2:"#0e1114",3:"#1c222a",4:"#2b333f",5:"#394454",6:"#475569",7:"#677384",8:"#87919f",9:"#a8afba",10:"#cbd0d7",11:"#e8eaee",12:"#f6f7f9"},I={0:"#07230a",1:"#0e4514",2:"#16681e",3:"#1d8a28",4:"#24ad32",5:"#4fbd5a",6:"#7acd82",7:"#a5deab",8:"#d0eed3",9:"#e5f6e7"},N={0:"#301f09",1:"#5f3e12",2:"#8f5e1b",3:"#be7d24",4:"#ee9c2d",5:"#f1b057",6:"#f5c481",7:"#f8d7ab",8:"#fcebd5",9:"#fdf5ea"},A={0:"#330707",1:"#660f0e",2:"#991616",3:"#cc1e1d",4:"#ff2524",5:"#ff5150",6:"#ff7c7c",7:"#ffa8a7",8:"#ffd3d3",9:"#ffe9e9"},ae={0:"#051533",1:"#0a2a66",2:"#0f3f98",3:"#1454cb",4:"#1969fe",5:"#4787fe",6:"#75a5fe",7:"#a3c3ff",8:"#d1e1ff",9:"#e8f0ff"},te={0:"#662500",1:"#993d00",2:"#cc5800",3:"#ff7700",4:"#fea85d",5:"#fec58f",6:"#ffd6ae",7:"#fee6cd",8:"#fff1e1",9:"#fff8f0"},F={0:"#151229",1:"#2a2452",2:"#40357c",3:"#5547a5",4:"#6a59ce",5:"#887ad8",6:"#a69be2",7:"#c3bdeb",8:"#e1def5",9:"#f0eefa"},oe={0:"#37091f",1:"#69123c",2:"#9b1c58",3:"#cd2575",4:"#ff2e92",5:"#ff58a8",6:"#ff82be",7:"#ffabd3",8:"#ffd5e9",9:"#ffeaf4"};var ss={primary:r[10],secondary:r[9],tertiary:r[8]},us={primary:r[2],secondary:r[0]},ds={primary:r[4],secondary:r[3]},fs={primary:{text:U.white,icon:U.white,border:B[3],backgroundDefault:B[3],backgroundHover:B[2]},neutral:{text:r[10],textHover:U.white,icon:r[10],iconHover:U.white,border:r[4],background:r[2]},link:{text:U.white,icon:U.white,hover:B[5]},error:{text:A[5],hover:A[6]},success:{text:I[5],hover:I[6]}},ns={slateGrey:{content:r[10],pillOutline:r[10],borderPrimary:r[5],borderSecondary:r[5],background:r[3]},brand:{content:B[9],pillOutline:B[9],borderPrimary:B[6],borderSecondary:B[6],background:B[0]},red:{content:A[8],pillOutline:A[4],borderPrimary:A[2],borderSecondary:A[2],background:A[0]},yellow:{content:N[8],pillOutline:N[4],borderPrimary:N[2],borderSecondary:N[2],background:N[0]},green:{content:I[8],pillOutline:I[4],borderPrimary:I[2],borderSecondary:I[2],background:I[0]},purple:{content:F[8],pillOutline:F[4],borderPrimary:F[2],borderSecondary:F[2],background:F[0]},blue:{content:ae[8],pillOutline:ae[4],borderPrimary:ae[2],borderSecondary:ae[2],background:ae[0]},orange:{content:te[8],pillOutline:te[4],borderPrimary:te[2],borderSecondary:te[2],background:te[0]},pink:{content:oe[8],pillOutline:oe[4],borderPrimary:oe[2],borderSecondary:oe[2],background:oe[0]}},is={green:{content:I[8],border:I[2],background:I[0]},yellow:{content:N[8],border:N[2],background:N[0]},red:{content:A[8],border:A[2],background:A[0]}},cs={green:{content:I[1],background:I[9]},yellow:{content:N[1],background:N[9]},red:{content:A[1],background:A[9]}},ps={content:r[10],border:r[4],background:"#1c2124"},ms={backgroundDefault:r[2],backgroundHover:r[1],selected:r[3]},xs={background:r[2],icon:r[10],borderDefault:r[4],borderSelected:B[3],textLabel:r[9],textPlaceholder:r[8],textHint:r[8]},Ls={backgroundDefault:r[2],backgroundDisabled:r[0],textLabel:r[9],textPlaceholder:r[8],textHint:r[8],textError:A[5],iconDefault:r[9],iconPlaceholder:r[10],iconError:A[5],borderDefault:r[4],borderSelected:B[3],borderError:A[5]},gs={handleDefault:U.white,handleDisabled:r[10],off:{backgroundDefault:r[4],backgroundHover:r[5],backgroundDisabled:r[4]},on:{backgroundDefault:I[3],backgroundHover:I[2],backgroundDisabled:r[4]}},Is={off:{backgroundDefault:"#00000000",backgroundHover:r[5],backgroundDisabled:r[2],border:r[6]},on:{backgroundDefault:I[0],backgroundHover:I[1],backgroundDisabled:r[2],border:I[3]}},hs={content:r[10],background:r[4]},Cs={background:r[4],active:I[3]},Ss={background:r[1],content:r[9],border:r[4]},bs={backgroundDefault:r[1],backgroundHover:r[3],backgroundActive:r[4],border:r[4],contentPrimary:r[10],contentSecondary:r[9],contentTertiary:r[8]},ws={background:r[1],content:r[9],border:r[4]},ks={activeBackground:r[3],activeContent:B[5],inactiveContent:r[9],border:r[4]},ys={header:{textDefault:r[9],textHover:r[8],backgroundDefault:r[1]},border:r[4],cell:{textPrimary:r[10],textSecondary:r[9],backgroundDefault:r[2],backgroundHover:r[1]}},Ps={textPrimaryDefault:r[10],textPrimaryHover:r[10],textSecondaryDefault:r[8],textSecondaryHover:r[9],iconPrimary:r[10],iconSecondary:r[8]},vs={background:I[1],active:I[5]},As={textDefault:r[10],textSelected:U.white,textDisabled:r[7],backgroundDefault:r[2],backgroundMiddle:r[3],backgroundSelected:B[3],border:r[4]},Ds=r[9];function Qe(){return typeof SynOS<"u"&&SynOS.ReactDOM||{}}var Us=new Proxy({},{get:function(e,t){return Qe()[t]}});function Be(){return Qe().createRoot.apply(null,arguments)}function ne(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}var q={container:{fontFamily:"system-ui, -apple-system, sans-serif",padding:"8px",maxWidth:"100%",overflow:"hidden"},accordion:{display:"flex",flexDirection:"column",gap:"4px"},item:{borderRadius:"8px",overflow:"hidden",transition:"box-shadow 0.2s ease"},header:{display:"flex",alignItems:"center",gap:"8px",width:"100%",padding:"12px 16px",border:"none",cursor:"pointer",fontSize:"14px",fontWeight:500,fontFamily:"inherit",textAlign:"left",transition:"background-color 0.15s ease"},chevron:{fontSize:"10px",transition:"transform 0.2s ease",marginLeft:"auto",flexShrink:0},icon:{fontSize:"16px",flexShrink:0},body:{overflow:"hidden",transition:"max-height 0.25s ease, padding-bottom 0.25s ease",padding:"0 16px"},description:{fontSize:"13px",lineHeight:"1.5",margin:0},linkButton:{display:"inline-flex",alignItems:"center",gap:"4px",marginTop:"10px",padding:"6px 12px",borderRadius:"6px",textDecoration:"none",fontSize:"13px",fontWeight:500,cursor:"pointer",border:"none",transition:"background-color 0.15s ease"},categoryHeader:{fontSize:"11px",fontWeight:600,textTransform:"uppercase",letterSpacing:"0.05em",padding:"12px 4px 4px"},emptyState:{fontSize:"13px",padding:"16px",textAlign:"center"}},ie={light:{container:{backgroundColor:U.white,color:r[1]},item:{backgroundColor:r[12],border:`1px solid ${r[11]}`},itemExpanded:{boxShadow:"0 4px 12px rgba(0, 0, 0, 0.08)"},header:{backgroundColor:"transparent",color:r[1]},headerHover:{backgroundColor:r[12]},body:{color:r[6]},linkButton:{backgroundColor:F[8],color:F[2]},categoryHeader:{color:r[7]},emptyState:{color:r[8]}},dark:{container:{backgroundColor:r[1],color:r[12]},item:{backgroundColor:r[3],border:`1px solid ${r[5]}`},itemExpanded:{boxShadow:"0 4px 12px rgba(0, 0, 0, 0.3)"},header:{backgroundColor:"transparent",color:r[12]},headerHover:{backgroundColor:r[5]},body:{color:r[8]},linkButton:{backgroundColor:F[0],color:F[6]},categoryHeader:{color:r[8]},emptyState:{color:r[7]}}};function Na({item:e,isExpanded:t,onToggle:a,onNavigate:l,theme:o}){let[d,f]=w(!1),n=ie[o],{title:p,description:m,href:g,icon:M,external:D}=e.config,b={...q.item,...n.item,...t?n.itemExpanded:{}},R={...q.header,...n.header,...d?n.headerHover:{}},W={...q.chevron,transform:t?"rotate(180deg)":"rotate(0deg)"},z={...q.body,...n.body,maxHeight:t?"500px":"0",paddingBottom:t?"16px":"0"},c=L=>{L.preventDefault(),L.stopPropagation(),g&&l(g,D??!1)};return i("div",{style:b,"data-nav-tip-id":e.config.id,children:[i("button",{type:"button",style:R,onClick:a,onMouseEnter:()=>f(!0),onMouseLeave:()=>f(!1),"aria-expanded":t,children:[M&&s("span",{style:q.icon,children:M}),s("span",{children:p}),s("span",{style:W,children:"\u25BC"})]}),i("div",{style:z,"aria-hidden":!t,children:[s("p",{style:q.description,children:m}),g&&i("a",{href:g,onClick:c,style:{...q.linkButton,...n.linkButton},target:D?"_blank":void 0,rel:D?"noopener noreferrer":void 0,children:["Go ",D?"\u2197":"\u2192"]})]})]})}function Ga({config:e,runtime:t,instanceId:a}){let[l,o]=qe(c=>c+1,0),[d,f]=w(new Set);P(()=>t.context.subscribe(()=>{o()}),[t.context]),P(()=>{if(t.accumulator?.subscribe)return t.accumulator.subscribe(()=>{o()})},[t.accumulator]),P(()=>{if(!e.scope||!t.accumulator?.register)return;let{events:c,urlContains:L,props:k}=e.scope,E=new Set;for(let G of e.actions)if(G.showWhen?.type==="rules")for(let $ of G.showWhen.rules)for(let O of $.conditions)O.type==="event_count"&&O.key&&E.add(O.key);for(let G of E)t.accumulator.register(G,$=>{if(!c.includes($.name)||L&&!String($.props?.pathname??"").includes(L))return!1;if(k){for(let[O,le]of Object.entries(k))if($.props?.[O]!==le)return!1}return!0})},[e.scope,e.actions,t.accumulator]);let n=_(()=>e.actions.filter(c=>{if(!c.showWhen)return!0;try{return t.evaluateSync(c.showWhen).value}catch{return!1}}),[e.actions,t,l]),p=_(()=>{let c=new Map;for(let L of n){let k=L.config.category;c.has(k)||c.set(k,[]),c.get(k).push(L)}return c},[n]),m=_(()=>n.some(c=>c.config.category),[n]),g=_(()=>e.theme!=="auto"?e.theme:typeof window<"u"&&window.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light",[e.theme]),M=C(c=>{f(L=>{let k=L.has(c),E;if(e.expandBehavior==="single"){for(let G of L)G!==c&&t.events.publish("nav:toggled",{instanceId:a,tipId:G,expanded:!1,timestamp:Date.now()});E=k?new Set:new Set([c])}else E=new Set(L),k?E.delete(c):E.add(c);return t.events.publish("nav:toggled",{instanceId:a,tipId:c,expanded:!k,timestamp:Date.now()}),E})},[e.expandBehavior,t.events,a]),D=C((c,L)=>{let k=c.trim().toLowerCase();k.startsWith("javascript:")||k.startsWith("data:")||(t.events.publish("nav:tip_clicked",{instanceId:a,href:c,external:L,timestamp:Date.now()}),L?window.open(c,"_blank","noopener,noreferrer"):window.location.href=c)},[t.events,a]),b={...q.container,...ie[g].container},R={...q.categoryHeader,...ie[g].categoryHeader},W={...q.emptyState,...ie[g].emptyState},z=c=>c.map(L=>s(Na,{item:L,isExpanded:d.has(L.config.id),onToggle:()=>M(L.config.id),onNavigate:D,theme:g},L.config.id));return n.length===0?s("div",{style:b,"data-adaptive-id":a,"data-adaptive-type":"adaptive-nav",children:s("div",{style:W,children:"No navigation tips available."})}):s("div",{style:b,"data-adaptive-id":a,"data-adaptive-type":"adaptive-nav",children:s("div",{style:q.accordion,children:m?Array.from(p.entries()).map(([c,L])=>i(ce.Fragment,{children:[c&&s("div",{style:R,"data-category-header":c,children:c}),z(L)]},c??"__ungrouped")):z(n)})})}var Je={mount(e,t){let{runtime:a,instanceId:l="nav-widget",...o}=t||{expandBehavior:"single",theme:"auto",actions:[]};if(a&&typeof Be=="function"){let f=Be(e);return f.render(ce.createElement(Ga,{config:o,runtime:a,instanceId:l})),()=>{f.unmount()}}let d=o.actions||[];return e.innerHTML=`
|
|
2
|
-
<div style="font-family: system-ui; max-width: 100%;">
|
|
3
|
-
${d.map(f=>`
|
|
4
|
-
<div style="margin-bottom: 4px; padding: 12px 16px; background: ${r[12]}; border-radius: 8px;">
|
|
5
|
-
${f.config.icon?`<span>${ne(f.config.icon)}</span> `:""}<strong>${ne(f.config.title)}</strong>
|
|
6
|
-
<p style="margin-top: 8px; color: ${r[6]}; font-size: 13px;">${ne(f.config.description)}</p>
|
|
7
|
-
${f.config.href?`<a href="${ne(f.config.href)}" style="color: ${F[2]}; font-size: 13px;">Go →</a>`:""}
|
|
8
|
-
</div>
|
|
9
|
-
`).join("")}
|
|
10
|
-
</div>
|
|
11
|
-
`,()=>{e.innerHTML=""}}};var Wa=async(e,t)=>{let a=t.resolveAnchor(e.anchorId);if(!a)throw new Error(`Anchor not found: ${e.anchorId}`);return a.scrollIntoView({behavior:e.behavior??"smooth",block:e.block??"center",inline:e.inline??"nearest"}),t.publishEvent("action.applied",{id:t.generateId(),kind:"navigation:scrollTo",anchorId:e.anchorId,behavior:e.behavior??"smooth"}),{cleanup:()=>{}}},za=async(e,t)=>{let a=e.url.trim();if(a.toLowerCase().startsWith("javascript:"))throw new Error("javascript: URLs are not allowed");let l=e.target??"_self";return t.publishEvent("action.applied",{id:t.generateId(),kind:"navigation:navigate",url:e.url,target:l}),l==="_blank"?window.open(a,"_blank","noopener,noreferrer"):window.location.href=a,{cleanup:()=>{}}},Me=[{kind:"navigation:scrollTo",executor:Wa},{kind:"navigation:navigate",executor:za}],re={id:"adaptive-nav",version:"2.0.0",name:"Navigation Tips",description:"Navigation actions and accordion-based tips with per-item conditional visibility",executors:Me,widgets:[{id:"adaptive-nav:tips",component:Je,metadata:{name:"Navigation Tips",description:"Accordion of contextual navigation tips with per-item visibility",icon:"\u{1F9ED}"}}]};var Ye={id:"adaptive-nav",version:re.version,name:re.name,description:re.description,runtime:{actions:Me.map(({kind:e,executor:t})=>({kind:e,executor:t})),widgets:re.widgets,notifyWatchers(e){return(e.actions??[]).filter(a=>a.notify&&a.showWhen).map(a=>({id:`nav:${a.config.id}`,strategy:a.showWhen,eventName:"nav:tip_revealed",eventProps:{tipId:a.config.id,title:a.notify.title,body:a.notify.body,icon:a.notify.icon}}))}},editor:{component:Ze,panel:Ke,getActionLabel(e){return(e.config||{}).title||e.kind||"nav:tip"}},metadata:{isBuiltIn:!1}};if(typeof window<"u"){let e=window.SynOS?.appRegistry;e&&typeof e.register=="function"&&e.register(Ye)}var Zs=Ye;export{Zs as default,Ye as manifest};
|
|
12
|
-
/*! Bundled license information:
|
|
13
|
-
|
|
14
|
-
lucide-react/dist/esm/shared/src/utils.js:
|
|
15
|
-
lucide-react/dist/esm/defaultAttributes.js:
|
|
16
|
-
lucide-react/dist/esm/Icon.js:
|
|
17
|
-
lucide-react/dist/esm/createLucideIcon.js:
|
|
18
|
-
lucide-react/dist/esm/icons/check.js:
|
|
19
|
-
lucide-react/dist/esm/lucide-react.js:
|
|
20
|
-
(**
|
|
21
|
-
* @license lucide-react v0.539.0 - ISC
|
|
22
|
-
*
|
|
23
|
-
* This source code is licensed under the ISC license.
|
|
24
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
25
|
-
*)
|
|
26
|
-
*/
|
|
27
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../shared-editor-ui/dist/cn.js", "syntro-react:react/jsx-runtime", "syntro-react:react", "syntro-react:react-dom", "../../../../../node_modules/css-selector-generator/src/types.ts", "../../../../../node_modules/css-selector-generator/src/utilities-messages.ts", "../../../../../node_modules/css-selector-generator/src/utilities-options.ts", "../../../../../node_modules/css-selector-generator/src/utilities-data.ts", "../../../../../node_modules/css-selector-generator/src/constants.ts", "../../../../../node_modules/css-selector-generator/src/selector-attribute.ts", "../../../../../node_modules/css-selector-generator/src/utilities-selectors.ts", "../../../../../node_modules/shared/src/utils.ts", "../../../../../node_modules/lucide-react/src/defaultAttributes.ts", "../../../../../node_modules/lucide-react/src/Icon.ts", "../../../../../node_modules/lucide-react/src/createLucideIcon.ts", "../../../../../node_modules/lucide-react/src/icons/check.ts", "../../../../shared-editor-ui/dist/components/DetectionBadge.js", "../../../../shared-editor-ui/dist/components/DismissedSection.js", "../../../../shared-editor-ui/dist/components/EditorBody.js", "../../../../shared-editor-ui/dist/components/EditorCard.js", "../../../../shared-editor-ui/dist/components/EditorFooter.js", "../../../../shared-editor-ui/dist/components/EditorHeader.js", "../../../../shared-editor-ui/dist/components/EditorInput.js", "../../../../shared-editor-ui/dist/components/EditorLayout.js", "../../../../shared-editor-ui/dist/components/EmptyState.js", "../../../../shared-editor-ui/dist/components/TriggerJourney.js", "../../../../shared-editor-ui/dist/components/GroupHeader.js", "../../../../shared-editor-ui/dist/formatConditionLabel.js", "../../../../shared-editor-ui/dist/hooks/useShowWhenStatus.js", "../../../../adaptives/adaptive-nav/src/summarize.ts", "../../../../adaptives/adaptive-nav/src/types.ts", "../../../../adaptives/adaptive-nav/src/editor.tsx", "../../../../design-system/dist/tokens/colors.js", "syntro-react:react-dom/client", "../../../../adaptives/adaptive-nav/src/NavWidget.tsx", "../../../../adaptives/adaptive-nav/src/runtime.ts", "../../../../adaptives/adaptive-nav/src/cdn.ts"],
|
|
4
|
-
"sourcesContent": ["export function cn(...classes) {\n return classes.filter(Boolean).join(' ');\n}\n", "\n function _R() {\n return (typeof SynOS !== 'undefined' && SynOS.React) || {};\n }\n function _jsx(type, props, key) {\n var R = _R();\n var p = props || {};\n var c = p.children;\n delete p.children;\n if (key !== undefined) p.key = key;\n return Array.isArray(c)\n ? R.createElement.apply(null, [type, p].concat(c))\n : c !== undefined\n ? R.createElement(type, p, c)\n : R.createElement(type, p);\n }\n export var jsx = _jsx;\n export var jsxs = _jsx;\n export var Fragment = _R().Fragment;\n ", "\n function _R() {\n return (typeof SynOS !== 'undefined' && SynOS.React) || {};\n }\n\n // Default export \u2014 lazy proxy for React.* access\n export default new Proxy({}, { get: function(_, k) { return _R()[k]; } });\n\n // Hooks \u2014 lazy function wrappers (resolve at call time)\n export function useState() { return _R().useState.apply(null, arguments); }\n export function useEffect() { return _R().useEffect.apply(null, arguments); }\n export function useMemo() { return _R().useMemo.apply(null, arguments); }\n export function useCallback() { return _R().useCallback.apply(null, arguments); }\n export function useRef() { return _R().useRef.apply(null, arguments); }\n export function useContext() { return _R().useContext.apply(null, arguments); }\n export function useReducer() { return _R().useReducer.apply(null, arguments); }\n export function useLayoutEffect() { return _R().useLayoutEffect.apply(null, arguments); }\n export function useId() { return _R().useId.apply(null, arguments); }\n\n // Creation APIs \u2014 lazy function wrappers\n export function createElement() { return _R().createElement.apply(null, arguments); }\n export function createContext() { return _R().createContext.apply(null, arguments); }\n export function forwardRef() { return _R().forwardRef.apply(null, arguments); }\n export function memo() { return _R().memo.apply(null, arguments); }\n export function lazy() { return _R().lazy.apply(null, arguments); }\n export function isValidElement() { return _R().isValidElement.apply(null, arguments); }\n export function cloneElement() { return _R().cloneElement.apply(null, arguments); }\n\n // Component types \u2014 resolved at module eval (runtime loads first)\n var _r = _R();\n export var Fragment = _r.Fragment;\n export var Suspense = _r.Suspense;\n export var Children = _r.Children;\n export var Component = _r.Component;\n export var PureComponent = _r.PureComponent;\n ", "\n function _RD() {\n return (typeof SynOS !== 'undefined' && SynOS.ReactDOM) || {};\n }\n export default new Proxy({}, { get: function(_, k) { return _RD()[k]; } });\n export function createRoot() { return _RD().createRoot.apply(null, arguments); }\n export function hydrateRoot() { return _RD().hydrateRoot.apply(null, arguments); }\n export function createPortal() { return _RD().createPortal.apply(null, arguments); }\n export function flushSync() { return _RD().flushSync.apply(null, arguments); }\n ", "declare const opaqueId: unique symbol;\n\ndeclare interface Tagged<Token> {\n readonly [opaqueId]: Token;\n}\n\nexport type Opaque<Type, Token = unknown> = Type & Tagged<Token>;\n\nexport type ObjectValues<T> = T[keyof T];\n\n// TODO rename to \"CssSelector\"\nexport type CssSelectorGenerated = Opaque<string, \"CssSelector\">;\n\nexport const OPERATOR = {\n NONE: \"\",\n DESCENDANT: \" \",\n CHILD: \" > \",\n} as const;\n\nexport type OperatorValue = ObjectValues<typeof OPERATOR>;\n\nexport interface ElementSelectorData {\n value: CssSelectorGenerated;\n include: boolean;\n}\n\nexport interface ElementData {\n element: Element;\n operator: OperatorValue;\n selectors: Partial<Record<CssSelectorType, ElementSelectorData[]>>;\n}\n\nexport type CssSelector = string;\nexport type CssSelectors = CssSelector[];\n\ntype CssSelectorMatchFn = (input: string) => boolean;\nexport type CssSelectorMatch = RegExp | string | CssSelectorMatchFn;\n\nexport const CSS_SELECTOR_TYPE = {\n id: \"id\",\n class: \"class\",\n tag: \"tag\",\n attribute: \"attribute\",\n nthchild: \"nthchild\",\n nthoftype: \"nthoftype\",\n} as const;\n\nexport type CssSelectorType = ObjectValues<typeof CSS_SELECTOR_TYPE>;\nexport type CssSelectorTypes = CssSelectorType[];\n\nexport type CssSelectorsByType = Partial<Record<CssSelectorType, CssSelectors>>;\n\nexport type CssSelectorData = Partial<\n Record<CssSelectorType, string[] | string[][]>\n>;\n\nexport type CssSelectorGeneratorOptionsInput = Partial<{\n // List of selector types to use. They will be prioritised by their order.\n selectors: CssSelectorTypes;\n // List of selectors that should be prioritised.\n whitelist: CssSelectorMatch[];\n // List of selectors that should be ignored.\n blacklist: CssSelectorMatch[];\n // Root element inside which the selector will be generated. If not set, the document root will be used.\n root: ParentNode | null;\n // If set to `true`, the generator will test combinations of selectors of single type (e.g. multiple class selectors).\n combineWithinSelector: boolean;\n // If set to `true`, the generator will try to test combinations of selectors of different types (e.g. tag + class name).\n combineBetweenSelectors: boolean;\n // If set to `true`, all generated selectors will include the TAG part. Even if tag selector type is not included in `selectors` option.\n includeTag: boolean;\n // Maximum number of combinations of a selector type. This is handy for performance reasons, e.g. when elements have too many classnames.\n maxCombinations: number;\n // Maximum number of selector candidates to be tested for each element. This is handy for performance reasons, e.g. when elements can produce large number of combinations of various types of selectors.\n maxCandidates: number;\n // Experimental. If set to `true` and the \"root\" option is set, the fallback selectors will use \":scope\" pseudo-class to make the selectors shorter and simpler.\n useScope: boolean;\n // Limits the number of results (selectors) to be generated.\n maxResults: number;\n}>;\n\nexport type CssSelectorGeneratorOptions = Required<\n Omit<CssSelectorGeneratorOptionsInput, \"selectors\"> & {\n selectors: CssSelectorTypes;\n }\n>;\n\nexport interface IdentifiableParent {\n foundElements: Element[];\n selector: CssSelector;\n}\n\nexport type PatternMatcher = (input: string) => boolean;\n", "const libraryName = \"CssSelectorGenerator\";\n\n/**\n * Convenient wrapper for `console.warn` using consistent formatting.\n */\nexport function showWarning(id = \"unknown problem\", ...args: unknown[]): void {\n // eslint-disable-next-line no-console\n console.warn(`${libraryName}: ${id}`, ...args);\n}\n", "import {\n CSS_SELECTOR_TYPE,\n CssSelectorGeneratorOptions,\n CssSelectorMatch,\n CssSelectorTypes,\n} from \"./types.js\";\nimport { getRootNode } from \"./utilities-dom.js\";\nimport { isEnumValue } from \"./utilities-typescript.js\";\nimport { showWarning } from \"./utilities-messages.js\";\n\nexport const DEFAULT_OPTIONS = {\n selectors: [\n CSS_SELECTOR_TYPE.id,\n CSS_SELECTOR_TYPE.class,\n CSS_SELECTOR_TYPE.tag,\n CSS_SELECTOR_TYPE.attribute,\n ] as CssSelectorTypes,\n // if set to true, always include tag name\n includeTag: false,\n whitelist: [] as CssSelectorMatch[],\n blacklist: [] as CssSelectorMatch[],\n combineWithinSelector: true,\n combineBetweenSelectors: true,\n root: null,\n maxCombinations: Number.POSITIVE_INFINITY,\n maxCandidates: Number.POSITIVE_INFINITY,\n useScope: false,\n} as CssSelectorGeneratorOptions;\n\n/**\n * Makes sure returned value is a list containing only valid selector types.\n * @param input\n */\nexport function sanitizeSelectorTypes(input: unknown): CssSelectorTypes {\n if (!Array.isArray(input)) {\n return [];\n }\n return input.filter((item) => isEnumValue(CSS_SELECTOR_TYPE, item));\n}\n\n/**\n * Checks whether provided value is of type RegExp.\n */\nexport function isRegExp(input: unknown): input is RegExp {\n return input instanceof RegExp;\n}\n\n/**\n * Checks whether provided value is usable in whitelist or blacklist.\n * @param input\n */\nexport function isCssSelectorMatch(input: unknown): input is CssSelectorMatch {\n return [\"string\", \"function\"].includes(typeof input) || isRegExp(input);\n}\n\n/**\n * Converts input to a list of valid values for whitelist or blacklist.\n */\nexport function sanitizeCssSelectorMatchList(\n input: unknown,\n): CssSelectorMatch[] {\n if (!Array.isArray(input)) {\n return [];\n }\n return input.filter(isCssSelectorMatch);\n}\n\n/**\n * Checks whether provided value is valid Node.\n */\nexport function isNode(input: unknown): input is Node {\n return input instanceof Node;\n}\n\n/**\n * Checks whether provided value is valid ParentNode.\n */\nexport function isParentNode(input: unknown): input is ParentNode {\n const validParentNodeTypes: number[] = [\n Node.DOCUMENT_NODE,\n Node.DOCUMENT_FRAGMENT_NODE, // this includes Shadow DOM root\n Node.ELEMENT_NODE,\n ];\n\n return isNode(input) && validParentNodeTypes.includes(input.nodeType);\n}\n\n/**\n * Makes sure that the root node in options is valid.\n */\nexport function sanitizeRoot(input: unknown, element: Element): ParentNode {\n if (isParentNode(input)) {\n if (!input.contains(element)) {\n showWarning(\n \"element root mismatch\",\n \"Provided root does not contain the element. This will most likely result in producing a fallback selector using element's real root node. If you plan to use the selector using provided root (e.g. `root.querySelector`), it will not work as intended.\",\n );\n }\n return input;\n }\n\n const rootNode = element.getRootNode({ composed: false });\n if (isParentNode(rootNode)) {\n if (rootNode !== document) {\n showWarning(\n \"shadow root inferred\",\n \"You did not provide a root and the element is a child of Shadow DOM. This will produce a selector using ShadowRoot as a root. If you plan to use the selector using document as a root (e.g. `document.querySelector`), it will not work as intended.\",\n );\n }\n return rootNode;\n }\n\n return getRootNode(element);\n}\n\n/**\n * Makes sure that the output is a number, usable as `maxResults` option in\n * powerset generator.\n */\nexport function sanitizeMaxNumber(input?: unknown): number {\n return typeof input === \"number\" ? input : Number.POSITIVE_INFINITY;\n}\n\n/**\n * Makes sure the options object contains all required keys.\n */\nexport function sanitizeOptions(\n element: Element,\n custom_options = {},\n): CssSelectorGeneratorOptions {\n const options = {\n ...DEFAULT_OPTIONS,\n ...custom_options,\n };\n\n return {\n selectors: sanitizeSelectorTypes(options.selectors),\n whitelist: sanitizeCssSelectorMatchList(options.whitelist),\n blacklist: sanitizeCssSelectorMatchList(options.blacklist),\n root: sanitizeRoot(options.root, element),\n combineWithinSelector: !!options.combineWithinSelector,\n combineBetweenSelectors: !!options.combineBetweenSelectors,\n includeTag: !!options.includeTag,\n maxCombinations: sanitizeMaxNumber(options.maxCombinations),\n maxCandidates: sanitizeMaxNumber(options.maxCandidates),\n useScope: !!options.useScope,\n maxResults: sanitizeMaxNumber(options.maxResults),\n };\n}\n", "import { CssSelectorMatch, PatternMatcher } from \"./types.js\";\nimport { isRegExp } from \"./utilities-options.js\";\nimport { showWarning } from \"./utilities-messages.js\";\n\n/**\n * Creates array containing only items included in all input arrays.\n */\nexport function getIntersection<T>(items: T[][] = []): T[] {\n const [firstItem = [], ...otherItems] = items;\n if (otherItems.length === 0) {\n return firstItem;\n }\n return otherItems.reduce((accumulator, currentValue) => {\n return accumulator.filter((item) => currentValue.includes(item));\n }, firstItem);\n}\n\n/**\n * Converts array of arrays into a flat array.\n */\nexport function flattenArray<T>(input: T[][]): T[] {\n return ([] as T[]).concat(...input);\n}\n\n/**\n * Convert string that can contain wildcards (asterisks) to RegExp source.\n */\nexport function wildcardToRegExp(input: string): string {\n return (\n input\n // convert all special characters used by RegExp, except an asterisk\n .replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\")\n // convert asterisk to pattern that matches anything\n .replace(/\\*/g, \".+\")\n );\n}\n\n/**\n * Creates function that will test list of provided matchers against input.\n * Used for white/blacklist functionality.\n */\nexport function createPatternMatcher(list: CssSelectorMatch[]): PatternMatcher {\n const matchFunctions = list.map((item) => {\n if (isRegExp(item)) {\n return (input: string) => item.test(input);\n }\n\n if (typeof item === \"function\") {\n return (input: string) => {\n const result = item(input);\n if (typeof result !== \"boolean\") {\n showWarning(\n \"pattern matcher function invalid\",\n \"Provided pattern matching function does not return boolean. It's result will be ignored.\",\n item,\n );\n return false;\n }\n return result;\n };\n }\n\n if (typeof item === \"string\") {\n const re = new RegExp(\"^\" + wildcardToRegExp(item) + \"$\");\n return (input: string) => re.test(input);\n }\n\n showWarning(\n \"pattern matcher invalid\",\n \"Pattern matching only accepts strings, regular expressions and/or functions. This item is invalid and will be ignored.\",\n item,\n );\n return () => false;\n });\n\n return (input: string) =>\n matchFunctions.some((matchFunction) => matchFunction(input));\n}\n", "import { CSS_SELECTOR_TYPE } from \"./types.js\";\n\nexport const SELECTOR_SEPARATOR = \", \";\n\n// RegExp that will match invalid patterns that can be used in ID attribute.\nexport const INVALID_ID_RE = new RegExp(\n [\n \"^$\", // empty or not set\n \"\\\\s\", // contains whitespace\n ].join(\"|\"),\n);\n\n// RegExp that will match invalid patterns that can be used in class attribute.\nexport const INVALID_CLASS_RE = new RegExp(\n [\n \"^$\", // empty or not set\n ].join(\"|\"),\n);\n\n// Order in which a combined selector is constructed.\nexport const SELECTOR_PATTERN = [\n CSS_SELECTOR_TYPE.nthoftype,\n CSS_SELECTOR_TYPE.tag,\n CSS_SELECTOR_TYPE.id,\n CSS_SELECTOR_TYPE.class,\n CSS_SELECTOR_TYPE.attribute,\n CSS_SELECTOR_TYPE.nthchild,\n];\n", "import { sanitizeSelectorItem } from \"./utilities-selectors.js\";\nimport { createPatternMatcher, getIntersection } from \"./utilities-data.js\";\nimport { CssSelectorGenerated } from \"./types.js\";\n\ninterface AttributeData {\n name: string;\n value: string;\n}\n\n// List of attributes to be ignored. These are handled by different selector types.\nexport const attributeBlacklistMatch = createPatternMatcher([\n \"class\",\n \"id\",\n // Angular attributes\n \"ng-*\",\n]);\n\n/**\n * Get simplified attribute selector for an element.\n */\nexport function attributeNodeToSimplifiedSelector({\n name,\n}: AttributeData): CssSelectorGenerated {\n return `[${name}]` as CssSelectorGenerated;\n}\n\n/**\n * Get attribute selector for an element.\n */\nexport function attributeNodeToSelector({\n name,\n value,\n}: AttributeData): CssSelectorGenerated {\n return `[${name}='${value}']` as CssSelectorGenerated;\n}\n\n/**\n * Checks whether an attribute should be used as a selector.\n */\nexport function isValidAttributeNode(\n { nodeName, nodeValue }: Node,\n element: Element,\n): boolean {\n // form input value should not be used as a selector\n const tagName = element.tagName.toLowerCase();\n if ([\"input\", \"option\"].includes(tagName) && nodeName === \"value\") {\n return false;\n }\n\n // ignore Base64-encoded strings as 'src' attribute values (e.g. in tags like img, audio, video, iframe, object, embed).\n if (nodeName === \"src\" && nodeValue?.startsWith(\"data:\")) {\n return false;\n }\n\n return !attributeBlacklistMatch(nodeName);\n}\n\n/**\n * Sanitize all attribute data. We want to do it once, before we start to generate simplified/full selectors from the same data.\n */\nfunction sanitizeAttributeData({ nodeName, nodeValue }: Node): AttributeData {\n return {\n name: sanitizeSelectorItem(nodeName),\n value: sanitizeSelectorItem(nodeValue ?? undefined),\n };\n}\n\n/**\n * Get attribute selectors for an element.\n */\nexport function getElementAttributeSelectors(\n element: Element,\n): CssSelectorGenerated[] {\n const validAttributes = Array.from(element.attributes)\n .filter((attributeNode) => isValidAttributeNode(attributeNode, element))\n .map(sanitizeAttributeData);\n return [\n ...validAttributes.map(attributeNodeToSimplifiedSelector),\n ...validAttributes.map(attributeNodeToSelector),\n ];\n}\n\n/**\n * Get attribute selectors matching all elements.\n */\nexport function getAttributeSelectors(\n elements: Element[],\n): CssSelectorGenerated[] {\n const elementSelectors = elements.map(getElementAttributeSelectors);\n return getIntersection(elementSelectors);\n}\n", "import { SELECTOR_PATTERN } from \"./constants.js\";\nimport {\n getAttributeSelectors,\n getElementAttributeSelectors,\n} from \"./selector-attribute.js\";\nimport {\n getClassSelectors,\n getElementClassSelectors,\n} from \"./selector-class.js\";\nimport { getElementIdSelectors, getIdSelector } from \"./selector-id.js\";\nimport {\n getElementNthChildSelector,\n getNthChildSelector,\n} from \"./selector-nth-child.js\";\nimport {\n getElementNthOfTypeSelector,\n getNthOfTypeSelector,\n} from \"./selector-nth-of-type.js\";\nimport { getElementTagSelectors, getTagSelector } from \"./selector-tag.js\";\nimport { createPatternMatcher } from \"./utilities-data.js\";\nimport { getParents, testSelector } from \"./utilities-dom.js\";\nimport {\n CSS_SELECTOR_TYPE,\n CssSelector,\n CssSelectorData,\n CssSelectorGenerated,\n CssSelectorGeneratorOptions,\n CssSelectorType,\n CssSelectorTypes,\n IdentifiableParent,\n OPERATOR,\n PatternMatcher,\n} from \"./types.js\";\nimport { isElement } from \"./utilities-iselement.js\";\nimport { getPowerSet, powerSetGenerator } from \"./utilities-powerset.js\";\nimport { cartesianProductGenerator } from \"./utilities-cartesian.js\";\n\nexport const ESCAPED_COLON = \":\".charCodeAt(0).toString(16).toUpperCase();\n\n// Square brackets need to be escaped, but eslint has a problem with that.\n/* eslint-disable-next-line no-useless-escape */\nexport const SPECIAL_CHARACTERS_RE = /[ !\"#$%&'()\\[\\]{|}<>*+,./;=?@^`~\\\\]/;\n\n/**\n * Escapes special characters used by CSS selector items.\n */\nexport function sanitizeSelectorItem(input = \"\"): string {\n // This should not be necessary, but just to be sure, let's keep the legacy sanitizer in place, for backwards compatibility.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return CSS ? CSS.escape(input) : legacySanitizeSelectorItem(input);\n}\n\n/**\n * Legacy version of escaping utility, originally used for IE11-. Should\n * probably be replaced by a polyfill:\n * https://github.com/mathiasbynens/CSS.escape\n */\nexport function legacySanitizeSelectorItem(input = \"\"): string {\n return input\n .split(\"\")\n .map((character) => {\n if (character === \":\") {\n return `\\\\${ESCAPED_COLON} `;\n }\n if (SPECIAL_CHARACTERS_RE.test(character)) {\n return `\\\\${character}`;\n }\n\n // needed for backwards compatibility\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return escape(character).replace(/%/g, \"\\\\\");\n })\n .join(\"\");\n}\n\nexport const SELECTOR_TYPE_GETTERS: Record<\n CssSelectorType,\n (elements: Element[]) => CssSelector[]\n> = {\n tag: getTagSelector,\n id: getIdSelector,\n class: getClassSelectors,\n attribute: getAttributeSelectors,\n nthchild: getNthChildSelector,\n nthoftype: getNthOfTypeSelector,\n} as const;\n\nexport const ELEMENT_SELECTOR_TYPE_GETTERS: Record<\n CssSelectorType,\n (element: Element) => CssSelectorGenerated[]\n> = {\n tag: getElementTagSelectors,\n id: getElementIdSelectors,\n class: getElementClassSelectors,\n attribute: getElementAttributeSelectors,\n nthchild: getElementNthChildSelector,\n nthoftype: getElementNthOfTypeSelector,\n} as const;\n\n/**\n * Creates selector of given type for single element.\n */\nexport function getElementSelectorsByType(\n element: Element,\n selectorType: CssSelectorType,\n): CssSelectorGenerated[] {\n return ELEMENT_SELECTOR_TYPE_GETTERS[selectorType](element);\n}\n\n/**\n * Returns list of selectors of given type for the element.\n */\nexport function getSelectorsByType(\n elements: Element[],\n selector_type: CssSelectorType,\n): CssSelector[] {\n const getter = SELECTOR_TYPE_GETTERS[selector_type];\n return getter(elements);\n}\n\n/**\n * Remove blacklisted selectors from list.\n */\nexport function filterSelectors(\n list: CssSelector[] = [],\n matchBlacklist: PatternMatcher,\n matchWhitelist: PatternMatcher,\n): CssSelector[] {\n return list.filter((item) => matchWhitelist(item) || !matchBlacklist(item));\n}\n\n/**\n * Prioritise whitelisted selectors in list.\n */\nexport function orderSelectors(\n list: CssSelector[] = [],\n matchWhitelist: PatternMatcher,\n): CssSelector[] {\n return list.sort((a, b) => {\n const a_is_whitelisted = matchWhitelist(a);\n const b_is_whitelisted = matchWhitelist(b);\n if (a_is_whitelisted && !b_is_whitelisted) {\n return -1;\n }\n if (!a_is_whitelisted && b_is_whitelisted) {\n return 1;\n }\n return 0;\n });\n}\n\n/**\n * Yields list of unique selectors applicable to given element.\n */\nexport function* allSelectorsGenerator(\n elements: Element[],\n options: CssSelectorGeneratorOptions,\n): IterableIterator<CssSelector> {\n const yieldedSelectors = new Set<string>();\n const selectors_list = getSelectorsList(elements, options);\n for (const selector of selectorTypeCombinationsGenerator(\n selectors_list,\n options,\n )) {\n if (!yieldedSelectors.has(selector)) {\n yieldedSelectors.add(selector);\n yield selector;\n }\n }\n}\n\n/**\n * Creates object containing all selector types and their potential values.\n */\nexport function getSelectorsList(\n elements: Element[],\n options: CssSelectorGeneratorOptions,\n): CssSelectorData {\n const { blacklist, whitelist, combineWithinSelector, maxCombinations } =\n options;\n\n const matchBlacklist = createPatternMatcher(blacklist);\n const matchWhitelist = createPatternMatcher(whitelist);\n\n const reducer = (data: CssSelectorData, selector_type: CssSelectorType) => {\n const selectors_by_type = getSelectorsByType(elements, selector_type);\n const filtered_selectors = filterSelectors(\n selectors_by_type,\n matchBlacklist,\n matchWhitelist,\n );\n const found_selectors = orderSelectors(filtered_selectors, matchWhitelist);\n\n // Use Array.from with a length limit to avoid materializing huge power sets\n // This provides lazy evaluation while respecting maxCombinations\n data[selector_type] = combineWithinSelector\n ? Array.from(\n powerSetGenerator(found_selectors, { maxResults: maxCombinations }),\n )\n : found_selectors.map((item) => [item]);\n\n return data;\n };\n\n return getSelectorsToGet(options).reduce(reducer, {});\n}\n\n/**\n * Creates list of selector types that we will need to generate the selector.\n */\nexport function getSelectorsToGet(\n options: CssSelectorGeneratorOptions,\n): CssSelectorTypes {\n const { selectors, includeTag } = options;\n\n const selectors_to_get = [...selectors];\n if (includeTag && !selectors_to_get.includes(\"tag\")) {\n selectors_to_get.push(\"tag\");\n }\n return selectors_to_get;\n}\n\n/**\n * Adds \"tag\" to a list, if it does not contain it. Used to modify selectors\n * list when includeTag option is enabled to make sure all results contain the\n * TAG part.\n */\nfunction addTagTypeIfNeeded(list: CssSelectorTypes): CssSelectorTypes {\n return list.includes(CSS_SELECTOR_TYPE.tag) ||\n list.includes(CSS_SELECTOR_TYPE.nthoftype)\n ? [...list]\n : [...list, CSS_SELECTOR_TYPE.tag];\n}\n\n/**\n * Generates list of possible selector type combinations.\n */\nexport function combineSelectorTypes(\n options: CssSelectorGeneratorOptions,\n): CssSelectorTypes[] {\n const { selectors, combineBetweenSelectors, includeTag, maxCandidates } =\n options;\n\n const combinations = combineBetweenSelectors\n ? getPowerSet(selectors, { maxResults: maxCandidates })\n : selectors.map((item) => [item]);\n\n return includeTag ? combinations.map(addTagTypeIfNeeded) : combinations;\n}\n\n/**\n * Generates list of combined CSS selectors.\n */\nexport function* selectorTypeCombinationsGenerator(\n selectors_list: CssSelectorData,\n options: CssSelectorGeneratorOptions,\n): IterableIterator<CssSelector> {\n for (const item of combineSelectorTypes(options)) {\n yield* constructedSelectorsGenerator(item, selectors_list);\n }\n}\n\n/**\n * Generates all variations of possible selectors from provided data.\n */\nexport function* constructedSelectorsGenerator(\n selector_types: CssSelectorTypes,\n selectors_by_type: CssSelectorData,\n): IterableIterator<CssSelector> {\n const data: CssSelectorData = {};\n\n for (const selector_type of selector_types) {\n const selector_variants = selectors_by_type[selector_type];\n if (selector_variants && selector_variants.length > 0) {\n data[selector_type] = selector_variants;\n }\n }\n\n for (const combination of cartesianProductGenerator<string | string[]>(\n data,\n )) {\n yield constructSelector(combination);\n }\n}\n\n/**\n * Creates selector for given selector type. Combines several parts if needed.\n */\nexport function constructSelectorType(\n selector_type: CssSelectorType,\n selectors_data: CssSelectorData,\n): CssSelector {\n return selectors_data[selector_type]\n ? selectors_data[selector_type].join(\"\")\n : \"\";\n}\n\n/**\n * Converts selector data object to a selector.\n */\nexport function constructSelector(\n selectorData: CssSelectorData = {},\n): CssSelector {\n const pattern = [...SELECTOR_PATTERN];\n // selector \"nthoftype\" already contains \"tag\"\n if (\n selectorData[CSS_SELECTOR_TYPE.tag] &&\n selectorData[CSS_SELECTOR_TYPE.nthoftype]\n ) {\n pattern.splice(pattern.indexOf(CSS_SELECTOR_TYPE.tag), 1);\n }\n\n return pattern\n .map((type) => constructSelectorType(type, selectorData))\n .join(\"\");\n}\n\n/**\n * Generates combinations of child and descendant selectors within root\n * selector.\n */\nfunction generateCandidateCombinations(\n selectors: CssSelector[],\n rootSelector: CssSelector,\n): CssSelector[] {\n return [\n ...selectors.map(\n (selector) => rootSelector + OPERATOR.DESCENDANT + selector,\n ),\n ...selectors.map((selector) => rootSelector + OPERATOR.CHILD + selector),\n ];\n}\n\n/**\n * Generates a list of selector candidates that can potentially match target\n * element.\n */\nfunction* candidatesGenerator(\n selectors: IterableIterator<CssSelector>,\n rootSelector: CssSelector,\n): IterableIterator<CssSelector> {\n if (rootSelector === \"\") {\n yield* selectors;\n } else {\n for (const selector of selectors) {\n yield* generateCandidateCombinations([selector], rootSelector);\n }\n }\n}\n\n/**\n * Tries to find unique CSS selectors for element within given parent.\n */\nexport function* selectorWithinRootGenerator(\n elements: Element[],\n root: ParentNode,\n rootSelector: CssSelector = \"\",\n options: CssSelectorGeneratorOptions,\n): IterableIterator<CssSelector, undefined> {\n const elementSelectorsIterator = allSelectorsGenerator(elements, options);\n for (const candidateSelector of candidatesGenerator(\n elementSelectorsIterator,\n rootSelector,\n )) {\n if (testSelector(elements, candidateSelector, root)) {\n yield candidateSelector;\n }\n }\n // TODO remove the `undefined` return value when the main function is rewritten to use the generator directly\n return;\n}\n/**\n * Climbs through parents of the element and finds the ones that are identifiable by unique CSS selector.\n */\nexport function* closestIdentifiableParentGenerator(\n elements: Element[],\n root: ParentNode,\n rootSelector: CssSelector = \"\",\n options: CssSelectorGeneratorOptions,\n): IterableIterator<IdentifiableParent> {\n if (elements.length === 0) {\n return null;\n }\n\n const candidatesList = [\n elements.length > 1 ? elements : [],\n ...getParents(elements, root).map((element) => [element]),\n ];\n\n for (const currentElements of candidatesList) {\n for (const selectorWithinRoot of selectorWithinRootGenerator(\n currentElements,\n root,\n rootSelector,\n options,\n )) {\n yield {\n foundElements: currentElements,\n selector: selectorWithinRoot,\n };\n }\n }\n}\n\ninterface SelectorGeneratorProps {\n elements: Element[];\n root: ParentNode;\n rootSelector: CssSelector;\n options: CssSelectorGeneratorOptions;\n}\n\n/**\n * Recursively travels through parents, finds the ones that are identifiable and then tries to find a unique selector within that context.\n */\nexport function* selectorGenerator({\n elements,\n root,\n rootSelector = \"\",\n options,\n}: SelectorGeneratorProps): IterableIterator<CssSelector> {\n let currentRoot = root;\n let partialSelector = rootSelector;\n let shouldContinue = true;\n\n while (shouldContinue) {\n let foundAny = false;\n\n for (const item of closestIdentifiableParentGenerator(\n elements,\n currentRoot,\n partialSelector,\n options,\n )) {\n const { foundElements, selector } = item;\n foundAny = true;\n\n if (testSelector(elements, selector, root)) {\n yield selector;\n } else {\n // First non-matching selector - use its parent for next iteration\n currentRoot = foundElements[0];\n partialSelector = selector;\n break; // Try from this parent in next iteration\n }\n }\n\n if (!foundAny) {\n shouldContinue = false;\n }\n }\n}\n\n/**\n * Converts input into list of elements, removing duplicates and non-elements.\n */\nexport function sanitizeSelectorNeedle(needle: unknown): Element[] {\n if (needle instanceof NodeList || needle instanceof HTMLCollection) {\n needle = Array.from(needle);\n }\n const elements = (Array.isArray(needle) ? needle : [needle]).filter(\n isElement,\n );\n return [...new Set(elements)];\n}\n", "import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n", "export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n", "import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n", "import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n", "import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'M20 6 9 17l-5-5', key: '1gmf2c' }]];\n\n/**\n * @component @name Check\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Check = createLucideIcon('check', __iconNode);\n\nexport default Check;\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function DetectionBadge({ found }) {\n return (_jsx(\"span\", { className: cn('se-w-2 se-h-2 se-rounded-full se-shrink-0 se-inline-block', found ? 'se-bg-green-4' : 'se-bg-text-tertiary'), title: found ? 'Found on this page' : 'Not found on this page' }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState } from 'react';\nexport function DismissedSection({ count, children }) {\n const [isOpen, setIsOpen] = useState(false);\n return (_jsxs(\"div\", { className: \"se-mt-4 se-cursor-pointer se-select-none\", children: [_jsxs(\"div\", { role: \"button\", tabIndex: 0, className: \"se-text-xs se-font-semibold se-text-text-tertiary se-flex se-items-center se-gap-1.5 se-cursor-pointer\", onClick: () => setIsOpen(!isOpen), onKeyDown: (e) => {\n if (e.key === 'Enter' || e.key === ' ')\n setIsOpen(!isOpen);\n }, children: [_jsx(\"span\", { children: isOpen ? '\\u25be' : '\\u25b8' }), _jsxs(\"span\", { children: [\"Dismissed (\", count, \")\"] })] }), isOpen && _jsx(\"div\", { className: \"se-mt-1.5\", children: children })] }));\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nexport function EditorBody({ children }) {\n return _jsx(\"div\", { className: \"se-flex-1 se-overflow-auto se-p-6\", children: children });\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function EditorCard({ children, itemKey, onClick, onMouseEnter, onMouseLeave, className, validated, }) {\n return (_jsx(\"div\", { \"data-item-key\": itemKey, onClick: onClick, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, className: cn('se-py-2 se-px-2.5 se-rounded-lg se-border se-bg-card-bg se-shadow-sm se-mb-1 se-text-sm se-text-text-primary', validated ? 'se-border-green-4/40 se-shadow-glow-green' : 'se-border-border-primary', onClick &&\n 'se-cursor-pointer hover:se-border-border-primary/80 hover:se-bg-sidebar-hover se-transition-colors', className), children: children }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function EditorFooter({ onSave, onPublish }) {\n return (_jsxs(\"div\", { className: \"se-py-3 se-px-4 se-border-t se-border-border-primary se-flex se-gap-2\", children: [_jsx(\"button\", { onClick: onSave, className: \"se-flex-1 se-h-10 se-px-4 se-py-2 se-rounded-md se-bg-btn-neutral se-text-btn-neutral-text se-border se-border-btn-neutral-border hover:se-text-btn-neutral-text-hover se-text-sm se-font-medium se-cursor-pointer se-inline-flex se-items-center se-justify-center focus-visible:se-shadow-focus-primary focus-visible:se-outline-none\", children: \"Save Draft\" }), _jsx(\"button\", { onClick: onPublish, className: \"se-flex-1 se-h-10 se-px-4 se-py-2 se-rounded-md se-border-none se-bg-btn-primary se-text-btn-primary-text hover:se-bg-btn-primary-hover se-text-sm se-font-medium se-cursor-pointer se-inline-flex se-items-center se-justify-center focus-visible:se-shadow-focus-primary focus-visible:se-outline-none\", children: \"Publish\" })] }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function EditorHeader({ title, subtitle }) {\n return (_jsxs(\"div\", { className: \"se-px-4 se-pt-3 se-pb-2\", children: [_jsx(\"h2\", { className: \"se-m-0 se-text-base se-font-semibold se-text-text-primary\", children: title }), subtitle && (_jsx(\"p\", { className: \"se-mt-0.5 se-mb-0 se-text-xs se-text-text-secondary\", children: subtitle }))] }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function EditorInput({ label, className, ...props }) {\n return (_jsxs(\"div\", { children: [label && (_jsx(\"label\", { className: \"se-text-sm se-font-medium se-text-input-field-text-label se-mb-1 se-block\", children: label })), _jsx(\"input\", { ...props, className: cn('se-w-full se-py-2 se-px-3 se-rounded-lg se-border se-border-input-field-border se-bg-slate-grey-3 se-text-text-primary se-text-sm se-font-[inherit] se-mb-2 se-box-border', 'placeholder:se-text-input-field-text-placeholder', 'focus:se-border-input-field-border-selected focus:se-outline-none focus:se-shadow-focus-primary', 'disabled:se-bg-input-field-bg-disabled disabled:se-cursor-not-allowed disabled:se-opacity-50', className) })] }));\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nexport function EditorLayout({ children }) {\n return _jsx(\"div\", { className: \"se-flex se-flex-col se-h-full se-font-sans\", children: children });\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nexport function EmptyState({ message }) {\n return (_jsx(\"div\", { className: \"se-text-center se-py-8 se-px-4 se-text-text-secondary se-text-sm\", children: message }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * TriggerJourney \u2014 compact horizontal node graph for showWhen conditions.\n *\n * Displays each condition as a small circle node connected by lines.\n * Nodes light up green as conditions are met.\n */\nimport { Check } from 'lucide-react';\nimport { cn } from '../cn';\n/* ------------------------------------------------------------------ */\n/* Internal: small progress bar for event_count nodes */\n/* ------------------------------------------------------------------ */\nfunction ProgressBar({ current, target }) {\n const pct = Math.min(100, Math.round((current / Math.max(target, 1)) * 100));\n return (_jsxs(\"div\", { className: \"se-flex se-items-center se-gap-0.5\", children: [_jsx(\"span\", { className: \"se-inline-block se-w-8 se-h-1 se-rounded-full se-bg-white/10\", title: `${current}/${target} (${pct}%)`, children: _jsx(\"span\", { className: cn('se-block se-h-full se-rounded-full se-transition-all', pct >= 100 ? 'se-bg-green-4' : 'se-bg-blue-4'), style: { width: `${pct}%` } }) }), _jsxs(\"span\", { className: \"se-text-[9px] se-text-text-tertiary\", children: [current, \"/\", target] })] }));\n}\n/* ------------------------------------------------------------------ */\n/* Internal: single journey node with label + optional connection */\n/* ------------------------------------------------------------------ */\nfunction JourneyNode({ cs, isLast }) {\n const hasProgress = !!cs.formatted.progress;\n const inProgress = !cs.passed && hasProgress && cs.formatted.progress.current > 0;\n return (_jsxs(\"div\", { className: \"se-flex se-items-center se-gap-0\", children: [_jsxs(\"div\", { className: \"se-flex se-flex-col se-items-center se-min-w-0\", children: [_jsx(\"div\", { \"data-journey-node\": true, \"data-passed\": cs.passed ? 'true' : 'false', className: cn('se-w-4 se-h-4 se-rounded-full se-border-2 se-flex se-items-center se-justify-center se-shrink-0', cs.passed\n ? 'se-bg-green-4 se-border-green-4'\n : inProgress\n ? 'se-bg-blue-4 se-border-blue-4'\n : 'se-bg-transparent se-border-white/20'), children: cs.passed && _jsx(Check, { className: \"se-w-2.5 se-h-2.5 se-text-white\" }) }), _jsx(\"span\", { className: \"se-text-[9px] se-text-text-tertiary se-truncate se-max-w-[60px] se-text-center se-mt-0.5\", title: cs.formatted.instruction, children: cs.formatted.shortLabel }), hasProgress && (_jsx(ProgressBar, { current: cs.formatted.progress.current, target: cs.formatted.progress.target }))] }), !isLast && (_jsx(\"div\", { \"data-journey-line\": true, className: cn('se-h-0.5 se-w-4 se-self-start se-mt-2 se-shrink-0', cs.passed ? 'se-bg-green-4' : 'se-bg-white/10') }))] }));\n}\n/* ------------------------------------------------------------------ */\n/* Main component */\n/* ------------------------------------------------------------------ */\nexport function TriggerJourney({ status }) {\n if (!status || status.conditions.length === 0) {\n return (_jsx(\"div\", { className: \"se-mt-1 se-text-[10px] se-text-text-tertiary se-italic\", children: \"Always Present\" }));\n }\n const { conditions } = status;\n const allPassed = conditions.every((c) => c.passed);\n const isMulti = conditions.length > 1;\n return (_jsxs(\"div\", { className: \"se-mt-1\", children: [_jsx(\"div\", { className: \"se-flex se-items-start\", children: conditions.map((cs, i) => (_jsx(JourneyNode, { cs: cs, isLast: i === conditions.length - 1 }, i))) }), allPassed && isMulti && (_jsxs(\"div\", { className: \"se-flex se-items-center se-gap-1 se-mt-1 se-text-[10px] se-text-green-4\", children: [_jsx(Check, { className: \"se-w-3 se-h-3\" }), _jsx(\"span\", { children: \"All conditions met\" })] }))] }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function GroupHeader({ label, count, className }) {\n return (_jsxs(\"div\", { className: cn('se-text-xs se-font-bold se-text-text-primary se-uppercase se-tracking-wide se-py-1 se-pb-2 se-flex se-items-center se-justify-between', className), children: [_jsx(\"span\", { children: label }), _jsx(\"span\", { className: \"se-text-xs se-text-text-secondary se-bg-badge-slate-bg se-px-1.5 se-py-0.5 se-rounded-lg\", children: count })] }));\n}\n", "/**\n * Format a showWhen condition into a human-readable label.\n * Pure function \u2014 no runtime dependency.\n */\n/**\n * Format match criteria as a parenthetical string.\n * { tagName: 'a' } \u2192 '(tagName: a)'\n */\nfunction formatMatch(match) {\n if (!match || Object.keys(match).length === 0)\n return '';\n const parts = Object.entries(match).map(([k, v]) => `${k}: ${v}`);\n return ` (${parts.join(', ')})`;\n}\n/**\n * Format an operator for display.\n */\nfunction formatOperator(op) {\n switch (op) {\n case 'gte':\n return '\\u2265'; // \u2265\n case 'lte':\n return '\\u2264'; // \u2264\n case 'gt':\n return '>';\n case 'lt':\n return '<';\n case 'eq':\n return '=';\n default:\n return op;\n }\n}\n/**\n * Convert a hyphenated or underscored key into human-readable lowercase text.\n * e.g. \"fine-arts-page-views\" \u2192 \"fine arts page views\"\n */\nfunction humanizeKey(key) {\n return key.replace(/[-_]/g, ' ').toLowerCase();\n}\n/**\n * Strip trailing wildcard segments from a URL path.\n * e.g. \"/fine-arts/**\" \u2192 \"/fine-arts/\"\n */\nfunction cleanUrl(url) {\n return url.replace(/\\/?\\*+$/, '/').replace(/\\/\\/$/, '/');\n}\n// Pre-compiled regexes for event_count classification\nconst PAGE_VIEW_RE = /page.?view/i;\nconst CLICK_RE = /click/i;\n/**\n * Convert a Condition object into a human-readable label.\n * For event_count conditions, also returns progress data.\n */\nexport function formatConditionLabel(condition, accumulatorCount) {\n switch (condition.type) {\n case 'event_count': {\n const key = condition.key;\n const op = condition.operator;\n const target = condition.count;\n const current = accumulatorCount ?? 0;\n const humanized = humanizeKey(key);\n let instruction;\n let shortLabel;\n if (PAGE_VIEW_RE.test(humanized)) {\n // Extract the topic by removing \"page view(s)\" from the humanized key\n const topic = humanized.replace(/\\s*page\\s*views?\\s*/i, '').trim();\n instruction = topic\n ? `View ${topic} pages ${target}+ times`\n : `View pages ${target}+ times`;\n shortLabel = `View ${target}+ times`;\n }\n else if (CLICK_RE.test(humanized)) {\n const topic = humanized.replace(/\\s*clicks?\\s*/i, '').trim();\n instruction = topic\n ? `Click ${topic} ${target}+ times`\n : `Click ${target}+ times`;\n shortLabel = `${target}+ clicks`;\n }\n else {\n // Generic event\n const lastWord = humanized.trim().split(' ').filter(w => w).pop() || 'events';\n instruction = `Reach ${target}+ ${humanized} events`;\n shortLabel = `${target}+ ${lastWord}s`;\n }\n return {\n label: `${key} ${formatOperator(op)} ${target}`,\n instruction,\n shortLabel,\n progress: { current, target, operator: op },\n };\n }\n case 'page_url': {\n const url = condition.url;\n const cleaned = cleanUrl(url);\n const hasWildcard = url !== cleaned;\n const instruction = hasWildcard\n ? `Visit a ${cleaned} page`\n : `Visit ${cleaned}`;\n return {\n label: `${url}`,\n instruction,\n shortLabel: cleaned,\n };\n }\n case 'anchor_visible': {\n const anchorId = condition.anchorId;\n const state = condition.state;\n return {\n label: `${anchorId} (${state})`,\n instruction: `Scroll until ${anchorId} is ${state}`,\n shortLabel: `${anchorId}`,\n };\n }\n case 'event_occurred': {\n const eventName = condition.eventName;\n return {\n label: `${eventName}`,\n instruction: `Trigger a ${eventName} event`,\n shortLabel: `${eventName}`,\n };\n }\n case 'state_equals': {\n const key = condition.key;\n const val = condition.value === undefined ? 'undefined' : JSON.stringify(condition.value);\n return {\n label: `${key} = ${val}`,\n instruction: `${key} equals ${val}`,\n shortLabel: `${key}`,\n };\n }\n case 'viewport': {\n const parts = [];\n if (condition.minWidth !== undefined)\n parts.push(`w ${formatOperator('gte')} ${condition.minWidth}px`);\n if (condition.maxWidth !== undefined)\n parts.push(`w ${formatOperator('lte')} ${condition.maxWidth}px`);\n if (condition.minHeight !== undefined)\n parts.push(`h ${formatOperator('gte')} ${condition.minHeight}px`);\n if (condition.maxHeight !== undefined)\n parts.push(`h ${formatOperator('lte')} ${condition.maxHeight}px`);\n const label = parts.join(', ') || 'any viewport';\n const instruction = parts.length > 0\n ? `Use a viewport ${parts.join(' and ')}`\n : 'Use a viewport of any size';\n const shortLabel = parts.length > 0 ? parts[0] : 'Any size';\n return { label, instruction, shortLabel };\n }\n case 'session_metric': {\n const key = condition.key;\n const op = condition.operator;\n const threshold = condition.threshold;\n return {\n label: `${key} ${formatOperator(op)} ${threshold}`,\n instruction: `${key} reaches ${threshold}+`,\n shortLabel: `${key} ${threshold}+`,\n };\n }\n case 'dismissed': {\n const inverted = condition.inverted;\n const key = condition.key;\n const target = key || 'this';\n return {\n label: inverted ? 'not dismissed' : 'dismissed',\n instruction: inverted\n ? `Do not dismiss ${target}`\n : `Dismiss ${target}`,\n shortLabel: inverted ? 'Not dismissed' : 'Dismissed',\n };\n }\n case 'cooldown_active': {\n const inverted = condition.inverted;\n return {\n label: inverted ? 'cooldown inactive' : 'cooldown active',\n instruction: inverted\n ? 'Wait for cooldown to expire'\n : 'Cooldown is active',\n shortLabel: inverted ? 'Cooldown done' : 'Cooldown active',\n };\n }\n case 'frequency_limit': {\n const inverted = condition.inverted;\n const limit = condition.limit;\n return {\n label: `shown ${formatOperator(inverted ? 'lt' : 'gte')} ${limit} times`,\n instruction: inverted\n ? `Shown fewer than ${limit} times`\n : `Shown ${limit}+ times`,\n shortLabel: inverted ? `< ${limit} views` : `${limit}+ views`,\n };\n }\n case 'route': {\n const routeId = condition.routeId;\n return {\n label: `${routeId}`,\n instruction: `Navigate to ${routeId} route`,\n shortLabel: `${routeId}`,\n };\n }\n default:\n return {\n label: `${condition.type}`,\n instruction: `${condition.type}`,\n shortLabel: `${condition.type}`,\n };\n }\n}\n", "/**\n * useShowWhenStatus \u2014 live showWhen evaluation for editor diagnostics.\n *\n * Subscribes to the runtime's EventAccumulator for reactive updates.\n * Evaluates each item's showWhen strategy locally to get\n * per-condition breakdowns.\n *\n * NOTE: This hook accesses `window.SynOS.handle.runtime` directly\n * because EditorPanelProps doesn't expose runtime. This is safe \u2014\n * the editor only runs after runtime bootstrap.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { formatConditionLabel } from '../formatConditionLabel';\nfunction getRuntime() {\n return window.SynOS?.handle?.runtime ?? null;\n}\n/**\n * Evaluate a single condition against the runtime context.\n */\nfunction evaluateConditionLocally(condition, runtime) {\n const ctx = runtime.context.get();\n const type = condition.type;\n let passed = false;\n let accCount;\n switch (type) {\n case 'event_count': {\n if (!runtime.accumulator)\n break;\n const key = condition.key;\n const withinMs = condition.withinMs;\n const count = runtime.accumulator.getCount(key, withinMs);\n accCount = count;\n const target = condition.count;\n const op = condition.operator;\n switch (op) {\n case 'gte':\n passed = count >= target;\n break;\n case 'lte':\n passed = count <= target;\n break;\n case 'eq':\n passed = count === target;\n break;\n case 'gt':\n passed = count > target;\n break;\n case 'lt':\n passed = count < target;\n break;\n }\n break;\n }\n case 'page_url': {\n const url = condition.url;\n const pattern = url\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '.*')\n .replace(/\\*/g, '[^/]*');\n passed = new RegExp(`^${pattern}$`).test(ctx.page.url);\n break;\n }\n case 'route':\n passed = ctx.page.routeId === condition.routeId;\n break;\n case 'anchor_visible': {\n const anchors = ctx.anchors;\n const anchor = anchors?.find((a) => a.anchorId === condition.anchorId);\n switch (condition.state) {\n case 'visible':\n passed = anchor?.visible === true;\n break;\n case 'present':\n passed = anchor?.present === true;\n break;\n case 'absent':\n passed = !anchor?.present;\n break;\n }\n break;\n }\n case 'event_occurred':\n passed =\n runtime.events?.hasRecentEvent(condition.eventName, condition.withinMs ?? 60000) ?? false;\n break;\n case 'viewport': {\n const { width, height } = ctx.viewport;\n passed = true;\n if (condition.minWidth !== undefined && width < condition.minWidth)\n passed = false;\n if (condition.maxWidth !== undefined && width > condition.maxWidth)\n passed = false;\n if (condition.minHeight !== undefined && height < condition.minHeight)\n passed = false;\n if (condition.maxHeight !== undefined && height > condition.maxHeight)\n passed = false;\n break;\n }\n case 'session_metric': {\n const val = runtime.state?.getSessionMetric(condition.key) ?? 0;\n const threshold = condition.threshold;\n const op = condition.operator;\n switch (op) {\n case 'gte':\n passed = val >= threshold;\n break;\n case 'lte':\n passed = val <= threshold;\n break;\n case 'eq':\n passed = val === threshold;\n break;\n case 'gt':\n passed = val > threshold;\n break;\n case 'lt':\n passed = val < threshold;\n break;\n }\n break;\n }\n case 'dismissed':\n passed = condition.inverted\n ? !(runtime.state?.isDismissed(condition.key) ?? false)\n : (runtime.state?.isDismissed(condition.key) ?? false);\n break;\n case 'cooldown_active':\n passed = condition.inverted\n ? !(runtime.state?.isCooldownActive(condition.key) ?? false)\n : (runtime.state?.isCooldownActive(condition.key) ?? false);\n break;\n case 'frequency_limit': {\n const count = runtime.state?.getFrequencyCount(condition.key) ?? 0;\n const limitReached = count >= condition.limit;\n passed = condition.inverted ? !limitReached : limitReached;\n break;\n }\n }\n const formatted = formatConditionLabel(condition, accCount);\n return {\n passed,\n cs: { type, passed, formatted },\n };\n}\n/**\n * Evaluate all conditions in a showWhen RuleStrategy.\n */\nfunction evaluateShowWhen(showWhen, runtime) {\n if (showWhen.type !== 'rules' || !showWhen.rules?.length) {\n return { visible: !!showWhen.default, isFallback: true, conditions: [] };\n }\n // Evaluate ALL rules' conditions for diagnostic display\n const allConditions = [];\n for (const rule of showWhen.rules) {\n let ruleMatched = true;\n for (const condition of rule.conditions) {\n const { passed, cs } = evaluateConditionLocally(condition, runtime);\n allConditions.push(cs);\n if (!passed)\n ruleMatched = false;\n }\n if (ruleMatched) {\n return { visible: rule.value, isFallback: false, conditions: allConditions };\n }\n }\n // No rules matched \u2014 use default\n return {\n visible: showWhen.default ?? false,\n isFallback: true,\n conditions: allConditions,\n };\n}\n/**\n * Hook: live showWhen evaluation for a list of action items.\n *\n * @param items Array of items with id + optional showWhen\n * @returns Map from item id \u2192 ShowWhenStatus (null for items without showWhen)\n */\nexport function useShowWhenStatus(items) {\n const [statuses, setStatuses] = useState(new Map());\n const itemsRef = useRef(items);\n itemsRef.current = items;\n const evaluate = useCallback(() => {\n const runtime = getRuntime();\n if (!runtime)\n return;\n const map = new Map();\n for (const item of itemsRef.current) {\n if (!item.showWhen) {\n map.set(item.id, null);\n }\n else {\n map.set(item.id, evaluateShowWhen(item.showWhen, runtime));\n }\n }\n setStatuses(map);\n }, []);\n useEffect(() => {\n // Initial evaluation\n evaluate();\n // Subscribe to accumulator changes for reactive event_count updates\n const runtime = getRuntime();\n const unsubs = [];\n if (runtime?.accumulator) {\n unsubs.push(runtime.accumulator.subscribe(evaluate));\n }\n // Poll every 2s for non-accumulator conditions (page_url, viewport, etc.)\n const interval = setInterval(evaluate, 2000);\n return () => {\n unsubs.forEach((u) => u());\n clearInterval(interval);\n };\n }, [evaluate]);\n return statuses;\n}\n", "/**\n * Human-readable summary generation for Nav items.\n * Pure functions \u2014 no DOM access, just string formatting.\n */\n\nimport type { DecisionStrategy, NavTipAction, RuleStrategy } from './types';\n\nconst MAX_TITLE_LEN = 30;\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return `${text.slice(0, max).trimEnd()}...`;\n}\n\nfunction isRuleStrategy(s: unknown): s is RuleStrategy<boolean> {\n return (\n typeof s === 'object' &&\n s !== null &&\n (s as Record<string, unknown>).type === 'rules' &&\n Array.isArray((s as Record<string, unknown>).rules)\n );\n}\n\n/**\n * Parse a showWhen strategy into a human-readable trigger description.\n */\nexport function describeTrigger(showWhen?: DecisionStrategy<boolean> | null): string {\n if (!showWhen) return 'All pages';\n if (!isRuleStrategy(showWhen)) return 'All pages';\n\n const pages: string[] = [];\n const anchors: string[] = [];\n\n for (const rule of showWhen.rules) {\n for (const condition of rule.conditions) {\n if (condition.type === 'page_url' && typeof (condition as any).url === 'string') {\n pages.push((condition as any).url);\n }\n if (condition.type === 'anchor_visible' && typeof (condition as any).anchorId === 'string') {\n anchors.push((condition as any).anchorId);\n }\n }\n }\n\n const parts: string[] = [];\n if (pages.length > 0) parts.push(pages[0]);\n if (anchors.length > 0) parts.push(anchors[0]);\n\n return parts.length > 0 ? parts.join(' \\u00b7 ') : 'All pages';\n}\n\n/**\n * Generate a one-liner summary for a Nav tip.\n */\nexport function summarizeNavItem(item: NavTipAction): string {\n const icon = item.config.icon || '\\u{1F9ED}';\n const title = truncate(item.config.title, MAX_TITLE_LEN);\n return `${icon} ${title}`;\n}\n", "/**\n * Adaptive Nav - Types\n *\n * Type definitions for the navigation tips accordion adaptive.\n * Demonstrates compositional action pattern with per-item showWhen.\n */\n\n// ============================================================================\n// Decision Strategy Types (from runtime-sdk)\n// ============================================================================\n\n/**\n * Simplified DecisionStrategy type for this package.\n * Full definition is in @syntrologie/runtime-sdk.\n */\nexport type DecisionStrategy<T = unknown> =\n | RuleStrategy<T>\n | ScoreStrategy<T>\n | ModelStrategy<T>\n | ExternalStrategy<T>;\n\nexport interface RuleStrategy<T = unknown> {\n type: 'rules';\n rules: Array<{\n conditions: Array<Record<string, unknown>>;\n value: T;\n }>;\n default: T;\n}\n\nexport interface ScoreStrategy<T = unknown> {\n type: 'score';\n field: string;\n threshold: number;\n above: T;\n below: T;\n}\n\nexport interface ModelStrategy<T = unknown> {\n type: 'model';\n modelId: string;\n inputs: string[];\n outputMapping: Record<string, T>;\n default: T;\n}\n\nexport interface ExternalStrategy<T = unknown> {\n type: 'external';\n endpoint: string;\n method?: 'GET' | 'POST';\n default: T;\n timeoutMs?: number;\n}\n\n// ============================================================================\n// Event Scope Types\n// ============================================================================\n\n/**\n * Scoped event filtering for event_count conditions.\n * The adaptive registers a predicate built from this scope.\n */\nexport interface EventScope {\n /** Event names to count */\n events: string[];\n /** URL path substring filter */\n urlContains?: string;\n /** Exact prop matching (e.g. { tagName: \"a\" }) */\n props?: Record<string, string | number | boolean>;\n}\n\n// ============================================================================\n// Nav Tip Action Types\n// ============================================================================\n\n/**\n * Single navigation tip configuration.\n * This is a \"compositional action\" \u2014 rendered as an accordion item by the parent.\n */\nexport interface NavTipAction {\n /** Action kind identifier */\n kind: 'nav:tip';\n /** Tip configuration */\n config: {\n /** Unique identifier for this tip */\n id: string;\n /** Accordion header text */\n title: string;\n /** Expanded body text */\n description: string;\n /** Optional CTA link URL */\n href?: string;\n /** Optional icon (emoji or icon key) */\n icon?: string;\n /** Whether the link opens in a new tab */\n external?: boolean;\n /** Category for grouping */\n category?: string;\n };\n /** Optional per-item activation strategy */\n showWhen?: DecisionStrategy<boolean> | null;\n /** Toast config \u2014 only fires when showWhen transitions false \u2192 true */\n notify?: {\n title?: string;\n body?: string;\n icon?: string;\n };\n /** AI-generated reasoning for why this tip was recommended */\n rationale?: {\n why: string;\n confidence?: number;\n };\n}\n\n/** @deprecated Use NavTipAction instead */\nexport type NavLinkAction = NavTipAction;\n\n// ============================================================================\n// Nav Widget Configuration\n// ============================================================================\n\n/**\n * Expand behavior for the accordion.\n */\nexport type NavExpandBehavior = 'single' | 'multiple';\n\n/**\n * Theme for the navigation widget.\n */\nexport type NavTheme = 'light' | 'dark' | 'auto';\n\n/**\n * Full configuration for the adaptive-nav widget.\n */\nexport interface NavConfig {\n /** Expand behavior */\n expandBehavior: NavExpandBehavior;\n /** Color theme */\n theme: NavTheme;\n /** Navigation tips (compositional actions) */\n actions: NavTipAction[];\n /** Event scope for registering accumulator predicates */\n scope?: EventScope;\n}\n\n// ============================================================================\n// Widget Props Types\n// ============================================================================\n\n/**\n * Runtime services passed to the widget.\n */\nexport interface NavWidgetRuntime {\n /** Synchronously evaluate a decision strategy */\n evaluateSync: <T>(strategy: DecisionStrategy<T>) => { value: T; isFallback: boolean };\n /** Context manager for subscribing to changes */\n context: {\n subscribe: (callback: () => void) => () => void;\n };\n /** Event bus for publishing interactions */\n events: {\n publish: (name: string, props?: Record<string, unknown>) => void;\n };\n /** Event accumulator for event_count-based showWhen */\n accumulator?: {\n subscribe: (callback: () => void) => () => void;\n register: (key: string, predicate: (event: any) => boolean) => void;\n };\n}\n\n/**\n * Props passed to the NavWidget component.\n */\nexport interface NavWidgetProps {\n /** Widget configuration */\n config: NavConfig;\n /** Runtime services */\n runtime: NavWidgetRuntime;\n /** Instance ID for telemetry */\n instanceId: string;\n}\n\n// ============================================================================\n// Navigation Action Types (merged from adaptive-navigation)\n// ============================================================================\n\ninterface BaseAction {\n label?: string;\n}\n\nexport interface ScrollToAction extends BaseAction {\n kind: 'navigation:scrollTo';\n anchorId: string;\n behavior?: ScrollBehavior;\n block?: ScrollLogicalPosition;\n inline?: ScrollLogicalPosition;\n}\n\nexport interface NavigateAction extends BaseAction {\n kind: 'navigation:navigate';\n url: string;\n target?: '_self' | '_blank';\n}\n\n// ============================================================================\n// Action Namespace\n// ============================================================================\n\nexport const ACTION_NAMESPACES = ['nav', 'navigation'] as const;\n\n/**\n * Returns true if the action belongs to this adaptive package.\n * Uses prefix matching so new kinds (e.g. nav:dropdown) are automatically included.\n * Covers both `nav:*` (compositional) and `navigation:*` (executor) prefixes.\n */\nexport function isOwnAction(action: { kind: string }): boolean {\n return ACTION_NAMESPACES.some((ns) => action.kind.startsWith(`${ns}:`));\n}\n\n// ============================================================================\n// Executor Types (from shared contracts)\n// ============================================================================\n\nexport type {\n ActionExecutor,\n ExecutorCleanup,\n ExecutorContext,\n ExecutorResult,\n ExecutorUpdate,\n} from '@syntrologie/sdk-contracts';\n\n// ============================================================================\n// Editor Types\n// ============================================================================\n\nexport interface EditorPanelProps {\n config: Record<string, unknown>;\n onChange: (config: Record<string, unknown>) => void;\n editor: {\n setDirty: (dirty: boolean) => void;\n navigateHome: () => Promise<boolean>;\n save: () => Promise<void>;\n publish: (captureScreenshot?: boolean) => Promise<void>;\n navigateTo: (route: string) => Promise<void>;\n highlightElement: (selector: string) => void;\n clearHighlight: () => void;\n getCurrentRoute: () => string;\n previewConfig: (config: Record<string, unknown>) => void;\n /** Flat action index to open in edit mode (from accordion navigation). */\n initialEditKey?: string;\n /** Open the editor in create mode. */\n initialCreate?: boolean;\n /** Clear the initial navigation state (call after consuming). */\n clearInitialState?: () => void;\n /** Global before/after preview mode set by the panel's toggle. */\n previewMode?: 'before' | 'after';\n /** Get dismissed keys persisted in navigation context. */\n getDismissedKeys?: () => Set<string>;\n /** Sync dismissed keys back to navigation context. */\n setDismissedKeys?: (keys: Set<string>) => void;\n /** Register a back handler shown in the panel header. Pass null to clear. */\n setBackHandler?: (handler: (() => void) | null) => void;\n };\n platformClient?: unknown;\n}\n", "/**\n * Adaptive Nav - Editor Component\n *\n * Review & tweak editor for AI-generated navigation tip decisions.\n * Displays a scannable list of tip cards with trigger, rationale,\n * and inline editing. Includes detection badges and hover-to-highlight.\n */\n\nimport {\n DetectionBadge,\n DismissedSection,\n EditorBody,\n EditorCard,\n EditorFooter,\n EditorHeader,\n EditorInput,\n EditorLayout,\n EmptyState,\n GroupHeader,\n TriggerJourney,\n useShowWhenStatus,\n} from '@syntrologie/shared-editor-ui';\nimport type React from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { describeTrigger, summarizeNavItem } from './summarize';\nimport {\n type EditorPanelProps,\n isOwnAction,\n type NavConfig,\n type NavTipAction,\n type RuleStrategy,\n} from './types';\n\n// ============================================================================\n// Targeting Extraction (inlined -- CDN builds can't import from editor-sdk)\n// ============================================================================\n\ninterface TargetingInfo {\n pagePatterns: string[];\n anchorSelectors: string[];\n hasTargeting: boolean;\n}\n\nfunction isRuleStrategy(s: unknown): s is RuleStrategy<boolean> {\n return (\n typeof s === 'object' &&\n s !== null &&\n (s as Record<string, unknown>).type === 'rules' &&\n Array.isArray((s as Record<string, unknown>).rules)\n );\n}\n\nfunction extractTargetingInfo(showWhen?: unknown | null): TargetingInfo {\n if (!showWhen || !isRuleStrategy(showWhen)) {\n return { pagePatterns: [], anchorSelectors: [], hasTargeting: false };\n }\n\n const pagePatterns = new Set<string>();\n const anchorSelectors = new Set<string>();\n\n for (const rule of showWhen.rules) {\n for (const cond of rule.conditions) {\n const c = cond as Record<string, unknown>;\n if (c.type === 'page_url' && typeof c.url === 'string') {\n pagePatterns.add(c.url);\n } else if (c.type === 'anchor_visible' && typeof c.anchorId === 'string') {\n anchorSelectors.add(c.anchorId);\n }\n }\n }\n\n const hasTargeting = pagePatterns.size > 0 || anchorSelectors.size > 0;\n return {\n pagePatterns: [...pagePatterns],\n anchorSelectors: [...anchorSelectors],\n hasTargeting,\n };\n}\n\nfunction extractFirstPage(showWhen?: unknown | null): string | null {\n const info = extractTargetingInfo(showWhen);\n return info.pagePatterns[0] || null;\n}\n\nfunction extractFirstAnchor(showWhen?: unknown | null): string | null {\n const info = extractTargetingInfo(showWhen);\n return info.anchorSelectors[0] || null;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\ninterface FlatItem {\n key: string;\n index: number;\n summary: string;\n trigger: string;\n rationale?: { why: string; confidence?: number };\n firstAnchor: string | null;\n tip: NavTipAction;\n}\n\nfunction flattenItems(config: NavConfig): FlatItem[] {\n const actions = (config.actions || []).filter(isOwnAction);\n return actions.map((tip, i) => ({\n key: String(i),\n index: i,\n summary: summarizeNavItem(tip),\n trigger: describeTrigger(tip.showWhen),\n rationale: tip.rationale,\n firstAnchor: extractFirstAnchor(tip.showWhen),\n tip,\n }));\n}\n\nfunction filterConfig(config: NavConfig, dismissedKeys: Set<string>): NavConfig {\n const ownActions = (config.actions || []).filter(isOwnAction);\n return {\n ...config,\n actions: ownActions.filter((_, i) => !dismissedKeys.has(String(i))),\n };\n}\n\n// ============================================================================\n// Detection Hook\n// ============================================================================\n\ninterface DetectionEntry {\n found: boolean;\n element: HTMLElement | null;\n}\n\nfunction useDetection(\n items: FlatItem[],\n getCurrentRoute: () => string\n): Map<string, DetectionEntry> {\n const [detectionMap, setDetectionMap] = useState<Map<string, DetectionEntry>>(new Map());\n const itemsRef = useRef(items);\n itemsRef.current = items;\n\n useEffect(() => {\n const runDetection = () => {\n const map = new Map<string, DetectionEntry>();\n const currentPath = getCurrentRoute();\n\n for (const item of itemsRef.current) {\n const targeting = extractTargetingInfo(item.tip.showWhen);\n\n // Check page match\n let pageMatch = true;\n if (targeting.pagePatterns.length > 0) {\n pageMatch = targeting.pagePatterns.some((pattern) => {\n const regex = new RegExp(\n `^${pattern.replace(/\\*\\*/g, '.*').replace(/(?<!\\.)(\\*)/g, '[^/]*')}$`\n );\n return regex.test(currentPath);\n });\n }\n\n // Check anchor presence\n let anchorFound = false;\n let element: HTMLElement | null = null;\n if (item.firstAnchor) {\n try {\n element = document.querySelector(item.firstAnchor) as HTMLElement | null;\n anchorFound = element !== null;\n } catch {\n // Invalid selector\n }\n } else {\n anchorFound = pageMatch;\n }\n\n map.set(item.key, {\n found: pageMatch && anchorFound,\n element,\n });\n }\n\n setDetectionMap(map);\n };\n\n runDetection();\n\n const interval = setInterval(runDetection, 2000);\n window.addEventListener('popstate', runDetection);\n\n return () => {\n clearInterval(interval);\n window.removeEventListener('popstate', runDetection);\n };\n }, [getCurrentRoute]);\n\n return detectionMap;\n}\n\n// ============================================================================\n// NavEditor Component\n// ============================================================================\n\nexport function NavEditor({ config, onChange, editor }: EditorPanelProps) {\n const typedConfig = config as unknown as NavConfig;\n const [dismissedKeys, setDismissedKeys] = useState<Set<string>>(\n () => editor.getDismissedKeys?.() ?? new Set()\n );\n const [editingKey, setEditingKey] = useState<string | null>(null);\n const [previewMode, setPreviewMode] = useState<'before' | 'after'>('after');\n const [_hoveredKey, setHoveredKey] = useState<string | null>(null);\n\n // Sync dismissed keys back to navigation context on every change\n useEffect(() => {\n editor.setDismissedKeys?.(dismissedKeys);\n }, [dismissedKeys, editor]);\n\n // React to global before/after toggle from the panel\n // biome-ignore lint/correctness/useExhaustiveDependencies: intentionally omitted \u2014 adding config/typedConfig/previewConfig would cause infinite re-renders since previewConfig triggers state updates\n useEffect(() => {\n const mode = editor.previewMode;\n if (!mode) return;\n\n if (mode === 'before') {\n // Remove all nav tips \u2014 push a config with every item filtered out\n const allKeys = new Set(flattenItems(typedConfig).map((item) => item.key));\n const empty = filterConfig(typedConfig, allKeys);\n editor.previewConfig(empty as unknown as Record<string, unknown>);\n } else {\n // Restore the full config\n editor.previewConfig(config);\n }\n }, [editor.previewMode]);\n\n // If navigated here with an editKey, jump directly to that item's edit view\n const initialConsumed = useRef(false);\n useEffect(() => {\n if (!initialConsumed.current) {\n initialConsumed.current = true;\n if (editor.initialEditKey != null) {\n setEditingKey(String(editor.initialEditKey));\n }\n editor.clearInitialState?.();\n }\n }, [editor]);\n\n const allItems = flattenItems(typedConfig);\n const activeItems = allItems.filter((item) => !dismissedKeys.has(item.key));\n const dismissedItems = allItems.filter((item) => dismissedKeys.has(item.key));\n const totalLinks = activeItems.length;\n\n // Live showWhen status for condition diagnostics\n const showWhenItems = useMemo(\n () =>\n allItems.map((item) => ({\n id: item.key,\n showWhen: item.tip.showWhen,\n })),\n [allItems]\n );\n const showWhenStatuses = useShowWhenStatus(showWhenItems);\n\n const detectionMap = useDetection(allItems, editor.getCurrentRoute);\n const foundCount = activeItems.filter((item) => detectionMap.get(item.key)?.found).length;\n\n const handleDismiss = useCallback(\n (key: string) => {\n setDismissedKeys((prev) => {\n const next = new Set(prev);\n next.add(key);\n return next;\n });\n if (editingKey === key) setEditingKey(null);\n },\n [editingKey]\n );\n\n const handleRestore = useCallback((key: string) => {\n setDismissedKeys((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }, []);\n\n const handleCardBodyClick = useCallback((item: FlatItem) => {\n setEditingKey(item.key);\n }, []);\n\n const handleTriggerClick = useCallback(\n (item: FlatItem) => {\n const pageUrl = extractFirstPage(item.tip.showWhen);\n if (pageUrl) {\n editor.navigateTo(pageUrl);\n }\n if (item.firstAnchor) {\n editor.highlightElement(item.firstAnchor);\n }\n },\n [editor]\n );\n\n const handleBackToList = useCallback(() => {\n setEditingKey(null);\n setPreviewMode('after');\n editor.previewConfig(config);\n editor.clearHighlight();\n }, [editor, config]);\n\n // Register back handler in panel header when editing\n useEffect(() => {\n editor.setBackHandler?.(editingKey !== null ? handleBackToList : null);\n return () => editor.setBackHandler?.(null);\n }, [editingKey, handleBackToList, editor]);\n\n const handleBeforeAfter = useCallback(\n (mode: 'before' | 'after') => {\n setPreviewMode(mode);\n if (mode === 'before') {\n const filtered = filterConfig(typedConfig, new Set([editingKey!]));\n editor.previewConfig(filtered as unknown as Record<string, unknown>);\n } else {\n editor.previewConfig(config);\n }\n },\n [typedConfig, editingKey, editor, config]\n );\n\n const handleFieldChange = useCallback(\n (index: number, field: string, value: unknown) => {\n const ownActions = (typedConfig.actions || []).filter(isOwnAction).slice();\n const link = { ...ownActions[index], config: { ...ownActions[index].config } };\n (link.config as Record<string, unknown>)[field] = value;\n ownActions[index] = link;\n const otherActions = (typedConfig.actions || []).filter((a) => !isOwnAction(a));\n const updated = { ...typedConfig, actions: [...otherActions, ...ownActions] };\n onChange(updated as unknown as Record<string, unknown>);\n editor.setDirty(true);\n },\n [typedConfig, onChange, editor]\n );\n\n const handlePublish = useCallback(() => {\n if (dismissedKeys.size > 0) {\n const filtered = filterConfig(typedConfig, dismissedKeys);\n onChange(filtered as unknown as Record<string, unknown>);\n }\n editor.publish();\n }, [dismissedKeys, typedConfig, onChange, editor]);\n\n const handleCardHover = useCallback(\n (item: FlatItem) => {\n setHoveredKey(item.key);\n if (item.firstAnchor) {\n editor.highlightElement(item.firstAnchor);\n }\n },\n [editor]\n );\n\n const handleCardLeave = useCallback(() => {\n setHoveredKey(null);\n editor.clearHighlight();\n }, [editor]);\n\n // ---- Edit form renderer ----\n\n const renderEditFields = (index: number) => {\n const actions = (typedConfig.actions || []).filter(isOwnAction);\n const tip = actions[index];\n if (!tip) return null;\n\n const item = allItems.find((it) => it.key === String(index));\n\n return (\n <div className=\"se-py-1\">\n {/* Trigger line in edit mode */}\n {item && item.trigger !== 'All pages' && (\n <button\n type=\"button\"\n data-trigger\n className=\"se-flex se-items-center se-gap-1 se-text-[11px] se-text-slate-grey-8 se-cursor-pointer se-mb-1 se-border-none se-bg-transparent se-p-0 se-text-left\"\n onClick={() => handleTriggerClick(item)}\n >\n <span>{'\\u{1f4cd}'}</span>\n <span>{item.trigger}</span>\n </button>\n )}\n\n <EditorInput\n label=\"Title\"\n value={tip.config.title}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(index, 'title', e.target.value)\n }\n />\n\n <EditorInput\n label=\"Description\"\n value={tip.config.description}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(index, 'description', e.target.value)\n }\n />\n\n <EditorInput\n label=\"Link URL\"\n value={tip.config.href || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(index, 'href', e.target.value)\n }\n placeholder=\"Optional\"\n />\n\n <EditorInput\n label=\"Icon\"\n value={tip.config.icon || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(index, 'icon', e.target.value)\n }\n placeholder=\"e.g., \\u{1f9ed}\"\n />\n\n <EditorInput\n label=\"Category\"\n value={tip.config.category || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(index, 'category', e.target.value)\n }\n placeholder=\"Optional\"\n />\n\n <label className=\"se-flex se-items-center se-gap-2 se-text-xs se-text-slate-grey-8 se-mb-2\">\n <input\n type=\"checkbox\"\n checked={tip.config.external || false}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(index, 'external', e.target.checked)\n }\n />\n Open in new tab\n </label>\n\n <span className=\"se-text-[11px] se-font-semibold se-text-slate-grey-7 se-mb-1 se-block\">\n AI Rationale\n </span>\n <div className=\"se-p-2 se-rounded se-border se-border-dashed se-border-white/15 se-bg-white/[0.02] se-text-slate-grey-8 se-text-xs se-mb-2\">\n {tip.rationale ? tip.rationale.why : 'N/A'}\n </div>\n </div>\n );\n };\n\n const subtitle = `${totalLinks} tip${totalLinks !== 1 ? 's' : ''}${totalLinks > 0 ? ` (${foundCount} found on this page)` : ''}`;\n\n return (\n <EditorLayout>\n <EditorHeader\n title=\"Navigation Tips\"\n subtitle={subtitle}\n onBack={() => editor.navigateHome()}\n />\n\n <EditorBody>\n {editingKey !== null ? (\n /* ---- Edit mode ---- */\n (() => {\n const editIndex = Number(editingKey);\n const editItem = allItems.find((it) => it.key === editingKey);\n return (\n <>\n <div className=\"se-flex se-items-center se-gap-2 se-mb-3 se-text-[13px] se-font-semibold se-text-slate-grey-10\">\n <span>{'\\u{1F9ED}'}</span>\n <span>{editItem?.summary}</span>\n </div>\n {renderEditFields(editIndex)}\n </>\n );\n })()\n ) : (\n /* ---- List mode ---- */\n <>\n {allItems.length === 0 && <EmptyState message=\"No tips configured.\" />}\n\n {activeItems.length > 0 && (\n <>\n <GroupHeader label=\"TIPS\" count={activeItems.length} />\n {activeItems.map((item) => {\n const detection = detectionMap.get(item.key);\n return (\n <EditorCard\n key={item.key}\n itemKey={item.key}\n onClick={() => handleCardBodyClick(item)}\n onMouseEnter={() => handleCardHover(item)}\n onMouseLeave={handleCardLeave}\n >\n {/* Trigger line */}\n {item.trigger !== 'All pages' && (\n <button\n type=\"button\"\n data-trigger\n className=\"se-flex se-items-center se-gap-1 se-text-[11px] se-text-slate-grey-8 se-cursor-pointer se-mb-1 se-border-none se-bg-transparent se-p-0 se-text-left\"\n onClick={(e) => {\n e.stopPropagation();\n handleTriggerClick(item);\n }}\n >\n <span>{'\\u{1f4cd}'}</span>\n <span>{item.trigger}</span>\n </button>\n )}\n {/* Card body: badge + summary + dismiss */}\n {/* biome-ignore lint/a11y/useSemanticElements: cannot use <button> here as it would nest a dismiss <button> inside, which is invalid HTML */}\n <div\n data-card-body\n role=\"button\"\n tabIndex={0}\n className=\"se-flex se-items-center se-gap-2 se-cursor-pointer\"\n onClick={() => handleCardBodyClick(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') handleCardBodyClick(item);\n }}\n >\n <DetectionBadge found={detection?.found ?? false} />\n <span className=\"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap\">\n {item.summary}\n </span>\n <button\n type=\"button\"\n className=\"se-py-0.5 se-px-1.5 se-rounded se-border-none se-bg-transparent se-text-slate-grey-7 se-text-sm se-cursor-pointer se-shrink-0 se-leading-none\"\n onClick={(e) => {\n e.stopPropagation();\n handleDismiss(item.key);\n }}\n title=\"Dismiss this tip\"\n >\n ×\n </button>\n </div>\n {/* Rationale line */}\n <div className=\"se-text-[10px] se-text-slate-grey-7 se-mt-1\">\n WHY: {item.rationale ? item.rationale.why : 'N/A'}\n </div>\n {/* Condition status line */}\n <TriggerJourney status={showWhenStatuses.get(item.key) ?? null} />\n </EditorCard>\n );\n })}\n </>\n )}\n\n {/* Dismissed section */}\n {dismissedItems.length > 0 && (\n <DismissedSection count={dismissedItems.length}>\n {dismissedItems.map((item) => (\n <div\n key={item.key}\n className=\"se-flex se-items-center se-gap-2 se-py-1.5 se-px-2.5 se-rounded-md se-border se-border-white/[0.03] se-bg-transparent se-mb-0.5 se-cursor-pointer se-text-xs se-text-slate-grey-6 se-opacity-60\"\n >\n <span className=\"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap se-line-through\">\n {item.summary}\n </span>\n <button\n type=\"button\"\n className=\"se-py-0.5 se-px-1.5 se-rounded se-border-none se-bg-transparent se-text-blue-5 se-text-[11px] se-cursor-pointer se-shrink-0 se-leading-none\"\n onClick={(e) => {\n e.stopPropagation();\n handleRestore(item.key);\n }}\n >\n Restore\n </button>\n </div>\n ))}\n </DismissedSection>\n )}\n </>\n )}\n </EditorBody>\n\n <EditorFooter onSave={() => editor.save()} onPublish={handlePublish} />\n </EditorLayout>\n );\n}\n\n/**\n * Editor panel configuration for the app registry.\n */\nexport const editorPanel = {\n title: 'Navigation Tips',\n icon: '\\u{1F9ED}',\n description: 'Navigation tips accordion with per-item visibility',\n};\n\nexport const editor = {\n panel: editorPanel,\n component: NavEditor,\n};\n\nexport default NavEditor;\n", "/**\n * Syntro Design System - Color Tokens\n *\n * This file contains all color tokens from the Figma design system.\n * Colors are organized by scale and semantic meaning.\n *\n * @see https://www.figma.com/design/U0Ol5vM7FQvgPfIgCAgxgb/Design-System\n */\n// ============================================================================\n// BASE COLORS\n// ============================================================================\nexport const base = {\n white: '#ffffff',\n black: '#000000',\n};\n// ============================================================================\n// BRAND COLORS\n// ============================================================================\nexport const brand = {\n 0: '#2c0b0a',\n 1: '#5b1715',\n 2: '#89221f',\n 3: '#b72e2a',\n 4: '#d44844',\n 5: '#dd6d69',\n 6: '#e5918f',\n 7: '#eeb6b4',\n 8: '#f6dada',\n 9: '#faebea',\n};\n// ============================================================================\n// NEUTRAL COLORS\n// ============================================================================\nexport const slateGrey = {\n 0: '#07080a',\n 1: '#0f1318',\n 2: '#0e1114',\n 3: '#1c222a',\n 4: '#2b333f',\n 5: '#394454',\n 6: '#475569',\n 7: '#677384',\n 8: '#87919f',\n 9: '#a8afba',\n 10: '#cbd0d7',\n 11: '#e8eaee',\n 12: '#f6f7f9',\n};\n// ============================================================================\n// SEMANTIC COLOR SCALES\n// ============================================================================\nexport const green = {\n 0: '#07230a',\n 1: '#0e4514',\n 2: '#16681e',\n 3: '#1d8a28',\n 4: '#24ad32',\n 5: '#4fbd5a',\n 6: '#7acd82',\n 7: '#a5deab',\n 8: '#d0eed3',\n 9: '#e5f6e7',\n};\nexport const yellow = {\n 0: '#301f09',\n 1: '#5f3e12',\n 2: '#8f5e1b',\n 3: '#be7d24',\n 4: '#ee9c2d',\n 5: '#f1b057',\n 6: '#f5c481',\n 7: '#f8d7ab',\n 8: '#fcebd5',\n 9: '#fdf5ea',\n};\nexport const red = {\n 0: '#330707',\n 1: '#660f0e',\n 2: '#991616',\n 3: '#cc1e1d',\n 4: '#ff2524',\n 5: '#ff5150',\n 6: '#ff7c7c',\n 7: '#ffa8a7',\n 8: '#ffd3d3',\n 9: '#ffe9e9',\n};\nexport const blue = {\n 0: '#051533',\n 1: '#0a2a66',\n 2: '#0f3f98',\n 3: '#1454cb',\n 4: '#1969fe',\n 5: '#4787fe',\n 6: '#75a5fe',\n 7: '#a3c3ff',\n 8: '#d1e1ff',\n 9: '#e8f0ff',\n};\nexport const orange = {\n 0: '#662500',\n 1: '#993d00',\n 2: '#cc5800',\n 3: '#ff7700',\n 4: '#fea85d',\n 5: '#fec58f',\n 6: '#ffd6ae',\n 7: '#fee6cd',\n 8: '#fff1e1',\n 9: '#fff8f0',\n};\nexport const purple = {\n 0: '#151229',\n 1: '#2a2452',\n 2: '#40357c',\n 3: '#5547a5',\n 4: '#6a59ce',\n 5: '#887ad8',\n 6: '#a69be2',\n 7: '#c3bdeb',\n 8: '#e1def5',\n 9: '#f0eefa',\n};\nexport const pink = {\n 0: '#37091f',\n 1: '#69123c',\n 2: '#9b1c58',\n 3: '#cd2575',\n 4: '#ff2e92',\n 5: '#ff58a8',\n 6: '#ff82be',\n 7: '#ffabd3',\n 8: '#ffd5e9',\n 9: '#ffeaf4',\n};\n// ============================================================================\n// LEGACY COLORS (Being phased out)\n// ============================================================================\nexport const legacy = {\n aqua: {\n 0: '#0c5f8d',\n 1: '#146b99',\n 2: '#1d78a6',\n 3: '#2e89b6',\n 4: '#4a9fc4',\n 5: '#6bb4d1',\n 6: '#93cce0',\n 7: '#bddff0',\n 8: '#dceef8',\n 9: '#f2f8fc',\n },\n violet: {\n 0: '#6927da',\n 1: '#7839ee',\n 2: '#875bf7',\n 3: '#a48afb',\n 4: '#c3b4fd',\n 5: '#ddd6fe',\n 6: '#ece9fe',\n 7: '#f5f3ff',\n 8: '#fbfaff',\n },\n fuchsia: {\n 0: '#9f1ab1',\n 1: '#ba24d5',\n 2: '#d444f1',\n 3: '#e478fa',\n 4: '#eeaafd',\n 5: '#f6d0fe',\n 6: '#fbe8ff',\n 7: '#fdf4ff',\n 8: '#fefaff',\n },\n pink: {\n 0: '#a10f5f',\n 1: '#dd2590',\n 2: '#ee46bc',\n 3: '#f670c7',\n 4: '#faa7e0',\n 5: '#fcceee',\n 6: '#fce7f6',\n 7: '#fdf2fa',\n 8: '#fef6fb',\n },\n};\n// ============================================================================\n// TEXT TOKENS\n// ============================================================================\nexport const text = {\n primary: slateGrey[10],\n secondary: slateGrey[9],\n tertiary: slateGrey[8],\n};\n// ============================================================================\n// BACKGROUND TOKENS\n// ============================================================================\nexport const background = {\n primary: slateGrey[2],\n secondary: slateGrey[0],\n};\n// ============================================================================\n// BORDER TOKENS\n// ============================================================================\nexport const border = {\n primary: slateGrey[4],\n secondary: slateGrey[3],\n};\n// ============================================================================\n// BUTTON TOKENS\n// ============================================================================\nexport const button = {\n primary: {\n text: base.white,\n icon: base.white,\n border: brand[3],\n backgroundDefault: brand[3],\n backgroundHover: brand[2],\n },\n neutral: {\n text: slateGrey[10],\n textHover: base.white,\n icon: slateGrey[10],\n iconHover: base.white,\n border: slateGrey[4],\n background: slateGrey[2],\n },\n link: {\n text: base.white,\n icon: base.white,\n hover: brand[5],\n },\n error: {\n text: red[5],\n hover: red[6],\n },\n success: {\n text: green[5],\n hover: green[6],\n },\n};\n// ============================================================================\n// BADGE TOKENS\n// ============================================================================\nexport const badge = {\n slateGrey: {\n content: slateGrey[10],\n pillOutline: slateGrey[10],\n borderPrimary: slateGrey[5],\n borderSecondary: slateGrey[5],\n background: slateGrey[3],\n },\n brand: {\n content: brand[9],\n pillOutline: brand[9],\n borderPrimary: brand[6],\n borderSecondary: brand[6],\n background: brand[0],\n },\n red: {\n content: red[8],\n pillOutline: red[4],\n borderPrimary: red[2],\n borderSecondary: red[2],\n background: red[0],\n },\n yellow: {\n content: yellow[8],\n pillOutline: yellow[4],\n borderPrimary: yellow[2],\n borderSecondary: yellow[2],\n background: yellow[0],\n },\n green: {\n content: green[8],\n pillOutline: green[4],\n borderPrimary: green[2],\n borderSecondary: green[2],\n background: green[0],\n },\n purple: {\n content: purple[8],\n pillOutline: purple[4],\n borderPrimary: purple[2],\n borderSecondary: purple[2],\n background: purple[0],\n },\n blue: {\n content: blue[8],\n pillOutline: blue[4],\n borderPrimary: blue[2],\n borderSecondary: blue[2],\n background: blue[0],\n },\n orange: {\n content: orange[8],\n pillOutline: orange[4],\n borderPrimary: orange[2],\n borderSecondary: orange[2],\n background: orange[0],\n },\n pink: {\n content: pink[8],\n pillOutline: pink[4],\n borderPrimary: pink[2],\n borderSecondary: pink[2],\n background: pink[0],\n },\n};\n// ============================================================================\n// BADGE BANNER TOKENS\n// ============================================================================\nexport const badgeBanner = {\n green: {\n content: green[8],\n border: green[2],\n background: green[0],\n },\n yellow: {\n content: yellow[8],\n border: yellow[2],\n background: yellow[0],\n },\n red: {\n content: red[8],\n border: red[2],\n background: red[0],\n },\n};\n// ============================================================================\n// ALERT TOKENS\n// ============================================================================\nexport const alert = {\n green: {\n content: green[1],\n background: green[9],\n },\n yellow: {\n content: yellow[1],\n background: yellow[9],\n },\n red: {\n content: red[1],\n background: red[9],\n },\n};\n// ============================================================================\n// TAG TOKENS\n// ============================================================================\nexport const tag = {\n content: slateGrey[10],\n border: slateGrey[4],\n background: '#1c2124',\n};\n// ============================================================================\n// MENU TOKENS\n// ============================================================================\nexport const menu = {\n backgroundDefault: slateGrey[2],\n backgroundHover: slateGrey[1],\n selected: slateGrey[3],\n};\n// ============================================================================\n// INPUT/DROPDOWN TOKENS\n// ============================================================================\nexport const inputDropdown = {\n background: slateGrey[2],\n icon: slateGrey[10],\n borderDefault: slateGrey[4],\n borderSelected: brand[3],\n textLabel: slateGrey[9],\n textPlaceholder: slateGrey[8],\n textHint: slateGrey[8],\n};\nexport const inputField = {\n backgroundDefault: slateGrey[2],\n backgroundDisabled: slateGrey[0],\n textLabel: slateGrey[9],\n textPlaceholder: slateGrey[8],\n textHint: slateGrey[8],\n textError: red[5],\n iconDefault: slateGrey[9],\n iconPlaceholder: slateGrey[10],\n iconError: red[5],\n borderDefault: slateGrey[4],\n borderSelected: brand[3],\n borderError: red[5],\n};\n// ============================================================================\n// TOGGLE TOKENS\n// ============================================================================\nexport const toggle = {\n handleDefault: base.white,\n handleDisabled: slateGrey[10],\n off: {\n backgroundDefault: slateGrey[4],\n backgroundHover: slateGrey[5],\n backgroundDisabled: slateGrey[4],\n },\n on: {\n backgroundDefault: green[3],\n backgroundHover: green[2],\n backgroundDisabled: slateGrey[4],\n },\n};\n// ============================================================================\n// CHECKBOX TOKENS\n// ============================================================================\nexport const checkbox = {\n off: {\n backgroundDefault: '#00000000',\n backgroundHover: slateGrey[5],\n backgroundDisabled: slateGrey[2],\n border: slateGrey[6],\n },\n on: {\n backgroundDefault: green[0],\n backgroundHover: green[1],\n backgroundDisabled: slateGrey[2],\n border: green[3],\n },\n};\n// ============================================================================\n// AVATAR TOKENS\n// ============================================================================\nexport const avatar = {\n content: slateGrey[10],\n background: slateGrey[4],\n};\n// ============================================================================\n// PROGRESS BAR & SLIDER TOKENS\n// ============================================================================\nexport const progressBarSlider = {\n background: slateGrey[4],\n active: green[3],\n};\n// ============================================================================\n// CARD TOKENS\n// ============================================================================\nexport const card = {\n background: slateGrey[1],\n content: slateGrey[9],\n border: slateGrey[4],\n};\n// ============================================================================\n// SIDEBAR TOKENS\n// ============================================================================\nexport const sidebar = {\n backgroundDefault: slateGrey[1],\n backgroundHover: slateGrey[3],\n backgroundActive: slateGrey[4],\n border: slateGrey[4],\n contentPrimary: slateGrey[10],\n contentSecondary: slateGrey[9],\n contentTertiary: slateGrey[8],\n};\n// ============================================================================\n// MODAL TOKENS\n// ============================================================================\nexport const modal = {\n background: slateGrey[1],\n content: slateGrey[9],\n border: slateGrey[4],\n};\n// ============================================================================\n// TAB TOKENS\n// ============================================================================\nexport const tab = {\n activeBackground: slateGrey[3],\n activeContent: brand[5],\n inactiveContent: slateGrey[9],\n border: slateGrey[4],\n};\n// ============================================================================\n// TABLE TOKENS\n// ============================================================================\nexport const table = {\n header: {\n textDefault: slateGrey[9],\n textHover: slateGrey[8],\n backgroundDefault: slateGrey[1],\n },\n border: slateGrey[4],\n cell: {\n textPrimary: slateGrey[10],\n textSecondary: slateGrey[9],\n backgroundDefault: slateGrey[2],\n backgroundHover: slateGrey[1],\n },\n};\n// ============================================================================\n// BREADCRUMBS TOKENS\n// ============================================================================\nexport const breadcrumbs = {\n textPrimaryDefault: slateGrey[10],\n textPrimaryHover: slateGrey[10],\n textSecondaryDefault: slateGrey[8],\n textSecondaryHover: slateGrey[9],\n iconPrimary: slateGrey[10],\n iconSecondary: slateGrey[8],\n};\n// ============================================================================\n// LOADING INDICATOR TOKENS\n// ============================================================================\nexport const loadingIndicator = {\n background: green[1],\n active: green[5],\n};\n// ============================================================================\n// DATE PICKER TOKENS\n// ============================================================================\nexport const datePicker = {\n textDefault: slateGrey[10],\n textSelected: base.white,\n textDisabled: slateGrey[7],\n backgroundDefault: slateGrey[2],\n backgroundMiddle: slateGrey[3],\n backgroundSelected: brand[3],\n border: slateGrey[4],\n};\n// ============================================================================\n// MISC TOKENS\n// ============================================================================\nexport const scroll = slateGrey[9];\n// ============================================================================\n// EXPORTS\n// ============================================================================\nexport const colors = {\n base,\n brand,\n slateGrey,\n green,\n yellow,\n red,\n blue,\n orange,\n purple,\n pink,\n legacy,\n text,\n background,\n border,\n button,\n badge,\n badgeBanner,\n alert,\n tag,\n menu,\n inputDropdown,\n inputField,\n toggle,\n checkbox,\n avatar,\n progressBarSlider,\n card,\n sidebar,\n modal,\n tab,\n table,\n breadcrumbs,\n loadingIndicator,\n datePicker,\n scroll,\n};\nexport default colors;\n", "\n function _RD() {\n return (typeof SynOS !== 'undefined' && SynOS.ReactDOM) || {};\n }\n export default new Proxy({}, { get: function(_, k) { return _RD()[k]; } });\n export function createRoot() { return _RD().createRoot.apply(null, arguments); }\n export function hydrateRoot() { return _RD().hydrateRoot.apply(null, arguments); }\n export function createPortal() { return _RD().createPortal.apply(null, arguments); }\n export function flushSync() { return _RD().flushSync.apply(null, arguments); }\n ", "/**\n * Adaptive Nav - NavWidget Component\n *\n * React component that renders a collapsible navigation tips accordion\n * with per-item conditional visibility based on showWhen decision strategies.\n *\n * Demonstrates the compositional action pattern where child actions\n * (nav:tip) serve as configuration data for the parent widget.\n */\n\nimport { base, purple, slateGrey } from '@syntro/design-system/tokens';\nimport React, { useCallback, useEffect, useMemo, useReducer, useState } from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport type { NavConfig, NavTipAction, NavWidgetProps, NavWidgetRuntime } from './types';\n\n// ============================================================================\n// Sanitization\n// ============================================================================\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst baseStyles = {\n container: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n padding: '8px',\n maxWidth: '100%',\n overflow: 'hidden',\n },\n accordion: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '4px',\n },\n item: {\n borderRadius: '8px',\n overflow: 'hidden',\n transition: 'box-shadow 0.2s ease',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n width: '100%',\n padding: '12px 16px',\n border: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'inherit',\n textAlign: 'left' as const,\n transition: 'background-color 0.15s ease',\n },\n chevron: {\n fontSize: '10px',\n transition: 'transform 0.2s ease',\n marginLeft: 'auto',\n flexShrink: 0,\n },\n icon: {\n fontSize: '16px',\n flexShrink: 0,\n },\n body: {\n overflow: 'hidden',\n transition: 'max-height 0.25s ease, padding-bottom 0.25s ease',\n padding: '0 16px',\n },\n description: {\n fontSize: '13px',\n lineHeight: '1.5',\n margin: 0,\n },\n linkButton: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n marginTop: '10px',\n padding: '6px 12px',\n borderRadius: '6px',\n textDecoration: 'none',\n fontSize: '13px',\n fontWeight: 500,\n cursor: 'pointer',\n border: 'none',\n transition: 'background-color 0.15s ease',\n },\n categoryHeader: {\n fontSize: '11px',\n fontWeight: 600,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n padding: '12px 4px 4px',\n },\n emptyState: {\n fontSize: '13px',\n padding: '16px',\n textAlign: 'center' as const,\n },\n} as const;\n\nconst themeStyles = {\n light: {\n container: {\n backgroundColor: base.white,\n color: slateGrey[1],\n },\n item: {\n backgroundColor: slateGrey[12],\n border: `1px solid ${slateGrey[11]}`,\n },\n itemExpanded: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.08)',\n },\n header: {\n backgroundColor: 'transparent',\n color: slateGrey[1],\n },\n headerHover: {\n backgroundColor: slateGrey[12],\n },\n body: {\n color: slateGrey[6],\n },\n linkButton: {\n backgroundColor: purple[8],\n color: purple[2],\n },\n categoryHeader: {\n color: slateGrey[7],\n },\n emptyState: {\n color: slateGrey[8],\n },\n },\n dark: {\n container: {\n backgroundColor: slateGrey[1],\n color: slateGrey[12],\n },\n item: {\n backgroundColor: slateGrey[3],\n border: `1px solid ${slateGrey[5]}`,\n },\n itemExpanded: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n },\n header: {\n backgroundColor: 'transparent',\n color: slateGrey[12],\n },\n headerHover: {\n backgroundColor: slateGrey[5],\n },\n body: {\n color: slateGrey[8],\n },\n linkButton: {\n backgroundColor: purple[0],\n color: purple[6],\n },\n categoryHeader: {\n color: slateGrey[8],\n },\n emptyState: {\n color: slateGrey[7],\n },\n },\n};\n\n// ============================================================================\n// NavTipItem Component\n// ============================================================================\n\ninterface NavTipItemProps {\n item: NavTipAction;\n isExpanded: boolean;\n onToggle: () => void;\n onNavigate: (href: string, external: boolean) => void;\n theme: 'light' | 'dark';\n}\n\nfunction NavTipItem({ item, isExpanded, onToggle, onNavigate, theme }: NavTipItemProps) {\n const [isHovered, setIsHovered] = useState(false);\n const colors = themeStyles[theme];\n const { title, description, href, icon, external } = item.config;\n\n const itemStyle: React.CSSProperties = {\n ...baseStyles.item,\n ...colors.item,\n ...(isExpanded ? colors.itemExpanded : {}),\n };\n\n const headerStyle: React.CSSProperties = {\n ...baseStyles.header,\n ...colors.header,\n ...(isHovered ? colors.headerHover : {}),\n };\n\n const chevronStyle: React.CSSProperties = {\n ...baseStyles.chevron,\n transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)',\n };\n\n const bodyStyle: React.CSSProperties = {\n ...baseStyles.body,\n ...colors.body,\n maxHeight: isExpanded ? '500px' : '0',\n paddingBottom: isExpanded ? '16px' : '0',\n };\n\n const handleLinkClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (href) {\n onNavigate(href, external ?? false);\n }\n };\n\n return (\n <div style={itemStyle} data-nav-tip-id={item.config.id}>\n <button\n type=\"button\"\n style={headerStyle}\n onClick={onToggle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n aria-expanded={isExpanded}\n >\n {icon && <span style={baseStyles.icon}>{icon}</span>}\n <span>{title}</span>\n <span style={chevronStyle}>{'\\u25BC'}</span>\n </button>\n <div style={bodyStyle} aria-hidden={!isExpanded}>\n <p style={baseStyles.description}>{description}</p>\n {href && (\n <a\n href={href}\n onClick={handleLinkClick}\n style={{ ...baseStyles.linkButton, ...colors.linkButton }}\n target={external ? '_blank' : undefined}\n rel={external ? 'noopener noreferrer' : undefined}\n >\n Go {external ? '\\u2197' : '\\u2192'}\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// NavWidget Component\n// ============================================================================\n\n/**\n * NavWidget - Renders a collapsible navigation tips accordion.\n *\n * This component demonstrates the compositional action pattern:\n * - Parent (NavWidget) receives `config.actions` array\n * - Each action has optional `showWhen` for per-item visibility\n * - Parent evaluates showWhen and filters visible tips\n * - Parent manages expand state and re-rendering on context changes\n */\nexport function NavWidget({ config, runtime, instanceId }: NavWidgetProps) {\n // Force re-render when context/accumulator changes.\n const [renderTick, forceUpdate] = useReducer((x: number) => x + 1, 0);\n\n // Track expanded tip IDs\n const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set());\n\n // Subscribe to context changes for reactive updates\n useEffect(() => {\n const unsubscribe = runtime.context.subscribe(() => {\n forceUpdate();\n });\n return unsubscribe;\n }, [runtime.context]);\n\n // Subscribe to accumulator changes for event_count-based showWhen\n useEffect(() => {\n if (!runtime.accumulator?.subscribe) return;\n return runtime.accumulator.subscribe(() => {\n forceUpdate();\n });\n }, [runtime.accumulator]);\n\n // Register accumulator predicates from scope config\n useEffect(() => {\n if (!config.scope || !runtime.accumulator?.register) return;\n const { events: eventNames, urlContains, props: propFilters } = config.scope;\n\n // Scan showWhen conditions for event_count keys\n const keys = new Set<string>();\n for (const action of config.actions) {\n if (action.showWhen?.type === 'rules') {\n for (const rule of action.showWhen.rules) {\n for (const cond of rule.conditions) {\n if ((cond as any).type === 'event_count' && (cond as any).key) {\n keys.add((cond as any).key);\n }\n }\n }\n }\n }\n\n for (const key of keys) {\n runtime.accumulator.register(key, (event: any) => {\n if (!eventNames.includes(event.name)) return false;\n if (urlContains) {\n const pathname = String(event.props?.pathname ?? '');\n if (!pathname.includes(urlContains)) return false;\n }\n if (propFilters) {\n for (const [k, v] of Object.entries(propFilters)) {\n if (event.props?.[k] !== v) return false;\n }\n }\n return true;\n });\n }\n }, [config.scope, config.actions, runtime.accumulator]);\n\n // Filter visible tips based on per-item showWhen\n // biome-ignore lint/correctness/useExhaustiveDependencies: renderTick is intentionally included to force re-evaluation when the runtime's mutable context changes (subscribed above via forceUpdate)\n const visibleTips = useMemo(\n () =>\n config.actions.filter((tip) => {\n if (!tip.showWhen) return true;\n try {\n const result = runtime.evaluateSync<boolean>(tip.showWhen);\n return result.value;\n } catch {\n // If strategy evaluation fails, hide the tip (fail-closed)\n return false;\n }\n }),\n [config.actions, runtime, renderTick]\n );\n\n // Group by category\n const categoryGroups = useMemo(() => {\n const groups = new Map<string | undefined, NavTipAction[]>();\n for (const tip of visibleTips) {\n const cat = tip.config.category;\n if (!groups.has(cat)) {\n groups.set(cat, []);\n }\n groups.get(cat)!.push(tip);\n }\n return groups;\n }, [visibleTips]);\n\n // Check if any items have categories\n const hasCategories = useMemo(() => visibleTips.some((t) => t.config.category), [visibleTips]);\n\n // Resolve theme (auto \u2192 detect system preference)\n const resolvedTheme = useMemo(() => {\n if (config.theme !== 'auto') return config.theme;\n if (typeof window !== 'undefined') {\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n }, [config.theme]);\n\n // Handle tip toggle\n const handleToggle = useCallback(\n (id: string) => {\n setExpandedIds((prev) => {\n const wasExpanded = prev.has(id);\n\n let next: Set<string>;\n if (config.expandBehavior === 'single') {\n // In single mode, emit collapse events for any previously-expanded tips\n for (const prevId of prev) {\n if (prevId !== id) {\n runtime.events.publish('nav:toggled', {\n instanceId,\n tipId: prevId,\n expanded: false,\n timestamp: Date.now(),\n });\n }\n }\n next = wasExpanded ? new Set() : new Set([id]);\n } else {\n next = new Set(prev);\n if (wasExpanded) {\n next.delete(id);\n } else {\n next.add(id);\n }\n }\n\n // Emit event for the clicked tip using fresh state from the updater\n runtime.events.publish('nav:toggled', {\n instanceId,\n tipId: id,\n expanded: !wasExpanded,\n timestamp: Date.now(),\n });\n\n return next;\n });\n },\n [config.expandBehavior, runtime.events, instanceId]\n );\n\n // Handle navigation with event publishing\n const handleNavigate = useCallback(\n (href: string, external: boolean) => {\n // Reject dangerous URIs to prevent XSS\n const normalizedHref = href.trim().toLowerCase();\n if (normalizedHref.startsWith('javascript:') || normalizedHref.startsWith('data:')) {\n return;\n }\n\n runtime.events.publish('nav:tip_clicked', {\n instanceId,\n href,\n external,\n timestamp: Date.now(),\n });\n\n if (external) {\n window.open(href, '_blank', 'noopener,noreferrer');\n } else {\n window.location.href = href;\n }\n },\n [runtime.events, instanceId]\n );\n\n // Compute container styles\n const containerStyle: React.CSSProperties = {\n ...baseStyles.container,\n ...themeStyles[resolvedTheme].container,\n };\n\n const categoryHeaderStyle: React.CSSProperties = {\n ...baseStyles.categoryHeader,\n ...themeStyles[resolvedTheme].categoryHeader,\n };\n\n const emptyStateStyle: React.CSSProperties = {\n ...baseStyles.emptyState,\n ...themeStyles[resolvedTheme].emptyState,\n };\n\n // Render a list of nav tip items\n const renderItems = (items: NavTipAction[]) =>\n items.map((tip) => (\n <NavTipItem\n key={tip.config.id}\n item={tip}\n isExpanded={expandedIds.has(tip.config.id)}\n onToggle={() => handleToggle(tip.config.id)}\n onNavigate={handleNavigate}\n theme={resolvedTheme}\n />\n ));\n\n // Empty state\n if (visibleTips.length === 0) {\n return (\n <div style={containerStyle} data-adaptive-id={instanceId} data-adaptive-type=\"adaptive-nav\">\n <div style={emptyStateStyle}>No navigation tips available.</div>\n </div>\n );\n }\n\n return (\n <div style={containerStyle} data-adaptive-id={instanceId} data-adaptive-type=\"adaptive-nav\">\n <div style={baseStyles.accordion}>\n {hasCategories\n ? Array.from(categoryGroups.entries()).map(([category, items]) => (\n <React.Fragment key={category ?? '__ungrouped'}>\n {category && (\n <div style={categoryHeaderStyle} data-category-header={category}>\n {category}\n </div>\n )}\n {renderItems(items)}\n </React.Fragment>\n ))\n : renderItems(visibleTips)}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Mountable Widget Interface\n// ============================================================================\n\n/**\n * Mountable widget interface for the runtime's WidgetRegistry.\n */\nexport const NavMountableWidget = {\n mount(\n container: HTMLElement,\n config?: NavConfig & { runtime?: NavWidgetRuntime; instanceId?: string }\n ) {\n const {\n runtime,\n instanceId = 'nav-widget',\n ...navConfig\n } = config || {\n expandBehavior: 'single' as const,\n theme: 'auto' as const,\n actions: [],\n };\n\n // React rendering when runtime + ReactDOM are available\n if (runtime && typeof createRoot === 'function') {\n const root = createRoot(container);\n root.render(\n React.createElement(NavWidget, {\n config: navConfig as NavConfig,\n runtime: runtime as NavWidgetRuntime,\n instanceId,\n })\n );\n return () => {\n root.unmount();\n };\n }\n\n // HTML fallback for non-React environments\n const tips = (navConfig as NavConfig).actions || [];\n container.innerHTML = `\n <div style=\"font-family: system-ui; max-width: 100%;\">\n ${tips\n .map(\n (tip) => `\n <div style=\"margin-bottom: 4px; padding: 12px 16px; background: ${slateGrey[12]}; border-radius: 8px;\">\n ${tip.config.icon ? `<span>${escapeHtml(tip.config.icon)}</span> ` : ''}<strong>${escapeHtml(tip.config.title)}</strong>\n <p style=\"margin-top: 8px; color: ${slateGrey[6]}; font-size: 13px;\">${escapeHtml(tip.config.description)}</p>\n ${tip.config.href ? `<a href=\"${escapeHtml(tip.config.href)}\" style=\"color: ${purple[2]}; font-size: 13px;\">Go →</a>` : ''}\n </div>\n `\n )\n .join('')}\n </div>\n `;\n\n return () => {\n container.innerHTML = '';\n };\n },\n};\n\nexport default NavWidget;\n", "/**\n * Adaptive Nav - Runtime Module\n *\n * Runtime manifest for the navigation tips accordion adaptive.\n * Includes widget-based nav tips and navigation action executors\n * (scrollTo, navigate) previously in adaptive-navigation.\n */\n\nimport { NavMountableWidget } from './NavWidget';\nimport type { ActionExecutor, ExecutorResult, NavigateAction, ScrollToAction } from './types';\n\n// ============================================================================\n// Navigation Action Executors (merged from adaptive-navigation)\n// ============================================================================\n\n/**\n * Execute a scrollTo action\n */\nexport const executeScrollTo: ActionExecutor<ScrollToAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n\n // Scroll to element\n anchorEl.scrollIntoView({\n behavior: action.behavior ?? 'smooth',\n block: action.block ?? 'center',\n inline: action.inline ?? 'nearest',\n });\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'navigation:scrollTo',\n anchorId: action.anchorId,\n behavior: action.behavior ?? 'smooth',\n });\n\n return {\n cleanup: () => {\n // Optionally restore scroll position on revert\n },\n };\n};\n\n/**\n * Execute a navigate action\n */\nexport const executeNavigate: ActionExecutor<NavigateAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n // Validate URL to prevent javascript: URLs\n const url = action.url.trim();\n if (url.toLowerCase().startsWith('javascript:')) {\n throw new Error('javascript: URLs are not allowed');\n }\n\n const target = action.target ?? '_self';\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'navigation:navigate',\n url: action.url,\n target,\n });\n\n if (target === '_blank') {\n // Open in new tab\n window.open(url, '_blank', 'noopener,noreferrer');\n } else {\n // Navigate in current tab\n window.location.href = url;\n }\n\n return {\n cleanup: () => {\n // Navigation cannot be reverted\n },\n };\n};\n\n// ============================================================================\n// Executor Definitions for Registration\n// ============================================================================\n\n/**\n * All executors provided by this app.\n * These are registered with the runtime's ExecutorRegistry.\n */\nexport const executors = [\n { kind: 'navigation:scrollTo', executor: executeScrollTo },\n { kind: 'navigation:navigate', executor: executeNavigate },\n] as const;\n\n// ============================================================================\n// App Runtime Manifest\n// ============================================================================\n\n/**\n * Runtime manifest for adaptive-nav.\n *\n * Provides:\n * - Navigation action executors (scrollTo, navigate)\n * - Widget-based nav tips accordion (compositional nav:tip actions)\n */\nexport const runtime = {\n id: 'adaptive-nav',\n version: '2.0.0',\n name: 'Navigation Tips',\n description: 'Navigation actions and accordion-based tips with per-item conditional visibility',\n\n /**\n * Navigation action executors (scrollTo, navigate).\n */\n executors,\n\n /**\n * Widget definitions for the runtime's WidgetRegistry.\n */\n widgets: [\n {\n id: 'adaptive-nav:tips',\n component: NavMountableWidget,\n metadata: {\n name: 'Navigation Tips',\n description: 'Accordion of contextual navigation tips with per-item visibility',\n icon: '\\u{1F9ED}',\n },\n },\n ],\n};\n\nexport default runtime;\n", "/**\n * CDN Entry Point for Adaptive Nav\n *\n * This module is bundled for CDN delivery and self-registers with the global\n * SynOS app registry when loaded dynamically via the AppLoader.\n */\n\nimport NavEditor, { editorPanel } from './editor';\nimport { executors, runtime } from './runtime';\nimport type { NavTipAction } from './types';\n\n/**\n * App manifest for registry registration.\n * Follows the AppManifest interface expected by AppLoader/AppRegistry.\n */\nexport const manifest = {\n id: 'adaptive-nav',\n version: runtime.version,\n name: runtime.name,\n description: runtime.description,\n runtime: {\n actions: executors.map(({ kind, executor }) => ({\n kind,\n executor,\n })),\n widgets: runtime.widgets,\n /**\n * Extract notify watcher entries from tile config props.\n * The runtime evaluates these continuously (even with drawer closed)\n * and publishes nav:tip_revealed when showWhen transitions false \u2192 true.\n */\n notifyWatchers(props: Record<string, unknown>) {\n const actions = (props.actions ?? []) as NavTipAction[];\n return actions\n .filter((a) => a.notify && a.showWhen)\n .map((a) => ({\n id: `nav:${a.config.id}`,\n strategy: a.showWhen!,\n eventName: 'nav:tip_revealed',\n eventProps: {\n tipId: a.config.id,\n title: a.notify!.title,\n body: a.notify!.body,\n icon: a.notify!.icon,\n },\n }));\n },\n },\n editor: {\n component: NavEditor,\n panel: editorPanel,\n getActionLabel(action: Record<string, unknown>) {\n const config = (action.config as Record<string, unknown>) || {};\n return (config.title as string) || (action.kind as string) || 'nav:tip';\n },\n },\n metadata: {\n isBuiltIn: false,\n },\n};\n\n/**\n * Self-register with global registry if available.\n * This happens when loaded via script tag (UMD).\n */\nif (typeof window !== 'undefined') {\n const registry = (window as any).SynOS?.appRegistry;\n if (registry && typeof registry.register === 'function') {\n registry.register(manifest);\n }\n}\n\nexport default manifest;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["cn", "classes", "_R", "_jsx", "type", "props", "key", "R", "p", "c", "jsx", "jsxs", "Fragment", "_R", "react_default", "_", "k", "useState", "useEffect", "useMemo", "useCallback", "useRef", "useReducer", "_R", "createElement", "_R", "forwardRef", "_R", "_r", "_R", "Fragment", "Suspense", "Children", "Component", "PureComponent", "_RD", "react_dom_default", "_", "k", "CSS_SELECTOR_TYPE", "libraryName", "showWarning", "id", "args", "DEFAULT_OPTIONS", "CSS_SELECTOR_TYPE", "isRegExp", "input", "wildcardToRegExp", "input", "createPatternMatcher", "list", "matchFunctions", "item", "isRegExp", "result", "showWarning", "re", "matchFunction", "INVALID_ID_RE", "INVALID_CLASS_RE", "SELECTOR_PATTERN", "CSS_SELECTOR_TYPE", "attributeBlacklistMatch", "createPatternMatcher", "ESCAPED_COLON", "toKebabCase", "string", "toCamelCase", "match", "p1", "p2", "toPascalCase", "camelCase", "mergeClasses", "classes", "className", "index", "array", "hasA11yProp", "props", "prop", "defaultAttributes", "Icon", "forwardRef", "color", "size", "strokeWidth", "absoluteStrokeWidth", "className", "children", "iconNode", "rest", "ref", "createElement", "defaultAttributes", "mergeClasses", "hasA11yProp", "tag", "attrs", "createLucideIcon", "iconName", "iconNode", "Component", "forwardRef", "className", "props", "ref", "createElement", "Icon", "mergeClasses", "toKebabCase", "toPascalCase", "__iconNode", "Check", "createLucideIcon", "DetectionBadge", "found", "jsx", "cn", "DismissedSection", "count", "children", "isOpen", "setIsOpen", "useState", "jsxs", "e", "jsx", "EditorBody", "children", "jsx", "EditorCard", "children", "itemKey", "onClick", "onMouseEnter", "onMouseLeave", "className", "validated", "jsx", "cn", "EditorFooter", "onSave", "onPublish", "jsxs", "jsx", "EditorHeader", "title", "subtitle", "jsxs", "jsx", "EditorInput", "label", "className", "props", "jsxs", "jsx", "cn", "EditorLayout", "children", "jsx", "EmptyState", "message", "jsx", "ProgressBar", "current", "target", "pct", "jsxs", "jsx", "cn", "JourneyNode", "cs", "isLast", "hasProgress", "inProgress", "Check", "TriggerJourney", "status", "conditions", "allPassed", "c", "isMulti", "i", "GroupHeader", "label", "count", "className", "jsxs", "cn", "jsx", "formatOperator", "op", "humanizeKey", "key", "cleanUrl", "url", "PAGE_VIEW_RE", "CLICK_RE", "formatConditionLabel", "condition", "accumulatorCount", "target", "current", "humanized", "instruction", "shortLabel", "topic", "lastWord", "w", "cleaned", "anchorId", "state", "eventName", "val", "parts", "label", "threshold", "inverted", "limit", "routeId", "getRuntime", "evaluateConditionLocally", "condition", "runtime", "ctx", "type", "passed", "accCount", "key", "withinMs", "count", "target", "pattern", "anchor", "a", "width", "height", "val", "threshold", "limitReached", "formatted", "formatConditionLabel", "evaluateShowWhen", "showWhen", "allConditions", "rule", "ruleMatched", "cs", "useShowWhenStatus", "items", "statuses", "setStatuses", "useState", "itemsRef", "useRef", "evaluate", "useCallback", "map", "item", "useEffect", "unsubs", "interval", "u", "truncate", "text", "max", "isRuleStrategy", "s", "describeTrigger", "showWhen", "pages", "anchors", "rule", "condition", "parts", "summarizeNavItem", "item", "icon", "title", "ACTION_NAMESPACES", "isOwnAction", "action", "ns", "isRuleStrategy", "s", "extractTargetingInfo", "showWhen", "pagePatterns", "anchorSelectors", "rule", "cond", "c", "hasTargeting", "extractFirstPage", "extractFirstAnchor", "flattenItems", "config", "isOwnAction", "tip", "i", "summarizeNavItem", "describeTrigger", "filterConfig", "dismissedKeys", "ownActions", "_", "useDetection", "items", "getCurrentRoute", "detectionMap", "setDetectionMap", "useState", "itemsRef", "useRef", "useEffect", "runDetection", "map", "currentPath", "item", "targeting", "pageMatch", "pattern", "anchorFound", "element", "interval", "NavEditor", "onChange", "editor", "typedConfig", "setDismissedKeys", "editingKey", "setEditingKey", "previewMode", "setPreviewMode", "_hoveredKey", "setHoveredKey", "mode", "allKeys", "empty", "initialConsumed", "allItems", "activeItems", "dismissedItems", "totalLinks", "showWhenItems", "useMemo", "showWhenStatuses", "useShowWhenStatus", "foundCount", "handleDismiss", "useCallback", "key", "prev", "next", "handleRestore", "handleCardBodyClick", "handleTriggerClick", "pageUrl", "handleBackToList", "handleBeforeAfter", "filtered", "handleFieldChange", "index", "field", "value", "link", "otherActions", "a", "updated", "handlePublish", "handleCardHover", "handleCardLeave", "renderEditFields", "it", "jsxs", "jsx", "EditorInput", "e", "subtitle", "EditorLayout", "EditorHeader", "EditorBody", "editIndex", "editItem", "Fragment", "EmptyState", "GroupHeader", "detection", "EditorCard", "DetectionBadge", "TriggerJourney", "DismissedSection", "EditorFooter", "editorPanel", "editor_default", "NavEditor", "base", "brand", "slateGrey", "green", "yellow", "red", "blue", "orange", "purple", "pink", "text", "slateGrey", "background", "border", "button", "base", "brand", "red", "green", "badge", "yellow", "purple", "blue", "orange", "pink", "badgeBanner", "alert", "tag", "menu", "inputDropdown", "inputField", "toggle", "checkbox", "avatar", "progressBarSlider", "card", "sidebar", "modal", "tab", "table", "breadcrumbs", "loadingIndicator", "datePicker", "scroll", "_RD", "client_default", "_", "k", "createRoot", "escapeHtml", "str", "baseStyles", "themeStyles", "base", "slateGrey", "purple", "NavTipItem", "item", "isExpanded", "onToggle", "onNavigate", "theme", "isHovered", "setIsHovered", "useState", "colors", "title", "description", "href", "icon", "external", "itemStyle", "headerStyle", "chevronStyle", "bodyStyle", "handleLinkClick", "e", "jsxs", "jsx", "NavWidget", "config", "runtime", "instanceId", "renderTick", "forceUpdate", "useReducer", "x", "expandedIds", "setExpandedIds", "useEffect", "eventNames", "urlContains", "propFilters", "keys", "action", "rule", "cond", "key", "event", "k", "v", "visibleTips", "useMemo", "tip", "categoryGroups", "groups", "cat", "hasCategories", "t", "resolvedTheme", "handleToggle", "useCallback", "id", "prev", "wasExpanded", "next", "prevId", "handleNavigate", "normalizedHref", "containerStyle", "categoryHeaderStyle", "emptyStateStyle", "renderItems", "items", "category", "react_default", "NavMountableWidget", "container", "navConfig", "createRoot", "root", "tips", "executeScrollTo", "action", "context", "anchorEl", "executeNavigate", "url", "target", "executors", "runtime", "NavMountableWidget", "manifest", "runtime", "executors", "kind", "executor", "props", "editor_default", "editorPanel", "action", "registry", "cdn_default"]
|
|
7
|
-
}
|