@json-to-office/jto 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +234 -49
- package/dist/cli.js.map +1 -1
- package/dist/client/assets/HomePage-BuV1dGoc.js +99 -0
- package/dist/client/assets/HomePage-BuV1dGoc.js.map +1 -0
- package/dist/client/assets/JsonEditorPage-y7DXYaWc.js +3 -0
- package/dist/client/assets/JsonEditorPage-y7DXYaWc.js.map +1 -0
- package/dist/client/assets/MonacoPluginProvider-B4-PgJ0r.js +3 -0
- package/dist/client/assets/MonacoPluginProvider-B4-PgJ0r.js.map +1 -0
- package/dist/client/assets/{button-CMkwEplC.js → button-Bf6x7Zjh.js} +2 -2
- package/dist/client/assets/{button-CMkwEplC.js.map → button-Bf6x7Zjh.js.map} +1 -1
- package/dist/client/assets/{editor-CtwF-qwA.js → editor-Bwuq290w.js} +2 -2
- package/dist/client/assets/{editor-CtwF-qwA.js.map → editor-Bwuq290w.js.map} +1 -1
- package/dist/client/assets/editor-monaco-json-BrfKPhHP.js +6 -0
- package/dist/client/assets/{editor-monaco-json-DHRbpQ-v.js.map → editor-monaco-json-BrfKPhHP.js.map} +1 -1
- package/dist/client/assets/index-Dmrqj1a7.css +1 -0
- package/dist/client/assets/index-uE8YOnrS.js +3 -0
- package/dist/client/assets/index-uE8YOnrS.js.map +1 -0
- package/dist/client/assets/preview-kcqt_5hb.js +3 -0
- package/dist/client/assets/{preview-38guLS86.js.map → preview-kcqt_5hb.js.map} +1 -1
- package/dist/client/assets/{state-vendor-CAMVKh-F.js → state-vendor-DypmJYNT.js} +2 -2
- package/dist/client/assets/{state-vendor-CAMVKh-F.js.map → state-vendor-DypmJYNT.js.map} +1 -1
- package/dist/client/assets/{ui-vendor-C6DsfOoA.js → ui-vendor-BFdEgxEg.js} +2 -2
- package/dist/client/assets/{ui-vendor-C6DsfOoA.js.map → ui-vendor-BFdEgxEg.js.map} +1 -1
- package/dist/client/index.html +3 -4
- package/dist/index.d.ts +8 -3
- package/dist/index.js +110 -19
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/dist/client/assets/HomePage-D9PVR0H8.js +0 -99
- package/dist/client/assets/HomePage-D9PVR0H8.js.map +0 -1
- package/dist/client/assets/JsonEditorPage-bCBt1A49.js +0 -3
- package/dist/client/assets/JsonEditorPage-bCBt1A49.js.map +0 -1
- package/dist/client/assets/editor-monaco-json-DHRbpQ-v.js +0 -6
- package/dist/client/assets/index-B9dV-vCI.css +0 -1
- package/dist/client/assets/index-CGQAncgl.js +0 -3
- package/dist/client/assets/index-CGQAncgl.js.map +0 -1
- package/dist/client/assets/preview-38guLS86.js +0 -3
- package/dist/client/assets/settings-store-provider-BEzje7_o.js +0 -2
- package/dist/client/assets/settings-store-provider-BEzje7_o.js.map +0 -1
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{j as t}from"./query-vendor-UL64zsGL.js";import{c as A,g as re,r as y,a as oe}from"./react-vendor-DhdcN9D5.js";import{c as D,u as ie}from"./index-uE8YOnrS.js";import ae,{DiffEditor as le}from"./monaco-editor-DzeBDgmk.js";import{u as R,b as ue}from"./MonacoPluginProvider-B4-PgJ0r.js";import{B as Q}from"./button-Bf6x7Zjh.js";import{e as ce}from"./state-vendor-DypmJYNT.js";import{Q as W,C as de,d as fe,X as me,b as he,m as ge,T as pe}from"./ui-vendor-BFdEgxEg.js";var q,X;function xe(){if(X)return q;X=1;var e="Expected a function",o=NaN,r="[object Symbol]",n=/^\s+|\s+$/g,i=/^[-+]0x[0-9a-f]+$/i,a=/^0b[01]+$/i,l=/^0o[0-7]+$/i,f=parseInt,x=typeof A=="object"&&A&&A.Object===Object&&A,v=typeof self=="object"&&self&&self.Object===Object&&self,b=x||v||Function("return this")(),p=Object.prototype,j=p.toString,w=Math.max,I=Math.min,L=function(){return b.Date.now()};function V(u,h,C){var E,T,O,s,c,m,d=0,N=!1,S=!1,J=!0;if(typeof u!="function")throw new TypeError(e);h=$(h)||0,P(C)&&(N=!!C.leading,S="maxWait"in C,O=S?w($(C.maxWait)||0,h):O,J="trailing"in C?!!C.trailing:J);function B(g){var M=E,k=T;return E=T=void 0,d=g,s=u.apply(k,M),s}function ee(g){return d=g,c=setTimeout(K,h),N?B(g):s}function te(g){var M=g-m,k=g-d,H=h-M;return S?I(H,O-k):H}function U(g){var M=g-m,k=g-d;return m===void 0||M>=h||M<0||S&&k>=O}function K(){var g=L();if(U(g))return G(g);c=setTimeout(K,te(g))}function G(g){return c=void 0,J&&E?B(g):(E=T=void 0,s)}function ne(){c!==void 0&&clearTimeout(c),d=0,E=m=T=c=void 0}function se(){return c===void 0?s:G(L())}function z(){var g=L(),M=U(g);if(E=arguments,T=this,m=g,M){if(c===void 0)return ee(m);if(S)return c=setTimeout(K,h),B(m)}return c===void 0&&(c=setTimeout(K,h)),s}return z.cancel=ne,z.flush=se,z}function P(u){var h=typeof u;return!!u&&(h=="object"||h=="function")}function _(u){return!!u&&typeof u=="object"}function F(u){return typeof u=="symbol"||_(u)&&j.call(u)==r}function $(u){if(typeof u=="number")return u;if(F(u))return o;if(P(u)){var h=typeof u.valueOf=="function"?u.valueOf():u;u=P(h)?h+"":h}if(typeof u!="string")return u===0?u:+u;u=u.replace(n,"");var C=a.test(u);return C||l.test(u)?f(u.slice(2),C?2:8):i.test(u)?o:+u}return q=V,q}var be=xe();const ve=re(be),ye=ce((e,o)=>({editors:new Map,activeEditorName:null,registerEditor:(r,n,i)=>{e(a=>{const l=new Map(a.editors);return l.set(r,{editor:n,monaco:i,documentName:r}),{editors:l}})},unregisterEditor:r=>{e(n=>{const i=new Map(n.editors);return i.delete(r),{editors:i,activeEditorName:n.activeEditorName===r?null:n.activeEditorName}})},setActiveEditor:r=>{e({activeEditorName:r})},getActiveEditor:()=>{const r=o();return r.activeEditorName&&r.editors.get(r.activeEditorName)||null},getEditor:r=>o().editors.get(r)||null}));function Y(e,o){if(!e||!o)return null;const r=e.getModel();if(!r)return null;const n=e.getSelection();if(!n)return null;const a=r.getValueInRange(n)||je(e);if(!a)return null;const l=r.getValue();let f=null,x=!1;try{f=JSON.parse(l),x=!0}catch{}const v=x?Ce(l,n.startLineNumber,n.startColumn):void 0,b=we(l,n.startLineNumber,n.startColumn);return{selectedText:a,jsonPath:v,propertyKey:b,fullDocument:f,isValidJson:x,startLine:n.startLineNumber,endLine:n.endLineNumber}}function je(e,o){const r=e.getModel(),n=e.getPosition();if(!r||!n)return"";const i=r.getWordAtPosition(n);return i?r.getValueInRange({startLineNumber:n.lineNumber,startColumn:i.startColumn,endLineNumber:n.lineNumber,endColumn:i.endColumn}):""}function Ce(e,o,r){var n;try{const i=e.split(`
|
|
2
|
+
`),a=[];let l=0,f=!1,x=0;for(let v=0;v<Math.min(o,i.length);v++){const b=i[v];for(let j=0;j<b.length;j++){const w=b[j];if(v===o-1&&j>=r)break;w==="{"?l++:w==="}"?(l--,a.length>l&&a.pop()):w==="["?(f=!0,x=0):w==="]"?(f=!1,(n=a[a.length-1])!=null&&n.match(/\[\d+\]$/)&&a.pop()):w===","&&f&&x++}const p=b.match(/^\s*"([^"]+)"\s*:/);if(p){for(;a.length>=l;)a.pop();f?a.push(`${p[1]}[${x}]`):a.push(p[1])}}return a.length>0?a.join("."):void 0}catch{return}}function we(e,o,r){try{const n=e.split(`
|
|
3
|
+
`);if(o>n.length)return;const a=n[o-1].match(/^\s*"([^"]+)"\s*:/);if(a)return a[1];for(let l=o-2;l>=0;l--){const f=n[l],x=f.match(/^\s*"([^"]+)"\s*:/);if(x)return x[1];if(f.includes("}"))break}return}catch{return}}function Ne(e,o){if(!e||!o)return;const r=o.split(".");let n=e;for(const i of r){if(!n)return;const a=i.match(/^([^[]+)\[(\d+)\]$/);if(a){const[,l,f]=a;if(n=n[l],Array.isArray(n))n=n[parseInt(f,10)];else return}else n=n[i]}return n}function Z(e){const o=[];if(e.jsonPath&&o.push(`JSON Path: ${e.jsonPath}`),e.selectedText.length>500?o.push(`Selected Text (truncated): ${e.selectedText.substring(0,500)}...`):o.push(`Selected Text: ${e.selectedText}`),e.isValidJson&&e.fullDocument&&e.jsonPath){const r=Ne(e.fullDocument,e.jsonPath);if(r!==void 0){const n=JSON.stringify(r,null,2);n.length>500?o.push(`Context Value (truncated): ${n.substring(0,500)}...`):o.push(`Context Value: ${n}`)}}return o.join(`
|
|
4
|
+
`)}function Ee({errors:e,onErrorClick:o,onClose:r,className:n,isMinimized:i=!1,onToggleMinimize:a}){const[l,f]=y.useState(!i);y.useEffect(()=>{f(!i)},[i]);const x=e.length>0,v=e.length;if(!x)return null;const b=()=>{f(!l),a==null||a()};return t.jsxs("div",{className:D("absolute bottom-0 left-0 right-0 z-50 bg-background border-t shadow-lg transition-all duration-200",l?"h-48":"h-10",n),children:[t.jsxs("div",{className:D("flex items-center justify-between px-3 py-2 cursor-pointer","bg-destructive/10 border-b border-destructive/20","hover:bg-destructive/15 transition-colors"),onClick:b,children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(W,{className:"w-4 h-4 text-destructive"}),t.jsxs("span",{className:"text-sm font-medium text-destructive",children:[v," Validation Error",v!==1?"s":""]})]}),t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx(Se,{errors:e}),t.jsx("button",{onClick:p=>{p.stopPropagation(),b()},className:"p-1 hover:bg-destructive/20 rounded transition-colors","aria-label":l?"Minimize":"Expand",children:l?t.jsx(de,{className:"w-4 h-4"}):t.jsx(fe,{className:"w-4 h-4"})}),r&&t.jsx("button",{onClick:p=>{p.stopPropagation(),r()},className:"p-1 hover:bg-destructive/20 rounded transition-colors","aria-label":"Close validation panel",children:t.jsx(me,{className:"w-4 h-4"})})]})]}),l&&t.jsx("div",{className:"overflow-y-auto h-[calc(100%-2.5rem)]",children:t.jsx("div",{className:"divide-y divide-border/50",children:e.map((p,j)=>t.jsx(Me,{error:p,onClick:()=>o==null?void 0:o(p)},`${p.path}-${j}`))})})]})}function Se({errors:e}){const[o,r]=y.useState(!1),n=i=>{i.stopPropagation();const a=e.map(l=>`${l.startLineNumber&&l.startColumn?`Line ${l.startLineNumber}:${l.startColumn}`:"Unknown location"} — ${l.message}`).join(`
|
|
5
|
+
`);navigator.clipboard.writeText(a).then(()=>{r(!0),setTimeout(()=>r(!1),2e3)})};return t.jsx("button",{onClick:n,className:D("flex items-center gap-1 px-1.5 py-1 rounded transition-all duration-200 cursor-pointer",o?"bg-green-500/15 text-green-500":"hover:bg-destructive/20"),"aria-label":"Copy all errors",children:o?t.jsxs(t.Fragment,{children:[t.jsx(he,{className:"w-3.5 h-3.5"}),t.jsx("span",{className:"text-xs font-medium",children:"Copied"})]}):t.jsx(ge,{className:"w-4 h-4"})})}function Me({error:e,onClick:o}){const r=i=>{switch(i){case"error":return t.jsx(W,{className:"w-4 h-4 text-destructive flex-shrink-0"});case"warning":return t.jsx(pe,{className:"w-4 h-4 text-yellow-500 flex-shrink-0"});default:return t.jsx(W,{className:"w-4 h-4 text-blue-500 flex-shrink-0"})}},n=i=>i?i.replace(/^\//,"").replace(/\//g," → "):"Document root";return t.jsx("div",{className:D("px-3 py-2 hover:bg-muted/50 cursor-pointer transition-colors","group"),onClick:o,children:t.jsxs("div",{className:"flex items-start gap-2",children:[r(e.severity),t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[t.jsx("span",{className:"text-xs font-mono text-muted-foreground",children:e.startLineNumber&&e.startColumn?`Line ${e.startLineNumber}:${e.startColumn}`:"Unknown location"}),e.path&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"text-xs text-muted-foreground",children:"•"}),t.jsx("span",{className:"text-xs text-muted-foreground truncate",children:n(e.path)})]})]}),t.jsx("p",{className:"text-sm text-foreground",children:e.message}),e.code&&e.code!=="validation_error"&&t.jsxs("span",{className:"text-xs text-muted-foreground font-mono mt-1 inline-block",children:["Code: ",e.code]})]})]})})}function Le({errors:e,onClick:o,className:r}){if(e.length!==0)return t.jsxs("div",{className:D("flex items-center gap-2 px-2 py-1 text-xs cursor-pointer","bg-destructive/10 text-destructive hover:bg-destructive/15 transition-colors",r),onClick:o,children:[t.jsx(W,{className:"w-3 h-3"}),t.jsxs("span",{children:[e.length," error",e.length!==1?"s":""]})]})}function Pe({name:e,defaultValue:o,value:r,saveDocumentDebounceWait:n}){console.debug(`Render EditorMonacoJson (name: ${e})`);const i=y.useRef(null),a=y.useRef(null),{resolvedTheme:l}=ie(),f=R(s=>s.saveDocument),x=ue(s=>s.bumpEditSequence),v=R(s=>s.closeDocument),b=R(s=>s.pendingDiffs[e]),p=R(s=>s.clearPendingDiff),[j,w]=y.useState([]),[I,L]=y.useState(!0),[V,P]=y.useState(!1),_=y.useRef([]),{registerEditor:F,unregisterEditor:$,setActiveEditor:u}=ye(),h=y.useRef(ve(f,n)),C=y.useCallback(s=>{console.debug("Setting up Monaco for JSON editor")},[]);function E(s,c){console.debug(`EditorDidMount: (name: ${e})`),i.current=s,a.current=c,F(e,s,c),u(e);const m=s.getModel();m&&(c.editor.setModelLanguage(m,"json"),console.debug("Model language set to JSON for:",m.uri.toString())),s.addAction({id:"send-to-ai-assistant",label:"Send to AI Assistant (⌘K)",contextMenuGroupId:"navigation",contextMenuOrder:1.5,keybindings:[c.KeyMod.CtrlCmd|c.KeyCode.KeyK],run:function(){const d=Y(s,c);if(d){const N=Z(d);window.dispatchEvent(new CustomEvent("monaco-selection-to-ai",{detail:{documentName:e,selection:d,snippet:N}}))}}}),s.addCommand(c.KeyMod.CtrlCmd|c.KeyCode.KeyK,()=>{const d=Y(s,c);if(d){const N=Z(d);window.dispatchEvent(new CustomEvent("monaco-selection-to-ai",{detail:{documentName:e,selection:d,snippet:N}}))}}),s.addCommand(c.KeyMod.CtrlCmd|c.KeyCode.KeyS,()=>{const d=s.getValue();d&&f(e,d)}),s.addCommand(c.KeyMod.CtrlCmd|c.KeyCode.KeyW,()=>{const d=s.getValue();d&&f(e,d),v(e)}),s.addCommand(c.KeyMod.Shift|c.KeyMod.Alt|c.KeyCode.KeyF,()=>{var d;(d=s.getAction("editor.action.formatDocument"))==null||d.run()})}function T(s){console.debug("Monaco validation markers:",s);const c=s.map(m=>{var d,N,S;return{path:"",message:m.message,code:typeof m.code=="string"?m.code:((d=m.code)==null?void 0:d.value)||"validation_error",startLineNumber:m.startLineNumber,startColumn:m.startColumn,endLineNumber:m.endLineNumber,endColumn:m.endColumn,severity:m.severity===((N=a.current)==null?void 0:N.MarkerSeverity.Error)?"error":m.severity===((S=a.current)==null?void 0:S.MarkerSeverity.Warning)?"warning":"info"}});w(c),_.current=[],c.length>0&&!I&&(L(!0),P(!1))}y.useEffect(()=>{const s=h==null?void 0:h.current;return()=>{s==null||s.flush(),$(e),console.debug(`EditorWillUnMount: (name: ${e})`)}},[e,$]);const O=y.useCallback(s=>{i.current&&s.startLineNumber&&s.startColumn&&(i.current.setPosition({lineNumber:s.startLineNumber,column:s.startColumn}),i.current.revealLineInCenter(s.startLineNumber),i.current.focus())},[]);return t.jsxs("div",{className:"relative h-full",children:[b?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"flex items-center justify-between px-2 py-1 border-b bg-muted/40 text-xs",children:[t.jsxs("div",{children:["Review changes for ",t.jsx("span",{className:"font-medium",children:e})]}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx(Q,{variant:"secondary",size:"sm",onClick:()=>p(e),children:"Discard"}),t.jsx(Q,{size:"sm",onClick:()=>{f(e,b.modified),p(e,!0)},children:"Apply Changes"})]})]}),t.jsx(le,{height:"calc(100% - 32px)",original:b.original,modified:b.modified,language:"json",theme:`vs-${l}`,options:{readOnly:!0,renderSideBySide:!0,originalEditable:!1,automaticLayout:!0,minimap:{enabled:!1}},beforeMount:C})]}):t.jsx(ae,{height:"100%",defaultLanguage:"json",theme:`vs-${l}`,defaultPath:e.endsWith(".json")?e:`${e}.json`,value:r??o,beforeMount:C,onMount:E,onValidate:T,onChange:s=>{s&&(x(),h.current(e,s))},options:{minimap:{enabled:!0},scrollBeyondLastLine:!0,wordWrap:"on",automaticLayout:!0,formatOnPaste:!0,formatOnType:!0,tabSize:2,insertSpaces:!0,detectIndentation:!1,folding:!0,foldingStrategy:"indentation",showFoldingControls:"always",bracketPairColorization:{enabled:!0},guides:{bracketPairs:!0,indentation:!0},suggest:{showProperties:!0,showMethods:!0,showFunctions:!0,showConstructors:!0,showDeprecated:!0,showFields:!0,showVariables:!0,showClasses:!0,showStructs:!0,showInterfaces:!0,showModules:!0,showTypeParameters:!0,showValues:!0,showConstants:!0,showEnums:!0,showEnumMembers:!0,showKeywords:!0,showWords:!1,showColors:!0,showFiles:!1,showReferences:!0,showFolders:!1,showOperators:!0,showUnits:!0,showSnippets:!0,snippetsPreventQuickSuggestions:!1,insertMode:"insert",filterGraceful:!0,localityBonus:!0,shareSuggestSelections:!0,showIcons:!0},quickSuggestions:{strings:!0,comments:!1,other:!0},quickSuggestionsDelay:10,suggestSelection:"first",suggestOnTriggerCharacters:!0,acceptSuggestionOnEnter:"on",acceptSuggestionOnCommitCharacter:!0,wordBasedSuggestions:"off",parameterHints:{enabled:!0,cycle:!0},hover:{enabled:!0,delay:300,sticky:!0},tabCompletion:"on",snippetSuggestions:"inline",inlineSuggest:{enabled:!0}}}),t.jsx("div",{className:"absolute top-0 right-0",children:t.jsx(Le,{errors:j,onClick:()=>{L(!0),P(!1)}})}),I&&j.length>0&&t.jsx(Ee,{errors:j,isMinimized:V,onToggleMinimize:()=>P(!V),onErrorClick:O,onClose:()=>L(!1),className:"z-40"})]})}const Te=oe.memo(Pe,(e,o)=>e.name===o.name&&e.value===o.value&&e.saveDocumentDebounceWait===o.saveDocumentDebounceWait),Re=Object.freeze(Object.defineProperty({__proto__:null,EditorMonacoJsonMemoized:Te},Symbol.toStringTag,{value:"Module"}));export{Te as E,Z as c,ve as d,Re as e,Y as g,ye as u};
|
|
6
|
+
//# sourceMappingURL=editor-monaco-json-BrfKPhHP.js.map
|
package/dist/client/assets/{editor-monaco-json-DHRbpQ-v.js.map → editor-monaco-json-BrfKPhHP.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-monaco-json-DHRbpQ-v.js","sources":["../../../../../node_modules/.pnpm/lodash.debounce@4.0.8/node_modules/lodash.debounce/index.js","../../../src/client/store/editor-refs-store.ts","../../../src/client/lib/monaco-selection-utils.ts","../../../src/client/components/json-editor/validation-panel.tsx","../../../src/client/components/json-editor/editor-monaco-json.tsx"],"sourcesContent":["/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","/**\n * Editor References Store\n * Manages references to Monaco editor instances for selection context\n */\n\nimport { create } from 'zustand';\nimport type { editor as MonacoEditorType } from 'monaco-editor';\nimport type { Monaco } from '@monaco-editor/react';\n\nexport interface EditorReference {\n editor: MonacoEditorType.IStandaloneCodeEditor;\n monaco: Monaco;\n documentName: string;\n}\n\ninterface EditorRefsState {\n editors: Map<string, EditorReference>;\n activeEditorName: string | null;\n}\n\ninterface EditorRefsActions {\n registerEditor: (\n documentName: string,\n editor: MonacoEditorType.IStandaloneCodeEditor,\n monaco: Monaco\n ) => void;\n unregisterEditor: (documentName: string) => void;\n setActiveEditor: (documentName: string | null) => void;\n getActiveEditor: () => EditorReference | null;\n getEditor: (documentName: string) => EditorReference | null;\n}\n\nexport type EditorRefsStore = EditorRefsState & EditorRefsActions;\n\nexport const useEditorRefsStore = create<EditorRefsStore>((set, get) => ({\n editors: new Map(),\n activeEditorName: null,\n\n registerEditor: (documentName, editor, monaco) => {\n set((state) => {\n const newEditors = new Map(state.editors);\n newEditors.set(documentName, { editor, monaco, documentName });\n return { editors: newEditors };\n });\n },\n\n unregisterEditor: (documentName) => {\n set((state) => {\n const newEditors = new Map(state.editors);\n newEditors.delete(documentName);\n return {\n editors: newEditors,\n activeEditorName:\n state.activeEditorName === documentName\n ? null\n : state.activeEditorName,\n };\n });\n },\n\n setActiveEditor: (documentName) => {\n set({ activeEditorName: documentName });\n },\n\n getActiveEditor: () => {\n const state = get();\n if (!state.activeEditorName) return null;\n return state.editors.get(state.activeEditorName) || null;\n },\n\n getEditor: (documentName) => {\n return get().editors.get(documentName) || null;\n },\n}));\n","/**\n * Monaco Editor Selection Utilities\n * Provides functionality to extract selected text and JSON paths from Monaco editor instances\n */\n\nimport type { editor as MonacoEditorType } from 'monaco-editor';\nimport type { Monaco } from '@monaco-editor/react';\n\nexport interface SelectionContext {\n selectedText: string;\n jsonPath?: string;\n propertyKey?: string;\n fullDocument?: any;\n isValidJson: boolean;\n startLine: number;\n endLine: number;\n}\n\n/**\n * Get the current selection context from a Monaco editor instance\n */\nexport function getSelectionContext(\n editor: MonacoEditorType.IStandaloneCodeEditor,\n monaco: Monaco\n): SelectionContext | null {\n if (!editor || !monaco) {\n return null;\n }\n\n const model = editor.getModel();\n if (!model) {\n return null;\n }\n\n const selection = editor.getSelection();\n if (!selection) {\n return null;\n }\n\n // Get selected text\n const selectedText = model.getValueInRange(selection);\n\n // If no text is selected, get the word at cursor position\n const finalText = selectedText || getWordAtCursor(editor, monaco);\n\n if (!finalText) {\n return null;\n }\n\n // Get the full document text\n const fullDocumentText = model.getValue();\n let fullDocument: any = null;\n let isValidJson = false;\n\n try {\n fullDocument = JSON.parse(fullDocumentText);\n isValidJson = true;\n } catch {\n // Document is not valid JSON\n }\n\n // Try to determine the JSON path\n const jsonPath = isValidJson\n ? getJsonPathAtPosition(\n fullDocumentText,\n selection.startLineNumber,\n selection.startColumn\n )\n : undefined;\n\n // Extract property key if we're selecting a property value\n const propertyKey = extractPropertyKey(\n fullDocumentText,\n selection.startLineNumber,\n selection.startColumn\n );\n\n return {\n selectedText: finalText,\n jsonPath,\n propertyKey,\n fullDocument,\n isValidJson,\n startLine: selection.startLineNumber,\n endLine: selection.endLineNumber,\n };\n}\n\n/**\n * Get the word at the current cursor position\n */\nfunction getWordAtCursor(\n editor: MonacoEditorType.IStandaloneCodeEditor,\n _monaco: Monaco\n): string {\n const model = editor.getModel();\n const position = editor.getPosition();\n\n if (!model || !position) {\n return '';\n }\n\n const word = model.getWordAtPosition(position);\n if (word) {\n return model.getValueInRange({\n startLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endLineNumber: position.lineNumber,\n endColumn: word.endColumn,\n });\n }\n\n return '';\n}\n\n/**\n * Determine the JSON path at a specific position in the document\n */\nfunction getJsonPathAtPosition(\n documentText: string,\n lineNumber: number,\n column: number\n): string | undefined {\n try {\n // Split document into lines\n const lines = documentText.split('\\n');\n\n // Build a path by analyzing the nesting level\n const path: string[] = [];\n let depth = 0;\n let inArray = false;\n let arrayIndex = 0;\n\n for (let i = 0; i < Math.min(lineNumber, lines.length); i++) {\n const line = lines[i];\n\n // Count braces and brackets to track nesting\n for (let j = 0; j < line.length; j++) {\n const char = line[j];\n\n if (i === lineNumber - 1 && j >= column) {\n // We've reached the target position\n break;\n }\n\n if (char === '{') {\n depth++;\n } else if (char === '}') {\n depth--;\n if (path.length > depth) {\n path.pop();\n }\n } else if (char === '[') {\n inArray = true;\n arrayIndex = 0;\n } else if (char === ']') {\n inArray = false;\n if (path[path.length - 1]?.match(/\\[\\d+\\]$/)) {\n path.pop();\n }\n } else if (char === ',' && inArray) {\n arrayIndex++;\n }\n }\n\n // Try to extract property names from the line\n const propertyMatch = line.match(/^\\s*\"([^\"]+)\"\\s*:/);\n if (propertyMatch) {\n // Adjust path length to current depth\n while (path.length >= depth) {\n path.pop();\n }\n\n if (inArray) {\n path.push(`${propertyMatch[1]}[${arrayIndex}]`);\n } else {\n path.push(propertyMatch[1]);\n }\n }\n }\n\n return path.length > 0 ? path.join('.') : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Extract the property key at a specific position\n */\nfunction extractPropertyKey(\n documentText: string,\n lineNumber: number,\n _column: number\n): string | undefined {\n try {\n const lines = documentText.split('\\n');\n if (lineNumber > lines.length) {\n return undefined;\n }\n\n const line = lines[lineNumber - 1];\n\n // Look for a property key on the same line\n const propertyMatch = line.match(/^\\s*\"([^\"]+)\"\\s*:/);\n if (propertyMatch) {\n return propertyMatch[1];\n }\n\n // Look backwards for the nearest property key\n for (let i = lineNumber - 2; i >= 0; i--) {\n const prevLine = lines[i];\n const prevMatch = prevLine.match(/^\\s*\"([^\"]+)\"\\s*:/);\n if (prevMatch) {\n // Check if this property's value extends to our line\n // This is a simplified check - more complex logic might be needed\n return prevMatch[1];\n }\n\n // Stop if we hit a closing brace (end of object)\n if (prevLine.includes('}')) {\n break;\n }\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Format a selection context for display\n */\nexport function formatSelectionContext(context: SelectionContext): string {\n const parts: string[] = [];\n\n if (context.jsonPath) {\n parts.push(`Path: ${context.jsonPath}`);\n }\n\n if (context.propertyKey) {\n parts.push(`Property: ${context.propertyKey}`);\n }\n\n parts.push(`Lines: ${context.startLine}-${context.endLine}`);\n\n return parts.join(' | ');\n}\n\n/**\n * Extract a JSON subtree from a path\n */\nexport function extractJsonSubtree(obj: any, path: string): any {\n if (!obj || !path) {\n return undefined;\n }\n\n const parts = path.split('.');\n let current = obj;\n\n for (const part of parts) {\n if (!current) {\n return undefined;\n }\n\n // Handle array notation like \"items[0]\"\n const arrayMatch = part.match(/^([^[]+)\\[(\\d+)\\]$/);\n if (arrayMatch) {\n const [, key, index] = arrayMatch;\n current = current[key];\n if (Array.isArray(current)) {\n current = current[parseInt(index, 10)];\n } else {\n return undefined;\n }\n } else {\n current = current[part];\n }\n }\n\n return current;\n}\n\n/**\n * Create a context snippet for AI\n */\nexport function createContextSnippet(context: SelectionContext): string {\n const lines: string[] = [];\n\n if (context.jsonPath) {\n lines.push(`JSON Path: ${context.jsonPath}`);\n }\n\n if (context.selectedText.length > 500) {\n lines.push(\n `Selected Text (truncated): ${context.selectedText.substring(0, 500)}...`\n );\n } else {\n lines.push(`Selected Text: ${context.selectedText}`);\n }\n\n if (context.isValidJson && context.fullDocument && context.jsonPath) {\n const subtree = extractJsonSubtree(context.fullDocument, context.jsonPath);\n if (subtree !== undefined) {\n const subtreeStr = JSON.stringify(subtree, null, 2);\n if (subtreeStr.length > 500) {\n lines.push(\n `Context Value (truncated): ${subtreeStr.substring(0, 500)}...`\n );\n } else {\n lines.push(`Context Value: ${subtreeStr}`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n","import React, { useState, useEffect } from 'react';\nimport {\n AlertCircle,\n ChevronDown,\n ChevronUp,\n X,\n AlertTriangle,\n Copy,\n Check,\n} from 'lucide-react';\nimport { cn } from '../../lib/utils';\nimport type { JsonEditorError } from '../../lib/json-types';\n\ninterface ValidationPanelProps {\n errors: JsonEditorError[];\n onErrorClick?: (error: JsonEditorError) => void;\n onClose?: () => void;\n className?: string;\n isMinimized?: boolean;\n onToggleMinimize?: () => void;\n}\n\nexport function ValidationPanel({\n errors,\n onErrorClick,\n onClose,\n className,\n isMinimized = false,\n onToggleMinimize,\n}: ValidationPanelProps) {\n const [isExpanded, setIsExpanded] = useState(!isMinimized);\n\n useEffect(() => {\n setIsExpanded(!isMinimized);\n }, [isMinimized]);\n\n const hasErrors = errors.length > 0;\n const errorCount = errors.length;\n\n if (!hasErrors) return null;\n\n const toggleExpanded = () => {\n const newExpanded = !isExpanded;\n setIsExpanded(newExpanded);\n onToggleMinimize?.();\n };\n\n return (\n <div\n className={cn(\n 'absolute bottom-0 left-0 right-0 z-50 bg-background border-t shadow-lg transition-all duration-200',\n isExpanded ? 'h-48' : 'h-10',\n className\n )}\n >\n {/* Header Bar */}\n <div\n className={cn(\n 'flex items-center justify-between px-3 py-2 cursor-pointer',\n 'bg-destructive/10 border-b border-destructive/20',\n 'hover:bg-destructive/15 transition-colors'\n )}\n onClick={toggleExpanded}\n >\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"w-4 h-4 text-destructive\" />\n <span className=\"text-sm font-medium text-destructive\">\n {errorCount} Validation Error{errorCount !== 1 ? 's' : ''}\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n <CopyErrorsButton errors={errors} />\n <button\n onClick={(e) => {\n e.stopPropagation();\n toggleExpanded();\n }}\n className=\"p-1 hover:bg-destructive/20 rounded transition-colors\"\n aria-label={isExpanded ? 'Minimize' : 'Expand'}\n >\n {isExpanded ? (\n <ChevronDown className=\"w-4 h-4\" />\n ) : (\n <ChevronUp className=\"w-4 h-4\" />\n )}\n </button>\n {onClose && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n className=\"p-1 hover:bg-destructive/20 rounded transition-colors\"\n aria-label=\"Close validation panel\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Error List */}\n {isExpanded && (\n <div className=\"overflow-y-auto h-[calc(100%-2.5rem)]\">\n <div className=\"divide-y divide-border/50\">\n {errors.map((error, index) => (\n <ErrorItem\n key={`${error.path}-${index}`}\n error={error}\n onClick={() => onErrorClick?.(error)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction CopyErrorsButton({ errors }: { errors: JsonEditorError[] }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n const text = errors\n .map((err) => {\n const loc =\n err.startLineNumber && err.startColumn\n ? `Line ${err.startLineNumber}:${err.startColumn}`\n : 'Unknown location';\n return `${loc} — ${err.message}`;\n })\n .join('\\n');\n navigator.clipboard.writeText(text).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n\n return (\n <button\n onClick={handleCopy}\n className={cn(\n 'flex items-center gap-1 px-1.5 py-1 rounded transition-all duration-200 cursor-pointer',\n copied\n ? 'bg-green-500/15 text-green-500'\n : 'hover:bg-destructive/20'\n )}\n aria-label=\"Copy all errors\"\n >\n {copied ? (\n <>\n <Check className=\"w-3.5 h-3.5\" />\n <span className=\"text-xs font-medium\">Copied</span>\n </>\n ) : (\n <Copy className=\"w-4 h-4\" />\n )}\n </button>\n );\n}\n\ninterface ErrorItemProps {\n error: JsonEditorError;\n onClick?: () => void;\n}\n\nfunction ErrorItem({ error, onClick }: ErrorItemProps) {\n const getSeverityIcon = (severity: string) => {\n switch (severity) {\n case 'error':\n return (\n <AlertCircle className=\"w-4 h-4 text-destructive flex-shrink-0\" />\n );\n case 'warning':\n return (\n <AlertTriangle className=\"w-4 h-4 text-yellow-500 flex-shrink-0\" />\n );\n default:\n return <AlertCircle className=\"w-4 h-4 text-blue-500 flex-shrink-0\" />;\n }\n };\n\n const formatPath = (path: string) => {\n if (!path) return 'Document root';\n // Remove leading slash and format nicely\n return path.replace(/^\\//, '').replace(/\\//g, ' → ');\n };\n\n return (\n <div\n className={cn(\n 'px-3 py-2 hover:bg-muted/50 cursor-pointer transition-colors',\n 'group'\n )}\n onClick={onClick}\n >\n <div className=\"flex items-start gap-2\">\n {getSeverityIcon(error.severity)}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"text-xs font-mono text-muted-foreground\">\n {error.startLineNumber && error.startColumn\n ? `Line ${error.startLineNumber}:${error.startColumn}`\n : 'Unknown location'}\n </span>\n {error.path && (\n <>\n <span className=\"text-xs text-muted-foreground\">•</span>\n <span className=\"text-xs text-muted-foreground truncate\">\n {formatPath(error.path)}\n </span>\n </>\n )}\n </div>\n <p className=\"text-sm text-foreground\">{error.message}</p>\n {error.code && error.code !== 'validation_error' && (\n <span className=\"text-xs text-muted-foreground font-mono mt-1 inline-block\">\n Code: {error.code}\n </span>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// Status bar component for minimal error display\nexport function ValidationStatusBar({\n errors,\n onClick,\n className,\n}: {\n errors: JsonEditorError[];\n onClick?: () => void;\n className?: string;\n}) {\n if (errors.length !== 0) {\n return (\n <div\n className={cn(\n 'flex items-center gap-2 px-2 py-1 text-xs cursor-pointer',\n 'bg-destructive/10 text-destructive hover:bg-destructive/15 transition-colors',\n className\n )}\n onClick={onClick}\n >\n <AlertCircle className=\"w-3 h-3\" />\n <span>\n {errors.length} error{errors.length !== 1 ? 's' : ''}\n </span>\n </div>\n );\n }\n}\n","import React, { useRef, useEffect, useState, useCallback } from 'react';\nimport { useTheme } from '../theme-provider';\nimport Editor, { Monaco, DiffEditor } from '@monaco-editor/react';\nimport debounce from 'lodash.debounce';\nimport type { editor } from 'monaco-editor';\nimport { useDocumentsStore } from '../../store/documents-store-provider';\nimport { useOutputStore } from '../../store/output-store-provider';\nimport { Button } from '../ui/button';\nimport { type JsonEditorError } from '../../lib/json-types';\nimport { configureMonacoInstance } from '../../lib/monaco-config';\nimport { useEditorRefsStore } from '../../store/editor-refs-store';\nimport {\n getSelectionContext,\n createContextSnippet,\n} from '../../lib/monaco-selection-utils';\nimport { ValidationPanel, ValidationStatusBar } from './validation-panel';\n\ninterface EditorMonacoJsonProps {\n name: string;\n defaultValue?: string;\n value?: string; // when provided, the editor becomes controlled\n saveDocumentDebounceWait: number;\n}\n\nfunction EditorMonacoJson({\n name,\n defaultValue,\n value,\n saveDocumentDebounceWait,\n}: EditorMonacoJsonProps) {\n console.debug(`Render EditorMonacoJson (name: ${name})`);\n\n const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null);\n const monacoRef = useRef<Monaco | null>(null);\n const { resolvedTheme } = useTheme();\n const saveDocument = useDocumentsStore((state) => state.saveDocument);\n const bumpEditSequence = useOutputStore((state) => state.bumpEditSequence);\n const closeDocument = useDocumentsStore((state) => state.closeDocument);\n const pendingDiff = useDocumentsStore((state) => state.pendingDiffs[name]);\n const clearPendingDiff = useDocumentsStore((state) => state.clearPendingDiff);\n const [validationErrors, setValidationErrors] = useState<JsonEditorError[]>(\n []\n );\n const [showValidationPanel, setShowValidationPanel] = useState(true);\n const [isValidationPanelMinimized, setIsValidationPanelMinimized] =\n useState(false);\n const decorationIdsRef = useRef<string[]>([]);\n const { registerEditor, unregisterEditor, setActiveEditor } =\n useEditorRefsStore();\n\n const debouncedSaveDocumentRef = useRef(\n debounce(saveDocument, saveDocumentDebounceWait)\n );\n\n // Setup Monaco editor for JSON with schema validation\n const handleEditorWillMount = useCallback((monaco: Monaco) => {\n console.debug('Setting up Monaco for JSON editor');\n\n // Enhanced error styles removed - using Monaco's native styling\n\n // Ensure Monaco is configured with schemas\n configureMonacoInstance(monaco);\n }, []);\n\n function handleEditorDidMount(\n editor: editor.IStandaloneCodeEditor,\n monaco: Monaco\n ) {\n console.debug(`EditorDidMount: (name: ${name})`);\n editorRef.current = editor;\n monacoRef.current = monaco;\n\n // Register editor in the refs store\n registerEditor(name, editor, monaco);\n setActiveEditor(name);\n\n // Ensure the model's language is set to JSON for schema validation\n const model = editor.getModel();\n if (model) {\n monaco.editor.setModelLanguage(model, 'json');\n console.debug('Model language set to JSON for:', model.uri.toString());\n }\n\n // Add context menu action for AI assistant\n editor.addAction({\n id: 'send-to-ai-assistant',\n label: 'Send to AI Assistant (⌘K)',\n contextMenuGroupId: 'navigation',\n contextMenuOrder: 1.5,\n keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK],\n run: function () {\n // Use the editor reference from closure instead of the parameter\n const selection = getSelectionContext(editor, monaco);\n if (selection) {\n const snippet = createContextSnippet(selection);\n // Dispatch event for the chat panel to capture\n window.dispatchEvent(\n new CustomEvent('monaco-selection-to-ai', {\n detail: {\n documentName: name,\n selection,\n snippet,\n },\n })\n );\n }\n },\n });\n\n // Set up keyboard shortcuts\n // Cmd+K => send selection to AI assistant\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK, () => {\n const selection = getSelectionContext(editor, monaco);\n if (selection) {\n const snippet = createContextSnippet(selection);\n window.dispatchEvent(\n new CustomEvent('monaco-selection-to-ai', {\n detail: {\n documentName: name,\n selection,\n snippet,\n },\n })\n );\n }\n });\n\n // Cmd+S => save command\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => {\n const currentValue = editor.getValue();\n if (currentValue) saveDocument(name, currentValue);\n });\n\n // Cmd+W => close command\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyW, () => {\n const currentValue = editor.getValue();\n if (currentValue) saveDocument(name, currentValue);\n closeDocument(name);\n });\n\n // Format document shortcut (Shift+Alt+F)\n editor.addCommand(\n monaco.KeyMod.Shift | monaco.KeyMod.Alt | monaco.KeyCode.KeyF,\n () => {\n editor.getAction('editor.action.formatDocument')?.run();\n }\n );\n\n // Initial validation will be handled by Monaco's onValidate\n }\n\n function handleEditorValidation(markers: editor.IMarker[]) {\n // Convert Monaco's native JSON validation markers to our error format\n console.debug('Monaco validation markers:', markers);\n\n const errors: JsonEditorError[] = markers.map((marker) => ({\n path: '', // Monaco doesn't provide JSON path, but we don't need it for display\n message: marker.message,\n code:\n typeof marker.code === 'string'\n ? marker.code\n : marker.code?.value || 'validation_error',\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n severity:\n marker.severity === monacoRef.current?.MarkerSeverity.Error\n ? 'error'\n : marker.severity === monacoRef.current?.MarkerSeverity.Warning\n ? 'warning'\n : 'info',\n }));\n\n setValidationErrors(errors);\n\n // Decorations are now handled by Monaco's native validation\n decorationIdsRef.current = [];\n\n // Show validation panel if there are errors\n if (errors.length > 0 && !showValidationPanel) {\n setShowValidationPanel(true);\n setIsValidationPanelMinimized(false);\n }\n }\n\n // Cancel debounced saveDocument on unmount and unregister editor\n useEffect(() => {\n const debouncedSaveDocument = debouncedSaveDocumentRef?.current;\n return () => {\n debouncedSaveDocument?.cancel();\n // Decorations cleanup handled by Monaco\n unregisterEditor(name);\n console.debug(`EditorWillUnMount: (name: ${name})`);\n };\n }, [name, unregisterEditor]);\n\n // Handle error click - navigate to error in editor\n const handleErrorClick = useCallback((error: JsonEditorError) => {\n if (editorRef.current && error.startLineNumber && error.startColumn) {\n // Navigate to error position\n editorRef.current.setPosition({\n lineNumber: error.startLineNumber,\n column: error.startColumn,\n });\n editorRef.current.revealLineInCenter(error.startLineNumber);\n editorRef.current.focus();\n }\n }, []);\n\n return (\n <div className=\"relative h-full\">\n {pendingDiff ? (\n <>\n <div className=\"flex items-center justify-between px-2 py-1 border-b bg-muted/40 text-xs\">\n <div>\n Review changes for <span className=\"font-medium\">{name}</span>\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => clearPendingDiff(name)}\n >\n Discard\n </Button>\n <Button\n size=\"sm\"\n onClick={() => {\n saveDocument(name, pendingDiff.modified);\n clearPendingDiff(name, true);\n }}\n >\n Apply Changes\n </Button>\n </div>\n </div>\n <DiffEditor\n height=\"calc(100% - 32px)\"\n original={pendingDiff.original}\n modified={pendingDiff.modified}\n language=\"json\"\n theme={`vs-${resolvedTheme}`}\n options={{\n readOnly: true,\n renderSideBySide: true,\n originalEditable: false,\n automaticLayout: true,\n minimap: { enabled: false },\n }}\n beforeMount={handleEditorWillMount}\n />\n </>\n ) : (\n <Editor\n height=\"100%\"\n defaultLanguage=\"json\"\n theme={`vs-${resolvedTheme}`}\n defaultPath={\n name.endsWith('.json') ? name : `${name}.json`\n }\n value={value ?? defaultValue}\n beforeMount={handleEditorWillMount}\n onMount={handleEditorDidMount}\n onValidate={handleEditorValidation}\n onChange={(value) => {\n if (value) {\n bumpEditSequence();\n debouncedSaveDocumentRef.current(name, value);\n }\n }}\n options={{\n minimap: { enabled: true },\n scrollBeyondLastLine: true,\n wordWrap: 'on',\n automaticLayout: true,\n formatOnPaste: true,\n formatOnType: true,\n tabSize: 2,\n insertSpaces: true,\n detectIndentation: false,\n folding: true,\n foldingStrategy: 'indentation',\n showFoldingControls: 'always',\n bracketPairColorization: { enabled: true },\n guides: {\n bracketPairs: true,\n indentation: true,\n },\n // Enhanced suggest options for better autocomplete\n suggest: {\n showProperties: true,\n showMethods: true,\n showFunctions: true,\n showConstructors: true,\n showDeprecated: true,\n showFields: true,\n showVariables: true,\n showClasses: true,\n showStructs: true,\n showInterfaces: true,\n showModules: true,\n showTypeParameters: true,\n showValues: true,\n showConstants: true,\n showEnums: true,\n showEnumMembers: true,\n showKeywords: true,\n showWords: false,\n showColors: true,\n showFiles: false,\n showReferences: true,\n showFolders: false,\n showOperators: true,\n showUnits: true,\n showSnippets: true,\n snippetsPreventQuickSuggestions: false,\n insertMode: 'insert', // Changed from 'replace' to 'insert' for better UX\n filterGraceful: true, // Allow fuzzy matching\n localityBonus: true, // Prioritize nearby suggestions\n shareSuggestSelections: true, // Share suggestions across files\n showIcons: true, // Show icons in suggestions\n },\n // Quick suggestions appear faster\n quickSuggestions: {\n strings: true,\n comments: false,\n other: true,\n },\n quickSuggestionsDelay: 10, // Faster suggestions\n suggestSelection: 'first',\n suggestOnTriggerCharacters: true,\n acceptSuggestionOnEnter: 'on',\n acceptSuggestionOnCommitCharacter: true,\n wordBasedSuggestions: 'off', // Disable word-based to rely on schema\n // IntelliSense features\n parameterHints: {\n enabled: true,\n cycle: true,\n },\n hover: {\n enabled: true,\n delay: 300,\n sticky: true,\n },\n // Better completion behavior\n tabCompletion: 'on',\n snippetSuggestions: 'inline',\n inlineSuggest: {\n enabled: true,\n },\n }}\n />\n )}\n\n {/* Validation Status Bar */}\n <div className=\"absolute top-0 right-0\">\n <ValidationStatusBar\n errors={validationErrors}\n onClick={() => {\n setShowValidationPanel(true);\n setIsValidationPanelMinimized(false);\n }}\n />\n </div>\n\n {/* Enhanced Validation Panel */}\n {showValidationPanel && validationErrors.length > 0 && (\n <ValidationPanel\n errors={validationErrors}\n isMinimized={isValidationPanelMinimized}\n onToggleMinimize={() =>\n setIsValidationPanelMinimized(!isValidationPanelMinimized)\n }\n onErrorClick={handleErrorClick}\n onClose={() => setShowValidationPanel(false)}\n className=\"z-40\"\n />\n )}\n </div>\n );\n}\n\nexport const EditorMonacoJsonMemoized = React.memo(\n EditorMonacoJson,\n (prev, next) => {\n return (\n prev.name === next.name &&\n prev.value === next.value &&\n prev.saveDocumentDebounceWait === next.saveDocumentDebounceWait\n );\n }\n);\n"],"names":["FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","freeGlobal","global","freeSelf","root","objectProto","objectToString","nativeMax","nativeMin","now","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","toNumber","isObject","invokeFunc","time","args","thisArg","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","value","type","isObjectLike","isSymbol","other","isBinary","lodash_debounce","useEditorRefsStore","create","set","get","documentName","editor","monaco","state","newEditors","getSelectionContext","model","selection","finalText","getWordAtCursor","fullDocumentText","fullDocument","isValidJson","jsonPath","getJsonPathAtPosition","propertyKey","extractPropertyKey","_monaco","position","word","documentText","lineNumber","column","lines","path","depth","inArray","arrayIndex","i","line","char","_a","propertyMatch","_column","prevLine","prevMatch","extractJsonSubtree","obj","parts","current","part","arrayMatch","key","index","createContextSnippet","context","subtree","subtreeStr","ValidationPanel","errors","onErrorClick","onClose","className","isMinimized","onToggleMinimize","isExpanded","setIsExpanded","useState","useEffect","hasErrors","errorCount","toggleExpanded","jsxs","cn","jsx","AlertCircle","CopyErrorsButton","e","ChevronDown","ChevronUp","X","error","ErrorItem","copied","setCopied","handleCopy","text","err","Fragment","Check","Copy","onClick","getSeverityIcon","severity","AlertTriangle","formatPath","ValidationStatusBar","EditorMonacoJson","name","defaultValue","saveDocumentDebounceWait","editorRef","useRef","monacoRef","resolvedTheme","useTheme","saveDocument","useDocumentsStore","bumpEditSequence","useOutputStore","closeDocument","pendingDiff","clearPendingDiff","validationErrors","setValidationErrors","showValidationPanel","setShowValidationPanel","isValidationPanelMinimized","setIsValidationPanelMinimized","decorationIdsRef","registerEditor","unregisterEditor","setActiveEditor","debouncedSaveDocumentRef","handleEditorWillMount","useCallback","configureMonacoInstance","handleEditorDidMount","snippet","currentValue","handleEditorValidation","markers","marker","_b","_c","debouncedSaveDocument","handleErrorClick","Button","DiffEditor","Editor","EditorMonacoJsonMemoized","React","prev","next"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"editor-monaco-json-BrfKPhHP.js","sources":["../../../../../node_modules/.pnpm/lodash.debounce@4.0.8/node_modules/lodash.debounce/index.js","../../../src/client/store/editor-refs-store.ts","../../../src/client/lib/monaco-selection-utils.ts","../../../src/client/components/json-editor/validation-panel.tsx","../../../src/client/components/json-editor/editor-monaco-json.tsx"],"sourcesContent":["/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","/**\n * Editor References Store\n * Manages references to Monaco editor instances for selection context\n */\n\nimport { create } from 'zustand';\nimport type { editor as MonacoEditorType } from 'monaco-editor';\nimport type { Monaco } from '@monaco-editor/react';\n\nexport interface EditorReference {\n editor: MonacoEditorType.IStandaloneCodeEditor;\n monaco: Monaco;\n documentName: string;\n}\n\ninterface EditorRefsState {\n editors: Map<string, EditorReference>;\n activeEditorName: string | null;\n}\n\ninterface EditorRefsActions {\n registerEditor: (\n documentName: string,\n editor: MonacoEditorType.IStandaloneCodeEditor,\n monaco: Monaco\n ) => void;\n unregisterEditor: (documentName: string) => void;\n setActiveEditor: (documentName: string | null) => void;\n getActiveEditor: () => EditorReference | null;\n getEditor: (documentName: string) => EditorReference | null;\n}\n\nexport type EditorRefsStore = EditorRefsState & EditorRefsActions;\n\nexport const useEditorRefsStore = create<EditorRefsStore>((set, get) => ({\n editors: new Map(),\n activeEditorName: null,\n\n registerEditor: (documentName, editor, monaco) => {\n set((state) => {\n const newEditors = new Map(state.editors);\n newEditors.set(documentName, { editor, monaco, documentName });\n return { editors: newEditors };\n });\n },\n\n unregisterEditor: (documentName) => {\n set((state) => {\n const newEditors = new Map(state.editors);\n newEditors.delete(documentName);\n return {\n editors: newEditors,\n activeEditorName:\n state.activeEditorName === documentName\n ? null\n : state.activeEditorName,\n };\n });\n },\n\n setActiveEditor: (documentName) => {\n set({ activeEditorName: documentName });\n },\n\n getActiveEditor: () => {\n const state = get();\n if (!state.activeEditorName) return null;\n return state.editors.get(state.activeEditorName) || null;\n },\n\n getEditor: (documentName) => {\n return get().editors.get(documentName) || null;\n },\n}));\n","/**\n * Monaco Editor Selection Utilities\n * Provides functionality to extract selected text and JSON paths from Monaco editor instances\n */\n\nimport type { editor as MonacoEditorType } from 'monaco-editor';\nimport type { Monaco } from '@monaco-editor/react';\n\nexport interface SelectionContext {\n selectedText: string;\n jsonPath?: string;\n propertyKey?: string;\n fullDocument?: any;\n isValidJson: boolean;\n startLine: number;\n endLine: number;\n}\n\n/**\n * Get the current selection context from a Monaco editor instance\n */\nexport function getSelectionContext(\n editor: MonacoEditorType.IStandaloneCodeEditor,\n monaco: Monaco\n): SelectionContext | null {\n if (!editor || !monaco) {\n return null;\n }\n\n const model = editor.getModel();\n if (!model) {\n return null;\n }\n\n const selection = editor.getSelection();\n if (!selection) {\n return null;\n }\n\n // Get selected text\n const selectedText = model.getValueInRange(selection);\n\n // If no text is selected, get the word at cursor position\n const finalText = selectedText || getWordAtCursor(editor, monaco);\n\n if (!finalText) {\n return null;\n }\n\n // Get the full document text\n const fullDocumentText = model.getValue();\n let fullDocument: any = null;\n let isValidJson = false;\n\n try {\n fullDocument = JSON.parse(fullDocumentText);\n isValidJson = true;\n } catch {\n // Document is not valid JSON\n }\n\n // Try to determine the JSON path\n const jsonPath = isValidJson\n ? getJsonPathAtPosition(\n fullDocumentText,\n selection.startLineNumber,\n selection.startColumn\n )\n : undefined;\n\n // Extract property key if we're selecting a property value\n const propertyKey = extractPropertyKey(\n fullDocumentText,\n selection.startLineNumber,\n selection.startColumn\n );\n\n return {\n selectedText: finalText,\n jsonPath,\n propertyKey,\n fullDocument,\n isValidJson,\n startLine: selection.startLineNumber,\n endLine: selection.endLineNumber,\n };\n}\n\n/**\n * Get the word at the current cursor position\n */\nfunction getWordAtCursor(\n editor: MonacoEditorType.IStandaloneCodeEditor,\n _monaco: Monaco\n): string {\n const model = editor.getModel();\n const position = editor.getPosition();\n\n if (!model || !position) {\n return '';\n }\n\n const word = model.getWordAtPosition(position);\n if (word) {\n return model.getValueInRange({\n startLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endLineNumber: position.lineNumber,\n endColumn: word.endColumn,\n });\n }\n\n return '';\n}\n\n/**\n * Determine the JSON path at a specific position in the document\n */\nfunction getJsonPathAtPosition(\n documentText: string,\n lineNumber: number,\n column: number\n): string | undefined {\n try {\n // Split document into lines\n const lines = documentText.split('\\n');\n\n // Build a path by analyzing the nesting level\n const path: string[] = [];\n let depth = 0;\n let inArray = false;\n let arrayIndex = 0;\n\n for (let i = 0; i < Math.min(lineNumber, lines.length); i++) {\n const line = lines[i];\n\n // Count braces and brackets to track nesting\n for (let j = 0; j < line.length; j++) {\n const char = line[j];\n\n if (i === lineNumber - 1 && j >= column) {\n // We've reached the target position\n break;\n }\n\n if (char === '{') {\n depth++;\n } else if (char === '}') {\n depth--;\n if (path.length > depth) {\n path.pop();\n }\n } else if (char === '[') {\n inArray = true;\n arrayIndex = 0;\n } else if (char === ']') {\n inArray = false;\n if (path[path.length - 1]?.match(/\\[\\d+\\]$/)) {\n path.pop();\n }\n } else if (char === ',' && inArray) {\n arrayIndex++;\n }\n }\n\n // Try to extract property names from the line\n const propertyMatch = line.match(/^\\s*\"([^\"]+)\"\\s*:/);\n if (propertyMatch) {\n // Adjust path length to current depth\n while (path.length >= depth) {\n path.pop();\n }\n\n if (inArray) {\n path.push(`${propertyMatch[1]}[${arrayIndex}]`);\n } else {\n path.push(propertyMatch[1]);\n }\n }\n }\n\n return path.length > 0 ? path.join('.') : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Extract the property key at a specific position\n */\nfunction extractPropertyKey(\n documentText: string,\n lineNumber: number,\n _column: number\n): string | undefined {\n try {\n const lines = documentText.split('\\n');\n if (lineNumber > lines.length) {\n return undefined;\n }\n\n const line = lines[lineNumber - 1];\n\n // Look for a property key on the same line\n const propertyMatch = line.match(/^\\s*\"([^\"]+)\"\\s*:/);\n if (propertyMatch) {\n return propertyMatch[1];\n }\n\n // Look backwards for the nearest property key\n for (let i = lineNumber - 2; i >= 0; i--) {\n const prevLine = lines[i];\n const prevMatch = prevLine.match(/^\\s*\"([^\"]+)\"\\s*:/);\n if (prevMatch) {\n // Check if this property's value extends to our line\n // This is a simplified check - more complex logic might be needed\n return prevMatch[1];\n }\n\n // Stop if we hit a closing brace (end of object)\n if (prevLine.includes('}')) {\n break;\n }\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Format a selection context for display\n */\nexport function formatSelectionContext(context: SelectionContext): string {\n const parts: string[] = [];\n\n if (context.jsonPath) {\n parts.push(`Path: ${context.jsonPath}`);\n }\n\n if (context.propertyKey) {\n parts.push(`Property: ${context.propertyKey}`);\n }\n\n parts.push(`Lines: ${context.startLine}-${context.endLine}`);\n\n return parts.join(' | ');\n}\n\n/**\n * Extract a JSON subtree from a path\n */\nexport function extractJsonSubtree(obj: any, path: string): any {\n if (!obj || !path) {\n return undefined;\n }\n\n const parts = path.split('.');\n let current = obj;\n\n for (const part of parts) {\n if (!current) {\n return undefined;\n }\n\n // Handle array notation like \"items[0]\"\n const arrayMatch = part.match(/^([^[]+)\\[(\\d+)\\]$/);\n if (arrayMatch) {\n const [, key, index] = arrayMatch;\n current = current[key];\n if (Array.isArray(current)) {\n current = current[parseInt(index, 10)];\n } else {\n return undefined;\n }\n } else {\n current = current[part];\n }\n }\n\n return current;\n}\n\n/**\n * Create a context snippet for AI\n */\nexport function createContextSnippet(context: SelectionContext): string {\n const lines: string[] = [];\n\n if (context.jsonPath) {\n lines.push(`JSON Path: ${context.jsonPath}`);\n }\n\n if (context.selectedText.length > 500) {\n lines.push(\n `Selected Text (truncated): ${context.selectedText.substring(0, 500)}...`\n );\n } else {\n lines.push(`Selected Text: ${context.selectedText}`);\n }\n\n if (context.isValidJson && context.fullDocument && context.jsonPath) {\n const subtree = extractJsonSubtree(context.fullDocument, context.jsonPath);\n if (subtree !== undefined) {\n const subtreeStr = JSON.stringify(subtree, null, 2);\n if (subtreeStr.length > 500) {\n lines.push(\n `Context Value (truncated): ${subtreeStr.substring(0, 500)}...`\n );\n } else {\n lines.push(`Context Value: ${subtreeStr}`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n","import React, { useState, useEffect } from 'react';\nimport {\n AlertCircle,\n ChevronDown,\n ChevronUp,\n X,\n AlertTriangle,\n Copy,\n Check,\n} from 'lucide-react';\nimport { cn } from '../../lib/utils';\nimport type { JsonEditorError } from '../../lib/json-types';\n\ninterface ValidationPanelProps {\n errors: JsonEditorError[];\n onErrorClick?: (error: JsonEditorError) => void;\n onClose?: () => void;\n className?: string;\n isMinimized?: boolean;\n onToggleMinimize?: () => void;\n}\n\nexport function ValidationPanel({\n errors,\n onErrorClick,\n onClose,\n className,\n isMinimized = false,\n onToggleMinimize,\n}: ValidationPanelProps) {\n const [isExpanded, setIsExpanded] = useState(!isMinimized);\n\n useEffect(() => {\n setIsExpanded(!isMinimized);\n }, [isMinimized]);\n\n const hasErrors = errors.length > 0;\n const errorCount = errors.length;\n\n if (!hasErrors) return null;\n\n const toggleExpanded = () => {\n const newExpanded = !isExpanded;\n setIsExpanded(newExpanded);\n onToggleMinimize?.();\n };\n\n return (\n <div\n className={cn(\n 'absolute bottom-0 left-0 right-0 z-50 bg-background border-t shadow-lg transition-all duration-200',\n isExpanded ? 'h-48' : 'h-10',\n className\n )}\n >\n {/* Header Bar */}\n <div\n className={cn(\n 'flex items-center justify-between px-3 py-2 cursor-pointer',\n 'bg-destructive/10 border-b border-destructive/20',\n 'hover:bg-destructive/15 transition-colors'\n )}\n onClick={toggleExpanded}\n >\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"w-4 h-4 text-destructive\" />\n <span className=\"text-sm font-medium text-destructive\">\n {errorCount} Validation Error{errorCount !== 1 ? 's' : ''}\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n <CopyErrorsButton errors={errors} />\n <button\n onClick={(e) => {\n e.stopPropagation();\n toggleExpanded();\n }}\n className=\"p-1 hover:bg-destructive/20 rounded transition-colors\"\n aria-label={isExpanded ? 'Minimize' : 'Expand'}\n >\n {isExpanded ? (\n <ChevronDown className=\"w-4 h-4\" />\n ) : (\n <ChevronUp className=\"w-4 h-4\" />\n )}\n </button>\n {onClose && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n className=\"p-1 hover:bg-destructive/20 rounded transition-colors\"\n aria-label=\"Close validation panel\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Error List */}\n {isExpanded && (\n <div className=\"overflow-y-auto h-[calc(100%-2.5rem)]\">\n <div className=\"divide-y divide-border/50\">\n {errors.map((error, index) => (\n <ErrorItem\n key={`${error.path}-${index}`}\n error={error}\n onClick={() => onErrorClick?.(error)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction CopyErrorsButton({ errors }: { errors: JsonEditorError[] }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n const text = errors\n .map((err) => {\n const loc =\n err.startLineNumber && err.startColumn\n ? `Line ${err.startLineNumber}:${err.startColumn}`\n : 'Unknown location';\n return `${loc} — ${err.message}`;\n })\n .join('\\n');\n navigator.clipboard.writeText(text).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n\n return (\n <button\n onClick={handleCopy}\n className={cn(\n 'flex items-center gap-1 px-1.5 py-1 rounded transition-all duration-200 cursor-pointer',\n copied\n ? 'bg-green-500/15 text-green-500'\n : 'hover:bg-destructive/20'\n )}\n aria-label=\"Copy all errors\"\n >\n {copied ? (\n <>\n <Check className=\"w-3.5 h-3.5\" />\n <span className=\"text-xs font-medium\">Copied</span>\n </>\n ) : (\n <Copy className=\"w-4 h-4\" />\n )}\n </button>\n );\n}\n\ninterface ErrorItemProps {\n error: JsonEditorError;\n onClick?: () => void;\n}\n\nfunction ErrorItem({ error, onClick }: ErrorItemProps) {\n const getSeverityIcon = (severity: string) => {\n switch (severity) {\n case 'error':\n return (\n <AlertCircle className=\"w-4 h-4 text-destructive flex-shrink-0\" />\n );\n case 'warning':\n return (\n <AlertTriangle className=\"w-4 h-4 text-yellow-500 flex-shrink-0\" />\n );\n default:\n return <AlertCircle className=\"w-4 h-4 text-blue-500 flex-shrink-0\" />;\n }\n };\n\n const formatPath = (path: string) => {\n if (!path) return 'Document root';\n // Remove leading slash and format nicely\n return path.replace(/^\\//, '').replace(/\\//g, ' → ');\n };\n\n return (\n <div\n className={cn(\n 'px-3 py-2 hover:bg-muted/50 cursor-pointer transition-colors',\n 'group'\n )}\n onClick={onClick}\n >\n <div className=\"flex items-start gap-2\">\n {getSeverityIcon(error.severity)}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"text-xs font-mono text-muted-foreground\">\n {error.startLineNumber && error.startColumn\n ? `Line ${error.startLineNumber}:${error.startColumn}`\n : 'Unknown location'}\n </span>\n {error.path && (\n <>\n <span className=\"text-xs text-muted-foreground\">•</span>\n <span className=\"text-xs text-muted-foreground truncate\">\n {formatPath(error.path)}\n </span>\n </>\n )}\n </div>\n <p className=\"text-sm text-foreground\">{error.message}</p>\n {error.code && error.code !== 'validation_error' && (\n <span className=\"text-xs text-muted-foreground font-mono mt-1 inline-block\">\n Code: {error.code}\n </span>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// Status bar component for minimal error display\nexport function ValidationStatusBar({\n errors,\n onClick,\n className,\n}: {\n errors: JsonEditorError[];\n onClick?: () => void;\n className?: string;\n}) {\n if (errors.length !== 0) {\n return (\n <div\n className={cn(\n 'flex items-center gap-2 px-2 py-1 text-xs cursor-pointer',\n 'bg-destructive/10 text-destructive hover:bg-destructive/15 transition-colors',\n className\n )}\n onClick={onClick}\n >\n <AlertCircle className=\"w-3 h-3\" />\n <span>\n {errors.length} error{errors.length !== 1 ? 's' : ''}\n </span>\n </div>\n );\n }\n}\n","import React, { useRef, useEffect, useState, useCallback } from 'react';\nimport { useTheme } from '../theme-provider';\nimport Editor, { Monaco, DiffEditor } from '@monaco-editor/react';\nimport debounce from 'lodash.debounce';\nimport type { editor } from 'monaco-editor';\nimport { useDocumentsStore } from '../../store/documents-store-provider';\nimport { useOutputStore } from '../../store/output-store-provider';\nimport { Button } from '../ui/button';\nimport { type JsonEditorError } from '../../lib/json-types';\n// configureMonacoInstance is called at startup (main.tsx) and by useMonacoPlugins\nimport { useEditorRefsStore } from '../../store/editor-refs-store';\nimport {\n getSelectionContext,\n createContextSnippet,\n} from '../../lib/monaco-selection-utils';\nimport { ValidationPanel, ValidationStatusBar } from './validation-panel';\n\ninterface EditorMonacoJsonProps {\n name: string;\n defaultValue?: string;\n value?: string; // when provided, the editor becomes controlled\n saveDocumentDebounceWait: number;\n}\n\nfunction EditorMonacoJson({\n name,\n defaultValue,\n value,\n saveDocumentDebounceWait,\n}: EditorMonacoJsonProps) {\n console.debug(`Render EditorMonacoJson (name: ${name})`);\n\n const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null);\n const monacoRef = useRef<Monaco | null>(null);\n const { resolvedTheme } = useTheme();\n const saveDocument = useDocumentsStore((state) => state.saveDocument);\n const bumpEditSequence = useOutputStore((state) => state.bumpEditSequence);\n const closeDocument = useDocumentsStore((state) => state.closeDocument);\n const pendingDiff = useDocumentsStore((state) => state.pendingDiffs[name]);\n const clearPendingDiff = useDocumentsStore((state) => state.clearPendingDiff);\n const [validationErrors, setValidationErrors] = useState<JsonEditorError[]>(\n []\n );\n const [showValidationPanel, setShowValidationPanel] = useState(true);\n const [isValidationPanelMinimized, setIsValidationPanelMinimized] =\n useState(false);\n const decorationIdsRef = useRef<string[]>([]);\n const { registerEditor, unregisterEditor, setActiveEditor } =\n useEditorRefsStore();\n\n const debouncedSaveDocumentRef = useRef(\n debounce(saveDocument, saveDocumentDebounceWait)\n );\n\n // Setup Monaco editor for JSON with schema validation\n // Note: schema configuration is handled by configureMonaco() at startup\n // and updateMonacoWithPlugins() via useMonacoPlugins hook.\n // Calling configureMonacoInstance here would overwrite plugin-aware schemas.\n const handleEditorWillMount = useCallback((_monaco: Monaco) => {\n console.debug('Setting up Monaco for JSON editor');\n }, []);\n\n function handleEditorDidMount(\n editor: editor.IStandaloneCodeEditor,\n monaco: Monaco\n ) {\n console.debug(`EditorDidMount: (name: ${name})`);\n editorRef.current = editor;\n monacoRef.current = monaco;\n\n // Register editor in the refs store\n registerEditor(name, editor, monaco);\n setActiveEditor(name);\n\n // Ensure the model's language is set to JSON for schema validation\n const model = editor.getModel();\n if (model) {\n monaco.editor.setModelLanguage(model, 'json');\n console.debug('Model language set to JSON for:', model.uri.toString());\n }\n\n // Add context menu action for AI assistant\n editor.addAction({\n id: 'send-to-ai-assistant',\n label: 'Send to AI Assistant (⌘K)',\n contextMenuGroupId: 'navigation',\n contextMenuOrder: 1.5,\n keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK],\n run: function () {\n // Use the editor reference from closure instead of the parameter\n const selection = getSelectionContext(editor, monaco);\n if (selection) {\n const snippet = createContextSnippet(selection);\n // Dispatch event for the chat panel to capture\n window.dispatchEvent(\n new CustomEvent('monaco-selection-to-ai', {\n detail: {\n documentName: name,\n selection,\n snippet,\n },\n })\n );\n }\n },\n });\n\n // Set up keyboard shortcuts\n // Cmd+K => send selection to AI assistant\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK, () => {\n const selection = getSelectionContext(editor, monaco);\n if (selection) {\n const snippet = createContextSnippet(selection);\n window.dispatchEvent(\n new CustomEvent('monaco-selection-to-ai', {\n detail: {\n documentName: name,\n selection,\n snippet,\n },\n })\n );\n }\n });\n\n // Cmd+S => save command\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => {\n const currentValue = editor.getValue();\n if (currentValue) saveDocument(name, currentValue);\n });\n\n // Cmd+W => close command\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyW, () => {\n const currentValue = editor.getValue();\n if (currentValue) saveDocument(name, currentValue);\n closeDocument(name);\n });\n\n // Format document shortcut (Shift+Alt+F)\n editor.addCommand(\n monaco.KeyMod.Shift | monaco.KeyMod.Alt | monaco.KeyCode.KeyF,\n () => {\n editor.getAction('editor.action.formatDocument')?.run();\n }\n );\n\n // Initial validation will be handled by Monaco's onValidate\n }\n\n function handleEditorValidation(markers: editor.IMarker[]) {\n // Convert Monaco's native JSON validation markers to our error format\n console.debug('Monaco validation markers:', markers);\n\n const errors: JsonEditorError[] = markers.map((marker) => ({\n path: '', // Monaco doesn't provide JSON path, but we don't need it for display\n message: marker.message,\n code:\n typeof marker.code === 'string'\n ? marker.code\n : marker.code?.value || 'validation_error',\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n severity:\n marker.severity === monacoRef.current?.MarkerSeverity.Error\n ? 'error'\n : marker.severity === monacoRef.current?.MarkerSeverity.Warning\n ? 'warning'\n : 'info',\n }));\n\n setValidationErrors(errors);\n\n // Decorations are now handled by Monaco's native validation\n decorationIdsRef.current = [];\n\n // Show validation panel if there are errors\n if (errors.length > 0 && !showValidationPanel) {\n setShowValidationPanel(true);\n setIsValidationPanelMinimized(false);\n }\n }\n\n // Flush debounced saveDocument on unmount and unregister editor\n useEffect(() => {\n const debouncedSaveDocument = debouncedSaveDocumentRef?.current;\n return () => {\n debouncedSaveDocument?.flush();\n // Decorations cleanup handled by Monaco\n unregisterEditor(name);\n console.debug(`EditorWillUnMount: (name: ${name})`);\n };\n }, [name, unregisterEditor]);\n\n // Handle error click - navigate to error in editor\n const handleErrorClick = useCallback((error: JsonEditorError) => {\n if (editorRef.current && error.startLineNumber && error.startColumn) {\n // Navigate to error position\n editorRef.current.setPosition({\n lineNumber: error.startLineNumber,\n column: error.startColumn,\n });\n editorRef.current.revealLineInCenter(error.startLineNumber);\n editorRef.current.focus();\n }\n }, []);\n\n return (\n <div className=\"relative h-full\">\n {pendingDiff ? (\n <>\n <div className=\"flex items-center justify-between px-2 py-1 border-b bg-muted/40 text-xs\">\n <div>\n Review changes for <span className=\"font-medium\">{name}</span>\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => clearPendingDiff(name)}\n >\n Discard\n </Button>\n <Button\n size=\"sm\"\n onClick={() => {\n saveDocument(name, pendingDiff.modified);\n clearPendingDiff(name, true);\n }}\n >\n Apply Changes\n </Button>\n </div>\n </div>\n <DiffEditor\n height=\"calc(100% - 32px)\"\n original={pendingDiff.original}\n modified={pendingDiff.modified}\n language=\"json\"\n theme={`vs-${resolvedTheme}`}\n options={{\n readOnly: true,\n renderSideBySide: true,\n originalEditable: false,\n automaticLayout: true,\n minimap: { enabled: false },\n }}\n beforeMount={handleEditorWillMount}\n />\n </>\n ) : (\n <Editor\n height=\"100%\"\n defaultLanguage=\"json\"\n theme={`vs-${resolvedTheme}`}\n defaultPath={name.endsWith('.json') ? name : `${name}.json`}\n value={value ?? defaultValue}\n beforeMount={handleEditorWillMount}\n onMount={handleEditorDidMount}\n onValidate={handleEditorValidation}\n onChange={(value) => {\n if (value) {\n bumpEditSequence();\n debouncedSaveDocumentRef.current(name, value);\n }\n }}\n options={{\n minimap: { enabled: true },\n scrollBeyondLastLine: true,\n wordWrap: 'on',\n automaticLayout: true,\n formatOnPaste: true,\n formatOnType: true,\n tabSize: 2,\n insertSpaces: true,\n detectIndentation: false,\n folding: true,\n foldingStrategy: 'indentation',\n showFoldingControls: 'always',\n bracketPairColorization: { enabled: true },\n guides: {\n bracketPairs: true,\n indentation: true,\n },\n // Enhanced suggest options for better autocomplete\n suggest: {\n showProperties: true,\n showMethods: true,\n showFunctions: true,\n showConstructors: true,\n showDeprecated: true,\n showFields: true,\n showVariables: true,\n showClasses: true,\n showStructs: true,\n showInterfaces: true,\n showModules: true,\n showTypeParameters: true,\n showValues: true,\n showConstants: true,\n showEnums: true,\n showEnumMembers: true,\n showKeywords: true,\n showWords: false,\n showColors: true,\n showFiles: false,\n showReferences: true,\n showFolders: false,\n showOperators: true,\n showUnits: true,\n showSnippets: true,\n snippetsPreventQuickSuggestions: false,\n insertMode: 'insert', // Changed from 'replace' to 'insert' for better UX\n filterGraceful: true, // Allow fuzzy matching\n localityBonus: true, // Prioritize nearby suggestions\n shareSuggestSelections: true, // Share suggestions across files\n showIcons: true, // Show icons in suggestions\n },\n // Quick suggestions appear faster\n quickSuggestions: {\n strings: true,\n comments: false,\n other: true,\n },\n quickSuggestionsDelay: 10, // Faster suggestions\n suggestSelection: 'first',\n suggestOnTriggerCharacters: true,\n acceptSuggestionOnEnter: 'on',\n acceptSuggestionOnCommitCharacter: true,\n wordBasedSuggestions: 'off', // Disable word-based to rely on schema\n // IntelliSense features\n parameterHints: {\n enabled: true,\n cycle: true,\n },\n hover: {\n enabled: true,\n delay: 300,\n sticky: true,\n },\n // Better completion behavior\n tabCompletion: 'on',\n snippetSuggestions: 'inline',\n inlineSuggest: {\n enabled: true,\n },\n }}\n />\n )}\n\n {/* Validation Status Bar */}\n <div className=\"absolute top-0 right-0\">\n <ValidationStatusBar\n errors={validationErrors}\n onClick={() => {\n setShowValidationPanel(true);\n setIsValidationPanelMinimized(false);\n }}\n />\n </div>\n\n {/* Enhanced Validation Panel */}\n {showValidationPanel && validationErrors.length > 0 && (\n <ValidationPanel\n errors={validationErrors}\n isMinimized={isValidationPanelMinimized}\n onToggleMinimize={() =>\n setIsValidationPanelMinimized(!isValidationPanelMinimized)\n }\n onErrorClick={handleErrorClick}\n onClose={() => setShowValidationPanel(false)}\n className=\"z-40\"\n />\n )}\n </div>\n );\n}\n\nexport const EditorMonacoJsonMemoized = React.memo(\n EditorMonacoJson,\n (prev, next) => {\n return (\n prev.name === next.name &&\n prev.value === next.value &&\n prev.saveDocumentDebounceWait === next.saveDocumentDebounceWait\n );\n }\n);\n"],"names":["FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","freeGlobal","global","freeSelf","root","objectProto","objectToString","nativeMax","nativeMin","now","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","toNumber","isObject","invokeFunc","time","args","thisArg","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","value","type","isObjectLike","isSymbol","other","isBinary","lodash_debounce","useEditorRefsStore","create","set","get","documentName","editor","monaco","state","newEditors","getSelectionContext","model","selection","finalText","getWordAtCursor","fullDocumentText","fullDocument","isValidJson","jsonPath","getJsonPathAtPosition","propertyKey","extractPropertyKey","_monaco","position","word","documentText","lineNumber","column","lines","path","depth","inArray","arrayIndex","i","line","char","_a","propertyMatch","_column","prevLine","prevMatch","extractJsonSubtree","obj","parts","current","part","arrayMatch","key","index","createContextSnippet","context","subtree","subtreeStr","ValidationPanel","errors","onErrorClick","onClose","className","isMinimized","onToggleMinimize","isExpanded","setIsExpanded","useState","useEffect","hasErrors","errorCount","toggleExpanded","jsxs","cn","jsx","AlertCircle","CopyErrorsButton","e","ChevronDown","ChevronUp","X","error","ErrorItem","copied","setCopied","handleCopy","text","err","Fragment","Check","Copy","onClick","getSeverityIcon","severity","AlertTriangle","formatPath","ValidationStatusBar","EditorMonacoJson","name","defaultValue","saveDocumentDebounceWait","editorRef","useRef","monacoRef","resolvedTheme","useTheme","saveDocument","useDocumentsStore","bumpEditSequence","useOutputStore","closeDocument","pendingDiff","clearPendingDiff","validationErrors","setValidationErrors","showValidationPanel","setShowValidationPanel","isValidationPanelMinimized","setIsValidationPanelMinimized","decorationIdsRef","registerEditor","unregisterEditor","setActiveEditor","debouncedSaveDocumentRef","handleEditorWillMount","useCallback","handleEditorDidMount","snippet","currentValue","handleEditorValidation","markers","marker","_b","_c","debouncedSaveDocument","handleErrorClick","Button","DiffEditor","Editor","EditorMonacoJsonMemoized","React","prev","next"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Geist",system-ui,-apple-system,sans-serif;--font-mono:"Geist Mono","JetBrains Mono","Fira Code",ui-monospace,monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-600:oklch(57.7% .245 27.325);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-900:oklch(39.3% .095 152.535);--color-cyan-500:oklch(71.5% .143 215.221);--color-blue-50:oklch(97% .014 254.604);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-900:oklch(37.9% .146 265.522);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-900:oklch(38.1% .176 304.987);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-sm:calc(var(--radius) - 4px);--radius-md:calc(var(--radius) - 2px);--radius-lg:var(--radius);--radius-xl:.75rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-background:hsl(var(--background));--color-foreground:hsl(var(--foreground));--color-card:hsl(var(--card));--color-card-foreground:hsl(var(--card-foreground));--color-popover:hsl(var(--popover));--color-popover-foreground:hsl(var(--popover-foreground));--color-primary:hsl(var(--primary));--color-primary-foreground:hsl(var(--primary-foreground));--color-secondary:hsl(var(--secondary));--color-secondary-foreground:hsl(var(--secondary-foreground));--color-muted:hsl(var(--muted));--color-muted-foreground:hsl(var(--muted-foreground));--color-accent:hsl(var(--accent));--color-accent-foreground:hsl(var(--accent-foreground));--color-destructive:hsl(var(--destructive));--color-destructive-foreground:hsl(var(--destructive-foreground));--color-border:hsl(var(--border));--color-input:hsl(var(--input));--color-ring:hsl(var(--ring));--color-sidebar:hsl(var(--sidebar-background));--color-sidebar-foreground:hsl(var(--sidebar-foreground));--color-sidebar-accent:hsl(var(--sidebar-accent));--color-sidebar-accent-foreground:hsl(var(--sidebar-accent-foreground));--color-sidebar-border:hsl(var(--sidebar-border));--color-sidebar-ring:hsl(var(--sidebar-ring));--color-surface-editor:hsl(var(--surface-editor));--color-surface-preview:hsl(var(--surface-preview));--color-surface-chat:hsl(var(--surface-chat))}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-gray-200,currentColor)}::file-selector-button{border-color:var(--color-gray-200,currentColor)}:root{--background:220 6% 97%;--foreground:220 9% 12%;--card:220 6% 97%;--card-foreground:220 9% 12%;--popover:0 0% 100%;--popover-foreground:220 9% 12%;--primary:220 9% 20%;--primary-foreground:220 6% 97%;--secondary:220 6% 93%;--secondary-foreground:220 9% 12%;--muted:220 6% 93%;--muted-foreground:220 5% 46%;--accent:220 6% 93%;--accent-foreground:220 9% 12%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:220 6% 87%;--input:220 6% 87%;--ring:220 9% 20%;--chart-1:12 76% 61%;--chart-2:173 58% 39%;--chart-3:197 37% 24%;--chart-4:43 74% 66%;--chart-5:27 87% 67%;--radius:.5rem;--sidebar-background:220 6% 94%;--sidebar-foreground:220 9% 20%;--sidebar-primary:220 9% 20%;--sidebar-primary-foreground:220 6% 97%;--sidebar-accent:220 6% 90%;--sidebar-accent-foreground:220 9% 12%;--sidebar-border:220 6% 87%;--sidebar-ring:220 9% 20%;--surface-editor:220 6% 97%;--surface-preview:220 5% 95%;--surface-chat:220 6% 95%}.dark{--background:220 8% 7%;--foreground:220 6% 93%;--card:220 8% 9%;--card-foreground:220 6% 93%;--popover:220 8% 9%;--popover-foreground:220 6% 93%;--primary:220 6% 90%;--primary-foreground:220 8% 7%;--secondary:220 6% 14%;--secondary-foreground:220 6% 93%;--muted:220 6% 14%;--muted-foreground:220 5% 55%;--accent:220 6% 14%;--accent-foreground:220 6% 93%;--destructive:0 62.8% 30.6%;--destructive-foreground:0 0% 98%;--border:220 6% 17%;--input:220 6% 17%;--ring:220 6% 80%;--chart-1:220 40% 55%;--chart-2:160 35% 50%;--chart-3:30 50% 55%;--chart-4:280 35% 60%;--chart-5:340 40% 55%;--sidebar-background:220 8% 5%;--sidebar-foreground:220 6% 85%;--sidebar-primary:220 6% 85%;--sidebar-primary-foreground:220 8% 5%;--sidebar-accent:220 6% 12%;--sidebar-accent-foreground:220 6% 85%;--sidebar-border:220 6% 13%;--sidebar-ring:220 6% 80%;--surface-editor:220 8% 7%;--surface-preview:220 7% 9%;--surface-chat:220 8% 8%}*{border-color:var(--color-border)}body{background-color:var(--color-background);color:var(--color-foreground)}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.-top-1\.5{top:calc(var(--spacing)*-1.5)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\.5{top:calc(var(--spacing)*1.5)}.top-2{top:calc(var(--spacing)*2)}.top-3\.5{top:calc(var(--spacing)*3.5)}.top-4{top:calc(var(--spacing)*4)}.top-\[50\%\]{top:50%}.-right-1\.5{right:calc(var(--spacing)*-1.5)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-2{right:calc(var(--spacing)*2)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-1{bottom:calc(var(--spacing)*1)}.left-0{left:calc(var(--spacing)*0)}.left-2{left:calc(var(--spacing)*2)}.left-\[50\%\]{left:50%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing)*0)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-3\.5{margin-inline:calc(var(--spacing)*3.5)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.-ml-2{margin-left:calc(var(--spacing)*-2)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-7{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.size-12{width:calc(var(--spacing)*12);height:calc(var(--spacing)*12)}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-48{height:calc(var(--spacing)*48)}.h-64{height:calc(var(--spacing)*64)}.h-\[1\.2rem\]{height:1.2rem}.h-\[1\.15rem\]{height:1.15rem}.h-\[1px\]{height:1px}.h-\[500px\]{height:500px}.h-\[600px\]{height:600px}.h-\[calc\(100\%-2\.5rem\)\]{height:calc(100% - 2.5rem)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.h-svh{height:100svh}.max-h-32{max-height:calc(var(--spacing)*32)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-80{max-height:calc(var(--spacing)*80)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[50vh\]{max-height:50vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[300px\]{max-height:300px}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[36px\]{min-height:36px}.min-h-\[80px\]{min-height:80px}.min-h-\[200px\]{min-height:200px}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-0\.5{width:calc(var(--spacing)*.5)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-52{width:calc(var(--spacing)*52)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-\[--sidebar-width\]{width:--sidebar-width}.w-\[1\.2rem\]{width:1.2rem}.w-\[1px\]{width:1px}.w-\[140px\]{width:140px}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[--skeleton-width\]{max-width:--skeleton-width}.max-w-\[90\%\]{max-width:90%}.max-w-\[120px\]{max-width:120px}.max-w-\[140px\]{max-width:140px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[280px\]{max-width:280px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-5{min-width:calc(var(--spacing)*5)}.min-w-\[1\.25rem\]{min-width:1.25rem}.min-w-\[8rem\]{min-width:8rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.-rotate-90{rotate:-90deg}.rotate-0{rotate:none}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize-none{resize:none}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-0\.5{column-gap:calc(var(--spacing)*.5)}.gap-x-1{column-gap:calc(var(--spacing)*1)}.gap-x-2{column-gap:calc(var(--spacing)*2)}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border\/50>:not(:last-child)){border-color:color-mix(in srgb,hsl(var(--border))50%,transparent)}@supports (color:color-mix(in lab,red,red)){:where(.divide-border\/50>:not(:last-child)){border-color:color-mix(in oklab,var(--color-border)50%,transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-400\/60{border-color:#fcbb0099}@supports (color:color-mix(in lab,red,red)){.border-amber-400\/60{border-color:color-mix(in oklab,var(--color-amber-400)60%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.border-blue-400\/60{border-color:#54a2ff99}@supports (color:color-mix(in lab,red,red)){.border-blue-400\/60{border-color:color-mix(in oklab,var(--color-blue-400)60%,transparent)}}.border-blue-500{border-color:var(--color-blue-500)}.border-border{border-color:var(--color-border)}.border-border\/40{border-color:color-mix(in srgb,hsl(var(--border))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-border\/40{border-color:color-mix(in oklab,var(--color-border)40%,transparent)}}.border-border\/60{border-color:color-mix(in srgb,hsl(var(--border))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,var(--color-border)60%,transparent)}}.border-destructive{border-color:var(--color-destructive)}.border-destructive\/20{border-color:color-mix(in srgb,hsl(var(--destructive))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/20{border-color:color-mix(in oklab,var(--color-destructive)20%,transparent)}}.border-destructive\/30{border-color:color-mix(in srgb,hsl(var(--destructive))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/30{border-color:color-mix(in oklab,var(--color-destructive)30%,transparent)}}.border-destructive\/50{border-color:color-mix(in srgb,hsl(var(--destructive))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/50{border-color:color-mix(in oklab,var(--color-destructive)50%,transparent)}}.border-foreground{border-color:var(--color-foreground)}.border-green-500{border-color:var(--color-green-500)}.border-input{border-color:var(--color-input)}.border-muted-foreground{border-color:var(--color-muted-foreground)}.border-muted-foreground\/40{border-color:color-mix(in srgb,hsl(var(--muted-foreground))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-muted-foreground\/40{border-color:color-mix(in oklab,var(--color-muted-foreground)40%,transparent)}}.border-primary{border-color:var(--color-primary)}.border-primary-foreground\/20{border-color:color-mix(in srgb,hsl(var(--primary-foreground))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-primary-foreground\/20{border-color:color-mix(in oklab,var(--color-primary-foreground)20%,transparent)}}.border-primary\/20{border-color:color-mix(in srgb,hsl(var(--primary))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-primary\/20{border-color:color-mix(in oklab,var(--color-primary)20%,transparent)}}.border-purple-400\/60{border-color:#c07eff99}@supports (color:color-mix(in lab,red,red)){.border-purple-400\/60{border-color:color-mix(in oklab,var(--color-purple-400)60%,transparent)}}.border-purple-500{border-color:var(--color-purple-500)}.border-red-400\/50{border-color:#ff656880}@supports (color:color-mix(in lab,red,red)){.border-red-400\/50{border-color:color-mix(in oklab,var(--color-red-400)50%,transparent)}}.border-secondary{border-color:var(--color-secondary)}.border-sidebar-border{border-color:var(--color-sidebar-border)}.border-transparent{border-color:#0000}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.bg-accent{background-color:var(--color-accent)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-amber-500\/60{background-color:#f99c0099}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/60{background-color:color-mix(in oklab,var(--color-amber-500)60%,transparent)}}.bg-background{background-color:var(--color-background)}.bg-background\/60{background-color:color-mix(in srgb,hsl(var(--background))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-background\/60{background-color:color-mix(in oklab,var(--color-background)60%,transparent)}}.bg-background\/80{background-color:color-mix(in srgb,hsl(var(--background))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--color-background)80%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-border{background-color:var(--color-border)}.bg-border\/60{background-color:color-mix(in srgb,hsl(var(--border))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-border\/60{background-color:color-mix(in oklab,var(--color-border)60%,transparent)}}.bg-card{background-color:var(--color-card)}.bg-destructive{background-color:var(--color-destructive)}.bg-destructive\/10{background-color:color-mix(in srgb,hsl(var(--destructive))10%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--color-destructive)10%,transparent)}}.bg-gray-50{background-color:var(--color-gray-50)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/15{background-color:#00c75826}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/15{background-color:color-mix(in oklab,var(--color-green-500)15%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted\/10{background-color:color-mix(in srgb,hsl(var(--muted))10%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/10{background-color:color-mix(in oklab,var(--color-muted)10%,transparent)}}.bg-muted\/30{background-color:color-mix(in srgb,hsl(var(--muted))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,var(--color-muted)30%,transparent)}}.bg-muted\/40{background-color:color-mix(in srgb,hsl(var(--muted))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,var(--color-muted)40%,transparent)}}.bg-muted\/50{background-color:color-mix(in srgb,hsl(var(--muted))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.bg-muted\/60{background-color:color-mix(in srgb,hsl(var(--muted))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/60{background-color:color-mix(in oklab,var(--color-muted)60%,transparent)}}.bg-muted\/80{background-color:color-mix(in srgb,hsl(var(--muted))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/80{background-color:color-mix(in oklab,var(--color-muted)80%,transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.bg-popover{background-color:var(--color-popover)}.bg-primary{background-color:var(--color-primary)}.bg-primary-foreground\/10{background-color:color-mix(in srgb,hsl(var(--primary-foreground))10%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-primary-foreground\/10{background-color:color-mix(in oklab,var(--color-primary-foreground)10%,transparent)}}.bg-primary-foreground\/20{background-color:color-mix(in srgb,hsl(var(--primary-foreground))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-primary-foreground\/20{background-color:color-mix(in oklab,var(--color-primary-foreground)20%,transparent)}}.bg-primary\/5{background-color:color-mix(in srgb,hsl(var(--primary))5%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,var(--color-primary)5%,transparent)}}.bg-primary\/10{background-color:color-mix(in srgb,hsl(var(--primary))10%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--color-primary)10%,transparent)}}.bg-primary\/70{background-color:color-mix(in srgb,hsl(var(--primary))70%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/70{background-color:color-mix(in oklab,var(--color-primary)70%,transparent)}}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-400\/10{background-color:#ff65681a}@supports (color:color-mix(in lab,red,red)){.bg-red-400\/10{background-color:color-mix(in oklab,var(--color-red-400)10%,transparent)}}.bg-secondary{background-color:var(--color-secondary)}.bg-sidebar{background-color:var(--color-sidebar)}.bg-sidebar-border{background-color:var(--color-sidebar-border)}.bg-surface-chat{background-color:var(--color-surface-chat)}.bg-surface-editor{background-color:var(--color-surface-editor)}.bg-surface-preview{background-color:var(--color-surface-preview)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.fill-current{fill:currentColor}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-\[1px\]{padding:1px}.px-0\.5{padding-inline:calc(var(--spacing)*.5)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-foreground{color:var(--color-accent-foreground)}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-card-foreground{color:var(--color-card-foreground)}.text-cyan-500{color:var(--color-cyan-500)}.text-destructive{color:var(--color-destructive)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-foreground{color:var(--color-foreground)}.text-foreground\/50{color:color-mix(in srgb,hsl(var(--foreground))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/50{color:color-mix(in oklab,var(--color-foreground)50%,transparent)}}.text-foreground\/80{color:color-mix(in srgb,hsl(var(--foreground))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,var(--color-foreground)80%,transparent)}}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-muted-foreground\/60{color:color-mix(in srgb,hsl(var(--muted-foreground))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,var(--color-muted-foreground)60%,transparent)}}.text-muted-foreground\/80{color:color-mix(in srgb,hsl(var(--muted-foreground))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,var(--color-muted-foreground)80%,transparent)}}.text-orange-500{color:var(--color-orange-500)}.text-popover-foreground{color:var(--color-popover-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-primary-foreground\/50{color:color-mix(in srgb,hsl(var(--primary-foreground))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-primary-foreground\/50{color:color-mix(in oklab,var(--color-primary-foreground)50%,transparent)}}.text-primary-foreground\/60{color:color-mix(in srgb,hsl(var(--primary-foreground))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-primary-foreground\/60{color:color-mix(in oklab,var(--color-primary-foreground)60%,transparent)}}.text-primary\/60{color:color-mix(in srgb,hsl(var(--primary))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-primary\/60{color:color-mix(in oklab,var(--color-primary)60%,transparent)}}.text-purple-500{color:var(--color-purple-500)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-red-400{color:var(--color-red-400)}.text-red-400\/80{color:#ff6568cc}@supports (color:color-mix(in lab,red,red)){.text-red-400\/80{color:color-mix(in oklab,var(--color-red-400)80%,transparent)}}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-sidebar-accent-foreground{color:var(--color-sidebar-accent-foreground)}.text-sidebar-foreground{color:var(--color-sidebar-foreground)}.text-sidebar-foreground\/70{color:color-mix(in srgb,hsl(var(--sidebar-foreground))70%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/70{color:color-mix(in oklab,var(--color-sidebar-foreground)70%,transparent)}}.text-yellow-500{color:var(--color-yellow-500)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_1px_0_0\]{--tw-shadow:0 1px 0 0 var(--tw-shadow-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-border\/50{--tw-shadow-color:color-mix(in srgb,hsl(var(--border))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.shadow-border\/50{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-border)50%,transparent)var(--tw-shadow-alpha),transparent)}}.ring-primary\/40{--tw-ring-color:color-mix(in srgb,hsl(var(--primary))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.ring-primary\/40{--tw-ring-color:color-mix(in oklab,var(--color-primary)40%,transparent)}}.ring-sidebar-ring{--tw-ring-color:var(--color-sidebar-ring)}.ring-offset-background{--tw-ring-offset-color:var(--color-background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opa\]{transition-property:margin,opa;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-\[120ms\]{--tw-duration:.12s;transition-duration:.12s}.duration-\[280ms\]{--tw-duration:.28s;transition-duration:.28s}.ease-\[cubic-bezier\(0\.22\,1\,0\.36\,1\)\]{--tw-ease:cubic-bezier(.22,1,.36,1);transition-timing-function:cubic-bezier(.22,1,.36,1)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.duration-100{animation-duration:.1s}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.duration-\[120ms\]{animation-duration:.12s}.duration-\[280ms\]{animation-duration:.28s}.ease-\[cubic-bezier\(0\.22\,1\,0\.36\,1\)\]{animation-timing-function:cubic-bezier(.22,1,.36,1)}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{animation-timing-function:linear}.fade-in-0{--tw-enter-opacity:0}.fade-out{--tw-exit-opacity:0}.running{animation-play-state:running}.zoom-in-95{--tw-enter-scale:.95}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media (hover:hover){.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *),.group-hover\/msg\:opacity-100:is(:where(.group\/msg):hover *){opacity:1}}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing)*8)}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing)*-8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing)*8)!important;height:calc(var(--spacing)*8)!important}.group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]:is(:where(.group)[data-collapsible=icon] *){width:--sidebar-width-icon}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing)*0)!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing)*2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width)*-1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width)*-1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:calc(var(--spacing)*0)}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing)*-4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:calc(var(--spacing)*0)}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius-lg)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:border-sidebar-border:is(:where(.group)[data-variant=floating] *){border-color:var(--color-sidebar-border)}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-\[\.destructive\]\:border-muted\/40:is(:where(.group).destructive *){border-color:color-mix(in srgb,hsl(var(--muted))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.group-\[\.destructive\]\:border-muted\/40:is(:where(.group).destructive *){border-color:color-mix(in oklab,var(--color-muted)40%,transparent)}}.group-\[\.destructive\]\:text-red-300:is(:where(.group).destructive *){color:var(--color-red-300)}@media (hover:hover){.peer-hover\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button):hover~*){color:var(--color-sidebar-accent-foreground)}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button)[data-active=true]~*){color:var(--color-sidebar-accent-foreground)}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing)*1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing)*2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:calc(var(--spacing)*1)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-theme\(spacing\.4\)\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--color-foreground)}.placeholder\:overflow-hidden::placeholder{overflow:hidden}.placeholder\:text-ellipsis::placeholder{text-overflow:ellipsis}.placeholder\:whitespace-nowrap::placeholder{white-space:nowrap}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing)*-2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:calc(var(--spacing)*0)}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:calc(var(--spacing)*1)}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-accent\/50:hover{background-color:color-mix(in srgb,hsl(var(--accent))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--color-accent)50%,transparent)}}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-destructive\/15:hover{background-color:color-mix(in srgb,hsl(var(--destructive))15%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/15:hover{background-color:color-mix(in oklab,var(--color-destructive)15%,transparent)}}.hover\:bg-destructive\/20:hover{background-color:color-mix(in srgb,hsl(var(--destructive))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab,var(--color-destructive)20%,transparent)}}.hover\:bg-destructive\/80:hover{background-color:color-mix(in srgb,hsl(var(--destructive))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/80:hover{background-color:color-mix(in oklab,var(--color-destructive)80%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:color-mix(in srgb,hsl(var(--destructive))90%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--color-destructive)90%,transparent)}}.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:bg-muted\/30:hover{background-color:color-mix(in srgb,hsl(var(--muted))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/30:hover{background-color:color-mix(in oklab,var(--color-muted)30%,transparent)}}.hover\:bg-muted\/50:hover{background-color:color-mix(in srgb,hsl(var(--muted))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.hover\:bg-muted\/60:hover{background-color:color-mix(in srgb,hsl(var(--muted))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/60:hover{background-color:color-mix(in oklab,var(--color-muted)60%,transparent)}}.hover\:bg-primary-foreground\/20:hover{background-color:color-mix(in srgb,hsl(var(--primary-foreground))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary-foreground\/20:hover{background-color:color-mix(in oklab,var(--color-primary-foreground)20%,transparent)}}.hover\:bg-primary\/10:hover{background-color:color-mix(in srgb,hsl(var(--primary))10%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab,var(--color-primary)10%,transparent)}}.hover\:bg-primary\/80:hover{background-color:color-mix(in srgb,hsl(var(--primary))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab,var(--color-primary)80%,transparent)}}.hover\:bg-primary\/90:hover{background-color:color-mix(in srgb,hsl(var(--primary))90%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--color-primary)90%,transparent)}}.hover\:bg-secondary:hover{background-color:var(--color-secondary)}.hover\:bg-secondary\/80:hover{background-color:color-mix(in srgb,hsl(var(--secondary))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--color-secondary)80%,transparent)}}.hover\:bg-sidebar-accent:hover{background-color:var(--color-sidebar-accent)}.hover\:text-accent-foreground:hover{color:var(--color-accent-foreground)}.hover\:text-amber-400:hover{color:var(--color-amber-400)}.hover\:text-destructive:hover{color:var(--color-destructive)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:text-foreground\/80:hover{color:color-mix(in srgb,hsl(var(--foreground))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:text-foreground\/80:hover{color:color-mix(in oklab,var(--color-foreground)80%,transparent)}}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-primary-foreground\/80:hover{color:color-mix(in srgb,hsl(var(--primary-foreground))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary-foreground\/80:hover{color:color-mix(in oklab,var(--color-primary-foreground)80%,transparent)}}.hover\:text-primary\/80:hover{color:color-mix(in srgb,hsl(var(--primary))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,var(--color-primary)80%,transparent)}}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-sidebar-accent-foreground:hover{color:var(--color-sidebar-accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-data-\[collapsible\=offcanvas\]\:hover\:bg-sidebar:is(:where(.group)[data-collapsible=offcanvas] *):hover{background-color:var(--color-sidebar)}.group-\[\.destructive\]\:hover\:border-destructive\/30:is(:where(.group).destructive *):hover{border-color:color-mix(in srgb,hsl(var(--destructive))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.group-\[\.destructive\]\:hover\:border-destructive\/30:is(:where(.group).destructive *):hover{border-color:color-mix(in oklab,var(--color-destructive)30%,transparent)}}.group-\[\.destructive\]\:hover\:bg-destructive:is(:where(.group).destructive *):hover{background-color:var(--color-destructive)}.group-\[\.destructive\]\:hover\:text-destructive-foreground:is(:where(.group).destructive *):hover{color:var(--color-destructive-foreground)}.group-\[\.destructive\]\:hover\:text-red-50:is(:where(.group).destructive *):hover{color:var(--color-red-50)}.hover\:after\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:var(--color-sidebar-border)}}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:text-accent-foreground:focus{color:var(--color-accent-foreground)}.focus\:text-destructive:focus{color:var(--color-destructive)}.focus\:opacity-100:focus{opacity:1}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-primary\/40:focus{--tw-ring-color:color-mix(in srgb,hsl(var(--primary))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.focus\:ring-primary\/40:focus{--tw-ring-color:color-mix(in oklab,var(--color-primary)40%,transparent)}}.focus\:ring-ring:focus{--tw-ring-color:var(--color-ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.group-\[\.destructive\]\:focus\:ring-destructive:is(:where(.group).destructive *):focus{--tw-ring-color:var(--color-destructive)}.group-\[\.destructive\]\:focus\:ring-red-400:is(:where(.group).destructive *):focus{--tw-ring-color:var(--color-red-400)}.group-\[\.destructive\]\:focus\:ring-offset-red-600:is(:where(.group).destructive *):focus{--tw-ring-offset-color:var(--color-red-600)}.focus-visible\:h-9:focus-visible{height:calc(var(--spacing)*9)}.focus-visible\:border-primary\/50:focus-visible{border-color:color-mix(in srgb,hsl(var(--primary))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:border-primary\/50:focus-visible{border-color:color-mix(in oklab,var(--color-primary)50%,transparent)}}.focus-visible\:border-ring:focus-visible{border-color:var(--color-ring)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-primary\/30:focus-visible{--tw-ring-color:color-mix(in srgb,hsl(var(--primary))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-primary\/30:focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-primary)30%,transparent)}}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in srgb,hsl(var(--ring))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-ring)50%,transparent)}}.focus-visible\:ring-sidebar-ring:focus-visible{--tw-ring-color:var(--color-sidebar-ring)}.focus-visible\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:bg-sidebar-accent:active{background-color:var(--color-sidebar-accent)}.active\:text-sidebar-accent-foreground:active{color:var(--color-sidebar-accent-foreground)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-\[\[data-variant\=inset\]\]\:bg-sidebar:has([data-variant=inset]){background-color:var(--color-sidebar)}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.data-\[active\=true\]\:bg-sidebar-accent[data-active=true]{background-color:var(--color-sidebar-accent)}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active=true]{color:var(--color-sidebar-accent-foreground)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:calc(var(--spacing)*0)}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:calc(var(--spacing)*1)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-.5rem}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:.5rem}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-.5rem}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:.5rem}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--color-background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--color-foreground)}.data-\[state\=active\]\:shadow[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--tw-translate-x: calc(100% - 2px) ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--color-primary)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=closed\]\:animate-out[data-state=closed]{--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial;animation-name:exit;animation-duration:.15s}.data-\[state\=closed\]\:duration-300[data-state=closed]{animation-duration:.3s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--color-accent)}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:var(--color-secondary)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--color-accent-foreground)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--color-muted-foreground)}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=open\]\:animate-in[data-state=open]{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.data-\[state\=open\]\:duration-500[data-state=open]{animation-duration:.5s}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}@media (hover:hover){.data-\[state\=open\]\:hover\:bg-sidebar-accent[data-state=open]:hover{background-color:var(--color-sidebar-accent)}.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground[data-state=open]:hover{color:var(--color-sidebar-accent-foreground)}}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--color-input)}@media (min-width:40rem){.sm\:top-auto{top:auto}.sm\:right-0{right:calc(var(--spacing)*0)}.sm\:bottom-0{bottom:calc(var(--spacing)*0)}.sm\:flex{display:flex}.sm\:inline{display:inline}.sm\:max-w-5xl{max-width:var(--container-5xl)}.sm\:max-w-\[425px\]{max-width:425px}.sm\:max-w-\[525px\]{max-width:525px}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:text-left{text-align:left}}@media (min-width:48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:max-w-\[420px\]{max-width:420px}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing)*2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing)*0)}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:var(--radius-xl)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2:is(:where(.peer)[data-state=collapsed]~*):is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing)*2)}}.after\:md\:hidden:after{content:var(--tw-content)}@media (min-width:48rem){.after\:md\:hidden:after{display:none}}@media (min-width:64rem){.lg\:flex{display:flex}.lg\:hidden{display:none}}.dark\:block:is(.dark *){display:block}.dark\:hidden:is(.dark *){display:none}.dark\:scale-0:is(.dark *){--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.dark\:scale-100:is(.dark *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.dark\:-rotate-90:is(.dark *){rotate:-90deg}.dark\:rotate-0:is(.dark *){rotate:none}.dark\:border-amber-500\/40:is(.dark *){border-color:#f99c0066}@supports (color:color-mix(in lab,red,red)){.dark\:border-amber-500\/40:is(.dark *){border-color:color-mix(in oklab,var(--color-amber-500)40%,transparent)}}.dark\:border-amber-800:is(.dark *){border-color:var(--color-amber-800)}.dark\:border-amber-900:is(.dark *){border-color:var(--color-amber-900)}.dark\:border-blue-400:is(.dark *){border-color:var(--color-blue-400)}.dark\:border-blue-500\/40:is(.dark *){border-color:#3080ff66}@supports (color:color-mix(in lab,red,red)){.dark\:border-blue-500\/40:is(.dark *){border-color:color-mix(in oklab,var(--color-blue-500)40%,transparent)}}.dark\:border-destructive:is(.dark *){border-color:var(--color-destructive)}.dark\:border-green-400:is(.dark *){border-color:var(--color-green-400)}.dark\:border-purple-400:is(.dark *){border-color:var(--color-purple-400)}.dark\:border-purple-500\/40:is(.dark *){border-color:#ac4bff66}@supports (color:color-mix(in lab,red,red)){.dark\:border-purple-500\/40:is(.dark *){border-color:color-mix(in oklab,var(--color-purple-500)40%,transparent)}}.dark\:bg-amber-900\/40:is(.dark *){background-color:#7b330666}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-900\/40:is(.dark *){background-color:color-mix(in oklab,var(--color-amber-900)40%,transparent)}}.dark\:bg-amber-950:is(.dark *){background-color:var(--color-amber-950)}.dark\:bg-amber-950\/30:is(.dark *){background-color:#4619014d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-950\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-amber-950)30%,transparent)}}.dark\:bg-amber-950\/50:is(.dark *){background-color:#46190180}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-950\/50:is(.dark *){background-color:color-mix(in oklab,var(--color-amber-950)50%,transparent)}}.dark\:bg-blue-900\/20:is(.dark *){background-color:#1c398e33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-900\/20:is(.dark *){background-color:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark\:bg-gray-900\/50:is(.dark *){background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.dark\:bg-gray-900\/50:is(.dark *){background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.dark\:bg-green-400:is(.dark *){background-color:var(--color-green-400)}.dark\:bg-green-900\/20:is(.dark *){background-color:#0d542b33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-900\/20:is(.dark *){background-color:color-mix(in oklab,var(--color-green-900)20%,transparent)}}.dark\:bg-green-900\/40:is(.dark *){background-color:#0d542b66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-900\/40:is(.dark *){background-color:color-mix(in oklab,var(--color-green-900)40%,transparent)}}.dark\:bg-purple-400:is(.dark *){background-color:var(--color-purple-400)}.dark\:bg-purple-900\/20:is(.dark *){background-color:#59168b33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-purple-900\/20:is(.dark *){background-color:color-mix(in oklab,var(--color-purple-900)20%,transparent)}}.dark\:bg-purple-900\/40:is(.dark *){background-color:#59168b66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-purple-900\/40:is(.dark *){background-color:color-mix(in oklab,var(--color-purple-900)40%,transparent)}}.dark\:text-amber-300:is(.dark *){color:var(--color-amber-300)}.dark\:text-amber-400:is(.dark *){color:var(--color-amber-400)}.dark\:text-blue-300:is(.dark *){color:var(--color-blue-300)}.dark\:text-blue-400:is(.dark *){color:var(--color-blue-400)}.dark\:text-gray-400:is(.dark *){color:var(--color-gray-400)}.dark\:text-gray-500:is(.dark *){color:var(--color-gray-500)}.dark\:text-green-300:is(.dark *){color:var(--color-green-300)}.dark\:text-green-400:is(.dark *){color:var(--color-green-400)}.dark\:text-purple-300:is(.dark *){color:var(--color-purple-300)}.dark\:text-purple-400:is(.dark *){color:var(--color-purple-400)}@media (hover:hover){.dark\:hover\:bg-amber-900:is(.dark *):hover{background-color:var(--color-amber-900)}.dark\:hover\:bg-amber-900\/50:is(.dark *):hover{background-color:#7b330680}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-amber-900\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--color-amber-900)50%,transparent)}}.dark\:hover\:text-gray-300:is(.dark *):hover{color:var(--color-gray-300)}}.dark\:data-\[state\=checked\]\:bg-primary-foreground:is(.dark *)[data-state=checked]{background-color:var(--color-primary-foreground)}.dark\:data-\[state\=unchecked\]\:bg-foreground:is(.dark *)[data-state=unchecked]{background-color:var(--color-foreground)}.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:color-mix(in srgb,hsl(var(--input))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:color-mix(in oklab,var(--color-input)80%,transparent)}}.\[\&_\[data-radix-scroll-area-viewport\]\>div\]\:\!block [data-radix-scroll-area-viewport]>div{display:block!important}.\[\&_h1\]\:my-2 h1{margin-block:calc(var(--spacing)*2)}.\[\&_h1\]\:text-base h1{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.\[\&_h2\]\:my-1\.5 h2{margin-block:calc(var(--spacing)*1.5)}.\[\&_h2\]\:text-sm h2{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&_h3\]\:my-1 h3{margin-block:calc(var(--spacing)*1)}.\[\&_h3\]\:text-sm h3{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&_li\]\:my-0\.5 li{margin-block:calc(var(--spacing)*.5)}.\[\&_ol\]\:my-1 ol,.\[\&_p\]\:my-1 p{margin-block:calc(var(--spacing)*1)}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_pre\]\:overflow-x-auto pre{overflow-x:auto}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_ul\]\:my-1 ul{margin-block:calc(var(--spacing)*1)}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>div\>div\]\:\!h-full>div>div{height:100%!important}.\[\&\>span\]\:truncate>span,.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing)*4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing)*4)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-destructive>svg{color:var(--color-destructive)}.\[\&\>svg\]\:text-foreground>svg{color:var(--color-foreground)}.\[\&\>svg\]\:text-sidebar-accent-foreground>svg{color:var(--color-sidebar-accent-foreground)}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x)var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing)*7)}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing)*-2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing)*-2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}body{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0))}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|