lula2 0.7.5-nightly.1 → 0.8.4

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 (35) hide show
  1. package/README.md +2 -2
  2. package/dist/_app/immutable/chunks/BHkKokgA.js +1 -0
  3. package/dist/_app/immutable/chunks/{B3K8aJnm.js → BNu54jRO.js} +1 -1
  4. package/dist/_app/immutable/chunks/{DveOLWfB.js → BzIr_GrC.js} +42 -42
  5. package/dist/_app/immutable/chunks/CC6oS456.js +1 -0
  6. package/dist/_app/immutable/chunks/DHuA7MQr.js +1 -0
  7. package/dist/_app/immutable/chunks/{BOr7AGz1.js → DJTXGU6C.js} +1 -1
  8. package/dist/_app/immutable/chunks/{C04NlUEE.js → DSxRA67V.js} +1 -1
  9. package/dist/_app/immutable/chunks/{BTEcqCut.js → DpCtGpHu.js} +1 -1
  10. package/dist/_app/immutable/chunks/{CYCiyXhX.js → DznG4VMX.js} +2 -2
  11. package/dist/_app/immutable/chunks/{Dqqytqkj.js → Ew6_cz_0.js} +1 -1
  12. package/dist/_app/immutable/chunks/{2BRL7VKY.js → kRA7ZCNG.js} +1 -1
  13. package/dist/_app/immutable/entry/{app.DQYVFQmH.js → app.CpHUD0XU.js} +2 -2
  14. package/dist/_app/immutable/entry/start.BavDkynd.js +1 -0
  15. package/dist/_app/immutable/nodes/{0.VqJIWUds.js → 0.D5TULpJI.js} +1 -1
  16. package/dist/_app/immutable/nodes/1.BBgWG9H0.js +1 -0
  17. package/dist/_app/immutable/nodes/{2.CwWiKEBj.js → 2.c2WlghKX.js} +1 -1
  18. package/dist/_app/immutable/nodes/{3.UIV2UOH1.js → 3.hNTFAKFs.js} +1 -1
  19. package/dist/_app/immutable/nodes/{4.BdgTjqjd.js → 4.C7MOPYAO.js} +1 -1
  20. package/dist/_app/version.json +1 -1
  21. package/dist/cli/commands/ui.js +98 -8
  22. package/dist/cli/server/index.js +98 -8
  23. package/dist/cli/server/server.js +98 -8
  24. package/dist/cli/server/serverState.js +40 -6
  25. package/dist/cli/server/websocketServer.js +1146 -1056
  26. package/dist/index.html +11 -11
  27. package/dist/index.js +98 -8
  28. package/package.json +128 -127
  29. package/src/lib/components/controls/tabs/MappingsTab.svelte +16 -5
  30. package/src/lib/websocket.ts +7 -0
  31. package/dist/_app/immutable/chunks/CvMmkcEK.js +0 -1
  32. package/dist/_app/immutable/chunks/DlvidjXv.js +0 -1
  33. package/dist/_app/immutable/chunks/OZt-i3RT.js +0 -1
  34. package/dist/_app/immutable/entry/start.CRaGL1oc.js +0 -1
  35. package/dist/_app/immutable/nodes/1.DOuy_I_c.js +0 -1
