@hadoku/resume-bot 0.0.0-stage → 3.14.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +135 -3
  2. package/dist/App.d.ts +9 -0
  3. package/dist/App.d.ts.map +1 -0
  4. package/dist/ChatInterface-mHtxUGpp.js +128 -0
  5. package/dist/ChatInterface-mHtxUGpp.js.map +1 -0
  6. package/dist/ResumeViewer-C-uxZ-7E.js +296 -0
  7. package/dist/ResumeViewer-C-uxZ-7E.js.map +1 -0
  8. package/dist/builder/BlockCard.d.ts +15 -0
  9. package/dist/builder/BlockCard.d.ts.map +1 -0
  10. package/dist/builder/BuilderApp.d.ts +3 -0
  11. package/dist/builder/BuilderApp.d.ts.map +1 -0
  12. package/dist/builder/api.d.ts +37 -0
  13. package/dist/builder/api.d.ts.map +1 -0
  14. package/dist/builder/entry.d.ts +8 -0
  15. package/dist/builder/entry.d.ts.map +1 -0
  16. package/dist/builder/useBuilderAuth.d.ts +10 -0
  17. package/dist/builder/useBuilderAuth.d.ts.map +1 -0
  18. package/dist/builder.js +537 -0
  19. package/dist/builder.js.map +1 -0
  20. package/dist/components/ChatInterface.d.ts +10 -0
  21. package/dist/components/ChatInterface.d.ts.map +1 -0
  22. package/dist/components/ResumeDocument.d.ts +30 -0
  23. package/dist/components/ResumeDocument.d.ts.map +1 -0
  24. package/dist/components/ResumeViewer.d.ts +12 -0
  25. package/dist/components/ResumeViewer.d.ts.map +1 -0
  26. package/dist/entry-BTJjyohQ.js +154 -0
  27. package/dist/entry-BTJjyohQ.js.map +1 -0
  28. package/dist/entry.d.ts +22 -0
  29. package/dist/entry.d.ts.map +1 -0
  30. package/dist/index.js +9 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/markdown-vendor-61sRGACd.js +10510 -0
  33. package/dist/markdown-vendor-61sRGACd.js.map +1 -0
  34. package/dist/rehype-vendor-C_Q-vwLE.js +5647 -0
  35. package/dist/rehype-vendor-C_Q-vwLE.js.map +1 -0
  36. package/dist/services/api.d.ts +62 -0
  37. package/dist/services/api.d.ts.map +1 -0
  38. package/dist/style.css +1 -0
  39. package/dist/worker/application-extras.d.ts +56 -0
  40. package/dist/worker/application-extras.d.ts.map +1 -0
  41. package/dist/worker/blocks.d.ts +12 -0
  42. package/dist/worker/blocks.d.ts.map +1 -0
  43. package/dist/worker/builder.d.ts +33 -0
  44. package/dist/worker/builder.d.ts.map +1 -0
  45. package/dist/worker/constants.d.ts +39 -0
  46. package/dist/worker/constants.d.ts.map +1 -0
  47. package/dist/worker/contact.d.ts +34 -0
  48. package/dist/worker/contact.d.ts.map +1 -0
  49. package/dist/worker/cover-letter.d.ts +16 -0
  50. package/dist/worker/cover-letter.d.ts.map +1 -0
  51. package/dist/worker/index.d.ts +38 -0
  52. package/dist/worker/index.d.ts.map +1 -0
  53. package/dist/worker/llm.d.ts +77 -0
  54. package/dist/worker/llm.d.ts.map +1 -0
  55. package/dist/worker/pdf.d.ts +46 -0
  56. package/dist/worker/pdf.d.ts.map +1 -0
  57. package/dist/worker/rate-limit.d.ts +10 -0
  58. package/dist/worker/rate-limit.d.ts.map +1 -0
  59. package/dist/worker/resume.d.ts +33 -0
  60. package/dist/worker/resume.d.ts.map +1 -0
  61. package/dist/worker/skeleton.d.ts +73 -0
  62. package/dist/worker/skeleton.d.ts.map +1 -0
  63. package/dist/worker/tailored-resume.d.ts +31 -0
  64. package/dist/worker/tailored-resume.d.ts.map +1 -0
  65. package/dist/worker/typography.d.ts +12 -0
  66. package/dist/worker/typography.d.ts.map +1 -0
  67. package/dist/worker/variants.d.ts +51 -0
  68. package/dist/worker/variants.d.ts.map +1 -0
  69. package/dist/worker.js +42508 -0
  70. package/package.json +43 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResumeViewer-C-uxZ-7E.js","sources":["../src/components/ResumeDocument.tsx","../src/components/ResumeViewer.tsx"],"sourcesContent":["import React, { Children, isValidElement } from 'react'\nimport ReactMarkdown, { type Components } from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\n\n// Contract with the worker's assembler (worker/src/skeleton.ts): résumé markdown\n// carries this sentinel between page groups. react-markdown drops the raw HTML\n// comment, so we split on it and render each page as its own sheet with the\n// print-only pagebreak element between them.\nexport const PAGE_BREAK_MARKER = '<!-- page-break -->'\n\n/**\n * The assembler emits one `# Heading` per résumé section (worker/src/skeleton.ts\n * SECTION_HEADINGS). We split on those headings rather than handing the whole\n * document to one ReactMarkdown pass, because the same markdown construct means\n * different things per section — `###` is a job title under Experience and a\n * project category under Projects, and `**bold** …` is a project entry under\n * Projects and a skills row under Technical Skills. Splitting gives each section\n * its own wrapper class, so the stylesheet can say so without heuristics.\n */\ninterface Section {\n /** Slug of the heading text, or `masthead` for the pre-heading name block. */\n id: string\n /** Heading text; null for the masthead, which is the name/contact line itself. */\n heading: string | null\n body: string\n}\n\nconst SECTION_HEADING = /^#[^#]\\s*(.+?)\\s*$/\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\nexport function splitSections(page: string): Section[] {\n const sections: Section[] = []\n let current: { id: string; heading: string | null; body: string[] } = {\n id: 'masthead',\n heading: null,\n body: []\n }\n const flush = () => {\n if (current.heading !== null || current.body.join('').trim() !== '') {\n sections.push({ id: current.id, heading: current.heading, body: current.body.join('\\n') })\n }\n }\n for (const line of page.split('\\n')) {\n const match = SECTION_HEADING.exec(line)\n if (match) {\n flush()\n current = { id: slugify(match[1]), heading: match[1], body: [] }\n } else {\n current.body.push(line)\n }\n }\n flush()\n return sections\n}\n\n/**\n * Project entries arrive as `**name** - description · [GitHub](…) · [Live](…)`,\n * which renders as one undifferentiated run of text. Two source-level tweaks buy\n * the whole layout: dropping the dash after the name lets the name become its\n * own line without a stray leading hyphen, and dropping the interpuncts before\n * the trailing links lets those links render as chips instead of a dotted tail.\n * Both are presentation-only — the markdown in KV is untouched, and every other\n * consumer (PDF, chat system prompt, .md download) still sees the original.\n */\nfunction prepareProjects(body: string): string {\n return body.replace(/^(\\*\\*[^*]+\\*\\*)\\s*[-–—]\\s+/gm, '$1 ').replace(/\\s*·\\s*(?=\\[)/g, ' ')\n}\n\n/**\n * Skills rows are `**Languages:** …`. The colon is a run-in separator in prose;\n * once the label is set as a label on its own line it is just a dangling\n * artefact, so it comes off here rather than in KV — the PDF and the .md\n * download still want it.\n */\nfunction prepareSkills(body: string): string {\n return body.replace(/^(\\*\\*[^*]+?)\\s*:\\*\\*/gm, '$1**')\n}\n\n/**\n * The hast nodes react-markdown hands to component overrides, structurally —\n * spelled out here rather than imported from `hast` so the published .d.ts does\n * not oblige consumers to install @types/hast for a purely internal helper.\n */\ninterface HastNode {\n type: string\n tagName?: string\n value?: string\n children?: HastNode[]\n}\n\nconst isSignificant = (node: HastNode) => node.type !== 'text' || (node.value ?? '').trim() !== ''\n\n/** The element's first child, ignoring insignificant whitespace. */\nfunction firstChild(node: HastNode | undefined): HastNode | undefined {\n const child = node?.children?.find(isSignificant)\n return child?.type === 'element' ? child : undefined\n}\n\nfunction significantChildren(node: HastNode | undefined): number {\n return (node?.children ?? []).filter(isSignificant).length\n}\n\n/**\n * Peel the trailing run of links off a paragraph's children. Project entries end\n * in a GitHub/Live pair that reads as a footer, not as prose, so it gets its own\n * line — otherwise the chips land wherever the description happens to stop and\n * every entry ends at a different ragged offset.\n */\nfunction splitTrailingLinks(children: React.ReactNode): [React.ReactNode[], React.ReactNode[]] {\n const nodes = Children.toArray(children)\n let cut = nodes.length\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i]\n if (typeof node === 'string' && node.trim() === '') continue\n if (isValidElement(node) && node.type === 'a') {\n cut = i\n continue\n }\n break\n }\n return [nodes.slice(0, cut), nodes.slice(cut)]\n}\n\n/** Split React children at `<br />` boundaries — the masthead's name and\n * contact line are one paragraph joined by a markdown hard break. */\nfunction splitAtBreaks(children: React.ReactNode): React.ReactNode[][] {\n const lines: React.ReactNode[][] = [[]]\n for (const child of Children.toArray(children)) {\n if (isValidElement(child) && child.type === 'br') lines.push([])\n else lines[lines.length - 1].push(child)\n }\n return lines\n}\n\n/**\n * The masthead is one paragraph joined by markdown hard breaks: the name, then\n * the contact line. Only that paragraph is treated as a masthead — a document\n * with no `#` headings at all (a cover letter) puts every paragraph in this\n * section, and the rest of them are ordinary prose.\n */\nfunction mastheadComponents(): Components {\n let nameUsed = false\n return {\n // `node` is destructured off so it never reaches the DOM — react-markdown\n // hands it to every override, and React warns on an unknown `node` attr.\n p({ node: _node, children, ...props }) {\n const [name, ...rest] = splitAtBreaks(children)\n if (nameUsed || rest.length === 0) return <p {...props}>{children}</p>\n nameUsed = true\n return (\n <>\n <h1 className=\"resume-doc__name\">{name}</h1>\n {rest.map((line, i) => (\n <p key={i} className=\"resume-doc__contact\">\n {line}\n </p>\n ))}\n </>\n )\n }\n }\n}\n\nfunction sectionComponents(sectionId: string): Components {\n let ledeUsed = false\n return {\n p({ node, children, ...props }) {\n const lead = firstChild(node)\n if (lead?.tagName === 'strong') {\n const [body, links] = splitTrailingLinks(children)\n return (\n <p className=\"resume-doc__entry\" {...props}>\n {body}\n {links.length > 0 && <span className=\"resume-doc__links\">{links}</span>}\n </p>\n )\n }\n // A paragraph that is nothing but emphasis is a meta line — the date range\n // under a job title.\n if (lead?.tagName === 'em' && significantChildren(node) === 1) {\n return (\n <p className=\"resume-doc__meta\" {...props}>\n {children}\n </p>\n )\n }\n // Projects opens with a standing paragraph about the platform everything\n // below runs on. It frames the section rather than listing an item, so it\n // gets called out instead of reading as the first entry.\n if (sectionId === 'projects' && !ledeUsed) {\n ledeUsed = true\n return (\n <p className=\"resume-doc__lede\" {...props}>\n {children}\n </p>\n )\n }\n return <p {...props}>{children}</p>\n }\n }\n}\n\n/** Per-section source tweaks, keyed by section slug. */\nconst PREPARE: Record<string, (body: string) => string> = {\n projects: prepareProjects,\n 'technical-skills': prepareSkills\n}\n\nconst identity = (body: string) => body\n\n/** One résumé section: its heading plus the markdown beneath it. */\nfunction ResumeSection({\n id,\n heading,\n body,\n masthead\n}: Section & { masthead: boolean }): React.ReactElement {\n const content = (PREPARE[id] ?? identity)(body)\n return (\n <section className={`resume-doc__section resume-doc__section--${id}`}>\n {heading !== null && <h2 className=\"resume-doc__section-title\">{heading}</h2>}\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={masthead ? mastheadComponents() : sectionComponents(id)}\n >\n {content}\n </ReactMarkdown>\n </section>\n )\n}\n\ninterface ResumeDocumentProps {\n content: string\n /** `letter` skips the masthead treatment: a cover letter is three paragraphs\n * of prose with no headings, so every one of them lands in the pre-heading\n * section and none of them is a name/contact block. */\n variant?: 'resume' | 'letter'\n}\n\n/** Render résumé markdown as a stack of sheets, honouring page-break markers. */\nexport function ResumeDocument({\n content,\n variant = 'resume'\n}: ResumeDocumentProps): React.ReactElement {\n const pages = content.split(PAGE_BREAK_MARKER)\n return (\n <div className={`resume-doc resume-doc--${variant}`}>\n {pages.map((page, i) => (\n <React.Fragment key={i}>\n {i > 0 && <div className=\"resume-viewer__pagebreak\" />}\n <article className=\"resume-doc__sheet\">\n {splitSections(page).map((section, j) => (\n <ResumeSection\n key={j}\n {...section}\n masthead={variant === 'resume' && section.heading === null}\n />\n ))}\n </article>\n </React.Fragment>\n ))}\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { logger } from '@wolffm/logger/client'\nimport { fetchResume, resumePdfUrl, type ResumePacket } from '../services/api'\nimport { ResumeDocument } from './ResumeDocument'\n\ninterface ResumeViewerProps {\n onAskAbout: (text: string) => void\n ownerName?: string\n /** Target of the toolbar's \"Schedule a Meeting\" button. */\n contactUrl?: string\n}\n\n/** Site-relative by default: the widget is a micro-frontend of the site that\n * owns the scheduling page, so /contact/ resolves against whatever host it is\n * mounted on rather than pinning the package to one domain. */\nconst DEFAULT_CONTACT_URL = '/contact/'\n\n/** Download filename stem: \"Matthaeus Wolff\" → \"matthaeus-wolff-resume\". Must\n * stay in sync with the worker's /resume.pdf Content-Disposition filename. */\nexport function resumeFilenameBase(ownerName?: string): string {\n const slug = (ownerName ?? '')\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n return slug ? `${slug}-resume` : 'resume'\n}\n\nexport default function ResumeViewer({\n onAskAbout,\n ownerName,\n contactUrl = DEFAULT_CONTACT_URL\n}: ResumeViewerProps) {\n const [packet, setPacket] = useState<ResumePacket | null>(null)\n const [view, setView] = useState<'resume' | 'cover'>('resume')\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [contextMenu, setContextMenu] = useState<{ x: number; y: number; text: string } | null>(\n null\n )\n\n useEffect(() => {\n loadResume().catch(err =>\n logger.error('[ResumeViewer] Error loading resume', {\n error: (err as Error)?.message ?? String(err)\n })\n )\n }, [])\n\n async function loadResume() {\n try {\n setLoading(true)\n setError(null)\n // Only a URL ?v={slug} serves a tailored variant. A bare /resume always\n // serves the canonical résumé — the slug is never persisted, so nobody\n // (owner or recruiter) gets a stale point-in-time variant on a later visit.\n const slug = new URLSearchParams(window.location.search).get('v') ?? undefined\n\n const result = await fetchResume(slug)\n setPacket(result)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load resume')\n } finally {\n setLoading(false)\n }\n }\n\n // Close context menu when clicking anywhere\n useEffect(() => {\n const handleClick = () => setContextMenu(null)\n document.addEventListener('click', handleClick)\n return () => document.removeEventListener('click', handleClick)\n }, [])\n\n const handleContextMenu = (e: React.MouseEvent) => {\n e.preventDefault()\n const selection = window.getSelection()\n const selectedText = selection?.toString().trim()\n\n if (selectedText && selectedText.length > 0) {\n setContextMenu({\n x: e.clientX,\n y: e.clientY,\n text: selectedText\n })\n }\n }\n\n const handleAskAboutClick = () => {\n if (contextMenu) {\n onAskAbout(contextMenu.text)\n setContextMenu(null)\n }\n }\n\n // Two hardenings over the obvious version. The anchor is put IN the document,\n // because a detached one is the case where browsers are least consistent about\n // honouring `download` — and the fallback, navigating to the blob: URL, is\n // blocked by hadoku.me's CSP (`frame-src 'self'`), which is what a report of\n // silent download failures there looked like. And the object URL is revoked a\n // tick later rather than synchronously: at click time the browser has not\n // finished reading the blob, so revoking immediately is a live race.\n const downloadBlob = (data: BlobPart, mimeType: string, filename: string) => {\n const url = URL.createObjectURL(new Blob([data], { type: mimeType }))\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.rel = 'noopener'\n a.style.display = 'none'\n document.body.appendChild(a)\n a.click()\n setTimeout(() => {\n a.remove()\n URL.revokeObjectURL(url)\n }, 0)\n }\n\n const resumeContent = packet?.content ?? ''\n const coverLetter = packet?.coverLetter ?? null\n const hasCover = coverLetter !== null && coverLetter.length > 0\n const activeContent = view === 'cover' && hasCover ? coverLetter : resumeContent\n\n const variantSlug = packet?.variant ?? new URLSearchParams(window.location.search).get('v')\n // Deliberately no variant slug or packet suffix: a recruiter sees one clean\n // \"<owner>-resume.pdf\" no matter which tailored variant they were linked.\n const baseFilename = resumeFilenameBase(ownerName)\n\n // The full packet as one markdown doc — résumé, then a page break, then the\n // cover letter under a heading.\n const packetMarkdown = hasCover\n ? `${resumeContent}\\n\\n---\\n\\n# Cover Letter\\n\\n${coverLetter}`\n : resumeContent\n\n const handleDownloadMd = () =>\n downloadBlob(hasCover ? packetMarkdown : resumeContent, 'text/markdown', `${baseFilename}.md`)\n\n const handleDownloadJson = () =>\n downloadBlob(\n JSON.stringify(\n {\n content: resumeContent,\n cover_letter: coverLetter ?? undefined,\n variant: variantSlug ?? undefined,\n label: packet?.label ?? undefined,\n company: packet?.company ?? undefined,\n job_title: packet?.jobTitle ?? undefined,\n format: 'markdown'\n },\n null,\n 2\n ),\n 'application/json',\n `${baseFilename}.json`\n )\n\n // The PDF is rendered server-side from the same canonical markdown and\n // downloaded as a file — no print dialog. The API includes the cover letter\n // when the variant carries one, mirroring the packet .md download. It is a\n // plain link, not a fetch-into-a-Blob: the response already carries\n // `Content-Disposition: attachment` with the owner's filename, and an\n // attachment is saved rather than handed to whatever the browser has\n // registered for application/pdf.\n const pdfHref = resumePdfUrl(variantSlug ?? undefined)\n\n if (loading) {\n return (\n <div className=\"resume-viewer resume-viewer--loading\">\n <p>Loading resume...</p>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className=\"resume-viewer resume-viewer--error\">\n <p className=\"resume-viewer__error-message\">Error: {error}</p>\n <button\n onClick={() => {\n loadResume().catch(err =>\n logger.error('[ResumeViewer] Error loading resume', {\n error: (err as Error)?.message ?? String(err)\n })\n )\n }}\n className=\"resume-viewer__retry-button\"\n >\n Retry\n </button>\n </div>\n )\n }\n\n return (\n <>\n <div className=\"resume-viewer\" onContextMenu={handleContextMenu}>\n <div className=\"resume-viewer__toolbar\">\n {hasCover && (\n <div className=\"resume-viewer__toggle\" role=\"tablist\" aria-label=\"Packet document\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={view === 'resume'}\n className={\n view === 'resume'\n ? 'resume-viewer__toggle-btn resume-viewer__toggle-btn--active'\n : 'resume-viewer__toggle-btn'\n }\n onClick={() => setView('resume')}\n >\n Résumé\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={view === 'cover'}\n className={\n view === 'cover'\n ? 'resume-viewer__toggle-btn resume-viewer__toggle-btn--active'\n : 'resume-viewer__toggle-btn'\n }\n onClick={() => setView('cover')}\n >\n Cover letter\n </button>\n </div>\n )}\n <div className=\"resume-viewer__downloads\">\n <span className=\"resume-viewer__downloads-label\">Download</span>\n <a className=\"resume-viewer__download-button\" href={pdfHref} download>\n .pdf\n </a>\n <button className=\"resume-viewer__download-button\" onClick={handleDownloadMd}>\n .md\n </button>\n <button className=\"resume-viewer__download-button\" onClick={handleDownloadJson}>\n .json\n </button>\n </div>\n <a className=\"resume-viewer__schedule-button\" href={contactUrl}>\n Schedule a Meeting\n </a>\n </div>\n\n {/* Only this scrolls, so the toolbar stays put and keeps its own\n padding out of the document's leading whitespace. */}\n <div className=\"resume-viewer__scroll\">\n {/* On screen: the toggle-selected document. */}\n <div className=\"resume-viewer__screen\">\n <ResumeDocument\n content={activeContent}\n variant={view === 'cover' && hasCover ? 'letter' : 'resume'}\n />\n </div>\n\n {/* On print / PDF: the full packet — résumé, then cover letter. */}\n <div className=\"resume-viewer__print\">\n <ResumeDocument content={resumeContent} />\n {hasCover && (\n <>\n <div className=\"resume-viewer__pagebreak\" />\n <ResumeDocument content={coverLetter} variant=\"letter\" />\n </>\n )}\n </div>\n </div>\n </div>\n {contextMenu && (\n <div\n className=\"context-menu\"\n style={{\n position: 'fixed',\n top: contextMenu.y,\n left: contextMenu.x,\n zIndex: 1000\n }}\n >\n <button className=\"context-menu__item\" onClick={handleAskAboutClick}>\n Ask about this\n </button>\n </div>\n )}\n </>\n )\n}\n"],"names":["PAGE_BREAK_MARKER","SECTION_HEADING","slugify","text","splitSections","page","sections","current","flush","line","match","prepareProjects","body","prepareSkills","isSignificant","node","firstChild","child","significantChildren","splitTrailingLinks","children","nodes","Children","cut","i","isValidElement","splitAtBreaks","lines","mastheadComponents","nameUsed","_node","props","name","rest","jsx","jsxs","Fragment","sectionComponents","sectionId","ledeUsed","lead","links","PREPARE","identity","ResumeSection","id","heading","masthead","content","ReactMarkdown","remarkGfm","ResumeDocument","variant","pages","React","section","j","DEFAULT_CONTACT_URL","resumeFilenameBase","ownerName","slug","ResumeViewer","onAskAbout","contactUrl","packet","setPacket","useState","view","setView","loading","setLoading","error","setError","contextMenu","setContextMenu","useEffect","loadResume","err","logger","result","fetchResume","handleClick","handleContextMenu","e","selectedText","handleAskAboutClick","downloadBlob","data","mimeType","filename","url","a","resumeContent","coverLetter","hasCover","activeContent","variantSlug","baseFilename","packetMarkdown","handleDownloadMd","handleDownloadJson","pdfHref","resumePdfUrl"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { FeedbackEntry, ResumeBlock } from './api';
