lula2 0.0.10 → 0.1.1-nightly.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.
Files changed (30) hide show
  1. package/README.md +40 -5
  2. package/dist/_app/immutable/assets/{0.DUfo9K33.css → 0.BjwH76RW.css} +1 -1
  3. package/dist/_app/immutable/assets/DynamicControlEditor.DoNLxeLe.css +1 -0
  4. package/dist/_app/immutable/chunks/BtOhWAVU.js +2 -0
  5. package/dist/_app/immutable/chunks/{Bty54Wy4.js → C5zWTfmV.js} +1 -1
  6. package/dist/_app/immutable/chunks/Cby0Z7eP.js +2 -0
  7. package/dist/_app/immutable/chunks/{BqNBD7oY.js → CoF2vljD.js} +1 -1
  8. package/dist/_app/immutable/chunks/{fCDFfNtz.js → D3AAXov_.js} +1 -1
  9. package/dist/_app/immutable/chunks/{DUI6GvcB.js → D4wsprzy.js} +1 -1
  10. package/dist/_app/immutable/chunks/{DQXxLgJn.js → DSi9HfzB.js} +4 -4
  11. package/dist/_app/immutable/chunks/{BYKwBiub.js → DnJ0bPgj.js} +1 -1
  12. package/dist/_app/immutable/chunks/{DUz6FRLu.js → DqsOU3kV.js} +1 -1
  13. package/dist/_app/immutable/entry/{app.DKW3nM3v.js → app.pY_jLQAk.js} +2 -2
  14. package/dist/_app/immutable/entry/start.Cdw5p6kF.js +1 -0
  15. package/dist/_app/immutable/nodes/{0.wwwcTLiU.js → 0.BLkz8enN.js} +1 -1
  16. package/dist/_app/immutable/nodes/{1.CdmpkyKT.js → 1.CfOyMeub.js} +1 -1
  17. package/dist/_app/immutable/nodes/{2.Dxv3fx_R.js → 2.DOcHSA9J.js} +1 -1
  18. package/dist/_app/immutable/nodes/{3.CIi_G6Ph.js → 3.D2EgveDf.js} +1 -1
  19. package/dist/_app/immutable/nodes/4.Dg1K2qE0.js +9 -0
  20. package/dist/_app/version.json +1 -1
  21. package/dist/cli/commands/crawl.js +77 -23
  22. package/dist/index.html +10 -10
  23. package/dist/index.js +75 -22
  24. package/package.json +125 -122
  25. package/src/routes/setup/+page.svelte +16 -8
  26. package/dist/_app/immutable/assets/DynamicControlEditor.BkVTzFZ-.css +0 -1
  27. package/dist/_app/immutable/chunks/BJF-sFqz.js +0 -2
  28. package/dist/_app/immutable/chunks/CBYXl-8c.js +0 -2
  29. package/dist/_app/immutable/entry/start.DdyS338t.js +0 -1
  30. package/dist/_app/immutable/nodes/4.B1tIC9Eq.js +0 -9
