admin08077 commited on
Commit
777dff7
·
verified ·
1 Parent(s): b9aff69

Upload 131 files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. assets/@braintree-9Zuj5s7N.js +2 -0
  2. assets/@braintree-9Zuj5s7N.js.map +1 -0
  3. assets/@google-4tyssLU_.js +0 -0
  4. assets/@google-4tyssLU_.js.map +0 -0
  5. assets/@xterm-DYP7pi_n.css +32 -0
  6. assets/@xterm-i03dpVGE.js +0 -0
  7. assets/@xterm-i03dpVGE.js.map +0 -0
  8. assets/AiCodeExplainer-B2pZiqoI.js +11 -0
  9. assets/AiCodeExplainer-B2pZiqoI.js.map +1 -0
  10. assets/AiCodingChallenge-C2KUVZGw.js +2 -0
  11. assets/AiCodingChallenge-C2KUVZGw.js.map +1 -0
  12. assets/AiCommitGenerator-D1jLIXXz.js +14 -0
  13. assets/AiCommitGenerator-D1jLIXXz.js.map +1 -0
  14. assets/AiFeatureBuilder-C6lUv4NI.js +2 -0
  15. assets/AiFeatureBuilder-C6lUv4NI.js.map +1 -0
  16. assets/AiStyleTransfer-Ck-v5VJh.js +4 -0
  17. assets/AiStyleTransfer-Ck-v5VJh.js.map +1 -0
  18. assets/AiUnitTestGenerator-CTwRrA4_.js +5 -0
  19. assets/AiUnitTestGenerator-CTwRrA4_.js.map +1 -0
  20. assets/ApiTester-BE2AsWga.js +6 -0
  21. assets/ApiTester-BE2AsWga.js.map +1 -0
  22. assets/AudioToCode-CJm_3BF6.js +2 -0
  23. assets/AudioToCode-CJm_3BF6.js.map +1 -0
  24. assets/ChangelogGenerator-C_BR7_cn.js +20 -0
  25. assets/ChangelogGenerator-C_BR7_cn.js.map +1 -0
  26. assets/ClipboardHistory-CLvZGDee.js +2 -0
  27. assets/ClipboardHistory-CLvZGDee.js.map +1 -0
  28. assets/ClipboardSnippetInserter-CASD8YIS.js +2 -0
  29. assets/ClipboardSnippetInserter-CASD8YIS.js.map +1 -0
  30. assets/ClipboardToCode-DUFUEH4X.js +4 -0
  31. assets/ClipboardToCode-DUFUEH4X.js.map +1 -0
  32. assets/CodeAudioNarrator-0iRIzTGo.js +4 -0
  33. assets/CodeAudioNarrator-0iRIzTGo.js.map +1 -0
  34. assets/CodeFormatter-WxvCjjsg.js +8 -0
  35. assets/CodeFormatter-WxvCjjsg.js.map +1 -0
  36. assets/CodeReviewBot-CGh-qSwY.js +12 -0
  37. assets/CodeReviewBot-CGh-qSwY.js.map +1 -0
  38. assets/CodeToFlowchart-3OF-wAs8.js +10 -0
  39. assets/CodeToFlowchart-3OF-wAs8.js.map +1 -0
  40. assets/ColorPaletteGenerator-DaoImThU.js +2 -0
  41. assets/ColorPaletteGenerator-DaoImThU.js.map +1 -0
  42. assets/CommandPaletteTrigger-CeEG-Bco.js +2 -0
  43. assets/CommandPaletteTrigger-CeEG-Bco.js.map +1 -0
  44. assets/ContentManager-C8GCJQRb.js +2 -0
  45. assets/ContentManager-C8GCJQRb.js.map +1 -0
  46. assets/CronJobBuilder-BIeiRqkV.js +2 -0
  47. assets/CronJobBuilder-BIeiRqkV.js.map +1 -0
  48. assets/CssGridEditor-C2MVm2J7.js +7 -0
  49. assets/CssGridEditor-C2MVm2J7.js.map +1 -0
  50. assets/CustomCliGenerator-It0h0kmb.js +19 -0