2
+ interface Props {
3
+ block: ResumeBlock;
4
+ feedback: FeedbackEntry | undefined;
5
+ existingIds: string[];
6
+ isNew?: boolean;
7
+ onSave: (block: ResumeBlock) => Promise<void>;
8
+ onDelete?: () => Promise<void>;
9
+ onCancel?: () => void;
10
+ onFeedback: (id: string, text: string) => Promise<void>;
11
+ onTagClick: (tag: string) => void;
12
+ }
13
+ export declare function BlockCard({ block, feedback, existingIds, isNew, onSave, onDelete, onCancel, onFeedback, onTagClick }: Props): import("react/jsx-runtime").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=BlockCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockCard.d.ts","sourceRoot":"","sources":["../../src/builder/BlockCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAa,aAAa,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAWlE,UAAU,KAAK;IACb,KAAK,EAAE,WAAW,CAAA;IAClB,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAA;IACnC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAClC;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,WAAW,EACX,KAAa,EACb,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,UAAU,EACX,EAAE,KAAK,2CAuLP"}
@@ -0,0 +1,3 @@
1
+ export declare function facetOf(tag: string): 'tech' | 'layer' | 'story' | 'plain';
2
+ export declare function BuilderApp(): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=BuilderApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuilderApp.d.ts","sourceRoot":"","sources":["../../src/builder/BuilderApp.tsx"],"names":[],"mappings":"AAwBA,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAKzE;AAQD,wBAAgB,UAAU,4CA8PzB"}
@@ -0,0 +1,37 @@
1
+ export type BlockType = 'experience' | 'project' | 'skills' | 'education' | 'summary' | 'header';
2
+ export interface ResumeBlock {
3
+ id: string;
4
+ type: BlockType;
5
+ tags: string[];
6
+ title: string;
7
+ content: string;
8
+ priority: number;
9
+ }
10
+ export interface FeedbackEntry {
11
+ text: string;
12
+ updated: string;
13
+ }
14
+ export type Feedback = Record<string, FeedbackEntry>;
15
+ export declare class BuilderApiError extends Error {
16
+ readonly status: number;
17
+ constructor(message: string, status: number);
18
+ }
19
+ export declare function setBuilderApiBaseUrl(url: string): void;
20
+ export declare function fetchBlocks(): Promise<{
21
+ blocks: ResumeBlock[];
22
+ feedback: Feedback;
23
+ }>;
24
+ export declare function saveBlock(block: ResumeBlock): Promise<{
25
+ block: ResumeBlock;
26
+ }>;
27
+ export declare function deleteBlock(id: string): Promise<{
28
+ deleted: true;
29
+ id: string;
30
+ }>;
31
+ export declare function reorderBlocks(ids: string[]): Promise<{
32
+ ids: string[];
33
+ }>;
34
+ export declare function saveFeedback(id: string, text: string): Promise<{
35
+ feedback: Feedback;
36
+ }>;
37
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/builder/api.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAA;AAEhG,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,SAAS,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AACD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AAEpD,qBAAa,eAAgB,SAAQ,KAAK;IAGtC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADvB,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM;CAK1B;AAID,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtD;AAqBD,wBAAgB,WAAW,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,CAEpF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC,CAK7E;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAE9E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAEvE;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,CAKtF"}
@@ -0,0 +1,8 @@
1
+ export interface ResumeBuilderProps {
2
+ theme?: string;
3
+ /** API root, e.g. '/resume/api' — the builder calls ${apiBaseUrl}/builder/*. */
4
+ apiBaseUrl: string;
5
+ }
6
+ export declare function mount(el: HTMLElement, props: ResumeBuilderProps): void;
7
+ export declare function unmount(el: HTMLElement): void;
8
+ //# sourceMappingURL=entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/builder/entry.tsx"],"names":[],"mappings":"AAkBA,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAA;CACnB;AAMD,wBAAgB,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,QAO/D;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,WAAW,QAGtC"}
@@ -0,0 +1,10 @@
1
+ /** Send the browser to the ecosystem sign-in page, returning here afterwards. */
2
+ export declare function redirectToAuth(): void;
3
+ export type AuthStatus = 'checking' | 'authorized' | 'redirecting';
4
+ export interface BuilderAuth {
5
+ status: AuthStatus;
6
+ /** Display name from the key registry once authorized (null if unnamed). */
7
+ name: string | null;
8
+ }
9
+ export declare function useBuilderAuth(): BuilderAuth;
10
+ //# sourceMappingURL=useBuilderAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBuilderAuth.d.ts","sourceRoot":"","sources":["../../src/builder/useBuilderAuth.ts"],"names":[],"mappings":"AAUA,iFAAiF;AACjF,wBAAgB,cAAc,IAAI,IAAI,CAIrC;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,CAAA;AAElE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAA;IAClB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAED,wBAAgB,cAAc,IAAI,WAAW,CAkC5C"}