@@ -1 +1 @@
1
- import{t as U,l as R,m as Y,E as M,L as B,M as K,N as $,O as C,P as O,v as F,w,x as Z,U as q,y as z,Q as H,A as G,z as Q,R as D,T as V,V as W,W as X,h,X as j,d as y,Y as J,Z as k,_ as ee,$ as L,H as re,a0 as ne,a1 as se,a2 as ae,a3 as A,a4 as ue,a5 as ie,k as te,a6 as fe,a7 as le,a8 as ce,a9 as de,S as oe,aa as _e,ab as ve,ac as N,ad as g}from"./BJF-sFqz.js";function Pe(e,r,a=!1){R&&Y();var n=e,i=null,t=null,l=q,o=a?M:0,v=!1;const S=(c,u=!0)=>{v=!0,_(u,c)};var f=null;function P(){f!==null&&(f.lastChild.remove(),n.before(f),f=null);var c=l?i:t,u=l?t:i;c&&H(c),u&&G(u,()=>{l?t=null:i=null})}const _=(c,u)=>{if(l===(l=c))return;let x=!1;if(R){const E=B(n)===K;!!l===E&&(n=$(),C(n),O(!1),x=!0)}var b=z(),d=n;if(b&&(f=document.createDocumentFragment(),f.append(d=F())),l?i??=u&&w(()=>u(d)):t??=u&&w(()=>u(d)),b){var m=Z,s=l?i:t,p=l?t:i;s&&m.skipped_effects.delete(s),p&&m.skipped_effects.add(p),m.add_callback(P)}else P();x&&O(!0)};U(()=>{v=!1,r(S),v||_(null,null)},o),R&&(n=Q)}let I=!1,T=Symbol();function xe(e,r,a){const n=a[r]??={store:null,source:V(void 0),unsubscribe:D};if(n.store!==e&&!(T in a))if(n.unsubscribe(),n.store=e??null,e==null)n.source.v=void 0,n.unsubscribe=D;else{var i=!0;n.unsubscribe=W(e,t=>{i?n.source.v=t:y(n.source,t)}),i=!1}return e&&T in a?X(e):h(n.source)}function Ee(){const e={};function r(){j(()=>{for(var a in e)e[a].unsubscribe();J(e,T,{enumerable:!1,value:!0})})}return[e,r]}function pe(e){var r=I;try{return I=!1,[e(),I]}finally{I=r}}const be={get(e,r){if(!e.exclude.includes(r))return e.props[r]},set(e,r){return!1},getOwnPropertyDescriptor(e,r){if(!e.exclude.includes(r)&&r in e.props)return{enumerable:!0,configurable:!0,value:e.props[r]}},has(e,r){return e.exclude.includes(r)?!1:r in e.props},ownKeys(e){return Reflect.ownKeys(e.props).filter(r=>!e.exclude.includes(r))}};function Ie(e,r,a){return new Proxy({props:e,exclude:r},be)}const me={get(e,r){if(!e.exclude.includes(r))return h(e.version),r in e.special?e.special[r]():e.props[r]},set(e,r,a){if(!(r in e.special)){var n=A;try{g(e.parent_effect),e.special[r]=he({get[r](){return e.props[r]}},r,L)}finally{g(n)}}return e.special[r](a),N(e.version),!0},getOwnPropertyDescriptor(e,r){if(!e.exclude.includes(r)&&r in e.props)return{enumerable:!0,configurable:!0,value:e.props[r]}},deleteProperty(e,r){return e.exclude.includes(r)||(e.exclude.push(r),N(e.version)),!0},has(e,r){return e.exclude.includes(r)?!1:r in e.props},ownKeys(e){return Reflect.ownKeys(e.props).filter(r=>!e.exclude.includes(r))}};function Re(e,r){return new Proxy({props:e,exclude:r,special:{},version:ve(0),parent_effect:A},me)}function he(e,r,a,n){var i=!fe||(a&le)!==0,t=(a&ie)!==0,l=(a&de)!==0,o=n,v=!0,S=()=>(v&&(v=!1,o=l?te(n):n),o),f;if(t){var P=oe in e||_e in e;f=k(e,r)?.set??(P&&r in e?s=>e[r]=s:void 0)}var _,c=!1;t?[_,c]=pe(()=>e[r]):_=e[r],_===void 0&&n!==void 0&&(_=S(),f&&(i&&ee(),f(_)));var u;if(i?u=()=>{var s=e[r];return s===void 0?S():(v=!0,s)}:u=()=>{var s=e[r];return s!==void 0&&(o=void 0),s===void 0?o:s},i&&(a&L)===0)return u;if(f){var x=e.$$legacy;return(function(s,p){return arguments.length>0?((!i||!p||x||c)&&f(p?u():s),s):u()})}var b=!1,d=((a&ce)!==0?re:ne)(()=>(b=!1,u()));t&&h(d);var m=A;return(function(s,p){if(arguments.length>0){const E=p?h(d):i&&t?se(s):s;return y(d,E),b=!0,o!==void 0&&(o=E),s}return ae&&b||(m.f&ue)!==0?d.v:h(d)})}export{xe as a,Pe as i,Re as l,he as p,Ie as r,Ee as s};
1
+ import{t as U,l as R,m as Y,E as M,L as B,M as K,N as $,O as C,P as O,v as F,w,x as Z,U as q,y as z,Q as H,A as G,z as Q,R as D,T as V,V as W,W as X,h,X as j,d as y,Y as J,Z as k,_ as ee,$ as L,H as re,a0 as ne,a1 as se,a2 as ae,a3 as A,a4 as ue,a5 as ie,k as te,a6 as fe,a7 as le,a8 as ce,a9 as de,S as oe,aa as _e,ab as ve,ac as N,ad as g}from"./Cby0Z7eP.js";function Pe(e,r,a=!1){R&&Y();var n=e,i=null,t=null,l=q,o=a?M:0,v=!1;const S=(c,u=!0)=>{v=!0,_(u,c)};var f=null;function P(){f!==null&&(f.lastChild.remove(),n.before(f),f=null);var c=l?i:t,u=l?t:i;c&&H(c),u&&G(u,()=>{l?t=null:i=null})}const _=(c,u)=>{if(l===(l=c))return;let x=!1;if(R){const E=B(n)===K;!!l===E&&(n=$(),C(n),O(!1),x=!0)}var b=z(),d=n;if(b&&(f=document.createDocumentFragment(),f.append(d=F())),l?i??=u&&w(()=>u(d)):t??=u&&w(()=>u(d)),b){var m=Z,s=l?i:t,p=l?t:i;s&&m.skipped_effects.delete(s),p&&m.skipped_effects.add(p),m.add_callback(P)}else P();x&&O(!0)};U(()=>{v=!1,r(S),v||_(null,null)},o),R&&(n=Q)}let I=!1,T=Symbol();function xe(e,r,a){const n=a[r]??={store:null,source:V(void 0),unsubscribe:D};if(n.store!==e&&!(T in a))if(n.unsubscribe(),n.store=e??null,e==null)n.source.v=void 0,n.unsubscribe=D;else{var i=!0;n.unsubscribe=W(e,t=>{i?n.source.v=t:y(n.source,t)}),i=!1}return e&&T in a?X(e):h(n.source)}function Ee(){const e={};function r(){j(()=>{for(var a in e)e[a].unsubscribe();J(e,T,{enumerable:!1,value:!0})})}return[e,r]}function pe(e){var r=I;try{return I=!1,[e(),I]}finally{I=r}}const be={get(e,r){if(!e.exclude.includes(r))return e.props[r]},set(e,r){return!1},getOwnPropertyDescriptor(e,r){if(!e.exclude.includes(r)&&r in e.props)return{enumerable:!0,configurable:!0,value:e.props[r]}},has(e,r){return e.exclude.includes(r)?!1:r in e.props},ownKeys(e){return Reflect.ownKeys(e.props).filter(r=>!e.exclude.includes(r))}};function Ie(e,r,a){return new Proxy({props:e,exclude:r},be)}const me={get(e,r){if(!e.exclude.includes(r))return h(e.version),r in e.special?e.special[r]():e.props[r]},set(e,r,a){if(!(r in e.special)){var n=A;try{g(e.parent_effect),e.special[r]=he({get[r](){return e.props[r]}},r,L)}finally{g(n)}}return e.special[r](a),N(e.version),!0},getOwnPropertyDescriptor(e,r){if(!e.exclude.includes(r)&&r in e.props)return{enumerable:!0,configurable:!0,value:e.props[r]}},deleteProperty(e,r){return e.exclude.includes(r)||(e.exclude.push(r),N(e.version)),!0},has(e,r){return e.exclude.includes(r)?!1:r in e.props},ownKeys(e){return Reflect.ownKeys(e.props).filter(r=>!e.exclude.includes(r))}};function Re(e,r){return new Proxy({props:e,exclude:r,special:{},version:ve(0),parent_effect:A},me)}function he(e,r,a,n){var i=!fe||(a&le)!==0,t=(a&ie)!==0,l=(a&de)!==0,o=n,v=!0,S=()=>(v&&(v=!1,o=l?te(n):n),o),f;if(t){var P=oe in e||_e in e;f=k(e,r)?.set??(P&&r in e?s=>e[r]=s:void 0)}var _,c=!1;t?[_,c]=pe(()=>e[r]):_=e[r],_===void 0&&n!==void 0&&(_=S(),f&&(i&&ee(),f(_)));var u;if(i?u=()=>{var s=e[r];return s===void 0?S():(v=!0,s)}:u=()=>{var s=e[r];return s!==void 0&&(o=void 0),s===void 0?o:s},i&&(a&L)===0)return u;if(f){var x=e.$$legacy;return(function(s,p){return arguments.length>0?((!i||!p||x||c)&&f(p?u():s),s):u()})}var b=!1,d=((a&ce)!==0?re:ne)(()=>(b=!1,u()));t&&h(d);var m=A;return(function(s,p){if(arguments.length>0){const E=p?h(d):i&&t?se(s):s;return y(d,E),b=!0,o!==void 0&&(o=E),s}return ae&&b||(m.f&ue)!==0?d.v:h(d)})}export{xe as a,Pe as i,Re as l,he as p,Ie as r,Ee as s};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.wwwcTLiU.js","../chunks/DsnmJJEf.js","../chunks/BJF-sFqz.js","../chunks/DUz6FRLu.js","../chunks/fCDFfNtz.js","../chunks/DUI6GvcB.js","../chunks/BqNBD7oY.js","../chunks/CBYXl-8c.js","../chunks/Bty54Wy4.js","../assets/0.DUfo9K33.css","../nodes/1.CdmpkyKT.js","../nodes/2.Dxv3fx_R.js","../chunks/DQXxLgJn.js","../chunks/BYKwBiub.js","../assets/DynamicControlEditor.BkVTzFZ-.css","../nodes/3.CIi_G6Ph.js","../nodes/4.B1tIC9Eq.js"])))=>i.map(i=>d[i]);
2
- import{d as k,aa as U,h as f,ao as Y,ap as G,aq as J,Y as K,ar as W,T as z,p as F,C as H,u as Q,o as X,g as O,as as Z,f as V,a as w,s as $,b as y,e as ee,ak as x,c as te,r as re,al as L,am as se,J as ae,K as ne}from"../chunks/BJF-sFqz.js";import"../chunks/DsnmJJEf.js";import{p as S,i as A}from"../chunks/DUz6FRLu.js";import{c as C}from"../chunks/BqNBD7oY.js";import{b as T}from"../chunks/BYKwBiub.js";function oe(c){return class extends ce{constructor(e){super({component:c,...e})}}}class ce{#t;#e;constructor(e){var a=new Map,i=(r,t)=>{var s=z(t,!1,!1);return a.set(r,s),s};const l=new Proxy({...e.props||{},$$events:{}},{get(r,t){return f(a.get(t)??i(t,Reflect.get(r,t)))},has(r,t){return t===U?!0:(f(a.get(t)??i(t,Reflect.get(r,t))),Reflect.has(r,t))},set(r,t,s){return k(a.get(t)??i(t,s),s),Reflect.set(r,t,s)}});this.#e=(e.hydrate?Y:G)(e.component,{target:e.target,anchor:e.anchor,props:l,context:e.context,intro:e.intro??!1,recover:e.recover}),(!e?.props?.$$host||e.sync===!1)&&J(),this.#t=l.$$events;for(const r of Object.keys(this.#e))r==="$set"||r==="$destroy"||r==="$on"||K(this,r,{get(){return this.#e[r]},set(t){this.#e[r]=t},enumerable:!0});this.#e.$set=r=>{Object.assign(l,r)},this.#e.$destroy=()=>{W(this.#e)}}$set(e){this.#e.$set(e)}$on(e,a){this.#t[e]=this.#t[e]||[];const i=(...l)=>a.call(this,...l);return this.#t[e].push(i),()=>{this.#t[e]=this.#t[e].filter(l=>l!==i)}}$destroy(){this.#e.$destroy()}}const ie="modulepreload",le=function(c,e){return new URL(c,e).href},I={},P=function(e,a,i){let l=Promise.resolve();if(a&&a.length>0){let p=function(o){return Promise.all(o.map(d=>Promise.resolve(d).then(h=>({status:"fulfilled",value:h}),h=>({status:"rejected",reason:h}))))};const t=document.getElementsByTagName("link"),s=document.querySelector("meta[property=csp-nonce]"),R=s?.nonce||s?.getAttribute("nonce");l=p(a.map(o=>{if(o=le(o,i),o in I)return;I[o]=!0;const d=o.endsWith(".css"),h=d?'[rel="stylesheet"]':"";if(!!i)for(let n=t.length-1;n>=0;n--){const u=t[n];if(u.href===o&&(!d||u.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${h}`))return;const m=document.createElement("link");if(m.rel=d?"stylesheet":ie,d||(m.as="script"),m.crossOrigin="",m.href=o,R&&m.setAttribute("nonce",R),document.head.appendChild(m),d)return new Promise((n,u)=>{m.addEventListener("load",n),m.addEventListener("error",()=>u(new Error(`Unable to preload CSS for ${o}`)))})}))}function r(t){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=t,window.dispatchEvent(s),!s.defaultPrevented)throw t}return l.then(t=>{for(const s of t||[])s.status==="rejected"&&r(s.reason);return e().catch(r)})},Pe={};var ue=V('<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>'),me=V("<!> <!>",1);function de(c,e){F(e,!0);let a=S(e,"components",23,()=>[]),i=S(e,"data_0",3,null),l=S(e,"data_1",3,null);H(()=>e.stores.page.set(e.page)),Q(()=>{e.stores,e.page,e.constructors,a(),e.form,i(),l(),e.stores.page.notify()});let r=O(!1),t=O(!1),s=O(null);X(()=>{const n=e.stores.page.subscribe(()=>{f(r)&&(k(t,!0),Z().then(()=>{k(s,document.title||"untitled page",!0)}))});return k(r,!0),n});const R=L(()=>e.constructors[1]);var p=me(),o=w(p);{var d=n=>{const u=L(()=>e.constructors[0]);var _=x(),E=w(_);C(E,()=>f(u),(v,g)=>{T(g(v,{get data(){return i()},get form(){return e.form},get params(){return e.page.params},children:(b,_e)=>{var D=x(),q=w(D);C(q,()=>f(R),(B,M)=>{T(M(B,{get data(){return l()},get form(){return e.form},get params(){return e.page.params}}),N=>a()[1]=N,()=>a()?.[1])}),y(b,D)},$$slots:{default:!0}}),b=>a()[0]=b,()=>a()?.[0])}),y(n,_)},h=n=>{const u=L(()=>e.constructors[0]);var _=x(),E=w(_);C(E,()=>f(u),(v,g)=>{T(g(v,{get data(){return i()},get form(){return e.form},get params(){return e.page.params}}),b=>a()[0]=b,()=>a()?.[0])}),y(n,_)};A(o,n=>{e.constructors[1]?n(d):n(h,!1)})}var j=$(o,2);{var m=n=>{var u=ue(),_=te(u);{var E=v=>{var g=se();ae(()=>ne(g,f(s))),y(v,g)};A(_,v=>{f(t)&&v(E)})}re(u),y(n,u)};A(j,n=>{f(r)&&n(m)})}y(c,p),ee()}const Re=oe(de),pe=[()=>P(()=>import("../nodes/0.wwwcTLiU.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]),import.meta.url),()=>P(()=>import("../nodes/1.CdmpkyKT.js"),__vite__mapDeps([10,1,8,2,4]),import.meta.url),()=>P(()=>import("../nodes/2.Dxv3fx_R.js"),__vite__mapDeps([11,1,8,2,3,12,7,5,4,6,13,14]),import.meta.url),()=>P(()=>import("../nodes/3.CIi_G6Ph.js"),__vite__mapDeps([15,1,2,3,4,5,6,7,8,12,13,14]),import.meta.url),()=>P(()=>import("../nodes/4.B1tIC9Eq.js"),__vite__mapDeps([16,1,8,2,3,7,4]),import.meta.url)],we=[],ke={"/":[2],"/control/[id]":[3],"/setup":[4]},fe={handleError:(({error:c})=>{console.error(c)}),reroute:(()=>{}),transport:{}},he=Object.fromEntries(Object.entries(fe.transport).map(([c,e])=>[c,e.decode])),Oe=!1,xe=(c,e)=>he[c](e);export{xe as decode,he as decoders,ke as dictionary,Oe as hash,fe as hooks,Pe as matchers,pe as nodes,Re as root,we as server_loads};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.BLkz8enN.js","../chunks/DsnmJJEf.js","../chunks/Cby0Z7eP.js","../chunks/DqsOU3kV.js","../chunks/D3AAXov_.js","../chunks/D4wsprzy.js","../chunks/CoF2vljD.js","../chunks/BtOhWAVU.js","../chunks/C5zWTfmV.js","../assets/0.BjwH76RW.css","../nodes/1.CfOyMeub.js","../nodes/2.DOcHSA9J.js","../chunks/DSi9HfzB.js","../chunks/DnJ0bPgj.js","../assets/DynamicControlEditor.DoNLxeLe.css","../nodes/3.D2EgveDf.js","../nodes/4.Dg1K2qE0.js"])))=>i.map(i=>d[i]);
2
+ import{d as k,aa as U,h as f,ao as Y,ap as G,aq as J,Y as K,ar as W,T as z,p as F,C as H,u as Q,o as X,g as O,as as Z,f as V,a as w,s as $,b as y,e as ee,ak as x,c as te,r as re,al as L,am as se,J as ae,K as ne}from"../chunks/Cby0Z7eP.js";import"../chunks/DsnmJJEf.js";import{p as S,i as A}from"../chunks/DqsOU3kV.js";import{c as C}from"../chunks/CoF2vljD.js";import{b as T}from"../chunks/DnJ0bPgj.js";function oe(c){return class extends ce{constructor(e){super({component:c,...e})}}}class ce{#t;#e;constructor(e){var a=new Map,i=(r,t)=>{var s=z(t,!1,!1);return a.set(r,s),s};const l=new Proxy({...e.props||{},$$events:{}},{get(r,t){return f(a.get(t)??i(t,Reflect.get(r,t)))},has(r,t){return t===U?!0:(f(a.get(t)??i(t,Reflect.get(r,t))),Reflect.has(r,t))},set(r,t,s){return k(a.get(t)??i(t,s),s),Reflect.set(r,t,s)}});this.#e=(e.hydrate?Y:G)(e.component,{target:e.target,anchor:e.anchor,props:l,context:e.context,intro:e.intro??!1,recover:e.recover}),(!e?.props?.$$host||e.sync===!1)&&J(),this.#t=l.$$events;for(const r of Object.keys(this.#e))r==="$set"||r==="$destroy"||r==="$on"||K(this,r,{get(){return this.#e[r]},set(t){this.#e[r]=t},enumerable:!0});this.#e.$set=r=>{Object.assign(l,r)},this.#e.$destroy=()=>{W(this.#e)}}$set(e){this.#e.$set(e)}$on(e,a){this.#t[e]=this.#t[e]||[];const i=(...l)=>a.call(this,...l);return this.#t[e].push(i),()=>{this.#t[e]=this.#t[e].filter(l=>l!==i)}}$destroy(){this.#e.$destroy()}}const ie="modulepreload",le=function(c,e){return new URL(c,e).href},I={},P=function(e,a,i){let l=Promise.resolve();if(a&&a.length>0){let p=function(o){return Promise.all(o.map(d=>Promise.resolve(d).then(h=>({status:"fulfilled",value:h}),h=>({status:"rejected",reason:h}))))};const t=document.getElementsByTagName("link"),s=document.querySelector("meta[property=csp-nonce]"),R=s?.nonce||s?.getAttribute("nonce");l=p(a.map(o=>{if(o=le(o,i),o in I)return;I[o]=!0;const d=o.endsWith(".css"),h=d?'[rel="stylesheet"]':"";if(!!i)for(let n=t.length-1;n>=0;n--){const u=t[n];if(u.href===o&&(!d||u.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${h}`))return;const m=document.createElement("link");if(m.rel=d?"stylesheet":ie,d||(m.as="script"),m.crossOrigin="",m.href=o,R&&m.setAttribute("nonce",R),document.head.appendChild(m),d)return new Promise((n,u)=>{m.addEventListener("load",n),m.addEventListener("error",()=>u(new Error(`Unable to preload CSS for ${o}`)))})}))}function r(t){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=t,window.dispatchEvent(s),!s.defaultPrevented)throw t}return l.then(t=>{for(const s of t||[])s.status==="rejected"&&r(s.reason);return e().catch(r)})},Pe={};var ue=V('<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>'),me=V("<!> <!>",1);function de(c,e){F(e,!0);let a=S(e,"components",23,()=>[]),i=S(e,"data_0",3,null),l=S(e,"data_1",3,null);H(()=>e.stores.page.set(e.page)),Q(()=>{e.stores,e.page,e.constructors,a(),e.form,i(),l(),e.stores.page.notify()});let r=O(!1),t=O(!1),s=O(null);X(()=>{const n=e.stores.page.subscribe(()=>{f(r)&&(k(t,!0),Z().then(()=>{k(s,document.title||"untitled page",!0)}))});return k(r,!0),n});const R=L(()=>e.constructors[1]);var p=me(),o=w(p);{var d=n=>{const u=L(()=>e.constructors[0]);var _=x(),E=w(_);C(E,()=>f(u),(v,g)=>{T(g(v,{get data(){return i()},get form(){return e.form},get params(){return e.page.params},children:(b,_e)=>{var D=x(),q=w(D);C(q,()=>f(R),(B,M)=>{T(M(B,{get data(){return l()},get form(){return e.form},get params(){return e.page.params}}),N=>a()[1]=N,()=>a()?.[1])}),y(b,D)},$$slots:{default:!0}}),b=>a()[0]=b,()=>a()?.[0])}),y(n,_)},h=n=>{const u=L(()=>e.constructors[0]);var _=x(),E=w(_);C(E,()=>f(u),(v,g)=>{T(g(v,{get data(){return i()},get form(){return e.form},get params(){return e.page.params}}),b=>a()[0]=b,()=>a()?.[0])}),y(n,_)};A(o,n=>{e.constructors[1]?n(d):n(h,!1)})}var j=$(o,2);{var m=n=>{var u=ue(),_=te(u);{var E=v=>{var g=se();ae(()=>ne(g,f(s))),y(v,g)};A(_,v=>{f(t)&&v(E)})}re(u),y(n,u)};A(j,n=>{f(r)&&n(m)})}y(c,p),ee()}const Re=oe(de),pe=[()=>P(()=>import("../nodes/0.BLkz8enN.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]),import.meta.url),()=>P(()=>import("../nodes/1.CfOyMeub.js"),__vite__mapDeps([10,1,8,2,4]),import.meta.url),()=>P(()=>import("../nodes/2.DOcHSA9J.js"),__vite__mapDeps([11,1,8,2,3,12,7,5,4,6,13,14]),import.meta.url),()=>P(()=>import("../nodes/3.D2EgveDf.js"),__vite__mapDeps([15,1,2,3,4,5,6,7,8,12,13,14]),import.meta.url),()=>P(()=>import("../nodes/4.Dg1K2qE0.js"),__vite__mapDeps([16,1,8,2,3,7,4]),import.meta.url)],we=[],ke={"/":[2],"/control/[id]":[3],"/setup":[4]},fe={handleError:(({error:c})=>{console.error(c)}),reroute:(()=>{}),transport:{}},he=Object.fromEntries(Object.entries(fe.transport).map(([c,e])=>[c,e.decode])),Oe=!1,xe=(c,e)=>he[c](e);export{xe as decode,he as decoders,ke as dictionary,Oe as hash,fe as hooks,Pe as matchers,pe as nodes,Re as root,we as server_loads};
@@ -0,0 +1 @@
1
+ import{l as o,a as r}from"../chunks/D3AAXov_.js";export{o as load_css,r as start};
@@ -1 +1 @@
1
- import"../chunks/DsnmJJEf.js";import{at as le,p as R,ae as y,d as k,T as $,G as m,h as u,af as F,ag as M,c as i,n as A,r as n,b as v,e as N,J as D,K as Y,ak as Q,a as U,f as P,o as xe,au as be,s as V,av as ie}from"../chunks/BJF-sFqz.js";import{l as z,p as C,i as w,a as te,s as de}from"../chunks/DUz6FRLu.js";import{g as me}from"../chunks/fCDFfNtz.js";import{p as _e,D as we}from"../chunks/DUI6GvcB.js";import{i as j}from"../chunks/Bty54Wy4.js";import{a as K,f as ce,w as q}from"../chunks/CBYXl-8c.js";le(["change"]);var ye=M("<title> </title>"),ke=M('<svg><!><path d="M11.41 26.59L7.83 23 28 23 28 21 7.83 21 11.41 17.41 10 16 4 22 10 28 11.41 26.59zM28 10L22 4 20.59 5.41 24.17 9 4 9 4 11 24.17 11 20.59 14.59 22 16 28 10z"></path></svg>');function $e(b,t){const e=z(t,["children","$$slots","$$events","$$legacy"]),l=z(e,["size","title"]);R(t,!1);const o=$(),g=$();let f=C(t,"size",8,16),r=C(t,"title",8,void 0);y(()=>(m(e),m(r())),()=>{k(o,e["aria-label"]||e["aria-labelledby"]||r())}),y(()=>(u(o),m(e)),()=>{k(g,{"aria-hidden":u(o)?void 0:!0,role:u(o)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),F(),j();var s=ke();K(s,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...u(g),...l}));var p=i(s);{var x=d=>{var a=ye(),c=i(a,!0);n(a),D(()=>Y(c,r())),v(d,a)};w(p,d=>{r()&&d(x)})}A(),n(s),v(b,s),N()}var ze=P('<a href="/setup" class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors" title="Switch control set"><!> Switch</a>'),Ce=P('<div class="text-sm text-gray-500 dark:text-gray-400">Loading...</div>');function Me(b,t){R(t,!1);const e=()=>te(ce,"$appState",l),[l,o]=de();j();var g=Q(),f=U(g);{var r=p=>{var x=ze(),d=i(x);$e(d,{size:16}),A(),n(x),v(p,x)},s=p=>{var x=Ce();v(p,x)};w(f,p=>{e().isConnected?p(r):p(s,!1)})}v(b,g),N(),o()}var Se=M("<title> </title>"),Le=M('<svg><!><path d="M31 16L24 23 22.59 21.59 28.17 16 22.59 10.41 24 9 31 16zM1 16L8 9 9.41 10.41 3.83 16 9.41 21.59 8 23 1 16z"></path><path d="M5.91 15H26.080000000000002V17H5.91z" transform="rotate(-75 15.996 16)"></path></svg>');function Ae(b,t){const e=z(t,["children","$$slots","$$events","$$legacy"]),l=z(e,["size","title"]);R(t,!1);const o=$(),g=$();let f=C(t,"size",8,16),r=C(t,"title",8,void 0);y(()=>(m(e),m(r())),()=>{k(o,e["aria-label"]||e["aria-labelledby"]||r())}),y(()=>(u(o),m(e)),()=>{k(g,{"aria-hidden":u(o)?void 0:!0,role:u(o)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),F(),j();var s=Le();K(s,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...u(g),...l}));var p=i(s);{var x=d=>{var a=Se(),c=i(a,!0);n(a),D(()=>Y(c,r())),v(d,a)};w(p,d=>{r()&&d(x)})}A(2),n(s),v(b,s),N()}var Ee=M("<title> </title>"),He=M('<svg><!><path d="M13 21L26.17 21 23.59 23.59 25 25 30 20 25 15 23.59 16.41 26.17 19 13 19 13 21z"></path><path d="M22,14V10a1,1,0,0,0-.29-.71l-7-7A1,1,0,0,0,14,2H4A2,2,0,0,0,2,4V28a2,2,0,0,0,2,2H20a2,2,0,0,0,2-2V26H20v2H4V4h8v6a2,2,0,0,0,2,2h6v2Zm-8-4V4.41L19.59,10Z"></path></svg>');function Ve(b,t){const e=z(t,["children","$$slots","$$events","$$legacy"]),l=z(e,["size","title"]);R(t,!1);const o=$(),g=$();let f=C(t,"size",8,16),r=C(t,"title",8,void 0);y(()=>(m(e),m(r())),()=>{k(o,e["aria-label"]||e["aria-labelledby"]||r())}),y(()=>(u(o),m(e)),()=>{k(g,{"aria-hidden":u(o)?void 0:!0,role:u(o)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),F(),j();var s=He();K(s,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...u(g),...l}));var p=i(s);{var x=d=>{var a=Ee(),c=i(a,!0);n(a),D(()=>Y(c,r())),v(d,a)};w(p,d=>{r()&&d(x)})}A(2),n(s),v(b,s),N()}var Re=M("<title> </title>"),Ne=M('<svg><!><path d="M26 24v4H6V24H4v4H4a2 2 0 002 2H26a2 2 0 002-2h0V24zM26 14L24.59 12.59 17 20.17 17 2 15 2 15 20.17 7.41 12.59 6 14 16 24 26 14z"></path></svg>');function ne(b,t){const e=z(t,["children","$$slots","$$events","$$legacy"]),l=z(e,["size","title"]);R(t,!1);const o=$(),g=$();let f=C(t,"size",8,16),r=C(t,"title",8,void 0);y(()=>(m(e),m(r())),()=>{k(o,e["aria-label"]||e["aria-labelledby"]||r())}),y(()=>(u(o),m(e)),()=>{k(g,{"aria-hidden":u(o)?void 0:!0,role:u(o)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),F(),j();var s=Ne();K(s,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...u(g),...l}));var p=i(s);{var x=d=>{var a=Re(),c=i(a,!0);n(a),D(()=>Y(c,r())),v(d,a)};w(p,d=>{r()&&d(x)})}A(),n(s),v(b,s),N()}var Pe=M("<title> </title>"),Te=M('<svg><!><path fill-rule="evenodd" d="M16,2a14,14,0,0,0-4.43,27.28c.7.13,1-.3,1-.67s0-1.21,0-2.38c-3.89.84-4.71-1.88-4.71-1.88A3.71,3.71,0,0,0,6.24,22.3c-1.27-.86.1-.85.1-.85A2.94,2.94,0,0,1,8.48,22.9a3,3,0,0,0,4.08,1.16,2.93,2.93,0,0,1,.88-1.87c-3.1-.36-6.37-1.56-6.37-6.92a5.4,5.4,0,0,1,1.44-3.76,5,5,0,0,1,.14-3.7s1.17-.38,3.85,1.43a13.3,13.3,0,0,1,7,0c2.67-1.81,3.84-1.43,3.84-1.43a5,5,0,0,1,.14,3.7,5.4,5.4,0,0,1,1.44,3.76c0,5.38-3.27,6.56-6.39,6.91a3.33,3.33,0,0,1,.95,2.59c0,1.87,0,3.38,0,3.84s.25.81,1,.67A14,14,0,0,0,16,2Z"></path></svg>');function Be(b,t){const e=z(t,["children","$$slots","$$events","$$legacy"]),l=z(e,["size","title"]);R(t,!1);const o=$(),g=$();let f=C(t,"size",8,16),r=C(t,"title",8,void 0);y(()=>(m(e),m(r())),()=>{k(o,e["aria-label"]||e["aria-labelledby"]||r())}),y(()=>(u(o),m(e)),()=>{k(g,{"aria-hidden":u(o)?void 0:!0,role:u(o)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),F(),j();var s=Te();K(s,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...u(g),...l}));var p=i(s);{var x=d=>{var a=Pe(),c=i(a,!0);n(a),D(()=>Y(c,r())),v(d,a)};w(p,d=>{r()&&d(x)})}A(),n(s),v(b,s),N()}var De=(b,t)=>t("csv"),Ye=(b,t)=>t("excel"),je=(b,t)=>t("json"),Ge=P('<div class="space-y-1 p-1"><button class="w-full text-left px-3 py-2 text-sm rounded-md transition-colors duration-200 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"><div class="flex items-center gap-2"><!> <span>Export as CSV</span></div></button> <button class="w-full text-left px-3 py-2 text-sm rounded-md transition-colors duration-200 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"><div class="flex items-center gap-2"><!> <span>Export as Excel</span></div></button> <button class="w-full text-left px-3 py-2 text-sm rounded-md transition-colors duration-200 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"><div class="flex items-center gap-2"><!> <span>Export as JSON</span></div></button></div>'),Ie=P('<div class="flex-1 flex justify-center items-center"><div class="text-center"><div class="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"></div> <p class="text-gray-500 dark:text-gray-400">Switching control set...</p></div></div>'),Ze=P('<div class="flex-1 flex justify-center items-center"><div class="text-center"><div class="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"></div> <p class="text-gray-500 dark:text-gray-400"> </p></div></div>'),Je=P('<header class="bg-white dark:bg-gray-900 shadow-sm border-b border-gray-200 dark:border-gray-700 flex-shrink-0"><div class="w-full px-6 lg:px-8"><div class="flex justify-between items-center h-16"><div class="flex items-center"><a href="/" class="flex items-center space-x-3 hover:opacity-80 transition-opacity"><img src="/lula.png" class="h-8 w-8" alt="Lula Logo"/> <div class="flex flex-col"><span class="text-xl font-bold text-gray-900 dark:text-white">Lula</span> <span class="text-xs text-gray-500 dark:text-gray-400 -mt-1">Gitops for Compliance</span></div></a></div> <div class="flex items-center space-x-4"><!> <!> <a class="p-2 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg transition-colors" title="Github" href="https://github.com/defenseunicorns/lula" target="_blank"><!></a></div></div></div></header> <div class="flex-1 flex gap-6 p-6 overflow-hidden"><!></div>',1),Ue=P('<div class="h-screen flex flex-col"><!></div>');function et(b,t){R(t,!0);const e=()=>te(_e,"$page",o),l=()=>te(ce,"$appState",o),[o,g]=de();let f=!1;async function r(a){try{const c=`/api/export-controls?format=${a}`,h=document.createElement("a");h.href=c,h.download="",document.body.appendChild(h),h.click(),document.body.removeChild(h)}catch(c){console.error("Export failed:",c)}}xe(()=>{q.connect();let a=null;const c=async()=>{if(f||e().url.pathname==="/setup"||l().isSwitchingControlSet)return;const h=l();if(h.isConnected){if(f=!0,(!h.name||h.name==="Unknown Control Set"||h.id==="unknown"||h.id==="default")&&(!h.controls||h.controls.length===0)){await q.scanControlSets();const E=await new Promise(G=>{const T=O=>{window.removeEventListener("control-sets-list",T),G(O.detail)};window.addEventListener("control-sets-list",T),setTimeout(()=>{window.removeEventListener("control-sets-list",T),G(null)},2e3)});E&&Array.isArray(E)&&E.length===1?(console.log("Auto-loading single control set:",E[0].path),await q.switchControlSet(E[0].path)):me("/setup")}}else a=window.setTimeout(c,500)};return a=window.setTimeout(c,100),()=>{a&&clearTimeout(a)}}),be(()=>{q.disconnect()});var s=Ue(),p=i(s);{var x=a=>{var c=Je(),h=U(c),E=i(h),G=i(E),T=V(i(G),2),O=i(T);Me(O,{});var ae=V(O,2);{var ve=_=>{we(_,{buttonLabel:"Export",get buttonIcon(){return ne},buttonClass:"inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors",dropdownClass:"w-48",children:W=>{var Z=Ge(),B=i(Z);B.__click=[De,r];var S=i(B),H=i(S);Ve(H,{class:"w-4 h-4"}),A(2),n(S),n(B);var L=V(B,2);L.__click=[Ye,r];var J=i(L),X=i(J);ne(X,{class:"w-4 h-4"}),A(2),n(J),n(L);var ee=V(L,2);ee.__click=[je,r];var oe=i(ee),pe=i(oe);Ae(pe,{class:"w-4 h-4"}),A(2),n(oe),n(ee),n(Z),v(W,Z)},$$slots:{default:!0}})};w(ae,_=>{l().isConnected&&l().controls&&l().controls.length>0&&_(ve)})}var re=V(ae,2),ue=i(re);Be(ue,{class:"w-5 h-5"}),n(re),n(T),n(G),n(E),n(h);var se=V(h,2),ge=i(se);{var fe=_=>{var I=Ie();v(_,I)},he=_=>{var I=Q(),W=U(I);{var Z=S=>{var H=Ze(),L=i(H),J=V(i(L),2),X=i(J,!0);n(J),n(L),n(H),D(()=>Y(X,l().isConnected?l().fieldSchema?"Loading controls...":"Loading schema...":"Connecting...")),v(S,H)},B=S=>{var H=Q(),L=U(H);ie(L,()=>t.children),v(S,H)};w(W,S=>{!l().isConnected||!l().controls||l().controls.length===0||!l().fieldSchema?S(Z):S(B,!1)},!0)}v(_,I)};w(ge,_=>{l().isSwitchingControlSet?_(fe):_(he,!1)})}n(se),v(a,c)},d=a=>{var c=Q(),h=U(c);ie(h,()=>t.children),v(a,c)};w(p,a=>{e().url.pathname!=="/setup"?a(x):a(d,!1)})}n(s),v(b,s),N(),g()}le(["click"]);export{et as component};
1
+ import"../chunks/DsnmJJEf.js";import{at as le,p as R,ae as y,d as k,T as $,G as m,h as u,af as F,ag as M,c as i,n as A,r as n,b as v,e as N,J as D,K as Y,ak as Q,a as U,f as P,o as xe,au as be,s as V,av as ie}from"../chunks/Cby0Z7eP.js";import{l as z,p as C,i as w,a as te,s as de}from"../chunks/DqsOU3kV.js";import{g as me}from"../chunks/D3AAXov_.js";import{p as _e,D as we}from"../chunks/D4wsprzy.js";import{i as j}from"../chunks/C5zWTfmV.js";import{a as K,f as ce,w as q}from"../chunks/BtOhWAVU.js";le(["change"]);var ye=M("<title> </title>"),ke=M('<svg><!><path d="M11.41 26.59L7.83 23 28 23 28 21 7.83 21 11.41 17.41 10 16 4 22 10 28 11.41 26.59zM28 10L22 4 20.59 5.41 24.17 9 4 9 4 11 24.17 11 20.59 14.59 22 16 28 10z"></path></svg>');function $e(b,t){const e=z(t,["children","$$slots","$$events","$$legacy"]),l=z(e,["size","title"]);R(t,!1);const o=$(),g=$();let f=C(t,"size",8,16),r=C(t,"title",8,void 0);y(()=>(m(e),m(r())),()=>{k(o,e["aria-label"]||e["aria-labelledby"]||r())}),y(()=>(u(o),m(e)),()=>{k(g,{"aria-hidden":u(o)?void 0:!0,role:u(o)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),F(),j();var s=ke();K(s,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...u(g),...l}));var p=i(s);{var x=d=>{var a=ye(),c=i(a,!0);n(a),D(()=>Y(c,r())),v(d,a)};w(p,d=>{r()&&d(x)})}A(),n(s),v(b,s),N()}var ze=P('<a href="/setup" class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors" title="Switch control set"><!> Switch</a>'),Ce=P('<div class="text-sm text-gray-500 dark:text-gray-400">Loading...</div>');function Me(b,t){R(t,!1);const e=()=>te(ce,"$appState",l),[l,o]=de();j();var g=Q(),f=U(g);{var r=p=>{var x=ze(),d=i(x);$e(d,{size:16}),A(),n(x),v(p,x)},s=p=>{var x=Ce();v(p,x)};w(f,p=>{e().isConnected?p(r):p(s,!1)})}v(b,g),N(),o()}var Se=M("<title> </title>"),Le=M('<svg><!><path d="M31 16L24 23 22.59 21.59 28.17 16 22.59 10.41 24 9 31 16zM1 16L8 9 9.41 10.41 3.83 16 9.41 21.59 8 23 1 16z"></path><path d="M5.91 15H26.080000000000002V17H5.91z" transform="rotate(-75 15.996 16)"></path></svg>');function Ae(b,t){const e=z(t,["children","$$slots","$$events","$$legacy"]),l=z(e,["size","title"]);R(t,!1);const o=$(),g=$();let f=C(t,"size",8,16),r=C(t,"title",8,void 0);y(()=>(m(e),m(r())),()=>{k(o,e["aria-label"]||e["aria-labelledby"]||r())}),y(()=>(u(o),m(e)),()=>{k(g,{"aria-hidden":u(o)?void 0:!0,role:u(o)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),F(),j();var s=Le();K(s,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...u(g),...l}));var p=i(s);{var x=d=>{var a=Se(),c=i(a,!0);n(a),D(()=>Y(c,r())),v(d,a)};w(p,d=>{r()&&d(x)})}A(2),n(s),v(b,s),N()}var Ee=M("<title> </title>"),He=M('<svg><!><path d="M13 21L26.17 21 23.59 23.59 25 25 30 20 25 15 23.59 16.41 26.17 19 13 19 13 21z"></path><path d="M22,14V10a1,1,0,0,0-.29-.71l-7-7A1,1,0,0,0,14,2H4A2,2,0,0,0,2,4V28a2,2,0,0,0,2,2H20a2,2,0,0,0,2-2V26H20v2H4V4h8v6a2,2,0,0,0,2,2h6v2Zm-8-4V4.41L19.59,10Z"></path></svg>');function Ve(b,t){const e=z(t,["children","$$slots","$$events","$$legacy"]),l=z(e,["size","title"]);R(t,!1);const o=$(),g=$();let f=C(t,"size",8,16),r=C(t,"title",8,void 0);y(()=>(m(e),m(r())),()=>{k(o,e["aria-label"]||e["aria-labelledby"]||r())}),y(()=>(u(o),m(e)),()=>{k(g,{"aria-hidden":u(o)?void 0:!0,role:u(o)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),F(),j();var s=He();K(s,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...u(g),...l}));var p=i(s);{var x=d=>{var a=Ee(),c=i(a,!0);n(a),D(()=>Y(c,r())),v(d,a)};w(p,d=>{r()&&d(x)})}A(2),n(s),v(b,s),N()}var Re=M("<title> </title>"),Ne=M('<svg><!><path d="M26 24v4H6V24H4v4H4a2 2 0 002 2H26a2 2 0 002-2h0V24zM26 14L24.59 12.59 17 20.17 17 2 15 2 15 20.17 7.41 12.59 6 14 16 24 26 14z"></path></svg>');function ne(b,t){const e=z(t,["children","$$slots","$$events","$$legacy"]),l=z(e,["size","title"]);R(t,!1);const o=$(),g=$();let f=C(t,"size",8,16),r=C(t,"title",8,void 0);y(()=>(m(e),m(r())),()=>{k(o,e["aria-label"]||e["aria-labelledby"]||r())}),y(()=>(u(o),m(e)),()=>{k(g,{"aria-hidden":u(o)?void 0:!0,role:u(o)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),F(),j();var s=Ne();K(s,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...u(g),...l}));var p=i(s);{var x=d=>{var a=Re(),c=i(a,!0);n(a),D(()=>Y(c,r())),v(d,a)};w(p,d=>{r()&&d(x)})}A(),n(s),v(b,s),N()}var Pe=M("<title> </title>"),Te=M('<svg><!><path fill-rule="evenodd" d="M16,2a14,14,0,0,0-4.43,27.28c.7.13,1-.3,1-.67s0-1.21,0-2.38c-3.89.84-4.71-1.88-4.71-1.88A3.71,3.71,0,0,0,6.24,22.3c-1.27-.86.1-.85.1-.85A2.94,2.94,0,0,1,8.48,22.9a3,3,0,0,0,4.08,1.16,2.93,2.93,0,0,1,.88-1.87c-3.1-.36-6.37-1.56-6.37-6.92a5.4,5.4,0,0,1,1.44-3.76,5,5,0,0,1,.14-3.7s1.17-.38,3.85,1.43a13.3,13.3,0,0,1,7,0c2.67-1.81,3.84-1.43,3.84-1.43a5,5,0,0,1,.14,3.7,5.4,5.4,0,0,1,1.44,3.76c0,5.38-3.27,6.56-6.39,6.91a3.33,3.33,0,0,1,.95,2.59c0,1.87,0,3.38,0,3.84s.25.81,1,.67A14,14,0,0,0,16,2Z"></path></svg>');function Be(b,t){const e=z(t,["children","$$slots","$$events","$$legacy"]),l=z(e,["size","title"]);R(t,!1);const o=$(),g=$();let f=C(t,"size",8,16),r=C(t,"title",8,void 0);y(()=>(m(e),m(r())),()=>{k(o,e["aria-label"]||e["aria-labelledby"]||r())}),y(()=>(u(o),m(e)),()=>{k(g,{"aria-hidden":u(o)?void 0:!0,role:u(o)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),F(),j();var s=Te();K(s,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...u(g),...l}));var p=i(s);{var x=d=>{var a=Pe(),c=i(a,!0);n(a),D(()=>Y(c,r())),v(d,a)};w(p,d=>{r()&&d(x)})}A(),n(s),v(b,s),N()}var De=(b,t)=>t("csv"),Ye=(b,t)=>t("excel"),je=(b,t)=>t("json"),Ge=P('<div class="space-y-1 p-1"><button class="w-full text-left px-3 py-2 text-sm rounded-md transition-colors duration-200 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"><div class="flex items-center gap-2"><!> <span>Export as CSV</span></div></button> <button class="w-full text-left px-3 py-2 text-sm rounded-md transition-colors duration-200 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"><div class="flex items-center gap-2"><!> <span>Export as Excel</span></div></button> <button class="w-full text-left px-3 py-2 text-sm rounded-md transition-colors duration-200 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"><div class="flex items-center gap-2"><!> <span>Export as JSON</span></div></button></div>'),Ie=P('<div class="flex-1 flex justify-center items-center"><div class="text-center"><div class="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"></div> <p class="text-gray-500 dark:text-gray-400">Switching control set...</p></div></div>'),Ze=P('<div class="flex-1 flex justify-center items-center"><div class="text-center"><div class="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"></div> <p class="text-gray-500 dark:text-gray-400"> </p></div></div>'),Je=P('<header class="bg-white dark:bg-gray-900 shadow-sm border-b border-gray-200 dark:border-gray-700 flex-shrink-0"><div class="w-full px-6 lg:px-8"><div class="flex justify-between items-center h-16"><div class="flex items-center"><a href="/" class="flex items-center space-x-3 hover:opacity-80 transition-opacity"><img src="/lula.png" class="h-8 w-8" alt="Lula Logo"/> <div class="flex flex-col"><span class="text-xl font-bold text-gray-900 dark:text-white">Lula</span> <span class="text-xs text-gray-500 dark:text-gray-400 -mt-1">Gitops for Compliance</span></div></a></div> <div class="flex items-center space-x-4"><!> <!> <a class="p-2 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg transition-colors" title="Github" href="https://github.com/defenseunicorns/lula" target="_blank"><!></a></div></div></div></header> <div class="flex-1 flex gap-6 p-6 overflow-hidden"><!></div>',1),Ue=P('<div class="h-screen flex flex-col"><!></div>');function et(b,t){R(t,!0);const e=()=>te(_e,"$page",o),l=()=>te(ce,"$appState",o),[o,g]=de();let f=!1;async function r(a){try{const c=`/api/export-controls?format=${a}`,h=document.createElement("a");h.href=c,h.download="",document.body.appendChild(h),h.click(),document.body.removeChild(h)}catch(c){console.error("Export failed:",c)}}xe(()=>{q.connect();let a=null;const c=async()=>{if(f||e().url.pathname==="/setup"||l().isSwitchingControlSet)return;const h=l();if(h.isConnected){if(f=!0,(!h.name||h.name==="Unknown Control Set"||h.id==="unknown"||h.id==="default")&&(!h.controls||h.controls.length===0)){await q.scanControlSets();const E=await new Promise(G=>{const T=O=>{window.removeEventListener("control-sets-list",T),G(O.detail)};window.addEventListener("control-sets-list",T),setTimeout(()=>{window.removeEventListener("control-sets-list",T),G(null)},2e3)});E&&Array.isArray(E)&&E.length===1?(console.log("Auto-loading single control set:",E[0].path),await q.switchControlSet(E[0].path)):me("/setup")}}else a=window.setTimeout(c,500)};return a=window.setTimeout(c,100),()=>{a&&clearTimeout(a)}}),be(()=>{q.disconnect()});var s=Ue(),p=i(s);{var x=a=>{var c=Je(),h=U(c),E=i(h),G=i(E),T=V(i(G),2),O=i(T);Me(O,{});var ae=V(O,2);{var ve=_=>{we(_,{buttonLabel:"Export",get buttonIcon(){return ne},buttonClass:"inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors",dropdownClass:"w-48",children:W=>{var Z=Ge(),B=i(Z);B.__click=[De,r];var S=i(B),H=i(S);Ve(H,{class:"w-4 h-4"}),A(2),n(S),n(B);var L=V(B,2);L.__click=[Ye,r];var J=i(L),X=i(J);ne(X,{class:"w-4 h-4"}),A(2),n(J),n(L);var ee=V(L,2);ee.__click=[je,r];var oe=i(ee),pe=i(oe);Ae(pe,{class:"w-4 h-4"}),A(2),n(oe),n(ee),n(Z),v(W,Z)},$$slots:{default:!0}})};w(ae,_=>{l().isConnected&&l().controls&&l().controls.length>0&&_(ve)})}var re=V(ae,2),ue=i(re);Be(ue,{class:"w-5 h-5"}),n(re),n(T),n(G),n(E),n(h);var se=V(h,2),ge=i(se);{var fe=_=>{var I=Ie();v(_,I)},he=_=>{var I=Q(),W=U(I);{var Z=S=>{var H=Ze(),L=i(H),J=V(i(L),2),X=i(J,!0);n(J),n(L),n(H),D(()=>Y(X,l().isConnected?l().fieldSchema?"Loading controls...":"Loading schema...":"Connecting...")),v(S,H)},B=S=>{var H=Q(),L=U(H);ie(L,()=>t.children),v(S,H)};w(W,S=>{!l().isConnected||!l().controls||l().controls.length===0||!l().fieldSchema?S(Z):S(B,!1)},!0)}v(_,I)};w(ge,_=>{l().isSwitchingControlSet?_(fe):_(he,!1)})}n(se),v(a,c)},d=a=>{var c=Q(),h=U(c);ie(h,()=>t.children),v(a,c)};w(p,a=>{e().url.pathname!=="/setup"?a(x):a(d,!1)})}n(s),v(b,s),N(),g()}le(["click"]);export{et as component};
@@ -1 +1 @@
1
- import"../chunks/DsnmJJEf.js";import{i as u}from"../chunks/Bty54Wy4.js";import{p as h,f as g,a as l,J as v,b as d,e as _,c as s,r as a,s as x,K as o}from"../chunks/BJF-sFqz.js";import{s as $,p}from"../chunks/fCDFfNtz.js";const b={get error(){return p.error},get status(){return p.status}};$.updated.check;const i=b;var k=g("<h1> </h1> <p> </p>",1);function q(m,c){h(c,!1),u();var t=k(),r=l(t),n=s(r,!0);a(r);var e=x(r,2),f=s(e,!0);a(e),v(()=>{o(n,i.status),o(f,i.error?.message)}),d(m,t),_()}export{q as component};
1
+ import"../chunks/DsnmJJEf.js";import{i as u}from"../chunks/C5zWTfmV.js";import{p as h,f as g,a as l,J as v,b as d,e as _,c as s,r as a,s as x,K as o}from"../chunks/Cby0Z7eP.js";import{s as $,p}from"../chunks/D3AAXov_.js";const b={get error(){return p.error},get status(){return p.status}};$.updated.check;const i=b;var k=g("<h1> </h1> <p> </p>",1);function q(m,c){h(c,!1),u();var t=k(),r=l(t),n=s(r,!0);a(r);var e=x(r,2),f=s(e,!0);a(e),v(()=>{o(n,i.status),o(f,i.error?.message)}),d(m,t),_()}export{q as component};
@@ -1 +1 @@
1
- import"../chunks/DsnmJJEf.js";import"../chunks/Bty54Wy4.js";import{f,a as y,b as n,c as t,r,s as w,n as C}from"../chunks/BJF-sFqz.js";import{i as k,s as $,a as D}from"../chunks/DUz6FRLu.js";import{C as S,a as j,D as L}from"../chunks/DQXxLgJn.js";import{s as N}from"../chunks/DUI6GvcB.js";var P=f('<div class=" h-full flex flex-col"><div class="flex-1 flex items-center justify-center p-8"><div class="text-center text-gray-500 dark:text-gray-400"><!> <h3 class="text-xl font-semibold text-gray-900 dark:text-white mb-2">No Control Selected</h3> <p class="text-gray-600 dark:text-gray-400">Select a control from the list to view and edit its details</p></div></div></div>'),q=f('<div class="w-1/2 flex flex-col"><div class="bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg shadow-sm h-full flex flex-col"><!></div></div> <div class="w-1/2 flex flex-col"><!></div>',1);function H(m){const o=()=>D(N,"$selectedControl",x),[x,g]=$();var l=q(),a=y(l),i=t(a),p=t(i);S(p,{}),r(i),r(a);var d=w(a,2),_=t(d);{var h=e=>{j(e,{get control(){return o()}})},b=e=>{var s=P(),c=t(s),v=t(c),u=t(v);L(u,{class:"mx-auto h-16 w-16 mb-4"}),C(4),r(v),r(c),r(s),n(e,s)};k(_,e=>{o()?e(h):e(b,!1)})}r(d),n(m,l),g()}export{H as component};
1
+ import"../chunks/DsnmJJEf.js";import"../chunks/C5zWTfmV.js";import{f,a as y,b as n,c as t,r,s as w,n as C}from"../chunks/Cby0Z7eP.js";import{i as k,s as $,a as D}from"../chunks/DqsOU3kV.js";import{C as S,a as j,D as L}from"../chunks/DSi9HfzB.js";import{s as N}from"../chunks/D4wsprzy.js";var P=f('<div class=" h-full flex flex-col"><div class="flex-1 flex items-center justify-center p-8"><div class="text-center text-gray-500 dark:text-gray-400"><!> <h3 class="text-xl font-semibold text-gray-900 dark:text-white mb-2">No Control Selected</h3> <p class="text-gray-600 dark:text-gray-400">Select a control from the list to view and edit its details</p></div></div></div>'),q=f('<div class="w-1/2 flex flex-col"><div class="bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg shadow-sm h-full flex flex-col"><!></div></div> <div class="w-1/2 flex flex-col"><!></div>',1);function H(m){const o=()=>D(N,"$selectedControl",x),[x,g]=$();var l=q(),a=y(l),i=t(a),p=t(i);S(p,{}),r(i),r(a);var d=w(a,2),_=t(d);{var h=e=>{j(e,{get control(){return o()}})},b=e=>{var s=P(),c=t(s),v=t(c),u=t(v);L(u,{class:"mx-auto h-16 w-16 mb-4"}),C(4),r(v),r(c),r(s),n(e,s)};k(_,e=>{o()?e(h):e(b,!1)})}r(d),n(m,l),g()}export{H as component};
@@ -1 +1 @@
1
- import"../chunks/DsnmJJEf.js";import{p as S,u as A,d as x,o as B,f as n,a as F,b as i,e as H,c as s,g as N,r as a,s as h,h as P,n as R}from"../chunks/BJF-sFqz.js";import{a as C,i as b,s as U}from"../chunks/DUz6FRLu.js";import{g as V}from"../chunks/fCDFfNtz.js";import{p as q,s as _}from"../chunks/DUI6GvcB.js";import{C as G,a as J,D as K}from"../chunks/DQXxLgJn.js";import{w}from"../chunks/CBYXl-8c.js";var O=n('<div class="absolute top-4 right-4 z-10"><div class="w-8 h-8 flex items-center justify-center rounded-full bg-blue-100 dark:bg-blue-900/30" title="Loading control..."><svg class="w-5 h-5 text-blue-600 dark:text-blue-400 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg></div></div>'),Q=n('<div class=" h-full flex flex-col"><div class="flex-1 flex items-center justify-center p-8"><div class="text-center text-gray-500 dark:text-gray-400"><!> <h3 class="text-xl font-semibold text-gray-900 dark:text-white mb-2">No Control Selected</h3> <p class="text-gray-600 dark:text-gray-400">Select a control from the list to view and edit its details</p></div></div></div>'),T=n('<div class="w-1/2 flex flex-col"><div class="bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg shadow-sm h-full flex flex-col"><!></div></div> <div class="w-1/2 flex flex-col relative"><!> <!></div>',1);function se(y,k){S(k,!0);const $=()=>C(q,"$page",c),d=()=>C(_,"$selectedControl",c),[c,D]=U();let v="",r=N(!1);A(()=>{const e=$().params.id;if(!e)return;const t=decodeURIComponent(e);t&&t!==v&&w.isConnected()&&(v=t,x(r,!0),w.getControlDetails(t))}),B(()=>{const e=t=>{const o=t.detail;x(r,!1),o?_.set(o):V("/")};return window.addEventListener("control-details",e),()=>{window.removeEventListener("control-details",e)}});var f=T(),l=F(f),p=s(l),L=s(p);G(L,{}),a(p),a(l);var g=h(l,2),m=s(g);{var I=e=>{var t=O();i(e,t)};b(m,e=>{P(r)&&e(I)})}var z=h(m,2);{var j=e=>{J(e,{get control(){return d()}})},E=e=>{var t=Q(),o=s(t),u=s(o),M=s(u);K(M,{class:"mx-auto h-16 w-16 mb-4"}),R(4),a(u),a(o),a(t),i(e,t)};b(z,e=>{d()?e(j):e(E,!1)})}a(g),i(y,f),H(),D()}export{se as component};
1
+ import"../chunks/DsnmJJEf.js";import{p as S,u as A,d as x,o as B,f as n,a as F,b as i,e as H,c as s,g as N,r as a,s as h,h as P,n as R}from"../chunks/Cby0Z7eP.js";import{a as C,i as b,s as U}from"../chunks/DqsOU3kV.js";import{g as V}from"../chunks/D3AAXov_.js";import{p as q,s as _}from"../chunks/D4wsprzy.js";import{C as G,a as J,D as K}from"../chunks/DSi9HfzB.js";import{w}from"../chunks/BtOhWAVU.js";var O=n('<div class="absolute top-4 right-4 z-10"><div class="w-8 h-8 flex items-center justify-center rounded-full bg-blue-100 dark:bg-blue-900/30" title="Loading control..."><svg class="w-5 h-5 text-blue-600 dark:text-blue-400 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg></div></div>'),Q=n('<div class=" h-full flex flex-col"><div class="flex-1 flex items-center justify-center p-8"><div class="text-center text-gray-500 dark:text-gray-400"><!> <h3 class="text-xl font-semibold text-gray-900 dark:text-white mb-2">No Control Selected</h3> <p class="text-gray-600 dark:text-gray-400">Select a control from the list to view and edit its details</p></div></div></div>'),T=n('<div class="w-1/2 flex flex-col"><div class="bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg shadow-sm h-full flex flex-col"><!></div></div> <div class="w-1/2 flex flex-col relative"><!> <!></div>',1);function se(y,k){S(k,!0);const $=()=>C(q,"$page",c),d=()=>C(_,"$selectedControl",c),[c,D]=U();let v="",r=N(!1);A(()=>{const e=$().params.id;if(!e)return;const t=decodeURIComponent(e);t&&t!==v&&w.isConnected()&&(v=t,x(r,!0),w.getControlDetails(t))}),B(()=>{const e=t=>{const o=t.detail;x(r,!1),o?_.set(o):V("/")};return window.addEventListener("control-details",e),()=>{window.removeEventListener("control-details",e)}});var f=T(),l=F(f),p=s(l),L=s(p);G(L,{}),a(p),a(l);var g=h(l,2),m=s(g);{var I=e=>{var t=O();i(e,t)};b(m,e=>{P(r)&&e(I)})}var z=h(m,2);{var j=e=>{J(e,{get control(){return d()}})},E=e=>{var t=Q(),o=s(t),u=s(o),M=s(u);K(M,{class:"mx-auto h-16 w-16 mb-4"}),R(4),a(u),a(o),a(t),i(e,t)};b(z,e=>{d()?e(j):e(E,!1)})}a(g),i(y,f),H(),D()}export{se as component};
@@ -0,0 +1,9 @@
1
+ import"../chunks/DsnmJJEf.js";import{i as Ye}from"../chunks/C5zWTfmV.js";import{p as We,ae as Me,d as l,T as C,G as te,h as e,af as ar,ag as Ve,c as a,n as _e,r,b as d,e as Xe,J as H,K as P,ah as Vr,f as m,s as n,k as h,ai as b,a as we,aj as xr,ak as Ie,a0 as $e,al as hr,am as rr,an as yr,o as Gr,W as Qr}from"../chunks/Cby0Z7eP.js";import{l as tr,p as Ue,i as z,a as et,s as rt}from"../chunks/DqsOU3kV.js";import{a as Tr,s as de,r as Er,e as pe,i as De,b as qe,c as Ir,d as _r,f as Cr,w as wr}from"../chunks/BtOhWAVU.js";import{g as tt}from"../chunks/D3AAXov_.js";var at=Ve("<title> </title>"),ot=Ve('<svg><!><path d="M11 18L12.41 19.41 15 16.83 15 29 17 29 17 16.83 19.59 19.41 21 18 16 13 11 18z"></path><path d="M23.5,22H23V20h.5a4.5,4.5,0,0,0,.36-9L23,11l-.1-.82a7,7,0,0,0-13.88,0L9,11,8.14,11a4.5,4.5,0,0,0,.36,9H9v2H8.5A6.5,6.5,0,0,1,7.2,9.14a9,9,0,0,1,17.6,0A6.5,6.5,0,0,1,23.5,22Z"></path></svg>');function lt(fe,K){const F=tr(K,["children","$$slots","$$events","$$legacy"]),se=tr(F,["size","title"]);We(K,!1);const V=C(),T=C();let N=Ue(K,"size",8,16),x=Ue(K,"title",8,void 0);Me(()=>(te(F),te(x())),()=>{l(V,F["aria-label"]||F["aria-labelledby"]||x())}),Me(()=>(e(V),te(F)),()=>{l(T,{"aria-hidden":e(V)?void 0:!0,role:e(V)?"img":void 0,focusable:Number(F.tabindex)===0?!0:void 0})}),ar(),Ye();var f=ot();Tr(f,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:N(),height:N(),...e(T),...se}));var S=a(f);{var ie=R=>{var c=at(),q=a(c,!0);r(c),H(()=>P(q,x())),d(R,c)};z(S,R=>{x()&&R(ie)})}_e(2),r(f),d(fe,f),Xe()}var st=Ve("<title> </title>"),it=Ve('<svg><!><path d="M10 6H14V10H10zM18 6H22V10H18zM10 14H14V18H10zM18 14H22V18H18zM10 22H14V26H10zM18 22H22V26H18z"></path></svg>');function kr(fe,K){const F=tr(K,["children","$$slots","$$events","$$legacy"]),se=tr(F,["size","title"]);We(K,!1);const V=C(),T=C();let N=Ue(K,"size",8,16),x=Ue(K,"title",8,void 0);Me(()=>(te(F),te(x())),()=>{l(V,F["aria-label"]||F["aria-labelledby"]||x())}),Me(()=>(e(V),te(F)),()=>{l(T,{"aria-hidden":e(V)?void 0:!0,role:e(V)?"img":void 0,focusable:Number(F.tabindex)===0?!0:void 0})}),ar(),Ye();var f=it();Tr(f,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:N(),height:N(),...e(T),...se}));var S=a(f);{var ie=R=>{var c=st(),q=a(c,!0);r(c),H(()=>P(q,x())),d(R,c)};z(S,R=>{x()&&R(ie)})}_e(),r(f),d(fe,f),Xe()}var nt=m('<div class="p-4 text-sm text-blue-800 rounded-lg bg-blue-50 dark:bg-gray-800 dark:text-blue-400"><div class="flex items-center"><svg class="flex-shrink-0 inline w-4 h-4 mr-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20"><path d="M10 .5a9.5 9.5 0 1 0 9.5 9.5A9.51 9.51 0 0 0 10 .5ZM9.5 4a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3ZM12 15H8a1 1 0 0 1 0-2h1v-3H8a1 1 0 0 1 0-2h2a1 1 0 0 1 1 1v4h1a1 1 0 0 1 0 2Z"></path></svg> <div><span class="font-medium">File loaded:</span> <div class="mt-1"><span class="font-medium">Sheets:</span> <span class="font-medium">Fields:</span> <span class="font-medium">Controls found:</span> </div></div></div></div>'),dt=m('<div class="p-4 text-sm text-red-800 rounded-lg bg-red-50 dark:bg-gray-800 dark:text-red-400"><div class="flex items-center"><svg class="flex-shrink-0 inline w-4 h-4 mr-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20"><path d="M10 .5a9.5 9.5 0 1 0 9.5 9.5A9.51 9.51 0 0 0 10 .5ZM9.5 4a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3ZM12 15H8a1 1 0 0 1 0-2h1v-3H8a1 1 0 0 1 0-2h2a1 1 0 0 1 1 1v4h1a1 1 0 0 1 0 2Z"></path></svg> <span> </span></div></div>'),vt=m('<div class="p-4 text-sm text-green-800 rounded-lg bg-green-50 dark:bg-gray-800 dark:text-green-400"><div class="flex items-center"><svg class="flex-shrink-0 inline w-4 h-4 mr-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20"><path d="M10 .5a9.5 9.5 0 1 0 9.5 9.5A9.51 9.51 0 0 0 10 .5ZM9.5 4a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3ZM12 15H8a1 1 0 0 1 0-2h1v-3H8a1 1 0 0 1 0-2h2a1 1 0 0 1 1 1v4h1a1 1 0 0 1 0 2Z"></path></svg> <span> </span></div></div>'),ct=m("<option> </option>"),gt=m("<option> </option>"),pt=m("<option> </option>"),ut=m('<span class="ml-auto text-xs text-blue-600 dark:text-blue-400">ID</span>'),bt=m('<div draggable="true" role="button" tabindex="0" class="flex items-center px-3 py-2 bg-gray-100 dark:bg-gray-700 text-gray-500 dark:text-gray-400 rounded text-sm cursor-move hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors opacity-75"><svg class="w-3 h-3 mr-2 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path d="M10 6a2 2 0 110-4 2 2 0 010 4zM10 12a2 2 0 110-4 2 2 0 010 4zM10 18a2 2 0 110-4 2 2 0 010 4z"></path></svg> <span class="truncate line-through"> </span> <!></div>'),ft=m('<p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">No excluded fields</p>'),mt=m('<div draggable="true" role="button" tabindex="0"><!> <span class="truncate"> </span></div>'),xt=m('<p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">Drop fields here</p>'),ht=m('<div draggable="true" role="button" tabindex="0"><!> <span class="truncate"> </span></div>'),yt=m('<p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">Drop fields here</p>'),_t=m('<div draggable="true" role="button" tabindex="0"><!> <span class="truncate"> </span></div>'),wt=m('<p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">Drop fields here</p>'),kt=m('<th class="px-4 py-2"> </th>'),Ct=m('<td class="px-4 py-2"> </td>'),St=m('<tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700"></tr>'),$t=m('<div class="bg-gradient-to-br from-gray-50 to-gray-100 dark:from-gray-800 dark:to-gray-900 rounded-lg p-4 border border-gray-200 dark:border-gray-700"><h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">Sample Data Preview</h3> <div class="overflow-x-auto"><table class="w-full text-sm text-left text-gray-500 dark:text-gray-400"><thead class="text-xs text-gray-700 uppercase bg-gray-100 dark:bg-gray-600 dark:text-gray-400"><tr></tr></thead><tbody></tbody></table></div></div>'),Dt=m('<span class="flex items-center"><svg class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> Importing...</span>'),Mt=m(`<div class="bg-gradient-to-br from-gray-50 to-gray-100 dark:from-gray-800 dark:to-gray-900 rounded-lg p-4 border border-gray-200 dark:border-gray-700"><h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">Import Options</h3> <div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-4"><div><label for="controlSetName" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Control Set Name <span class="text-red-500">*</span></label> <input type="text" id="controlSetName" placeholder="e.g., NIST 800-53 Rev 4" class="bg-white border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:text-white" required/> <p class="mt-1 text-xs text-gray-500 dark:text-gray-400">This will be used as the display name and folder name</p></div> <div><label for="controlSetDescription" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Description</label> <input type="text" id="controlSetDescription" placeholder="Optional description" class="bg-white border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:text-white"/> <p class="mt-1 text-xs text-gray-500 dark:text-gray-400">Brief description of this control set</p></div></div> <div class="grid grid-cols-1 md:grid-cols-2 gap-4"><div><label for="sheet" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Sheet</label> <select id="sheet" class="bg-white border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:text-white"></select> <p class="mt-1 text-xs text-gray-500 dark:text-gray-400">Select which worksheet contains your control data</p></div> <div><label for="headerRow" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Select Header Row</label> <select id="headerRow" class="bg-white border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:text-white"></select> <p class="mt-1 text-xs text-gray-500 dark:text-gray-400">Select the row containing column headers</p></div> <div><label for="controlIdField" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Control ID Field <span class="text-red-500">*</span></label> <select id="controlIdField" required><option disabled>Select Control ID field</option><!></select> <p class="mt-1 text-xs text-gray-500 dark:text-gray-400">Column containing unique control identifiers (e.g., AC-1, SC-7)</p></div></div></div> <div class="bg-gradient-to-br from-gray-50 to-gray-100 dark:from-gray-800 dark:to-gray-900 rounded-lg p-4 border border-gray-200 dark:border-gray-700"><h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">Organize Fields</h3> <p class="text-sm text-gray-600 dark:text-gray-400 mb-4">Drag fields to organize them. <strong>Overview fields</strong> will appear as table columns in
2
+ the controls list.</p> <div class="grid grid-cols-1 lg:grid-cols-4 gap-4"><div class="border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800"><div class="p-3 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-700 rounded-t-lg"><h4 class="text-sm font-semibold text-gray-700 dark:text-gray-300">Excluded Fields</h4> <p class="text-xs text-gray-500 dark:text-gray-400 mt-1">Not imported</p></div> <div role="region" aria-label="Excluded fields drop zone"><!> <!></div></div> <div class="border border-blue-300 dark:border-blue-700 rounded-lg bg-white dark:bg-gray-800"><div class="p-3 border-b border-blue-200 dark:border-blue-800 bg-blue-50 dark:bg-blue-900/20 rounded-t-lg"><h4 class="text-sm font-semibold text-blue-700 dark:text-blue-300">Overview Tab</h4> <p class="text-xs text-blue-600 dark:text-blue-400 mt-1">Shows in details & table columns</p></div> <div role="region" aria-label="Overview tab drop zone"><!> <!></div></div> <div class="border border-green-300 dark:border-green-700 rounded-lg bg-white dark:bg-gray-800"><div class="p-3 border-b border-green-200 dark:border-green-800 bg-green-50 dark:bg-green-900/20 rounded-t-lg"><h4 class="text-sm font-semibold text-green-700 dark:text-green-300">Implementation Tab</h4> <p class="text-xs text-green-600 dark:text-green-400 mt-1">Status & compliance</p></div> <div role="region" aria-label="Implementation tab drop zone"><!> <!></div></div> <div class="border border-purple-300 dark:border-purple-700 rounded-lg bg-white dark:bg-gray-800"><div class="p-3 border-b border-purple-200 dark:border-purple-800 bg-purple-50 dark:bg-purple-900/20 rounded-t-lg"><h4 class="text-sm font-semibold text-purple-700 dark:text-purple-300">Custom Tab</h4> <p class="text-xs text-purple-600 dark:text-purple-400 mt-1">Additional fields</p></div> <div role="region" aria-label="Custom fields drop zone"><!> <!></div></div></div></div> <!> <div class="flex justify-center"><button class="px-5 py-2.5 text-white bg-blue-600 hover:bg-blue-700 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm disabled:opacity-50 disabled:cursor-not-allowed"><!></button></div>`,1),zt=m('<div class="space-y-6"><div role="button" tabindex="0" class="relative"><label><div class="flex flex-col items-center justify-center pt-5 pb-6"><!> <p class="mb-2 text-sm text-gray-500 dark:text-gray-400"><span class="font-semibold">Click to upload</span> or drag and drop</p> <p class="text-xs text-gray-500 dark:text-gray-400">XLSX, XLS or CSV files</p></div> <input type="file" class="hidden" accept=".xlsx,.xls,.csv"/></label></div> <!> <!> <!> <!></div>');function At(fe,K){We(K,!1);const F=C(),se=Vr();let V=C(null),T=C(""),N=C(""),x=C([]),f=C([]),S=C([]),ie=C(0),R=C([]),c=C(new Map),q=C(1),j=C(""),ue=C(""),U=C(""),Y=C(!1),W=C(""),ve=C(""),ye=C(!1),ae=C(!1),E=C(null),X=C(null),oe=C(null);function ke(){l(f,[]),l(S,[]),l(ie,0),e(c).clear(),l(c,new Map),l(j,""),l(W,""),l(ve,""),l(E,null),l(X,null),l(oe,null)}function p(t){t.preventDefault(),l(ae,!0)}function u(){l(ae,!1)}function $(t){t.preventDefault(),l(ae,!1);const i=t.dataTransfer?.files;i&&i.length>0&&I(i[0])}function L(t){const i=t.target;i.files&&i.files.length>0&&I(i.files[0])}async function I(t){ke(),l(T,t.name),l(V,t),l(W,""),l(Y,!0),l(ue,e(T).replace(/\.[^.]+$/,"").replace(/[-_]/g," ")),l(U,`Imported from ${e(T)}`);try{const i=new FormData;i.append("file",t);const y=await fetch("/api/parse-excel",{method:"POST",body:i});if(!y.ok){const D=await y.json();throw new Error(D.error||"Failed to parse file")}const _=await y.json();l(x,_.sheets||[]),l(N,_.selectedSheet||e(x)[0]),l(R,_.rowPreviews||[]),e(R).length>0&&e(q)===1&&l(q,e(R)[0].row),await B(),l(ye,!0)}catch(i){l(W,"Error reading file: "+i.message)}finally{l(Y,!1)}}async function B(){if(!(!e(V)||!e(N))){l(Y,!0),e(c).clear(),l(c,new Map),l(j,"");try{const t=new FormData;t.append("file",e(V)),t.append("sheetName",e(N)),t.append("headerRow",e(q).toString());const i=await fetch("/api/parse-excel-sheet",{method:"POST",body:t});if(!i.ok){const _=await i.json();throw new Error(_.error||"Failed to parse sheet")}const y=await i.json();if(l(f,y.fields||[]),l(S,y.sampleData||[]),l(ie,y.controlCount||0),e(f).forEach((_,D)=>{const v=_.toLowerCase();let O="custom",Z="text";v.includes("implementation")||v.includes("status")||v.includes("narrative")||v.includes("guidance")?O="implementation":(v.includes("id")||v.includes("title")||v.includes("family")||v.includes("cci")||v.includes("control")||v.includes("acronym"))&&(O="overview"),v.includes("description")||v.includes("narrative")||v.includes("guidance")||v.includes("statement")?Z="textarea":v.includes("status")||v.includes("type")||v.includes("designation")?Z="select":v.includes("date")?Z="date":(v.includes("count")||v.includes("number"))&&(Z="number"),e(c).set(_,{originalName:_,tab:O,displayOrder:D,fieldType:Z,required:v.includes("id")||v.includes("title")})}),l(c,e(c)),e(j)&&!e(f).includes(e(j))&&l(j,""),!e(j)&&e(f).includes("AP Acronym")){const _=!e(S).length||e(S).every(Q=>!Q["AP Acronym"]||String(Q["AP Acronym"]).length<25),D=e(S).map(Q=>Q["AP Acronym"]).filter(Q=>Q!=null&&Q!==""&&String(Q).trim()!==""),v=new Set(D),O=!D.length||v.size===D.length,Z=D.length>0;_&&O&&Z&&l(j,"AP Acronym")}}catch(t){l(W,"Error loading sheet data: "+t.message)}finally{l(Y,!1)}}}function ce(t){if(!t)return t;let i=t.trim().replace(/\r?\n/g," ").replace(/\s+/g," ").trim();return Te(i)}function Te(t){return t.replace(/\W+/g," ").split(/ |\s/).map(i=>i.toLowerCase()).join("-")}function be(t,i){l(E,i),t.dataTransfer&&(t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",i))}function le(){l(E,null),l(X,null),l(oe,null)}function M(t,i){t.preventDefault(),l(X,i),t.dataTransfer&&(t.dataTransfer.dropEffect="move")}function ge(){l(X,null)}function ne(t,i,y){if(t.preventDefault(),e(E)&&e(c).has(e(E))){const _=e(c).get(e(E));if(_.tab=i,y!==void 0&&i!==null){const v=Array.from(e(c).entries()).filter(([O,Z])=>Z.tab===i).sort((O,Z)=>O[1].displayOrder-Z[1].displayOrder).filter(([O])=>O!==e(E));v.splice(y,0,[e(E),_]),v.forEach(([O,Z],Q)=>{Z.displayOrder=Q,e(c).set(O,Z)})}else if(i!==null){const D=Math.max(0,...Array.from(e(c).values()).filter(v=>v.tab===i).map(v=>v.displayOrder));_.displayOrder=D+1}e(c).set(e(E),_),l(c,e(c))}l(E,null),l(X,null)}function ze(t,i){t.preventDefault(),t.stopPropagation(),l(oe,i)}function Ce(){l(oe,null)}function Se(t,i,y){if(t.preventDefault(),t.stopPropagation(),e(E)&&e(E)!==i){const D=Array.from(e(c).entries()).filter(([v,O])=>O.tab===y).sort((v,O)=>v[1].displayOrder-O[1].displayOrder).findIndex(([v])=>v===i);D!==-1&&ne(t,y,D)}l(oe,null)}async function Le(){if(!(!e(V)||!e(T))){if(!e(j)){l(W,"Please select a Control ID field before importing"),l(ve,"");return}if(!e(ue)||e(ue).trim()===""){l(W,"Please enter a Control Set Name before importing"),l(ve,"");return}l(Y,!0),l(W,""),l(ve,"");try{const t=new FormData;t.append("file",e(V),e(T)),t.append("controlIdField",e(j)),t.append("startRow",e(q).toString()),t.append("namingConvention","kebab-case"),t.append("skipEmpty","true"),t.append("skipEmptyRows","true"),t.append("controlSetName",e(ue)||e(T).replace(/\.[^.]+$/,"")),t.append("controlSetDescription",e(U)||`Imported from ${e(T)}`);const i=Array.from(e(c).entries()).filter(([D,v])=>v.tab!==null).map(([D,v])=>({fieldName:ce(D),...v}));t.append("fieldSchema",JSON.stringify(i));const y=await fetch("/api/import-spreadsheet",{method:"POST",body:t});if(!y.ok){const D=await y.json();throw new Error(D.error||"Import failed")}const _=await y.json();l(ve,`Successfully imported ${_.controlCount} controls into ${_.families.length} families`),se("created",{path:_.outputDir})}catch(t){l(W,"Error importing spreadsheet: "+t.message)}finally{l(Y,!1)}}}Me(()=>e(f),()=>{l(F,e(f).filter(t=>e(f).includes(t)))}),ar(),Ye();var Ne=zt(),me=a(Ne),je=a(me),Ae=a(je),or=a(Ae);lt(or,{class:"w-8 h-8 mb-4 text-gray-500 dark:text-gray-400"}),_e(4),r(Ae);var Je=n(Ae,2);r(je),r(me);var Fe=n(me,2);{var lr=t=>{var i=nt(),y=a(i),_=n(a(y),2),D=n(a(_)),v=n(D),O=n(a(v)),Z=n(O,2),Q=n(Z,2);r(v),r(_),r(y),r(i),H(()=>{P(D,` ${e(T)??""} `),P(O,` ${e(x),h(()=>e(x).length)??""} | `),P(Z,` ${e(f),h(()=>e(f).length)??""} | `),P(Q,` ${e(ie)??""}`)}),d(t,i)};z(Fe,t=>{e(T)&&t(lr)})}var Ke=n(Fe,2);{var sr=t=>{var i=dt(),y=a(i),_=n(a(y),2),D=a(_,!0);r(_),r(y),r(i),H(()=>P(D,e(W))),d(t,i)};z(Ke,t=>{e(W)&&t(sr)})}var Be=n(Ke,2);{var ir=t=>{var i=vt(),y=a(i),_=n(a(y),2),D=a(_,!0);r(_),r(y),r(i),H(()=>P(D,e(ve))),d(t,i)};z(Be,t=>{e(ve)&&t(ir)})}var nr=n(Be,2);{var dr=t=>{var i=Mt(),y=we(i),_=n(a(y),2),D=a(_),v=n(a(D),2);Er(v),_e(2),r(D);var O=n(D,2),Z=n(a(O),2);Er(Z),_e(2),r(O),r(_);var Q=n(_,2),vr=a(Q),Ge=n(a(vr),2);H(()=>{e(N),xr(()=>{e(x)})}),pe(Ge,5,()=>e(x),De,(o,s)=>{var w=ct(),k=a(w,!0);r(w);var g={};H(()=>{P(k,e(s)),g!==(g=e(s))&&(w.value=(w.__value=e(s))??"")}),d(o,w)}),r(Ge),_e(2),r(vr);var cr=n(vr,2),Qe=n(a(cr),2);H(()=>{e(q),xr(()=>{e(R)})}),pe(Qe,5,()=>e(R),De,(o,s)=>{var w=gt(),k=a(w);r(w);var g={};H(()=>{P(k,`Row ${e(s),h(()=>e(s).row)??""}: ${e(s),h(()=>e(s).preview)??""}`),g!==(g=(e(s),h(()=>e(s).row)))&&(w.value=(w.__value=(e(s),h(()=>e(s).row)))??"")}),d(o,w)}),r(Qe),_e(2),r(cr);var Sr=n(cr,2),er=n(a(Sr),2);H(()=>{e(j),xr(()=>{e(f),e(S)})});var gr=a(er);gr.value=gr.__value="";var Lr=n(gr);pe(Lr,1,()=>e(f),De,(o,s)=>{const w=$e(()=>(e(S),e(s),h(()=>e(S).length>0&&e(S)[0][e(s)]?String(e(S)[0][e(s)]).slice(0,30):""))),k=$e(()=>(e(S),e(s),h(()=>!e(S).length||e(S).every(re=>!re[e(s)]||String(re[e(s)]).length<25)))),g=$e(()=>(e(S),e(s),h(()=>e(S).map(re=>re[e(s)]).filter(re=>re!=null&&re!==""&&String(re).trim()!=="")))),G=$e(()=>new Set(e(g))),ee=$e(()=>(te(e(g)),te(e(G)),h(()=>!e(g).length||e(G).size===e(g).length))),J=$e(()=>(te(e(g)),h(()=>e(g).length>0)));var A=Ie(),xe=we(A);{var Re=re=>{var he=pt(),mr=a(he);r(he);var Pr={};H(()=>{P(mr,`${e(s)??""}${e(w)?` (e.g., ${e(w)})`:""}`),Pr!==(Pr=e(s))&&(he.value=(he.__value=e(s))??"")}),d(re,he)};z(xe,re=>{e(k)&&e(ee)&&e(J)&&re(Re)})}d(o,A)}),r(er),_e(2),r(Sr),r(Q),r(y);var pr=n(y,2),$r=n(a(pr),4),ur=a($r),Oe=n(a(ur),2),Dr=a(Oe);pe(Dr,1,()=>(e(f),e(c),h(()=>e(f).filter(o=>!e(c).get(o)||e(c).get(o)?.tab===null))),o=>o,(o,s)=>{var w=bt(),k=n(a(w),2),g=a(k,!0);r(k);var G=n(k,2);{var ee=J=>{var A=ut();d(J,A)};z(G,J=>{e(s)===e(j)&&J(ee)})}r(w),H(()=>{qe(w,"aria-label",`Drag ${e(s)??""} field`),P(g,e(s))}),b("dragstart",w,J=>be(J,e(s))),b("dragend",w,le),d(o,w)});var Nr=n(Dr,2);{var jr=o=>{var s=ft();d(o,s)};z(Nr,o=>{e(f),e(c),h(()=>e(f).filter(s=>!e(c).get(s)||e(c).get(s)?.tab===null).length===0)&&o(jr)})}r(Oe),r(ur);var br=n(ur,2),He=n(a(br),2),Mr=a(He);pe(Mr,3,()=>(e(c),h(()=>Array.from(e(c).entries()).filter(([o,s])=>s.tab==="overview").sort((o,s)=>o[1].displayOrder-s[1].displayOrder))),([o,s])=>o,(o,s)=>{var w=hr(()=>yr(e(s),2));let k=()=>e(w)[0];var g=mt(),G=a(g);kr(G,{class:"w-3 h-3 mr-2 flex-shrink-0"});var ee=n(G,2),J=a(ee,!0);r(ee),r(g),H(()=>{qe(g,"aria-label",`${k()??""} field in Overview tab`),de(g,1,`flex items-center px-3 py-2 bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-300 rounded text-sm cursor-move hover:bg-blue-200 dark:hover:bg-blue-800/30 transition-colors
3
+ ${e(oe)===k()&&e(E)!==k()?"border-t-2 border-blue-500":""}`),P(J,k())}),b("dragstart",g,A=>be(A,k())),b("dragend",g,le),b("dragover",g,A=>ze(A,k())),b("dragleave",g,Ce),b("drop",g,A=>Se(A,k(),"overview")),d(o,g)});var Br=n(Mr,2);{var Zr=o=>{var s=xt();d(o,s)};z(Br,o=>{e(c),h(()=>Array.from(e(c).entries()).filter(([s,w])=>w.tab==="overview").length===0)&&o(Zr)})}r(He),r(br);var fr=n(br,2),Pe=n(a(fr),2),zr=a(Pe);pe(zr,3,()=>(e(c),h(()=>Array.from(e(c).entries()).filter(([o,s])=>s.tab==="implementation").sort((o,s)=>o[1].displayOrder-s[1].displayOrder))),([o,s])=>o,(o,s)=>{var w=hr(()=>yr(e(s),2));let k=()=>e(w)[0];var g=ht(),G=a(g);kr(G,{class:"w-3 h-3 mr-2 flex-shrink-0"});var ee=n(G,2),J=a(ee,!0);r(ee),r(g),H(()=>{qe(g,"aria-label",`${k()??""} field in Implementation tab`),de(g,1,`flex items-center px-3 py-2 bg-green-100 dark:bg-green-900/30 text-green-800 dark:text-green-300 rounded text-sm cursor-move hover:bg-green-200 dark:hover:bg-green-800/30 transition-colors
4
+ ${e(oe)===k()&&e(E)!==k()?"border-t-2 border-green-500":""}`),P(J,k())}),b("dragstart",g,A=>be(A,k())),b("dragend",g,le),b("dragover",g,A=>ze(A,k())),b("dragleave",g,Ce),b("drop",g,A=>Se(A,k(),"implementation")),d(o,g)});var Rr=n(zr,2);{var qr=o=>{var s=yt();d(o,s)};z(Rr,o=>{e(c),h(()=>Array.from(e(c).entries()).filter(([s,w])=>w.tab==="implementation").length===0)&&o(qr)})}r(Pe),r(fr);var Ar=n(fr,2),Ee=n(a(Ar),2),Fr=a(Ee);pe(Fr,3,()=>(e(c),h(()=>Array.from(e(c).entries()).filter(([o,s])=>s.tab==="custom").sort((o,s)=>o[1].displayOrder-s[1].displayOrder))),([o,s])=>o,(o,s)=>{var w=hr(()=>yr(e(s),2));let k=()=>e(w)[0];var g=_t(),G=a(g);kr(G,{class:"w-3 h-3 mr-2 flex-shrink-0"});var ee=n(G,2),J=a(ee,!0);r(ee),r(g),H(()=>{qe(g,"aria-label",`${k()??""} field in Custom tab`),de(g,1,`flex items-center px-3 py-2 bg-purple-100 dark:bg-purple-900/30 text-purple-800 dark:text-purple-300 rounded text-sm cursor-move hover:bg-purple-200 dark:hover:bg-purple-800/30 transition-colors
5
+ ${e(oe)===k()&&e(E)!==k()?"border-t-2 border-purple-500":""}`),P(J,k())}),b("dragstart",g,A=>be(A,k())),b("dragend",g,le),b("dragover",g,A=>ze(A,k())),b("dragleave",g,Ce),b("drop",g,A=>Se(A,k(),"custom")),d(o,g)});var Ur=n(Fr,2);{var Yr=o=>{var s=wt();d(o,s)};z(Ur,o=>{e(c),h(()=>Array.from(e(c).entries()).filter(([s,w])=>w.tab==="custom").length===0)&&o(Yr)})}r(Ee),r(Ar),r($r),r(pr);var Or=n(pr,2);{var Wr=o=>{var s=$t(),w=n(a(s),2),k=a(w),g=a(k),G=a(g);pe(G,5,()=>(e(f),h(()=>e(f).slice(0,5))),De,(J,A)=>{var xe=kt(),Re=a(xe,!0);r(xe),H(()=>P(Re,e(A))),d(J,xe)}),r(G),r(g);var ee=n(g);pe(ee,5,()=>e(S),De,(J,A)=>{var xe=St();pe(xe,5,()=>(e(f),h(()=>e(f).slice(0,5))),De,(Re,re)=>{var he=Ct(),mr=a(he,!0);r(he),H(()=>P(mr,(e(A),e(re),h(()=>e(A)[e(re)]||"")))),d(Re,he)}),r(xe),d(J,xe)}),r(ee),r(k),r(w),r(s),d(o,s)};z(Or,o=>{e(S),h(()=>e(S).length>0)&&o(Wr)})}var Hr=n(Or,2),Ze=a(Hr),Xr=a(Ze);{var Jr=o=>{var s=Dt();d(o,s)},Kr=o=>{var s=rr("Import to Control Set");d(o,s)};z(Xr,o=>{e(Y)?o(Jr):o(Kr,!1)})}r(Ze),r(Hr),H(()=>{de(er,1,`bg-white border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:text-white ${e(j)?"":"border-red-500"}`),de(Oe,1,`p-3 min-h-[400px] max-h-[600px] overflow-y-auto space-y-2 transition-colors
6
+ ${e(X)===null?"bg-gray-100 dark:bg-gray-800":""}`),de(He,1,`p-3 min-h-[400px] max-h-[600px] overflow-y-auto space-y-2 transition-colors
7
+ ${e(X)==="overview"?"bg-blue-50 dark:bg-blue-900/10":""}`),de(Pe,1,`p-3 min-h-[400px] max-h-[600px] overflow-y-auto space-y-2 transition-colors
8
+ ${e(X)==="implementation"?"bg-green-50 dark:bg-green-900/10":""}`),de(Ee,1,`p-3 min-h-[400px] max-h-[600px] overflow-y-auto space-y-2 transition-colors
9
+ ${e(X)==="custom"?"bg-purple-50 dark:bg-purple-900/10":""}`),Ze.disabled=e(Y)||!e(V)||!e(j),qe(Ze,"title",e(j)?"":"Please select a Control ID field")}),Ir(v,()=>e(ue),o=>l(ue,o)),Ir(Z,()=>e(U),o=>l(U,o)),_r(Ge,()=>e(N),o=>l(N,o)),b("change",Ge,()=>{B()}),_r(Qe,()=>e(q),o=>l(q,o)),b("change",Qe,B),_r(er,()=>e(j),o=>l(j,o)),b("dragover",Oe,o=>M(o,null)),b("dragleave",Oe,ge),b("drop",Oe,o=>ne(o,null)),b("dragover",He,o=>M(o,"overview")),b("dragleave",He,ge),b("drop",He,o=>ne(o,"overview")),b("dragover",Pe,o=>M(o,"implementation")),b("dragleave",Pe,ge),b("drop",Pe,o=>ne(o,"implementation")),b("dragover",Ee,o=>M(o,"custom")),b("dragleave",Ee,ge),b("drop",Ee,o=>ne(o,"custom")),b("click",Ze,Le),d(t,i)};z(nr,t=>{e(ye),e(f),h(()=>e(ye)&&e(f).length>0)&&t(dr)})}r(Ne),H(()=>de(je,1,`flex flex-col items-center justify-center w-full h-64 border-2 border-dashed rounded-lg cursor-pointer transition-all duration-300 ${e(ae)?"border-blue-500 bg-blue-50 dark:bg-blue-900/20":"border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600"}`)),b("change",Je,L),b("dragover",me,p),b("dragleave",me,u),b("drop",me,$),d(fe,Ne),Xe()}var Ft=m('<span class="ml-2"> </span>'),Ot=m('<div class="text-sm text-gray-500 dark:text-gray-400"><span class="font-medium"> </span> <!></div>'),Ht=m('<div class="text-center space-y-6"><div class="p-6 bg-gradient-to-br from-green-50 to-emerald-50 dark:from-green-900/20 dark:to-emerald-900/20 rounded-lg border-2 border-green-500"><svg class="w-12 h-12 text-green-600 mx-auto mb-4" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path></svg> <h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">Already Using Control Set</h3> <p class="text-gray-600 dark:text-gray-400 mb-4">You are already using the only available control set in this project.</p> <!></div> <div class="flex justify-center gap-4"><a href="/" class="px-6 py-3 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-lg transition-colors shadow-lg">Continue to Controls</a> <button class="px-6 py-3 bg-gray-200 hover:bg-gray-300 dark:bg-gray-700 dark:hover:bg-gray-600 text-gray-900 dark:text-white font-medium rounded-lg transition-colors">Import New Control Set</button></div></div>'),Pt=m('<div class="p-4 text-sm text-yellow-800 rounded-lg bg-yellow-50 dark:bg-gray-800 dark:text-yellow-300"><div class="flex items-center"><svg class="flex-shrink-0 inline w-4 h-4 mr-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20"><path d="M10 .5a9.5 9.5 0 1 0 9.5 9.5A9.51 9.51 0 0 0 10 .5ZM9.5 4a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3ZM12 15H8a1 1 0 0 1 0-2h1v-3H8a1 1 0 0 1 0-2h2a1 1 0 0 1 1 1v4h1a1 1 0 0 1 0 2Z"></path></svg> <span> </span></div></div>'),Et=m('<p class="text-sm text-gray-600 dark:text-gray-400 mt-1"> </p>'),It=m('<span class="text-xs text-gray-500 dark:text-gray-400"><svg class="inline w-3 h-3 mr-1" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6z" clip-rule="evenodd"></path></svg> </span>'),Vt=m('<div class="flex flex-col items-center"><svg class="w-8 h-8 text-green-600" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path></svg> <span class="text-xs text-green-600 font-medium mt-1">Current</span></div>'),Tt=Ve('<svg class="w-8 h-8 text-blue-600" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path></svg>'),Lt=Ve('<svg class="w-8 h-8 text-gray-300 dark:text-gray-600" fill="none" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="9" stroke="currentColor" stroke-width="2"></circle></svg>'),Nt=m('<div role="button" tabindex="0"><div class="flex items-center justify-between"><div class="flex-1"><div class="flex items-center gap-3"><h3 class="text-lg font-semibold text-gray-900 dark:text-white"> </h3> <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200"> </span></div> <!> <div class="flex items-center gap-4 mt-2"><span class="text-xs text-gray-500 dark:text-gray-400"><svg class="inline w-3 h-3 mr-1" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M2 6a2 2 0 012-2h12a2 2 0 012 2v8a2 2 0 01-2 2H4a2 2 0 01-2-2V6zm2-1a1 1 0 00-1 1v8a1 1 0 001 1h12a1 1 0 001-1V6a1 1 0 00-1-1H4z" clip-rule="evenodd"></path></svg> </span> <!></div></div> <div class="flex items-center ml-4"><!></div></div></div>'),jt=m('<div class="mt-6 flex justify-center"><button class="px-6 py-3 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-lg transition-colors shadow-lg">Use Selected Control Set</button></div>'),Bt=m('<div class="space-y-3"></div> <!>',1),Zt=m('<div class="space-y-6"><div class="text-center"><h2 class="text-2xl font-bold text-gray-900 dark:text-white mb-2">Select an Existing Control Set</h2> <p class="text-gray-600 dark:text-gray-400">Choose from control sets found in your project directory</p></div> <!></div>');function Rt(fe,K){We(K,!1);const F=()=>et(Cr,"$appState",se),[se,V]=rt(),T=C(),N=Vr();let x=Ue(K,"controlSets",24,()=>[]),f=C(""),S=C(null);function ie(U){c(U)||l(S,U)}function R(){e(S)&&!c(e(S))&&N("selected",{path:e(S).path})}function c(U){const Y=e(T)?.replace(/\/$/,""),W=U.path?.replace(/\/$/,"");return!!(Y&&W&&Y===W)}Me(()=>F(),()=>{l(T,F().currentPath||"")}),Me(()=>te(x()),()=>{if(x())if(x().length===0)l(f,"No existing control sets found. Try importing from a spreadsheet instead.");else{const U=x().filter(Y=>!c(Y));U.length===1?l(S,U[0]):U.length===0&&x().length>0&&l(f,"already-using-only-set")}}),ar(),Ye();var q=Zt(),j=n(a(q),2);{var ue=U=>{var Y=Ie(),W=we(Y);{var ve=ae=>{var E=Ht(),X=a(E),oe=n(a(X),6);{var ke=$=>{var L=Ot(),I=a(L),B=a(I,!0);r(I);var ce=n(I,2);{var Te=be=>{var le=Ft(),M=a(le);r(le),H(()=>P(M,`(${te(x()),h(()=>x()[0].controlCount)??""} controls)`)),d(be,le)};z(ce,be=>{te(x()),h(()=>x()[0].controlCount)&&be(Te)})}r(L),H(()=>P(B,(te(x()),h(()=>x()[0].name)))),d($,L)};z(oe,$=>{te(x()),h(()=>x().length>0)&&$(ke)})}r(X);var p=n(X,2),u=n(a(p),2);r(p),r(E),b("click",u,()=>N("tab-change",{tab:"import"})),d(ae,E)},ye=ae=>{var E=Ie(),X=we(E);{var oe=p=>{var u=Pt(),$=a(u),L=n(a($),2),I=a(L,!0);r(L),r($),r(u),H(()=>P(I,e(f))),d(p,u)},ke=p=>{var u=Ie(),$=we(u);{var L=I=>{var B=Bt(),ce=we(B);pe(ce,5,x,De,(le,M)=>{const ge=$e(()=>(e(M),h(()=>c(e(M)))));var ne=Nt(),ze=a(ne),Ce=a(ze),Se=a(Ce),Le=a(Se),Ne=a(Le,!0);r(Le);var me=n(Le,2),je=a(me);r(me),r(Se);var Ae=n(Se,2);{var or=t=>{var i=Et(),y=a(i,!0);r(i),H(()=>P(y,(e(M),h(()=>e(M).description)))),d(t,i)};z(Ae,t=>{e(M),h(()=>e(M).description)&&t(or)})}var Je=n(Ae,2),Fe=a(Je),lr=n(a(Fe));r(Fe);var Ke=n(Fe,2);{var sr=t=>{var i=It(),y=n(a(i));r(i),H(()=>P(y,` ${e(M),h(()=>e(M).file)??""}`)),d(t,i)};z(Ke,t=>{e(M),h(()=>e(M).file)&&t(sr)})}r(Je),r(Ce);var Be=n(Ce,2),ir=a(Be);{var nr=t=>{var i=Vt();d(t,i)},dr=t=>{var i=Ie(),y=we(i);{var _=v=>{var O=Tt();d(v,O)},D=v=>{var O=Lt();d(v,O)};z(y,v=>{e(S)===e(M)?v(_):v(D,!1)},!0)}d(t,i)};z(ir,t=>{e(ge)?t(nr):t(dr,!1)})}r(Be),r(ze),r(ne),H(()=>{de(ne,1,`p-4 bg-gradient-to-br from-gray-50 to-gray-100 dark:from-gray-800 dark:to-gray-900 rounded-lg border-2 transition-all duration-200 ${e(ge)?"border-green-500 !bg-gradient-to-br from-green-50 to-emerald-50 dark:from-green-900/20 dark:to-emerald-900/20 cursor-not-allowed opacity-75":e(S)===e(M)?"border-blue-500 !bg-gradient-to-br from-blue-50 to-indigo-50 dark:from-blue-900/20 dark:to-indigo-900/20 shadow-lg cursor-pointer":"border-gray-200 dark:border-gray-700 hover:border-blue-300 dark:hover:border-blue-700 hover:shadow-md cursor-pointer"}`),P(Ne,(e(M),h(()=>e(M).name))),P(je,`${e(M),h(()=>e(M).controlCount||0)??""} controls`),P(lr,` ${e(M),h(()=>e(M).path||"root")??""}`)}),b("click",ne,()=>!e(ge)&&ie(e(M))),b("keydown",ne,t=>t.key==="Enter"&&!e(ge)&&ie(e(M))),d(le,ne)}),r(ce);var Te=n(ce,2);{var be=le=>{var M=jt(),ge=a(M);r(M),b("click",ge,R),d(le,M)};z(Te,le=>{e(S)&&le(be)})}d(I,B)};z($,I=>{te(x()),h(()=>x().length>0)&&I(L)},!0)}d(p,u)};z(X,p=>{e(f)?p(oe):p(ke,!1)},!0)}d(ae,E)};z(W,ae=>{e(f)==="already-using-only-set"?ae(ve):ae(ye,!1)},!0)}d(U,Y)};z(j,U=>{U(ue,!1)})}r(q),d(fe,q),Xe(),V()}var qt=m('<div class="flex justify-center mb-8"><div class="bg-gradient-to-br from-gray-50 to-gray-100 dark:from-gray-800 dark:to-gray-900 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 inline-flex"><button data-testid="tab-existing">Select Existing Control Set</button> <button data-testid="tab-import">Import New from Spreadsheet</button></div></div>'),Ut=m('<div data-testid="pane-import"><!></div>'),Yt=m('<div data-testid="pane-existing"><!></div>'),Wt=m('<div data-testid="switch-overlay" class="absolute inset-0 bg-gray-900 bg-opacity-50 flex items-center justify-center rounded-lg"><div class="bg-white dark:bg-gray-700 rounded-lg p-6 text-center"><svg class="animate-spin h-8 w-8 text-blue-600 mx-auto mb-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> <p class="text-gray-900 dark:text-white">Switching control set...</p></div></div>'),Xt=m('<div class=" p-4"><div class="max-w-6xl mx-auto"><div class="text-center py-8"><h1 class="text-4xl font-extrabold text-gray-900 dark:text-white mb-4 flex items-center justify-center gap-3"><img src="/lula.png" class="h-12 w-12" alt="Lula"/> <span id="title">Lula</span></h1> <p id="description" class="text-lg text-gray-600 dark:text-gray-400"><!></p></div> <!> <div class="bg-gradient-to-br from-gray-50 to-gray-100 dark:from-gray-800 dark:to-gray-900 rounded-lg shadow-xl p-6 relative border border-gray-200 dark:border-gray-700"><!> <!></div></div></div>');function ta(fe,K){We(K,!1);let F=C("import"),se=C(""),V=C(!1),T=C(!1),N=C([]);Gr(()=>{wr.connect();const p=Cr.subscribe($=>{$.name&&$.name!=="Unknown Control Set"&&$.id!=="unknown"&&$.id!=="default"&&l(se,$.currentPath||"")}),u=async $=>{const L=$.detail;if(L&&L.controlSets){if(l(N,L.controlSets||[]),l(V,e(N).length>0),e(N).length===1){const I=e(N)[0];if(!(e(se)&&e(se).includes(I.path))&&!e(se)){console.log("Only one control set found and none loaded, auto-loading:",I.path),await x(I.path);return}}e(V)&&l(F,"existing")}};return window.addEventListener("control-sets-list",u),wr.scanControlSets().catch($=>{console.error("Error scanning control sets:",$)}),()=>{p(),window.removeEventListener("control-sets-list",u)}});async function x(p){console.log("Starting control set switch to:",p),l(T,!0);try{await wr.switchControlSet(p),console.log("WebSocket command sent, waiting for state update..."),await new Promise(u=>{let $=0;const L=50,I=setInterval(()=>{$++;const B=Qr(Cr);!B.isSwitchingControlSet&&B.currentPath&&B.currentPath.includes(p)?(clearInterval(I),console.log("Control set switch completed successfully"),u()):$>=L&&(clearInterval(I),console.error("Control set switch timed out"),alert("Control set switch timed out. Please try again."),u())},100)}),l(T,!1),tt("/")}catch(u){console.error("Error switching control set:",u),alert("Failed to switch control set: "+u.message),l(T,!1)}}async function f(p){const{path:u}=p.detail;await x(u)}async function S(p){const{path:u}=p.detail;await x(u)}function ie(p){const{tab:u}=p.detail;u&&l(F,u)}Ye();var R=Xt(),c=a(R),q=a(c),j=n(a(q),2),ue=a(j);{var U=p=>{var u=rr("You have an existing control set. You can continue using it or create a new one.");d(p,u)},Y=p=>{var u=Ie(),$=we(u);{var L=B=>{var ce=rr("Select an existing control set or import a new one from a spreadsheet.");d(B,ce)},I=B=>{var ce=rr("Let's get started by importing a control set from a spreadsheet.");d(B,ce)};z($,B=>{e(V)?B(L):B(I,!1)},!0)}d(p,u)};z(ue,p=>{e(se)?p(U):p(Y,!1)})}r(j),r(q);var W=n(q,2);{var ve=p=>{var u=qt(),$=a(u),L=a($),I=n(L,2);r($),r(u),H(()=>{de(L,1,`px-6 py-3 rounded-l-lg font-medium transition-colors ${e(F)==="existing"?"bg-blue-600 text-white":"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white"}`),de(I,1,`px-6 py-3 rounded-r-lg font-medium transition-colors ${e(F)==="import"?"bg-blue-600 text-white":"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white"}`)}),b("click",L,()=>l(F,"existing")),b("click",I,()=>l(F,"import")),d(p,u)};z(W,p=>{e(V)&&p(ve)})}var ye=n(W,2),ae=a(ye);{var E=p=>{var u=Ut(),$=a(u);At($,{$$events:{created:f}}),r(u),d(p,u)},X=p=>{var u=Yt(),$=a(u);Rt($,{get controlSets(){return e(N)},$$events:{selected:S,"tab-change":ie}}),r(u),d(p,u)};z(ae,p=>{e(F)==="import"?p(E):p(X,!1)})}var oe=n(ae,2);{var ke=p=>{var u=Wt();d(p,u)};z(oe,p=>{e(T)&&p(ke)})}r(ye),r(c),r(R),d(fe,R),Xe()}export{ta as component};
@@ -1 +1 @@
1
- {"version":"1757539724684"}
1
+ {"version":"1758069079489"}
@@ -1,12 +1,43 @@
1
1
  // cli/commands/crawl.ts
2
2
  import fs from "fs";
3
3
  import { Octokit } from "@octokit/rest";
4
- import { Command } from "commander";
4
+ import { Command, Option } from "commander";
5
5
  import { createHash } from "crypto";
6
+ var closingBody = `
7
+
8
+ ---
9
+
10
+ <sub>**Tip:** Customize your compliance reviews with <a href="https://github.com/defenseunicorns/lula.git" class="Link--inTextBlock" target="_blank" rel="noopener noreferrer">Lula</a>.</sub>`;
11
+ async function postFinding(params) {
12
+ const { octokit, postMode, owner, repo, pull_number, body } = params;
13
+ if (postMode === "comment") {
14
+ await octokit.issues.createComment({
15
+ owner,
16
+ repo,
17
+ issue_number: pull_number,
18
+ body
19
+ });
20
+ return;
21
+ }
22
+ await octokit.pulls.createReview({
23
+ owner,
24
+ repo,
25
+ pull_number,
26
+ body,
27
+ event: "REQUEST_CHANGES"
28
+ });
29
+ }
6
30
  function getPRContext() {
7
31
  const fallbackOwner = process.env.OWNER;
8
32
  const fallbackRepo = process.env.REPO;
9
33
  const fallbackNumber = process.env.PULL_NUMBER;
34
+ if (fallbackOwner && fallbackRepo && fallbackNumber) {
35
+ return {
36
+ owner: fallbackOwner,
37
+ repo: fallbackRepo,
38
+ pull_number: parseInt(fallbackNumber, 10)
39
+ };
40
+ }
10
41
  if (process.env.GITHUB_EVENT_PATH && process.env.GITHUB_REPOSITORY) {
11
42
  const event = JSON.parse(fs.readFileSync(process.env.GITHUB_EVENT_PATH, "utf8"));
12
43
  const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/");
@@ -14,14 +45,7 @@ function getPRContext() {
14
45
  if (!pull_number) throw new Error("PR number not found in GitHub event payload.");
15
46
  return { owner, repo, pull_number };
16
47
  }
17
- if (!fallbackOwner || !fallbackRepo || !fallbackNumber) {
18
- throw new Error("Set OWNER, REPO, and PULL_NUMBER in the environment for local use.");
19
- }
20
- return {
21
- owner: fallbackOwner,
22
- repo: fallbackRepo,
23
- pull_number: parseInt(fallbackNumber, 10)
24
- };
48
+ throw new Error("Set OWNER, REPO, and PULL_NUMBER in the environment for local use.");
25
49
  }
26
50
  async function fetchRawFileViaAPI({
27
51
  octokit,
@@ -83,14 +107,27 @@ function getChangedBlocks(oldText, newText) {
83
107
  return changed;
84
108
  }
85
109
  function crawlCommand() {
86
- return new Command().command("crawl").description("Detect compliance-related changes between @lulaStart and @lulaEnd in PR files").action(async () => {
110
+ return new Command().command("crawl").description("Detect compliance-related changes between @lulaStart and @lulaEnd in PR files").addOption(
111
+ new Option("--post-mode <mode>", "How to post findings").choices(["review", "comment"]).default("review")
112
+ ).action(async (opts) => {
87
113
  const { owner, repo, pull_number } = getPRContext();
114
+ console.log(`Analyzing PR #${pull_number} in ${owner}/${repo} for compliance changes...`);
88
115
  const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
89
116
  const pr = await octokit.pulls.get({ owner, repo, pull_number });
90
117
  const prBranch = pr.data.head.ref;
91
118
  const { data: files } = await octokit.pulls.listFiles({ owner, repo, pull_number });
119
+ let commentBody = `## Lula Compliance Overview
120
+
121
+ Please review the changes to ensure they meet compliance standards.
122
+
123
+ ### Reviewed Changes
124
+
125
+ Lula reviewed ${files.length} files changed that affect compliance.
126
+
127
+ `;
92
128
  for (const file of files) {
93
129
  if (file.status === "added") continue;
130
+ console.log(`Commenting regarding \`${file.filename}\`.`);
94
131
  try {
95
132
  const [oldText, newText] = await Promise.all([
96
133
  fetchRawFileViaAPI({ octokit, owner, repo, path: file.filename, ref: "main" }),
@@ -98,27 +135,43 @@ function crawlCommand() {
98
135
  ]);
99
136
  const changedBlocks = getChangedBlocks(oldText, newText);
100
137
  for (const block of changedBlocks) {
138
+ commentBody += `
139
+
140
+ ---
141
+ | File | Lines Changed |
142
+ | ---- | ------------- |
143
+ `;
101
144
  const newBlockText = newText.split("\n").slice(block.startLine, block.endLine).join("\n");
102
145
  const blockSha256 = createHash("sha256").update(newBlockText).digest("hex");
103
- const commentBody = `**Compliance Alert**:\`${file.filename}\` changed between lines ${block.startLine + 1}\u2013${block.endLine}.
104
- UUID \`${block.uuid}\` may be out of compliance.
105
- SHA-256 of block contents: \`${blockSha256}\`.
106
-
107
- Please review the changes to ensure they meet compliance standards.
146
+ commentBody += `| \`${file.filename}\` | \`${block.startLine + 1}\u2013${block.endLine}\` |
147
+ > **uuid**-\`${block.uuid}\`
148
+ **sha256** \`${blockSha256}\`
108
149
 
109
150
  `;
110
- console.log(`Commenting on ${file.filename}: ${commentBody}`);
111
- await octokit.issues.createComment({
112
- owner,
113
- repo,
114
- issue_number: pull_number,
115
- body: commentBody
116
- });
117
151
  }
118
152
  } catch (err) {
119
153
  console.error(`Error processing ${file.filename}: ${err}`);
120
154
  }
121
155
  }
156
+ if (files.length > 0) {
157
+ await postFinding({
158
+ octokit,
159
+ postMode: opts.postMode,
160
+ owner,
161
+ repo,
162
+ pull_number,
163
+ body: commentBody + closingBody
164
+ });
165
+ const header = `Posted (${opts.postMode})`;
166
+ const underline = "-".repeat(header.length);
167
+ console.log(`
168
+ ${header}
169
+ ${underline}
170
+
171
+ ${commentBody + closingBody}
172
+
173
+ `);
174
+ }
122
175
  });
123
176
  }
124
177
  export {
@@ -126,5 +179,6 @@ export {
126
179
  extractMapBlocks,
127
180
  fetchRawFileViaAPI,
128
181
  getChangedBlocks,
129
- getPRContext
182
+ getPRContext,
183
+ postFinding
130
184
  };
package/dist/index.html CHANGED
@@ -6,28 +6,28 @@
6
6
  <link rel="icon" href="/lula.png" />
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1" />
8
8
 
9
- <link rel="modulepreload" href="/_app/immutable/entry/start.DdyS338t.js">
10
- <link rel="modulepreload" href="/_app/immutable/chunks/fCDFfNtz.js">
11
- <link rel="modulepreload" href="/_app/immutable/chunks/BJF-sFqz.js">
12
- <link rel="modulepreload" href="/_app/immutable/entry/app.DKW3nM3v.js">
9
+ <link rel="modulepreload" href="/_app/immutable/entry/start.Cdw5p6kF.js">
10
+ <link rel="modulepreload" href="/_app/immutable/chunks/D3AAXov_.js">
11
+ <link rel="modulepreload" href="/_app/immutable/chunks/Cby0Z7eP.js">
12
+ <link rel="modulepreload" href="/_app/immutable/entry/app.pY_jLQAk.js">
13
13
  <link rel="modulepreload" href="/_app/immutable/chunks/DsnmJJEf.js">
14
- <link rel="modulepreload" href="/_app/immutable/chunks/DUz6FRLu.js">
15
- <link rel="modulepreload" href="/_app/immutable/chunks/BqNBD7oY.js">
16
- <link rel="modulepreload" href="/_app/immutable/chunks/BYKwBiub.js">
14
+ <link rel="modulepreload" href="/_app/immutable/chunks/DqsOU3kV.js">
15
+ <link rel="modulepreload" href="/_app/immutable/chunks/CoF2vljD.js">
16
+ <link rel="modulepreload" href="/_app/immutable/chunks/DnJ0bPgj.js">
17
17
  </head>
18
18
  <body data-sveltekit-preload-data="hover">
19
19
  <div style="display: contents">
20
20
  <script>
21
21
  {
22
- __sveltekit_80xdp1 = {
22
+ __sveltekit_rtxdy2 = {
23
23
  base: ""
24
24
  };
25
25
 
26
26
  const element = document.currentScript.parentElement;
27
27
 
28
28
  Promise.all([
29
- import("/_app/immutable/entry/start.DdyS338t.js"),
30
- import("/_app/immutable/entry/app.DKW3nM3v.js")
29
+ import("/_app/immutable/entry/start.Cdw5p6kF.js"),
30
+ import("/_app/immutable/entry/app.pY_jLQAk.js")
31
31
  ]).then(([kit, app]) => {
32
32
  kit.start(app, element);
33
33
  });
package/dist/index.js CHANGED
@@ -5204,12 +5204,43 @@ function getVersion() {
5204
5204
  // cli/commands/crawl.ts
5205
5205
  import fs4 from "fs";
5206
5206
  import { Octokit } from "@octokit/rest";
5207
- import { Command } from "commander";
5207
+ import { Command, Option } from "commander";
5208
5208
  import { createHash as createHash2 } from "crypto";
5209
+ var closingBody = `
5210
+
5211
+ ---
5212
+
5213
+ <sub>**Tip:** Customize your compliance reviews with <a href="https://github.com/defenseunicorns/lula.git" class="Link--inTextBlock" target="_blank" rel="noopener noreferrer">Lula</a>.</sub>`;
5214
+ async function postFinding(params) {
5215
+ const { octokit, postMode, owner, repo, pull_number, body } = params;
5216
+ if (postMode === "comment") {
5217
+ await octokit.issues.createComment({
5218
+ owner,
5219
+ repo,
5220
+ issue_number: pull_number,
5221
+ body
5222
+ });
5223
+ return;
5224
+ }
5225
+ await octokit.pulls.createReview({
5226
+ owner,
5227
+ repo,
5228
+ pull_number,
5229
+ body,
5230
+ event: "REQUEST_CHANGES"
5231
+ });
5232
+ }
5209
5233
  function getPRContext() {
5210
5234
  const fallbackOwner = process.env.OWNER;
5211
5235
  const fallbackRepo = process.env.REPO;
5212
5236
  const fallbackNumber = process.env.PULL_NUMBER;
5237
+ if (fallbackOwner && fallbackRepo && fallbackNumber) {
5238
+ return {
5239
+ owner: fallbackOwner,
5240
+ repo: fallbackRepo,
5241
+ pull_number: parseInt(fallbackNumber, 10)
5242
+ };
5243
+ }
5213
5244
  if (process.env.GITHUB_EVENT_PATH && process.env.GITHUB_REPOSITORY) {
5214
5245
  const event = JSON.parse(fs4.readFileSync(process.env.GITHUB_EVENT_PATH, "utf8"));
5215
5246
  const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/");
@@ -5217,14 +5248,7 @@ function getPRContext() {
5217
5248
  if (!pull_number) throw new Error("PR number not found in GitHub event payload.");
5218
5249
  return { owner, repo, pull_number };
5219
5250
  }
5220
- if (!fallbackOwner || !fallbackRepo || !fallbackNumber) {
5221
- throw new Error("Set OWNER, REPO, and PULL_NUMBER in the environment for local use.");
5222
- }
5223
- return {
5224
- owner: fallbackOwner,
5225
- repo: fallbackRepo,
5226
- pull_number: parseInt(fallbackNumber, 10)
5227
- };
5251
+ throw new Error("Set OWNER, REPO, and PULL_NUMBER in the environment for local use.");
5228
5252
  }
5229
5253
  async function fetchRawFileViaAPI({
5230
5254
  octokit,
@@ -5286,14 +5310,27 @@ function getChangedBlocks(oldText, newText) {
5286
5310
  return changed;
5287
5311
  }
5288
5312
  function crawlCommand() {
5289
- return new Command().command("crawl").description("Detect compliance-related changes between @lulaStart and @lulaEnd in PR files").action(async () => {
5313
+ return new Command().command("crawl").description("Detect compliance-related changes between @lulaStart and @lulaEnd in PR files").addOption(
5314
+ new Option("--post-mode <mode>", "How to post findings").choices(["review", "comment"]).default("review")
5315
+ ).action(async (opts) => {
5290
5316
  const { owner, repo, pull_number } = getPRContext();
5317
+ console.log(`Analyzing PR #${pull_number} in ${owner}/${repo} for compliance changes...`);
5291
5318
  const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
5292
5319
  const pr = await octokit.pulls.get({ owner, repo, pull_number });
5293
5320
  const prBranch = pr.data.head.ref;
5294
5321
  const { data: files } = await octokit.pulls.listFiles({ owner, repo, pull_number });
5322
+ let commentBody = `## Lula Compliance Overview
5323
+
5324
+ Please review the changes to ensure they meet compliance standards.
5325
+
5326
+ ### Reviewed Changes
5327
+
5328
+ Lula reviewed ${files.length} files changed that affect compliance.
5329
+
5330
+ `;
5295
5331
  for (const file of files) {
5296
5332
  if (file.status === "added") continue;
5333
+ console.log(`Commenting regarding \`${file.filename}\`.`);
5297
5334
  try {
5298
5335
  const [oldText, newText] = await Promise.all([
5299
5336
  fetchRawFileViaAPI({ octokit, owner, repo, path: file.filename, ref: "main" }),
@@ -5301,27 +5338,43 @@ function crawlCommand() {
5301
5338
  ]);
5302
5339
  const changedBlocks = getChangedBlocks(oldText, newText);
5303
5340
  for (const block of changedBlocks) {
5341
+ commentBody += `
5342
+
5343
+ ---
5344
+ | File | Lines Changed |
5345
+ | ---- | ------------- |
5346
+ `;
5304
5347
  const newBlockText = newText.split("\n").slice(block.startLine, block.endLine).join("\n");
5305
5348
  const blockSha256 = createHash2("sha256").update(newBlockText).digest("hex");
5306
- const commentBody = `**Compliance Alert**:\`${file.filename}\` changed between lines ${block.startLine + 1}\u2013${block.endLine}.
5307
- UUID \`${block.uuid}\` may be out of compliance.
5308
- SHA-256 of block contents: \`${blockSha256}\`.
5309
-
5310
- Please review the changes to ensure they meet compliance standards.
5349
+ commentBody += `| \`${file.filename}\` | \`${block.startLine + 1}\u2013${block.endLine}\` |
5350
+ > **uuid**-\`${block.uuid}\`
5351
+ **sha256** \`${blockSha256}\`
5311
5352
 
5312
5353
  `;
5313
- console.log(`Commenting on ${file.filename}: ${commentBody}`);
5314
- await octokit.issues.createComment({
5315
- owner,
5316
- repo,
5317
- issue_number: pull_number,
5318
- body: commentBody
5319
- });
5320
5354
  }
5321
5355
  } catch (err) {
5322
5356
  console.error(`Error processing ${file.filename}: ${err}`);
5323
5357
  }
5324
5358
  }
5359
+ if (files.length > 0) {
5360
+ await postFinding({
5361
+ octokit,
5362
+ postMode: opts.postMode,
5363
+ owner,
5364
+ repo,
5365
+ pull_number,
5366
+ body: commentBody + closingBody
5367
+ });
5368
+ const header = `Posted (${opts.postMode})`;
5369
+ const underline = "-".repeat(header.length);
5370
+ console.log(`
5371
+ ${header}
5372
+ ${underline}
5373
+
5374
+ ${commentBody + closingBody}
5375
+
5376
+ `);
5377
+ }
5325
5378
  });
5326
5379
  }
5327
5380