@yamlresume/playground 0.15.0 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
20
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
- IN THE SOFTWARE.
21
+ IN THE SOFTWARE.
package/README.md CHANGED
@@ -9,6 +9,11 @@ The official playground is at https://yamlresume.dev/playground.
9
9
  ## Features
10
10
 
11
11
  - 📝 **Live YAML Editor**: Monaco-based editor with syntax highlighting for AML.
12
+ - ✨ **YAML Language Support**: Schema-driven completion, validation, and hover
13
+ documentation powered by
14
+ [`monaco-yaml`](https://github.com/remcohaszing/monaco-yaml) running the YAML
15
+ language server in a Web Worker against the
16
+ [YAMLResume JSON schema](https://yamlresume.dev/docs/compiler/schema/json).
12
17
  - 👁️ **Real-time Preview**: Instant preview of your resume in HTML, Markdown, or
13
18
  LaTeX.
14
19
  - 📱 **Responsive Design**: Split-pane layout on desktop, tabbed interface on
@@ -168,6 +173,50 @@ Gets the basename from a filepath.
168
173
 
169
174
  Gets the file extension for a given rendering engine.
170
175
 
176
+ ## Local Development
177
+
178
+ A Vite-based web harness lives in [`web/`](./web). It mounts the
179
+ `<Playground />` component directly from the TypeScript sources (no build step
180
+ required) with Tailwind CSS configured.
181
+
182
+ ```bash
183
+ pnpm playground web:dev
184
+ # or
185
+ pnpm -C packages/playground/web dev
186
+ ```
187
+
188
+ Then open http://localhost:5173.
189
+
190
+ ### YAML language support
191
+
192
+ The resume editor provides completion, validation, and hover documentation via
193
+ `monaco-yaml`, which runs the YAML language server in a Web Worker bundled from
194
+ `src/workers/`. The worker wiring uses the standard
195
+ `new Worker(new URL(...), import.meta.url)` pattern, which Vite and webpack
196
+ understand natively when building from source.
197
+
198
+ If you consume the pre-built `dist` bundle in an app whose bundler cannot emit
199
+ workers from it, install your own `globalThis.MonacoEnvironment.getWorker`
200
+ **before** importing this package (a host-provided `getWorker` takes
201
+ precedence), pointing the `yaml` label at `monaco-yaml/yaml.worker` and
202
+ `editorWorkerService` at Monaco's editor worker:
203
+
204
+ ```js
205
+ import EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'
206
+ import YamlWorker from 'monaco-yaml/yaml.worker?worker'
207
+
208
+ globalThis.MonacoEnvironment = {
209
+ getWorker(moduleId, label) {
210
+ if (label === 'yaml') return new YamlWorker()
211
+ return new EditorWorker()
212
+ },
213
+ }
214
+ ```
215
+
216
+ Note that `monaco-yaml` currently requires `monaco-editor` <= 0.54.x (support
217
+ for the 0.55 worker API is pending upstream, see
218
+ [remcohaszing/monaco-yaml#282](https://github.com/remcohaszing/monaco-yaml/pull/282)).
219
+
171
220
  ## License
172
221
 
173
222
  MIT © [PPResume](https://ppresume.com)
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, PropsWithChildren } from 'react';
3
- import { OnMount } from '@monaco-editor/react';
3
+ import { OnMount, Monaco } from '@monaco-editor/react';
4
4
  import { Resume, LayoutEngine } from '@yamlresume/core';
5
5
 
6
6
  /**
@@ -158,7 +158,7 @@ interface PlaygroundProps {
158
158
  * @param props - The component props.
159
159
  * @returns The rendered Playground component.
160
160
  */
161
- declare function Playground({ yaml: yamlStr, onChange, filename, messages, }: PlaygroundProps): react.JSX.Element;
161
+ declare function Playground({ yaml, onChange, filename, messages, }: PlaygroundProps): react.JSX.Element;
162
162
 
163
163
  /**
164
164
  * Props for the PlaygroundDesktop component.
@@ -586,7 +586,6 @@ interface UseResumeRendererProps {
586
586
  /**
587
587
  * A React hook for rendering a resume using a specified layout.
588
588
  *
589
- * @description
590
589
  * This hook encapsulates the logic for:
591
590
  * - Selecting the appropriate layout from the resume's layouts array
592
591
  * - Determining the rendering engine (html, markdown, or latex)
@@ -639,7 +638,6 @@ interface UseResumeStateProps {
639
638
  /**
640
639
  * A React hook for managing resume state derived from YAML content.
641
640
  *
642
- * @description
643
641
  * This hook encapsulates the logic for:
644
642
  * - Parsing YAML into a `Resume` object with memoization
645
643
  * - Tracking the active layout index with bounds checking
@@ -673,6 +671,42 @@ declare function useResumeState({ yaml, onChange, }: UseResumeStateProps): {
673
671
  resume: Resume;
674
672
  };
675
673
 
674
+ /**
675
+ * MIT License
676
+ *
677
+ * Copyright (c) 2023–Present PPResume (https://ppresume.com)
678
+ *
679
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
680
+ * of this software and associated documentation files (the "Software"), to
681
+ * deal in the Software without restriction, including without limitation the
682
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
683
+ * sell copies of the Software, and to permit persons to whom the Software is
684
+ * furnished to do so, subject to the following conditions:
685
+ *
686
+ * The above copyright notice and this permission notice shall be included in
687
+ * all copies or substantial portions of the Software.
688
+ *
689
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
690
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
691
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
692
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
693
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
694
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
695
+ * IN THE SOFTWARE.
696
+ */
697
+
698
+ /**
699
+ * Configures YAML language support (completion, validation and hover
700
+ * documentation) for the resume YAML editor, powered by `monaco-yaml` running
701
+ * the YAML language server in a Web Worker against the YAMLResume JSON schema.
702
+ *
703
+ * This function is idempotent: calling it multiple times configures the
704
+ * language support only once.
705
+ *
706
+ * @param monaco - The Monaco instance used by the editor.
707
+ */
708
+ declare function configureYamlSupport(monaco: Monaco): void;
709
+
676
710
  /**
677
711
  * MIT License
678
712
  *
@@ -741,4 +775,4 @@ declare const printResume: (resume: Resume | null, layoutIndex: number) => void;
741
775
  */
742
776
  declare const openResumeInNewTab: (resume: Resume | null, layoutIndex: number) => void;
743
777
 
744
- export { CodeViewer, type CodeViewerProps, DEFAULT_PLAYGROUND_MESSAGES, DocxViewer, type DocxViewerProps, EDITOR_BG_COLOR, EDITOR_FONT_SIZE, Editor, EditorPanel, type EditorPanelProps, type EditorProps, HtmlViewer, type HtmlViewerProps, ICON_SIZES, ICON_STROKES, Panel, PanelContent, PanelSeparator, PanelToolbar, Playground, PlaygroundDesktop, type PlaygroundDesktopProps, type PlaygroundMessageOverrides, type PlaygroundMessages, PlaygroundMobile, type PlaygroundMobileProps, type PlaygroundProps, type PlaygroundTooltipMessages, PreviewPanel, type PreviewPanelProps, ResumeEditor, type ResumeEditorProps, ResumeViewer, type ResumeViewerProps, ToolbarButton, ToolbarCopyButton, ToolbarSeparator, type UseResumeRendererProps, type UseResumeStateProps, copyResumeToClipboard, downloadResume, getBasename, getExtension, openResumeInNewTab, printResume, useResumeRenderer, useResumeState };
778
+ export { CodeViewer, type CodeViewerProps, DEFAULT_PLAYGROUND_MESSAGES, DocxViewer, type DocxViewerProps, EDITOR_BG_COLOR, EDITOR_FONT_SIZE, Editor, EditorPanel, type EditorPanelProps, type EditorProps, HtmlViewer, type HtmlViewerProps, ICON_SIZES, ICON_STROKES, Panel, PanelContent, PanelSeparator, PanelToolbar, Playground, PlaygroundDesktop, type PlaygroundDesktopProps, type PlaygroundMessageOverrides, type PlaygroundMessages, PlaygroundMobile, type PlaygroundMobileProps, type PlaygroundProps, type PlaygroundTooltipMessages, PreviewPanel, type PreviewPanelProps, ResumeEditor, type ResumeEditorProps, ResumeViewer, type ResumeViewerProps, ToolbarButton, type ToolbarButtonProps, ToolbarCopyButton, type ToolbarCopyButtonProps, ToolbarSeparator, type UseResumeRendererProps, type UseResumeStateProps, configureYamlSupport, copyResumeToClipboard, downloadResume, getBasename, getExtension, openResumeInNewTab, printResume, useResumeRenderer, useResumeState };
package/dist/index.js CHANGED
@@ -1,278 +1,3 @@
1
- import Te from'@monaco-editor/react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {IconArrowBackUp,IconArrowForwardUp,IconEraser,IconPrinter,IconExternalLink,IconDownload,IconCheck,IconCopy,IconFileCode,IconEdit,IconEye,IconFileText,IconTex,IconMarkdown,IconHtml}from'@tabler/icons-react';import {useRef,useCallback,useState,useEffect,useMemo}from'react';import fe from'clsx';import {getResumeRenderer}from'@yamlresume/core';import {parse}from'yaml';import {Group,Panel,Separator}from'react-resizable-panels';import {renderAsync}from'docx-preview';var p={xs:12,sm:16,md:20,lg:24,xl:28},c={xs:1,sm:1.25,md:1.5,lg:1.75,xl:2},w="#1e1e1e",se=14;function Ce(e){let t={displayName:"LaTeX",name:"latex",mimeTypes:["text/latex","text/tex"],fileExtensions:["tex","sty","cls"],tokenPostfix:".latex",defaultToken:"",keywords:["addcontentsline","addtocontents","addtocounter","address","addtolength","addvspace","alph","appendix","arabic","author","backslash","baselineskip","baselinestretch","bf","bibitem","bigskipamount","bigskip","boldmath","boldsymbol","cal","caption","cdots","centering","chapter","circle","cite","cleardoublepage","clearpage","cline","closing","color","copyright","dashbox","date","ddots","documentclass","dotfill","em","emph","ensuremath","epigraph","euro","fbox","flushbottom","fnsymbol","footnote","footnotemark","footnotesize","footnotetext","frac","frame","framebox","frenchspacing","hfill","hline","href","hrulefill","hspace","huge","Huge","hyphenation","include","includegraphics","includeonly","indent","input","it","item","kill","label","large","Large","LARGE","LaTeX","LaTeXe","ldots","left","lefteqn","line","linebreak","linethickness","linewidth","listoffigures","listoftables","location","makebox","maketitle","markboth","mathcal","mathop","mbox","medskip","multicolumn","multiput","newcommand","newcolumntype","newcounter","newenvironment","newfont","newlength","newline","newpage","newsavebox","newtheorem","nocite","noindent","nolinebreak","nonfrenchspacing","normalsize","nopagebreak","not","onecolumn","opening","oval","overbrace","overline","pagebreak","pagenumbering","pageref","pagestyle","par","paragraph","parbox","parindent","parskip","part","protect","providecommand","put","raggedbottom","raggedleft","raggedright","raisebox","ref","renewcommand","right","rm","roman","rule","savebox","sbox","sc","scriptsize","section","setcounter","setlength","settowidth","sf","shortstack","signature","sl","slash","small","smallskip","sout","space","sqrt","stackrel","stepcounter","subparagraph","subsection","subsubsection","tableofcontents","telephone","TeX","textbf","textcolor","textit","textmd","textnormal","textrm","textsc","textsf","textsl","texttt","textup","textwidth","textheight","thanks","thispagestyle","tiny","title","today","tt","twocolumn","typeout","typein","uline","underbrace","underline","unitlength","usebox","usecounter","uwave","value","vbox","vcenter","vdots","vector","verb","vfill","vline","vphantom","vspace","RequirePackage","NeedsTeXFormat","usepackage","input","include","documentclass","documentstyle","def","edef","defcommand","if","ifdim","ifnum","ifx","fi","else","begingroup","endgroup","definecolor","textcolor","color","eifstrequal","eeifstrequal"],tokenizer:{root:[[/(\\begin)(\s*)(\{)([\w\-*@]+)(\})/,["keyword.predefined","white","@brackets",{token:"tag.env-$4",bracket:"@open"},"@brackets"]],[/(\\end)(\s*)(\{)([\w\-*@]+)(\})/,["keyword.predefined","white","@brackets",{token:"tag.env-$4",bracket:"@close"},"@brackets"]],[/\\\[a-zA-Z@]/,"keyword"],[/\\\\[^a-zA-Z@]/,"keyword"],[/\\@[a-zA-Z@]+/,"keyword.at"],[/\\([a-zA-Z@]+)/,{cases:{"$1@keywords":"keyword.predefined","@default":"keyword"}}],{include:"@whitespace"},[/[{}()[\]]/,"@brackets"],[/#+\d/,"number.arg"],[/\\-?(?:\d+(?:\.\d+)?|\.\d+)\s*(?:em|ex|pt|pc|sp|cm|mm|in)/,"number.len"]],whitespace:[[/[ \t\r\n]+/,"white"],["%.*$","comment"]]}},o={comments:{lineComment:"%"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"$",close:"$"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"$",close:"$"}]};e.languages.getLanguages().some(r=>r.id==="latex")||(e.languages.register({id:"latex"}),e.languages.setMonarchTokensProvider("latex",t),e.languages.setLanguageConfiguration("latex",o));}function C({value:e,onChange:t,language:o,readOnly:r=false,lineNumbers:n=true,minimap:a=true,onMount:i}){return jsx(Te,{height:"100%",language:o,value:e,onChange:t,theme:"vs-dark",onMount:i,beforeMount:Ce,options:{readOnly:r,domReadOnly:r,lineNumbers:n?"on":"off",minimap:{enabled:a},fontSize:se,lineNumbersMinChars:4,padding:{top:8},automaticLayout:true,roundedSelection:false,smoothScrolling:true,scrollBeyondLastLine:false}})}var R=(e="resume.yaml",t=false)=>{let o=e.split(/[/\\]/).pop()||e;return t?o.replace(/\.(ya?ml|json)$/,""):o},E=e=>{switch(e){case "html":return ".html";case "latex":return ".tex";case "markdown":return ".md";case "docx":return ".docx";default:return ""}},W=async(e,t)=>{try{let o=e?.layouts;if(!e||!o[t]){console.warn("No resume or layout found for download");return}let n=getResumeRenderer(e,t).render(),a=o[t],i=E(a.engine),s=`resume.${t}${i}`,g=n instanceof Promise?await n:n,m=g instanceof Uint8Array?new Blob([g.buffer],{type:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"}):new Blob([g],{type:"text/plain"}),l=URL.createObjectURL(m),u=document.createElement("a");u.href=l,u.download=s,document.body.appendChild(u),u.click(),document.body.removeChild(u),URL.revokeObjectURL(l);}catch(o){console.error("Failed to download resume:",o);}},z=(e,t)=>{try{let o=e?.layouts;if(!e||!o[t])return console.warn("No resume or layout found for copy"),Promise.resolve();let n=getResumeRenderer(e,t).render();return typeof n!="string"?(console.warn("Copy to clipboard is not supported for binary layouts"),Promise.resolve()):navigator.clipboard.writeText(n)}catch(o){return console.error("Failed to copy resume:",o),Promise.resolve()}},V=(e,t)=>{try{let o=e?.layouts;if(!e||!o[t]){console.warn("No resume or layout found for print");return}if(o[t].engine!=="html"){console.warn("Printing is only supported for HTML layouts");return}let a=getResumeRenderer(e,t).render();if(typeof a!="string"){console.warn("Printing is only supported for string-based layouts");return}let i=document.createElement("iframe");i.style.position="absolute",i.style.width="0px",i.style.height="0px",i.style.border="none",document.body.appendChild(i);let s=i.contentWindow?.document;s&&(s.open(),s.write(a),s.close(),i.contentWindow?.focus(),i.contentWindow?.print()),setTimeout(()=>{document.body.removeChild(i);},1e3);}catch(o){console.error("Failed to print resume:",o);}},U=(e,t)=>{try{let o=e?.layouts;if(!e||!o[t]){console.warn("No resume or layout found for new tab");return}if(o[t].engine!=="html"){console.warn("Open in new tab is only supported for HTML layouts");return}let a=getResumeRenderer(e,t).render();if(typeof a!="string"){console.warn("Open in new tab is only supported for string-based layouts");return}let i=new Blob([a],{type:"text/html"}),s=URL.createObjectURL(i);window.open(s,"_blank");}catch(o){console.error("Failed to open resume in new tab:",o);}};function pe({filename:e="resume.yaml"}){let t=R(e);return jsxs("div",{className:fe("flex items-center gap-2","h-full px-4","border-r border-neutral-600"),style:{backgroundColor:w},children:[jsx(IconFileCode,{size:p.sm,stroke:c.sm}),jsx("span",{children:t})]})}function X({value:e,onChange:t,onMount:o}){return jsx(C,{language:"yaml",value:e,onChange:t,onMount:o})}function Z({value:e,onChange:t,filename:o,tooltips:r}){let n=useRef(null),a=l=>{n.current=l;},i=useCallback(()=>{n.current?.trigger("source","undo",null);},[]),s=useCallback(()=>{n.current?.trigger("source","redo",null);},[]),g=useCallback(()=>{let l=n.current?.getValue();return l?navigator.clipboard.writeText(l):Promise.resolve()},[]),m=useCallback(()=>{n.current&&window.confirm("Are you sure you want to clear the editor?")&&n.current.setValue("");},[]);return jsxs(x,{children:[jsxs(v,{children:[jsx("div",{className:"flex h-full",children:jsx(pe,{filename:o})}),jsx("div",{className:"flex-1"}),jsxs("div",{className:"flex items-center gap-0.5 pr-2",children:[jsx(N,{onClick:g,title:r.copy}),jsx(P,{}),jsx(h,{onClick:i,title:r.undo,children:jsx(IconArrowBackUp,{size:p.sm,stroke:c.sm})}),jsx(h,{onClick:s,title:r.redo,children:jsx(IconArrowForwardUp,{size:p.sm,stroke:c.sm})}),jsx(P,{}),jsx(h,{onClick:m,title:r.clear,children:jsx(IconEraser,{size:p.sm,stroke:c.sm})})]})]}),jsx(k,{children:jsx(X,{value:e,onChange:t,onMount:a})})]})}function J({resume:e,layoutIndex:t}){let[o,r]=useState(""),[n,a]=useState(null),[i,s]=useState("html"),[g,m]=useState(null);return useEffect(()=>{if(e)try{let l=e.layouts?.[t];if(!l){m(`Layout at index ${t} not found.`);return}if(typeof l.engine!="string"){m("Layout is incomplete - missing engine property.");return}let u=l.engine;s(u);let T=getResumeRenderer(e,t).render();typeof T=="string"?(r(T),a(null),m(null)):T instanceof Uint8Array?(r(""),a(T),m(null)):T.then(b=>{typeof b=="string"?(r(b),a(null)):b instanceof Uint8Array&&(r(""),a(b)),m(null);}).catch(b=>{m(`Render Error: ${b instanceof Error?b.message:String(b)}`);});}catch(l){m(`Render Error: ${l instanceof Error?l.message:String(l)}`);}},[e,t]),{renderedContent:o,binaryContent:n,engine:i,error:g}}var L=`# MIT License
2
- #
3
- # Copyright (c) 2023\u2013Present PPResume (https://ppresume.com)
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to
7
- # deal in the Software without restriction, including without limitation the
8
- # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9
- # sell copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
- # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
- # IN THE SOFTWARE.
22
-
23
- # yaml-language-server: $schema=https://yamlresume.dev/schema.json
24
- #
25
- # YAMLResume provides a builtin schema to validate resumes and help avoid lots
26
- # of low level mistakes.
27
- #
28
- # You need to install https://github.com/redhat-developer/yaml-language-server
29
- # in order to get the best editing experience in your choice of editor/IDE.
30
- #
31
- # ref:
32
- # - https://yamlresume.dev/docs/compiler/schema
33
- # - https://yamlresume.dev/docs/compiler/schema/json
34
-
35
- ---
36
- content:
37
- basics:
38
- name: Andy Dufresne
39
- headline: Headed for the Pacific
40
- phone: "(213) 555-9876"
41
- email: hi@ppresume.com
42
- url: https://ppresume.com/gallery
43
- # All summary fields supports a limited rich text capabilities in markdown
44
- # syntax:
45
- #
46
- # - bold, (e.g, **bold**)
47
- # - italic, (e.g, *italic*)
48
- # - ordered list, unordored list and nested sub list
49
- # - links (e.g. [link](https://ppresume.com))
50
- summary: |
51
- - Computer Science major with strong foundation in data structures, algorithms, and software development
52
- - Pixel perfect full stack web developer, specialised in creating high-quality, visually appealing websites
53
- - Experiened in databases (SQL, NoSQL), familiar with server-side technologies (Node.js, Express, etc.)
54
- - Team player, with detail-oriented mindset and a keen eye for design and user experiences
55
- location:
56
- address: 123 Main Street
57
- city: Sacramento
58
- region: California
59
- country: United States
60
- postalCode: "95814"
61
- profiles:
62
- - network: Line
63
- url: https://line.com/PPResumeX
64
- username: PPResumeX
65
- - network: Twitter
66
- url: https://twitter.com/PPResumeX
67
- username: PPResumeX
68
- education:
69
- - institution: University of Southern California
70
- url: https://www.cs.usc.edu/
71
- # Valid degree options:
72
- #
73
- # - 'Middle School'
74
- # - 'High School'
75
- # - 'Diploma'
76
- # - 'Associate'
77
- # - 'Bachelor'
78
- # - 'Master'
79
- # - 'Doctor'
80
- degree: Bachelor
81
- area: Computer Engineering and Computer Science
82
- score: "3.8"
83
- # Should be a valid date string that can be parsed by \\\`new Date(dateStr)\\\`
84
- # in JavaScript, eg. '2020-01', '2020-02-03', 'Jul 1, 2023' etc.
85
- #
86
- # The date part would be removed in the final output as most of the time
87
- # people won't really care about the exact date for your working
88
- # experience or education background, etc.
89
- # ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
90
- startDate: Sep 1, 2016
91
- # Leave endDate blank to indicate "Present"
92
- endDate: Jul 1, 2020
93
- courses:
94
- - Discrete Methods in Computer Science
95
- - Programming Language Concepts
96
- - Data Structures and Object-Oriented Design
97
- - Operating Systems
98
- - Computer Architecture
99
- - Database Systems
100
- - Computer Networking
101
- - Introduction to the Theory of Computing
102
- summary: |
103
- - Developed proficiency in programming languages such as Java, C++, and Python
104
- - Gained hands-on experience in software development through various projects and assignments
105
- - Strong communication and teamwork skills acquired through group projects and presentations
106
- work:
107
- - name: PPResume
108
- url: https://ppresume.com
109
- startDate: Dec 1, 2022
110
- endDate:
111
- position: Senior Software Engineer
112
- summary: |
113
- - Developed and implemented efficient and scalable code, ensuring high-quality and maintainable web applications
114
- - Collaborated with cross-functional teams to gather project requirements and translate them into technical solutions
115
- - Conducted thorough testing and debugging to identify and resolve any issues or bugs in the software
116
- - Actively participated in code reviews, providing valuable feedback to improve code quality and adherence to best practices
117
- - Mentored and guided junior developers, fostering a collaborative and growth-oriented team environment
118
- keywords:
119
- - Scalability
120
- - Growth
121
- - Quality
122
- - Mentorship
123
- - name: PPResume
124
- url: https://ppresume.com
125
- startDate: Sep 1, 2020
126
- endDate: Dec 1, 2022
127
- position: Software Engineer
128
- summary: |
129
- - Created reusable React components to ensure code efficiency and maintainability
130
- - Integrated with RESTful APIs to fetch and display dynamic data on the frontend
131
- - Implemented client-side routing using React Router for smooth navigation between pages
132
- - Actively participated in Agile development methodologies, attending daily stand-up meetings and sprint planning sessions
133
- keywords:
134
- - RESTful
135
- - React
136
- - Agile
137
- languages:
138
- # Valid language fluency options:
139
- #
140
- # - 'Elementary Proficiency'
141
- # - 'Limited Working Proficiency'
142
- # - 'Minimum Professional Proficiency'
143
- # - 'Full Professional Proficiency'
144
- # - 'Native or Bilingual Proficiency'
145
- - language: English
146
- fluency: Native or Bilingual Proficiency
147
- keywords:
148
- - TOEFL 110
149
- - IELTS 7.5
150
- - language: Chinese
151
- fluency: Elementary Proficiency
152
- keywords: []
153
- skills:
154
- # Valid level options:
155
- #
156
- # - 'Novice'
157
- # - 'Beginner'
158
- # - 'Intermediate'
159
- # - 'Advanced'
160
- # - 'Expert'
161
- # - 'Master'
162
- - name: Web Development
163
- level: Expert
164
- keywords:
165
- - Python
166
- - Ruby
167
- - CSS
168
- - React
169
- - JavaScript
170
- - name: DevOps
171
- level: Intermediate
172
- keywords:
173
- - Python
174
- - Kubernetes
175
- - Docker
176
- - Shell
177
- - Ansible
178
- - name: Design
179
- level: Intermediate
180
- keywords:
181
- - Sketch
182
- - Figma
183
- - Photoshop
184
- awards:
185
- - title: Dean's List
186
- awarder: University of Southern California
187
- date: Oct 2016
188
- summary: |
189
- Awarded to students who achieve a high academic standing by maintaining a specified grade point average (GPA) during a semester.
190
- certificates:
191
- - name: AWS Certified Developer - Associate
192
- url: https://aws.amazon.com/certification/
193
- issuer: AWS
194
- date: Mar 2021
195
- publications:
196
- - publisher: ACM Transactions on Interactive Intelligent Systems
197
- url: https://dl.acm.org/journal/tiis
198
- name: Enhancing Human-Computer Interaction through Augmented Reality
199
- releaseDate: Dec 2017
200
- summary: |
201
- - Explores the potential of augmented reality (AR) in improving interaction between humans and computers
202
- - Highlights benefits of AR in various areas such as gaming, education, healthcare, and design
203
- - Discusses challenges and future directions of AR technology in enhancing user experience
204
- references:
205
- - name: Dr. Amanda Reynolds
206
- phone: "(555) 123-4567"
207
- relationship: Computer Science Professor
208
- email: amanda.reynolds@usc.edu
209
- summary: |
210
- Andy Dufresne shows exceptional problem-solving skills and a solid understanding of programming concepts, he would bring immense value to any team or organization he becomes a part of.
211
- projects:
212
- - name: EduWeb
213
- url: https://www.eduweb.xyz/
214
- description: A web-based educational platform for interactive learning
215
- startDate: Sep 2016
216
- endDate: Dec 2016
217
- summary: |
218
- - Designed to enhance online learning experiences
219
- - Facilitates students' engagement and collaboration through interactive features and user-friendly interface
220
- - Offers a wide range of courses across various subjects
221
- - Aims to improve the way students learn through the power of the web
222
- keywords:
223
- - Education
224
- - Online Learning
225
- - HCI
226
- interests:
227
- - name: Sports
228
- keywords:
229
- - Soccer
230
- - Swimming
231
- - Bicycling
232
- - Hiking
233
- - name: Music
234
- keywords:
235
- - Piano
236
- - Guitar
237
- volunteer:
238
- - organization: USC Computer Science and Engineering Society
239
- url: https://www.usccsesociety.org/
240
- position: Tech Mentor
241
- startDate: Sep 2015
242
- endDate: Jul 2023
243
- summary: |
244
- - Volunteered as a Tech Mentor at USC Computer Science and Engineering Society
245
- - Provided guidance and assistance to fellow students in their technical projects and coursework
246
- - Assisted in organizing workshops, coding competitions, and networking events for the society members
247
- - Contributed to fostering a collaborative and supportive environment within the student community
248
-
249
- # Top-level locale setting
250
- locale:
251
- # Use \\\`yamlresume languages list\\\` to get the list of supported languages
252
- language: en
253
-
254
- # Multiple output layouts configuration
255
- layouts:
256
- - engine: html
257
- # Use \\\`yamlresume templates list\\\` to get the list of available templates
258
- template: calm
259
- typography:
260
- # HTML engine only supports font size in px unit, from 10px to 24px
261
- fontSize: 16px
262
- - engine: markdown
263
- - engine: latex
264
- page:
265
- margins:
266
- top: 2.5cm
267
- left: 1.5cm
268
- right: 1.5cm
269
- bottom: 2.5cm
270
- showPageNumbers: true
271
- # Use \\\`yamlresume templates list\\\` to get the list of available templates
272
- template: moderncv-banking
273
- typography:
274
- # LaTeX engine only supports 10pt, 11pt, and 12pt
275
- fontSize: 11pt
276
- `;function K({yaml:e=L,onChange:t}){let[o,r]=useState(0),n=i=>{t?.(i);},a=useMemo(()=>{try{return parse(e)}catch{return null}},[e]);return useEffect(()=>{let i=a?.layouts||[];o>=i.length&&i.length>0&&r(i.length-1);},[a?.layouts,o]),{yaml:e,handleYamlChange:n,activeLayoutIndex:o,setActiveLayoutIndex:r,resume:a}}var ce={tooltips:{copy:"Copy",undo:"Undo",redo:"Redo",clear:"Clear",print:"Print",openInNewTab:"Open in New Tab",download:"Download"}};function Ve({yaml:e=L,onChange:t,filename:o,messages:r}){let{yaml:n,handleYamlChange:a,activeLayoutIndex:i,setActiveLayoutIndex:s,resume:g}=K({yaml:e,onChange:t}),m={...ce.tooltips,...r?.tooltips},l=jsx(Z,{value:n,onChange:y=>a(y||""),filename:o,tooltips:m}),u=jsx(Y,{activeLayoutIndex:i,setActiveLayoutIndex:s,resume:g,filename:o,tooltips:m});return jsxs("div",{className:fe("flex flex-col h-full w-full gap-4","text-neutral-200"),style:{backgroundColor:w},children:[jsx(j,{editorPanel:l,previewPanel:u}),jsx(G,{editorPanel:l,previewPanel:u})]})}function G({editorPanel:e,previewPanel:t}){return jsx("div",{className:"hidden md:flex flex-1 overflow-hidden",children:jsxs(Group,{orientation:"horizontal",children:[jsx(Panel,{minSize:360,className:"flex flex-col",children:e}),jsx(Q,{}),jsx(Panel,{minSize:360,className:"flex flex-col",children:t})]})})}function q({label:e,active:t,onClick:o,icon:r}){return jsxs("button",{type:"button",onClick:o,className:fe("flex-1 flex items-center justify-center gap-2 h-10","text-sm","transition-colors",t&&"border-b-2 border-neutral-200 font-medium"),children:[jsx(r,{size:p.sm,stroke:c.sm}),e]})}function de({activeTab:e,onTabChange:t}){return jsxs("div",{className:"flex md:hidden border-b border-neutral-400",children:[jsx(q,{label:"Editor",icon:IconEdit,active:e==="editor",onClick:()=>t("editor")}),jsx(q,{label:"Preview",icon:IconEye,active:e==="preview",onClick:()=>t("preview")})]})}function j({editorPanel:e,previewPanel:t}){let[o,r]=useState("editor");return jsxs("div",{className:"flex-1 flex flex-col gap-2 overflow-hidden md:hidden",children:[jsx(de,{activeTab:o,onTabChange:r}),jsx("div",{className:fe("flex-1 flex-col min-h-0",o==="editor"?"flex":"hidden"),children:e}),jsx("div",{className:fe("flex-1 flex-col min-h-0",o==="preview"?"flex":"hidden"),children:t})]})}function oe({content:e,language:t}){return jsx(C,{language:t,value:e,readOnly:true,minimap:false,lineNumbers:false})}function te({content:e}){let t=useRef(null),[o,r]=useState(null),[n,a]=useState(false);return useEffect(()=>{if(!e||!t.current)return r(null),a(false),()=>{};a(true),r(null);let i=t.current;return renderAsync(e,i,void 0,{className:"docx",inWrapper:true}).then(()=>{a(false);}).catch(s=>{a(false),r(`DOCX Render Error: ${s instanceof Error?s.message:String(s)}`);}),()=>{i.innerHTML="";}},[e]),e?o?jsx("div",{role:"alert","aria-live":"polite",className:"h-full w-full p-4 font-mono text-red-500 bg-red-50 border border-red-200",children:o}):jsxs("div",{className:"h-full w-full overflow-auto bg-white relative",children:[n&&jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-white/80 z-10",children:jsx("div",{className:"text-gray-500",children:"Loading DOCX preview\u2026"})}),jsx("div",{ref:t,className:"docx-preview-container"})]}):jsx("div",{className:"h-full w-full flex items-center justify-center text-gray-500 bg-gray-50",children:"No DOCX content to preview."})}function re({content:e}){return jsx("iframe",{title:"Resume HTML Preview",className:"w-full h-full border-none",srcDoc:e})}var he="data:image/png;base64,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";function ye(){return jsxs("div",{className:fe("h-full w-full","flex flex-col items-center justify-center gap-4","text-neutral-200"),children:[jsx("img",{src:he,alt:"YAML Resume Logo",className:"w-32 h-32 opacity-70 grayscale",draggable:false}),jsx("div",{className:"text-lg font-medium",children:"No Layouts Defined"}),jsx("p",{className:"max-w-xs text-center text-sm text-neutral-400",children:"Your resume appears to be empty or contains no layout definitions."})]})}function go(e){switch(e){case "html":return jsx(IconHtml,{size:p.sm,stroke:c.sm});case "markdown":return jsx(IconMarkdown,{size:p.sm,stroke:c.sm});case "latex":return jsx(IconTex,{size:p.sm,stroke:c.sm});default:return jsx(IconFileText,{size:p.sm,stroke:c.sm})}}function Pe({active:e,onClick:t,engine:o,index:r,filename:n}){return jsxs("button",{type:"button",onClick:t,className:fe("flex items-center gap-2 max-w-[200px]","h-full px-4","transition-colors border-r border-neutral-600 last:border-neutral-400"),title:`${n}.${r}${E(o)}`,role:"tab","aria-selected":e,style:{backgroundColor:e&&w},children:[go(o),jsxs("span",{className:"truncate",children:[n,".",r,E(o)]})]})}function we({children:e}){return jsx("div",{role:"tablist",className:fe("flex h-full overflow-x-auto"),children:e})}function ae({resume:e,layoutIndex:t}){let{renderedContent:o,binaryContent:r,engine:n,error:a}=J({resume:e,layoutIndex:t});return a?jsx("div",{role:"alert","aria-live":"polite",className:fe("h-full w-full p-4","font-mono text-red-500 bg-red-50","border border-red-200"),children:a}):n==="docx"?jsx(te,{content:r}):jsx("div",{className:"h-full w-full flex flex-col bg-white",children:n==="html"?jsx(re,{content:o}):jsx(oe,{content:o,language:n})})}function Y({activeLayoutIndex:e,filename:t,resume:o,setActiveLayoutIndex:r,tooltips:n}){let a=useMemo(()=>(o?.layouts||[]).map((u,y)=>({layout:u,originalIndex:y})).filter(u=>u.layout!==null&&u.layout!==void 0&&typeof u.layout.engine=="string"),[o?.layouts]),i=R(t,true)||"resume",s=useCallback(()=>{z(o,e);},[o,e]),g=useCallback(()=>{V(o,e);},[o,e]),m=useCallback(()=>{U(o,e);},[o,e]),l=useCallback(()=>{W(o,e);},[o,e]);return a.length===0?jsxs(x,{children:[jsx(v,{}),jsx(ye,{})]}):jsxs(x,{children:[jsxs(v,{children:[jsx(we,{children:a.map(({layout:u,originalIndex:y})=>jsx(Pe,{active:e===y,onClick:()=>r(y),engine:u.engine,index:y,filename:i},`${u.engine}-${y}`))}),jsx("div",{className:"flex-1"}),jsxs("div",{className:"flex items-center gap-0.5 pr-2",children:[jsx(N,{onClick:s,title:n.copy}),jsx(P,{}),o?.layouts?.[e]?.engine==="html"&&jsxs(Fragment,{children:[jsx(h,{onClick:g,title:n.print,children:jsx(IconPrinter,{size:p.sm,stroke:c.sm})}),jsx(h,{onClick:m,title:n.openInNewTab,children:jsx(IconExternalLink,{size:p.sm,stroke:c.sm})}),jsx(P,{})]}),jsx(h,{onClick:l,title:n.download,children:jsx(IconDownload,{size:p.sm,stroke:c.sm})})]})]}),jsx(k,{children:jsx(ae,{resume:o,layoutIndex:e})})]})}function x({children:e}){return jsx("div",{className:fe("flex-1 flex flex-col","border border-neutral-400 overflow-hidden"),children:e})}function k({children:e}){return jsx("div",{className:"flex-1 relative min-h-0",children:e})}function Q(){return jsx(Separator,{className:fe("w-2","flex flex-col justify-center items-center group","transition-colors cursor-col-resize"),"data-testid":"separator",children:jsx("div",{className:fe("w-1 h-8","bg-neutral-400","group-hover:bg-neutral-300")})})}function v({children:e}){return jsx("div",{className:fe("flex items-center border-b border-neutral-400 h-10 text-sm shrink-0","bg-neutral-800"),children:e})}function h({onClick:e,children:t,title:o}){return jsx("button",{type:"button",onClick:e,className:fe("flex items-center justify-center h-8 w-8","text-neutral-200 hover:text-neutral-700 hover:bg-neutral-200","transition-colors","focus:outline-none focus:ring-1 focus:ring-neutral-400"),title:o,children:t})}function N({onClick:e,title:t="Copy"}){let[o,r]=useState(false);return jsx(h,{onClick:async()=>{try{await e(),r(!0),setTimeout(()=>r(!1),2e3);}catch(a){console.error("Failed to copy",a);}},title:t,children:o?jsx(IconCheck,{size:p.sm,stroke:c.sm}):jsx(IconCopy,{size:p.sm,stroke:c.sm})})}function P(){return jsx("div",{className:"w-px h-4 bg-neutral-400 mx-1"})}
277
- export{oe as CodeViewer,ce as DEFAULT_PLAYGROUND_MESSAGES,te as DocxViewer,w as EDITOR_BG_COLOR,se as EDITOR_FONT_SIZE,C as Editor,Z as EditorPanel,re as HtmlViewer,p as ICON_SIZES,c as ICON_STROKES,x as Panel,k as PanelContent,Q as PanelSeparator,v as PanelToolbar,Ve as Playground,G as PlaygroundDesktop,j as PlaygroundMobile,Y as PreviewPanel,X as ResumeEditor,ae as ResumeViewer,h as ToolbarButton,N as ToolbarCopyButton,P as ToolbarSeparator,z as copyResumeToClipboard,W as downloadResume,R as getBasename,E as getExtension,U as openResumeInNewTab,V as printResume,J as useResumeRenderer,K as useResumeState};//# sourceMappingURL=index.js.map
1
+ import Se,{loader}from'@monaco-editor/react';import {ResumeSchema,getResumeRenderer}from'@yamlresume/core';import*as Te from'monaco-editor';import {configureMonacoYaml}from'monaco-yaml';import {z as z$1}from'zod';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {IconArrowBackUp,IconArrowForwardUp,IconEraser,IconPrinter,IconExternalLink,IconDownload,IconCheck,IconCopy,IconFileCode,IconEdit,IconEye,IconFileText,IconTex,IconMarkdown,IconHtml}from'@tabler/icons-react';import {useRef,useCallback,useState,useEffect,useMemo}from'react';import ge from'clsx';import {getSampleResume}from'@yamlresume/samples';import {parse}from'yaml';import {Group,Panel,Separator}from'react-resizable-panels';import {renderAsync}from'docx-preview';var p={xs:12,sm:16,md:20,lg:24,xl:28},m={xs:1,sm:1.25,md:1.5,lg:1.75,xl:2},h="#1e1e1e",se=14;loader.config({monaco:Te});var Ee="https://yamlresume.dev/schema.json",Ie=z$1.toJSONSchema(ResumeSchema),le=false;function Me(){let e=self;e.MonacoEnvironment?.getWorker||(e.MonacoEnvironment={getWorker(r,o){switch(o){case "editorWorkerService":return new Worker(new URL("../workers/editor.worker.ts",import.meta.url),{type:"module"});case "yaml":return new Worker(new URL("../workers/yaml.worker.ts",import.meta.url),{type:"module"});default:throw new Error(`Unsupported monaco worker label: ${o}`)}}});}function A(e){Me(),!le&&(configureMonacoYaml(e,{completion:true,hover:true,validate:true,enableSchemaRequest:false,format:{enable:false},schemas:[{uri:Ee,fileMatch:["*"],schema:Ie}]}),le=true);}function Le(e){let r={displayName:"LaTeX",name:"latex",mimeTypes:["text/latex","text/tex"],fileExtensions:["tex","sty","cls"],tokenPostfix:".latex",defaultToken:"",keywords:["addcontentsline","addtocontents","addtocounter","address","addtolength","addvspace","alph","appendix","arabic","author","backslash","baselineskip","baselinestretch","bf","bibitem","bigskipamount","bigskip","boldmath","boldsymbol","cal","caption","cdots","centering","chapter","circle","cite","cleardoublepage","clearpage","cline","closing","color","copyright","dashbox","date","ddots","documentclass","dotfill","em","emph","ensuremath","epigraph","euro","fbox","flushbottom","fnsymbol","footnote","footnotemark","footnotesize","footnotetext","frac","frame","framebox","frenchspacing","hfill","hline","href","hrulefill","hspace","huge","Huge","hyphenation","include","includegraphics","includeonly","indent","input","it","item","kill","label","large","Large","LARGE","LaTeX","LaTeXe","ldots","left","lefteqn","line","linebreak","linethickness","linewidth","listoffigures","listoftables","location","makebox","maketitle","markboth","mathcal","mathop","mbox","medskip","multicolumn","multiput","newcommand","newcolumntype","newcounter","newenvironment","newfont","newlength","newline","newpage","newsavebox","newtheorem","nocite","noindent","nolinebreak","nonfrenchspacing","normalsize","nopagebreak","not","onecolumn","opening","oval","overbrace","overline","pagebreak","pagenumbering","pageref","pagestyle","par","paragraph","parbox","parindent","parskip","part","protect","providecommand","put","raggedbottom","raggedleft","raggedright","raisebox","ref","renewcommand","right","rm","roman","rule","savebox","sbox","sc","scriptsize","section","setcounter","setlength","settowidth","sf","shortstack","signature","sl","slash","small","smallskip","sout","space","sqrt","stackrel","stepcounter","subparagraph","subsection","subsubsection","tableofcontents","telephone","TeX","textbf","textcolor","textit","textmd","textnormal","textrm","textsc","textsf","textsl","texttt","textup","textwidth","textheight","thanks","thispagestyle","tiny","title","today","tt","twocolumn","typeout","typein","uline","underbrace","underline","unitlength","usebox","usecounter","uwave","value","vbox","vcenter","vdots","vector","verb","vfill","vline","vphantom","vspace","RequirePackage","NeedsTeXFormat","usepackage","input","include","documentclass","documentstyle","def","edef","defcommand","if","ifdim","ifnum","ifx","fi","else","begingroup","endgroup","definecolor","textcolor","color","eifstrequal","eeifstrequal"],tokenizer:{root:[[/(\\begin)(\s*)(\{)([\w\-*@]+)(\})/,["keyword.predefined","white","@brackets",{token:"tag.env-$4",bracket:"@open"},"@brackets"]],[/(\\end)(\s*)(\{)([\w\-*@]+)(\})/,["keyword.predefined","white","@brackets",{token:"tag.env-$4",bracket:"@close"},"@brackets"]],[/\\\[a-zA-Z@]/,"keyword"],[/\\\\[^a-zA-Z@]/,"keyword"],[/\\@[a-zA-Z@]+/,"keyword.at"],[/\\([a-zA-Z@]+)/,{cases:{"$1@keywords":"keyword.predefined","@default":"keyword"}}],{include:"@whitespace"},[/[{}()[\]]/,"@brackets"],[/#+\d/,"number.arg"],[/\\-?(?:\d+(?:\.\d+)?|\.\d+)\s*(?:em|ex|pt|pc|sp|cm|mm|in)/,"number.len"]],whitespace:[[/[ \t\r\n]+/,"white"],["%.*$","comment"]]}},o={comments:{lineComment:"%"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"$",close:"$"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"$",close:"$"}]};e.languages.getLanguages().some(t=>t.id==="latex")||(e.languages.register({id:"latex"}),e.languages.setMonarchTokensProvider("latex",r),e.languages.setLanguageConfiguration("latex",o));}function k({value:e,onChange:r,language:o,readOnly:t=false,lineNumbers:n=true,minimap:a=true,onMount:i}){return jsx(Se,{height:"100%",language:o,value:e,onChange:r,theme:"vs-dark",onMount:i,beforeMount:s=>{Le(s),o==="yaml"&&A(s);},options:{readOnly:t,domReadOnly:t,lineNumbers:n?"on":"off",minimap:{enabled:a},fontSize:se,lineNumbersMinChars:4,padding:{top:8},automaticLayout:true,roundedSelection:false,smoothScrolling:true,scrollBeyondLastLine:false}})}var $=(e="resume.yaml",r=false)=>{let o=e.split(/[/\\]/).pop()||e;return r?o.replace(/\.(ya?ml|json)$/,""):o},T=e=>{switch(e){case "html":return ".html";case "latex":return ".tex";case "markdown":return ".md";case "docx":return ".docx";default:return ""}},V=async(e,r)=>{try{let o=e?.layouts;if(!e||!o[r]){console.warn("No resume or layout found for download");return}let n=getResumeRenderer(e,r).render(),a=o[r],i=T(a.engine),s=`resume.${r}${i}`,g=n instanceof Promise?await n:n,c=g instanceof Uint8Array?new Blob([g.buffer],{type:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"}):new Blob([g],{type:"text/plain"}),l=URL.createObjectURL(c),u=document.createElement("a");u.href=l,u.download=s,document.body.appendChild(u),u.click(),document.body.removeChild(u),URL.revokeObjectURL(l);}catch(o){console.error("Failed to download resume:",o);}},z=(e,r)=>{try{let o=e?.layouts;if(!e||!o[r])return console.warn("No resume or layout found for copy"),Promise.resolve();let n=getResumeRenderer(e,r).render();return typeof n!="string"?(console.warn("Copy to clipboard is not supported for binary layouts"),Promise.resolve()):navigator.clipboard.writeText(n)}catch(o){return console.error("Failed to copy resume:",o),Promise.resolve()}},U=(e,r)=>{try{let o=e?.layouts;if(!e||!o[r]){console.warn("No resume or layout found for print");return}if(o[r].engine!=="html"){console.warn("Printing is only supported for HTML layouts");return}let a=getResumeRenderer(e,r).render();if(typeof a!="string"){console.warn("Printing is only supported for string-based layouts");return}let i=document.createElement("iframe");i.style.position="absolute",i.style.width="0px",i.style.height="0px",i.style.border="none",document.body.appendChild(i);let s=i.contentWindow?.document;s&&(s.open(),s.write(a),s.close(),i.contentWindow?.focus(),i.contentWindow?.print()),setTimeout(()=>{document.body.removeChild(i);},1e3);}catch(o){console.error("Failed to print resume:",o);}},X=(e,r)=>{try{let o=e?.layouts;if(!e||!o[r]){console.warn("No resume or layout found for new tab");return}if(o[r].engine!=="html"){console.warn("Open in new tab is only supported for HTML layouts");return}let a=getResumeRenderer(e,r).render();if(typeof a!="string"){console.warn("Open in new tab is only supported for string-based layouts");return}let i=new Blob([a],{type:"text/html"}),s=URL.createObjectURL(i);window.open(s,"_blank");}catch(o){console.error("Failed to open resume in new tab:",o);}};function me({filename:e="resume.yaml"}){let r=$(e);return jsxs("div",{className:ge("flex items-center gap-2","h-full px-4","border-r border-neutral-600"),style:{backgroundColor:h},children:[jsx(IconFileCode,{size:p.sm,stroke:m.sm}),jsx("span",{children:r})]})}function Z({value:e,onChange:r,onMount:o}){return jsx(k,{language:"yaml",value:e,onChange:r,onMount:o})}function K({value:e,onChange:r,filename:o,tooltips:t}){let n=useRef(null),a=l=>{n.current=l;},i=useCallback(()=>{n.current?.trigger("source","undo",null);},[]),s=useCallback(()=>{n.current?.trigger("source","redo",null);},[]),g=useCallback(()=>{let l=n.current?.getValue();return l?navigator.clipboard.writeText(l):Promise.resolve()},[]),c=useCallback(()=>{n.current&&window.confirm("Are you sure you want to clear the editor?")&&n.current.setValue("");},[]);return jsxs(w,{children:[jsxs(v,{children:[jsx("div",{className:"flex h-full",children:jsx(me,{filename:o})}),jsx("div",{className:"flex-1"}),jsxs("div",{className:"flex items-center gap-0.5 pr-2",children:[jsx(N,{onClick:g,title:t.copy}),jsx(x,{}),jsx(b,{onClick:i,title:t.undo,children:jsx(IconArrowBackUp,{size:p.sm,stroke:m.sm})}),jsx(b,{onClick:s,title:t.redo,children:jsx(IconArrowForwardUp,{size:p.sm,stroke:m.sm})}),jsx(x,{}),jsx(b,{onClick:c,title:t.clear,children:jsx(IconEraser,{size:p.sm,stroke:m.sm})})]})]}),jsx(R,{children:jsx(Z,{value:e,onChange:r,onMount:a})})]})}function J({resume:e,layoutIndex:r}){let[o,t]=useState(""),[n,a]=useState(null),[i,s]=useState("html"),[g,c]=useState(null);return useEffect(()=>{if(e)try{let l=e.layouts?.[r];if(!l){c(`Layout at index ${r} not found.`);return}if(typeof l.engine!="string"){c("Layout is incomplete - missing engine property.");return}let u=l.engine;s(u);let C=getResumeRenderer(e,r).render();typeof C=="string"?(t(C),a(null),c(null)):C instanceof Uint8Array?(t(""),a(C),c(null)):C.then(y=>{typeof y=="string"?(t(y),a(null)):y instanceof Uint8Array&&(t(""),a(y)),c(null);}).catch(y=>{c(`Render Error: ${y instanceof Error?y.message:String(y)}`);});}catch(l){c(`Render Error: ${l instanceof Error?l.message:String(l)}`);}},[e,r]),{renderedContent:o,binaryContent:n,engine:i,error:g}}var Ye=getSampleResume("software-engineer","en",{withLayouts:true,withComments:true});function F({yaml:e=Ye,onChange:r}){let[o,t]=useState(0),n=i=>{r?.(i);},a=useMemo(()=>{try{return parse(e)}catch{return null}},[e]);return useEffect(()=>{let i=a?.layouts||[];o>=i.length&&i.length>0&&t(i.length-1);},[a?.layouts,o]),{yaml:e,handleYamlChange:n,activeLayoutIndex:o,setActiveLayoutIndex:t,resume:a}}var ue={tooltips:{copy:"Copy",undo:"Undo",redo:"Redo",clear:"Clear",print:"Print",openInNewTab:"Open in New Tab",download:"Download"}};function Qe({yaml:e,onChange:r,filename:o,messages:t}){let{yaml:n,handleYamlChange:a,activeLayoutIndex:i,setActiveLayoutIndex:s,resume:g}=F({yaml:e,onChange:r}),c={...ue.tooltips,...t?.tooltips},l=jsx(K,{value:n,onChange:P=>a(P||""),filename:o,tooltips:c}),u=jsx(j,{activeLayoutIndex:i,setActiveLayoutIndex:s,resume:g,filename:o,tooltips:c});return jsxs("div",{className:ge("flex flex-col h-full w-full gap-4","text-neutral-200"),style:{backgroundColor:h},children:[jsx(Y,{editorPanel:l,previewPanel:u}),jsx(G,{editorPanel:l,previewPanel:u})]})}function G({editorPanel:e,previewPanel:r}){return jsx("div",{className:"hidden md:flex flex-1 overflow-hidden",children:jsxs(Group,{orientation:"horizontal",children:[jsx(Panel,{minSize:360,className:"flex flex-col",children:e}),jsx(Q,{}),jsx(Panel,{minSize:360,className:"flex flex-col",children:r})]})})}function q({label:e,active:r,onClick:o,icon:t}){return jsxs("button",{type:"button",onClick:o,className:ge("flex-1 flex items-center justify-center gap-2 h-10","text-sm","transition-colors",r&&"border-b-2 border-neutral-200 font-medium"),children:[jsx(t,{size:p.sm,stroke:m.sm}),e]})}function fe({activeTab:e,onTabChange:r}){return jsxs("div",{className:"flex md:hidden border-b border-neutral-400",children:[jsx(q,{label:"Editor",icon:IconEdit,active:e==="editor",onClick:()=>r("editor")}),jsx(q,{label:"Preview",icon:IconEye,active:e==="preview",onClick:()=>r("preview")})]})}function Y({editorPanel:e,previewPanel:r}){let[o,t]=useState("editor");return jsxs("div",{className:"flex-1 flex flex-col gap-2 overflow-hidden md:hidden",children:[jsx(fe,{activeTab:o,onTabChange:t}),jsx("div",{className:ge("flex-1 flex-col min-h-0",o==="editor"?"flex":"hidden"),children:e}),jsx("div",{className:ge("flex-1 flex-col min-h-0",o==="preview"?"flex":"hidden"),children:r})]})}function oe({content:e,language:r}){return jsx(k,{language:r,value:e,readOnly:true,minimap:false,lineNumbers:false})}function re({content:e}){let r=useRef(null),[o,t]=useState(null),[n,a]=useState(false);return useEffect(()=>{if(!e||!r.current)return t(null),a(false),()=>{};a(true),t(null);let i=r.current;return renderAsync(e,i,void 0,{className:"docx",inWrapper:true}).then(()=>{a(false);}).catch(s=>{a(false),t(`DOCX Render Error: ${s instanceof Error?s.message:String(s)}`);}),()=>{i.innerHTML="";}},[e]),e?o?jsx("div",{role:"alert","aria-live":"polite",className:"h-full w-full p-4 font-mono text-red-500 bg-red-50 border border-red-200",children:o}):jsxs("div",{className:"h-full w-full overflow-auto bg-white relative",children:[n&&jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-white/80 z-10",children:jsx("div",{className:"text-gray-500",children:"Loading DOCX preview\u2026"})}),jsx("div",{ref:r,className:"docx-preview-container"})]}):jsx("div",{className:"h-full w-full flex items-center justify-center text-gray-500 bg-gray-50",children:"No DOCX content to preview."})}function te({content:e}){return jsx("iframe",{title:"Resume HTML Preview",className:"w-full h-full border-none",srcDoc:e})}var Pe="data:image/png;base64,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";function ye(){return jsxs("div",{className:ge("h-full w-full","flex flex-col items-center justify-center gap-4","text-neutral-200"),children:[jsx("img",{src:Pe,alt:"YAML Resume Logo",className:"w-32 h-32 opacity-70 grayscale",draggable:false}),jsx("div",{className:"text-lg font-medium",children:"No Layouts Defined"}),jsx("p",{className:"max-w-xs text-center text-sm text-neutral-400",children:"Your resume appears to be empty or contains no layout definitions."})]})}function $o(e){switch(e){case "html":return jsx(IconHtml,{size:p.sm,stroke:m.sm});case "markdown":return jsx(IconMarkdown,{size:p.sm,stroke:m.sm});case "latex":return jsx(IconTex,{size:p.sm,stroke:m.sm});default:return jsx(IconFileText,{size:p.sm,stroke:m.sm})}}function he({active:e,onClick:r,engine:o,index:t,filename:n}){return jsxs("button",{type:"button",onClick:r,className:ge("flex items-center gap-2 max-w-[200px]","h-full px-4","transition-colors border-r border-neutral-600 last:border-neutral-400"),title:`${n}.${t}${T(o)}`,role:"tab","aria-selected":e,style:{backgroundColor:e&&h},children:[$o(o),jsxs("span",{className:"truncate",children:[n,".",t,T(o)]})]})}function we({children:e}){return jsx("div",{role:"tablist",className:ge("flex h-full overflow-x-auto"),children:e})}function ae({resume:e,layoutIndex:r}){let{renderedContent:o,binaryContent:t,engine:n,error:a}=J({resume:e,layoutIndex:r});return a?jsx("div",{role:"alert","aria-live":"polite",className:ge("h-full w-full p-4","font-mono text-red-500 bg-red-50","border border-red-200"),children:a}):n==="docx"?jsx(re,{content:t}):jsx("div",{className:"h-full w-full flex flex-col bg-white",children:n==="html"?jsx(te,{content:o}):jsx(oe,{content:o,language:n})})}function j({activeLayoutIndex:e,filename:r,resume:o,setActiveLayoutIndex:t,tooltips:n}){let a=useMemo(()=>(o?.layouts||[]).map((u,P)=>({layout:u,originalIndex:P})).filter(u=>u.layout!==null&&u.layout!==void 0&&typeof u.layout.engine=="string"),[o?.layouts]),i=$(r,true)||"resume",s=useCallback(()=>{z(o,e);},[o,e]),g=useCallback(()=>{U(o,e);},[o,e]),c=useCallback(()=>{X(o,e);},[o,e]),l=useCallback(()=>{V(o,e);},[o,e]);return a.length===0?jsxs(w,{children:[jsx(v,{}),jsx(ye,{})]}):jsxs(w,{children:[jsxs(v,{children:[jsx(we,{children:a.map(({layout:u,originalIndex:P})=>jsx(he,{active:e===P,onClick:()=>t(P),engine:u.engine,index:P,filename:i},`${u.engine}-${P}`))}),jsx("div",{className:"flex-1"}),jsxs("div",{className:"flex items-center gap-0.5 pr-2",children:[jsx(N,{onClick:s,title:n.copy}),jsx(x,{}),o?.layouts?.[e]?.engine==="html"&&jsxs(Fragment,{children:[jsx(b,{onClick:g,title:n.print,children:jsx(IconPrinter,{size:p.sm,stroke:m.sm})}),jsx(b,{onClick:c,title:n.openInNewTab,children:jsx(IconExternalLink,{size:p.sm,stroke:m.sm})}),jsx(x,{})]}),jsx(b,{onClick:l,title:n.download,children:jsx(IconDownload,{size:p.sm,stroke:m.sm})})]})]}),jsx(R,{children:jsx(ae,{resume:o,layoutIndex:e})})]})}function w({children:e}){return jsx("div",{className:ge("flex-1 flex flex-col","border border-neutral-400 overflow-hidden"),children:e})}function R({children:e}){return jsx("div",{className:"flex-1 relative min-h-0",children:e})}function Q(){return jsx(Separator,{className:ge("w-2","flex flex-col justify-center items-center group","transition-colors cursor-col-resize"),"data-testid":"separator",children:jsx("div",{className:ge("w-1 h-8","bg-neutral-400","group-hover:bg-neutral-300")})})}function v({children:e}){return jsx("div",{className:ge("flex items-center border-b border-neutral-400 h-10 text-sm shrink-0","bg-neutral-800"),children:e})}function b({onClick:e,children:r,title:o}){return jsx("button",{type:"button",onClick:e,className:ge("flex items-center justify-center h-8 w-8","text-neutral-200 hover:text-neutral-700 hover:bg-neutral-200","transition-colors","focus:outline-none focus:ring-1 focus:ring-neutral-400"),title:o,children:r})}function N({onClick:e,title:r="Copy"}){let[o,t]=useState(false);return jsx(b,{onClick:async()=>{try{await e(),t(!0),setTimeout(()=>t(!1),2e3);}catch(a){console.error("Failed to copy",a);}},title:r,children:o?jsx(IconCheck,{size:p.sm,stroke:m.sm}):jsx(IconCopy,{size:p.sm,stroke:m.sm})})}function x(){return jsx("div",{className:"w-px h-4 bg-neutral-400 mx-1"})}
2
+ export{oe as CodeViewer,ue as DEFAULT_PLAYGROUND_MESSAGES,re as DocxViewer,h as EDITOR_BG_COLOR,se as EDITOR_FONT_SIZE,k as Editor,K as EditorPanel,te as HtmlViewer,p as ICON_SIZES,m as ICON_STROKES,w as Panel,R as PanelContent,Q as PanelSeparator,v as PanelToolbar,Qe as Playground,G as PlaygroundDesktop,Y as PlaygroundMobile,j as PreviewPanel,Z as ResumeEditor,ae as ResumeViewer,b as ToolbarButton,N as ToolbarCopyButton,x as ToolbarSeparator,A as configureYamlSupport,z as copyResumeToClipboard,V as downloadResume,$ as getBasename,T as getExtension,X as openResumeInNewTab,U as printResume,J as useResumeRenderer,F as useResumeState};//# sourceMappingURL=index.js.map
278
3
  //# sourceMappingURL=index.js.map