assets/@braintree-9Zuj5s7N.js ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ var g=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function h(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var m={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.sanitizeUrl=e.BLANK_URL=void 0;var l=/^([^\w]*)(javascript|data|vbscript)/im,u=/&#(\w+)(^\w|;)?/g,o=/&(newline|tab);/gi,n=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,c=/^.+(:|&colon;)/gim,f=[".","/"];e.BLANK_URL="about:blank";function d(t){return f.indexOf(t[0])>-1}function s(t){var r=t.replace(n,"");return r.replace(u,function(a,i){return String.fromCharCode(i)})}function v(t){if(!t)return e.BLANK_URL;var r=s(t).replace(o,"").replace(n,"").trim();if(!r)return e.BLANK_URL;if(d(r))return r;var a=r.match(c);if(!a)return r;var i=a[0];return l.test(i)?e.BLANK_URL:r}e.sanitizeUrl=v})(m);export{g as c,m as d,h as g};
2
+ //# sourceMappingURL=@braintree-9Zuj5s7N.js.map
assets/@braintree-9Zuj5s7N.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"@braintree-9Zuj5s7N.js","sources":["../../node_modules/@braintree/sanitize-url/dist/index.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sanitizeUrl = exports.BLANK_URL = void 0;\nvar invalidProtocolRegex = /^([^\\w]*)(javascript|data|vbscript)/im;\nvar htmlEntitiesRegex = /&#(\\w+)(^\\w|;)?/g;\nvar htmlCtrlEntityRegex = /&(newline|tab);/gi;\nvar ctrlCharactersRegex = /[\\u0000-\\u001F\\u007F-\\u009F\\u2000-\\u200D\\uFEFF]/gim;\nvar urlSchemeRegex = /^.+(:|&colon;)/gim;\nvar relativeFirstCharacters = [\".\", \"/\"];\nexports.BLANK_URL = \"about:blank\";\nfunction isRelativeUrlWithoutProtocol(url) {\n return relativeFirstCharacters.indexOf(url[0]) > -1;\n}\n// adapted from https://stackoverflow.com/a/29824550/2601552\nfunction decodeHtmlCharacters(str) {\n var removedNullByte = str.replace(ctrlCharactersRegex, \"\");\n return removedNullByte.replace(htmlEntitiesRegex, function (match, dec) {\n return String.fromCharCode(dec);\n });\n}\nfunction sanitizeUrl(url) {\n if (!url) {\n return exports.BLANK_URL;\n }\n var sanitizedUrl = decodeHtmlCharacters(url)\n .replace(htmlCtrlEntityRegex, \"\")\n .replace(ctrlCharactersRegex, \"\")\n .trim();\n if (!sanitizedUrl) {\n return exports.BLANK_URL;\n }\n if (isRelativeUrlWithoutProtocol(sanitizedUrl)) {\n return sanitizedUrl;\n }\n var urlSchemeParseResults = sanitizedUrl.match(urlSchemeRegex);\n if (!urlSchemeParseResults) {\n return sanitizedUrl;\n }\n var urlScheme = urlSchemeParseResults[0];\n if (invalidProtocolRegex.test(urlScheme)) {\n return exports.BLANK_URL;\n }\n return sanitizedUrl;\n}\nexports.sanitizeUrl = sanitizeUrl;\n"],"names":["exports","invalidProtocolRegex","htmlEntitiesRegex","htmlCtrlEntityRegex","ctrlCharactersRegex","urlSchemeRegex","relativeFirstCharacters","isRelativeUrlWithoutProtocol","url","decodeHtmlCharacters","str","removedNullByte","match","dec","sanitizeUrl","sanitizedUrl","urlSchemeParseResults","urlScheme"],"mappings":"2OACA,OAAO,eAAcA,EAAU,aAAc,CAAE,MAAO,GAAM,EAC5DA,EAAA,YAAsBA,EAAA,UAAoB,OAC1C,IAAIC,EAAuB,wCACvBC,EAAoB,mBACpBC,EAAsB,oBACtBC,EAAsB,qDACtBC,EAAiB,oBACjBC,EAA0B,CAAC,IAAK,GAAG,EACvCN,EAAA,UAAoB,cACpB,SAASO,EAA6BC,EAAK,CACvC,OAAOF,EAAwB,QAAQE,EAAI,CAAC,CAAC,EAAI,EACrD,CAEA,SAASC,EAAqBC,EAAK,CAC/B,IAAIC,EAAkBD,EAAI,QAAQN,EAAqB,EAAE,EACzD,OAAOO,EAAgB,QAAQT,EAAmB,SAAUU,EAAOC,EAAK,CACpE,OAAO,OAAO,aAAaA,CAAG,CACtC,CAAK,CACL,CACA,SAASC,EAAYN,EAAK,CACtB,GAAI,CAACA,EACD,OAAOR,EAAQ,UAEnB,IAAIe,EAAeN,EAAqBD,CAAG,EACtC,QAAQL,EAAqB,EAAE,EAC/B,QAAQC,EAAqB,EAAE,EAC/B,KAAI,EACT,GAAI,CAACW,EACD,OAAOf,EAAQ,UAEnB,GAAIO,EAA6BQ,CAAY,EACzC,OAAOA,EAEX,IAAIC,EAAwBD,EAAa,MAAMV,CAAc,EAC7D,GAAI,CAACW,EACD,OAAOD,EAEX,IAAIE,EAAYD,EAAsB,CAAC,EACvC,OAAIf,EAAqB,KAAKgB,CAAS,EAC5BjB,EAAQ,UAEZe,CACX,CACAf,EAAA,YAAsBc","x_google_ignoreList":[0]}
assets/@google-4tyssLU_.js ADDED
The diff for this file is too large to render. See raw diff
 
assets/@google-4tyssLU_.js.map ADDED
The diff for this file is too large to render. See raw diff
 
assets/@xterm-DYP7pi_n.css ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
+ * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
+ * https://github.com/chjj/term.js
5
+ * @license MIT
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ *
25
+ * Originally forked from (with the author's permission):
26
+ * Fabrice Bellard's javascript vt100 for jslinux:
27
+ * http://bellard.org/jslinux/
28
+ * Copyright (c) 2011 Fabrice Bellard
29
+ * The original design remains. The terminal itself
30
+ * has been extended to include xterm CSI codes, among
31
+ * other features.
32
+ */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}
assets/@xterm-i03dpVGE.js ADDED
The diff for this file is too large to render. See raw diff
 
assets/@xterm-i03dpVGE.js.map ADDED
The diff for this file is too large to render. See raw diff
 
assets/AiCodeExplainer-B2pZiqoI.js ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import{r as o,j as e}from"./react-_fH1j4AW.js";import{e as u}from"./geminiService-7wPGMJPL.js";import{a as f}from"./index-Nqm_ElTk.js";import{m as h}from"./marked-CesSW9Du.js";import"./@braintree-9Zuj5s7N.js";import"./@google-4tyssLU_.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const p=()=>e.jsxs("div",{className:"flex items-center justify-center space-x-2",children:[e.jsx("div",{className:"w-2 h-2 rounded-full bg-cyan-400 animate-pulse",style:{animationDelay:"0s"}}),e.jsx("div",{className:"w-2 h-2 rounded-full bg-cyan-400 animate-pulse",style:{animationDelay:"0.2s"}}),e.jsx("div",{className:"w-2 h-2 rounded-full bg-cyan-400 animate-pulse",style:{animationDelay:"0.4s"}}),e.jsx("span",{className:"text-slate-400 ml-2",children:"AI is thinking..."})]}),j=`const bubbleSort = (arr) => {
2
+ for (let i = 0; i < arr.length; i++) {
3
+ for (let j = 0; j < arr.length - i - 1; j++) {
4
+ if (arr[j] > arr[j + 1]) {
5
+ [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
6
+ }
7
+ }
8
+ }
9
+ return arr;
10
+ };`,Ie=()=>{const[s,c]=o.useState(j),[a,n]=o.useState(""),[r,m]=o.useState(!1),[i,l]=o.useState(""),d=o.useCallback(async()=>{if(!s.trim()){l("Please enter some code to explain.");return}m(!0),l(""),n("");try{const t=await u(s);n(t)}catch(t){const x=t instanceof Error?t.message:"An unknown error occurred.";l(`Failed to get explanation: ${x}`)}finally{m(!1)}},[s]);return e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8 text-slate-300",children:[e.jsxs("header",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(f,{}),e.jsx("span",{className:"ml-3",children:"AI Code Explainer"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"Paste a code snippet below and let Gemini explain it to you."})]}),e.jsxs("div",{className:"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden",children:[e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{htmlFor:"code-input",className:"text-sm font-medium text-slate-400 mb-2",children:"Your Code"}),e.jsx("textarea",{id:"code-input",value:s,onChange:t=>c(t.target.value),placeholder:"Paste your code here...",className:"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none"}),e.jsx("button",{onClick:d,disabled:r,className:"mt-4 w-full flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed",children:r?e.jsx(p,{}):"Generate Explanation"})]}),e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{className:"text-sm font-medium text-slate-400 mb-2",children:"AI Explanation"}),e.jsxs("div",{className:"flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto",children:[r&&e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(p,{})}),i&&e.jsx("p",{className:"text-red-400",children:i}),a&&!r&&e.jsx("div",{className:"prose prose-sm prose-invert max-w-none prose-headings:text-slate-200 prose-p:text-slate-300 prose-strong:text-slate-100 prose-code:text-cyan-300 prose-code:before:content-none prose-code:after:content-none prose-pre:bg-slate-900/50 prose-pre:border prose-pre:border-slate-700",dangerouslySetInnerHTML:{__html:h(a)}}),!r&&!a&&!i&&e.jsx("div",{className:"text-slate-500 h-full flex items-center justify-center",children:"The explanation will appear here."})]})]})]})]})};export{Ie as AiCodeExplainer};
11
+ //# sourceMappingURL=AiCodeExplainer-B2pZiqoI.js.map
assets/AiCodeExplainer-B2pZiqoI.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"AiCodeExplainer-B2pZiqoI.js","sources":["../../components/AiCodeExplainer.tsx"],"sourcesContent":["\nimport React, { useState, useCallback } from 'react';\nimport { explainCode } from '../services/geminiService.ts';\nimport { CpuChipIcon } from './icons/InterfaceIcons.tsx';\nimport { marked } from 'marked';\n\nconst LoadingSpinner: React.FC = () => (\n <div className=\"flex items-center justify-center space-x-2\">\n <div className=\"w-2 h-2 rounded-full bg-cyan-400 animate-pulse\" style={{ animationDelay: '0s' }}></div>\n <div className=\"w-2 h-2 rounded-full bg-cyan-400 animate-pulse\" style={{ animationDelay: '0.2s' }}></div>\n <div className=\"w-2 h-2 rounded-full bg-cyan-400 animate-pulse\" style={{ animationDelay: '0.4s' }}></div>\n <span className=\"text-slate-400 ml-2\">AI is thinking...</span>\n </div>\n);\n\nconst exampleCode = `const bubbleSort = (arr) => {\n for (let i = 0; i < arr.length; i++) {\n for (let j = 0; j < arr.length - i - 1; j++) {\n if (arr[j] > arr[j + 1]) {\n [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];\n }\n }\n }\n return arr;\n};`;\n\nexport const AiCodeExplainer: React.FC = () => {\n const [code, setCode] = useState<string>(exampleCode);\n const [explanation, setExplanation] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n\n const handleExplain = useCallback(async () => {\n if (!code.trim()) {\n setError('Please enter some code to explain.');\n return;\n }\n setIsLoading(true);\n setError('');\n setExplanation('');\n try {\n const result = await explainCode(code);\n setExplanation(result);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to get explanation: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n }, [code]);\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8 text-slate-300\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <CpuChipIcon />\n <span className=\"ml-3\">AI Code Explainer</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Paste a code snippet below and let Gemini explain it to you.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden\">\n <div className=\"flex flex-col h-full\">\n <label htmlFor=\"code-input\" className=\"text-sm font-medium text-slate-400 mb-2\">Your Code</label>\n <textarea\n id=\"code-input\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n placeholder=\"Paste your code here...\"\n className=\"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none\"\n />\n <button\n onClick={handleExplain}\n disabled={isLoading}\n className=\"mt-4 w-full flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed\"\n >\n {isLoading ? <LoadingSpinner /> : 'Generate Explanation'}\n </button>\n </div>\n <div className=\"flex flex-col h-full\">\n <label className=\"text-sm font-medium text-slate-400 mb-2\">AI Explanation</label>\n <div className=\"flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto\">\n {isLoading && (\n <div className=\"flex items-center justify-center h-full\">\n <LoadingSpinner />\n </div>\n )}\n {error && <p className=\"text-red-400\">{error}</p>}\n {explanation && !isLoading && (\n <div\n className=\"prose prose-sm prose-invert max-w-none prose-headings:text-slate-200 prose-p:text-slate-300 prose-strong:text-slate-100 prose-code:text-cyan-300 prose-code:before:content-none prose-code:after:content-none prose-pre:bg-slate-900/50 prose-pre:border prose-pre:border-slate-700\"\n dangerouslySetInnerHTML={{ __html: marked(explanation) }}\n />\n )}\n {!isLoading && !explanation && !error && (\n <div className=\"text-slate-500 h-full flex items-center justify-center\">\n The explanation will appear here.\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};"],"names":["LoadingSpinner","jsxs","jsx","exampleCode","AiCodeExplainer","code","setCode","useState","explanation","setExplanation","isLoading","setIsLoading","error","setError","handleExplain","useCallback","result","explainCode","err","errorMessage","CpuChipIcon","e","marked"],"mappings":"m5EAMA,MAAMA,EAA2B,IAC7BC,EAAAA,KAAC,MAAA,CAAI,UAAU,6CACX,SAAA,CAAAC,MAAC,OAAI,UAAU,iDAAiD,MAAO,CAAE,eAAgB,MAAQ,EACjGA,MAAC,OAAI,UAAU,iDAAiD,MAAO,CAAE,eAAgB,QAAU,EACnGA,MAAC,OAAI,UAAU,iDAAiD,MAAO,CAAE,eAAgB,QAAU,EACnGA,EAAAA,IAAC,OAAA,CAAK,UAAU,sBAAsB,SAAA,mBAAA,CAAiB,CAAA,EAC3D,EAGEC,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWPC,GAA4B,IAAM,CAC3C,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAiBJ,CAAW,EAC9C,CAACK,EAAaC,CAAc,EAAIF,EAAAA,SAAiB,EAAE,EACnD,CAACG,EAAWC,CAAY,EAAIJ,EAAAA,SAAkB,EAAK,EACnD,CAACK,EAAOC,CAAQ,EAAIN,EAAAA,SAAiB,EAAE,EAEvCO,EAAgBC,EAAAA,YAAY,SAAY,CAC1C,GAAI,CAACV,EAAK,OAAQ,CACdQ,EAAS,oCAAoC,EAC7C,MACJ,CACAF,EAAa,EAAI,EACjBE,EAAS,EAAE,EACXJ,EAAe,EAAE,EACjB,GAAI,CACA,MAAMO,EAAS,MAAMC,EAAYZ,CAAI,EACrCI,EAAeO,CAAM,CACzB,OAASE,EAAK,CACV,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,6BAC1DL,EAAS,8BAA8BM,CAAY,EAAE,CACzD,QAAA,CACIR,EAAa,EAAK,CACtB,CACJ,EAAG,CAACN,CAAI,CAAC,EAET,OACIJ,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,OACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACV,SAAA,CAAAC,EAAAA,IAACkB,EAAA,EAAY,EACblB,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,mBAAA,CAAiB,CAAA,EAC5C,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,8DAAA,CAA4D,CAAA,EACnG,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,yEACX,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,MAAC,QAAA,CAAM,QAAQ,aAAa,UAAU,0CAA0C,SAAA,YAAS,EACzFA,EAAAA,IAAC,WAAA,CACG,GAAG,aACH,MAAOG,EACP,SAAWgB,GAAMf,EAAQe,EAAE,OAAO,KAAK,EACvC,YAAY,0BACZ,UAAU,+JAAA,CAAA,EAEdnB,EAAAA,IAAC,SAAA,CACG,QAASY,EACT,SAAUJ,EACV,UAAU,+LAET,SAAAA,EAAYR,EAAAA,IAACF,EAAA,CAAA,CAAe,EAAK,sBAAA,CAAA,CACtC,EACJ,EACAC,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,0CAA0C,SAAA,iBAAc,EACzED,EAAAA,KAAC,MAAA,CAAI,UAAU,sFACV,SAAA,CAAAS,SACK,MAAA,CAAI,UAAU,0CACZ,SAAAR,MAACF,IAAe,EACnB,EAEJY,GAASV,EAAAA,IAAC,IAAA,CAAE,UAAU,eAAgB,SAAAU,EAAM,EAC5CJ,GAAe,CAACE,GACbR,EAAAA,IAAC,MAAA,CACG,UAAU,sRACV,wBAAyB,CAAE,OAAQoB,EAAOd,CAAW,CAAA,CAAE,CAAA,EAG7D,CAACE,GAAa,CAACF,GAAe,CAACI,GAC7BV,EAAAA,IAAC,MAAA,CAAI,UAAU,yDAAyD,SAAA,mCAAA,CAExE,CAAA,CAAA,CAER,CAAA,CAAA,CACJ,CAAA,CAAA,CACJ,CAAA,EACJ,CAER"}
assets/AiCodingChallenge-C2KUVZGw.js ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ import{r as o,j as e}from"./react-_fH1j4AW.js";import{j as d}from"./geminiService-7wPGMJPL.js";import{B as x}from"./index-Nqm_ElTk.js";import{L as l}from"./LoadingSpinner-CeUbALLx.js";import{m as f}from"./marked-CesSW9Du.js";import"./@braintree-9Zuj5s7N.js";import"./@google-4tyssLU_.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const ke=()=>{const[s,m]=o.useState(""),[t,a]=o.useState(!1),[i,p]=o.useState(""),n=o.useCallback(async()=>{a(!0),p(""),m("");try{const r=await d();m(r)}catch(r){const c=r instanceof Error?r.message:"An unknown error occurred.";p(`Failed to generate challenge: ${c}`)}finally{a(!1)}},[]);return e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[e.jsxs("header",{className:"mb-6 flex justify-between items-center",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(x,{}),e.jsx("span",{className:"ml-3",children:"AI Coding Challenge Generator"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"Generate a unique coding problem to test your skills."})]}),e.jsx("button",{onClick:n,disabled:t,className:"flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed",children:t?e.jsx(l,{}):"Generate New Challenge"})]}),e.jsxs("div",{className:"flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto",children:[t&&e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(l,{})}),i&&e.jsx("p",{className:"text-red-400",children:i}),s&&!t&&e.jsx("div",{className:"prose prose-sm prose-invert max-w-none prose-headings:text-slate-200 prose-p:text-slate-300 prose-strong:text-slate-100 prose-code:text-cyan-300 prose-code:before:content-none prose-code:after:content-none prose-pre:bg-slate-900/50 prose-pre:border prose-pre:border-slate-700",dangerouslySetInnerHTML:{__html:f(s)}}),!t&&!s&&!i&&e.jsx("div",{className:"text-slate-500 h-full flex items-center justify-center",children:'Click "Generate New Challenge" to start.'})]})]})};export{ke as AiCodingChallenge};
2
+ //# sourceMappingURL=AiCodingChallenge-C2KUVZGw.js.map
assets/AiCodingChallenge-C2KUVZGw.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"AiCodingChallenge-C2KUVZGw.js","sources":["../../components/AiCodingChallenge.tsx"],"sourcesContent":["import React, { useState, useCallback } from 'react';\nimport { generateCodingChallenge } from '../services/geminiService.ts';\nimport { BeakerIcon } from './icons/FeatureIcons.tsx';\nimport { LoadingSpinner } from './shared/LoadingSpinner.tsx';\nimport { marked } from 'marked';\n\nexport const AiCodingChallenge: React.FC = () => {\n const [challenge, setChallenge] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n\n const handleGenerate = useCallback(async () => {\n setIsLoading(true);\n setError('');\n setChallenge('');\n try {\n const result = await generateCodingChallenge();\n setChallenge(result);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to generate challenge: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6 flex justify-between items-center\">\n <div>\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <BeakerIcon />\n <span className=\"ml-3\">AI Coding Challenge Generator</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Generate a unique coding problem to test your skills.</p>\n </div>\n <button\n onClick={handleGenerate}\n disabled={isLoading}\n className=\"flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed\"\n >\n {isLoading ? <LoadingSpinner /> : 'Generate New Challenge'}\n </button>\n </header>\n <div className=\"flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto\">\n {isLoading && (\n <div className=\"flex items-center justify-center h-full\">\n <LoadingSpinner />\n </div>\n )}\n {error && <p className=\"text-red-400\">{error}</p>}\n {challenge && !isLoading && (\n <div\n className=\"prose prose-sm prose-invert max-w-none prose-headings:text-slate-200 prose-p:text-slate-300 prose-strong:text-slate-100 prose-code:text-cyan-300 prose-code:before:content-none prose-code:after:content-none prose-pre:bg-slate-900/50 prose-pre:border prose-pre:border-slate-700\"\n dangerouslySetInnerHTML={{ __html: marked(challenge) }}\n />\n )}\n {!isLoading && !challenge && !error && (\n <div className=\"text-slate-500 h-full flex items-center justify-center\">\n Click \"Generate New Challenge\" to start.\n </div>\n )}\n </div>\n </div>\n );\n};"],"names":["AiCodingChallenge","challenge","setChallenge","useState","isLoading","setIsLoading","error","setError","handleGenerate","useCallback","result","generateCodingChallenge","err","errorMessage","jsxs","jsx","BeakerIcon","LoadingSpinner","marked"],"mappings":"o8EAMO,MAAMA,GAA8B,IAAM,CAC7C,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAiB,EAAE,EAC/C,CAACC,EAAWC,CAAY,EAAIF,EAAAA,SAAkB,EAAK,EACnD,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAiB,EAAE,EAEvCK,EAAiBC,EAAAA,YAAY,SAAY,CAC3CJ,EAAa,EAAI,EACjBE,EAAS,EAAE,EACXL,EAAa,EAAE,EACf,GAAI,CACA,MAAMQ,EAAS,MAAMC,EAAA,EACrBT,EAAaQ,CAAM,CACvB,OAASE,EAAK,CACV,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,6BAC1DL,EAAS,iCAAiCM,CAAY,EAAE,CAC5D,QAAA,CACIR,EAAa,EAAK,CACtB,CACJ,EAAG,CAAA,CAAE,EAEL,OACIS,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,yCACd,SAAA,CAAAA,OAAC,MAAA,CACG,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACV,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAW,EACZD,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,+BAAA,CAA6B,CAAA,EACxD,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,uDAAA,CAAqD,CAAA,EAC5F,EACAA,EAAAA,IAAC,SAAA,CACG,QAASP,EACT,SAAUJ,EACV,UAAU,mLAET,SAAAA,EAAYW,EAAAA,IAACE,EAAA,CAAA,CAAe,EAAK,wBAAA,CAAA,CACtC,EACJ,EACAH,EAAAA,KAAC,MAAA,CAAI,UAAU,sFACV,SAAA,CAAAV,SACK,MAAA,CAAI,UAAU,0CACZ,SAAAW,MAACE,IAAe,EACnB,EAEJX,GAASS,EAAAA,IAAC,IAAA,CAAE,UAAU,eAAgB,SAAAT,EAAM,EAC5CL,GAAa,CAACG,GACXW,EAAAA,IAAC,MAAA,CACG,UAAU,sRACV,wBAAyB,CAAE,OAAQG,EAAOjB,CAAS,CAAA,CAAE,CAAA,EAG3D,CAACG,GAAa,CAACH,GAAa,CAACK,GAC3BS,EAAAA,IAAC,MAAA,CAAI,UAAU,yDAAyD,SAAA,0CAAA,CAExE,CAAA,CAAA,CAER,CAAA,EACJ,CAER"}
assets/AiCommitGenerator-D1jLIXXz.js ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import{r as s,j as e}from"./react-_fH1j4AW.js";import{b as u}from"./geminiService-7wPGMJPL.js";import{G as g}from"./index-Nqm_ElTk.js";import{L as p}from"./LoadingSpinner-CeUbALLx.js";import"./@braintree-9Zuj5s7N.js";import"./@google-4tyssLU_.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const h=`diff --git a/src/components/Button.tsx b/src/components/Button.tsx
2
+ index 1b2c3d4..5e6f7g8 100644
3
+ --- a/src/components/Button.tsx
4
+ +++ b/src/components/Button.tsx
5
+ @@ -1,7 +1,7 @@
6
+ import React from 'react';
7
+
8
+ interface ButtonProps {
9
+ - text: string;
10
+ + label: string;
11
+ onClick: () => void;
12
+ }
13
+ `,Me=()=>{const[o,c]=s.useState(h),[i,l]=s.useState(""),[r,n]=s.useState(!1),[a,m]=s.useState(""),d=s.useCallback(async()=>{if(!o.trim()){m("Please paste a diff to generate a message.");return}n(!0),m(""),l("");try{const t=await u(o);l(t)}catch(t){const x=t instanceof Error?t.message:"An unknown error occurred.";m(`Failed to generate message: ${x}`)}finally{n(!1)}},[o]),f=()=>{navigator.clipboard.writeText(i)};return e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[e.jsxs("header",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(g,{}),e.jsx("span",{className:"ml-3",children:"AI Commit Message Generator"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"Paste your diff and let Gemini craft the perfect commit message."})]}),e.jsxs("div",{className:"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden",children:[e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{htmlFor:"diff-input",className:"text-sm font-medium text-slate-400 mb-2",children:"Git Diff"}),e.jsx("textarea",{id:"diff-input",value:o,onChange:t=>c(t.target.value),placeholder:"Paste your git diff here...",className:"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-slate-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none"}),e.jsx("button",{onClick:d,disabled:r,className:"mt-4 w-full flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed",children:r?e.jsx(p,{}):"Generate Commit Message"})]}),e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{className:"text-sm font-medium text-slate-400 mb-2",children:"Generated Message"}),e.jsxs("div",{className:"relative flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto",children:[r&&e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(p,{})}),a&&e.jsx("p",{className:"text-red-400",children:a}),i&&!r&&e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:f,className:"absolute top-2 right-2 px-2 py-1 bg-slate-700 hover:bg-slate-600 rounded-md text-xs",children:"Copy"}),e.jsx("pre",{className:"whitespace-pre-wrap font-sans text-slate-200",children:i})]}),!r&&!i&&!a&&e.jsx("div",{className:"text-slate-500 h-full flex items-center justify-center",children:"The commit message will appear here."})]})]})]})]})};export{Me as AiCommitGenerator};
14
+ //# sourceMappingURL=AiCommitGenerator-D1jLIXXz.js.map
assets/AiCommitGenerator-D1jLIXXz.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"AiCommitGenerator-D1jLIXXz.js","sources":["../../components/AiCommitGenerator.tsx"],"sourcesContent":["\nimport React, { useState, useCallback } from 'react';\nimport { generateCommitMessage } from '../services/geminiService.ts';\nimport { GitBranchIcon } from './icons/FeatureIcons.tsx';\nimport { LoadingSpinner } from './shared/LoadingSpinner.tsx';\n\nconst exampleDiff = `diff --git a/src/components/Button.tsx b/src/components/Button.tsx\nindex 1b2c3d4..5e6f7g8 100644\n--- a/src/components/Button.tsx\n+++ b/src/components/Button.tsx\n@@ -1,7 +1,7 @@\n import React from 'react';\n\n interface ButtonProps {\n- text: string;\n+ label: string;\n onClick: () => void;\n }\n`;\n\nexport const AiCommitGenerator: React.FC = () => {\n const [diff, setDiff] = useState<string>(exampleDiff);\n const [message, setMessage] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n\n const handleGenerate = useCallback(async () => {\n if (!diff.trim()) {\n setError('Please paste a diff to generate a message.');\n return;\n }\n setIsLoading(true);\n setError('');\n setMessage('');\n try {\n const result = await generateCommitMessage(diff);\n setMessage(result);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to generate message: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n }, [diff]);\n \n const handleCopy = () => {\n navigator.clipboard.writeText(message);\n };\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <GitBranchIcon />\n <span className=\"ml-3\">AI Commit Message Generator</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Paste your diff and let Gemini craft the perfect commit message.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden\">\n <div className=\"flex flex-col h-full\">\n <label htmlFor=\"diff-input\" className=\"text-sm font-medium text-slate-400 mb-2\">Git Diff</label>\n <textarea\n id=\"diff-input\"\n value={diff}\n onChange={(e) => setDiff(e.target.value)}\n placeholder=\"Paste your git diff here...\"\n className=\"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-slate-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none\"\n />\n <button\n onClick={handleGenerate}\n disabled={isLoading}\n className=\"mt-4 w-full flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed\"\n >\n {isLoading ? <LoadingSpinner /> : 'Generate Commit Message'}\n </button>\n </div>\n <div className=\"flex flex-col h-full\">\n <label className=\"text-sm font-medium text-slate-400 mb-2\">Generated Message</label>\n <div className=\"relative flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto\">\n {isLoading && (\n <div className=\"flex items-center justify-center h-full\">\n <LoadingSpinner />\n </div>\n )}\n {error && <p className=\"text-red-400\">{error}</p>}\n {message && !isLoading && (\n <>\n <button onClick={handleCopy} className=\"absolute top-2 right-2 px-2 py-1 bg-slate-700 hover:bg-slate-600 rounded-md text-xs\">Copy</button>\n <pre className=\"whitespace-pre-wrap font-sans text-slate-200\">{message}</pre>\n </>\n )}\n {!isLoading && !message && !error && (\n <div className=\"text-slate-500 h-full flex items-center justify-center\">\n The commit message will appear here.\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};"],"names":["exampleDiff","AiCommitGenerator","diff","setDiff","useState","message","setMessage","isLoading","setIsLoading","error","setError","handleGenerate","useCallback","result","generateCommitMessage","err","errorMessage","handleCopy","jsxs","jsx","GitBranchIcon","e","LoadingSpinner","Fragment"],"mappings":"25EAMA,MAAMA,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcPC,GAA8B,IAAM,CAC7C,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAiBJ,CAAW,EAC9C,CAACK,EAASC,CAAU,EAAIF,EAAAA,SAAiB,EAAE,EAC3C,CAACG,EAAWC,CAAY,EAAIJ,EAAAA,SAAkB,EAAK,EACnD,CAACK,EAAOC,CAAQ,EAAIN,EAAAA,SAAiB,EAAE,EAEvCO,EAAiBC,EAAAA,YAAY,SAAY,CAC3C,GAAI,CAACV,EAAK,OAAQ,CACdQ,EAAS,4CAA4C,EACrD,MACJ,CACAF,EAAa,EAAI,EACjBE,EAAS,EAAE,EACXJ,EAAW,EAAE,EACb,GAAI,CACA,MAAMO,EAAS,MAAMC,EAAsBZ,CAAI,EAC/CI,EAAWO,CAAM,CACrB,OAASE,EAAK,CACV,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,6BAC1DL,EAAS,+BAA+BM,CAAY,EAAE,CAC1D,QAAA,CACIR,EAAa,EAAK,CACtB,CACJ,EAAG,CAACN,CAAI,CAAC,EAEHe,EAAa,IAAM,CACrB,UAAU,UAAU,UAAUZ,CAAO,CACzC,EAEA,OACIa,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,OACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACV,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAc,EACfD,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,6BAAA,CAA2B,CAAA,EACtD,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,kEAAA,CAAgE,CAAA,EACvG,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,yEACX,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,MAAC,QAAA,CAAM,QAAQ,aAAa,UAAU,0CAA0C,SAAA,WAAQ,EACxFA,EAAAA,IAAC,WAAA,CACG,GAAG,aACH,MAAOjB,EACP,SAAWmB,GAAMlB,EAAQkB,EAAE,OAAO,KAAK,EACvC,YAAY,8BACZ,UAAU,gKAAA,CAAA,EAEbF,EAAAA,IAAC,SAAA,CACE,QAASR,EACT,SAAUJ,EACV,UAAU,+LAET,SAAAA,EAAYY,EAAAA,IAACG,EAAA,CAAA,CAAe,EAAK,yBAAA,CAAA,CACtC,EACJ,EACAJ,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,0CAA0C,SAAA,oBAAiB,EAC5ED,EAAAA,KAAC,MAAA,CAAI,UAAU,+FACV,SAAA,CAAAX,SACK,MAAA,CAAI,UAAU,0CACZ,SAAAY,MAACG,IAAe,EACnB,EAEJb,GAASU,EAAAA,IAAC,IAAA,CAAE,UAAU,eAAgB,SAAAV,EAAM,EAC5CJ,GAAW,CAACE,GACTW,EAAAA,KAAAK,EAAAA,SAAA,CACG,SAAA,CAAAJ,MAAC,SAAA,CAAO,QAASF,EAAY,UAAU,sFAAsF,SAAA,OAAI,EACjIE,EAAAA,IAAC,MAAA,CAAI,UAAU,+CAAgD,SAAAd,CAAA,CAAQ,CAAA,EAC1E,EAEF,CAACE,GAAa,CAACF,GAAW,CAACI,GACzBU,EAAAA,IAAC,MAAA,CAAI,UAAU,yDAAyD,SAAA,sCAAA,CAExE,CAAA,CAAA,CAER,CAAA,CAAA,CACJ,CAAA,CAAA,CACJ,CAAA,EACJ,CAER"}
assets/AiFeatureBuilder-C6lUv4NI.js ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ import{r as a,j as e}from"./react-_fH1j4AW.js";import{g as N}from"./geminiService-7wPGMJPL.js";import{a as y,D as w}from"./index-Nqm_ElTk.js";import{T as v}from"./Terminal-BS7dp6j1.js";import"./@braintree-9Zuj5s7N.js";import"./@google-4tyssLU_.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";import"./@xterm-i03dpVGE.js";const F=()=>e.jsxs("div",{className:"flex items-center justify-center space-x-2",children:[e.jsx("div",{className:"w-2 h-2 rounded-full bg-cyan-400 animate-pulse",style:{animationDelay:"0s"}}),e.jsx("div",{className:"w-2 h-2 rounded-full bg-cyan-400 animate-pulse",style:{animationDelay:"0.2s"}}),e.jsx("div",{className:"w-2 h-2 rounded-full bg-cyan-400 animate-pulse",style:{animationDelay:"0.4s"}})]}),Be=()=>{const[i,g]=a.useState('A simple "Hello World" React component with a button that shows an alert.'),[c,p]=a.useState([]),[r,o]=a.useState(null),[n,d]=a.useState(!1),[S,m]=a.useState(""),l=a.useRef(null),j=a.useCallback(async()=>{var t,x,u,f,h;if(!i.trim()){m("Please enter a feature description.");return}d(!0),m(""),p([]),o(null),(t=l.current)==null||t.reset(),(x=l.current)==null||x.writeln("Sending request to Gemini...");try{const s=await N(i);p(s),(u=l.current)==null||u.writeln("✅ Feature generated successfully!"),(f=l.current)==null||f.writeln(` Created ${s.length} file(s). Select a file to view its content.`),s.length>0&&o(s[0])}catch(s){const b=s instanceof Error?s.message:"An unknown error occurred.";m(`Failed to generate feature: ${b}`),(h=l.current)==null||h.writeln(`❌ Error: ${b}`)}finally{d(!1)}},[i]);return e.jsxs("div",{className:"h-full flex flex-col text-slate-300",children:[e.jsxs("header",{className:"p-4 border-b border-slate-800 flex-shrink-0",children:[e.jsxs("h1",{className:"text-xl font-bold text-slate-100 flex items-center",children:[e.jsx(y,{}),e.jsx("span",{className:"ml-3",children:"AI Feature Builder"})]}),e.jsx("p",{className:"text-slate-400 mt-1 text-sm",children:"Describe a new feature, and watch Gemini build it for you."})]}),e.jsxs("div",{className:"flex-grow flex min-h-0",children:[e.jsxs("aside",{className:"w-64 bg-slate-900/70 border-r border-slate-800 p-4 flex flex-col space-y-2 overflow-y-auto",children:[e.jsx("h2",{className:"text-sm font-semibold text-slate-400 mb-2",children:"Generated Files"}),c.length>0?c.map(t=>e.jsxs("div",{onClick:()=>o(t),className:`flex items-center space-x-2 p-2 rounded-md cursor-pointer text-sm ${(r==null?void 0:r.filePath)===t.filePath?"bg-cyan-500/20 text-cyan-300":"hover:bg-slate-800"}`,children:[e.jsx(w,{}),e.jsx("span",{children:t.filePath.split("/").pop()})]},t.filePath)):e.jsx("div",{className:"text-center text-slate-500 text-sm mt-4",children:n?"Generating...":"No files generated yet."})]}),e.jsxs("main",{className:"flex-1 flex flex-col min-w-0",children:[e.jsx("div",{className:"flex-grow flex flex-col bg-slate-900",children:r?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"p-3 border-b border-slate-800 flex-shrink-0",children:[e.jsx("h3",{className:"font-mono text-sm text-slate-200",children:r.filePath}),e.jsx("p",{className:"text-xs text-slate-400",children:r.description})]}),e.jsx("textarea",{readOnly:!0,value:r.content,className:"w-full h-full p-4 bg-transparent resize-none font-mono text-sm text-cyan-300 focus:outline-none"})]}):e.jsx("div",{className:"flex items-center justify-center h-full text-slate-500",children:"Select a file to view its content."})}),e.jsxs("div",{className:"flex-shrink-0 h-64 border-t border-slate-800 flex",children:[e.jsxs("div",{className:"w-1/2 p-4 flex flex-col border-r border-slate-800",children:[e.jsx("label",{htmlFor:"prompt-input",className:"text-sm font-medium text-slate-400 mb-2",children:"Feature Request"}),e.jsx("textarea",{id:"prompt-input",value:i,onChange:t=>g(t.target.value),placeholder:"e.g., A user profile card with an avatar, name, and bio.",className:"flex-grow p-2 bg-slate-800 border border-slate-700 rounded-md resize-none text-sm text-slate-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none"}),e.jsx("button",{onClick:j,disabled:n,className:"mt-2 w-full flex items-center justify-center gap-2 px-4 py-2 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed",children:n?e.jsxs(e.Fragment,{children:[e.jsx(F,{})," Generating..."]}):"Generate Feature"})]}),e.jsxs("div",{className:"w-1/2 p-2 flex flex-col",children:[e.jsx("label",{className:"text-sm font-medium text-slate-400 mb-1 px-2",children:"Terminal"}),e.jsx("div",{className:"flex-grow",children:e.jsx(v,{ref:l,initialMessage:"Welcome to the AI Feature Builder terminal.",isReadOnly:!0})})]})]})]})]})]})};export{Be as AiFeatureBuilder};
2
+ //# sourceMappingURL=AiFeatureBuilder-C6lUv4NI.js.map
assets/AiFeatureBuilder-C6lUv4NI.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"AiFeatureBuilder-C6lUv4NI.js","sources":["../../components/features/AiFeatureBuilder.tsx"],"sourcesContent":["\n\nimport React, { useState, useCallback, useRef } from 'react';\nimport type { GeneratedFile } from '../../types.ts';\nimport { generateFeature } from '../../services/geminiService.ts';\nimport { CpuChipIcon, DocumentIcon, FolderIcon } from '../icons/InterfaceIcons.tsx';\nimport TerminalComponent, { TerminalHandle } from '../Terminal.tsx';\n\nconst LoadingSpinner: React.FC = () => (\n <div className=\"flex items-center justify-center space-x-2\">\n <div className=\"w-2 h-2 rounded-full bg-cyan-400 animate-pulse\" style={{ animationDelay: '0s' }}></div>\n <div className=\"w-2 h-2 rounded-full bg-cyan-400 animate-pulse\" style={{ animationDelay: '0.2s' }}></div>\n <div className=\"w-2 h-2 rounded-full bg-cyan-400 animate-pulse\" style={{ animationDelay: '0.4s' }}></div>\n </div>\n);\n\nexport const AiFeatureBuilder: React.FC = () => {\n const [prompt, setPrompt] = useState<string>('A simple \"Hello World\" React component with a button that shows an alert.');\n const [generatedFiles, setGeneratedFiles] = useState<GeneratedFile[]>([]);\n const [selectedFile, setSelectedFile] = useState<GeneratedFile | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n const terminalRef = useRef<TerminalHandle>(null);\n\n const handleGenerate = useCallback(async () => {\n if (!prompt.trim()) {\n setError('Please enter a feature description.');\n return;\n }\n setIsLoading(true);\n setError('');\n setGeneratedFiles([]);\n setSelectedFile(null);\n terminalRef.current?.reset();\n terminalRef.current?.writeln('Sending request to Gemini...');\n\n try {\n const result = await generateFeature(prompt);\n setGeneratedFiles(result);\n terminalRef.current?.writeln('✅ Feature generated successfully!');\n terminalRef.current?.writeln(` Created ${result.length} file(s). Select a file to view its content.`);\n if (result.length > 0) {\n setSelectedFile(result[0]);\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to generate feature: ${errorMessage}`);\n terminalRef.current?.writeln(`❌ Error: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n }, [prompt]);\n\n return (\n <div className=\"h-full flex flex-col text-slate-300\">\n <header className=\"p-4 border-b border-slate-800 flex-shrink-0\">\n <h1 className=\"text-xl font-bold text-slate-100 flex items-center\">\n <CpuChipIcon />\n <span className=\"ml-3\">AI Feature Builder</span>\n </h1>\n <p className=\"text-slate-400 mt-1 text-sm\">Describe a new feature, and watch Gemini build it for you.</p>\n </header>\n\n <div className=\"flex-grow flex min-h-0\">\n {/* File Tree Panel */}\n <aside className=\"w-64 bg-slate-900/70 border-r border-slate-800 p-4 flex flex-col space-y-2 overflow-y-auto\">\n <h2 className=\"text-sm font-semibold text-slate-400 mb-2\">Generated Files</h2>\n {generatedFiles.length > 0 ? (\n generatedFiles.map(file => (\n <div\n key={file.filePath}\n onClick={() => setSelectedFile(file)}\n className={`flex items-center space-x-2 p-2 rounded-md cursor-pointer text-sm ${selectedFile?.filePath === file.filePath ? 'bg-cyan-500/20 text-cyan-300' : 'hover:bg-slate-800'}`}\n >\n <DocumentIcon />\n <span>{file.filePath.split('/').pop()}</span>\n </div>\n ))\n ) : (\n <div className=\"text-center text-slate-500 text-sm mt-4\">\n {isLoading ? 'Generating...' : 'No files generated yet.'}\n </div>\n )}\n </aside>\n\n {/* Main Content Panel (Code Viewer & Terminal) */}\n <main className=\"flex-1 flex flex-col min-w-0\">\n {/* Code Viewer */}\n <div className=\"flex-grow flex flex-col bg-slate-900\">\n {selectedFile ? (\n <>\n <div className=\"p-3 border-b border-slate-800 flex-shrink-0\">\n <h3 className=\"font-mono text-sm text-slate-200\">{selectedFile.filePath}</h3>\n <p className=\"text-xs text-slate-400\">{selectedFile.description}</p>\n </div>\n <textarea\n readOnly\n value={selectedFile.content}\n className=\"w-full h-full p-4 bg-transparent resize-none font-mono text-sm text-cyan-300 focus:outline-none\"\n />\n </>\n ) : (\n <div className=\"flex items-center justify-center h-full text-slate-500\">\n Select a file to view its content.\n </div>\n )}\n </div>\n \n {/* Bottom Panel (Prompt & Terminal) */}\n <div className=\"flex-shrink-0 h-64 border-t border-slate-800 flex\">\n <div className=\"w-1/2 p-4 flex flex-col border-r border-slate-800\">\n <label htmlFor=\"prompt-input\" className=\"text-sm font-medium text-slate-400 mb-2\">Feature Request</label>\n <textarea\n id=\"prompt-input\"\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n placeholder=\"e.g., A user profile card with an avatar, name, and bio.\"\n className=\"flex-grow p-2 bg-slate-800 border border-slate-700 rounded-md resize-none text-sm text-slate-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none\"\n />\n <button\n onClick={handleGenerate}\n disabled={isLoading}\n className=\"mt-2 w-full flex items-center justify-center gap-2 px-4 py-2 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed\"\n >\n {isLoading ? <><LoadingSpinner /> Generating...</> : 'Generate Feature'}\n </button>\n </div>\n <div className=\"w-1/2 p-2 flex flex-col\">\n <label className=\"text-sm font-medium text-slate-400 mb-1 px-2\">Terminal</label>\n <div className=\"flex-grow\">\n <TerminalComponent ref={terminalRef} initialMessage='Welcome to the AI Feature Builder terminal.' isReadOnly={true} />\n </div>\n </div>\n </div>\n </main>\n </div>\n </div>\n );\n};"],"names":["LoadingSpinner","jsxs","jsx","AiFeatureBuilder","prompt","setPrompt","useState","generatedFiles","setGeneratedFiles","selectedFile","setSelectedFile","isLoading","setIsLoading","error","setError","terminalRef","useRef","handleGenerate","useCallback","_a","_b","result","generateFeature","_c","_d","err","errorMessage","_e","CpuChipIcon","file","DocumentIcon","Fragment","e","TerminalComponent"],"mappings":"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"}
assets/AiStyleTransfer-Ck-v5VJh.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ import{r,j as e}from"./react-_fH1j4AW.js";import{i as h}from"./geminiService-7wPGMJPL.js";import{c as g}from"./index-Nqm_ElTk.js";import{L as d}from"./LoadingSpinner-C3NwW9hm.js";import{m as j}from"./marked-CesSW9Du.js";import"./@braintree-9Zuj5s7N.js";import"./@google-4tyssLU_.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const b="function my_func(x,y){return x+y;}",y=`- Use camelCase for function names.
2
+ - Add a space after commas in argument lists.
3
+ - Use semicolons at the end of statements.`,Re=()=>{const[o,c]=r.useState(b),[i,x]=r.useState(y),[l,n]=r.useState(""),[s,p]=r.useState(!1),[m,a]=r.useState(""),f=r.useCallback(async()=>{if(!o.trim()||!i.trim()){a("Please provide both code and a style guide.");return}p(!0),a(""),n("");try{const t=await h(o,i);n(t)}catch(t){const u=t instanceof Error?t.message:"An unknown error occurred.";a(`Failed to transfer style: ${u}`)}finally{p(!1)}},[o,i]);return e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[e.jsxs("header",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(g,{}),e.jsx("span",{className:"ml-3",children:"AI Code Style Transfer"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"Rewrite code to match a specific style guide using AI."})]}),e.jsxs("div",{className:"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden",children:[e.jsxs("div",{className:"flex flex-col h-full gap-4",children:[e.jsxs("div",{className:"flex flex-col flex-1",children:[e.jsx("label",{htmlFor:"input-code",className:"text-sm font-medium text-slate-400 mb-2",children:"Original Code"}),e.jsx("textarea",{id:"input-code",value:o,onChange:t=>c(t.target.value),className:"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm"})]}),e.jsxs("div",{className:"flex flex-col flex-1",children:[e.jsx("label",{htmlFor:"style-guide",className:"text-sm font-medium text-slate-400 mb-2",children:"Style Guide"}),e.jsx("textarea",{id:"style-guide",value:i,onChange:t=>x(t.target.value),className:"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm"})]})]}),e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{className:"text-sm font-medium text-slate-400 mb-2",children:"Rewritten Code"}),e.jsxs("div",{className:"flex-grow p-1 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto",children:[s&&e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(d,{})}),m&&e.jsx("p",{className:"p-4 text-red-400",children:m}),l&&!s&&e.jsx("div",{className:"prose prose-sm prose-invert max-w-none prose-pre:bg-transparent prose-pre:p-4 prose-pre:m-0",dangerouslySetInnerHTML:{__html:j(l)}}),!s&&!l&&!m&&e.jsx("div",{className:"text-slate-500 h-full flex items-center justify-center",children:"Rewritten code will appear here."})]})]})]}),e.jsx("div",{className:"flex-shrink-0 pt-4",children:e.jsx("button",{onClick:f,disabled:s,className:"w-full max-w-md mx-auto flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 disabled:bg-slate-600",children:s?e.jsx(d,{}):"Rewrite Code"})})]})};export{Re as AiStyleTransfer};
4
+ //# sourceMappingURL=AiStyleTransfer-Ck-v5VJh.js.map
assets/AiStyleTransfer-Ck-v5VJh.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"AiStyleTransfer-Ck-v5VJh.js","sources":["../../components/features/AiStyleTransfer.tsx"],"sourcesContent":["import React, { useState, useCallback } from 'react';\nimport { transferCodeStyle } from '../../services/geminiService.ts';\nimport { SparklesIcon } from '../icons/FeatureIcons.tsx';\nimport { LoadingSpinner } from './shared/LoadingSpinner.tsx';\nimport { marked } from 'marked';\n\nconst exampleCode = `function my_func(x,y){return x+y;}`;\nconst exampleStyleGuide = `- Use camelCase for function names.\n- Add a space after commas in argument lists.\n- Use semicolons at the end of statements.`;\n\nexport const AiStyleTransfer: React.FC = () => {\n const [inputCode, setInputCode] = useState<string>(exampleCode);\n const [styleGuide, setStyleGuide] = useState<string>(exampleStyleGuide);\n const [outputCode, setOutputCode] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n\n const handleGenerate = useCallback(async () => {\n if (!inputCode.trim() || !styleGuide.trim()) {\n setError('Please provide both code and a style guide.');\n return;\n }\n setIsLoading(true);\n setError('');\n setOutputCode('');\n try {\n const result = await transferCodeStyle(inputCode, styleGuide);\n setOutputCode(result);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to transfer style: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n }, [inputCode, styleGuide]);\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <SparklesIcon />\n <span className=\"ml-3\">AI Code Style Transfer</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Rewrite code to match a specific style guide using AI.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden\">\n <div className=\"flex flex-col h-full gap-4\">\n <div className=\"flex flex-col flex-1\">\n <label htmlFor=\"input-code\" className=\"text-sm font-medium text-slate-400 mb-2\">Original Code</label>\n <textarea\n id=\"input-code\"\n value={inputCode}\n onChange={(e) => setInputCode(e.target.value)}\n className=\"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm\"\n />\n </div>\n <div className=\"flex flex-col flex-1\">\n <label htmlFor=\"style-guide\" className=\"text-sm font-medium text-slate-400 mb-2\">Style Guide</label>\n <textarea\n id=\"style-guide\"\n value={styleGuide}\n onChange={(e) => setStyleGuide(e.target.value)}\n className=\"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm\"\n />\n </div>\n </div>\n <div className=\"flex flex-col h-full\">\n <label className=\"text-sm font-medium text-slate-400 mb-2\">Rewritten Code</label>\n <div className=\"flex-grow p-1 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto\">\n {isLoading && <div className=\"flex items-center justify-center h-full\"><LoadingSpinner /></div>}\n {error && <p className=\"p-4 text-red-400\">{error}</p>}\n {outputCode && !isLoading && (\n <div\n className=\"prose prose-sm prose-invert max-w-none prose-pre:bg-transparent prose-pre:p-4 prose-pre:m-0\"\n dangerouslySetInnerHTML={{ __html: marked(outputCode) }}\n />\n )}\n {!isLoading && !outputCode && !error && <div className=\"text-slate-500 h-full flex items-center justify-center\">Rewritten code will appear here.</div>}\n </div>\n </div>\n </div>\n <div className=\"flex-shrink-0 pt-4\">\n <button\n onClick={handleGenerate}\n disabled={isLoading}\n className=\"w-full max-w-md mx-auto flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 disabled:bg-slate-600\"\n >\n {isLoading ? <LoadingSpinner /> : 'Rewrite Code'}\n </button>\n </div>\n </div>\n );\n};"],"names":["exampleCode","exampleStyleGuide","AiStyleTransfer","inputCode","setInputCode","useState","styleGuide","setStyleGuide","outputCode","setOutputCode","isLoading","setIsLoading","error","setError","handleGenerate","useCallback","result","transferCodeStyle","err","errorMessage","jsxs","jsx","SparklesIcon","e","LoadingSpinner","marked"],"mappings":"+7EAMA,MAAMA,EAAc,qCACdC,EAAoB;AAAA;AAAA,4CAIbC,GAA4B,IAAM,CAC3C,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAiBL,CAAW,EACxD,CAACM,EAAYC,CAAa,EAAIF,EAAAA,SAAiBJ,CAAiB,EAChE,CAACO,EAAYC,CAAa,EAAIJ,EAAAA,SAAiB,EAAE,EACjD,CAACK,EAAWC,CAAY,EAAIN,EAAAA,SAAkB,EAAK,EACnD,CAACO,EAAOC,CAAQ,EAAIR,EAAAA,SAAiB,EAAE,EAEvCS,EAAiBC,EAAAA,YAAY,SAAY,CAC3C,GAAI,CAACZ,EAAU,KAAA,GAAU,CAACG,EAAW,OAAQ,CACzCO,EAAS,6CAA6C,EACtD,MACJ,CACAF,EAAa,EAAI,EACjBE,EAAS,EAAE,EACXJ,EAAc,EAAE,EAChB,GAAI,CACA,MAAMO,EAAS,MAAMC,EAAkBd,EAAWG,CAAU,EAC5DG,EAAcO,CAAM,CACxB,OAASE,EAAK,CACV,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,6BAC1DL,EAAS,6BAA6BM,CAAY,EAAE,CACxD,QAAA,CACIR,EAAa,EAAK,CACtB,CACJ,EAAG,CAACR,EAAWG,CAAU,CAAC,EAE1B,OACIc,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,OACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACV,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAa,EACdD,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,wBAAA,CAAsB,CAAA,EACjD,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,wDAAA,CAAsD,CAAA,EAC7F,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,yEACX,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACX,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,MAAC,QAAA,CAAM,QAAQ,aAAa,UAAU,0CAA0C,SAAA,gBAAa,EAC7FA,EAAAA,IAAC,WAAA,CACG,GAAG,aACH,MAAOlB,EACP,SAAWoB,GAAMnB,EAAamB,EAAE,OAAO,KAAK,EAC5C,UAAU,6FAAA,CAAA,CACd,EACJ,EACAH,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,MAAC,QAAA,CAAM,QAAQ,cAAc,UAAU,0CAA0C,SAAA,cAAW,EAC5FA,EAAAA,IAAC,WAAA,CACG,GAAG,cACH,MAAOf,EACP,SAAWiB,GAAMhB,EAAcgB,EAAE,OAAO,KAAK,EAC7C,UAAU,6FAAA,CAAA,CACd,CAAA,CACJ,CAAA,EACJ,EACAH,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,0CAA0C,SAAA,iBAAc,EACzED,EAAAA,KAAC,MAAA,CAAI,UAAU,sFACV,SAAA,CAAAV,SAAc,MAAA,CAAI,UAAU,0CAA0C,SAAAW,MAACG,IAAe,EAAE,EACxFZ,GAASS,EAAAA,IAAC,IAAA,CAAE,UAAU,mBAAoB,SAAAT,EAAM,EAChDJ,GAAc,CAACE,GACZW,EAAAA,IAAC,MAAA,CACG,UAAU,8FACV,wBAAyB,CAAE,OAAQI,EAAOjB,CAAU,CAAA,CAAE,CAAA,EAG5D,CAACE,GAAa,CAACF,GAAc,CAACI,GAASS,EAAAA,IAAC,MAAA,CAAI,UAAU,yDAAyD,SAAA,kCAAA,CAAgC,CAAA,CAAA,CACrJ,CAAA,CAAA,CACJ,CAAA,EACJ,EACAA,EAAAA,IAAC,MAAA,CAAI,UAAU,qBACX,SAAAA,EAAAA,IAAC,SAAA,CACG,QAASP,EACT,SAAUJ,EACV,UAAU,6JAET,SAAAA,EAAYW,EAAAA,IAACG,EAAA,CAAA,CAAe,EAAK,cAAA,CAAA,CACtC,CACJ,CAAA,EACJ,CAER"}
assets/AiUnitTestGenerator-CTwRrA4_.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ import{r as o,j as e}from"./react-_fH1j4AW.js";import{c as u}from"./geminiService-7wPGMJPL.js";import{B as f}from"./index-Nqm_ElTk.js";import{L as p}from"./LoadingSpinner-C3NwW9hm.js";import{m as h}from"./marked-CesSW9Du.js";import"./@braintree-9Zuj5s7N.js";import"./@google-4tyssLU_.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const g=`export function calculateTotalPrice(items, taxRate) {
2
+ const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
3
+ return subtotal * (1 + taxRate);
4
+ }`,Ge=()=>{const[s,c]=o.useState(g),[i,l]=o.useState(""),[r,n]=o.useState(!1),[a,m]=o.useState(""),d=o.useCallback(async()=>{if(!s.trim()){m("Please enter some code to generate tests for.");return}n(!0),m(""),l("");try{const t=await u(s);l(t)}catch(t){const x=t instanceof Error?t.message:"An unknown error occurred.";m(`Failed to generate tests: ${x}`)}finally{n(!1)}},[s]);return e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[e.jsxs("header",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(f,{}),e.jsx("span",{className:"ml-3",children:"AI Unit Test Generator"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"Provide a function or component and let AI write the tests."})]}),e.jsxs("div",{className:"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden",children:[e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{htmlFor:"code-input",className:"text-sm font-medium text-slate-400 mb-2",children:"Source Code"}),e.jsx("textarea",{id:"code-input",value:s,onChange:t=>c(t.target.value),placeholder:"Paste your source code here...",className:"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none"}),e.jsx("button",{onClick:d,disabled:r,className:"mt-4 w-full flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed",children:r?e.jsx(p,{}):"Generate Unit Tests"})]}),e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{className:"text-sm font-medium text-slate-400 mb-2",children:"Generated Tests"}),e.jsxs("div",{className:"flex-grow p-1 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto",children:[r&&e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(p,{})}),a&&e.jsx("p",{className:"p-4 text-red-400",children:a}),i&&!r&&e.jsx("div",{className:"prose prose-sm prose-invert max-w-none prose-pre:bg-transparent prose-pre:p-4 prose-pre:m-0 prose-code:text-cyan-300",dangerouslySetInnerHTML:{__html:h(i)}}),!r&&!i&&!a&&e.jsx("div",{className:"text-slate-500 h-full flex items-center justify-center",children:"The generated tests will appear here."})]})]})]})]})};export{Ge as AiUnitTestGenerator};
5
+ //# sourceMappingURL=AiUnitTestGenerator-CTwRrA4_.js.map
assets/AiUnitTestGenerator-CTwRrA4_.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"AiUnitTestGenerator-CTwRrA4_.js","sources":["../../components/features/AiUnitTestGenerator.tsx"],"sourcesContent":["\nimport React, { useState, useCallback } from 'react';\nimport { generateUnitTests } from '../../services/geminiService.ts';\nimport { BeakerIcon } from '../icons/FeatureIcons.tsx';\nimport { LoadingSpinner } from './shared/LoadingSpinner.tsx';\nimport { marked } from 'marked';\n\nconst exampleCode = `export function calculateTotalPrice(items, taxRate) {\n const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0);\n return subtotal * (1 + taxRate);\n}`;\n\nexport const AiUnitTestGenerator: React.FC = () => {\n const [code, setCode] = useState<string>(exampleCode);\n const [tests, setTests] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n\n const handleGenerate = useCallback(async () => {\n if (!code.trim()) {\n setError('Please enter some code to generate tests for.');\n return;\n }\n setIsLoading(true);\n setError('');\n setTests('');\n try {\n const result = await generateUnitTests(code);\n setTests(result);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to generate tests: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n }, [code]);\n\n const cleanMarkdown = (md: string) => md.replace(/^```(?:\\w+\\n)?/, '').replace(/```$/, '');\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <BeakerIcon />\n <span className=\"ml-3\">AI Unit Test Generator</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Provide a function or component and let AI write the tests.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden\">\n <div className=\"flex flex-col h-full\">\n <label htmlFor=\"code-input\" className=\"text-sm font-medium text-slate-400 mb-2\">Source Code</label>\n <textarea\n id=\"code-input\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n placeholder=\"Paste your source code here...\"\n className=\"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none\"\n />\n <button\n onClick={handleGenerate}\n disabled={isLoading}\n className=\"mt-4 w-full flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed\"\n >\n {isLoading ? <LoadingSpinner /> : 'Generate Unit Tests'}\n </button>\n </div>\n <div className=\"flex flex-col h-full\">\n <label className=\"text-sm font-medium text-slate-400 mb-2\">Generated Tests</label>\n <div className=\"flex-grow p-1 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto\">\n {isLoading && (\n <div className=\"flex items-center justify-center h-full\">\n <LoadingSpinner />\n </div>\n )}\n {error && <p className=\"p-4 text-red-400\">{error}</p>}\n {tests && !isLoading && (\n <div\n className=\"prose prose-sm prose-invert max-w-none prose-pre:bg-transparent prose-pre:p-4 prose-pre:m-0 prose-code:text-cyan-300\"\n dangerouslySetInnerHTML={{ __html: marked(tests) }}\n />\n )}\n {!isLoading && !tests && !error && (\n <div className=\"text-slate-500 h-full flex items-center justify-center\">\n The generated tests will appear here.\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};"],"names":["exampleCode","AiUnitTestGenerator","code","setCode","useState","tests","setTests","isLoading","setIsLoading","error","setError","handleGenerate","useCallback","result","generateUnitTests","err","errorMessage","jsxs","jsx","BeakerIcon","e","LoadingSpinner","marked"],"mappings":"o8EAOA,MAAMA,EAAc;AAAA;AAAA;AAAA,GAKPC,GAAgC,IAAM,CAC/C,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAiBJ,CAAW,EAC9C,CAACK,EAAOC,CAAQ,EAAIF,EAAAA,SAAiB,EAAE,EACvC,CAACG,EAAWC,CAAY,EAAIJ,EAAAA,SAAkB,EAAK,EACnD,CAACK,EAAOC,CAAQ,EAAIN,EAAAA,SAAiB,EAAE,EAEvCO,EAAiBC,EAAAA,YAAY,SAAY,CAC3C,GAAI,CAACV,EAAK,OAAQ,CACdQ,EAAS,+CAA+C,EACxD,MACJ,CACAF,EAAa,EAAI,EACjBE,EAAS,EAAE,EACXJ,EAAS,EAAE,EACX,GAAI,CACA,MAAMO,EAAS,MAAMC,EAAkBZ,CAAI,EAC3CI,EAASO,CAAM,CACnB,OAASE,EAAK,CACV,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,6BAC1DL,EAAS,6BAA6BM,CAAY,EAAE,CACxD,QAAA,CACIR,EAAa,EAAK,CACtB,CACJ,EAAG,CAACN,CAAI,CAAC,EAIT,OACIe,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,OACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACV,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAW,EACZD,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,wBAAA,CAAsB,CAAA,EACjD,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,6DAAA,CAA2D,CAAA,EAClG,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,yEACX,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,MAAC,QAAA,CAAM,QAAQ,aAAa,UAAU,0CAA0C,SAAA,cAAW,EAC3FA,EAAAA,IAAC,WAAA,CACG,GAAG,aACH,MAAOhB,EACP,SAAWkB,GAAMjB,EAAQiB,EAAE,OAAO,KAAK,EACvC,YAAY,iCACZ,UAAU,+JAAA,CAAA,EAEdF,EAAAA,IAAC,SAAA,CACG,QAASP,EACT,SAAUJ,EACV,UAAU,+LAET,SAAAA,EAAYW,EAAAA,IAACG,EAAA,CAAA,CAAe,EAAK,qBAAA,CAAA,CACtC,EACJ,EACAJ,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,0CAA0C,SAAA,kBAAe,EAC1ED,EAAAA,KAAC,MAAA,CAAI,UAAU,sFACV,SAAA,CAAAV,SACI,MAAA,CAAI,UAAU,0CACX,SAAAW,MAACG,IAAe,EACpB,EAEHZ,GAASS,EAAAA,IAAC,IAAA,CAAE,UAAU,mBAAoB,SAAAT,EAAM,EAChDJ,GAAS,CAACE,GACPW,EAAAA,IAAC,MAAA,CACG,UAAU,uHACV,wBAAyB,CAAE,OAAQI,EAAOjB,CAAK,CAAA,CAAE,CAAA,EAGxD,CAACE,GAAa,CAACF,GAAS,CAACI,GACtBS,EAAAA,IAAC,MAAA,CAAI,UAAU,yDAAyD,SAAA,uCAAA,CAExE,CAAA,CAAA,CAER,CAAA,CAAA,CACJ,CAAA,CAAA,CACJ,CAAA,EACJ,CAER"}
assets/ApiTester-BE2AsWga.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import{r as s,j as e}from"./react-_fH1j4AW.js";import{S as N}from"./index-Nqm_ElTk.js";import{L as f}from"./LoadingSpinner-C3NwW9hm.js";import{JsonTreeNavigator as v}from"./JsonTreeNavigator-CGuqWmNG.js";import"./@braintree-9Zuj5s7N.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const Ae=()=>{const[o,g]=s.useState("GET"),[n,b]=s.useState("https://jsonplaceholder.typicode.com/todos/1"),[l,j]=s.useState(`{
2
+ "title": "foo",
3
+ "body": "bar",
4
+ "userId": 1
5
+ }`),[m,u]=s.useState(null),[a,h]=s.useState(null),[i,p]=s.useState(!1),[d,c]=s.useState(""),y=s.useCallback(async()=>{p(!0),c(""),u(null),h(null);const t={method:o,headers:{"Content-Type":"application/json"}};if(o!=="GET")try{t.body=JSON.stringify(JSON.parse(l))}catch{c("Invalid JSON in request body."),p(!1);return}try{const r=await fetch(n,t),x=await r.json();u(x),h(r.status)}catch(r){const x=r instanceof Error?r.message:"An unknown error occurred.";c(`Request failed: ${x}. Note: Browser security may block requests to certain domains (CORS).`)}finally{p(!1)}},[n,o,l]);return e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[e.jsxs("header",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(N,{}),e.jsx("span",{className:"ml-3",children:"API Tester"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"Send HTTP requests and view responses. Uses a public test API."})]}),e.jsxs("div",{className:"flex flex-col flex-grow min-h-0",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[e.jsxs("select",{value:o,onChange:t=>g(t.target.value),className:"px-4 py-2 rounded-md bg-slate-800 border border-slate-700 font-bold",children:[e.jsx("option",{children:"GET"}),e.jsx("option",{children:"POST"}),e.jsx("option",{children:"PUT"}),e.jsx("option",{children:"DELETE"}),e.jsx("option",{children:"PATCH"})]}),e.jsx("input",{type:"text",value:n,onChange:t=>b(t.target.value),placeholder:"https://api.example.com/data",className:"flex-grow px-4 py-2 rounded-md bg-slate-900 border border-slate-700 font-mono text-sm focus:ring-2 focus:ring-cyan-500 focus:outline-none"}),e.jsx("button",{onClick:y,disabled:i,className:"px-6 py-2 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 disabled:bg-slate-600 flex items-center gap-2",children:i?e.jsx(f,{}):"Send"})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6 flex-grow min-h-0",children:[e.jsxs("div",{className:"flex flex-col",children:[e.jsx("label",{className:"text-sm font-medium text-slate-400 mb-2",children:"Request Body (JSON)"}),e.jsx("textarea",{value:l,onChange:t=>j(t.target.value),disabled:o==="GET",className:"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none disabled:bg-slate-800/50"})]}),e.jsxs("div",{className:"flex flex-col",children:[e.jsx("label",{className:"text-sm font-medium text-slate-400 mb-2",children:"Response"}),e.jsxs("div",{className:"flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto relative",children:[a&&e.jsxs("div",{className:`absolute top-2 right-2 px-2 py-1 text-xs font-bold rounded ${a>=200&&a<300?"bg-green-500/20 text-green-300":"bg-red-500/20 text-red-300"}`,children:["Status: ",a]}),i&&e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(f,{})}),d&&e.jsx("p",{className:"text-red-400",children:d}),m&&!i&&e.jsx(v,{data:m}),!i&&!m&&!d&&e.jsx("div",{className:"text-slate-500 h-full flex items-center justify-center",children:"Response will appear here."})]})]})]}),e.jsxs("div",{className:"mt-4 p-3 bg-slate-800/50 border border-slate-700/50 rounded-lg text-xs text-slate-400",children:[e.jsx("h4",{className:"font-bold text-slate-300 mb-1",children:"About CORS"}),e.jsx("p",{children:"This API tester runs in your browser. For security reasons, browsers restrict web pages from making requests to a different domain than the one that served the page. This is known as the Cross-Origin Resource Sharing (CORS) policy. If a request fails with a CORS error, it means the target server (e.g., `https://api.example.com`) does not permit requests from this application. The `Access-Control-Allow-Origin` header must be configured on the server-side."})]})]})]})};export{Ae as ApiTester};
6
+ //# sourceMappingURL=ApiTester-BE2AsWga.js.map
assets/ApiTester-BE2AsWga.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"ApiTester-BE2AsWga.js","sources":["../../components/features/ApiTester.tsx"],"sourcesContent":["import React, { useState, useCallback } from 'react';\nimport { ServerIcon } from '../icons/FeatureIcons.tsx';\nimport { LoadingSpinner } from './shared/LoadingSpinner.tsx';\nimport { JsonTreeNavigator } from './JsonTreeNavigator.tsx';\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\nexport const ApiTester: React.FC = () => {\n const [method, setMethod] = useState<HttpMethod>('GET');\n const [url, setUrl] = useState<string>('https://jsonplaceholder.typicode.com/todos/1');\n const [body, setBody] = useState<string>('{\\n \"title\": \"foo\",\\n \"body\": \"bar\",\\n \"userId\": 1\\n}');\n const [response, setResponse] = useState<any>(null);\n const [responseStatus, setResponseStatus] = useState<number | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n\n const handleSendRequest = useCallback(async () => {\n setIsLoading(true);\n setError('');\n setResponse(null);\n setResponseStatus(null);\n \n const options: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n\n if (method !== 'GET') {\n try {\n options.body = JSON.stringify(JSON.parse(body));\n } catch (e) {\n setError('Invalid JSON in request body.');\n setIsLoading(false);\n return;\n }\n }\n\n try {\n const res = await fetch(url, options);\n const data = await res.json();\n setResponse(data);\n setResponseStatus(res.status);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Request failed: ${errorMessage}. Note: Browser security may block requests to certain domains (CORS).`);\n } finally {\n setIsLoading(false);\n }\n }, [url, method, body]);\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <ServerIcon />\n <span className=\"ml-3\">API Tester</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Send HTTP requests and view responses. Uses a public test API.</p>\n </header>\n <div className=\"flex flex-col flex-grow min-h-0\">\n <div className=\"flex items-center gap-2 mb-4\">\n <select\n value={method}\n onChange={(e) => setMethod(e.target.value as HttpMethod)}\n className=\"px-4 py-2 rounded-md bg-slate-800 border border-slate-700 font-bold\"\n >\n <option>GET</option>\n <option>POST</option>\n <option>PUT</option>\n <option>DELETE</option>\n <option>PATCH</option>\n </select>\n <input\n type=\"text\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"https://api.example.com/data\"\n className=\"flex-grow px-4 py-2 rounded-md bg-slate-900 border border-slate-700 font-mono text-sm focus:ring-2 focus:ring-cyan-500 focus:outline-none\"\n />\n <button\n onClick={handleSendRequest}\n disabled={isLoading}\n className=\"px-6 py-2 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 disabled:bg-slate-600 flex items-center gap-2\"\n >\n {isLoading ? <LoadingSpinner /> : 'Send'}\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6 flex-grow min-h-0\">\n <div className=\"flex flex-col\">\n <label className=\"text-sm font-medium text-slate-400 mb-2\">Request Body (JSON)</label>\n <textarea\n value={body}\n onChange={(e) => setBody(e.target.value)}\n disabled={method === 'GET'}\n className=\"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none disabled:bg-slate-800/50\"\n />\n </div>\n <div className=\"flex flex-col\">\n <label className=\"text-sm font-medium text-slate-400 mb-2\">Response</label>\n <div className=\"flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto relative\">\n {responseStatus && <div className={`absolute top-2 right-2 px-2 py-1 text-xs font-bold rounded ${responseStatus >= 200 && responseStatus < 300 ? 'bg-green-500/20 text-green-300' : 'bg-red-500/20 text-red-300'}`}>Status: {responseStatus}</div>}\n {isLoading && <div className=\"flex items-center justify-center h-full\"><LoadingSpinner /></div>}\n {error && <p className=\"text-red-400\">{error}</p>}\n {response && !isLoading && <JsonTreeNavigator data={response} />}\n {!isLoading && !response && !error && <div className=\"text-slate-500 h-full flex items-center justify-center\">Response will appear here.</div>}\n </div>\n </div>\n </div>\n <div className=\"mt-4 p-3 bg-slate-800/50 border border-slate-700/50 rounded-lg text-xs text-slate-400\">\n <h4 className=\"font-bold text-slate-300 mb-1\">About CORS</h4>\n <p>\n This API tester runs in your browser. For security reasons, browsers restrict web pages from making requests to a different domain than the one that served the page. This is known as the Cross-Origin Resource Sharing (CORS) policy.\n If a request fails with a CORS error, it means the target server (e.g., `https://api.example.com`) does not permit requests from this application. The `Access-Control-Allow-Origin` header must be configured on the server-side.\n </p>\n </div>\n </div>\n </div>\n );\n};"],"names":["ApiTester","method","setMethod","useState","url","setUrl","body","setBody","response","setResponse","responseStatus","setResponseStatus","isLoading","setIsLoading","error","setError","handleSendRequest","useCallback","options","res","data","err","errorMessage","jsxs","jsx","ServerIcon","e","LoadingSpinner","JsonTreeNavigator"],"mappings":"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"}
assets/AudioToCode-CJm_3BF6.js ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ import{r as o,j as e}from"./react-_fH1j4AW.js";import{t as b}from"./geminiService-7wPGMJPL.js";import{C as j}from"./index-Nqm_ElTk.js";import{L as w}from"./LoadingSpinner-C3NwW9hm.js";import{m as y}from"./marked-CesSW9Du.js";import{b as N}from"./fileUtils-BHmmJ0tL.js";import"./@braintree-9Zuj5s7N.js";import"./@google-4tyssLU_.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const Be=()=>{const[i,d]=o.useState(!1),[a,u]=o.useState(!1),[m,x]=o.useState(""),[n,l]=o.useState(""),s=o.useRef(null),p=o.useRef([]),f=async()=>{l(""),x("");try{const r=await navigator.mediaDevices.getUserMedia({audio:!0});s.current=new MediaRecorder(r),s.current.ondataavailable=t=>{p.current.push(t.data)},s.current.onstop=g,s.current.start(),d(!0)}catch{l("Microphone access was denied. Please enable it in your browser settings.")}},h=()=>{var r;(r=s.current)==null||r.stop(),d(!1),u(!0)},g=async()=>{const r=new Blob(p.current,{type:"audio/webm"});p.current=[];try{const t=await N(r),c=await b(t,"audio/webm");x(c)}catch(t){const c=t instanceof Error?t.message:"An unknown error occurred.";l(`Failed to transcribe audio: ${c}`)}finally{u(!1)}};return e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[e.jsxs("header",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(j,{}),e.jsx("span",{className:"ml-3",children:"AI Audio-to-Code"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"Speak your programming ideas and watch them turn into code."})]}),e.jsxs("div",{className:"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 min-h-0",children:[e.jsxs("div",{className:"flex flex-col items-center justify-center bg-slate-800/50 p-6 rounded-lg",children:[e.jsx("button",{onClick:i?h:f,className:`w-32 h-32 rounded-full flex items-center justify-center text-white font-bold text-lg transition-all ${i?"bg-red-500 animate-pulse":"bg-cyan-500"}`,disabled:a,children:i?"Stop":"Record"}),e.jsx("p",{className:"mt-4 text-slate-400",children:i?"Recording in progress...":"Click to start recording"}),n&&e.jsx("p",{className:"text-red-400 mt-4",children:n})]}),e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{className:"text-sm font-medium text-slate-400 mb-2",children:"Generated Code"}),e.jsxs("div",{className:"flex-grow p-1 bg-slate-900 border border-slate-700 rounded-md overflow-y-auto",children:[a&&e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(w,{})}),m&&!a&&e.jsx("div",{className:"prose prose-sm prose-invert max-w-none prose-pre:bg-transparent prose-pre:p-4 prose-pre:m-0 prose-code:text-cyan-300",dangerouslySetInnerHTML:{__html:y(m)}}),!a&&!m&&!n&&e.jsx("div",{className:"text-slate-500 h-full flex items-center justify-center",children:"Code will appear here."})]})]})]})]})};export{Be as AudioToCode};
2
+ //# sourceMappingURL=AudioToCode-CJm_3BF6.js.map
assets/AudioToCode-CJm_3BF6.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"AudioToCode-CJm_3BF6.js","sources":["../../components/features/AudioToCode.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback } from 'react';\nimport { transcribeAudioToCode } from '../../services/geminiService.ts';\nimport { CpuChipIcon } from '../icons/FeatureIcons.tsx';\nimport { LoadingSpinner } from './shared/LoadingSpinner.tsx';\nimport { marked } from 'marked';\nimport { blobToBase64 } from '../../services/fileUtils.ts';\n\nexport const AudioToCode: React.FC = () => {\n const [isRecording, setIsRecording] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [code, setCode] = useState('');\n const [error, setError] = useState('');\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const audioChunksRef = useRef<Blob[]>([]);\n\n const handleStartRecording = async () => {\n setError('');\n setCode('');\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n mediaRecorderRef.current = new MediaRecorder(stream);\n mediaRecorderRef.current.ondataavailable = event => {\n audioChunksRef.current.push(event.data);\n };\n mediaRecorderRef.current.onstop = handleTranscribe;\n mediaRecorderRef.current.start();\n setIsRecording(true);\n } catch (err) {\n setError('Microphone access was denied. Please enable it in your browser settings.');\n }\n };\n\n const handleStopRecording = () => {\n mediaRecorderRef.current?.stop();\n setIsRecording(false);\n setIsLoading(true);\n };\n\n const handleTranscribe = async () => {\n const audioBlob = new Blob(audioChunksRef.current, { type: 'audio/webm' });\n audioChunksRef.current = [];\n try {\n const base64Audio = await blobToBase64(audioBlob);\n const result = await transcribeAudioToCode(base64Audio, 'audio/webm');\n setCode(result);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to transcribe audio: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <CpuChipIcon />\n <span className=\"ml-3\">AI Audio-to-Code</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Speak your programming ideas and watch them turn into code.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 min-h-0\">\n <div className=\"flex flex-col items-center justify-center bg-slate-800/50 p-6 rounded-lg\">\n <button\n onClick={isRecording ? handleStopRecording : handleStartRecording}\n className={`w-32 h-32 rounded-full flex items-center justify-center text-white font-bold text-lg transition-all ${isRecording ? 'bg-red-500 animate-pulse' : 'bg-cyan-500'}`}\n disabled={isLoading}\n >\n {isRecording ? 'Stop' : 'Record'}\n </button>\n <p className=\"mt-4 text-slate-400\">\n {isRecording ? 'Recording in progress...' : 'Click to start recording'}\n </p>\n {error && <p className=\"text-red-400 mt-4\">{error}</p>}\n </div>\n <div className=\"flex flex-col h-full\">\n <label className=\"text-sm font-medium text-slate-400 mb-2\">Generated Code</label>\n <div className=\"flex-grow p-1 bg-slate-900 border border-slate-700 rounded-md overflow-y-auto\">\n {isLoading && (\n <div className=\"flex items-center justify-center h-full\"><LoadingSpinner /></div>\n )}\n {code && !isLoading && (\n <div\n className=\"prose prose-sm prose-invert max-w-none prose-pre:bg-transparent prose-pre:p-4 prose-pre:m-0 prose-code:text-cyan-300\"\n dangerouslySetInnerHTML={{ __html: marked(code) }}\n />\n )}\n {!isLoading && !code && !error && (\n <div className=\"text-slate-500 h-full flex items-center justify-center\">Code will appear here.</div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};"],"names":["AudioToCode","isRecording","setIsRecording","useState","isLoading","setIsLoading","code","setCode","error","setError","mediaRecorderRef","useRef","audioChunksRef","handleStartRecording","stream","event","handleTranscribe","handleStopRecording","_a","audioBlob","base64Audio","blobToBase64","result","transcribeAudioToCode","err","errorMessage","jsxs","jsx","CpuChipIcon","LoadingSpinner","marked"],"mappings":"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"}
assets/ChangelogGenerator-C_BR7_cn.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import{r as a,j as t}from"./react-_fH1j4AW.js";import{G as n}from"./index-Nqm_ElTk.js";import"./@braintree-9Zuj5s7N.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const c=`feat: add user login page
2
+ fix: correct typo in header
3
+ docs: update readme with setup instructions
4
+ feat(api): implement user endpoint
5
+ chore: upgrade dependencies
6
+ fix(button): prevent double click`,bt=()=>{const[o,p]=a.useState(c),m=a.useMemo(()=>{const r=o.split(`
7
+ `).filter(e=>e.trim()!==""),s=r.filter(e=>e.startsWith("feat")).map(e=>`- ${e.substring(e.indexOf(":")+2)}`),l=r.filter(e=>e.startsWith("fix")).map(e=>`- ${e.substring(e.indexOf(":")+2)}`);let i=`# Changelog
8
+
9
+ `;return s.length>0&&(i+=`## ✨ Features
10
+
11
+ `+s.join(`
12
+ `)+`
13
+
14
+ `),l.length>0&&(i+=`## 🐛 Bug Fixes
15
+
16
+ `+l.join(`
17
+ `)+`
18
+
19
+ `),i},[o]);return t.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[t.jsxs("header",{className:"mb-6",children:[t.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[t.jsx(n,{}),t.jsx("span",{className:"ml-3",children:"Changelog Generator"})]}),t.jsx("p",{className:"text-slate-400 mt-1",children:"Generate a markdown changelog from a list of conventional commits."})]}),t.jsxs("div",{className:"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden",children:[t.jsxs("div",{className:"flex flex-col h-full",children:[t.jsx("label",{htmlFor:"commit-input",className:"text-sm font-medium text-slate-400 mb-2",children:"Commit Messages (one per line)"}),t.jsx("textarea",{id:"commit-input",value:o,onChange:r=>p(r.target.value),className:"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm"})]}),t.jsxs("div",{className:"flex flex-col h-full",children:[t.jsx("label",{className:"text-sm font-medium text-slate-400 mb-2",children:"Generated Changelog.md"}),t.jsxs("div",{className:"relative flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto",children:[t.jsx("pre",{className:"whitespace-pre-wrap font-sans text-slate-200",children:m}),t.jsx("button",{onClick:()=>navigator.clipboard.writeText(m),className:"absolute top-2 right-2 px-2 py-1 bg-slate-700 hover:bg-slate-600 rounded-md text-xs",children:"Copy"})]})]})]})]})};export{bt as ChangelogGenerator};
20
+ //# sourceMappingURL=ChangelogGenerator-C_BR7_cn.js.map
assets/ChangelogGenerator-C_BR7_cn.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"ChangelogGenerator-C_BR7_cn.js","sources":["../../components/features/ChangelogGenerator.tsx"],"sourcesContent":["\nimport React, { useState, useMemo } from 'react';\nimport { GitBranchIcon } from '../icons/FeatureIcons';\n\nconst sampleCommits = `feat: add user login page\nfix: correct typo in header\ndocs: update readme with setup instructions\nfeat(api): implement user endpoint\nchore: upgrade dependencies\nfix(button): prevent double click`;\n\nexport const ChangelogGenerator: React.FC = () => {\n const [commits, setCommits] = useState(sampleCommits);\n\n const changelog = useMemo(() => {\n const lines = commits.split('\\n').filter(line => line.trim() !== '');\n const features = lines.filter(l => l.startsWith('feat')).map(l => `- ${l.substring(l.indexOf(':') + 2)}`);\n const fixes = lines.filter(l => l.startsWith('fix')).map(l => `- ${l.substring(l.indexOf(':') + 2)}`);\n \n let md = '# Changelog\\n\\n';\n if (features.length > 0) {\n md += '## ✨ Features\\n\\n' + features.join('\\n') + '\\n\\n';\n }\n if (fixes.length > 0) {\n md += '## 🐛 Bug Fixes\\n\\n' + fixes.join('\\n') + '\\n\\n';\n }\n return md;\n }, [commits]);\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <GitBranchIcon />\n <span className=\"ml-3\">Changelog Generator</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Generate a markdown changelog from a list of conventional commits.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden\">\n <div className=\"flex flex-col h-full\">\n <label htmlFor=\"commit-input\" className=\"text-sm font-medium text-slate-400 mb-2\">Commit Messages (one per line)</label>\n <textarea\n id=\"commit-input\"\n value={commits}\n onChange={(e) => setCommits(e.target.value)}\n className=\"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm\"\n />\n </div>\n <div className=\"flex flex-col h-full\">\n <label className=\"text-sm font-medium text-slate-400 mb-2\">Generated Changelog.md</label>\n <div className=\"relative flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto\">\n <pre className=\"whitespace-pre-wrap font-sans text-slate-200\">{changelog}</pre>\n <button onClick={() => navigator.clipboard.writeText(changelog)} className=\"absolute top-2 right-2 px-2 py-1 bg-slate-700 hover:bg-slate-600 rounded-md text-xs\">Copy</button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n"],"names":["sampleCommits","ChangelogGenerator","commits","setCommits","useState","changelog","useMemo","lines","line","features","l","fixes","md","jsxs","jsx","GitBranchIcon","e"],"mappings":"4xEAIA,MAAMA,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,mCAOTC,GAA+B,IAAM,CAC9C,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAASJ,CAAa,EAE9CK,EAAYC,EAAAA,QAAQ,IAAM,CAC5B,MAAMC,EAAQL,EAAQ,MAAM;AAAA,CAAI,EAAE,OAAOM,GAAQA,EAAK,KAAA,IAAW,EAAE,EAC7DC,EAAWF,EAAM,OAAOG,GAAKA,EAAE,WAAW,MAAM,CAAC,EAAE,OAAS,KAAKA,EAAE,UAAUA,EAAE,QAAQ,GAAG,EAAI,CAAC,CAAC,EAAE,EAClGC,EAAQJ,EAAM,OAAOG,GAAKA,EAAE,WAAW,KAAK,CAAC,EAAE,OAAS,KAAKA,EAAE,UAAUA,EAAE,QAAQ,GAAG,EAAI,CAAC,CAAC,EAAE,EAEpG,IAAIE,EAAK;AAAA;AAAA,EACT,OAAIH,EAAS,OAAS,IAClBG,GAAM;AAAA;AAAA,EAAsBH,EAAS,KAAK;AAAA,CAAI,EAAI;AAAA;AAAA,GAElDE,EAAM,OAAS,IACfC,GAAM;AAAA;AAAA,EAAwBD,EAAM,KAAK;AAAA,CAAI,EAAI;AAAA;AAAA,GAE9CC,CACX,EAAG,CAACV,CAAO,CAAC,EAEZ,OACIW,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,OACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACV,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAc,EACfD,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,qBAAA,CAAmB,CAAA,EAC9C,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,oEAAA,CAAkE,CAAA,EACzG,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,yEACX,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,MAAC,QAAA,CAAM,QAAQ,eAAe,UAAU,0CAA0C,SAAA,iCAA8B,EAChHA,EAAAA,IAAC,WAAA,CACG,GAAG,eACH,MAAOZ,EACP,SAAWc,GAAMb,EAAWa,EAAE,OAAO,KAAK,EAC1C,UAAU,6FAAA,CAAA,CACd,EACJ,EACAH,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,0CAA0C,SAAA,yBAAsB,EACjFD,EAAAA,KAAC,MAAA,CAAI,UAAU,+FACX,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,+CAAgD,SAAAT,EAAU,EACzES,EAAAA,IAAC,SAAA,CAAO,QAAS,IAAM,UAAU,UAAU,UAAUT,CAAS,EAAG,UAAU,sFAAsF,SAAA,MAAA,CAAI,CAAA,CAAA,CACzK,CAAA,CAAA,CACJ,CAAA,CAAA,CACJ,CAAA,EACJ,CAER"}
assets/ClipboardHistory-CLvZGDee.js ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ import{r,j as e}from"./react-_fH1j4AW.js";import{F as u}from"./index-Nqm_ElTk.js";import"./@braintree-9Zuj5s7N.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const wt=()=>{const[o,n]=r.useState([]),[a,i]=r.useState("prompt"),[l,p]=r.useState(""),m=r.useCallback(async()=>{if(!navigator.permissions){p("Clipboard API not supported in this browser."),i("denied");return}try{const t=await navigator.permissions.query({name:"clipboard-read"});i(t.state),t.onchange=()=>i(t.state)}catch{p("Clipboard API not supported or permission could not be queried."),i("denied")}},[]);r.useEffect(()=>{m()},[m]),r.useEffect(()=>{const t=async()=>{if(a==="granted")try{const s=await navigator.clipboard.readText();s&&(o.length===0||o[0].text!==s)&&n(x=>[{id:Date.now(),text:s},...x.slice(0,49)])}catch(s){console.error("Could not read from clipboard on focus",s)}};return window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t)}},[a,o]);const c=t=>{navigator.clipboard.writeText(t)},d=async()=>{try{await navigator.clipboard.readText(),m()}catch{p("Permission was not granted."),i("denied")}};return e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[e.jsxs("header",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(u,{}),e.jsx("span",{className:"ml-3",children:"Clipboard History"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"View and reuse items you've recently copied to your clipboard. (Updates on window focus)"})]}),a!=="granted"?e.jsxs("div",{className:"flex-grow flex flex-col items-center justify-center bg-slate-800/50 rounded-lg p-8",children:[e.jsx("p",{className:"text-lg text-slate-300 mb-4",children:l||"This feature requires permission to read from your clipboard."}),a==="prompt"&&e.jsx("button",{onClick:d,className:"px-6 py-2 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400",children:"Grant Permission"})]}):e.jsx("div",{className:"flex-grow overflow-y-auto space-y-3 pr-2",children:o.length>0?o.map(t=>e.jsxs("div",{className:"bg-slate-800 p-3 rounded-md flex items-center justify-between gap-4",children:[e.jsx("pre",{className:"text-sm text-slate-300 truncate",children:t.text}),e.jsx("button",{onClick:()=>c(t.text),className:"text-xs bg-slate-700 hover:bg-slate-600 text-slate-200 px-3 py-1 rounded-md flex-shrink-0",children:"Copy"})]},t.id)):e.jsx("div",{className:"text-slate-500 h-full flex items-center justify-center",children:"Copy some text to start building your history..."})})]})};export{wt as ClipboardHistory};
2
+ //# sourceMappingURL=ClipboardHistory-CLvZGDee.js.map
assets/ClipboardHistory-CLvZGDee.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"ClipboardHistory-CLvZGDee.js","sources":["../../components/features/ClipboardHistory.tsx"],"sourcesContent":["\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { FileCodeIcon } from '../icons/FeatureIcons.tsx';\n\ninterface ClipboardItem {\n id: number;\n text: string;\n}\n\nexport const ClipboardHistory: React.FC = () => {\n const [history, setHistory] = useState<ClipboardItem[]>([]);\n const [permissionStatus, setPermissionStatus] = useState<'prompt' | 'granted' | 'denied'>('prompt');\n const [error, setError] = useState('');\n\n const checkPermission = useCallback(async () => {\n if (!navigator.permissions) {\n setError('Clipboard API not supported in this browser.');\n setPermissionStatus('denied');\n return;\n }\n try {\n const permission = await navigator.permissions.query({ name: 'clipboard-read' as PermissionName });\n setPermissionStatus(permission.state);\n permission.onchange = () => setPermissionStatus(permission.state);\n } catch (e) {\n setError('Clipboard API not supported or permission could not be queried.');\n setPermissionStatus('denied');\n }\n }, []);\n\n useEffect(() => {\n checkPermission();\n }, [checkPermission]);\n\n useEffect(() => {\n const handleFocus = async () => {\n if (permissionStatus === 'granted') {\n try {\n const text = await navigator.clipboard.readText();\n if (text && (history.length === 0 || history[0].text !== text)) {\n setHistory(prev => [{ id: Date.now(), text }, ...prev.slice(0, 49)]);\n }\n } catch(err) {\n console.error(\"Could not read from clipboard on focus\", err);\n }\n }\n };\n\n window.addEventListener('focus', handleFocus);\n return () => {\n window.removeEventListener('focus', handleFocus);\n };\n }, [permissionStatus, history]);\n\n const handleCopyItem = (text: string) => {\n navigator.clipboard.writeText(text);\n };\n \n const requestPermission = async () => {\n try {\n await navigator.clipboard.readText(); // This will trigger the prompt\n checkPermission();\n } catch (err) {\n setError('Permission was not granted.');\n setPermissionStatus('denied');\n }\n };\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <FileCodeIcon />\n <span className=\"ml-3\">Clipboard History</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">View and reuse items you've recently copied to your clipboard. (Updates on window focus)</p>\n </header>\n \n {permissionStatus !== 'granted' ? (\n <div className=\"flex-grow flex flex-col items-center justify-center bg-slate-800/50 rounded-lg p-8\">\n <p className=\"text-lg text-slate-300 mb-4\">{error || \"This feature requires permission to read from your clipboard.\"}</p>\n {permissionStatus === 'prompt' && (\n <button\n onClick={requestPermission}\n className=\"px-6 py-2 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400\"\n >\n Grant Permission\n </button>\n )}\n </div>\n ) : (\n <div className=\"flex-grow overflow-y-auto space-y-3 pr-2\">\n {history.length > 0 ? (\n history.map(item => (\n <div key={item.id} className=\"bg-slate-800 p-3 rounded-md flex items-center justify-between gap-4\">\n <pre className=\"text-sm text-slate-300 truncate\">{item.text}</pre>\n <button\n onClick={() => handleCopyItem(item.text)}\n className=\"text-xs bg-slate-700 hover:bg-slate-600 text-slate-200 px-3 py-1 rounded-md flex-shrink-0\"\n >\n Copy\n </button>\n </div>\n ))\n ) : (\n <div className=\"text-slate-500 h-full flex items-center justify-center\">\n Copy some text to start building your history...\n </div>\n )}\n </div>\n )}\n </div>\n );\n};"],"names":["ClipboardHistory","history","setHistory","useState","permissionStatus","setPermissionStatus","error","setError","checkPermission","useCallback","permission","useEffect","handleFocus","text","prev","err","handleCopyItem","requestPermission","jsxs","jsx","FileCodeIcon","item"],"mappings":"uxEASO,MAAMA,GAA6B,IAAM,CAC5C,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAA0B,CAAA,CAAE,EACpD,CAACC,EAAkBC,CAAmB,EAAIF,EAAAA,SAA0C,QAAQ,EAC5F,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAS,EAAE,EAE/BK,EAAkBC,EAAAA,YAAY,SAAY,CAC5C,GAAI,CAAC,UAAU,YAAa,CACvBF,EAAS,8CAA8C,EACvDF,EAAoB,QAAQ,EAC5B,MACL,CACA,GAAI,CACA,MAAMK,EAAa,MAAM,UAAU,YAAY,MAAM,CAAE,KAAM,iBAAoC,EACjGL,EAAoBK,EAAW,KAAK,EACpCA,EAAW,SAAW,IAAML,EAAoBK,EAAW,KAAK,CACpE,MAAY,CACPH,EAAS,iEAAiE,EAC1EF,EAAoB,QAAQ,CACjC,CACJ,EAAG,CAAA,CAAE,EAELM,EAAAA,UAAU,IAAM,CACZH,EAAA,CACJ,EAAG,CAACA,CAAe,CAAC,EAEpBG,EAAAA,UAAU,IAAM,CACZ,MAAMC,EAAc,SAAY,CAC5B,GAAIR,IAAqB,UACrB,GAAI,CACA,MAAMS,EAAO,MAAM,UAAU,UAAU,SAAA,EACnCA,IAASZ,EAAQ,SAAW,GAAKA,EAAQ,CAAC,EAAE,OAASY,IACpDX,EAAWY,GAAQ,CAAC,CAAE,GAAI,KAAK,IAAA,EAAO,KAAAD,CAAA,EAAQ,GAAGC,EAAK,MAAM,EAAG,EAAE,CAAC,CAAC,CAE5E,OAAQC,EAAK,CACT,QAAQ,MAAM,yCAA0CA,CAAG,CAC/D,CAER,EAEA,cAAO,iBAAiB,QAASH,CAAW,EACrC,IAAM,CACT,OAAO,oBAAoB,QAASA,CAAW,CACnD,CACJ,EAAG,CAACR,EAAkBH,CAAO,CAAC,EAE9B,MAAMe,EAAkBH,GAAiB,CACrC,UAAU,UAAU,UAAUA,CAAI,CACtC,EAEMI,EAAoB,SAAY,CAClC,GAAI,CACA,MAAM,UAAU,UAAU,SAAA,EAC1BT,EAAA,CACJ,MAAc,CACVD,EAAS,6BAA6B,EACtCF,EAAoB,QAAQ,CAChC,CACJ,EAEA,OACIa,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,OACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACV,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAa,EACdD,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,mBAAA,CAAiB,CAAA,EAC5C,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,0FAAA,CAAwF,CAAA,EAC/H,EAECf,IAAqB,UAClBc,OAAC,MAAA,CAAI,UAAU,qFACX,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAb,GAAS,gEAAgE,EACpHF,IAAqB,UAClBe,EAAAA,IAAC,SAAA,CACG,QAASF,EACT,UAAU,8EACb,SAAA,kBAAA,CAAA,CAED,EAER,EAEAE,EAAAA,IAAC,MAAA,CAAI,UAAU,2CACV,SAAAlB,EAAQ,OAAS,EACdA,EAAQ,IAAIoB,GACRH,EAAAA,KAAC,MAAA,CAAkB,UAAU,sEACzB,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,kCAAmC,SAAAE,EAAK,KAAK,EAC5DF,EAAAA,IAAC,SAAA,CACG,QAAS,IAAMH,EAAeK,EAAK,IAAI,EACvC,UAAU,4FACb,SAAA,MAAA,CAAA,CAED,CAAA,EAPMA,EAAK,EAQf,CACH,QAEA,MAAA,CAAI,UAAU,yDAAyD,SAAA,kDAAA,CAExE,CAAA,CAER,CAAA,EAER,CAER"}
assets/ClipboardSnippetInserter-CASD8YIS.js ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ import{r as p,j as t}from"./react-_fH1j4AW.js";import{g as s}from"./index-Nqm_ElTk.js";import"./@braintree-9Zuj5s7N.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const l=(r,o)=>{const[i,m]=p.useState(()=>{try{const e=window.localStorage.getItem(r);return e?JSON.parse(e):o}catch{return o}});return[i]},ft=()=>{const[r]=l("devcore_snippets",[]),[o,i]=p.useState(""),m=e=>{navigator.clipboard.writeText(e),i("Copied!"),setTimeout(()=>i(""),2e3)};return t.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[t.jsxs("header",{className:"mb-6 flex justify-between items-center",children:[t.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[t.jsx(s,{}),t.jsx("span",{className:"ml-3",children:"Clipboard Snippet Inserter"})]}),o&&t.jsx("span",{className:"text-green-400 bg-green-500/10 px-3 py-1 rounded-md",children:o})]}),t.jsx("p",{className:"text-slate-400 -mt-4 mb-6",children:"Quickly copy your saved snippets from the Snippet Vault."}),t.jsx("div",{className:"flex-grow overflow-y-auto pr-2",children:t.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:r&&r.length>0?r.map(e=>t.jsxs("div",{className:"bg-slate-800/50 p-4 rounded-lg flex flex-col justify-between",children:[t.jsx("p",{className:"font-bold text-slate-200 truncate",children:e.name}),t.jsx("pre",{className:"text-xs text-slate-400 bg-slate-900 p-2 rounded-md my-2 overflow-x-auto h-24",children:e.code}),t.jsx("button",{onClick:()=>m(e.code),className:"w-full mt-2 text-sm py-2 bg-cyan-500/80 hover:bg-cyan-500 text-white rounded-md",children:"Copy"})]},e.id)):t.jsx("div",{className:"col-span-full text-slate-500 h-full flex items-center justify-center",children:'No snippets found. Add some in the "Snippet Vault" feature.'})})})]})};export{ft as ClipboardSnippetInserter};
2
+ //# sourceMappingURL=ClipboardSnippetInserter-CASD8YIS.js.map
assets/ClipboardSnippetInserter-CASD8YIS.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"ClipboardSnippetInserter-CASD8YIS.js","sources":["../../components/features/ClipboardSnippetInserter.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { CodeBracketIcon } from '../icons/FeatureIcons.tsx';\n\ninterface Snippet {\n id: number;\n name: string;\n code: string;\n}\n\nconst useLocalStorage = (key: string, initialValue: any) => {\n const [storedValue, setStoredValue] = useState(() => {\n try {\n const item = window.localStorage.getItem(key);\n return item ? JSON.parse(item) : initialValue;\n } catch (error) { return initialValue; }\n });\n // This hook is for reading only in this component, so we don't return setValue\n return [storedValue];\n};\n\nexport const ClipboardSnippetInserter: React.FC = () => {\n const [snippets] = useLocalStorage('devcore_snippets', []);\n const [feedback, setFeedback] = useState('');\n\n const handleCopy = (code: string) => {\n navigator.clipboard.writeText(code);\n setFeedback('Copied!');\n setTimeout(() => setFeedback(''), 2000);\n };\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6 flex justify-between items-center\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <CodeBracketIcon />\n <span className=\"ml-3\">Clipboard Snippet Inserter</span>\n </h1>\n {feedback && <span className=\"text-green-400 bg-green-500/10 px-3 py-1 rounded-md\">{feedback}</span>}\n </header>\n <p className=\"text-slate-400 -mt-4 mb-6\">Quickly copy your saved snippets from the Snippet Vault.</p>\n \n <div className=\"flex-grow overflow-y-auto pr-2\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {snippets && snippets.length > 0 ? (\n snippets.map((snippet: Snippet) => (\n <div key={snippet.id} className=\"bg-slate-800/50 p-4 rounded-lg flex flex-col justify-between\">\n <p className=\"font-bold text-slate-200 truncate\">{snippet.name}</p>\n <pre className=\"text-xs text-slate-400 bg-slate-900 p-2 rounded-md my-2 overflow-x-auto h-24\">{snippet.code}</pre>\n <button\n onClick={() => handleCopy(snippet.code)}\n className=\"w-full mt-2 text-sm py-2 bg-cyan-500/80 hover:bg-cyan-500 text-white rounded-md\"\n >\n Copy\n </button>\n </div>\n ))\n ) : (\n <div className=\"col-span-full text-slate-500 h-full flex items-center justify-center\">\n No snippets found. Add some in the \"Snippet Vault\" feature.\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};"],"names":["useLocalStorage","key","initialValue","storedValue","setStoredValue","useState","item","ClipboardSnippetInserter","snippets","feedback","setFeedback","handleCopy","code","jsxs","jsx","CodeBracketIcon","snippet"],"mappings":"4xEASA,MAAMA,EAAkB,CAACC,EAAaC,IAAsB,CACxD,KAAM,CAACC,EAAaC,CAAc,EAAIC,EAAAA,SAAS,IAAM,CACjD,GAAI,CACA,MAAMC,EAAO,OAAO,aAAa,QAAQL,CAAG,EAC5C,OAAOK,EAAO,KAAK,MAAMA,CAAI,EAAIJ,CACrC,MAAgB,CAAE,OAAOA,CAAc,CAC3C,CAAC,EAED,MAAO,CAACC,CAAW,CACvB,EAEaI,GAAqC,IAAM,CACpD,KAAM,CAACC,CAAQ,EAAIR,EAAgB,mBAAoB,CAAA,CAAE,EACnD,CAACS,EAAUC,CAAW,EAAIL,EAAAA,SAAS,EAAE,EAErCM,EAAcC,GAAiB,CACjC,UAAU,UAAU,UAAUA,CAAI,EAClCF,EAAY,SAAS,EACrB,WAAW,IAAMA,EAAY,EAAE,EAAG,GAAI,CAC1C,EAEA,OACIG,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,yCACb,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACX,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAgB,EACjBD,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,4BAAA,CAA0B,CAAA,EACrD,EACCL,GAAYK,EAAAA,IAAC,OAAA,CAAK,UAAU,sDAAuD,SAAAL,CAAA,CAAS,CAAA,EACjG,EACAK,EAAAA,IAAC,IAAA,CAAE,UAAU,4BAA4B,SAAA,2DAAwD,QAEhG,MAAA,CAAI,UAAU,iCACX,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,uDACV,SAAAN,GAAYA,EAAS,OAAS,EAC3BA,EAAS,IAAKQ,GACVH,EAAAA,KAAC,MAAA,CAAqB,UAAU,+DAC5B,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,oCAAqC,SAAAE,EAAQ,KAAK,EAC/DF,EAAAA,IAAC,MAAA,CAAI,UAAU,+EAAgF,WAAQ,KAAK,EAC5GA,EAAAA,IAAC,SAAA,CACG,QAAS,IAAMH,EAAWK,EAAQ,IAAI,EACtC,UAAU,kFACb,SAAA,MAAA,CAAA,CAED,CAAA,EARMA,EAAQ,EASlB,CACH,EAEDF,EAAAA,IAAC,OAAI,UAAU,uEAAuE,SAAA,6DAAA,CAEtF,CAAA,CAER,CAAA,CACJ,CAAA,EACJ,CAER"}
assets/ClipboardToCode-DUFUEH4X.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ import{r as a,j as t}from"./react-_fH1j4AW.js";import{g as s}from"./index-Nqm_ElTk.js";import"./@braintree-9Zuj5s7N.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const ht=()=>{const[r,e]=a.useState(""),i=async o=>{o.preventDefault();const m=await navigator.clipboard.readText(),p=`${r}\`\`\`
2
+ ${m}
3
+ \`\`\``;e(p)};return t.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[t.jsxs("header",{className:"mb-6",children:[t.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[t.jsx(s,{}),t.jsx("span",{className:"ml-3",children:"Clipboard-to-Code Mode"})]}),t.jsx("p",{className:"text-slate-400 mt-1",children:"Paste any content into the text area below to automatically wrap it in a code block."})]}),t.jsxs("div",{className:"flex-grow flex flex-col h-full",children:[t.jsx("label",{htmlFor:"paste-area",className:"text-sm font-medium text-slate-400 mb-2",children:"Paste Zone"}),t.jsx("textarea",{id:"paste-area",value:r,onPaste:i,onChange:o=>e(o.target.value),placeholder:"Paste here (Ctrl+V)...",className:"flex-grow p-4 bg-slate-900 border-2 border-dashed border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none"})]})]})};export{ht as ClipboardToCode};
4
+ //# sourceMappingURL=ClipboardToCode-DUFUEH4X.js.map
assets/ClipboardToCode-DUFUEH4X.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"ClipboardToCode-DUFUEH4X.js","sources":["../../components/features/ClipboardToCode.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { CodeBracketIcon } from '../icons/FeatureIcons.tsx';\n\nexport const ClipboardToCode: React.FC = () => {\n const [content, setContent] = useState('');\n\n const handlePaste = async (e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n e.preventDefault();\n const pastedText = await navigator.clipboard.readText();\n const newContent = `${content}\\`\\`\\`\\n${pastedText}\\n\\`\\`\\``;\n setContent(newContent);\n };\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <CodeBracketIcon />\n <span className=\"ml-3\">Clipboard-to-Code Mode</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Paste any content into the text area below to automatically wrap it in a code block.</p>\n </header>\n <div className=\"flex-grow flex flex-col h-full\">\n <label htmlFor=\"paste-area\" className=\"text-sm font-medium text-slate-400 mb-2\">Paste Zone</label>\n <textarea\n id=\"paste-area\"\n value={content}\n onPaste={handlePaste}\n onChange={(e) => setContent(e.target.value)}\n placeholder=\"Paste here (Ctrl+V)...\"\n className=\"flex-grow p-4 bg-slate-900 border-2 border-dashed border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none\"\n />\n </div>\n </div>\n );\n};"],"names":["ClipboardToCode","content","setContent","useState","handlePaste","e","pastedText","newContent","jsxs","jsx","CodeBracketIcon"],"mappings":"4xEAGO,MAAMA,GAA4B,IAAM,CAC3C,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAE,EAEnCC,EAAc,MAAOC,GAAiD,CACxEA,EAAE,eAAA,EACF,MAAMC,EAAa,MAAM,UAAU,UAAU,SAAA,EACvCC,EAAa,GAAGN,CAAO;AAAA,EAAWK,CAAU;AAAA,QAClDJ,EAAWK,CAAU,CACzB,EAEA,OACIC,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,OACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACV,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAgB,EACjBD,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,wBAAA,CAAsB,CAAA,EACjD,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,sFAAA,CAAoF,CAAA,EAC3H,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACX,SAAA,CAAAC,MAAC,QAAA,CAAM,QAAQ,aAAa,UAAU,0CAA0C,SAAA,aAAU,EAC1FA,EAAAA,IAAC,WAAA,CACG,GAAG,aACH,MAAOR,EACP,QAASG,EACT,SAAWC,GAAMH,EAAWG,EAAE,OAAO,KAAK,EAC1C,YAAY,yBACZ,UAAU,+KAAA,CAAA,CACd,CAAA,CACJ,CAAA,EACJ,CAER"}
assets/CodeAudioNarrator-0iRIzTGo.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ import{r as s,j as e}from"./react-_fH1j4AW.js";import{c as b}from"./index-Nqm_ElTk.js";import"./@braintree-9Zuj5s7N.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const ke=()=>{const[l,p]=s.useState(`function helloWorld() {
2
+ console.log("Hello, world!");
3
+ }`),[n,d]=s.useState([]),[m,c]=s.useState(),[r,x]=s.useState(1),[a,h]=s.useState(1);s.useEffect(()=>{const t=()=>{var i;const o=window.speechSynthesis.getVoices();d(o),o.length>0&&c(((i=o.find(g=>g.lang.startsWith("en")))==null?void 0:i.name)||o[0].name)};t(),window.speechSynthesis.onvoiceschanged=t},[]);const u=()=>{window.speechSynthesis.speaking&&window.speechSynthesis.cancel();const t=new SpeechSynthesisUtterance(l),o=n.find(i=>i.name===m);o&&(t.voice=o),t.rate=r,t.pitch=a,window.speechSynthesis.speak(t)},f=()=>{window.speechSynthesis.cancel()};return e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[e.jsxs("header",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(b,{}),e.jsx("span",{className:"ml-3",children:"Code Audio Narrator"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"Have your code read aloud for accessibility or proof-listening."})]}),e.jsxs("div",{className:"flex-grow grid grid-cols-1 lg:grid-cols-3 gap-6 min-h-0",children:[e.jsxs("div",{className:"lg:col-span-2 flex flex-col h-full",children:[e.jsx("label",{htmlFor:"code-narrator-input",className:"text-sm font-medium text-slate-400 mb-2",children:"Code to Read"}),e.jsx("textarea",{id:"code-narrator-input",value:l,onChange:t=>p(t.target.value),className:"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none"})]}),e.jsxs("div",{className:"flex flex-col gap-4 bg-slate-800/50 p-6 rounded-lg",children:[e.jsx("h3",{className:"text-xl font-bold",children:"Controls"}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"voice-select",className:"block text-sm font-medium text-slate-400",children:"Voice"}),e.jsx("select",{id:"voice-select",value:m,onChange:t=>c(t.target.value),className:"w-full mt-1 px-3 py-2 rounded-md bg-slate-800 border border-slate-700",children:n.map(t=>e.jsxs("option",{value:t.name,children:[t.name," (",t.lang,")"]},t.name))})]}),e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"rate",className:"block text-sm font-medium text-slate-400",children:["Rate (",r.toFixed(1),")"]}),e.jsx("input",{id:"rate",type:"range",min:"0.5",max:"2",step:"0.1",value:r,onChange:t=>x(Number(t.target.value)),className:"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer"})]}),e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"pitch",className:"block text-sm font-medium text-slate-400",children:["Pitch (",a.toFixed(1),")"]}),e.jsx("input",{id:"pitch",type:"range",min:"0",max:"2",step:"0.1",value:a,onChange:t=>h(Number(t.target.value)),className:"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer"})]}),e.jsxs("div",{className:"flex gap-2 mt-auto",children:[e.jsx("button",{onClick:u,className:"flex-1 px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md",children:"Speak"}),e.jsx("button",{onClick:f,className:"flex-1 px-6 py-3 bg-slate-700 text-slate-200 font-bold rounded-md",children:"Stop"})]})]})]})]})};export{ke as CodeAudioNarrator};
4
+ //# sourceMappingURL=CodeAudioNarrator-0iRIzTGo.js.map
assets/CodeAudioNarrator-0iRIzTGo.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"CodeAudioNarrator-0iRIzTGo.js","sources":["../../components/features/CodeAudioNarrator.tsx"],"sourcesContent":["\nimport React, { useState, useEffect } from 'react';\nimport { SparklesIcon } from '../icons/FeatureIcons.tsx';\n\nexport const CodeAudioNarrator: React.FC = () => {\n const [text, setText] = useState('function helloWorld() {\\n console.log(\"Hello, world!\");\\n}');\n const [voices, setVoices] = useState<SpeechSynthesisVoice[]>([]);\n const [selectedVoice, setSelectedVoice] = useState<string | undefined>();\n const [rate, setRate] = useState(1);\n const [pitch, setPitch] = useState(1);\n\n useEffect(() => {\n const loadVoices = () => {\n const availableVoices = window.speechSynthesis.getVoices();\n setVoices(availableVoices);\n if(availableVoices.length > 0) {\n setSelectedVoice(availableVoices.find(v => v.lang.startsWith('en'))?.name || availableVoices[0].name);\n }\n };\n loadVoices();\n window.speechSynthesis.onvoiceschanged = loadVoices;\n }, []);\n\n const speak = () => {\n if (window.speechSynthesis.speaking) {\n window.speechSynthesis.cancel();\n }\n const utterance = new SpeechSynthesisUtterance(text);\n const voice = voices.find(v => v.name === selectedVoice);\n if (voice) {\n utterance.voice = voice;\n }\n utterance.rate = rate;\n utterance.pitch = pitch;\n window.speechSynthesis.speak(utterance);\n };\n \n const stop = () => {\n window.speechSynthesis.cancel();\n }\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <SparklesIcon />\n <span className=\"ml-3\">Code Audio Narrator</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Have your code read aloud for accessibility or proof-listening.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-3 gap-6 min-h-0\">\n <div className=\"lg:col-span-2 flex flex-col h-full\">\n <label htmlFor=\"code-narrator-input\" className=\"text-sm font-medium text-slate-400 mb-2\">Code to Read</label>\n <textarea\n id=\"code-narrator-input\"\n value={text}\n onChange={e => setText(e.target.value)}\n className=\"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none\"\n />\n </div>\n <div className=\"flex flex-col gap-4 bg-slate-800/50 p-6 rounded-lg\">\n <h3 className=\"text-xl font-bold\">Controls</h3>\n <div>\n <label htmlFor=\"voice-select\" className=\"block text-sm font-medium text-slate-400\">Voice</label>\n <select\n id=\"voice-select\"\n value={selectedVoice}\n onChange={e => setSelectedVoice(e.target.value)}\n className=\"w-full mt-1 px-3 py-2 rounded-md bg-slate-800 border border-slate-700\"\n >\n {voices.map(voice => (\n <option key={voice.name} value={voice.name}>{voice.name} ({voice.lang})</option>\n ))}\n </select>\n </div>\n <div>\n <label htmlFor=\"rate\" className=\"block text-sm font-medium text-slate-400\">Rate ({rate.toFixed(1)})</label>\n <input id=\"rate\" type=\"range\" min=\"0.5\" max=\"2\" step=\"0.1\" value={rate} onChange={e => setRate(Number(e.target.value))} className=\"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer\" />\n </div>\n <div>\n <label htmlFor=\"pitch\" className=\"block text-sm font-medium text-slate-400\">Pitch ({pitch.toFixed(1)})</label>\n <input id=\"pitch\" type=\"range\" min=\"0\" max=\"2\" step=\"0.1\" value={pitch} onChange={e => setPitch(Number(e.target.value))} className=\"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer\" />\n </div>\n <div className=\"flex gap-2 mt-auto\">\n <button onClick={speak} className=\"flex-1 px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md\">Speak</button>\n <button onClick={stop} className=\"flex-1 px-6 py-3 bg-slate-700 text-slate-200 font-bold rounded-md\">Stop</button>\n </div>\n </div>\n </div>\n </div>\n );\n};"],"names":["CodeAudioNarrator","text","setText","useState","voices","setVoices","selectedVoice","setSelectedVoice","rate","setRate","pitch","setPitch","useEffect","loadVoices","availableVoices","_a","v","speak","utterance","voice","stop","jsxs","jsx","SparklesIcon","e"],"mappings":"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"}
assets/CodeFormatter-WxvCjjsg.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ import{r as o,j as e}from"./react-_fH1j4AW.js";import{f}from"./geminiService-7wPGMJPL.js";import{b as u}from"./index-Nqm_ElTk.js";import{L as n}from"./LoadingSpinner-C3NwW9hm.js";import{m as h}from"./marked-CesSW9Du.js";import"./@braintree-9Zuj5s7N.js";import"./@google-4tyssLU_.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const g=`const MyComponent = (props) => {
2
+ const {name, items}=props
3
+ if(!items || items.length === 0){
4
+ return <p>No items found for {name}</p>;
5
+ }
6
+ return <ul>{items.map(item=> <li key={item.id}>{item.name}</li>)}</ul>
7
+ }`,Se=()=>{const[s,d]=o.useState(g),[m,l]=o.useState(""),[r,p]=o.useState(!1),[i,a]=o.useState(""),c=o.useCallback(async()=>{if(!s.trim()){a("Please enter some code to format.");return}p(!0),a(""),l("");try{const t=await f(s);l(t)}catch(t){const x=t instanceof Error?t.message:"An unknown error occurred.";a(`Failed to format code: ${x}`)}finally{p(!1)}},[s]);return e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[e.jsxs("header",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(u,{}),e.jsx("span",{className:"ml-3",children:"AI Code Formatter"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"Clean up your code with AI-powered formatting, like a smart Prettier."})]}),e.jsxs("div",{className:"flex-grow flex flex-col min-h-0",children:[e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6 flex-grow min-h-0",children:[e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{htmlFor:"code-input",className:"text-sm font-medium text-slate-400 mb-2",children:"Input"}),e.jsx("textarea",{id:"code-input",value:s,onChange:t=>d(t.target.value),placeholder:"Paste your unformatted code here...",className:"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none"})]}),e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{className:"text-sm font-medium text-slate-400 mb-2",children:"Output"}),e.jsxs("div",{className:"flex-grow p-1 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto",children:[r&&e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(n,{})}),i&&e.jsx("p",{className:"p-4 text-red-400",children:i}),m&&!r&&e.jsx("div",{className:"prose prose-sm prose-invert max-w-none prose-pre:bg-transparent prose-pre:p-4 prose-pre:m-0 prose-code:text-cyan-300",dangerouslySetInnerHTML:{__html:h(m)}}),!r&&!m&&!i&&e.jsx("div",{className:"text-slate-500 h-full flex items-center justify-center",children:"Formatted code will appear here."})]})]})]}),e.jsx("button",{onClick:c,disabled:r,className:"mt-4 w-full max-w-sm mx-auto flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed",children:r?e.jsx(n,{}):"Format Code"})]})]})};export{Se as CodeFormatter};
8
+ //# sourceMappingURL=CodeFormatter-WxvCjjsg.js.map
assets/CodeFormatter-WxvCjjsg.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"CodeFormatter-WxvCjjsg.js","sources":["../../components/features/CodeFormatter.tsx"],"sourcesContent":["\nimport React, { useState, useCallback } from 'react';\nimport { formatCode } from '../../services/geminiService.ts';\nimport { CodeBracketSquareIcon } from '../icons/FeatureIcons.tsx';\nimport { LoadingSpinner } from './shared/LoadingSpinner.tsx';\nimport { marked } from 'marked';\n\nconst exampleCode = `const MyComponent = (props) => {\n const {name, items}=props\n if(!items || items.length === 0){\n return <p>No items found for {name}</p>;\n }\n return <ul>{items.map(item=> <li key={item.id}>{item.name}</li>)}</ul>\n}`;\n\nexport const CodeFormatter: React.FC = () => {\n const [inputCode, setInputCode] = useState<string>(exampleCode);\n const [formattedCode, setFormattedCode] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n\n const handleFormat = useCallback(async () => {\n if (!inputCode.trim()) {\n setError('Please enter some code to format.');\n return;\n }\n setIsLoading(true);\n setError('');\n setFormattedCode('');\n try {\n const result = await formatCode(inputCode);\n setFormattedCode(result);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to format code: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n }, [inputCode]);\n \n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <CodeBracketSquareIcon />\n <span className=\"ml-3\">AI Code Formatter</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Clean up your code with AI-powered formatting, like a smart Prettier.</p>\n </header>\n <div className=\"flex-grow flex flex-col min-h-0\">\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6 flex-grow min-h-0\">\n <div className=\"flex flex-col h-full\">\n <label htmlFor=\"code-input\" className=\"text-sm font-medium text-slate-400 mb-2\">Input</label>\n <textarea\n id=\"code-input\"\n value={inputCode}\n onChange={(e) => setInputCode(e.target.value)}\n placeholder=\"Paste your unformatted code here...\"\n className=\"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300 focus:ring-2 focus:ring-cyan-500 focus:outline-none\"\n />\n </div>\n <div className=\"flex flex-col h-full\">\n <label className=\"text-sm font-medium text-slate-400 mb-2\">Output</label>\n <div className=\"flex-grow p-1 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto\">\n {isLoading && (\n <div className=\"flex items-center justify-center h-full\">\n <LoadingSpinner />\n </div>\n )}\n {error && <p className=\"p-4 text-red-400\">{error}</p>}\n {formattedCode && !isLoading && (\n <div\n className=\"prose prose-sm prose-invert max-w-none prose-pre:bg-transparent prose-pre:p-4 prose-pre:m-0 prose-code:text-cyan-300\"\n dangerouslySetInnerHTML={{ __html: marked(formattedCode) }}\n />\n )}\n {!isLoading && !formattedCode && !error && (\n <div className=\"text-slate-500 h-full flex items-center justify-center\">\n Formatted code will appear here.\n </div>\n )}\n </div>\n </div>\n </div>\n <button\n onClick={handleFormat}\n disabled={isLoading}\n className=\"mt-4 w-full max-w-sm mx-auto flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed\"\n >\n {isLoading ? <LoadingSpinner /> : 'Format Code'}\n </button>\n </div>\n </div>\n );\n};"],"names":["exampleCode","CodeFormatter","inputCode","setInputCode","useState","formattedCode","setFormattedCode","isLoading","setIsLoading","error","setError","handleFormat","useCallback","result","formatCode","err","errorMessage","jsxs","jsx","CodeBracketSquareIcon","e","LoadingSpinner","marked"],"mappings":"+7EAOA,MAAMA,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQPC,GAA0B,IAAM,CACzC,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAiBJ,CAAW,EACxD,CAACK,EAAeC,CAAgB,EAAIF,EAAAA,SAAiB,EAAE,EACvD,CAACG,EAAWC,CAAY,EAAIJ,EAAAA,SAAkB,EAAK,EACnD,CAACK,EAAOC,CAAQ,EAAIN,EAAAA,SAAiB,EAAE,EAEvCO,EAAeC,EAAAA,YAAY,SAAY,CACzC,GAAI,CAACV,EAAU,OAAQ,CACnBQ,EAAS,mCAAmC,EAC5C,MACJ,CACAF,EAAa,EAAI,EACjBE,EAAS,EAAE,EACXJ,EAAiB,EAAE,EACnB,GAAI,CACA,MAAMO,EAAS,MAAMC,EAAWZ,CAAS,EACzCI,EAAiBO,CAAM,CAC3B,OAASE,EAAK,CACV,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,6BAC1DL,EAAS,0BAA0BM,CAAY,EAAE,CACrD,QAAA,CACIR,EAAa,EAAK,CACtB,CACJ,EAAG,CAACN,CAAS,CAAC,EAEd,OACIe,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,OACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACV,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAsB,EACvBD,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,mBAAA,CAAiB,CAAA,EAC5C,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,uEAAA,CAAqE,CAAA,EAC5G,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACX,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0DACX,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,MAAC,QAAA,CAAM,QAAQ,aAAa,UAAU,0CAA0C,SAAA,QAAK,EACrFA,EAAAA,IAAC,WAAA,CACG,GAAG,aACH,MAAOhB,EACP,SAAWkB,GAAMjB,EAAaiB,EAAE,OAAO,KAAK,EAC5C,YAAY,sCACZ,UAAU,+JAAA,CAAA,CACd,EACJ,EACAH,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,0CAA0C,SAAA,SAAM,EACjED,EAAAA,KAAC,MAAA,CAAI,UAAU,sFACX,SAAA,CAAAV,SACK,MAAA,CAAI,UAAU,0CACX,SAAAW,MAACG,IAAe,EACpB,EAEHZ,GAASS,EAAAA,IAAC,IAAA,CAAE,UAAU,mBAAoB,SAAAT,EAAM,EAChDJ,GAAiB,CAACE,GACfW,EAAAA,IAAC,MAAA,CACG,UAAU,uHACV,wBAAyB,CAAE,OAAQI,EAAOjB,CAAa,CAAA,CAAE,CAAA,EAGhE,CAACE,GAAa,CAACF,GAAiB,CAACI,GAC9BS,EAAAA,IAAC,MAAA,CAAI,UAAU,yDAAyD,SAAA,kCAAA,CAExE,CAAA,CAAA,CAER,CAAA,CAAA,CACJ,CAAA,EACJ,EACCA,EAAAA,IAAC,SAAA,CACE,QAASP,EACT,SAAUJ,EACV,UAAU,gNAET,SAAAA,EAAYW,EAAAA,IAACG,EAAA,CAAA,CAAe,EAAK,aAAA,CAAA,CACtC,CAAA,CACJ,CAAA,EACJ,CAER"}
assets/CodeReviewBot-CGh-qSwY.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import{r as o,j as e}from"./react-_fH1j4AW.js";import{r as u}from"./geminiService-7wPGMJPL.js";import{C as f}from"./index-Nqm_ElTk.js";import{L as n}from"./LoadingSpinner-C3NwW9hm.js";import{m as h}from"./marked-CesSW9Du.js";import"./@braintree-9Zuj5s7N.js";import"./@google-4tyssLU_.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const j=`function UserList(users) {
2
+ if (users.length = 0) {
3
+ return "no users";
4
+ } else {
5
+ return (
6
+ users.map(u => {
7
+ return <li>{u.name}</li>
8
+ })
9
+ )
10
+ }
11
+ }`,ke=()=>{const[s,c]=o.useState(j),[i,a]=o.useState(""),[r,p]=o.useState(!1),[m,l]=o.useState(""),d=o.useCallback(async()=>{if(!s.trim()){l("Please enter some code to review.");return}p(!0),l(""),a("");try{const t=await u(s);a(t)}catch(t){const x=t instanceof Error?t.message:"An unknown error occurred.";l(`Failed to get review: ${x}`)}finally{p(!1)}},[s]);return e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[e.jsxs("header",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(f,{}),e.jsx("span",{className:"ml-3",children:"AI Code Review Bot"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"Get an automated code review from Gemini."})]}),e.jsxs("div",{className:"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden",children:[e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{htmlFor:"code-input",className:"text-sm font-medium text-slate-400 mb-2",children:"Code to Review"}),e.jsx("textarea",{id:"code-input",value:s,onChange:t=>c(t.target.value),placeholder:"Paste your code here...",className:"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300"}),e.jsx("button",{onClick:d,disabled:r,className:"mt-4 w-full flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 disabled:bg-slate-600",children:r?e.jsx(n,{}):"Request Review"})]}),e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{className:"text-sm font-medium text-slate-400 mb-2",children:"AI Feedback"}),e.jsxs("div",{className:"flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto",children:[r&&e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(n,{})}),m&&e.jsx("p",{className:"text-red-400",children:m}),i&&!r&&e.jsx("div",{className:"prose prose-sm prose-invert max-w-none",dangerouslySetInnerHTML:{__html:h(i)}}),!r&&!i&&!m&&e.jsx("div",{className:"text-slate-500 h-full flex items-center justify-center",children:"Review will appear here."})]})]})]})]})};export{ke as CodeReviewBot};
12
+ //# sourceMappingURL=CodeReviewBot-CGh-qSwY.js.map
assets/CodeReviewBot-CGh-qSwY.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"CodeReviewBot-CGh-qSwY.js","sources":["../../components/features/CodeReviewBot.tsx"],"sourcesContent":["import React, { useState, useCallback } from 'react';\nimport { reviewCode } from '../../services/geminiService.ts';\nimport { CpuChipIcon } from '../icons/FeatureIcons.tsx';\nimport { LoadingSpinner } from './shared/LoadingSpinner.tsx';\nimport { marked } from 'marked';\n\nconst exampleCode = `function UserList(users) {\n if (users.length = 0) {\n return \"no users\";\n } else {\n return (\n users.map(u => {\n return <li>{u.name}</li>\n })\n )\n }\n}`;\n\nexport const CodeReviewBot: React.FC = () => {\n const [code, setCode] = useState<string>(exampleCode);\n const [review, setReview] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n\n const handleGenerate = useCallback(async () => {\n if (!code.trim()) {\n setError('Please enter some code to review.');\n return;\n }\n setIsLoading(true);\n setError('');\n setReview('');\n try {\n const result = await reviewCode(code);\n setReview(result);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to get review: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n }, [code]);\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <CpuChipIcon />\n <span className=\"ml-3\">AI Code Review Bot</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Get an automated code review from Gemini.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden\">\n <div className=\"flex flex-col h-full\">\n <label htmlFor=\"code-input\" className=\"text-sm font-medium text-slate-400 mb-2\">Code to Review</label>\n <textarea\n id=\"code-input\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n placeholder=\"Paste your code here...\"\n className=\"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm text-cyan-300\"\n />\n <button\n onClick={handleGenerate}\n disabled={isLoading}\n className=\"mt-4 w-full flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 disabled:bg-slate-600\"\n >\n {isLoading ? <LoadingSpinner /> : 'Request Review'}\n </button>\n </div>\n <div className=\"flex flex-col h-full\">\n <label className=\"text-sm font-medium text-slate-400 mb-2\">AI Feedback</label>\n <div className=\"flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto\">\n {isLoading && <div className=\"flex items-center justify-center h-full\"><LoadingSpinner /></div>}\n {error && <p className=\"text-red-400\">{error}</p>}\n {review && !isLoading && (\n <div\n className=\"prose prose-sm prose-invert max-w-none\"\n dangerouslySetInnerHTML={{ __html: marked(review) }}\n />\n )}\n {!isLoading && !review && !error && <div className=\"text-slate-500 h-full flex items-center justify-center\">Review will appear here.</div>}\n </div>\n </div>\n </div>\n </div>\n );\n};"],"names":["exampleCode","CodeReviewBot","code","setCode","useState","review","setReview","isLoading","setIsLoading","error","setError","handleGenerate","useCallback","result","reviewCode","err","errorMessage","jsxs","jsx","CpuChipIcon","e","LoadingSpinner","marked"],"mappings":"o8EAMA,MAAMA,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAYPC,GAA0B,IAAM,CACzC,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAiBJ,CAAW,EAC9C,CAACK,EAAQC,CAAS,EAAIF,EAAAA,SAAiB,EAAE,EACzC,CAACG,EAAWC,CAAY,EAAIJ,EAAAA,SAAkB,EAAK,EACnD,CAACK,EAAOC,CAAQ,EAAIN,EAAAA,SAAiB,EAAE,EAEvCO,EAAiBC,EAAAA,YAAY,SAAY,CAC3C,GAAI,CAACV,EAAK,OAAQ,CACdQ,EAAS,mCAAmC,EAC5C,MACJ,CACAF,EAAa,EAAI,EACjBE,EAAS,EAAE,EACXJ,EAAU,EAAE,EACZ,GAAI,CACA,MAAMO,EAAS,MAAMC,EAAWZ,CAAI,EACpCI,EAAUO,CAAM,CACpB,OAASE,EAAK,CACV,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,6BAC1DL,EAAS,yBAAyBM,CAAY,EAAE,CACpD,QAAA,CACIR,EAAa,EAAK,CACtB,CACJ,EAAG,CAACN,CAAI,CAAC,EAET,OACIe,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,OACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACV,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAY,EACbD,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,oBAAA,CAAkB,CAAA,EAC7C,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,2CAAA,CAAyC,CAAA,EAChF,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,yEACX,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,MAAC,QAAA,CAAM,QAAQ,aAAa,UAAU,0CAA0C,SAAA,iBAAc,EAC9FA,EAAAA,IAAC,WAAA,CACG,GAAG,aACH,MAAOhB,EACP,SAAWkB,GAAMjB,EAAQiB,EAAE,OAAO,KAAK,EACvC,YAAY,0BACZ,UAAU,2GAAA,CAAA,EAEdF,EAAAA,IAAC,SAAA,CACG,QAASP,EACT,SAAUJ,EACV,UAAU,iJAET,SAAAA,EAAYW,EAAAA,IAACG,EAAA,CAAA,CAAe,EAAK,gBAAA,CAAA,CACtC,EACJ,EACAJ,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,0CAA0C,SAAA,cAAW,EACtED,EAAAA,KAAC,MAAA,CAAI,UAAU,sFACV,SAAA,CAAAV,SAAc,MAAA,CAAI,UAAU,0CAA0C,SAAAW,MAACG,IAAe,EAAE,EACxFZ,GAASS,EAAAA,IAAC,IAAA,CAAE,UAAU,eAAgB,SAAAT,EAAM,EAC5CJ,GAAU,CAACE,GACRW,EAAAA,IAAC,MAAA,CACG,UAAU,yCACV,wBAAyB,CAAE,OAAQI,EAAOjB,CAAM,CAAA,CAAE,CAAA,EAGxD,CAACE,GAAa,CAACF,GAAU,CAACI,GAASS,EAAAA,IAAC,MAAA,CAAI,UAAU,yDAAyD,SAAA,0BAAA,CAAwB,CAAA,CAAA,CACzI,CAAA,CAAA,CACJ,CAAA,CAAA,CACJ,CAAA,EACJ,CAER"}
assets/CodeToFlowchart-3OF-wAs8.js ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import{r as o,R as h,j as e}from"./react-_fH1j4AW.js";import{l as g}from"./geminiService-7wPGMJPL.js";import{M as b}from"./index-Nqm_ElTk.js";import{L as p}from"./LoadingSpinner-C3NwW9hm.js";import{m as d}from"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./@braintree-9Zuj5s7N.js";import"./d3-transition-593SbTzI.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./@google-4tyssLU_.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";d.initialize({startOnLoad:!1,theme:"dark",darkMode:!0,securityLevel:"loose",themeVariables:{background:"#1e293b",primaryColor:"#334155",primaryTextColor:"#cbd5e1",lineColor:"#64748b",textColor:"#cbd5e1"}});const j=`function checkNumber(num) {
2
+ if (num > 0) {
3
+ return "Positive";
4
+ } else if (num < 0) {
5
+ return "Negative";
6
+ } else {
7
+ return "Zero";
8
+ }
9
+ }`,Ee=()=>{const[i,u]=o.useState(j),[s,n]=o.useState(""),[m,c]=o.useState(!1),[l,a]=o.useState(""),t=h.useRef(null),f=o.useCallback(async()=>{if(!i.trim()){a("Please enter some code.");return}c(!0),a(""),n(""),t.current&&(t.current.innerHTML="");try{const r=await g(i);n(r.mermaidCode)}catch(r){const x=r instanceof Error?r.message:"An unknown error occurred.";a(`Failed to generate flowchart: ${x}`)}finally{c(!1)}},[i]);return o.useEffect(()=>{if(s&&t.current)try{d.render("mermaid-chart",s).then(({svg:r})=>{t.current&&(t.current.innerHTML=r)})}catch(r){r instanceof Error&&a(`Mermaid render error: ${r.message}`),console.error(r)}},[s]),e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[e.jsxs("header",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(b,{}),e.jsx("span",{className:"ml-3",children:"Code to Flowchart"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"Turn your code's logic into a visual flowchart with AI."})]}),e.jsxs("div",{className:"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden",children:[e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{htmlFor:"code-input",className:"text-sm font-medium text-slate-400 mb-2",children:"Source Code"}),e.jsx("textarea",{id:"code-input",value:i,onChange:r=>u(r.target.value),className:"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm"}),e.jsx("button",{onClick:f,disabled:m,className:"mt-4 w-full flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md",children:m?e.jsx(p,{}):"Generate Flowchart"})]}),e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("label",{className:"text-sm font-medium text-slate-400 mb-2",children:"Generated Flowchart"}),e.jsxs("div",{className:"flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto flex items-center justify-center",children:[m&&e.jsx(p,{}),l&&e.jsx("p",{className:"text-red-400",children:l}),e.jsx("div",{ref:t,className:"w-full h-full"}),!m&&!s&&!l&&e.jsx("div",{className:"text-slate-500",children:"Flowchart will appear here."})]})]})]})]})};export{Ee as CodeToFlowchart};
10
+ //# sourceMappingURL=CodeToFlowchart-3OF-wAs8.js.map
assets/CodeToFlowchart-3OF-wAs8.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"CodeToFlowchart-3OF-wAs8.js","sources":["../../components/features/CodeToFlowchart.tsx"],"sourcesContent":["\nimport React, { useState, useCallback, useEffect } from 'react';\nimport { generateFlowchart } from '../../services/geminiService';\nimport { MapIcon } from '../icons/FeatureIcons';\nimport { LoadingSpinner } from './shared/LoadingSpinner';\nimport mermaid from 'mermaid';\n\nmermaid.initialize({\n startOnLoad: false,\n theme: 'dark',\n darkMode: true,\n securityLevel: 'loose',\n themeVariables: {\n background: '#1e293b', // slate-800\n primaryColor: '#334155', // slate-700\n primaryTextColor: '#cbd5e1', // slate-300\n lineColor: '#64748b', // slate-500\n textColor: '#cbd5e1',\n },\n});\n\nconst exampleCode = `function checkNumber(num) {\n if (num > 0) {\n return \"Positive\";\n } else if (num < 0) {\n return \"Negative\";\n } else {\n return \"Zero\";\n }\n}`;\n\nexport const CodeToFlowchart: React.FC = () => {\n const [code, setCode] = useState<string>(exampleCode);\n const [mermaidCode, setMermaidCode] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n const chartRef = React.useRef<HTMLDivElement>(null);\n\n const handleGenerate = useCallback(async () => {\n if (!code.trim()) {\n setError('Please enter some code.');\n return;\n }\n setIsLoading(true);\n setError('');\n setMermaidCode('');\n if(chartRef.current) chartRef.current.innerHTML = '';\n\n try {\n const result = await generateFlowchart(code);\n setMermaidCode(result.mermaidCode);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to generate flowchart: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n }, [code]);\n \n useEffect(() => {\n if (mermaidCode && chartRef.current) {\n try {\n mermaid.render('mermaid-chart', mermaidCode).then(({ svg }) => {\n if (chartRef.current) {\n chartRef.current.innerHTML = svg;\n }\n });\n } catch (e) {\n if (e instanceof Error) setError(`Mermaid render error: ${e.message}`);\n console.error(e);\n }\n }\n }, [mermaidCode]);\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <MapIcon />\n <span className=\"ml-3\">Code to Flowchart</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Turn your code's logic into a visual flowchart with AI.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 h-full overflow-hidden\">\n <div className=\"flex flex-col h-full\">\n <label htmlFor=\"code-input\" className=\"text-sm font-medium text-slate-400 mb-2\">Source Code</label>\n <textarea\n id=\"code-input\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n className=\"flex-grow p-4 bg-slate-900 border border-slate-700 rounded-md resize-none font-mono text-sm\"\n />\n <button\n onClick={handleGenerate}\n disabled={isLoading}\n className=\"mt-4 w-full flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md\"\n >\n {isLoading ? <LoadingSpinner /> : 'Generate Flowchart'}\n </button>\n </div>\n <div className=\"flex flex-col h-full\">\n <label className=\"text-sm font-medium text-slate-400 mb-2\">Generated Flowchart</label>\n <div className=\"flex-grow p-4 bg-slate-800/50 border border-slate-700/50 rounded-md overflow-y-auto flex items-center justify-center\">\n {isLoading && <LoadingSpinner />}\n {error && <p className=\"text-red-400\">{error}</p>}\n <div ref={chartRef} className=\"w-full h-full\" />\n {!isLoading && !mermaidCode && !error && <div className=\"text-slate-500\">Flowchart will appear here.</div>}\n </div>\n </div>\n </div>\n </div>\n );\n};\n"],"names":["mermaid","exampleCode","CodeToFlowchart","code","setCode","useState","mermaidCode","setMermaidCode","isLoading","setIsLoading","error","setError","chartRef","React","handleGenerate","useCallback","result","generateFlowchart","err","errorMessage","useEffect","svg","e","jsxs","jsx","MapIcon","LoadingSpinner"],"mappings":"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"}
assets/ColorPaletteGenerator-DaoImThU.js ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ import{r as o,j as t}from"./react-_fH1j4AW.js";import{Z as u}from"./react-colorful-CBg-e-h0.js";import{d as b}from"./geminiService-7wPGMJPL.js";import{c as h}from"./index-Nqm_ElTk.js";import{L as m}from"./LoadingSpinner-C3NwW9hm.js";import"./@braintree-9Zuj5s7N.js";import"./@google-4tyssLU_.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const St=()=>{const[r,p]=o.useState("#06b6d4"),[n,c]=o.useState(["#06b6d4","#0891b2","#0e7490","#155e75","#164e63","#083344"]),[s,i]=o.useState(!1),[a,l]=o.useState(""),d=o.useCallback(async()=>{i(!0),l("");try{const e=await b(r);c(e.colors)}catch(e){const f=e instanceof Error?e.message:"An unknown error occurred.";l(`Failed to generate palette: ${f}`)}finally{i(!1)}},[r]),x=e=>{navigator.clipboard.writeText(e)};return t.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[t.jsxs("header",{className:"mb-6 text-center",children:[t.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center justify-center",children:[t.jsx(h,{}),t.jsx("span",{className:"ml-3",children:"AI Color Palette Generator"})]}),t.jsx("p",{className:"text-slate-400 mt-1",children:"Pick a base color and let Gemini design a beautiful palette for you."})]}),t.jsxs("div",{className:"flex-grow flex flex-col md:flex-row items-center justify-center gap-8",children:[t.jsxs("div",{className:"flex flex-col items-center gap-4",children:[t.jsx(u,{color:r,onChange:p,className:"!w-64 !h-64"}),t.jsx("div",{className:"p-2 bg-slate-800 rounded-md font-mono text-lg",style:{border:`1px solid ${r}`},children:r}),t.jsx("button",{onClick:d,disabled:s,className:"w-full flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed",children:s?t.jsx(m,{}):"Generate Palette"}),a&&t.jsx("p",{className:"text-red-400 text-sm mt-2",children:a})]}),t.jsxs("div",{className:"flex flex-col gap-2 w-full max-w-sm",children:[t.jsx("label",{className:"text-sm font-medium text-slate-400 mb-2",children:"Generated Palette:"}),s?t.jsx("div",{className:"flex items-center justify-center h-48",children:t.jsx(m,{})}):n.map(e=>t.jsxs("div",{className:"group flex items-center justify-between p-4 rounded-md",style:{backgroundColor:e},children:[t.jsx("span",{className:"font-mono font-bold text-black/70 mix-blend-overlay",children:e}),t.jsx("button",{onClick:()=>x(e),className:"opacity-0 group-hover:opacity-100 transition-opacity bg-white/30 hover:bg-white/50 px-3 py-1 rounded text-xs text-black font-semibold",children:"Copy"})]},e))]})]})]})};export{St as ColorPaletteGenerator};
2
+ //# sourceMappingURL=ColorPaletteGenerator-DaoImThU.js.map
assets/ColorPaletteGenerator-DaoImThU.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"ColorPaletteGenerator-DaoImThU.js","sources":["../../components/features/ColorPaletteGenerator.tsx"],"sourcesContent":["\nimport React, { useState, useCallback } from 'react';\nimport { HexColorPicker } from 'react-colorful';\nimport { generateColorPalette } from '../../services/geminiService.ts';\nimport { SparklesIcon } from '../icons/FeatureIcons.tsx';\nimport { LoadingSpinner } from './shared/LoadingSpinner.tsx';\n\nexport const ColorPaletteGenerator: React.FC = () => {\n const [baseColor, setBaseColor] = useState(\"#06b6d4\");\n const [palette, setPalette] = useState<string[]>(['#06b6d4', '#0891b2', '#0e7490', '#155e75', '#164e63', '#083344']);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n\n const handleGenerate = useCallback(async () => {\n setIsLoading(true);\n setError('');\n try {\n const result = await generateColorPalette(baseColor);\n setPalette(result.colors);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to generate palette: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n }, [baseColor]);\n\n const handleCopy = (color: string) => {\n navigator.clipboard.writeText(color);\n };\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6 text-center\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center justify-center\">\n <SparklesIcon />\n <span className=\"ml-3\">AI Color Palette Generator</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Pick a base color and let Gemini design a beautiful palette for you.</p>\n </header>\n <div className=\"flex-grow flex flex-col md:flex-row items-center justify-center gap-8\">\n <div className=\"flex flex-col items-center gap-4\">\n <HexColorPicker color={baseColor} onChange={setBaseColor} className=\"!w-64 !h-64\"/>\n <div className=\"p-2 bg-slate-800 rounded-md font-mono text-lg\" style={{border: `1px solid ${baseColor}`}}>{baseColor}</div>\n <button\n onClick={handleGenerate}\n disabled={isLoading}\n className=\"w-full flex items-center justify-center px-6 py-3 bg-cyan-500 text-slate-900 font-bold rounded-md hover:bg-cyan-400 transition-colors disabled:bg-slate-600 disabled:cursor-not-allowed\"\n >\n {isLoading ? <LoadingSpinner /> : 'Generate Palette'}\n </button>\n {error && <p className=\"text-red-400 text-sm mt-2\">{error}</p>}\n </div>\n <div className=\"flex flex-col gap-2 w-full max-w-sm\">\n <label className=\"text-sm font-medium text-slate-400 mb-2\">Generated Palette:</label>\n {isLoading ? (\n <div className=\"flex items-center justify-center h-48\"><LoadingSpinner /></div>\n ) : (\n palette.map((color) => (\n <div key={color} className=\"group flex items-center justify-between p-4 rounded-md\" style={{ backgroundColor: color }}>\n <span className=\"font-mono font-bold text-black/70 mix-blend-overlay\">{color}</span>\n <button\n onClick={() => handleCopy(color)}\n className=\"opacity-0 group-hover:opacity-100 transition-opacity bg-white/30 hover:bg-white/50 px-3 py-1 rounded text-xs text-black font-semibold\">\n Copy\n </button>\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n );\n};"],"names":["ColorPaletteGenerator","baseColor","setBaseColor","useState","palette","setPalette","isLoading","setIsLoading","error","setError","handleGenerate","useCallback","result","generateColorPalette","err","errorMessage","handleCopy","color","jsxs","jsx","SparklesIcon","HexColorPicker","LoadingSpinner"],"mappings":"48EAOO,MAAMA,GAAkC,IAAM,CACjD,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,SAAS,EAC9C,CAACC,EAASC,CAAU,EAAIF,EAAAA,SAAmB,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,CAAC,EAC7G,CAACG,EAAWC,CAAY,EAAIJ,EAAAA,SAAkB,EAAK,EACnD,CAACK,EAAOC,CAAQ,EAAIN,EAAAA,SAAiB,EAAE,EAEvCO,EAAiBC,EAAAA,YAAY,SAAY,CAC3CJ,EAAa,EAAI,EACjBE,EAAS,EAAE,EACX,GAAI,CACA,MAAMG,EAAS,MAAMC,EAAqBZ,CAAS,EACnDI,EAAWO,EAAO,MAAM,CAC5B,OAASE,EAAK,CACV,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,6BAC1DL,EAAS,+BAA+BM,CAAY,EAAE,CAC1D,QAAA,CACIR,EAAa,EAAK,CACtB,CACJ,EAAG,CAACN,CAAS,CAAC,EAERe,EAAcC,GAAkB,CAClC,UAAU,UAAU,UAAUA,CAAK,CACvC,EAEA,OACIC,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,mBACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,qEACV,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAa,EACdD,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,4BAAA,CAA0B,CAAA,EACrD,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,sEAAA,CAAoE,CAAA,EAC3G,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,wEACX,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACV,SAAA,CAAAC,MAACE,GAAe,MAAOpB,EAAW,SAAUC,EAAc,UAAU,cAAa,EACjFiB,EAAAA,IAAC,MAAA,CAAI,UAAU,gDAAgD,MAAO,CAAC,OAAQ,aAAalB,CAAS,EAAA,EAAM,SAAAA,CAAA,CAAU,EACpHkB,EAAAA,IAAC,SAAA,CACC,QAAST,EACT,SAAUJ,EACV,UAAU,0LAET,SAAAA,EAAYa,EAAAA,IAACG,EAAA,CAAA,CAAe,EAAK,kBAAA,CAAA,EAErCd,GAASW,EAAAA,IAAC,IAAA,CAAE,UAAU,4BAA6B,SAAAX,CAAA,CAAM,CAAA,EAC9D,EACAU,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACX,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,0CAA0C,SAAA,qBAAkB,EAC5Eb,QACK,MAAA,CAAI,UAAU,wCAAwC,SAAAa,MAACG,EAAA,CAAA,CAAe,EAAE,EAE1ElB,EAAQ,IAAKa,UACR,MAAA,CAAgB,UAAU,yDAAyD,MAAO,CAAE,gBAAiBA,CAAA,EAC1G,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,UAAU,sDAAuD,SAAAF,EAAM,EAC7EE,EAAAA,IAAC,SAAA,CACG,QAAS,IAAMH,EAAWC,CAAK,EAC/B,UAAU,wIAAwI,SAAA,MAAA,CAAA,CAEtJ,CAAA,EANMA,CAOV,CACH,CAAA,CAAA,CAET,CAAA,CAAA,CACJ,CAAA,EACJ,CAER"}
assets/CommandPaletteTrigger-CeEG-Bco.js ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ import{j as t}from"./react-_fH1j4AW.js";import{e as r}from"./index-Nqm_ElTk.js";import"./@braintree-9Zuj5s7N.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const at=()=>t.jsxs("div",{className:"flex flex-col items-center justify-center h-full p-8 text-center text-slate-400",children:[t.jsx("div",{className:"text-6xl mb-4","aria-hidden":"true",children:t.jsx(r,{})}),t.jsx("h1",{className:"text-3xl font-bold text-slate-200 mb-2",children:"Command Palette"}),t.jsx("p",{className:"text-lg mb-4 max-w-md",children:"The Command Palette provides quick access to all features and commands."}),t.jsx("div",{className:"bg-slate-800 text-cyan-300 border border-slate-700 rounded-lg px-6 py-4",children:t.jsxs("p",{className:"font-semibold",children:["Press ",t.jsx("kbd",{className:"mx-1 font-sans px-2 py-1.5 text-xs font-semibold text-gray-800 bg-gray-100 border border-gray-200 rounded-lg",children:"Ctrl"})," + ",t.jsx("kbd",{className:"mx-1 font-sans px-2 py-1.5 text-xs font-semibold text-gray-800 bg-gray-100 border border-gray-200 rounded-lg",children:"K"})," to open."]})})]});export{at as CommandPaletteTrigger};
2
+ //# sourceMappingURL=CommandPaletteTrigger-CeEG-Bco.js.map
assets/CommandPaletteTrigger-CeEG-Bco.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"CommandPaletteTrigger-CeEG-Bco.js","sources":["../../components/features/CommandPaletteTrigger.tsx"],"sourcesContent":["\nimport React from 'react';\nimport { CommandLineIcon } from '../icons/FeatureIcons';\n\nexport const CommandPaletteTrigger: React.FC = () => {\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-8 text-center text-slate-400\">\n <div className=\"text-6xl mb-4\" aria-hidden=\"true\">\n <CommandLineIcon />\n </div>\n <h1 className=\"text-3xl font-bold text-slate-200 mb-2\">\n Command Palette\n </h1>\n <p className=\"text-lg mb-4 max-w-md\">\n The Command Palette provides quick access to all features and commands.\n </p>\n <div className=\"bg-slate-800 text-cyan-300 border border-slate-700 rounded-lg px-6 py-4\">\n <p className=\"font-semibold\">Press <kbd className=\"mx-1 font-sans px-2 py-1.5 text-xs font-semibold text-gray-800 bg-gray-100 border border-gray-200 rounded-lg\">Ctrl</kbd> + <kbd className=\"mx-1 font-sans px-2 py-1.5 text-xs font-semibold text-gray-800 bg-gray-100 border border-gray-200 rounded-lg\">K</kbd> to open.</p>\n </div>\n </div>\n );\n};\n"],"names":["CommandPaletteTrigger","jsxs","jsx","CommandLineIcon"],"mappings":"qxEAIO,MAAMA,GAAkC,IAEvCC,EAAAA,KAAC,MAAA,CAAI,UAAU,kFACX,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,gBAAgB,cAAY,OACvC,SAAAA,EAAAA,IAACC,IAAgB,CAAA,CACrB,EACAD,EAAAA,IAAC,KAAA,CAAG,UAAU,yCAAyC,SAAA,kBAEvD,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,wBAAwB,SAAA,0EAErC,QACC,MAAA,CAAI,UAAU,0EACX,SAAAD,EAAAA,KAAC,IAAA,CAAE,UAAU,gBAAgB,SAAA,CAAA,SAAMC,EAAAA,IAAC,MAAA,CAAI,UAAU,+GAA+G,SAAA,OAAI,EAAM,MAAGA,EAAAA,IAAC,MAAA,CAAI,UAAU,+GAA+G,SAAA,IAAC,EAAM,WAAA,CAAA,CAAS,CAAA,CAChU,CAAA,EACJ"}
assets/ContentManager-C8GCJQRb.js ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ import{r as m,j as t}from"./react-_fH1j4AW.js";import{h as c}from"./index-Nqm_ElTk.js";import"./@braintree-9Zuj5s7N.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const s=r=>m.useMemo(()=>{try{const o=window.localStorage.getItem(r);return o?JSON.parse(o):[]}catch{return[]}},[r]),vt=()=>{const[r,o]=m.useState("Snippets"),n=s("devcore_snippets"),a=s("devcore_notes"),l=s("devcore_wiki"),i={Snippets:n,Notes:a,"Wiki Pages":l},p=i[r];return t.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[t.jsxs("header",{className:"mb-6",children:[t.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[t.jsx(c,{}),t.jsx("span",{className:"ml-3",children:"Content Manager"})]}),t.jsx("p",{className:"text-slate-400 mt-1",children:"A unified view of all user-generated content stored in this application."})]}),t.jsx("div",{className:"flex border-b border-slate-700 mb-4",children:Object.keys(i).map(e=>t.jsxs("button",{onClick:()=>o(e),className:`px-4 py-2 text-sm font-medium ${r===e?"border-b-2 border-cyan-400 text-cyan-400":"text-slate-400 hover:text-slate-200"}`,children:[e," (",i[e].length,")"]},e))}),t.jsx("div",{className:"flex-grow overflow-y-auto bg-slate-900/50 p-4 rounded-lg",children:p.length>0?t.jsx("div",{className:"space-y-2",children:p.map(e=>t.jsxs("div",{className:"bg-slate-800 p-3 rounded-md",children:[t.jsx("p",{className:"font-bold text-slate-200",children:e.name||e.title||`Item ${e.id}`}),t.jsx("p",{className:"text-xs text-slate-400 truncate mt-1",children:e.code||e.text||e.content||"No preview available."})]},e.id))}):t.jsx("div",{className:"flex items-center justify-center h-full text-slate-500",children:"No content found for this category."})})]})};export{vt as ContentManager};
2
+ //# sourceMappingURL=ContentManager-C8GCJQRb.js.map
assets/ContentManager-C8GCJQRb.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"ContentManager-C8GCJQRb.js","sources":["../../components/features/ContentManager.tsx"],"sourcesContent":["\nimport React, { useState, useMemo } from 'react';\nimport { ArchiveBoxIcon } from '../icons/InterfaceIcons.tsx';\n\n// A helper to safely get and parse localStorage items\nconst useLocalStorageReader = (key: string) => {\n return useMemo(() => {\n try {\n const item = window.localStorage.getItem(key);\n return item ? JSON.parse(item) : [];\n } catch {\n return [];\n }\n }, [key]); // Re-reads only if key changes, which it won't. This is just for initial load.\n};\n\nexport const ContentManager: React.FC = () => {\n const [activeTab, setActiveTab] = useState('Snippets');\n const snippets = useLocalStorageReader('devcore_snippets');\n const notes = useLocalStorageReader('devcore_notes');\n const wikiPages = useLocalStorageReader('devcore_wiki');\n \n const tabs = {\n 'Snippets': snippets,\n 'Notes': notes,\n 'Wiki Pages': wikiPages\n };\n\n const activeContent = tabs[activeTab as keyof typeof tabs];\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <ArchiveBoxIcon />\n <span className=\"ml-3\">Content Manager</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">A unified view of all user-generated content stored in this application.</p>\n </header>\n <div className=\"flex border-b border-slate-700 mb-4\">\n {Object.keys(tabs).map(tabName => (\n <button\n key={tabName}\n onClick={() => setActiveTab(tabName)}\n className={`px-4 py-2 text-sm font-medium ${activeTab === tabName ? 'border-b-2 border-cyan-400 text-cyan-400' : 'text-slate-400 hover:text-slate-200'}`}\n >\n {tabName} ({tabs[tabName as keyof typeof tabs].length})\n </button>\n ))}\n </div>\n <div className=\"flex-grow overflow-y-auto bg-slate-900/50 p-4 rounded-lg\">\n {activeContent.length > 0 ? (\n <div className=\"space-y-2\">\n {activeContent.map((item: any) => (\n <div key={item.id} className=\"bg-slate-800 p-3 rounded-md\">\n <p className=\"font-bold text-slate-200\">{item.name || item.title || `Item ${item.id}`}</p>\n <p className=\"text-xs text-slate-400 truncate mt-1\">{item.code || item.text || item.content || 'No preview available.'}</p>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"flex items-center justify-center h-full text-slate-500\">\n No content found for this category.\n </div>\n )}\n </div>\n </div>\n );\n};"],"names":["useLocalStorageReader","key","useMemo","item","ContentManager","activeTab","setActiveTab","useState","snippets","notes","wikiPages","tabs","activeContent","jsxs","jsx","ArchiveBoxIcon","tabName"],"mappings":"4xEAKA,MAAMA,EAAyBC,GACpBC,EAAAA,QAAQ,IAAM,CACjB,GAAI,CACA,MAAMC,EAAO,OAAO,aAAa,QAAQF,CAAG,EAC5C,OAAOE,EAAO,KAAK,MAAMA,CAAI,EAAI,CAAA,CACrC,MAAQ,CACJ,MAAO,CAAA,CACX,CACJ,EAAG,CAACF,CAAG,CAAC,EAGCG,GAA2B,IAAM,CAC1C,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,UAAU,EAC/CC,EAAWR,EAAsB,kBAAkB,EACnDS,EAAQT,EAAsB,eAAe,EAC7CU,EAAYV,EAAsB,cAAc,EAEhDW,EAAO,CACT,SAAYH,EACZ,MAASC,EACT,aAAcC,CAAA,EAGZE,EAAgBD,EAAKN,CAA8B,EAEzD,OACIQ,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,OACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACV,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAe,EAChBD,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,iBAAA,CAAe,CAAA,EAC1C,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,0EAAA,CAAwE,CAAA,EAC/G,EACAA,EAAAA,IAAC,OAAI,UAAU,sCACV,gBAAO,KAAKH,CAAI,EAAE,IAAIK,GACnBH,EAAAA,KAAC,SAAA,CAEG,QAAS,IAAMP,EAAaU,CAAO,EACnC,UAAW,iCAAiCX,IAAcW,EAAU,2CAA6C,qCAAqC,GAErJ,SAAA,CAAAA,EAAQ,KAAGL,EAAKK,CAA4B,EAAE,OAAO,GAAA,CAAA,EAJjDA,CAAA,CAMZ,EACL,QACC,MAAA,CAAI,UAAU,2DACT,SAAAJ,EAAc,OAAS,EACrBE,EAAAA,IAAC,MAAA,CAAI,UAAU,YACV,WAAc,IAAKX,GAChBU,EAAAA,KAAC,MAAA,CAAkB,UAAU,8BACzB,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,2BAA4B,SAAAX,EAAK,MAAQA,EAAK,OAAS,QAAQA,EAAK,EAAE,EAAA,CAAG,EACtFW,EAAAA,IAAC,IAAA,CAAE,UAAU,uCAAwC,SAAAX,EAAK,MAAQA,EAAK,MAAQA,EAAK,SAAW,uBAAA,CAAwB,CAAA,CAAA,EAFjHA,EAAK,EAGf,CACH,CAAA,CACL,QAEC,MAAA,CAAI,UAAU,yDAAyD,SAAA,qCAAA,CAExE,CAAA,CAER,CAAA,EACJ,CAER"}
assets/CronJobBuilder-BIeiRqkV.js ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ import{r,j as t}from"./react-_fH1j4AW.js";import{e as g}from"./index-Nqm_ElTk.js";import"./@braintree-9Zuj5s7N.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const m=({label:s,value:a,onChange:i,options:n})=>t.jsxs("div",{children:[t.jsx("label",{className:"block text-sm font-medium text-slate-400",children:s}),t.jsxs("select",{value:a,onChange:e=>i(e.target.value),className:"w-full mt-1 px-3 py-2 rounded-md bg-slate-800 border border-slate-700",children:[t.jsx("option",{value:"*",children:"* (every)"}),n.map(e=>t.jsx("option",{value:e,children:e},e))]})]}),Nt=()=>{const[s,a]=r.useState("0"),[i,n]=r.useState("0"),[e,d]=r.useState("*"),[l,h]=r.useState("*"),[c,u]=r.useState("*"),x=r.useMemo(()=>`${s} ${i} ${e} ${l} ${c}`,[s,i,e,l,c]);return t.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[t.jsxs("header",{className:"mb-6",children:[t.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[t.jsx(g,{}),t.jsx("span",{className:"ml-3",children:"Cron Job Builder"})]}),t.jsx("p",{className:"text-slate-400 mt-1",children:"Visually construct a cron expression for scheduling tasks."})]}),t.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-5 gap-4 mb-6",children:[t.jsx(m,{label:"Minute",value:s,onChange:a,options:Array.from({length:60},(p,o)=>o)}),t.jsx(m,{label:"Hour",value:i,onChange:n,options:Array.from({length:24},(p,o)=>o)}),t.jsx(m,{label:"Day (Month)",value:e,onChange:d,options:Array.from({length:31},(p,o)=>o+1)}),t.jsx(m,{label:"Month",value:l,onChange:h,options:Array.from({length:12},(p,o)=>o+1)}),t.jsx(m,{label:"Day (Week)",value:c,onChange:u,options:Array.from({length:7},(p,o)=>o)})]}),t.jsxs("div",{className:"bg-slate-900 p-4 rounded-lg text-center",children:[t.jsx("p",{className:"text-slate-400 text-sm",children:"Generated Expression"}),t.jsx("p",{className:"font-mono text-cyan-400 text-2xl mt-1",children:x}),t.jsx("button",{onClick:()=>navigator.clipboard.writeText(x),className:"mt-4 px-3 py-1 bg-slate-700 hover:bg-slate-600 rounded-md text-xs",children:"Copy"})]})]})};export{Nt as CronJobBuilder};
2
+ //# sourceMappingURL=CronJobBuilder-BIeiRqkV.js.map
assets/CronJobBuilder-BIeiRqkV.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"CronJobBuilder-BIeiRqkV.js","sources":["../../components/features/CronJobBuilder.tsx"],"sourcesContent":["\nimport React, { useState, useMemo } from 'react';\nimport { CommandLineIcon } from '../icons/FeatureIcons';\n\nconst CronPartSelector: React.FC<{ label: string, value: string, onChange: (value: string) => void, options: (string|number)[] }> = ({ label, value, onChange, options }) => {\n return (\n <div>\n <label className=\"block text-sm font-medium text-slate-400\">{label}</label>\n <select value={value} onChange={e => onChange(e.target.value)} className=\"w-full mt-1 px-3 py-2 rounded-md bg-slate-800 border border-slate-700\">\n <option value=\"*\">* (every)</option>\n {options.map(o => <option key={o} value={o}>{o}</option>)}\n </select>\n </div>\n );\n};\n\nexport const CronJobBuilder: React.FC = () => {\n const [minute, setMinute] = useState('0');\n const [hour, setHour] = useState('0');\n const [dayOfMonth, setDayOfMonth] = useState('*');\n const [month, setMonth] = useState('*');\n const [dayOfWeek, setDayOfWeek] = useState('*');\n \n const cronExpression = useMemo(() => {\n return `${minute} ${hour} ${dayOfMonth} ${month} ${dayOfWeek}`;\n }, [minute, hour, dayOfMonth, month, dayOfWeek]);\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <CommandLineIcon />\n <span className=\"ml-3\">Cron Job Builder</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Visually construct a cron expression for scheduling tasks.</p>\n </header>\n <div className=\"grid grid-cols-2 md:grid-cols-5 gap-4 mb-6\">\n <CronPartSelector label=\"Minute\" value={minute} onChange={setMinute} options={Array.from({length: 60}, (_, i) => i)} />\n <CronPartSelector label=\"Hour\" value={hour} onChange={setHour} options={Array.from({length: 24}, (_, i) => i)} />\n <CronPartSelector label=\"Day (Month)\" value={dayOfMonth} onChange={setDayOfMonth} options={Array.from({length: 31}, (_, i) => i + 1)} />\n <CronPartSelector label=\"Month\" value={month} onChange={setMonth} options={Array.from({length: 12}, (_, i) => i + 1)} />\n <CronPartSelector label=\"Day (Week)\" value={dayOfWeek} onChange={setDayOfWeek} options={Array.from({length: 7}, (_, i) => i)} />\n </div>\n <div className=\"bg-slate-900 p-4 rounded-lg text-center\">\n <p className=\"text-slate-400 text-sm\">Generated Expression</p>\n <p className=\"font-mono text-cyan-400 text-2xl mt-1\">{cronExpression}</p>\n <button onClick={() => navigator.clipboard.writeText(cronExpression)} className=\"mt-4 px-3 py-1 bg-slate-700 hover:bg-slate-600 rounded-md text-xs\">Copy</button>\n </div>\n </div>\n );\n};\n"],"names":["CronPartSelector","label","value","onChange","options","jsx","jsxs","o","CronJobBuilder","minute","setMinute","useState","hour","setHour","dayOfMonth","setDayOfMonth","month","setMonth","dayOfWeek","setDayOfWeek","cronExpression","useMemo","CommandLineIcon","_","i"],"mappings":"uxEAIA,MAAMA,EAA8H,CAAC,CAAE,MAAAC,EAAO,MAAAC,EAAO,SAAAC,EAAU,QAAAC,YAEtJ,MAAA,CACG,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,2CAA4C,SAAAJ,EAAM,EACnEK,EAAAA,KAAC,SAAA,CAAO,MAAAJ,EAAc,SAAU,GAAKC,EAAS,EAAE,OAAO,KAAK,EAAG,UAAU,wEACrE,SAAA,CAAAE,EAAAA,IAAC,SAAA,CAAO,MAAM,IAAI,SAAA,YAAS,EAC1BD,EAAQ,IAAIG,GAAKF,EAAAA,IAAC,UAAe,MAAOE,EAAI,SAAAA,CAAA,EAAdA,CAAgB,CAAS,CAAA,CAAA,CAC5D,CAAA,EACJ,EAIKC,GAA2B,IAAM,CAC1C,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,GAAG,EAClC,CAACC,EAAMC,CAAO,EAAIF,EAAAA,SAAS,GAAG,EAC9B,CAACG,EAAYC,CAAa,EAAIJ,EAAAA,SAAS,GAAG,EAC1C,CAACK,EAAOC,CAAQ,EAAIN,EAAAA,SAAS,GAAG,EAChC,CAACO,EAAWC,CAAY,EAAIR,EAAAA,SAAS,GAAG,EAExCS,EAAiBC,EAAAA,QAAQ,IACpB,GAAGZ,CAAM,IAAIG,CAAI,IAAIE,CAAU,IAAIE,CAAK,IAAIE,CAAS,GAC7D,CAACT,EAAQG,EAAME,EAAYE,EAAOE,CAAS,CAAC,EAE/C,OACIZ,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,OACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sDACV,SAAA,CAAAD,EAAAA,IAACiB,EAAA,EAAgB,EACjBjB,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,kBAAA,CAAgB,CAAA,EAC3C,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAsB,SAAA,4DAAA,CAA0D,CAAA,EACjG,EACAC,EAAAA,KAAC,MAAA,CAAI,UAAU,6CACX,SAAA,CAAAD,MAACL,GAAiB,MAAM,SAAS,MAAOS,EAAQ,SAAUC,EAAW,QAAS,MAAM,KAAK,CAAC,OAAQ,EAAA,EAAK,CAACa,EAAGC,IAAMA,CAAC,EAAG,QACpHxB,EAAA,CAAiB,MAAM,OAAO,MAAOY,EAAM,SAAUC,EAAS,QAAS,MAAM,KAAK,CAAC,OAAQ,EAAA,EAAK,CAACU,EAAGC,IAAMA,CAAC,EAAG,EAC/GnB,MAACL,GAAiB,MAAM,cAAc,MAAOc,EAAY,SAAUC,EAAe,QAAS,MAAM,KAAK,CAAC,OAAQ,IAAK,CAACQ,EAAGC,IAAMA,EAAI,CAAC,EAAG,EACtInB,MAACL,GAAiB,MAAM,QAAQ,MAAOgB,EAAO,SAAUC,EAAU,QAAS,MAAM,KAAK,CAAC,OAAQ,IAAK,CAACM,EAAGC,IAAMA,EAAI,CAAC,EAAG,QACrHxB,EAAA,CAAiB,MAAM,aAAa,MAAOkB,EAAW,SAAUC,EAAc,QAAS,MAAM,KAAK,CAAC,OAAQ,CAAA,EAAI,CAACI,EAAGC,IAAMA,CAAC,CAAA,CAAG,CAAA,EAClI,EACAlB,EAAAA,KAAC,MAAA,CAAI,UAAU,0CACX,SAAA,CAAAD,EAAAA,IAAC,IAAA,CAAE,UAAU,yBAAyB,SAAA,uBAAoB,EAC1DA,EAAAA,IAAC,IAAA,CAAE,UAAU,wCAAyC,SAAAe,EAAe,EACpEf,EAAAA,IAAC,SAAA,CAAO,QAAS,IAAM,UAAU,UAAU,UAAUe,CAAc,EAAG,UAAU,oEAAoE,SAAA,MAAA,CAAI,CAAA,CAAA,CAC7J,CAAA,EACJ,CAER"}
assets/CssGridEditor-C2MVm2J7.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import{r as l,j as e}from"./react-_fH1j4AW.js";import{b as g}from"./index-Nqm_ElTk.js";import"./@braintree-9Zuj5s7N.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const ye=()=>{const[r,p]=l.useState(3),[s,n]=l.useState(4),[o,c]=l.useState(1),[a,d]=l.useState(1),x={display:"grid",gridTemplateColumns:`repeat(${s}, 1fr)`,gridTemplateRows:`repeat(${r}, 1fr)`,gap:`${o}rem ${a}rem`,height:"100%",width:"100%"},i=l.useMemo(()=>`.grid-container {
2
+ display: grid;
3
+ grid-template-columns: repeat(${s}, 1fr);
4
+ grid-template-rows: repeat(${r}, 1fr);
5
+ gap: ${o}rem ${a}rem;
6
+ }`,[r,s,o,a]),u=()=>{navigator.clipboard.writeText(i)};return e.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[e.jsxs("header",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[e.jsx(g,{}),e.jsx("span",{className:"ml-3",children:"CSS Grid Visual Editor"})]}),e.jsx("p",{className:"text-slate-400 mt-1",children:"Configure your grid layout and copy the generated CSS."})]}),e.jsxs("div",{className:"flex-grow grid grid-cols-1 lg:grid-cols-3 gap-6 min-h-0",children:[e.jsxs("div",{className:"lg:col-span-1 flex flex-col gap-4 bg-slate-800/50 p-6 rounded-lg",children:[e.jsx("h3",{className:"text-xl font-bold",children:"Controls"}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"rows",className:"block text-sm font-medium text-slate-400",children:["Rows (",r,")"]}),e.jsx("input",{id:"rows",type:"range",min:"1",max:"12",value:r,onChange:t=>p(Number(t.target.value)),className:"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer"})]}),e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"cols",className:"block text-sm font-medium text-slate-400",children:["Columns (",s,")"]}),e.jsx("input",{id:"cols",type:"range",min:"1",max:"12",value:s,onChange:t=>n(Number(t.target.value)),className:"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer"})]}),e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"rowGap",className:"block text-sm font-medium text-slate-400",children:["Row Gap (",o,"rem)"]}),e.jsx("input",{id:"rowGap",type:"range",min:"0",max:"8",step:"0.25",value:o,onChange:t=>c(Number(t.target.value)),className:"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer"})]}),e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"colGap",className:"block text-sm font-medium text-slate-400",children:["Column Gap (",a,"rem)"]}),e.jsx("input",{id:"colGap",type:"range",min:"0",max:"8",step:"0.25",value:a,onChange:t=>d(Number(t.target.value)),className:"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer"})]})]}),e.jsxs("div",{className:"flex-grow mt-4",children:[e.jsx("label",{className:"block text-sm font-medium text-slate-400 mb-2",children:"Generated CSS"}),e.jsxs("div",{className:"relative h-full",children:[e.jsx("pre",{className:"bg-slate-900 p-4 rounded-md text-cyan-300 text-sm overflow-auto h-full",children:i}),e.jsx("button",{onClick:u,className:"absolute top-2 right-2 px-2 py-1 bg-slate-700 hover:bg-slate-600 rounded-md text-xs",children:"Copy"})]})]})]}),e.jsx("div",{className:"lg:col-span-2 bg-slate-900 rounded-lg p-4",children:e.jsx("div",{style:x,children:Array.from({length:r*s}).map((t,m)=>e.jsx("div",{className:"bg-cyan-500/20 rounded-lg border-2 border-dashed border-cyan-400/50 flex items-center justify-center text-cyan-300",children:e.jsx("span",{className:"text-xs opacity-70",children:m+1})},m))})})]})]})};export{ye as CssGridEditor};
7
+ //# sourceMappingURL=CssGridEditor-C2MVm2J7.js.map
assets/CssGridEditor-C2MVm2J7.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"CssGridEditor-C2MVm2J7.js","sources":["../../components/features/CssGridEditor.tsx"],"sourcesContent":["\nimport React, { useState, useMemo } from 'react';\nimport { CodeBracketSquareIcon } from '../icons/FeatureIcons.tsx';\n\nexport const CssGridEditor: React.FC = () => {\n const [rows, setRows] = useState(3);\n const [cols, setCols] = useState(4);\n const [rowGap, setRowGap] = useState(1); // in rem\n const [colGap, setColGap] = useState(1); // in rem\n\n const gridStyle = {\n display: 'grid',\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gridTemplateRows: `repeat(${rows}, 1fr)`,\n gap: `${rowGap}rem ${colGap}rem`,\n height: '100%',\n width: '100%'\n };\n\n const cssCode = useMemo(() => {\n return `.grid-container {\n display: grid;\n grid-template-columns: repeat(${cols}, 1fr);\n grid-template-rows: repeat(${rows}, 1fr);\n gap: ${rowGap}rem ${colGap}rem;\n}`;\n }, [rows, cols, rowGap, colGap]);\n \n const handleCopy = () => {\n navigator.clipboard.writeText(cssCode);\n };\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold text-slate-100 flex items-center\">\n <CodeBracketSquareIcon />\n <span className=\"ml-3\">CSS Grid Visual Editor</span>\n </h1>\n <p className=\"text-slate-400 mt-1\">Configure your grid layout and copy the generated CSS.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-3 gap-6 min-h-0\">\n <div className=\"lg:col-span-1 flex flex-col gap-4 bg-slate-800/50 p-6 rounded-lg\">\n <h3 className=\"text-xl font-bold\">Controls</h3>\n <div className=\"space-y-4\">\n <div>\n <label htmlFor=\"rows\" className=\"block text-sm font-medium text-slate-400\">Rows ({rows})</label>\n <input id=\"rows\" type=\"range\" min=\"1\" max=\"12\" value={rows} onChange={e => setRows(Number(e.target.value))} className=\"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer\" />\n </div>\n <div>\n <label htmlFor=\"cols\" className=\"block text-sm font-medium text-slate-400\">Columns ({cols})</label>\n <input id=\"cols\" type=\"range\" min=\"1\" max=\"12\" value={cols} onChange={e => setCols(Number(e.target.value))} className=\"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer\" />\n </div>\n <div>\n <label htmlFor=\"rowGap\" className=\"block text-sm font-medium text-slate-400\">Row Gap ({rowGap}rem)</label>\n <input id=\"rowGap\" type=\"range\" min=\"0\" max=\"8\" step=\"0.25\" value={rowGap} onChange={e => setRowGap(Number(e.target.value))} className=\"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer\" />\n </div>\n <div>\n <label htmlFor=\"colGap\" className=\"block text-sm font-medium text-slate-400\">Column Gap ({colGap}rem)</label>\n <input id=\"colGap\" type=\"range\" min=\"0\" max=\"8\" step=\"0.25\" value={colGap} onChange={e => setColGap(Number(e.target.value))} className=\"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer\" />\n </div>\n </div>\n <div className=\"flex-grow mt-4\">\n <label className=\"block text-sm font-medium text-slate-400 mb-2\">Generated CSS</label>\n <div className=\"relative h-full\">\n <pre className=\"bg-slate-900 p-4 rounded-md text-cyan-300 text-sm overflow-auto h-full\">{cssCode}</pre>\n <button onClick={handleCopy} className=\"absolute top-2 right-2 px-2 py-1 bg-slate-700 hover:bg-slate-600 rounded-md text-xs\">Copy</button>\n </div>\n </div>\n </div>\n <div className=\"lg:col-span-2 bg-slate-900 rounded-lg p-4\">\n <div style={gridStyle}>\n {Array.from({ length: rows * cols }).map((_, i) => (\n <div key={i} className=\"bg-cyan-500/20 rounded-lg border-2 border-dashed border-cyan-400/50 flex items-center justify-center text-cyan-300\">\n <span className=\"text-xs opacity-70\">{i + 1}</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n};"],"names":["CssGridEditor","rows","setRows","useState","cols","setCols","rowGap","setRowGap","colGap","setColGap","gridStyle","cssCode","useMemo","handleCopy","jsxs","jsx","CodeBracketSquareIcon","e","_","i"],"mappings":"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"}
assets/CustomCliGenerator-It0h0kmb.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import{r as s,j as t}from"./react-_fH1j4AW.js";import{e as x}from"./index-Nqm_ElTk.js";import"./@braintree-9Zuj5s7N.js";import"./react-dom-B47xkeQg.js";import"./scheduler-DYLXRpC5.js";import"./mermaid-CwNlsT42.js";import"./dayjs-LlU9W_sF.js";import"./d3-transition-593SbTzI.js";import"./d3-timer-DdKHrDhs.js";import"./d3-dispatch-kxCwF96_.js";import"./d3-interpolate-CfLzPKWk.js";import"./d3-color-amxIadob.js";import"./d3-selection-C52G7wmG.js";import"./d3-ease-DRPgKoYJ.js";import"./d3-zoom-Dc8HCWOS.js";import"./dompurify-J5RlrwSC.js";import"./dagre-d3-es-CXvdFQqV.js";import"./lodash-es-CKQobiyk.js";import"./d3-shape-C6amFesj.js";import"./d3-path-CimkQT29.js";import"./d3-fetch-BOsq7VnW.js";import"./khroma-DUX6PT6k.js";import"./uuid-DhYbOkY1.js";import"./d3-scale-BchcX-lF.js";import"./internmap-BkD7Hj8s.js";import"./d3-array-DGRYoJHh.js";import"./d3-format-CzD4bSOQ.js";import"./d3-time-format-CUNN4Ell.js";import"./d3-time-6cSPyVSY.js";import"./d3-axis-DSWTncID.js";import"./elkjs-BS_sNva5.js";import"./cytoscape-Copgxxlq.js";import"./cytoscape-cose-bilkent-DNVwk4oY.js";import"./cose-base-HlRMd3jM.js";import"./layout-base-BVPXtQQC.js";import"./d3-sankey-DgqkLiUE.js";import"./d3-scale-chromatic-B-NsZVaP.js";import"./ts-dedent-DrFu-skq.js";import"./stylis-D5iaQeiq.js";import"./mdast-util-from-markdown-CLAsVoWb.js";import"./micromark-CTBPIv-_.js";import"./micromark-util-combine-extensions-Bka6Sc1c.js";import"./micromark-util-chunked-DrRIdSP-.js";import"./micromark-factory-space-x2vfxbz5.js";import"./micromark-util-character-Bcm1tP9o.js";import"./micromark-core-commonmark-AH8VCgT7.js";import"./micromark-util-classify-character-Cq7Fg3xE.js";import"./micromark-util-resolve-all-PQCKh0dx.js";import"./decode-named-character-reference-C3-224fz.js";import"./micromark-util-subtokenize-QwsxNXk2.js";import"./micromark-factory-destination-CypD_wgM.js";import"./micromark-factory-label-CRHH4ZHP.js";import"./micromark-factory-title-B7kCBvC9.js";import"./micromark-factory-whitespace-B322EA6O.js";import"./micromark-util-normalize-identifier-C9ANKk3v.js";import"./micromark-util-html-tag-name-DbKNfynz.js";import"./micromark-util-decode-numeric-character-reference-DRnCnno4.js";import"./micromark-util-decode-string-DJl8Y_PO.js";import"./unist-util-stringify-position-Ch_qCilz.js";import"./mdast-util-to-string-C_aolqmU.js";const jt=()=>{const[m,l]=s.useState("my-cli"),[i,n]=s.useState("A cool new command-line tool."),[o,p]=s.useState(!0),[r,c]=s.useState("config"),a=s.useMemo(()=>`#!/usr/bin/env node
2
+ const { program } = require('commander');
3
+
4
+ program
5
+ .version('0.0.1')
6
+ .description('${i}');
7
+
8
+ program
9
+ .command('run <task>')
10
+ .description('Run a specific task')
11
+ ${o?`.option('-c, --${r} <path>', 'Path to config file')`:""}
12
+ .action((task, options) => {
13
+ console.log(\`Running task: \${task}\`);
14
+ ${o?`if (options.${r}) console.log('Using config: ' + options.${r});`:""}
15
+ });
16
+
17
+ program.parse(process.argv);
18
+ `,[i,o,r]),d=()=>{navigator.clipboard.writeText(a)};return t.jsxs("div",{className:"h-full flex flex-col p-4 sm:p-6 lg:p-8",children:[t.jsxs("header",{className:"mb-6",children:[t.jsxs("h1",{className:"text-3xl font-bold text-slate-100 flex items-center",children:[t.jsx(x,{}),t.jsx("span",{className:"ml-3",children:"Custom CLI Generator"})]}),t.jsx("p",{className:"text-slate-400 mt-1",children:"Generate boilerplate for a Node.js CLI tool with Commander.js."})]}),t.jsxs("div",{className:"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 min-h-0",children:[t.jsxs("div",{className:"flex flex-col gap-4 bg-slate-800/50 p-6 rounded-lg",children:[t.jsx("h3",{className:"text-xl font-bold",children:"Configuration"}),t.jsxs("div",{children:[t.jsx("label",{htmlFor:"commandName",className:"block text-sm font-medium text-slate-400",children:"Command Name"}),t.jsx("input",{type:"text",id:"commandName",value:m,onChange:e=>l(e.target.value),className:"w-full mt-1 px-3 py-2 rounded-md bg-slate-800 border border-slate-700"})]}),t.jsxs("div",{children:[t.jsx("label",{htmlFor:"description",className:"block text-sm font-medium text-slate-400",children:"Description"}),t.jsx("input",{type:"text",id:"description",value:i,onChange:e=>n(e.target.value),className:"w-full mt-1 px-3 py-2 rounded-md bg-slate-800 border border-slate-700"})]}),t.jsxs("div",{className:"flex items-center",children:[t.jsx("input",{type:"checkbox",id:"hasOption",checked:o,onChange:e=>p(e.target.checked),className:"h-4 w-4 rounded border-gray-300 text-cyan-600 focus:ring-cyan-500"}),t.jsx("label",{htmlFor:"hasOption",className:"ml-2 block text-sm text-slate-300",children:"Include an option flag?"})]}),o&&t.jsxs("div",{children:[t.jsx("label",{htmlFor:"optionName",className:"block text-sm font-medium text-slate-400",children:"Option Name (e.g., --<name>)"}),t.jsx("input",{type:"text",id:"optionName",value:r,onChange:e=>c(e.target.value),className:"w-full mt-1 px-3 py-2 rounded-md bg-slate-800 border border-slate-700"})]})]}),t.jsxs("div",{className:"flex flex-col",children:[t.jsxs("label",{className:"text-sm font-medium text-slate-400 mb-2",children:["Generated Code (",m,".js)"]}),t.jsxs("div",{className:"relative flex-grow",children:[t.jsx("pre",{className:"w-full h-full bg-slate-900 p-4 rounded-md text-cyan-300 text-sm overflow-auto font-mono",children:a}),t.jsx("button",{onClick:d,className:"absolute top-2 right-2 px-2 py-1 bg-slate-700 hover:bg-slate-600 rounded-md text-xs",children:"Copy"})]})]})]})]})};export{jt as CustomCliGenerator};
19
+ //# sourceMappingURL=CustomCliGenerator-It0h0kmb.js.map