@@ -1,2 +1,2 @@
1
- import{g as Ie,b as H,a as l,s as L,c as xe,f as C,e as dt}from"../chunks/C04NlUEE.js";import{p as F,af as A,b as v,U as S,y as p,g as t,ag as se,c as r,n as P,r as a,a as J,t as I,f as W,ah as ct,d as be,_ as Ze,u as Fe,be as vt,s as k,e as ut,ae as Te,o as ft,bf as gt}from"../chunks/DlvidjXv.js";import{l as E,p as M,i as x,a as Ve,s as Je}from"../chunks/Dqqytqkj.js";import{a as We,c as ht,I as Ge,T as bt,p as pt,b as Ue,D as mt}from"../chunks/BOr7AGz1.js";import{g as xt}from"../chunks/OZt-i3RT.js";import{i as te}from"../chunks/2BRL7VKY.js";import{a as ie,f as Ke,e as _t,d as yt,i as wt,w as He}from"../chunks/CYCiyXhX.js";import{c as kt}from"../chunks/CvMmkcEK.js";Ie(["change"]);var $t=H("<title> </title>"),Ct=H('<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 zt($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=Ct();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=$t(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(),a(n),l($,n),J()}var Mt=C('<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>'),At=C('<div class="text-sm text-gray-500 dark:text-gray-400">Loading...</div>');function St($,s){F(s,!1);const e=()=>Ve(Ke,"$appState",h),[h,i]=Je();te();var u=xe(),f=W(u);{var o=g=>{var b=Mt(),c=r(b);zt(c,{size:16}),P(),a(b),l(g,b)},n=g=>{var b=At();l(g,b)};x(f,g=>{e().isConnected?g(o):g(n,!1)})}l($,u),J(),i()}var Et=H("<title> </title>"),Ht=H('<svg><!><path d="M17.4141 16L24 9.4141 22.5859 8 16 14.5859 9.4143 8 8 9.4141 14.5859 16 8 22.5859 9.4143 24 16 17.4141 22.5859 24 24 22.5859 17.4141 16z"></path></svg>');function It($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=Ht();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=Et(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(),a(n),l($,n),J()}var Lt=C("<option> </option>"),Pt=C(`<div class="fixed inset-0 bg-opacity-10 backdrop-blur-sm overflow-y-auto h-full w-full z-40 flex items-center justify-center p-4" role="dialog" aria-modal="true" tabindex="-1"><div class="bg-white dark:bg-gray-800 rounded-lg shadow-xl p-6 w-full max-w-md mx-auto relative z-50" role="document"><div class="flex items-center justify-between mb-4"><h2 class="text-xl font-semibold text-gray-900 dark:text-white"> </h2> <button class="text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300" aria-label="Close dialog"><!></button></div> <div class="mb-6"><p class="text-sm text-gray-600 dark:text-gray-400 mb-4">Choose which column should contain the mappings data:</p> <div class="space-y-2"><label for="column-select" class="block text-sm font-medium text-gray-700 dark:text-gray-300">Mappings Column</label> <select id="column-select" class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"></select></div> <div class="mt-3 p-3 bg-blue-50 dark:bg-blue-900/20 rounded-md"><p class="text-xs text-blue-600 dark:text-blue-400"><strong>Note:</strong> Mappings data will be formatted as "status: description..." in the
1
+ import{g as Ie,b as H,a as l,s as L,c as xe,f as C,e as dt}from"../chunks/DSxRA67V.js";import{p as F,af as A,b as v,U as S,y as p,g as t,ag as se,c as r,n as P,r as a,a as J,t as I,f as W,ah as ct,d as be,_ as Ze,u as Fe,be as vt,s as k,e as ut,ae as Te,o as ft,bf as gt}from"../chunks/DHuA7MQr.js";import{l as E,p as M,i as x,a as Ve,s as Je}from"../chunks/Ew6_cz_0.js";import{a as We,c as ht,I as Ge,T as bt,p as pt,b as Ue,D as mt}from"../chunks/DJTXGU6C.js";import{g as xt}from"../chunks/BHkKokgA.js";import{i as te}from"../chunks/kRA7ZCNG.js";import{a as ie,f as Ke,e as _t,d as yt,i as wt,w as He}from"../chunks/DznG4VMX.js";import{c as kt}from"../chunks/CC6oS456.js";Ie(["change"]);var $t=H("<title> </title>"),Ct=H('<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 zt($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=Ct();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=$t(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(),a(n),l($,n),J()}var Mt=C('<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>'),At=C('<div class="text-sm text-gray-500 dark:text-gray-400">Loading...</div>');function St($,s){F(s,!1);const e=()=>Ve(Ke,"$appState",h),[h,i]=Je();te();var u=xe(),f=W(u);{var o=g=>{var b=Mt(),c=r(b);zt(c,{size:16}),P(),a(b),l(g,b)},n=g=>{var b=At();l(g,b)};x(f,g=>{e().isConnected?g(o):g(n,!1)})}l($,u),J(),i()}var Et=H("<title> </title>"),Ht=H('<svg><!><path d="M17.4141 16L24 9.4141 22.5859 8 16 14.5859 9.4143 8 8 9.4141 14.5859 16 8 22.5859 9.4143 24 16 17.4141 22.5859 24 24 22.5859 17.4141 16z"></path></svg>');function It($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=Ht();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=Et(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(),a(n),l($,n),J()}var Lt=C("<option> </option>"),Pt=C(`<div class="fixed inset-0 bg-opacity-10 backdrop-blur-sm overflow-y-auto h-full w-full z-40 flex items-center justify-center p-4" role="dialog" aria-modal="true" tabindex="-1"><div class="bg-white dark:bg-gray-800 rounded-lg shadow-xl p-6 w-full max-w-md mx-auto relative z-50" role="document"><div class="flex items-center justify-between mb-4"><h2 class="text-xl font-semibold text-gray-900 dark:text-white"> </h2> <button class="text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300" aria-label="Close dialog"><!></button></div> <div class="mb-6"><p class="text-sm text-gray-600 dark:text-gray-400 mb-4">Choose which column should contain the mappings data:</p> <div class="space-y-2"><label for="column-select" class="block text-sm font-medium text-gray-700 dark:text-gray-300">Mappings Column</label> <select id="column-select" class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"></select></div> <div class="mt-3 p-3 bg-blue-50 dark:bg-blue-900/20 rounded-md"><p class="text-xs text-blue-600 dark:text-blue-400"><strong>Note:</strong> Mappings data will be formatted as "status: description..." in the
2
2
  selected column.</p></div></div> <div class="flex justify-end space-x-3"><button class="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">Cancel</button> <button class="px-4 py-2 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 rounded-lg transition-colors"> </button></div></div></div>`);function Dt($,s){F(s,!0);let e=M(s,"isOpen",15),h=M(s,"columnHeaders",19,()=>[]),i=M(s,"defaultColumn",3,"Mappings");const u=ct();let f=be(Ze(i()));Fe(()=>{e()&&v(f,i())});function o(R){return e()&&setTimeout(()=>R.focus(),0),{update(){e()&&setTimeout(()=>R.focus(),0)}}}function n(){u("export",{format:s.format,mappingsColumn:t(f)}),e(!1)}function g(){u("cancel"),e(!1)}function b(R){e()&&(R.key==="Escape"?g():R.key==="Enter"&&n())}function c(R){R.target===R.currentTarget&&g()}var d=xe();dt("keydown",vt,b);var y=W(d);{var ke=R=>{var de=Pt();de.__click=c,de.__keydown=N=>N.key==="Escape"&&g();var z=r(de);z.__click=N=>N.stopPropagation();var G=r(z),ce=r(G),_=r(ce);a(ce);var w=k(ce,2);w.__click=g;var m=r(w);It(m,{class:"w-6 h-6"}),a(w),a(G);var D=k(G,2),U=k(r(D),2),K=k(r(U),2);_t(K,21,h,wt,(N,Y)=>{var O=Lt(),Ae=r(O,!0);a(O);var $e={};I(()=>{L(Ae,t(Y).label),$e!==($e=t(Y).value)&&(O.value=(O.__value=t(Y).value)??"")}),l(N,O)}),a(K),We(K,N=>o?.(N)),ut(()=>yt(K,()=>t(f),N=>v(f,N))),a(U),P(2),a(D);var B=k(D,2),Q=r(B);Q.__click=g;var oe=k(Q,2);oe.__click=n;var ve=r(oe);a(oe),a(B),a(z),a(de),I((N,Y)=>{L(_,`Export as ${N??""}`),L(ve,`Export ${Y??""}`)},[()=>s.format.toUpperCase(),()=>s.format.toUpperCase()]),l(R,de)};x(y,R=>{e()&&R(ke)})}l($,d),J()}Ie(["click","keydown"]);var Rt=H("<title> </title>"),Bt=H('<svg><!><path stroke-width="0" d="m20,6c0,1.8587,1.2795,3.4109,3,3.858v4.142c0,1.6543-1.3457,3-3,3h-8c-1.1299,0-2.1617.391-3,1.0256v-8.1676c1.7203-.4471,3-1.9993,3-3.858,0-2.2061-1.7944-4-4-4s-4,1.7939-4,4c0,1.8587,1.2797,3.4108,3,3.858v12.142s0,.142,0,.142c-1.7203.4473-3,1.9997-3,3.858,0,2.2056,1.7944,4,4,4s4-1.7944,4-4c0-1.8583-1.2797-3.4107-3-3.858v-.142c0-1.6543,1.3457-3,3-3h8c2.7568,0,5-2.2432,5-5v-4.142c1.7205-.4471,3-1.9993,3-3.858,0-2.2061-1.7939-4-4-4s-4,1.7939-4,4Zm-14,0c0-1.1025.897-2,2-2s2,.8975,2,2c0,1.1025-.897,2-2,2s-2-.8975-2-2Zm4,20c0,1.103-.897,2-2,2s-2-.897-2-2,.897-2,2-2,2,.897,2,2ZM26,6c0,1.1025-.8975,2-2,2s-2-.8975-2-2c0-1.1025.8975-2,2-2s2,.8975,2,2Z"></path></svg>');function Ye($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=Bt();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=Rt(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(),a(n),l($,n),J()}var jt=H("<title> </title>"),Nt=H('<svg><!><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><path d="M17 26.17L17 14 15 14 15 26.17 12.41 23.59 11 25 16 30 21 25 19.59 23.59 17 26.17z"></path></svg>');function je($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=Nt();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=jt(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(2),a(n),l($,n),J()}var Vt=H("<title> </title>"),Tt=H('<svg><!><path d="M12 10H6.78A11 11 0 0127 16h2A13 13 0 006 7.68V4H4v8h8zM20 22h5.22A11 11 0 015 16H3a13 13 0 0023 8.32V28h2V20H20z"></path></svg>');function Gt($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=Tt();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=Vt(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(),a(n),l($,n),J()}var Ut=H("<title> </title>"),Yt=H('<svg><!><path d="M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm0,26A12,12,0,1,1,28,16,12,12,0,0,1,16,28Z"></path><path d="M15 8H17V19H15zM16 22a1.5 1.5 0 101.5 1.5A1.5 1.5 0 0016 22z"></path></svg>');function Ne($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=Yt();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=Ut(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(2),a(n),l($,n),J()}var Ot=H("<title> </title>"),Zt=H('<svg><!><circle cx="16" cy="8" r="2"></circle><circle cx="16" cy="16" r="2"></circle><circle cx="16" cy="24" r="2"></circle></svg>');function Ft($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=Zt();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=Ot(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(3),a(n),l($,n),J()}var Jt=C('<div class="flex items-center justify-center py-8"><div class="w-6 h-6 border-2 border-gray-300 dark:border-gray-600 border-t-blue-600 rounded-full animate-spin"></div> <span class="ml-2 text-sm text-gray-600 dark:text-gray-400">Loading git status...</span></div>'),Wt=C('<div class="flex items-center gap-2 text-gray-600 dark:text-gray-400"><!> <span>Not a Git repository</span></div>'),Kt=C('<div class="flex items-center gap-2 text-yellow-600 dark:text-yellow-400"><!> <span class="text-xs"> </span></div>'),qt=C('<div class="flex items-center gap-2 text-blue-600 dark:text-blue-400"><!> <span class="text-xs"> </span></div>'),Qt=C('<div class="flex items-center gap-2 text-green-600 dark:text-green-400"><span class="text-xs">Up to date</span></div>'),Xt=C('<div class="mt-1 text-gray-500 dark:text-gray-500 truncate max-w-60"> </div>'),ea=C('<div class="pt-2 border-t border-gray-200 dark:border-gray-700"><div class="flex items-start gap-2 text-xs text-gray-600 dark:text-gray-400"><!> <div><div> </div> <!></div></div></div>'),ta=C('<div class="pl-6 space-y-1"><!> <!> <!></div> <!>',1),aa=C('<div class="w-4 h-4 border-2 border-gray-600 border-t-transparent rounded-full animate-spin"></div>'),ra=C("<!> Refresh Status",1),sa=C('<div class="w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin"></div>'),ia=C("<!> Pull Changes",1),oa=C('<button class="w-full flex items-center justify-center gap-2 px-3 py-2 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed rounded-md transition-colors"><!></button>'),na=C('<div class="pt-2 border-t border-gray-200 dark:border-gray-700"><div class="flex items-start gap-2 p-2 bg-red-50 dark:bg-red-900/20 rounded text-xs text-red-600 dark:text-red-400"><!> <span> </span></div></div>'),la=C('<div class="space-y-2"><div class="flex items-center gap-2"><!> <span class="text-sm font-medium text-gray-900 dark:text-white"> </span></div> <!></div> <div class="pt-2 border-t border-gray-200 dark:border-gray-700 space-y-2"><button class="w-full flex items-center justify-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 disabled:bg-gray-300 disabled:cursor-not-allowed rounded-md transition-colors"><!></button> <!></div> <!>',1),da=C('<div class="flex items-center justify-center py-8 text-sm text-gray-500 dark:text-gray-400">Click to load git status</div>'),ca=C('<div class="absolute right-0 top-full mt-2 w-80 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg z-100"><div class="p-4 space-y-4"><div class="flex items-center gap-2 pb-2 border-b border-gray-200 dark:border-gray-700"><!> <span class="text-sm font-medium text-gray-900 dark:text-white">Git Status</span></div> <!></div></div>'),va=C('<div class="relative"><button class="p-1 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" aria-label="Git options"><!></button> <!></div>');function ua($,s){F(s,!0);let e=be(null),h=be(!1),i=be(null),u=be(!1);Fe(()=>{t(u)&&f()});async function f(){try{v(h,!0),v(i,null);const z=await fetch("/api/git-status");if(z.ok)v(e,await z.json(),!0);else throw new Error("Failed to fetch git status")}catch(z){v(i,z instanceof Error?z.message:"Unknown error",!0),console.error("Error fetching git status:",z)}finally{v(h,!1)}}async function o(){if(t(e)?.canPull)try{v(h,!0),v(i,null);const G=await(await fetch("/api/git-pull",{method:"POST"})).json();G.success?await f():v(i,G.message,!0)}catch(z){v(i,z instanceof Error?z.message:"Failed to pull changes",!0),console.error("Error pulling changes:",z)}finally{v(h,!1)}}async function n(){await f()}function g(z){if(!z)return"Unknown";const G=new Date(z),_=new Date().getTime()-G.getTime(),w=Math.floor(_/(1e3*60*60)),m=Math.floor(w/24);if(m>0)return`${m} day${m>1?"s":""} ago`;if(w>0)return`${w} hour${w>1?"s":""} ago`;{const D=Math.floor(_/6e4);return D>0?`${D} min ago`:"Just now"}}function b(){return t(e)?.isGitRepository?t(e)?.branchInfo?.isBehind?Ne:t(e)?.branchInfo?.isAhead?je:Ye:Ge}function c(){return t(e)?.isGitRepository?t(e)?.branchInfo?.isBehind?"text-yellow-500":t(e)?.branchInfo?.isAhead?"text-blue-500":"text-green-500":"text-gray-500"}var d=va(),y=r(d);y.__click=()=>v(u,!t(u));var ke=r(y);Ft(ke,{class:"w-5 h-5"}),a(y);var R=k(y,2);{var de=z=>{var G=ca(),ce=r(G),_=r(ce),w=r(_);{var m=B=>{const Q=Te(b);var oe=xe(),ve=W(oe);{let N=Te(c);kt(ve,()=>t(Q),(Y,O)=>{O(Y,{get class(){return`w-4 h-4 ${t(N)??""}`}})})}l(B,oe)};x(w,B=>{B(m)})}P(2),a(_);var D=k(_,2);{var U=B=>{var Q=Jt();l(B,Q)},K=B=>{var Q=xe(),oe=W(Q);{var ve=Y=>{var O=xe(),Ae=W(O);{var $e=V=>{var X=Wt(),ue=r(X);Ge(ue,{class:"w-4 h-4"}),P(2),a(X),l(V,X)},Le=V=>{var X=la(),ue=W(X),fe=r(ue),ge=r(fe);Ye(ge,{class:"w-4 h-4 text-gray-500"});var ee=k(ge,2),ne=r(ee,!0);a(ee),a(fe);var ae=k(fe,2);{var _e=j=>{var T=ta(),le=W(T),we=r(le);{var Ce=Z=>{var q=Kt(),pe=r(q);Ne(pe,{class:"w-3 h-3"});var me=k(pe,2),Me=r(me);a(me),a(q),I(()=>L(Me,`${t(e).branchInfo.behindCount??""} commit${t(e).branchInfo.behindCount!==1?"s":""} behind`)),l(Z,q)};x(we,Z=>{t(e)?.branchInfo?.isBehind&&Z(Ce)})}var re=k(we,2);{var ze=Z=>{var q=qt(),pe=r(q);je(pe,{class:"w-3 h-3"});var me=k(pe,2),Me=r(me);a(me),a(q),I(()=>L(Me,`${t(e).branchInfo.aheadCount??""} commit${t(e).branchInfo.aheadCount!==1?"s":""} ahead`)),l(Z,q)};x(re,Z=>{t(e)?.branchInfo?.isAhead&&Z(ze)})}var De=k(re,2);{var at=Z=>{var q=Qt();l(Z,q)};x(De,Z=>{!t(e)?.branchInfo?.isBehind&&!t(e)?.branchInfo?.isAhead&&Z(at)})}a(le);var rt=k(le,2);{var st=Z=>{var q=ea(),pe=r(q),me=r(pe);bt(me,{class:"w-3 h-3 mt-0.5 flex-shrink-0"});var Me=k(me,2),Re=r(Me),it=r(Re);a(Re);var ot=k(Re,2);{var nt=Se=>{var Be=Xt(),lt=r(Be,!0);a(Be),I(()=>L(lt,t(e).branchInfo.lastCommitMessage)),l(Se,Be)};x(ot,Se=>{t(e)?.branchInfo?.lastCommitMessage&&Se(nt)})}a(Me),a(pe),a(q),I(Se=>L(it,`Last commit (local): ${Se??""}`),[()=>g(t(e).branchInfo.lastCommitDate)]),l(Z,q)};x(rt,Z=>{t(e)?.branchInfo?.lastCommitDate&&Z(st)})}l(j,T)};x(ae,j=>{t(e)?.branchInfo&&j(_e)})}a(ue);var ye=k(ue,2),he=r(ye);he.__click=n;var Ee=r(he);{var Pe=j=>{var T=aa();l(j,T)},qe=j=>{var T=ra(),le=W(T);Gt(le,{class:"w-4 h-4"}),P(),l(j,T)};x(Ee,j=>{t(h)?j(Pe):j(qe,!1)})}a(he);var Qe=k(he,2);{var Xe=j=>{var T=oa();T.__click=o;var le=r(T);{var we=re=>{var ze=sa();l(re,ze)},Ce=re=>{var ze=ia(),De=W(ze);je(De,{class:"w-4 h-4"}),P(),l(re,ze)};x(le,re=>{t(h)?re(we):re(Ce,!1)})}a(T),I(()=>T.disabled=t(h)),l(j,T)};x(Qe,j=>{t(e)?.canPull&&j(Xe)})}a(ye);var et=k(ye,2);{var tt=j=>{var T=na(),le=r(T),we=r(le);Ne(we,{class:"w-3 h-3 mt-0.5 flex-shrink-0"});var Ce=k(we,2),re=r(Ce,!0);a(Ce),a(le),a(T),I(()=>L(re,t(i))),l(j,T)};x(et,j=>{t(i)&&j(tt)})}I(()=>{L(ne,t(e)?.currentBranch||"Unknown branch"),he.disabled=t(h)}),l(V,X)};x(Ae,V=>{t(e)?.isGitRepository?V(Le,!1):V($e)})}l(Y,O)},N=Y=>{var O=da();l(Y,O)};x(oe,Y=>{t(e)?Y(ve):Y(N,!1)},!0)}l(B,Q)};x(D,B=>{t(h)&&!t(e)?B(U):B(K,!1)})}a(ce),a(G),l(z,G)};x(R,z=>{t(u)&&z(de)})}a(d),We(d,(z,G)=>ht?.(z,G),()=>()=>v(u,!1)),l($,d),J()}Ie(["click"]);var fa=H("<title> </title>"),ga=H('<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 ha($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=ga();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=fa(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(2),a(n),l($,n),J()}var ba=H("<title> </title>"),pa=H('<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 ma($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=pa();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=ba(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(2),a(n),l($,n),J()}var xa=H("<title> </title>"),_a=H('<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 Oe($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=_a();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=xa(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(),a(n),l($,n),J()}var ya=H("<title> </title>"),wa=H('<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 ka($,s){const e=E(s,["children","$$slots","$$events","$$legacy"]),h=E(e,["size","title"]);F(s,!1);const i=S(),u=S();let f=M(s,"size",8,16),o=M(s,"title",8,void 0);A(()=>(p(e),p(o())),()=>{v(i,e["aria-label"]||e["aria-labelledby"]||o())}),A(()=>(t(i),p(e)),()=>{v(u,{"aria-hidden":t(i)?void 0:!0,role:t(i)?"img":void 0,focusable:Number(e.tabindex)===0?!0:void 0})}),se(),te();var n=wa();ie(n,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:f(),height:f(),...t(u),...h}));var g=r(n);{var b=c=>{var d=ya(),y=r(d,!0);a(d),I(()=>L(y,o())),l(c,d)};x(g,c=>{o()&&c(b)})}P(),a(n),l($,n),J()}var $a=C('<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>'),Ca=C('<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>'),za=C('<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>'),Ma=C('<header class="bg-white dark:bg-gray-900 shadow-sm border-b border-gray-200 dark:border-gray-700 flex-shrink-0 relative z-40"><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),Aa=C('<div class="h-screen flex flex-col"><!></div> <!>',1);function Ba($,s){F(s,!0);const e=()=>Ve(Ke,"$appState",i),h=()=>Ve(pt,"$page",i),[i,u]=Je();let f=!1,o=be(!1),n=be("csv"),g=be(Ze([])),b=be("Mappings");async function c(){try{if(!e().currentPath){console.error("No current control set path available"),v(g,[{value:"Mappings",label:"Mappings (Default)"}],!0),v(b,"Mappings");return}const w=await fetch("/api/export-column-headers");if(w.ok){const m=await w.json();v(g,m.columnHeaders||[],!0),v(b,m.defaultColumn||"Mappings",!0)}else console.error("Failed to load column headers"),v(g,[{value:"Mappings",label:"Mappings (Default)"}],!0),v(b,"Mappings")}catch(_){console.error("Error loading column headers:",_),v(g,[{value:"Mappings",label:"Mappings (Default)"}],!0),v(b,"Mappings")}}async function d(_){if(_==="json")try{const w=`/api/export-controls?format=${_}`,m=document.createElement("a");m.href=w,m.download="",document.body.appendChild(m),m.click(),document.body.removeChild(m)}catch(w){console.error("Export failed:",w)}else v(n,_,!0),await c(),v(o,!0)}async function y(_){try{const{format:w,mappingsColumn:m}=_.detail,D=`/api/export-controls?format=${w}&mappingsColumn=${encodeURIComponent(m)}`,U=document.createElement("a");U.href=D,U.download="",document.body.appendChild(U),U.click(),document.body.removeChild(U)}catch(w){console.error("Export failed:",w)}}ft(()=>{He.connect();let _=null;const w=async()=>{if(f||h().url.pathname==="/setup"||e().isSwitchingControlSet)return;const m=e();if(m.isConnected){if(f=!0,(!m.name||m.name==="Unknown Control Set"||m.id==="unknown"||m.id==="default")&&(!m.controls||m.controls.length===0)){await He.scanControlSets();const D=await new Promise(U=>{const K=B=>{window.removeEventListener("control-sets-list",K),U(B.detail)};window.addEventListener("control-sets-list",K),setTimeout(()=>{window.removeEventListener("control-sets-list",K),U(null)},2e3)});D&&Array.isArray(D)&&D.length===1?(console.log("Auto-loading single control set:",D[0].path),await He.switchControlSet(D[0].path)):xt("/setup")}}else _=window.setTimeout(w,500)};return _=window.setTimeout(w,100),()=>{_&&clearTimeout(_)}}),gt(()=>{He.disconnect()});var ke=Aa(),R=W(ke),de=r(R);{var z=_=>{var w=Ma(),m=W(w),D=r(m),U=r(D),K=k(r(U),2),B=r(K);St(B,{});var Q=k(B,2);{var oe=V=>{mt(V,{buttonLabel:"Export",get buttonIcon(){return Oe},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:ue=>{var fe=$a(),ge=r(fe);ge.__click=()=>d("csv");var ee=r(ge),ne=r(ee);ma(ne,{class:"w-4 h-4"}),P(2),a(ee),a(ge);var ae=k(ge,2);ae.__click=()=>d("excel");var _e=r(ae),ye=r(_e);Oe(ye,{class:"w-4 h-4"}),P(2),a(_e),a(ae);var he=k(ae,2);he.__click=()=>d("json");var Ee=r(he),Pe=r(Ee);ha(Pe,{class:"w-4 h-4"}),P(2),a(Ee),a(he),a(fe),l(ue,fe)},$$slots:{default:!0}})};x(Q,V=>{e().isConnected&&e().controls&&e().controls.length>0&&V(oe)})}var ve=k(Q,2),N=r(ve);ka(N,{class:"w-5 h-5"}),a(ve);var Y=k(ve,2);ua(Y,{}),a(K),a(U),a(D),a(m);var O=k(m,2),Ae=r(O);{var $e=V=>{var X=Ca();l(V,X)},Le=V=>{var X=xe(),ue=W(X);{var fe=ee=>{var ne=za(),ae=r(ne),_e=k(r(ae),2),ye=r(_e,!0);a(_e),a(ae),a(ne),I(()=>L(ye,e().isConnected?e().fieldSchema?"Loading controls...":"Loading schema...":"Connecting...")),l(ee,ne)},ge=ee=>{var ne=xe(),ae=W(ne);Ue(ae,()=>s.children),l(ee,ne)};x(ue,ee=>{!e().isConnected||!e().controls||e().controls.length===0||!e().fieldSchema?ee(fe):ee(ge,!1)},!0)}l(V,X)};x(Ae,V=>{e().isSwitchingControlSet?V($e):V(Le,!1)})}a(O),l(_,w)},G=_=>{var w=xe(),m=W(w);Ue(m,()=>s.children),l(_,w)};x(de,_=>{h().url.pathname!=="/setup"?_(z):_(G,!1)})}a(R);var ce=k(R,2);Dt(ce,{get format(){return t(n)},get columnHeaders(){return t(g)},get defaultColumn(){return t(b)},get isOpen(){return t(o)},set isOpen(_){v(o,_,!0)},$$events:{export:y,cancel:()=>{}}}),l($,ke),J(),u()}Ie(["click"]);export{Ba as component};
@@ -0,0 +1 @@
1
+ import{f as h,a as c,s}from"../chunks/DSxRA67V.js";import{i as l}from"../chunks/kRA7ZCNG.js";import{p as v,f as u,t as _,a as g,c as e,r as o,s as x}from"../chunks/DHuA7MQr.js";import{p}from"../chunks/DpCtGpHu.js";var d=h("<h1> </h1> <p> </p>",1);function q(m,f){v(f,!1),l();var a=d(),r=u(a),i=e(r,!0);o(r);var t=x(r,2),n=e(t,!0);o(t),_(()=>{s(i,p.status),s(n,p.error?.message)}),c(m,a),g()}export{q as component};
@@ -1 +1 @@
1
- import{f,a as n}from"../chunks/C04NlUEE.js";import"../chunks/2BRL7VKY.js";import{f as y,c as t,r,s as w,n as C}from"../chunks/DlvidjXv.js";import{i as k,s as $,a as D}from"../chunks/Dqqytqkj.js";import{C as S,a as j,D as L}from"../chunks/DveOLWfB.js";import{s as N}from"../chunks/BOr7AGz1.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{f,a as n}from"../chunks/DSxRA67V.js";import"../chunks/kRA7ZCNG.js";import{f as y,c as t,r,s as w,n as C}from"../chunks/DHuA7MQr.js";import{i as k,s as $,a as D}from"../chunks/Ew6_cz_0.js";import{C as S,a as j,D as L}from"../chunks/BzIr_GrC.js";import{s as N}from"../chunks/DJTXGU6C.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{f as d,a as i}from"../chunks/C04NlUEE.js";import{p as E,u as M,b as u,o as S,f as A,a as B,c as r,d as F,r as s,s as x,g as H,n as N}from"../chunks/DlvidjXv.js";import{i as h,s as P,a as R}from"../chunks/Dqqytqkj.js";import{g as U}from"../chunks/OZt-i3RT.js";import{p as V}from"../chunks/BTEcqCut.js";import{C as q,a as G,D as J}from"../chunks/DveOLWfB.js";import{w as C}from"../chunks/CYCiyXhX.js";import{s as b}from"../chunks/BOr7AGz1.js";var K=d('<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>'),O=d('<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=d('<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 re(_,w){E(w,!0);const n=()=>R(b,"$selectedControl",y),[y,k]=P();let c="",a=F(!1);M(()=>{const e=V.params.id;if(!e)return;const t=decodeURIComponent(e);t&&t!==c&&C.isConnected()&&(c=t,u(a,!0),C.getControlDetails(t))}),S(()=>{const e=t=>{const o=t.detail;u(a,!1),o?b.set(o):U("/")};return window.addEventListener("control-details",e),()=>{window.removeEventListener("control-details",e)}});var v=Q(),l=A(v),f=r(l),D=r(f);q(D,{}),s(f),s(l);var m=x(l,2),p=r(m);{var L=e=>{var t=K();i(e,t)};h(p,e=>{H(a)&&e(L)})}var I=x(p,2);{var $=e=>{G(e,{get control(){return n()}})},z=e=>{var t=O(),o=r(t),g=r(o),j=r(g);J(j,{class:"mx-auto h-16 w-16 mb-4"}),N(4),s(g),s(o),s(t),i(e,t)};h(I,e=>{n()?e($):e(z,!1)})}s(m),i(_,v),B(),k()}export{re as component};
1
+ import{f as d,a as i}from"../chunks/DSxRA67V.js";import{p as E,u as M,b as u,o as S,f as A,a as B,c as r,d as F,r as s,s as x,g as H,n as N}from"../chunks/DHuA7MQr.js";import{i as h,s as P,a as R}from"../chunks/Ew6_cz_0.js";import{g as U}from"../chunks/BHkKokgA.js";import{p as V}from"../chunks/DpCtGpHu.js";import{C as q,a as G,D as J}from"../chunks/BzIr_GrC.js";import{w as C}from"../chunks/DznG4VMX.js";import{s as b}from"../chunks/DJTXGU6C.js";var K=d('<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>'),O=d('<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=d('<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 re(_,w){E(w,!0);const n=()=>R(b,"$selectedControl",y),[y,k]=P();let c="",a=F(!1);M(()=>{const e=V.params.id;if(!e)return;const t=decodeURIComponent(e);t&&t!==c&&C.isConnected()&&(c=t,u(a,!0),C.getControlDetails(t))}),S(()=>{const e=t=>{const o=t.detail;u(a,!1),o?b.set(o):U("/")};return window.addEventListener("control-details",e),()=>{window.removeEventListener("control-details",e)}});var v=Q(),l=A(v),f=r(l),D=r(f);q(D,{}),s(f),s(l);var m=x(l,2),p=r(m);{var L=e=>{var t=K();i(e,t)};h(p,e=>{H(a)&&e(L)})}var I=x(p,2);{var $=e=>{G(e,{get control(){return n()}})},z=e=>{var t=O(),o=r(t),g=r(o),j=r(g);J(j,{class:"mx-auto h-16 w-16 mb-4"}),N(4),s(g),s(o),s(t),i(e,t)};h(I,e=>{n()?e($):e(z,!1)})}s(m),i(_,v),B(),k()}export{re as component};
@@ -1,4 +1,4 @@
1
- import{b as Ne,a as d,s as I,f as x,e as c,c as Ae,t as tr}from"../chunks/C04NlUEE.js";import{i as We}from"../chunks/2BRL7VKY.js";import{p as Xe,af as Ve,b as a,U as k,y as pe,g as e,ag as $r,c as o,n as ke,r as t,a as Ke,t as P,ah as Nr,s as i,f as we,ai as xr,a1 as ze,ae as hr,aj as yr,i as de,o as ot,W as lt}from"../chunks/DlvidjXv.js";import{l as ar,p as Je,i as M,a as st,s as it}from"../chunks/Dqqytqkj.js";import{a as Lr,s as le,r as Tr,e as ge,b as Ye,c as Vr,d as _r,i as Cr,f as Sr,w as wr}from"../chunks/CYCiyXhX.js";import{g as nt}from"../chunks/OZt-i3RT.js";function dt(ue){return function(...U){var F=U[0];return F.stopPropagation(),ue?.apply(this,U)}}var vt=Ne("<title> </title>"),ct=Ne('<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 gt(ue,U){const F=ar(U,["children","$$slots","$$events","$$legacy"]),Y=ar(F,["size","title"]);Xe(U,!1);const E=k(),T=k();let Z=Je(U,"size",8,16),b=Je(U,"title",8,void 0);Ve(()=>(pe(F),pe(b())),()=>{a(E,F["aria-label"]||F["aria-labelledby"]||b())}),Ve(()=>(e(E),pe(F)),()=>{a(T,{"aria-hidden":e(E)?void 0:!0,role:e(E)?"img":void 0,focusable:Number(F.tabindex)===0?!0:void 0})}),$r(),We();var $=ct();Lr($,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:Z(),height:Z(),...e(T),...Y}));var K=o($);{var G=H=>{var g=vt(),N=o(g,!0);t(g),P(()=>I(N,b())),d(H,g)};M(K,H=>{b()&&H(G)})}ke(2),t($),d(ue,$),Ke()}var pt=Ne("<title> </title>"),ut=Ne('<svg><!><path d="M10 6H14V10H10zM18 6H22V10H18zM10 14H14V18H10zM18 14H22V18H18zM10 22H14V26H10zM18 22H22V26H18z"></path></svg>');function kr(ue,U){const F=ar(U,["children","$$slots","$$events","$$legacy"]),Y=ar(F,["size","title"]);Xe(U,!1);const E=k(),T=k();let Z=Je(U,"size",8,16),b=Je(U,"title",8,void 0);Ve(()=>(pe(F),pe(b())),()=>{a(E,F["aria-label"]||F["aria-labelledby"]||b())}),Ve(()=>(e(E),pe(F)),()=>{a(T,{"aria-hidden":e(E)?void 0:!0,role:e(E)?"img":void 0,focusable:Number(F.tabindex)===0?!0:void 0})}),$r(),We();var $=ut();Lr($,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:Z(),height:Z(),...e(T),...Y}));var K=o($);{var G=H=>{var g=pt(),N=o(g,!0);t(g),P(()=>I(N,b())),d(H,g)};M(K,H=>{b()&&H(G)})}ke(),t($),d(ue,$),Ke()}var bt=x('<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>'),ft=x('<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>'),mt=x('<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>'),xt=x("<option> </option>"),ht=x("<option> </option>"),yt=x("<option> </option>"),_t=x('<span class="ml-auto text-xs text-blue-600 dark:text-blue-400">ID</span>'),wt=x('<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>'),kt=x('<p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">No excluded fields</p>'),Ct=x('<div draggable="true" role="button" tabindex="0"><!> <span class="truncate"> </span></div>'),St=x('<p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">Drop fields here</p>'),$t=x('<div draggable="true" role="button" tabindex="0"><!> <span class="truncate"> </span></div>'),Dt=x('<p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">Drop fields here</p>'),Mt=x('<div draggable="true" role="button" tabindex="0"><!> <span class="truncate"> </span></div>'),zt=x('<p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">Drop fields here</p>'),At=x('<div draggable="false" role="button" tabindex="0" class="flex items-center px-3 py-2 bg-orange-100 dark:bg-orange-900/30 text-orange-800 dark:text-orange-300 rounded text-sm hover:bg-orange-200 dark:hover:bg-orange-800/30 transition-colors"><span class="truncate"> </span> <button class="ml-auto text-gray-400 hover:text-red-500 dark:text-gray-500 dark:hover:text-red-400" title="Remove from mappings">×</button></div>'),Ft=x('<div role="region" aria-label="Justification field drop zone"><p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">Drop fields here</p></div>'),Ot=x('<th class="px-4 py-2"> </th>'),Pt=x('<td class="px-4 py-2"> </td>'),Ht=x('<tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700"></tr>'),Et=x('<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>'),It=x('<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>'),jt=x(`<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
1
+ import{b as Ne,a as d,s as I,f as x,e as c,c as Ae,t as tr}from"../chunks/DSxRA67V.js";import{i as We}from"../chunks/kRA7ZCNG.js";import{p as Xe,af as Ve,b as a,U as k,y as pe,g as e,ag as $r,c as o,n as ke,r as t,a as Ke,t as P,ah as Nr,s as i,f as we,ai as xr,a1 as ze,ae as hr,aj as yr,i as de,o as ot,W as lt}from"../chunks/DHuA7MQr.js";import{l as ar,p as Je,i as M,a as st,s as it}from"../chunks/Ew6_cz_0.js";import{a as Lr,s as le,r as Tr,e as ge,b as Ye,c as Vr,d as _r,i as Cr,f as Sr,w as wr}from"../chunks/DznG4VMX.js";import{g as nt}from"../chunks/BHkKokgA.js";function dt(ue){return function(...U){var F=U[0];return F.stopPropagation(),ue?.apply(this,U)}}var vt=Ne("<title> </title>"),ct=Ne('<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 gt(ue,U){const F=ar(U,["children","$$slots","$$events","$$legacy"]),Y=ar(F,["size","title"]);Xe(U,!1);const E=k(),T=k();let Z=Je(U,"size",8,16),b=Je(U,"title",8,void 0);Ve(()=>(pe(F),pe(b())),()=>{a(E,F["aria-label"]||F["aria-labelledby"]||b())}),Ve(()=>(e(E),pe(F)),()=>{a(T,{"aria-hidden":e(E)?void 0:!0,role:e(E)?"img":void 0,focusable:Number(F.tabindex)===0?!0:void 0})}),$r(),We();var $=ct();Lr($,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:Z(),height:Z(),...e(T),...Y}));var K=o($);{var G=H=>{var g=vt(),N=o(g,!0);t(g),P(()=>I(N,b())),d(H,g)};M(K,H=>{b()&&H(G)})}ke(2),t($),d(ue,$),Ke()}var pt=Ne("<title> </title>"),ut=Ne('<svg><!><path d="M10 6H14V10H10zM18 6H22V10H18zM10 14H14V18H10zM18 14H22V18H18zM10 22H14V26H10zM18 22H22V26H18z"></path></svg>');function kr(ue,U){const F=ar(U,["children","$$slots","$$events","$$legacy"]),Y=ar(F,["size","title"]);Xe(U,!1);const E=k(),T=k();let Z=Je(U,"size",8,16),b=Je(U,"title",8,void 0);Ve(()=>(pe(F),pe(b())),()=>{a(E,F["aria-label"]||F["aria-labelledby"]||b())}),Ve(()=>(e(E),pe(F)),()=>{a(T,{"aria-hidden":e(E)?void 0:!0,role:e(E)?"img":void 0,focusable:Number(F.tabindex)===0?!0:void 0})}),$r(),We();var $=ut();Lr($,()=>({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",fill:"currentColor",preserveAspectRatio:"xMidYMid meet",width:Z(),height:Z(),...e(T),...Y}));var K=o($);{var G=H=>{var g=pt(),N=o(g,!0);t(g),P(()=>I(N,b())),d(H,g)};M(K,H=>{b()&&H(G)})}ke(),t($),d(ue,$),Ke()}var bt=x('<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>'),ft=x('<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>'),mt=x('<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>'),xt=x("<option> </option>"),ht=x("<option> </option>"),yt=x("<option> </option>"),_t=x('<span class="ml-auto text-xs text-blue-600 dark:text-blue-400">ID</span>'),wt=x('<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>'),kt=x('<p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">No excluded fields</p>'),Ct=x('<div draggable="true" role="button" tabindex="0"><!> <span class="truncate"> </span></div>'),St=x('<p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">Drop fields here</p>'),$t=x('<div draggable="true" role="button" tabindex="0"><!> <span class="truncate"> </span></div>'),Dt=x('<p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">Drop fields here</p>'),Mt=x('<div draggable="true" role="button" tabindex="0"><!> <span class="truncate"> </span></div>'),zt=x('<p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">Drop fields here</p>'),At=x('<div draggable="false" role="button" tabindex="0" class="flex items-center px-3 py-2 bg-orange-100 dark:bg-orange-900/30 text-orange-800 dark:text-orange-300 rounded text-sm hover:bg-orange-200 dark:hover:bg-orange-800/30 transition-colors"><span class="truncate"> </span> <button class="ml-auto text-gray-400 hover:text-red-500 dark:text-gray-500 dark:hover:text-red-400" title="Remove from mappings">×</button></div>'),Ft=x('<div role="region" aria-label="Justification field drop zone"><p class="text-xs text-gray-400 dark:text-gray-500 text-center py-4">Drop fields here</p></div>'),Ot=x('<th class="px-4 py-2"> </th>'),Pt=x('<td class="px-4 py-2"> </td>'),Ht=x('<tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700"></tr>'),Et=x('<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>'),It=x('<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>'),jt=x(`<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
2
  the controls list.</p> <div class="grid grid-cols-1 lg:grid-cols-5 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 class="border border-orange-300 dark:border-orange-700 rounded-lg bg-white dark:bg-gray-800"><div class="p-3 border-b border-orange-200 dark:border-orange-800 bg-orange-50 dark:bg-orange-900/20 rounded-t-lg"><h4 class="text-sm font-semibold text-orange-700 dark:text-orange-300">Mappings Tab</h4> <p class="text-xs text-orange-600 dark:text-orange-400 mt-1">Pre-populate justification for a control mapping</p></div> <div role="region" aria-label="Justifications tab drop zone"><div class="space-y-2"><!></div></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),Tt=x('<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 Vt(ue,U){Xe(U,!1);const F=Nr();let Y=k(null),E=k(""),T=k(""),Z=k([]),b=k([]),$=k([]),K=k(0),G=k([]),H=k([]),g=k(new Map),N=k(1),L=k(""),xe=k(""),J=k(""),Q=k(!1),ee=k(""),be=k(""),Ce=k(!1),te=k(!1),C=k(null),B=k(null),re=k(null);function Se(){a(b,[]),a($,[]),a(K,0),e(g).clear(),a(g,new Map),a(H,[]),a(L,""),a(ee,""),a(be,""),a(C,null),a(B,null),a(re,null)}function p(l){l.preventDefault(),a(te,!0)}function u(){a(te,!1)}function D(l){l.preventDefault(),a(te,!1);const n=l.dataTransfer?.files;n&&n.length>0&&j(n[0])}function V(l){const n=l.target;n.files&&n.files.length>0&&j(n.files[0])}async function j(l){Se(),a(E,l.name),a(Y,l),a(ee,""),a(Q,!0),a(xe,e(E).replace(/\.[^.]+$/,"").replace(/[-_]/g," ")),a(J,`Imported from ${e(E)}`);try{const n=new FormData;n.append("file",l);const y=await fetch("/api/parse-excel",{method:"POST",body:n});if(!y.ok){const z=await y.json();throw new Error(z.error||"Failed to parse file")}const h=await y.json();a(Z,h.sheets||[]),a(T,h.selectedSheet||e(Z)[0]),a(G,h.rowPreviews||[]),e(G).length>0&&e(N)===1&&a(N,e(G)[0].row),await q(),a(Ce,!0)}catch(n){a(ee,"Error reading file: "+n.message)}finally{a(Q,!1)}}async function q(){if(!(!e(Y)||!e(T))){a(Q,!0),e(g).clear(),a(g,new Map),a(L,""),a(H,[]),a(C,null),a(B,null),a(re,null);try{const l=new FormData;l.append("file",e(Y)),l.append("sheetName",e(T));const n=await fetch("/api/parse-excel-sheet-previews",{method:"POST",body:l});if(n.ok){const w=await n.json();a(G,w.rowPreviews||[]),e(G).length>0&&!e(G).some(A=>A.row===e(N))&&a(N,e(G)[0].row)}else{const w=await n.json();throw new Error(w.error||"Failed to load sheet previews")}const y=new FormData;y.append("file",e(Y)),y.append("sheetName",e(T)),y.append("headerRow",e(N).toString());const h=await fetch("/api/parse-excel-sheet",{method:"POST",body:y});if(!h.ok){const w=await h.json();throw new Error(w.error||"Failed to parse sheet")}const z=await h.json();if(a(b,z.fields||[]),a($,z.sampleData||[]),a(K,z.controlCount||0),e(b).forEach((w,A)=>{const _=w.toLowerCase();let ce="custom",fe="text";_.includes("implementation")||_.includes("status")||_.includes("narrative")||_.includes("guidance")?ce="implementation":(_.includes("id")||_.includes("title")||_.includes("family")||_.includes("cci")||_.includes("control")||_.includes("acronym"))&&(ce="overview"),_.includes("description")||_.includes("narrative")||_.includes("guidance")||_.includes("statement")?fe="textarea":_.includes("status")||_.includes("type")||_.includes("designation")?fe="select":_.includes("date")?fe="date":(_.includes("count")||_.includes("number"))&&(fe="number"),e(g).set(w,{originalName:w,tab:ce,displayOrder:A,fieldType:fe,required:_.includes("id")||_.includes("title")})}),a(g,e(g)),e(L)&&!e(b).includes(e(L))&&a(L,""),!e(L)&&e(b).includes("AP Acronym")){const w=!e($).length||e($).every(ne=>!ne["AP Acronym"]||String(ne["AP Acronym"]).length<25),A=e($).map(ne=>ne["AP Acronym"]).filter(ne=>ne!=null&&ne!==""&&String(ne).trim()!==""),_=new Set(A),ce=!A.length||_.size===A.length,fe=A.length>0;w&&ce&&fe&&a(L,"AP Acronym")}}catch(l){a(ee,"Error loading sheet data: "+l.message)}finally{a(Q,!1)}}}function ve(l){if(!l)return l;let n=l.trim().replace(/\r?\n/g," ").replace(/\s+/g," ").trim();return Le(n)}function Le(l){return l.replace(/\W+/g," ").split(/ |\s/).map(n=>n.toLowerCase()).join("-")}function he(l,n){a(C,n),l.dataTransfer&&(l.dataTransfer.effectAllowed="move",l.dataTransfer.setData("text/plain",n))}function ae(){a(C,null),a(B,null),a(re,null)}function S(l,n){l.preventDefault(),a(B,n),l.dataTransfer&&(l.dataTransfer.dropEffect="move")}function se(){a(B,null)}function ie(l,n,y){if(l.preventDefault(),e(C)&&e(g).has(e(C))){const h=e(g).get(e(C));if(n==="mappings")e(H).includes(e(C))||a(H,[...e(H),e(C)]);else{if(h.tab=n,y!==void 0&&n!==null){const w=Array.from(e(g).entries()).filter(([A,_])=>_.tab===n).sort((A,_)=>A[1].displayOrder-_[1].displayOrder).filter(([A])=>A!==e(C));w.splice(y,0,[e(C),h]),w.forEach(([A,_],ce)=>{_.displayOrder=ce,e(g).set(A,_)})}else if(n!==null){const z=Math.max(0,...Array.from(e(g).values()).filter(w=>w.tab===n).map(w=>w.displayOrder));h.displayOrder=z+1}e(g).set(e(C),h),a(g,e(g))}}a(C,null),a(B,null)}function Fe(l,n){l.preventDefault(),l.stopPropagation(),a(re,n)}function $e(){a(re,null)}function De(l,n,y){if(l.preventDefault(),l.stopPropagation(),e(C)&&e(C)!==n){const z=Array.from(e(g).entries()).filter(([w,A])=>A.tab===y).sort((w,A)=>w[1].displayOrder-A[1].displayOrder).findIndex(([w])=>w===n);z!==-1&&ie(l,y,z)}a(re,null)}async function Be(){if(!(!e(Y)||!e(E))){if(!e(L)){a(ee,"Please select a Control ID field before importing"),a(be,"");return}if(!e(xe)||e(xe).trim()===""){a(ee,"Please enter a Control Set Name before importing"),a(be,"");return}a(Q,!0),a(ee,""),a(be,"");try{const l=new FormData;l.append("file",e(Y),e(E)),l.append("controlIdField",e(L)),l.append("startRow",e(N).toString()),l.append("sheetName",e(T)),l.append("namingConvention","kebab-case"),l.append("skipEmpty","true"),l.append("skipEmptyRows","true"),l.append("controlSetName",e(xe)||e(E).replace(/\.[^.]+$/,"")),l.append("controlSetDescription",e(J)||`Imported from ${e(E)}`);const n=Array.from(e(g).entries()).filter(([h,z])=>z.tab!==null).map(([h,z])=>({fieldName:ve(h),...z}));l.append("fieldSchema",JSON.stringify(n)),l.append("justificationFields",JSON.stringify(e(H).map(h=>ve(h))));let y;try{if(y=await fetch("/api/import-spreadsheet",{method:"POST",body:l}),!y.ok){const z=await y.json();throw new Error(z.error||"Import failed")}const h=await y.json();a(be,`Successfully imported ${h.controlCount} controls into ${h.families.length} families`),F("created",{path:h.outputDir})}catch(h){console.error("Error importing spreadsheet:",h)}}catch(l){a(ee,"Error importing spreadsheet: "+l.message)}finally{a(Q,!1)}}}We();var Re=Tt(),ye=o(Re),Ze=o(ye),Oe=o(Ze),or=o(Oe);gt(or,{class:"w-8 h-8 mb-4 text-gray-500 dark:text-gray-400"}),ke(4),t(Oe);var Ge=i(Oe,2);t(Ze),t(ye);var Pe=i(ye,2);{var lr=l=>{var n=bt(),y=o(n),h=i(o(y),2),z=i(o(h)),w=i(z),A=i(o(w)),_=i(A,2),ce=i(_,2);t(w),t(h),t(y),t(n),P(()=>{I(z,` ${e(E)??""} `),I(A,` ${e(Z).length??""} | `),I(_,` ${e(b).length??""} | `),I(ce,` ${e(K)??""}`)}),d(l,n)};M(Pe,l=>{e(E)&&l(lr)})}var Qe=i(Pe,2);{var sr=l=>{var n=ft(),y=o(n),h=i(o(y),2),z=o(h,!0);t(h),t(y),t(n),P(()=>I(z,e(ee))),d(l,n)};M(Qe,l=>{e(ee)&&l(sr)})}var qe=i(Qe,2);{var ir=l=>{var n=mt(),y=o(n),h=i(o(y),2),z=o(h,!0);t(h),t(y),t(n),P(()=>I(z,e(be))),d(l,n)};M(qe,l=>{e(be)&&l(ir)})}var nr=i(qe,2);{var dr=l=>{var n=jt(),y=we(n),h=i(o(y),2),z=o(h),w=i(o(z),2);Tr(w),ke(2),t(z);var A=i(z,2),_=i(o(A),2);Tr(_),ke(2),t(A),t(h);var ce=i(h,2),fe=o(ce),ne=i(o(fe),2);P(()=>{e(T),xr(()=>{e(Z)})}),ge(ne,5,()=>e(Z),r=>r,(r,s)=>{var f=xt(),m=o(f,!0);t(f);var v={};P(()=>{I(m,e(s)),v!==(v=e(s))&&(f.value=(f.__value=e(s))??"")}),d(r,f)}),t(ne),ke(2),t(fe);var vr=i(fe,2),er=i(o(vr),2);P(()=>{e(N),xr(()=>{e(G)})}),ge(er,5,()=>e(G),r=>r.row,(r,s)=>{var f=ht(),m=o(f);t(f);var v={};P(()=>{I(m,`Row ${e(s).row??""}: ${e(s).preview??""}`),v!==(v=e(s).row)&&(f.value=(f.__value=e(s).row)??"")}),d(r,f)}),t(er),ke(2),t(vr);var Dr=i(vr,2),rr=i(o(Dr),2);P(()=>{e(L),xr(()=>{e(b),e($)})});var cr=o(rr);cr.value=cr.__value="";var Br=i(cr);ge(Br,1,()=>e(b),r=>r,(r,s)=>{const f=ze(()=>e($).length>0&&e($)[0][e(s)]?String(e($)[0][e(s)]).slice(0,30):""),m=ze(()=>!e($).length||e($).every(oe=>!oe[e(s)]||String(oe[e(s)]).length<25)),v=ze(()=>e($).map(oe=>oe[e(s)]).filter(oe=>oe!=null&&oe!==""&&String(oe).trim()!=="")),W=ze(()=>new Set(e(v))),X=ze(()=>!e(v).length||e(W).size===e(v).length),R=ze(()=>e(v).length>0);var O=Ae(),me=we(O);{var Me=oe=>{var _e=yt(),mr=o(_e);t(_e);var jr={};P(()=>{I(mr,`${e(s)??""}${e(f)?` (e.g., ${e(f)})`:""}`),jr!==(jr=e(s))&&(_e.value=(_e.__value=e(s))??"")}),d(oe,_e)};M(me,oe=>{e(m)&&e(X)&&e(R)&&oe(Me)})}d(r,O)}),t(rr),ke(2),t(Dr),t(ce),t(y);var gr=i(y,2),Mr=i(o(gr),4),pr=o(Mr),He=i(o(pr),2),zr=o(He);ge(zr,1,()=>e(b).filter(r=>!e(g).get(r)||e(g).get(r)?.tab===null),r=>r,(r,s)=>{var f=wt(),m=i(o(f),2),v=o(m,!0);t(m);var W=i(m,2);{var X=R=>{var O=_t();d(R,O)};M(W,R=>{e(s)===e(L)&&R(X)})}t(f),P(()=>{Ye(f,"aria-label",`Drag ${e(s)??""} field`),I(v,e(s))}),c("dragstart",f,R=>he(R,e(s))),c("dragend",f,ae),d(r,f)});var Rr=i(zr,2);{var Zr=r=>{var s=kt();d(r,s)};M(Rr,r=>{e(b).filter(s=>!e(g).get(s)||e(g).get(s)?.tab===null).length===0&&r(Zr)})}t(He),t(pr);var ur=i(pr,2),Ee=i(o(ur),2),Ar=o(Ee);ge(Ar,3,()=>Array.from(e(g).entries()).filter(([r,s])=>s.tab==="overview").sort((r,s)=>r[1].displayOrder-s[1].displayOrder),([r,s])=>r,(r,s)=>{var f=hr(()=>yr(e(s),2));let m=()=>e(f)[0];var v=Ct(),W=o(v);kr(W,{class:"w-3 h-3 mr-2 flex-shrink-0"});var X=i(W,2),R=o(X,!0);t(X),t(v),P(()=>{Ye(v,"aria-label",`${m()??""} field in Overview tab`),le(v,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
3
  ${e(re)===m()&&e(C)!==m()?"border-t-2 border-blue-500":""}`),I(R,m())}),c("dragstart",v,O=>he(O,m())),c("dragend",v,ae),c("dragover",v,O=>Fe(O,m())),c("dragleave",v,$e),c("drop",v,O=>De(O,m(),"overview")),d(r,v)});var qr=i(Ar,2);{var Ur=r=>{var s=St();d(r,s)};M(qr,r=>{Array.from(e(g).entries()).filter(([s,f])=>f.tab==="overview").length===0&&r(Ur)})}t(Ee),t(ur);var br=i(ur,2),Ie=i(o(br),2),Fr=o(Ie);ge(Fr,3,()=>Array.from(e(g).entries()).filter(([r,s])=>s.tab==="implementation").sort((r,s)=>r[1].displayOrder-s[1].displayOrder),([r,s])=>r,(r,s)=>{var f=hr(()=>yr(e(s),2));let m=()=>e(f)[0];var v=$t(),W=o(v);kr(W,{class:"w-3 h-3 mr-2 flex-shrink-0"});var X=i(W,2),R=o(X,!0);t(X),t(v),P(()=>{Ye(v,"aria-label",`${m()??""} field in Implementation tab`),le(v,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
4
  ${e(re)===m()&&e(C)!==m()?"border-t-2 border-green-500":""}`),I(R,m())}),c("dragstart",v,O=>he(O,m())),c("dragend",v,ae),c("dragover",v,O=>Fe(O,m())),c("dragleave",v,$e),c("drop",v,O=>De(O,m(),"implementation")),d(r,v)});var Yr=i(Fr,2);{var Jr=r=>{var s=Dt();d(r,s)};M(Yr,r=>{Array.from(e(g).entries()).filter(([s,f])=>f.tab==="implementation").length===0&&r(Jr)})}t(Ie),t(br);var fr=i(br,2),je=i(o(fr),2),Or=o(je);ge(Or,3,()=>Array.from(e(g).entries()).filter(([r,s])=>s.tab==="custom").sort((r,s)=>r[1].displayOrder-s[1].displayOrder),([r,s])=>r,(r,s)=>{var f=hr(()=>yr(e(s),2));let m=()=>e(f)[0];var v=Mt(),W=o(v);kr(W,{class:"w-3 h-3 mr-2 flex-shrink-0"});var X=i(W,2),R=o(X,!0);t(X),t(v),P(()=>{Ye(v,"aria-label",`${m()??""} field in Custom tab`),le(v,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
@@ -1 +1 @@
1
- {"version":"1765499728735"}
1
+ {"version":"1765552236798"}
@@ -1668,6 +1668,7 @@ var fileStore_exports = {};
1668
1668
  __export(fileStore_exports, {
1669
1669
  FileStore: () => FileStore
1670
1670
  });
1671
+ import { createHash as createHash2 } from "crypto";
1671
1672
  import {
1672
1673
  existsSync as existsSync2,
1673
1674
  promises as fs,
@@ -1680,7 +1681,6 @@ import {
1680
1681
  } from "fs";
1681
1682
  import * as yaml2 from "js-yaml";
1682
1683
  import { join as join2 } from "path";
1683
- import { createHash as createHash2 } from "crypto";
1684
1684
  var FileStore;
1685
1685
  var init_fileStore = __esm({
1686
1686
  "cli/server/infrastructure/fileStore.ts"() {
@@ -1700,6 +1700,40 @@ var init_fileStore = __esm({
1700
1700
  this.refreshControlsCache();
1701
1701
  }
1702
1702
  }
1703
+ /**
1704
+ * Update a single mapping in place, preserving file order
1705
+ */
1706
+ async updateMapping(oldCompositeKey, updatedMapping) {
1707
+ const mappingFiles = this.getAllMappingFiles();
1708
+ for (const file of mappingFiles) {
1709
+ try {
1710
+ const content = readFileSync2(file, "utf8");
1711
+ let mappings = yaml2.load(content) || [];
1712
+ let changed = false;
1713
+ mappings = mappings.map((m) => {
1714
+ const hash = createHash2("sha256").update(JSON.stringify(m)).digest("hex");
1715
+ if (`${m.control_id}:${hash}` === oldCompositeKey) {
1716
+ const clean = { ...updatedMapping };
1717
+ delete clean.hash;
1718
+ changed = true;
1719
+ return clean;
1720
+ }
1721
+ return m;
1722
+ });
1723
+ if (changed) {
1724
+ const yamlContent = yaml2.dump(mappings, {
1725
+ indent: 2,
1726
+ lineWidth: -1,
1727
+ noRefs: true
1728
+ });
1729
+ writeFileSync(file, yamlContent, "utf8");
1730
+ return;
1731
+ }
1732
+ } catch (error) {
1733
+ console.error(`Error processing mapping file ${file}:`, error);
1734
+ }
1735
+ }
1736
+ }
1703
1737
  /**
1704
1738
  * Get simple filename from control ID
1705
1739
  */
@@ -1722,8 +1756,8 @@ var init_fileStore = __esm({
1722
1756
  if (!this.baseDir || this.baseDir === "." || this.baseDir === process.cwd()) {
1723
1757
  return;
1724
1758
  }
1725
- const lulaConfigPath2 = join2(this.baseDir, "lula.yaml");
1726
- if (!existsSync2(lulaConfigPath2)) {
1759
+ const lulaConfigPath = join2(this.baseDir, "lula.yaml");
1760
+ if (!existsSync2(lulaConfigPath)) {
1727
1761
  return;
1728
1762
  }
1729
1763
  if (!existsSync2(this.controlsDir)) {
@@ -1882,10 +1916,10 @@ var init_fileStore = __esm({
1882
1916
  return [];
1883
1917
  }
1884
1918
  let controlOrder = null;
1919
+ const lulaConfigPath = join2(this.baseDir, "lula.yaml");
1885
1920
  try {
1886
- const lulaConfigPath2 = join2(this.baseDir, "lula.yaml");
1887
- if (existsSync2(lulaConfigPath2)) {
1888
- const content = readFileSync2(lulaConfigPath2, "utf8");
1921
+ if (existsSync2(lulaConfigPath)) {
1922
+ const content = readFileSync2(lulaConfigPath, "utf8");
1889
1923
  const metadata = yaml2.load(content);
1890
1924
  controlOrder = metadata?.controlOrder || null;
1891
1925
  }
@@ -5139,12 +5173,12 @@ import { fileURLToPath } from "url";
5139
5173
  import { readFileSync as readFileSync4 } from "fs";
5140
5174
  init_debug();
5141
5175
  init_controlHelpers();
5142
- init_serverState();
5143
5176
  init_gitHistory();
5177
+ init_serverState();
5144
5178
  import * as yaml5 from "js-yaml";
5179
+ import crypto2 from "node:crypto";
5145
5180
  import { join as join5 } from "path";
5146
5181
  import { WebSocket, WebSocketServer } from "ws";
5147
- import crypto2 from "node:crypto";
5148
5182
  var WebSocketManager = class {
5149
5183
  wss = null;
5150
5184
  clients = /* @__PURE__ */ new Set();
@@ -5185,6 +5219,62 @@ var WebSocketManager = class {
5185
5219
  }
5186
5220
  break;
5187
5221
  }
5222
+ case "update-mapping": {
5223
+ const state = getServerState();
5224
+ if (payload && payload.old_composite_key && payload.mapping) {
5225
+ const oldCompositeKey = payload.old_composite_key;
5226
+ const existing = state.mappingsCache.get(oldCompositeKey);
5227
+ if (!existing) {
5228
+ console.error("Mapping not found for update:", oldCompositeKey);
5229
+ break;
5230
+ }
5231
+ const incoming = payload.mapping;
5232
+ const updated = {
5233
+ ...existing,
5234
+ ...incoming,
5235
+ control_id: incoming.control_id || existing.control_id,
5236
+ uuid: incoming.uuid || existing.uuid
5237
+ };
5238
+ if (!updated.hash || updated.hash === "") {
5239
+ updated.hash = crypto2.createHash("sha256").update(JSON.stringify({ ...updated, hash: void 0 })).digest("hex");
5240
+ }
5241
+ const oldHash = existing.hash;
5242
+ const oldControlId = existing.control_id;
5243
+ const oldFamily = oldControlId.split("-")[0];
5244
+ const newHash = updated.hash;
5245
+ const newControlId = updated.control_id;
5246
+ const newFamily = newControlId.split("-")[0];
5247
+ const newCompositeKey = `${newControlId}:${newHash}`;
5248
+ await state.fileStore.updateMapping(oldCompositeKey, updated);
5249
+ const entries = Array.from(state.mappingsCache.entries());
5250
+ const oldIndex = entries.findIndex(([key]) => key === oldCompositeKey);
5251
+ if (oldIndex === -1) {
5252
+ state.mappingsCache.delete(oldCompositeKey);
5253
+ state.mappingsCache.set(newCompositeKey, updated);
5254
+ } else {
5255
+ entries[oldIndex] = [newCompositeKey, updated];
5256
+ state.mappingsCache = new Map(entries);
5257
+ }
5258
+ state.mappingsByFamily.get(oldFamily)?.delete(oldHash);
5259
+ state.mappingsByControl.get(oldControlId)?.delete(oldHash);
5260
+ if (!state.mappingsByFamily.has(newFamily)) {
5261
+ state.mappingsByFamily.set(newFamily, /* @__PURE__ */ new Set());
5262
+ }
5263
+ state.mappingsByFamily.get(newFamily).add(newHash);
5264
+ if (!state.mappingsByControl.has(newControlId)) {
5265
+ state.mappingsByControl.set(newControlId, /* @__PURE__ */ new Set());
5266
+ }
5267
+ state.mappingsByControl.get(newControlId).add(newHash);
5268
+ ws.send(
5269
+ JSON.stringify({
5270
+ type: "mapping-updated",
5271
+ payload: { uuid: updated.uuid, success: true }
5272
+ })
5273
+ );
5274
+ this.broadcastState();
5275
+ }
5276
+ break;
5277
+ }
5188
5278
  case "refresh-controls": {
5189
5279
  const state = getServerState();
5190
5280
  state.controlsCache.clear();
@@ -1650,6 +1650,7 @@ var fileStore_exports = {};
1650
1650
  __export(fileStore_exports, {
1651
1651
  FileStore: () => FileStore
1652
1652
  });
1653
+ import { createHash as createHash2 } from "crypto";
1653
1654
  import {
1654
1655
  existsSync as existsSync2,
1655
1656
  promises as fs,
@@ -1662,7 +1663,6 @@ import {
1662
1663
  } from "fs";
1663
1664
  import * as yaml2 from "js-yaml";
1664
1665
  import { join as join2 } from "path";
1665
- import { createHash as createHash2 } from "crypto";
1666
1666
  var FileStore;
1667
1667
  var init_fileStore = __esm({
1668
1668
  "cli/server/infrastructure/fileStore.ts"() {
@@ -1682,6 +1682,40 @@ var init_fileStore = __esm({
1682
1682
  this.refreshControlsCache();
1683
1683
  }
1684
1684
  }
1685
+ /**
1686
+ * Update a single mapping in place, preserving file order
1687
+ */
1688
+ async updateMapping(oldCompositeKey, updatedMapping) {
1689
+ const mappingFiles = this.getAllMappingFiles();
1690
+ for (const file of mappingFiles) {
1691
+ try {
1692
+ const content = readFileSync2(file, "utf8");
1693
+ let mappings = yaml2.load(content) || [];
1694
+ let changed = false;
1695
+ mappings = mappings.map((m) => {
1696
+ const hash = createHash2("sha256").update(JSON.stringify(m)).digest("hex");
1697
+ if (`${m.control_id}:${hash}` === oldCompositeKey) {
1698
+ const clean = { ...updatedMapping };
1699
+ delete clean.hash;
1700
+ changed = true;
1701
+ return clean;
1702
+ }
1703
+ return m;
1704
+ });
1705
+ if (changed) {
1706
+ const yamlContent = yaml2.dump(mappings, {
1707
+ indent: 2,
1708
+ lineWidth: -1,
1709
+ noRefs: true
1710
+ });
1711
+ writeFileSync(file, yamlContent, "utf8");
1712
+ return;
1713
+ }
1714
+ } catch (error) {
1715
+ console.error(`Error processing mapping file ${file}:`, error);
1716
+ }
1717
+ }
1718
+ }
1685
1719
  /**
1686
1720
  * Get simple filename from control ID
1687
1721
  */
@@ -1704,8 +1738,8 @@ var init_fileStore = __esm({
1704
1738
  if (!this.baseDir || this.baseDir === "." || this.baseDir === process.cwd()) {
1705
1739
  return;
1706
1740
  }
1707
- const lulaConfigPath2 = join2(this.baseDir, "lula.yaml");
1708
- if (!existsSync2(lulaConfigPath2)) {
1741
+ const lulaConfigPath = join2(this.baseDir, "lula.yaml");
1742
+ if (!existsSync2(lulaConfigPath)) {
1709
1743
  return;
1710
1744
  }
1711
1745
  if (!existsSync2(this.controlsDir)) {
@@ -1864,10 +1898,10 @@ var init_fileStore = __esm({
1864
1898
  return [];
1865
1899
  }
1866
1900
  let controlOrder = null;
1901
+ const lulaConfigPath = join2(this.baseDir, "lula.yaml");
1867
1902
  try {
1868
- const lulaConfigPath2 = join2(this.baseDir, "lula.yaml");
1869
- if (existsSync2(lulaConfigPath2)) {
1870
- const content = readFileSync2(lulaConfigPath2, "utf8");
1903
+ if (existsSync2(lulaConfigPath)) {
1904
+ const content = readFileSync2(lulaConfigPath, "utf8");
1871
1905
  const metadata = yaml2.load(content);
1872
1906
  controlOrder = metadata?.controlOrder || null;
1873
1907
  }
@@ -5116,12 +5150,12 @@ import { fileURLToPath } from "url";
5116
5150
  import { readFileSync as readFileSync4 } from "fs";
5117
5151
  init_debug();
5118
5152
  init_controlHelpers();
5119
- init_serverState();
5120
5153
  init_gitHistory();
5154
+ init_serverState();
5121
5155
  import * as yaml5 from "js-yaml";
5156
+ import crypto2 from "node:crypto";
5122
5157
  import { join as join5 } from "path";
5123
5158
  import { WebSocket, WebSocketServer } from "ws";
5124
- import crypto2 from "node:crypto";
5125
5159
  var WebSocketManager = class {
5126
5160
  wss = null;
5127
5161
  clients = /* @__PURE__ */ new Set();
@@ -5162,6 +5196,62 @@ var WebSocketManager = class {
5162
5196
  }
5163
5197
  break;
5164
5198
  }
5199
+ case "update-mapping": {
5200
+ const state = getServerState();
5201
+ if (payload && payload.old_composite_key && payload.mapping) {
5202
+ const oldCompositeKey = payload.old_composite_key;
5203
+ const existing = state.mappingsCache.get(oldCompositeKey);
5204
+ if (!existing) {
5205
+ console.error("Mapping not found for update:", oldCompositeKey);
5206
+ break;
5207
+ }
5208
+ const incoming = payload.mapping;
5209
+ const updated = {
5210
+ ...existing,
5211
+ ...incoming,
5212
+ control_id: incoming.control_id || existing.control_id,
5213
+ uuid: incoming.uuid || existing.uuid
5214
+ };
5215
+ if (!updated.hash || updated.hash === "") {
5216
+ updated.hash = crypto2.createHash("sha256").update(JSON.stringify({ ...updated, hash: void 0 })).digest("hex");
5217
+ }
5218
+ const oldHash = existing.hash;
5219
+ const oldControlId = existing.control_id;
5220
+ const oldFamily = oldControlId.split("-")[0];
5221
+ const newHash = updated.hash;
5222
+ const newControlId = updated.control_id;
5223
+ const newFamily = newControlId.split("-")[0];
5224
+ const newCompositeKey = `${newControlId}:${newHash}`;
5225
+ await state.fileStore.updateMapping(oldCompositeKey, updated);
5226
+ const entries = Array.from(state.mappingsCache.entries());
5227
+ const oldIndex = entries.findIndex(([key]) => key === oldCompositeKey);
5228
+ if (oldIndex === -1) {
5229
+ state.mappingsCache.delete(oldCompositeKey);
5230
+ state.mappingsCache.set(newCompositeKey, updated);
5231
+ } else {
5232
+ entries[oldIndex] = [newCompositeKey, updated];
5233
+ state.mappingsCache = new Map(entries);
5234
+ }
5235
+ state.mappingsByFamily.get(oldFamily)?.delete(oldHash);
5236
+ state.mappingsByControl.get(oldControlId)?.delete(oldHash);
5237
+ if (!state.mappingsByFamily.has(newFamily)) {
5238
+ state.mappingsByFamily.set(newFamily, /* @__PURE__ */ new Set());
5239
+ }
5240
+ state.mappingsByFamily.get(newFamily).add(newHash);
5241
+ if (!state.mappingsByControl.has(newControlId)) {
5242
+ state.mappingsByControl.set(newControlId, /* @__PURE__ */ new Set());
5243
+ }
5244
+ state.mappingsByControl.get(newControlId).add(newHash);
5245
+ ws.send(
5246
+ JSON.stringify({
5247
+ type: "mapping-updated",
5248
+ payload: { uuid: updated.uuid, success: true }
5249
+ })
5250
+ );
5251
+ this.broadcastState();
5252
+ }
5253
+ break;
5254
+ }
5165
5255
  case "refresh-controls": {
5166
5256
  const state = getServerState();
5167
5257
  state.controlsCache.clear();