@plateerlab/xgen-gallery 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -153,19 +153,25 @@ var themes = {
153
153
  textMuted: "#6b6b80",
154
154
  accent: "#6c63ff",
155
155
  accentLight: "#8b83ff",
156
- accentGlow: "rgba(108,99,255,0.15)"
156
+ accentGlow: "rgba(108,99,255,0.15)",
157
+ shadowHover: "0 0 20px rgba(108,99,255,0.2)",
158
+ bgBadge: "rgba(108,99,255,0.15)",
159
+ textBadge: "#a0a0b8"
157
160
  },
158
161
  light: {
159
- bg: "#f8f9fa",
162
+ bg: "#f8fafc",
160
163
  bgCard: "#ffffff",
161
- bgCardHover: "#f0f0f5",
162
- border: "#e0e0e8",
163
- text: "#1a1a2e",
164
- textSecondary: "#4a4a5a",
165
- textMuted: "#8a8a9a",
166
- accent: "#5b52e0",
167
- accentLight: "#5b52e0",
168
- accentGlow: "rgba(91,82,224,0.1)"
164
+ bgCardHover: "#ffffff",
165
+ border: "rgba(0,0,0,0.08)",
166
+ text: "#1e293b",
167
+ textSecondary: "#4b5563",
168
+ textMuted: "#6b7280",
169
+ accent: "#2563eb",
170
+ accentLight: "#2563eb",
171
+ accentGlow: "rgba(37,99,235,0.08)",
172
+ shadowHover: "0 8px 20px rgba(0,0,0,0.08)",
173
+ bgBadge: "#f1f5f9",
174
+ textBadge: "#475569"
169
175
  }
170
176
  };
171
177
  var LANG_COLORS = {
@@ -291,9 +297,9 @@ function XgenGallery({ org, token, theme: themeName = "dark", limit, onRepoClick
291
297
  }
292
298
  }, [onRepoClick]);
293
299
  if (view.type === "detail") {
294
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(RepoDetail, { org, repo: view.repo, token, t, onBack: () => setView({ type: "list" }) });
300
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(RepoDetail, { org, repo: view.repo, token, t, themeName, onBack: () => setView({ type: "list" }) });
295
301
  }
296
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { background: t.bg, color: t.text, fontFamily: "system-ui, -apple-system, sans-serif", padding: 24 }, children: [
302
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { "data-theme": themeName, style: { background: t.bg, color: t.text, fontFamily: "system-ui, -apple-system, sans-serif", padding: 24 }, children: [
297
303
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { marginBottom: 24 }, children: [
298
304
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { style: { fontSize: 24, fontWeight: 700, margin: 0 }, children: org }),
299
305
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { style: { color: t.textMuted, fontSize: 14, margin: "4px 0 0" }, children: [
@@ -331,8 +337,8 @@ function XgenGallery({ org, token, theme: themeName = "dark", limit, onRepoClick
331
337
  fontSize: 12,
332
338
  fontWeight: 500,
333
339
  cursor: "pointer",
334
- background: !lang ? t.accent : "transparent",
335
- color: !lang ? "#fff" : t.textMuted,
340
+ background: !lang ? t.accent : t.bgBadge,
341
+ color: !lang ? "#fff" : t.textBadge,
336
342
  border: `1px solid ${!lang ? t.accent : t.border}`
337
343
  },
338
344
  children: "All"
@@ -348,8 +354,8 @@ function XgenGallery({ org, token, theme: themeName = "dark", limit, onRepoClick
348
354
  fontSize: 12,
349
355
  fontWeight: 500,
350
356
  cursor: "pointer",
351
- background: lang === l ? t.accent : "transparent",
352
- color: lang === l ? "#fff" : t.textMuted,
357
+ background: lang === l ? t.accent : t.bgBadge,
358
+ color: lang === l ? "#fff" : t.textBadge,
353
359
  border: `1px solid ${lang === l ? t.accent : t.border}`
354
360
  },
355
361
  children: l
@@ -378,12 +384,12 @@ function RepoCard({ repo, t, onClick }) {
378
384
  padding: 20,
379
385
  cursor: "pointer",
380
386
  transform: hover ? "translateY(-2px)" : "none",
381
- boxShadow: hover ? `0 0 20px ${t.accentGlow}` : "none",
387
+ boxShadow: hover ? t.shadowHover : "none",
382
388
  transition: "all 0.2s"
383
389
  },
384
390
  children: [
385
391
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", justifyContent: "space-between", marginBottom: 8 }, children: [
386
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 16, fontWeight: 600, color: t.accentLight }, children: repo.name }),
392
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 16, fontWeight: 600, color: t.accent }, children: repo.name }),
387
393
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
388
394
  "button",
389
395
  {
@@ -424,7 +430,7 @@ function RepoCard({ repo, t, onClick }) {
424
430
  }
425
431
  );
426
432
  }
427
- function RepoDetail({ org, repo, token, t, onBack }) {
433
+ function RepoDetail({ org, repo, token, t, themeName, onBack }) {
428
434
  const [tab, setTab] = (0, import_react.useState)("readme");
429
435
  const [readme, setReadme] = (0, import_react.useState)(null);
430
436
  const [snippets, setSnippets] = (0, import_react.useState)([]);
@@ -439,7 +445,7 @@ function RepoDetail({ org, repo, token, t, onBack }) {
439
445
  setLoading(false);
440
446
  });
441
447
  }, [org, repo.name, token]);
442
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { background: t.bg, color: t.text, fontFamily: "system-ui, -apple-system, sans-serif", padding: 24 }, children: [
448
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { "data-theme": themeName, style: { background: t.bg, color: t.text, fontFamily: "system-ui, -apple-system, sans-serif", padding: 24 }, children: [
443
449
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
444
450
  "button",
445
451
  {
@@ -447,7 +453,7 @@ function RepoDetail({ org, repo, token, t, onBack }) {
447
453
  style: {
448
454
  background: "transparent",
449
455
  border: "none",
450
- color: t.accentLight,
456
+ color: t.accent,
451
457
  cursor: "pointer",
452
458
  fontSize: 14,
453
459
  padding: 0,
@@ -519,8 +525,8 @@ function DemoView({ snippets, t }) {
519
525
  borderRadius: 99,
520
526
  fontSize: 12,
521
527
  cursor: "pointer",
522
- background: i === idx ? t.accentGlow : "transparent",
523
- color: i === idx ? t.accentLight : t.textMuted,
528
+ background: i === idx ? t.accentGlow : t.bgBadge,
529
+ color: i === idx ? t.accent : t.textBadge,
524
530
  border: `1px solid ${i === idx ? t.accent : t.border}`
525
531
  },
526
532
  children: s.label
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/XgenGallery.tsx","../src/api.ts","../src/styles.ts","../src/ReadmeView.tsx"],"sourcesContent":["export { XgenGallery } from \"./XgenGallery\";\r\nexport type { GalleryProps, Repo, DemoSnippet } from \"./types\";\r\n","import { useEffect, useState, useCallback } from \"react\";\r\nimport type { Repo, GalleryProps, DemoSnippet } from \"./types\";\r\nimport { fetchRepos, fetchReadme, fetchDemoSnippets } from \"./api\";\r\nimport { themes, LANG_COLORS, Theme } from \"./styles\";\r\nimport { ReadmeView } from \"./ReadmeView\";\r\n\r\ntype View = { type: \"list\" } | { type: \"detail\"; repo: Repo };\r\n\r\nexport function XgenGallery({ org, token, theme: themeName = \"dark\", limit, onRepoClick }: GalleryProps) {\r\n const t = themes[themeName];\r\n const [repos, setRepos] = useState<Repo[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState(\"\");\r\n const [lang, setLang] = useState<string | null>(null);\r\n const [view, setView] = useState<View>({ type: \"list\" });\r\n\r\n useEffect(() => {\r\n fetchRepos(org, token).then((data) => {\r\n setRepos(limit ? data.slice(0, limit) : data);\r\n setLoading(false);\r\n });\r\n }, [org, token, limit]);\r\n\r\n const languages = [...new Set(repos.map((r) => r.language).filter(Boolean))] as string[];\r\n\r\n const filtered = repos.filter((r) => {\r\n if (lang && r.language !== lang) return false;\r\n if (search) {\r\n const q = search.toLowerCase();\r\n return r.name.toLowerCase().includes(q) || (r.description || \"\").toLowerCase().includes(q);\r\n }\r\n return true;\r\n });\r\n\r\n const handleCardClick = useCallback((repo: Repo) => {\r\n if (onRepoClick) {\r\n onRepoClick(repo);\r\n } else {\r\n setView({ type: \"detail\", repo });\r\n }\r\n }, [onRepoClick]);\r\n\r\n if (view.type === \"detail\") {\r\n return <RepoDetail org={org} repo={view.repo} token={token} t={t} onBack={() => setView({ type: \"list\" })} />;\r\n }\r\n\r\n return (\r\n <div style={{ background: t.bg, color: t.text, fontFamily: \"system-ui, -apple-system, sans-serif\", padding: 24 }}>\r\n {/* Header */}\r\n <div style={{ marginBottom: 24 }}>\r\n <h2 style={{ fontSize: 24, fontWeight: 700, margin: 0 }}>{org}</h2>\r\n <p style={{ color: t.textMuted, fontSize: 14, margin: \"4px 0 0\" }}>\r\n {repos.length} repositories\r\n </p>\r\n </div>\r\n\r\n {/* Search + Filter */}\r\n <div style={{ display: \"flex\", gap: 8, flexWrap: \"wrap\", marginBottom: 16 }}>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n style={{\r\n background: t.bgCard, border: `1px solid ${t.border}`, borderRadius: 8,\r\n padding: \"8px 12px\", color: t.text, fontSize: 14, outline: \"none\", flex: \"1 1 200px\",\r\n }}\r\n />\r\n <button\r\n onClick={() => setLang(null)}\r\n style={{\r\n padding: \"6px 12px\", borderRadius: 8, fontSize: 12, fontWeight: 500, cursor: \"pointer\",\r\n background: !lang ? t.accent : \"transparent\",\r\n color: !lang ? \"#fff\" : t.textMuted,\r\n border: `1px solid ${!lang ? t.accent : t.border}`,\r\n }}\r\n >\r\n All\r\n </button>\r\n {languages.map((l) => (\r\n <button\r\n key={l}\r\n onClick={() => setLang(lang === l ? null : l)}\r\n style={{\r\n padding: \"6px 12px\", borderRadius: 8, fontSize: 12, fontWeight: 500, cursor: \"pointer\",\r\n background: lang === l ? t.accent : \"transparent\",\r\n color: lang === l ? \"#fff\" : t.textMuted,\r\n border: `1px solid ${lang === l ? t.accent : t.border}`,\r\n }}\r\n >\r\n {l}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Grid */}\r\n {loading ? (\r\n <div style={{ textAlign: \"center\", padding: 60, color: t.textMuted }}>Loading...</div>\r\n ) : (\r\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(auto-fill, minmax(300px, 1fr))\", gap: 16 }}>\r\n {filtered.map((repo) => (\r\n <RepoCard key={repo.name} repo={repo} t={t} onClick={() => handleCardClick(repo)} />\r\n ))}\r\n </div>\r\n )}\r\n {!loading && filtered.length === 0 && (\r\n <div style={{ textAlign: \"center\", padding: 60, color: t.textMuted }}>No results</div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/* ---------- RepoCard ---------- */\r\n\r\nfunction RepoCard({ repo, t, onClick }: { repo: Repo; t: Theme; onClick: () => void }) {\r\n const [hover, setHover] = useState(false);\r\n const langColor = repo.language ? LANG_COLORS[repo.language] || \"#888\" : null;\r\n const date = new Date(repo.updated_at).toLocaleDateString(\"ko-KR\", { year: \"numeric\", month: \"short\", day: \"numeric\" });\r\n\r\n return (\r\n <div\r\n onClick={onClick}\r\n onMouseEnter={() => setHover(true)}\r\n onMouseLeave={() => setHover(false)}\r\n style={{\r\n background: hover ? t.bgCardHover : t.bgCard,\r\n border: `1px solid ${hover ? t.accent : t.border}`,\r\n borderRadius: 12, padding: 20, cursor: \"pointer\",\r\n transform: hover ? \"translateY(-2px)\" : \"none\",\r\n boxShadow: hover ? `0 0 20px ${t.accentGlow}` : \"none\",\r\n transition: \"all 0.2s\",\r\n }}\r\n >\r\n <div style={{ display: \"flex\", justifyContent: \"space-between\", marginBottom: 8 }}>\r\n <span style={{ fontSize: 16, fontWeight: 600, color: t.accentLight }}>{repo.name}</span>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); window.open(repo.html_url, \"_blank\"); }}\r\n style={{\r\n fontSize: 11, padding: \"2px 8px\", borderRadius: 6, cursor: \"pointer\",\r\n border: `1px solid ${t.border}`, background: \"transparent\", color: t.textMuted,\r\n }}\r\n >\r\n GitHub →\r\n </button>\r\n </div>\r\n <p style={{ fontSize: 13, color: t.textSecondary, margin: \"0 0 12px\", lineHeight: 1.5, minHeight: 40 }}>\r\n {repo.description || \"No description\"}\r\n </p>\r\n <div style={{ display: \"flex\", gap: 12, fontSize: 12, color: t.textMuted }}>\r\n {langColor && (\r\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\r\n <span style={{ width: 10, height: 10, borderRadius: \"50%\", background: langColor, display: \"inline-block\" }} />\r\n {repo.language}\r\n </span>\r\n )}\r\n {repo.stargazers_count > 0 && <span>★ {repo.stargazers_count}</span>}\r\n {repo.forks_count > 0 && <span>Fork {repo.forks_count}</span>}\r\n <span>{date}</span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ---------- RepoDetail ---------- */\r\n\r\nfunction RepoDetail({ org, repo, token, t, onBack }: { org: string; repo: Repo; token?: string; t: Theme; onBack: () => void }) {\r\n const [tab, setTab] = useState<\"readme\" | \"demo\">(\"readme\");\r\n const [readme, setReadme] = useState<string | null>(null);\r\n const [snippets, setSnippets] = useState<DemoSnippet[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n\r\n useEffect(() => {\r\n Promise.all([\r\n fetchReadme(org, repo.name, token),\r\n fetchDemoSnippets(org, repo.name, undefined, token),\r\n ]).then(([md, s]) => {\r\n setReadme(md);\r\n setSnippets(s);\r\n setLoading(false);\r\n });\r\n }, [org, repo.name, token]);\r\n\r\n return (\r\n <div style={{ background: t.bg, color: t.text, fontFamily: \"system-ui, -apple-system, sans-serif\", padding: 24 }}>\r\n {/* Back */}\r\n <button\r\n onClick={onBack}\r\n style={{\r\n background: \"transparent\", border: \"none\", color: t.accentLight,\r\n cursor: \"pointer\", fontSize: 14, padding: 0, marginBottom: 16,\r\n }}\r\n >\r\n ← Back\r\n </button>\r\n\r\n {/* Header */}\r\n <div style={{ background: t.bgCard, border: `1px solid ${t.border}`, borderRadius: 12, padding: 24, marginBottom: 16 }}>\r\n <div style={{ display: \"flex\", justifyContent: \"space-between\", flexWrap: \"wrap\", gap: 16 }}>\r\n <div>\r\n <h1 style={{ fontSize: 22, fontWeight: 700, margin: 0 }}>{repo.name}</h1>\r\n <p style={{ color: t.textSecondary, fontSize: 14, margin: \"8px 0\" }}>{repo.description || \"No description\"}</p>\r\n </div>\r\n <a\r\n href={repo.html_url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n style={{\r\n display: \"inline-flex\", alignItems: \"center\", gap: 8,\r\n padding: \"8px 16px\", borderRadius: 8, fontSize: 14, fontWeight: 500,\r\n background: t.accent, color: \"#fff\", textDecoration: \"none\",\r\n height: \"fit-content\",\r\n }}\r\n >\r\n View on GitHub\r\n </a>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div style={{ display: \"flex\", gap: 4, borderBottom: `1px solid ${t.border}`, marginBottom: 16 }}>\r\n {([\"readme\", ...(snippets.length > 0 ? [\"demo\"] : [])] as const).map((key) => (\r\n <button\r\n key={key}\r\n onClick={() => setTab(key as typeof tab)}\r\n style={{\r\n padding: \"10px 16px\", fontSize: 14, fontWeight: 500, cursor: \"pointer\",\r\n background: \"transparent\", border: \"none\",\r\n color: tab === key ? t.accentLight : t.textMuted,\r\n borderBottom: tab === key ? `2px solid ${t.accent}` : \"2px solid transparent\",\r\n }}\r\n >\r\n {key === \"readme\" ? \"README\" : \"Demo\"}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Content */}\r\n <div style={{ background: t.bgCard, border: `1px solid ${t.border}`, borderRadius: 12, padding: 24 }}>\r\n {loading ? (\r\n <div style={{ textAlign: \"center\", padding: 40, color: t.textMuted }}>Loading...</div>\r\n ) : tab === \"readme\" ? (\r\n <ReadmeView org={org} repoName={repo.name} content={readme} t={t} />\r\n ) : (\r\n <DemoView snippets={snippets} t={t} />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ---------- DemoView ---------- */\r\n\r\nfunction DemoView({ snippets, t }: { snippets: DemoSnippet[]; t: Theme }) {\r\n const [idx, setIdx] = useState(0);\r\n const snippet = snippets[idx];\r\n\r\n if (!snippet) return null;\r\n\r\n return (\r\n <div>\r\n {snippets.length > 1 && (\r\n <div style={{ display: \"flex\", gap: 6, marginBottom: 12, flexWrap: \"wrap\" }}>\r\n {snippets.map((s, i) => (\r\n <button\r\n key={i}\r\n onClick={() => setIdx(i)}\r\n style={{\r\n padding: \"4px 12px\", borderRadius: 99, fontSize: 12, cursor: \"pointer\",\r\n background: i === idx ? t.accentGlow : \"transparent\",\r\n color: i === idx ? t.accentLight : t.textMuted,\r\n border: `1px solid ${i === idx ? t.accent : t.border}`,\r\n }}\r\n >\r\n {s.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n <pre\r\n style={{\r\n background: t.bg, border: `1px solid ${t.border}`, borderRadius: 8,\r\n padding: 16, fontSize: 13, lineHeight: 1.6, overflow: \"auto\",\r\n color: t.textSecondary, margin: 0,\r\n }}\r\n >\r\n <code>{snippet.code}</code>\r\n </pre>\r\n {snippet.expectedOutput && (\r\n <div style={{ marginTop: 12 }}>\r\n <span style={{ fontSize: 12, color: t.textMuted }}>Expected Output:</span>\r\n <pre\r\n style={{\r\n background: t.bg, border: `1px solid ${t.border}`, borderRadius: 8,\r\n padding: 12, fontSize: 12, color: t.textMuted, margin: \"4px 0 0\",\r\n }}\r\n >\r\n {snippet.expectedOutput}\r\n </pre>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { Repo, DemoSnippet } from \"./types\";\r\n\r\nconst API = \"https://api.github.com\";\r\n\r\nfunction headers(token?: string): HeadersInit {\r\n const h: Record<string, string> = { Accept: \"application/vnd.github.v3+json\" };\r\n if (token) h.Authorization = `Bearer ${token}`;\r\n return h;\r\n}\r\n\r\nexport async function fetchRepos(org: string, token?: string): Promise<Repo[]> {\r\n try {\r\n const res = await fetch(`${API}/orgs/${org}/repos?per_page=100&sort=updated`, {\r\n headers: headers(token),\r\n });\r\n if (!res.ok) return [];\r\n return res.json();\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nexport async function fetchReadme(org: string, repo: string, token?: string): Promise<string | null> {\r\n try {\r\n const res = await fetch(`${API}/repos/${org}/${repo}/readme`, {\r\n headers: { ...headers(token), Accept: \"application/vnd.github.v3.raw\" },\r\n });\r\n if (!res.ok) return null;\r\n return res.text();\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport async function fetchDemoSnippets(\r\n org: string,\r\n repo: string,\r\n readme?: string | null,\r\n token?: string,\r\n): Promise<DemoSnippet[]> {\r\n // 1. demo.json\r\n for (const path of [\".xgen-gallery/demo.json\", \"demo.json\"]) {\r\n try {\r\n const res = await fetch(`${API}/repos/${org}/${repo}/contents/${path}`, {\r\n headers: { ...headers(token), Accept: \"application/vnd.github.v3.raw\" },\r\n });\r\n if (!res.ok) continue;\r\n const data = await res.json();\r\n if (data.snippets?.length) return data.snippets;\r\n } catch {\r\n continue;\r\n }\r\n }\r\n\r\n // 2. examples/\r\n try {\r\n const res = await fetch(`${API}/repos/${org}/${repo}/contents/examples`, {\r\n headers: headers(token),\r\n });\r\n if (res.ok) {\r\n const files: { name: string; download_url: string }[] = await res.json();\r\n const pyFiles = files.filter((f) => f.name.endsWith(\".py\")).slice(0, 5);\r\n const snippets: DemoSnippet[] = [];\r\n for (const f of pyFiles) {\r\n try {\r\n const r = await fetch(f.download_url);\r\n if (r.ok) {\r\n const code = await r.text();\r\n snippets.push({ label: f.name.replace(/\\.py$/, \"\").replace(/[_-]/g, \" \"), code: code.trim() });\r\n }\r\n } catch { continue; }\r\n }\r\n if (snippets.length) return snippets;\r\n }\r\n } catch { /* ignore */ }\r\n\r\n // 3. README python blocks\r\n let md = readme;\r\n if (!md) md = await fetchReadme(org, repo, token);\r\n if (md) {\r\n const blocks = extractPythonBlocks(md);\r\n if (blocks.length) return blocks;\r\n }\r\n\r\n return [];\r\n}\r\n\r\nfunction extractPythonBlocks(readme: string): DemoSnippet[] {\r\n const snippets: DemoSnippet[] = [];\r\n const lines = readme.split(\"\\n\");\r\n let i = 0;\r\n while (i < lines.length) {\r\n if (/^```(?:python|py)\\s*$/i.test(lines[i].trim())) {\r\n let label = \"\";\r\n for (let j = i - 1; j >= Math.max(0, i - 5); j--) {\r\n const prev = lines[j].trim();\r\n if (/^#{1,4}\\s+/.test(prev)) { label = prev.replace(/^#+\\s+/, \"\"); break; }\r\n if (prev && !label) label = prev;\r\n }\r\n const codeLines: string[] = [];\r\n i++;\r\n while (i < lines.length && !lines[i].trim().startsWith(\"```\")) { codeLines.push(lines[i]); i++; }\r\n const code = codeLines.join(\"\\n\").trim();\r\n if (code && code.split(\"\\n\").length >= 2 && !code.startsWith(\"pip \") && !code.startsWith(\"$ pip\")) {\r\n snippets.push({ label: label || `Example ${snippets.length + 1}`, code });\r\n }\r\n }\r\n i++;\r\n }\r\n return snippets;\r\n}\r\n","export const themes = {\r\n dark: {\r\n bg: \"#0a0a0f\",\r\n bgCard: \"#12121a\",\r\n bgCardHover: \"#1a1a25\",\r\n border: \"#1e1e2e\",\r\n text: \"#e8e8f0\",\r\n textSecondary: \"#a0a0b8\",\r\n textMuted: \"#6b6b80\",\r\n accent: \"#6c63ff\",\r\n accentLight: \"#8b83ff\",\r\n accentGlow: \"rgba(108,99,255,0.15)\",\r\n },\r\n light: {\r\n bg: \"#f8f9fa\",\r\n bgCard: \"#ffffff\",\r\n bgCardHover: \"#f0f0f5\",\r\n border: \"#e0e0e8\",\r\n text: \"#1a1a2e\",\r\n textSecondary: \"#4a4a5a\",\r\n textMuted: \"#8a8a9a\",\r\n accent: \"#5b52e0\",\r\n accentLight: \"#5b52e0\",\r\n accentGlow: \"rgba(91,82,224,0.1)\",\r\n },\r\n};\r\n\r\nexport type Theme = {\r\n bg: string; bgCard: string; bgCardHover: string; border: string;\r\n text: string; textSecondary: string; textMuted: string;\r\n accent: string; accentLight: string; accentGlow: string;\r\n};\r\n\r\nexport const LANG_COLORS: Record<string, string> = {\r\n Python: \"#3572A5\",\r\n TypeScript: \"#3178c6\",\r\n JavaScript: \"#f1e05a\",\r\n Rust: \"#dea584\",\r\n HTML: \"#e34c26\",\r\n CSS: \"#563d7c\",\r\n Go: \"#00ADD8\",\r\n Shell: \"#89e051\",\r\n Java: \"#b07219\",\r\n \"C++\": \"#f34b7d\",\r\n C: \"#555555\",\r\n Ruby: \"#701516\",\r\n};\r\n","import ReactMarkdown from \"react-markdown\";\r\nimport remarkGfm from \"remark-gfm\";\r\nimport rehypeRaw from \"rehype-raw\";\r\nimport type { Theme } from \"./styles\";\r\n\r\nexport function ReadmeView({\r\n org,\r\n repoName,\r\n content,\r\n t,\r\n}: {\r\n org: string;\r\n repoName: string;\r\n content: string | null;\r\n t: Theme;\r\n}) {\r\n if (!content) {\r\n return <div style={{ textAlign: \"center\", padding: 40, color: t.textMuted }}>README not found</div>;\r\n }\r\n\r\n return (\r\n <div className=\"xgen-markdown\" style={{ color: t.text, lineHeight: 1.7, fontSize: 14 }}>\r\n <style>{markdownStyles(t)}</style>\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeRaw]}\r\n components={{\r\n img: ({ src, alt, ...props }) => {\r\n let resolved = src;\r\n if (typeof src === \"string\" && !src.startsWith(\"http\")) {\r\n resolved = `https://raw.githubusercontent.com/${org}/${repoName}/main/${src}`;\r\n }\r\n return <img src={resolved} alt={alt || \"\"} style={{ maxWidth: \"100%\" }} {...props} />;\r\n },\r\n a: ({ href, children, ...props }) => (\r\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: t.accentLight }} {...props}>\r\n {children}\r\n </a>\r\n ),\r\n code: ({ children, className, ...props }) => {\r\n const isBlock = className?.includes(\"language-\");\r\n if (isBlock) {\r\n return (\r\n <code\r\n style={{\r\n display: \"block\", background: t.bg, padding: 16, borderRadius: 8,\r\n overflow: \"auto\", fontSize: 13, lineHeight: 1.6,\r\n }}\r\n {...props}\r\n >\r\n {children}\r\n </code>\r\n );\r\n }\r\n return (\r\n <code style={{ background: t.accentGlow, padding: \"2px 6px\", borderRadius: 4, fontSize: 13 }} {...props}>\r\n {children}\r\n </code>\r\n );\r\n },\r\n }}\r\n >\r\n {content}\r\n </ReactMarkdown>\r\n </div>\r\n );\r\n}\r\n\r\nfunction markdownStyles(t: Theme): string {\r\n return `\r\n .xgen-markdown h1, .xgen-markdown h2, .xgen-markdown h3 { color: ${t.text}; margin: 1.2em 0 0.5em; }\r\n .xgen-markdown h1 { font-size: 1.8em; border-bottom: 1px solid ${t.border}; padding-bottom: 8px; }\r\n .xgen-markdown h2 { font-size: 1.4em; border-bottom: 1px solid ${t.border}; padding-bottom: 6px; }\r\n .xgen-markdown h3 { font-size: 1.15em; }\r\n .xgen-markdown p { margin: 0.8em 0; }\r\n .xgen-markdown ul, .xgen-markdown ol { padding-left: 24px; }\r\n .xgen-markdown li { margin: 4px 0; }\r\n .xgen-markdown pre { background: ${t.bg}; border: 1px solid ${t.border}; border-radius: 8px; padding: 16px; overflow: auto; margin: 12px 0; }\r\n .xgen-markdown blockquote { border-left: 3px solid ${t.accent}; padding-left: 12px; color: ${t.textSecondary}; margin: 12px 0; }\r\n .xgen-markdown table { border-collapse: collapse; width: 100%; margin: 12px 0; }\r\n .xgen-markdown th, .xgen-markdown td { border: 1px solid ${t.border}; padding: 8px 12px; text-align: left; }\r\n .xgen-markdown th { background: ${t.bgCard}; font-weight: 600; }\r\n .xgen-markdown hr { border: none; border-top: 1px solid ${t.border}; margin: 16px 0; }\r\n `;\r\n}\r\n"],"mappings":"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","names":["ReactMarkdown","remarkGfm","rehypeRaw","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/XgenGallery.tsx","../src/api.ts","../src/styles.ts","../src/ReadmeView.tsx"],"sourcesContent":["export { XgenGallery } from \"./XgenGallery\";\r\nexport type { GalleryProps, Repo, DemoSnippet } from \"./types\";\r\n","import { useEffect, useState, useCallback } from \"react\";\r\nimport type { Repo, GalleryProps, DemoSnippet } from \"./types\";\r\nimport { fetchRepos, fetchReadme, fetchDemoSnippets } from \"./api\";\r\nimport { themes, LANG_COLORS, Theme } from \"./styles\";\r\nimport { ReadmeView } from \"./ReadmeView\";\r\n\r\ntype View = { type: \"list\" } | { type: \"detail\"; repo: Repo };\r\n\r\nexport function XgenGallery({ org, token, theme: themeName = \"dark\", limit, onRepoClick }: GalleryProps) {\r\n const t = themes[themeName];\r\n const [repos, setRepos] = useState<Repo[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState(\"\");\r\n const [lang, setLang] = useState<string | null>(null);\r\n const [view, setView] = useState<View>({ type: \"list\" });\r\n\r\n useEffect(() => {\r\n fetchRepos(org, token).then((data) => {\r\n setRepos(limit ? data.slice(0, limit) : data);\r\n setLoading(false);\r\n });\r\n }, [org, token, limit]);\r\n\r\n const languages = [...new Set(repos.map((r) => r.language).filter(Boolean))] as string[];\r\n\r\n const filtered = repos.filter((r) => {\r\n if (lang && r.language !== lang) return false;\r\n if (search) {\r\n const q = search.toLowerCase();\r\n return r.name.toLowerCase().includes(q) || (r.description || \"\").toLowerCase().includes(q);\r\n }\r\n return true;\r\n });\r\n\r\n const handleCardClick = useCallback((repo: Repo) => {\r\n if (onRepoClick) {\r\n onRepoClick(repo);\r\n } else {\r\n setView({ type: \"detail\", repo });\r\n }\r\n }, [onRepoClick]);\r\n\r\n if (view.type === \"detail\") {\r\n return <RepoDetail org={org} repo={view.repo} token={token} t={t} themeName={themeName} onBack={() => setView({ type: \"list\" })} />;\r\n }\r\n\r\n return (\r\n <div data-theme={themeName} style={{ background: t.bg, color: t.text, fontFamily: \"system-ui, -apple-system, sans-serif\", padding: 24 }}>\r\n {/* Header */}\r\n <div style={{ marginBottom: 24 }}>\r\n <h2 style={{ fontSize: 24, fontWeight: 700, margin: 0 }}>{org}</h2>\r\n <p style={{ color: t.textMuted, fontSize: 14, margin: \"4px 0 0\" }}>\r\n {repos.length} repositories\r\n </p>\r\n </div>\r\n\r\n {/* Search + Filter */}\r\n <div style={{ display: \"flex\", gap: 8, flexWrap: \"wrap\", marginBottom: 16 }}>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n style={{\r\n background: t.bgCard, border: `1px solid ${t.border}`, borderRadius: 8,\r\n padding: \"8px 12px\", color: t.text, fontSize: 14, outline: \"none\", flex: \"1 1 200px\",\r\n }}\r\n />\r\n <button\r\n onClick={() => setLang(null)}\r\n style={{\r\n padding: \"6px 12px\", borderRadius: 8, fontSize: 12, fontWeight: 500, cursor: \"pointer\",\r\n background: !lang ? t.accent : t.bgBadge,\r\n color: !lang ? \"#fff\" : t.textBadge,\r\n border: `1px solid ${!lang ? t.accent : t.border}`,\r\n }}\r\n >\r\n All\r\n </button>\r\n {languages.map((l) => (\r\n <button\r\n key={l}\r\n onClick={() => setLang(lang === l ? null : l)}\r\n style={{\r\n padding: \"6px 12px\", borderRadius: 8, fontSize: 12, fontWeight: 500, cursor: \"pointer\",\r\n background: lang === l ? t.accent : t.bgBadge,\r\n color: lang === l ? \"#fff\" : t.textBadge,\r\n border: `1px solid ${lang === l ? t.accent : t.border}`,\r\n }}\r\n >\r\n {l}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Grid */}\r\n {loading ? (\r\n <div style={{ textAlign: \"center\", padding: 60, color: t.textMuted }}>Loading...</div>\r\n ) : (\r\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(auto-fill, minmax(300px, 1fr))\", gap: 16 }}>\r\n {filtered.map((repo) => (\r\n <RepoCard key={repo.name} repo={repo} t={t} onClick={() => handleCardClick(repo)} />\r\n ))}\r\n </div>\r\n )}\r\n {!loading && filtered.length === 0 && (\r\n <div style={{ textAlign: \"center\", padding: 60, color: t.textMuted }}>No results</div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/* ---------- RepoCard ---------- */\r\n\r\nfunction RepoCard({ repo, t, onClick }: { repo: Repo; t: Theme; onClick: () => void }) {\r\n const [hover, setHover] = useState(false);\r\n const langColor = repo.language ? LANG_COLORS[repo.language] || \"#888\" : null;\r\n const date = new Date(repo.updated_at).toLocaleDateString(\"ko-KR\", { year: \"numeric\", month: \"short\", day: \"numeric\" });\r\n\r\n return (\r\n <div\r\n onClick={onClick}\r\n onMouseEnter={() => setHover(true)}\r\n onMouseLeave={() => setHover(false)}\r\n style={{\r\n background: hover ? t.bgCardHover : t.bgCard,\r\n border: `1px solid ${hover ? t.accent : t.border}`,\r\n borderRadius: 12, padding: 20, cursor: \"pointer\",\r\n transform: hover ? \"translateY(-2px)\" : \"none\",\r\n boxShadow: hover ? t.shadowHover : \"none\",\r\n transition: \"all 0.2s\",\r\n }}\r\n >\r\n <div style={{ display: \"flex\", justifyContent: \"space-between\", marginBottom: 8 }}>\r\n <span style={{ fontSize: 16, fontWeight: 600, color: t.accent }}>{repo.name}</span>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); window.open(repo.html_url, \"_blank\"); }}\r\n style={{\r\n fontSize: 11, padding: \"2px 8px\", borderRadius: 6, cursor: \"pointer\",\r\n border: `1px solid ${t.border}`, background: \"transparent\", color: t.textMuted,\r\n }}\r\n >\r\n GitHub →\r\n </button>\r\n </div>\r\n <p style={{ fontSize: 13, color: t.textSecondary, margin: \"0 0 12px\", lineHeight: 1.5, minHeight: 40 }}>\r\n {repo.description || \"No description\"}\r\n </p>\r\n <div style={{ display: \"flex\", gap: 12, fontSize: 12, color: t.textMuted }}>\r\n {langColor && (\r\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\r\n <span style={{ width: 10, height: 10, borderRadius: \"50%\", background: langColor, display: \"inline-block\" }} />\r\n {repo.language}\r\n </span>\r\n )}\r\n {repo.stargazers_count > 0 && <span>★ {repo.stargazers_count}</span>}\r\n {repo.forks_count > 0 && <span>Fork {repo.forks_count}</span>}\r\n <span>{date}</span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ---------- RepoDetail ---------- */\r\n\r\nfunction RepoDetail({ org, repo, token, t, themeName, onBack }: { org: string; repo: Repo; token?: string; t: Theme; themeName: string; onBack: () => void }) {\r\n const [tab, setTab] = useState<\"readme\" | \"demo\">(\"readme\");\r\n const [readme, setReadme] = useState<string | null>(null);\r\n const [snippets, setSnippets] = useState<DemoSnippet[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n\r\n useEffect(() => {\r\n Promise.all([\r\n fetchReadme(org, repo.name, token),\r\n fetchDemoSnippets(org, repo.name, undefined, token),\r\n ]).then(([md, s]) => {\r\n setReadme(md);\r\n setSnippets(s);\r\n setLoading(false);\r\n });\r\n }, [org, repo.name, token]);\r\n\r\n return (\r\n <div data-theme={themeName} style={{ background: t.bg, color: t.text, fontFamily: \"system-ui, -apple-system, sans-serif\", padding: 24 }}>\r\n {/* Back */}\r\n <button\r\n onClick={onBack}\r\n style={{\r\n background: \"transparent\", border: \"none\", color: t.accent,\r\n cursor: \"pointer\", fontSize: 14, padding: 0, marginBottom: 16,\r\n }}\r\n >\r\n ← Back\r\n </button>\r\n\r\n {/* Header */}\r\n <div style={{ background: t.bgCard, border: `1px solid ${t.border}`, borderRadius: 12, padding: 24, marginBottom: 16 }}>\r\n <div style={{ display: \"flex\", justifyContent: \"space-between\", flexWrap: \"wrap\", gap: 16 }}>\r\n <div>\r\n <h1 style={{ fontSize: 22, fontWeight: 700, margin: 0 }}>{repo.name}</h1>\r\n <p style={{ color: t.textSecondary, fontSize: 14, margin: \"8px 0\" }}>{repo.description || \"No description\"}</p>\r\n </div>\r\n <a\r\n href={repo.html_url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n style={{\r\n display: \"inline-flex\", alignItems: \"center\", gap: 8,\r\n padding: \"8px 16px\", borderRadius: 8, fontSize: 14, fontWeight: 500,\r\n background: t.accent, color: \"#fff\", textDecoration: \"none\",\r\n height: \"fit-content\",\r\n }}\r\n >\r\n View on GitHub\r\n </a>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div style={{ display: \"flex\", gap: 4, borderBottom: `1px solid ${t.border}`, marginBottom: 16 }}>\r\n {([\"readme\", ...(snippets.length > 0 ? [\"demo\"] : [])] as const).map((key) => (\r\n <button\r\n key={key}\r\n onClick={() => setTab(key as typeof tab)}\r\n style={{\r\n padding: \"10px 16px\", fontSize: 14, fontWeight: 500, cursor: \"pointer\",\r\n background: \"transparent\", border: \"none\",\r\n color: tab === key ? t.accentLight : t.textMuted,\r\n borderBottom: tab === key ? `2px solid ${t.accent}` : \"2px solid transparent\",\r\n }}\r\n >\r\n {key === \"readme\" ? \"README\" : \"Demo\"}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Content */}\r\n <div style={{ background: t.bgCard, border: `1px solid ${t.border}`, borderRadius: 12, padding: 24 }}>\r\n {loading ? (\r\n <div style={{ textAlign: \"center\", padding: 40, color: t.textMuted }}>Loading...</div>\r\n ) : tab === \"readme\" ? (\r\n <ReadmeView org={org} repoName={repo.name} content={readme} t={t} />\r\n ) : (\r\n <DemoView snippets={snippets} t={t} />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ---------- DemoView ---------- */\r\n\r\nfunction DemoView({ snippets, t }: { snippets: DemoSnippet[]; t: Theme }) {\r\n const [idx, setIdx] = useState(0);\r\n const snippet = snippets[idx];\r\n\r\n if (!snippet) return null;\r\n\r\n return (\r\n <div>\r\n {snippets.length > 1 && (\r\n <div style={{ display: \"flex\", gap: 6, marginBottom: 12, flexWrap: \"wrap\" }}>\r\n {snippets.map((s, i) => (\r\n <button\r\n key={i}\r\n onClick={() => setIdx(i)}\r\n style={{\r\n padding: \"4px 12px\", borderRadius: 99, fontSize: 12, cursor: \"pointer\",\r\n background: i === idx ? t.accentGlow : t.bgBadge,\r\n color: i === idx ? t.accent : t.textBadge,\r\n border: `1px solid ${i === idx ? t.accent : t.border}`,\r\n }}\r\n >\r\n {s.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n <pre\r\n style={{\r\n background: t.bg, border: `1px solid ${t.border}`, borderRadius: 8,\r\n padding: 16, fontSize: 13, lineHeight: 1.6, overflow: \"auto\",\r\n color: t.textSecondary, margin: 0,\r\n }}\r\n >\r\n <code>{snippet.code}</code>\r\n </pre>\r\n {snippet.expectedOutput && (\r\n <div style={{ marginTop: 12 }}>\r\n <span style={{ fontSize: 12, color: t.textMuted }}>Expected Output:</span>\r\n <pre\r\n style={{\r\n background: t.bg, border: `1px solid ${t.border}`, borderRadius: 8,\r\n padding: 12, fontSize: 12, color: t.textMuted, margin: \"4px 0 0\",\r\n }}\r\n >\r\n {snippet.expectedOutput}\r\n </pre>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { Repo, DemoSnippet } from \"./types\";\r\n\r\nconst API = \"https://api.github.com\";\r\n\r\nfunction headers(token?: string): HeadersInit {\r\n const h: Record<string, string> = { Accept: \"application/vnd.github.v3+json\" };\r\n if (token) h.Authorization = `Bearer ${token}`;\r\n return h;\r\n}\r\n\r\nexport async function fetchRepos(org: string, token?: string): Promise<Repo[]> {\r\n try {\r\n const res = await fetch(`${API}/orgs/${org}/repos?per_page=100&sort=updated`, {\r\n headers: headers(token),\r\n });\r\n if (!res.ok) return [];\r\n return res.json();\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nexport async function fetchReadme(org: string, repo: string, token?: string): Promise<string | null> {\r\n try {\r\n const res = await fetch(`${API}/repos/${org}/${repo}/readme`, {\r\n headers: { ...headers(token), Accept: \"application/vnd.github.v3.raw\" },\r\n });\r\n if (!res.ok) return null;\r\n return res.text();\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport async function fetchDemoSnippets(\r\n org: string,\r\n repo: string,\r\n readme?: string | null,\r\n token?: string,\r\n): Promise<DemoSnippet[]> {\r\n // 1. demo.json\r\n for (const path of [\".xgen-gallery/demo.json\", \"demo.json\"]) {\r\n try {\r\n const res = await fetch(`${API}/repos/${org}/${repo}/contents/${path}`, {\r\n headers: { ...headers(token), Accept: \"application/vnd.github.v3.raw\" },\r\n });\r\n if (!res.ok) continue;\r\n const data = await res.json();\r\n if (data.snippets?.length) return data.snippets;\r\n } catch {\r\n continue;\r\n }\r\n }\r\n\r\n // 2. examples/\r\n try {\r\n const res = await fetch(`${API}/repos/${org}/${repo}/contents/examples`, {\r\n headers: headers(token),\r\n });\r\n if (res.ok) {\r\n const files: { name: string; download_url: string }[] = await res.json();\r\n const pyFiles = files.filter((f) => f.name.endsWith(\".py\")).slice(0, 5);\r\n const snippets: DemoSnippet[] = [];\r\n for (const f of pyFiles) {\r\n try {\r\n const r = await fetch(f.download_url);\r\n if (r.ok) {\r\n const code = await r.text();\r\n snippets.push({ label: f.name.replace(/\\.py$/, \"\").replace(/[_-]/g, \" \"), code: code.trim() });\r\n }\r\n } catch { continue; }\r\n }\r\n if (snippets.length) return snippets;\r\n }\r\n } catch { /* ignore */ }\r\n\r\n // 3. README python blocks\r\n let md = readme;\r\n if (!md) md = await fetchReadme(org, repo, token);\r\n if (md) {\r\n const blocks = extractPythonBlocks(md);\r\n if (blocks.length) return blocks;\r\n }\r\n\r\n return [];\r\n}\r\n\r\nfunction extractPythonBlocks(readme: string): DemoSnippet[] {\r\n const snippets: DemoSnippet[] = [];\r\n const lines = readme.split(\"\\n\");\r\n let i = 0;\r\n while (i < lines.length) {\r\n if (/^```(?:python|py)\\s*$/i.test(lines[i].trim())) {\r\n let label = \"\";\r\n for (let j = i - 1; j >= Math.max(0, i - 5); j--) {\r\n const prev = lines[j].trim();\r\n if (/^#{1,4}\\s+/.test(prev)) { label = prev.replace(/^#+\\s+/, \"\"); break; }\r\n if (prev && !label) label = prev;\r\n }\r\n const codeLines: string[] = [];\r\n i++;\r\n while (i < lines.length && !lines[i].trim().startsWith(\"```\")) { codeLines.push(lines[i]); i++; }\r\n const code = codeLines.join(\"\\n\").trim();\r\n if (code && code.split(\"\\n\").length >= 2 && !code.startsWith(\"pip \") && !code.startsWith(\"$ pip\")) {\r\n snippets.push({ label: label || `Example ${snippets.length + 1}`, code });\r\n }\r\n }\r\n i++;\r\n }\r\n return snippets;\r\n}\r\n","export const themes = {\r\n dark: {\r\n bg: \"#0a0a0f\",\r\n bgCard: \"#12121a\",\r\n bgCardHover: \"#1a1a25\",\r\n border: \"#1e1e2e\",\r\n text: \"#e8e8f0\",\r\n textSecondary: \"#a0a0b8\",\r\n textMuted: \"#6b6b80\",\r\n accent: \"#6c63ff\",\r\n accentLight: \"#8b83ff\",\r\n accentGlow: \"rgba(108,99,255,0.15)\",\r\n shadowHover: \"0 0 20px rgba(108,99,255,0.2)\",\r\n bgBadge: \"rgba(108,99,255,0.15)\",\r\n textBadge: \"#a0a0b8\",\r\n },\r\n light: {\r\n bg: \"#f8fafc\",\r\n bgCard: \"#ffffff\",\r\n bgCardHover: \"#ffffff\",\r\n border: \"rgba(0,0,0,0.08)\",\r\n text: \"#1e293b\",\r\n textSecondary: \"#4b5563\",\r\n textMuted: \"#6b7280\",\r\n accent: \"#2563eb\",\r\n accentLight: \"#2563eb\",\r\n accentGlow: \"rgba(37,99,235,0.08)\",\r\n shadowHover: \"0 8px 20px rgba(0,0,0,0.08)\",\r\n bgBadge: \"#f1f5f9\",\r\n textBadge: \"#475569\",\r\n },\r\n};\r\n\r\nexport type Theme = {\r\n bg: string; bgCard: string; bgCardHover: string; border: string;\r\n text: string; textSecondary: string; textMuted: string;\r\n accent: string; accentLight: string; accentGlow: string;\r\n shadowHover: string; bgBadge: string; textBadge: string;\r\n};\r\n\r\nexport const LANG_COLORS: Record<string, string> = {\r\n Python: \"#3572A5\",\r\n TypeScript: \"#3178c6\",\r\n JavaScript: \"#f1e05a\",\r\n Rust: \"#dea584\",\r\n HTML: \"#e34c26\",\r\n CSS: \"#563d7c\",\r\n Go: \"#00ADD8\",\r\n Shell: \"#89e051\",\r\n Java: \"#b07219\",\r\n \"C++\": \"#f34b7d\",\r\n C: \"#555555\",\r\n Ruby: \"#701516\",\r\n};\r\n","import ReactMarkdown from \"react-markdown\";\r\nimport remarkGfm from \"remark-gfm\";\r\nimport rehypeRaw from \"rehype-raw\";\r\nimport type { Theme } from \"./styles\";\r\n\r\nexport function ReadmeView({\r\n org,\r\n repoName,\r\n content,\r\n t,\r\n}: {\r\n org: string;\r\n repoName: string;\r\n content: string | null;\r\n t: Theme;\r\n}) {\r\n if (!content) {\r\n return <div style={{ textAlign: \"center\", padding: 40, color: t.textMuted }}>README not found</div>;\r\n }\r\n\r\n return (\r\n <div className=\"xgen-markdown\" style={{ color: t.text, lineHeight: 1.7, fontSize: 14 }}>\r\n <style>{markdownStyles(t)}</style>\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeRaw]}\r\n components={{\r\n img: ({ src, alt, ...props }) => {\r\n let resolved = src;\r\n if (typeof src === \"string\" && !src.startsWith(\"http\")) {\r\n resolved = `https://raw.githubusercontent.com/${org}/${repoName}/main/${src}`;\r\n }\r\n return <img src={resolved} alt={alt || \"\"} style={{ maxWidth: \"100%\" }} {...props} />;\r\n },\r\n a: ({ href, children, ...props }) => (\r\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: t.accentLight }} {...props}>\r\n {children}\r\n </a>\r\n ),\r\n code: ({ children, className, ...props }) => {\r\n const isBlock = className?.includes(\"language-\");\r\n if (isBlock) {\r\n return (\r\n <code\r\n style={{\r\n display: \"block\", background: t.bg, padding: 16, borderRadius: 8,\r\n overflow: \"auto\", fontSize: 13, lineHeight: 1.6,\r\n }}\r\n {...props}\r\n >\r\n {children}\r\n </code>\r\n );\r\n }\r\n return (\r\n <code style={{ background: t.accentGlow, padding: \"2px 6px\", borderRadius: 4, fontSize: 13 }} {...props}>\r\n {children}\r\n </code>\r\n );\r\n },\r\n }}\r\n >\r\n {content}\r\n </ReactMarkdown>\r\n </div>\r\n );\r\n}\r\n\r\nfunction markdownStyles(t: Theme): string {\r\n return `\r\n .xgen-markdown h1, .xgen-markdown h2, .xgen-markdown h3 { color: ${t.text}; margin: 1.2em 0 0.5em; }\r\n .xgen-markdown h1 { font-size: 1.8em; border-bottom: 1px solid ${t.border}; padding-bottom: 8px; }\r\n .xgen-markdown h2 { font-size: 1.4em; border-bottom: 1px solid ${t.border}; padding-bottom: 6px; }\r\n .xgen-markdown h3 { font-size: 1.15em; }\r\n .xgen-markdown p { margin: 0.8em 0; }\r\n .xgen-markdown ul, .xgen-markdown ol { padding-left: 24px; }\r\n .xgen-markdown li { margin: 4px 0; }\r\n .xgen-markdown pre { background: ${t.bg}; border: 1px solid ${t.border}; border-radius: 8px; padding: 16px; overflow: auto; margin: 12px 0; }\r\n .xgen-markdown blockquote { border-left: 3px solid ${t.accent}; padding-left: 12px; color: ${t.textSecondary}; margin: 12px 0; }\r\n .xgen-markdown table { border-collapse: collapse; width: 100%; margin: 12px 0; }\r\n .xgen-markdown th, .xgen-markdown td { border: 1px solid ${t.border}; padding: 8px 12px; text-align: left; }\r\n .xgen-markdown th { background: ${t.bgCard}; font-weight: 600; }\r\n .xgen-markdown hr { border: none; border-top: 1px solid ${t.border}; margin: 16px 0; }\r\n `;\r\n}\r\n"],"mappings":"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","names":["ReactMarkdown","remarkGfm","rehypeRaw","import_jsx_runtime"]}
package/dist/index.mjs CHANGED
@@ -117,19 +117,25 @@ var themes = {
117
117
  textMuted: "#6b6b80",
118
118
  accent: "#6c63ff",
119
119
  accentLight: "#8b83ff",
120
- accentGlow: "rgba(108,99,255,0.15)"
120
+ accentGlow: "rgba(108,99,255,0.15)",
121
+ shadowHover: "0 0 20px rgba(108,99,255,0.2)",
122
+ bgBadge: "rgba(108,99,255,0.15)",
123
+ textBadge: "#a0a0b8"
121
124
  },
122
125
  light: {
123
- bg: "#f8f9fa",
126
+ bg: "#f8fafc",
124
127
  bgCard: "#ffffff",
125
- bgCardHover: "#f0f0f5",
126
- border: "#e0e0e8",
127
- text: "#1a1a2e",
128
- textSecondary: "#4a4a5a",
129
- textMuted: "#8a8a9a",
130
- accent: "#5b52e0",
131
- accentLight: "#5b52e0",
132
- accentGlow: "rgba(91,82,224,0.1)"
128
+ bgCardHover: "#ffffff",
129
+ border: "rgba(0,0,0,0.08)",
130
+ text: "#1e293b",
131
+ textSecondary: "#4b5563",
132
+ textMuted: "#6b7280",
133
+ accent: "#2563eb",
134
+ accentLight: "#2563eb",
135
+ accentGlow: "rgba(37,99,235,0.08)",
136
+ shadowHover: "0 8px 20px rgba(0,0,0,0.08)",
137
+ bgBadge: "#f1f5f9",
138
+ textBadge: "#475569"
133
139
  }
134
140
  };
135
141
  var LANG_COLORS = {
@@ -255,9 +261,9 @@ function XgenGallery({ org, token, theme: themeName = "dark", limit, onRepoClick
255
261
  }
256
262
  }, [onRepoClick]);
257
263
  if (view.type === "detail") {
258
- return /* @__PURE__ */ jsx2(RepoDetail, { org, repo: view.repo, token, t, onBack: () => setView({ type: "list" }) });
264
+ return /* @__PURE__ */ jsx2(RepoDetail, { org, repo: view.repo, token, t, themeName, onBack: () => setView({ type: "list" }) });
259
265
  }
260
- return /* @__PURE__ */ jsxs2("div", { style: { background: t.bg, color: t.text, fontFamily: "system-ui, -apple-system, sans-serif", padding: 24 }, children: [
266
+ return /* @__PURE__ */ jsxs2("div", { "data-theme": themeName, style: { background: t.bg, color: t.text, fontFamily: "system-ui, -apple-system, sans-serif", padding: 24 }, children: [
261
267
  /* @__PURE__ */ jsxs2("div", { style: { marginBottom: 24 }, children: [
262
268
  /* @__PURE__ */ jsx2("h2", { style: { fontSize: 24, fontWeight: 700, margin: 0 }, children: org }),
263
269
  /* @__PURE__ */ jsxs2("p", { style: { color: t.textMuted, fontSize: 14, margin: "4px 0 0" }, children: [
@@ -295,8 +301,8 @@ function XgenGallery({ org, token, theme: themeName = "dark", limit, onRepoClick
295
301
  fontSize: 12,
296
302
  fontWeight: 500,
297
303
  cursor: "pointer",
298
- background: !lang ? t.accent : "transparent",
299
- color: !lang ? "#fff" : t.textMuted,
304
+ background: !lang ? t.accent : t.bgBadge,
305
+ color: !lang ? "#fff" : t.textBadge,
300
306
  border: `1px solid ${!lang ? t.accent : t.border}`
301
307
  },
302
308
  children: "All"
@@ -312,8 +318,8 @@ function XgenGallery({ org, token, theme: themeName = "dark", limit, onRepoClick
312
318
  fontSize: 12,
313
319
  fontWeight: 500,
314
320
  cursor: "pointer",
315
- background: lang === l ? t.accent : "transparent",
316
- color: lang === l ? "#fff" : t.textMuted,
321
+ background: lang === l ? t.accent : t.bgBadge,
322
+ color: lang === l ? "#fff" : t.textBadge,
317
323
  border: `1px solid ${lang === l ? t.accent : t.border}`
318
324
  },
319
325
  children: l
@@ -342,12 +348,12 @@ function RepoCard({ repo, t, onClick }) {
342
348
  padding: 20,
343
349
  cursor: "pointer",
344
350
  transform: hover ? "translateY(-2px)" : "none",
345
- boxShadow: hover ? `0 0 20px ${t.accentGlow}` : "none",
351
+ boxShadow: hover ? t.shadowHover : "none",
346
352
  transition: "all 0.2s"
347
353
  },
348
354
  children: [
349
355
  /* @__PURE__ */ jsxs2("div", { style: { display: "flex", justifyContent: "space-between", marginBottom: 8 }, children: [
350
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 16, fontWeight: 600, color: t.accentLight }, children: repo.name }),
356
+ /* @__PURE__ */ jsx2("span", { style: { fontSize: 16, fontWeight: 600, color: t.accent }, children: repo.name }),
351
357
  /* @__PURE__ */ jsx2(
352
358
  "button",
353
359
  {
@@ -388,7 +394,7 @@ function RepoCard({ repo, t, onClick }) {
388
394
  }
389
395
  );
390
396
  }
391
- function RepoDetail({ org, repo, token, t, onBack }) {
397
+ function RepoDetail({ org, repo, token, t, themeName, onBack }) {
392
398
  const [tab, setTab] = useState("readme");
393
399
  const [readme, setReadme] = useState(null);
394
400
  const [snippets, setSnippets] = useState([]);
@@ -403,7 +409,7 @@ function RepoDetail({ org, repo, token, t, onBack }) {
403
409
  setLoading(false);
404
410
  });
405
411
  }, [org, repo.name, token]);
406
- return /* @__PURE__ */ jsxs2("div", { style: { background: t.bg, color: t.text, fontFamily: "system-ui, -apple-system, sans-serif", padding: 24 }, children: [
412
+ return /* @__PURE__ */ jsxs2("div", { "data-theme": themeName, style: { background: t.bg, color: t.text, fontFamily: "system-ui, -apple-system, sans-serif", padding: 24 }, children: [
407
413
  /* @__PURE__ */ jsx2(
408
414
  "button",
409
415
  {
@@ -411,7 +417,7 @@ function RepoDetail({ org, repo, token, t, onBack }) {
411
417
  style: {
412
418
  background: "transparent",
413
419
  border: "none",
414
- color: t.accentLight,
420
+ color: t.accent,
415
421
  cursor: "pointer",
416
422
  fontSize: 14,
417
423
  padding: 0,
@@ -483,8 +489,8 @@ function DemoView({ snippets, t }) {
483
489
  borderRadius: 99,
484
490
  fontSize: 12,
485
491
  cursor: "pointer",
486
- background: i === idx ? t.accentGlow : "transparent",
487
- color: i === idx ? t.accentLight : t.textMuted,
492
+ background: i === idx ? t.accentGlow : t.bgBadge,
493
+ color: i === idx ? t.accent : t.textBadge,
488
494
  border: `1px solid ${i === idx ? t.accent : t.border}`
489
495
  },
490
496
  children: s.label
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/XgenGallery.tsx","../src/api.ts","../src/styles.ts","../src/ReadmeView.tsx"],"sourcesContent":["import { useEffect, useState, useCallback } from \"react\";\r\nimport type { Repo, GalleryProps, DemoSnippet } from \"./types\";\r\nimport { fetchRepos, fetchReadme, fetchDemoSnippets } from \"./api\";\r\nimport { themes, LANG_COLORS, Theme } from \"./styles\";\r\nimport { ReadmeView } from \"./ReadmeView\";\r\n\r\ntype View = { type: \"list\" } | { type: \"detail\"; repo: Repo };\r\n\r\nexport function XgenGallery({ org, token, theme: themeName = \"dark\", limit, onRepoClick }: GalleryProps) {\r\n const t = themes[themeName];\r\n const [repos, setRepos] = useState<Repo[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState(\"\");\r\n const [lang, setLang] = useState<string | null>(null);\r\n const [view, setView] = useState<View>({ type: \"list\" });\r\n\r\n useEffect(() => {\r\n fetchRepos(org, token).then((data) => {\r\n setRepos(limit ? data.slice(0, limit) : data);\r\n setLoading(false);\r\n });\r\n }, [org, token, limit]);\r\n\r\n const languages = [...new Set(repos.map((r) => r.language).filter(Boolean))] as string[];\r\n\r\n const filtered = repos.filter((r) => {\r\n if (lang && r.language !== lang) return false;\r\n if (search) {\r\n const q = search.toLowerCase();\r\n return r.name.toLowerCase().includes(q) || (r.description || \"\").toLowerCase().includes(q);\r\n }\r\n return true;\r\n });\r\n\r\n const handleCardClick = useCallback((repo: Repo) => {\r\n if (onRepoClick) {\r\n onRepoClick(repo);\r\n } else {\r\n setView({ type: \"detail\", repo });\r\n }\r\n }, [onRepoClick]);\r\n\r\n if (view.type === \"detail\") {\r\n return <RepoDetail org={org} repo={view.repo} token={token} t={t} onBack={() => setView({ type: \"list\" })} />;\r\n }\r\n\r\n return (\r\n <div style={{ background: t.bg, color: t.text, fontFamily: \"system-ui, -apple-system, sans-serif\", padding: 24 }}>\r\n {/* Header */}\r\n <div style={{ marginBottom: 24 }}>\r\n <h2 style={{ fontSize: 24, fontWeight: 700, margin: 0 }}>{org}</h2>\r\n <p style={{ color: t.textMuted, fontSize: 14, margin: \"4px 0 0\" }}>\r\n {repos.length} repositories\r\n </p>\r\n </div>\r\n\r\n {/* Search + Filter */}\r\n <div style={{ display: \"flex\", gap: 8, flexWrap: \"wrap\", marginBottom: 16 }}>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n style={{\r\n background: t.bgCard, border: `1px solid ${t.border}`, borderRadius: 8,\r\n padding: \"8px 12px\", color: t.text, fontSize: 14, outline: \"none\", flex: \"1 1 200px\",\r\n }}\r\n />\r\n <button\r\n onClick={() => setLang(null)}\r\n style={{\r\n padding: \"6px 12px\", borderRadius: 8, fontSize: 12, fontWeight: 500, cursor: \"pointer\",\r\n background: !lang ? t.accent : \"transparent\",\r\n color: !lang ? \"#fff\" : t.textMuted,\r\n border: `1px solid ${!lang ? t.accent : t.border}`,\r\n }}\r\n >\r\n All\r\n </button>\r\n {languages.map((l) => (\r\n <button\r\n key={l}\r\n onClick={() => setLang(lang === l ? null : l)}\r\n style={{\r\n padding: \"6px 12px\", borderRadius: 8, fontSize: 12, fontWeight: 500, cursor: \"pointer\",\r\n background: lang === l ? t.accent : \"transparent\",\r\n color: lang === l ? \"#fff\" : t.textMuted,\r\n border: `1px solid ${lang === l ? t.accent : t.border}`,\r\n }}\r\n >\r\n {l}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Grid */}\r\n {loading ? (\r\n <div style={{ textAlign: \"center\", padding: 60, color: t.textMuted }}>Loading...</div>\r\n ) : (\r\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(auto-fill, minmax(300px, 1fr))\", gap: 16 }}>\r\n {filtered.map((repo) => (\r\n <RepoCard key={repo.name} repo={repo} t={t} onClick={() => handleCardClick(repo)} />\r\n ))}\r\n </div>\r\n )}\r\n {!loading && filtered.length === 0 && (\r\n <div style={{ textAlign: \"center\", padding: 60, color: t.textMuted }}>No results</div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/* ---------- RepoCard ---------- */\r\n\r\nfunction RepoCard({ repo, t, onClick }: { repo: Repo; t: Theme; onClick: () => void }) {\r\n const [hover, setHover] = useState(false);\r\n const langColor = repo.language ? LANG_COLORS[repo.language] || \"#888\" : null;\r\n const date = new Date(repo.updated_at).toLocaleDateString(\"ko-KR\", { year: \"numeric\", month: \"short\", day: \"numeric\" });\r\n\r\n return (\r\n <div\r\n onClick={onClick}\r\n onMouseEnter={() => setHover(true)}\r\n onMouseLeave={() => setHover(false)}\r\n style={{\r\n background: hover ? t.bgCardHover : t.bgCard,\r\n border: `1px solid ${hover ? t.accent : t.border}`,\r\n borderRadius: 12, padding: 20, cursor: \"pointer\",\r\n transform: hover ? \"translateY(-2px)\" : \"none\",\r\n boxShadow: hover ? `0 0 20px ${t.accentGlow}` : \"none\",\r\n transition: \"all 0.2s\",\r\n }}\r\n >\r\n <div style={{ display: \"flex\", justifyContent: \"space-between\", marginBottom: 8 }}>\r\n <span style={{ fontSize: 16, fontWeight: 600, color: t.accentLight }}>{repo.name}</span>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); window.open(repo.html_url, \"_blank\"); }}\r\n style={{\r\n fontSize: 11, padding: \"2px 8px\", borderRadius: 6, cursor: \"pointer\",\r\n border: `1px solid ${t.border}`, background: \"transparent\", color: t.textMuted,\r\n }}\r\n >\r\n GitHub →\r\n </button>\r\n </div>\r\n <p style={{ fontSize: 13, color: t.textSecondary, margin: \"0 0 12px\", lineHeight: 1.5, minHeight: 40 }}>\r\n {repo.description || \"No description\"}\r\n </p>\r\n <div style={{ display: \"flex\", gap: 12, fontSize: 12, color: t.textMuted }}>\r\n {langColor && (\r\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\r\n <span style={{ width: 10, height: 10, borderRadius: \"50%\", background: langColor, display: \"inline-block\" }} />\r\n {repo.language}\r\n </span>\r\n )}\r\n {repo.stargazers_count > 0 && <span>★ {repo.stargazers_count}</span>}\r\n {repo.forks_count > 0 && <span>Fork {repo.forks_count}</span>}\r\n <span>{date}</span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ---------- RepoDetail ---------- */\r\n\r\nfunction RepoDetail({ org, repo, token, t, onBack }: { org: string; repo: Repo; token?: string; t: Theme; onBack: () => void }) {\r\n const [tab, setTab] = useState<\"readme\" | \"demo\">(\"readme\");\r\n const [readme, setReadme] = useState<string | null>(null);\r\n const [snippets, setSnippets] = useState<DemoSnippet[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n\r\n useEffect(() => {\r\n Promise.all([\r\n fetchReadme(org, repo.name, token),\r\n fetchDemoSnippets(org, repo.name, undefined, token),\r\n ]).then(([md, s]) => {\r\n setReadme(md);\r\n setSnippets(s);\r\n setLoading(false);\r\n });\r\n }, [org, repo.name, token]);\r\n\r\n return (\r\n <div style={{ background: t.bg, color: t.text, fontFamily: \"system-ui, -apple-system, sans-serif\", padding: 24 }}>\r\n {/* Back */}\r\n <button\r\n onClick={onBack}\r\n style={{\r\n background: \"transparent\", border: \"none\", color: t.accentLight,\r\n cursor: \"pointer\", fontSize: 14, padding: 0, marginBottom: 16,\r\n }}\r\n >\r\n ← Back\r\n </button>\r\n\r\n {/* Header */}\r\n <div style={{ background: t.bgCard, border: `1px solid ${t.border}`, borderRadius: 12, padding: 24, marginBottom: 16 }}>\r\n <div style={{ display: \"flex\", justifyContent: \"space-between\", flexWrap: \"wrap\", gap: 16 }}>\r\n <div>\r\n <h1 style={{ fontSize: 22, fontWeight: 700, margin: 0 }}>{repo.name}</h1>\r\n <p style={{ color: t.textSecondary, fontSize: 14, margin: \"8px 0\" }}>{repo.description || \"No description\"}</p>\r\n </div>\r\n <a\r\n href={repo.html_url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n style={{\r\n display: \"inline-flex\", alignItems: \"center\", gap: 8,\r\n padding: \"8px 16px\", borderRadius: 8, fontSize: 14, fontWeight: 500,\r\n background: t.accent, color: \"#fff\", textDecoration: \"none\",\r\n height: \"fit-content\",\r\n }}\r\n >\r\n View on GitHub\r\n </a>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div style={{ display: \"flex\", gap: 4, borderBottom: `1px solid ${t.border}`, marginBottom: 16 }}>\r\n {([\"readme\", ...(snippets.length > 0 ? [\"demo\"] : [])] as const).map((key) => (\r\n <button\r\n key={key}\r\n onClick={() => setTab(key as typeof tab)}\r\n style={{\r\n padding: \"10px 16px\", fontSize: 14, fontWeight: 500, cursor: \"pointer\",\r\n background: \"transparent\", border: \"none\",\r\n color: tab === key ? t.accentLight : t.textMuted,\r\n borderBottom: tab === key ? `2px solid ${t.accent}` : \"2px solid transparent\",\r\n }}\r\n >\r\n {key === \"readme\" ? \"README\" : \"Demo\"}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Content */}\r\n <div style={{ background: t.bgCard, border: `1px solid ${t.border}`, borderRadius: 12, padding: 24 }}>\r\n {loading ? (\r\n <div style={{ textAlign: \"center\", padding: 40, color: t.textMuted }}>Loading...</div>\r\n ) : tab === \"readme\" ? (\r\n <ReadmeView org={org} repoName={repo.name} content={readme} t={t} />\r\n ) : (\r\n <DemoView snippets={snippets} t={t} />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ---------- DemoView ---------- */\r\n\r\nfunction DemoView({ snippets, t }: { snippets: DemoSnippet[]; t: Theme }) {\r\n const [idx, setIdx] = useState(0);\r\n const snippet = snippets[idx];\r\n\r\n if (!snippet) return null;\r\n\r\n return (\r\n <div>\r\n {snippets.length > 1 && (\r\n <div style={{ display: \"flex\", gap: 6, marginBottom: 12, flexWrap: \"wrap\" }}>\r\n {snippets.map((s, i) => (\r\n <button\r\n key={i}\r\n onClick={() => setIdx(i)}\r\n style={{\r\n padding: \"4px 12px\", borderRadius: 99, fontSize: 12, cursor: \"pointer\",\r\n background: i === idx ? t.accentGlow : \"transparent\",\r\n color: i === idx ? t.accentLight : t.textMuted,\r\n border: `1px solid ${i === idx ? t.accent : t.border}`,\r\n }}\r\n >\r\n {s.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n <pre\r\n style={{\r\n background: t.bg, border: `1px solid ${t.border}`, borderRadius: 8,\r\n padding: 16, fontSize: 13, lineHeight: 1.6, overflow: \"auto\",\r\n color: t.textSecondary, margin: 0,\r\n }}\r\n >\r\n <code>{snippet.code}</code>\r\n </pre>\r\n {snippet.expectedOutput && (\r\n <div style={{ marginTop: 12 }}>\r\n <span style={{ fontSize: 12, color: t.textMuted }}>Expected Output:</span>\r\n <pre\r\n style={{\r\n background: t.bg, border: `1px solid ${t.border}`, borderRadius: 8,\r\n padding: 12, fontSize: 12, color: t.textMuted, margin: \"4px 0 0\",\r\n }}\r\n >\r\n {snippet.expectedOutput}\r\n </pre>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { Repo, DemoSnippet } from \"./types\";\r\n\r\nconst API = \"https://api.github.com\";\r\n\r\nfunction headers(token?: string): HeadersInit {\r\n const h: Record<string, string> = { Accept: \"application/vnd.github.v3+json\" };\r\n if (token) h.Authorization = `Bearer ${token}`;\r\n return h;\r\n}\r\n\r\nexport async function fetchRepos(org: string, token?: string): Promise<Repo[]> {\r\n try {\r\n const res = await fetch(`${API}/orgs/${org}/repos?per_page=100&sort=updated`, {\r\n headers: headers(token),\r\n });\r\n if (!res.ok) return [];\r\n return res.json();\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nexport async function fetchReadme(org: string, repo: string, token?: string): Promise<string | null> {\r\n try {\r\n const res = await fetch(`${API}/repos/${org}/${repo}/readme`, {\r\n headers: { ...headers(token), Accept: \"application/vnd.github.v3.raw\" },\r\n });\r\n if (!res.ok) return null;\r\n return res.text();\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport async function fetchDemoSnippets(\r\n org: string,\r\n repo: string,\r\n readme?: string | null,\r\n token?: string,\r\n): Promise<DemoSnippet[]> {\r\n // 1. demo.json\r\n for (const path of [\".xgen-gallery/demo.json\", \"demo.json\"]) {\r\n try {\r\n const res = await fetch(`${API}/repos/${org}/${repo}/contents/${path}`, {\r\n headers: { ...headers(token), Accept: \"application/vnd.github.v3.raw\" },\r\n });\r\n if (!res.ok) continue;\r\n const data = await res.json();\r\n if (data.snippets?.length) return data.snippets;\r\n } catch {\r\n continue;\r\n }\r\n }\r\n\r\n // 2. examples/\r\n try {\r\n const res = await fetch(`${API}/repos/${org}/${repo}/contents/examples`, {\r\n headers: headers(token),\r\n });\r\n if (res.ok) {\r\n const files: { name: string; download_url: string }[] = await res.json();\r\n const pyFiles = files.filter((f) => f.name.endsWith(\".py\")).slice(0, 5);\r\n const snippets: DemoSnippet[] = [];\r\n for (const f of pyFiles) {\r\n try {\r\n const r = await fetch(f.download_url);\r\n if (r.ok) {\r\n const code = await r.text();\r\n snippets.push({ label: f.name.replace(/\\.py$/, \"\").replace(/[_-]/g, \" \"), code: code.trim() });\r\n }\r\n } catch { continue; }\r\n }\r\n if (snippets.length) return snippets;\r\n }\r\n } catch { /* ignore */ }\r\n\r\n // 3. README python blocks\r\n let md = readme;\r\n if (!md) md = await fetchReadme(org, repo, token);\r\n if (md) {\r\n const blocks = extractPythonBlocks(md);\r\n if (blocks.length) return blocks;\r\n }\r\n\r\n return [];\r\n}\r\n\r\nfunction extractPythonBlocks(readme: string): DemoSnippet[] {\r\n const snippets: DemoSnippet[] = [];\r\n const lines = readme.split(\"\\n\");\r\n let i = 0;\r\n while (i < lines.length) {\r\n if (/^```(?:python|py)\\s*$/i.test(lines[i].trim())) {\r\n let label = \"\";\r\n for (let j = i - 1; j >= Math.max(0, i - 5); j--) {\r\n const prev = lines[j].trim();\r\n if (/^#{1,4}\\s+/.test(prev)) { label = prev.replace(/^#+\\s+/, \"\"); break; }\r\n if (prev && !label) label = prev;\r\n }\r\n const codeLines: string[] = [];\r\n i++;\r\n while (i < lines.length && !lines[i].trim().startsWith(\"```\")) { codeLines.push(lines[i]); i++; }\r\n const code = codeLines.join(\"\\n\").trim();\r\n if (code && code.split(\"\\n\").length >= 2 && !code.startsWith(\"pip \") && !code.startsWith(\"$ pip\")) {\r\n snippets.push({ label: label || `Example ${snippets.length + 1}`, code });\r\n }\r\n }\r\n i++;\r\n }\r\n return snippets;\r\n}\r\n","export const themes = {\r\n dark: {\r\n bg: \"#0a0a0f\",\r\n bgCard: \"#12121a\",\r\n bgCardHover: \"#1a1a25\",\r\n border: \"#1e1e2e\",\r\n text: \"#e8e8f0\",\r\n textSecondary: \"#a0a0b8\",\r\n textMuted: \"#6b6b80\",\r\n accent: \"#6c63ff\",\r\n accentLight: \"#8b83ff\",\r\n accentGlow: \"rgba(108,99,255,0.15)\",\r\n },\r\n light: {\r\n bg: \"#f8f9fa\",\r\n bgCard: \"#ffffff\",\r\n bgCardHover: \"#f0f0f5\",\r\n border: \"#e0e0e8\",\r\n text: \"#1a1a2e\",\r\n textSecondary: \"#4a4a5a\",\r\n textMuted: \"#8a8a9a\",\r\n accent: \"#5b52e0\",\r\n accentLight: \"#5b52e0\",\r\n accentGlow: \"rgba(91,82,224,0.1)\",\r\n },\r\n};\r\n\r\nexport type Theme = {\r\n bg: string; bgCard: string; bgCardHover: string; border: string;\r\n text: string; textSecondary: string; textMuted: string;\r\n accent: string; accentLight: string; accentGlow: string;\r\n};\r\n\r\nexport const LANG_COLORS: Record<string, string> = {\r\n Python: \"#3572A5\",\r\n TypeScript: \"#3178c6\",\r\n JavaScript: \"#f1e05a\",\r\n Rust: \"#dea584\",\r\n HTML: \"#e34c26\",\r\n CSS: \"#563d7c\",\r\n Go: \"#00ADD8\",\r\n Shell: \"#89e051\",\r\n Java: \"#b07219\",\r\n \"C++\": \"#f34b7d\",\r\n C: \"#555555\",\r\n Ruby: \"#701516\",\r\n};\r\n","import ReactMarkdown from \"react-markdown\";\r\nimport remarkGfm from \"remark-gfm\";\r\nimport rehypeRaw from \"rehype-raw\";\r\nimport type { Theme } from \"./styles\";\r\n\r\nexport function ReadmeView({\r\n org,\r\n repoName,\r\n content,\r\n t,\r\n}: {\r\n org: string;\r\n repoName: string;\r\n content: string | null;\r\n t: Theme;\r\n}) {\r\n if (!content) {\r\n return <div style={{ textAlign: \"center\", padding: 40, color: t.textMuted }}>README not found</div>;\r\n }\r\n\r\n return (\r\n <div className=\"xgen-markdown\" style={{ color: t.text, lineHeight: 1.7, fontSize: 14 }}>\r\n <style>{markdownStyles(t)}</style>\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeRaw]}\r\n components={{\r\n img: ({ src, alt, ...props }) => {\r\n let resolved = src;\r\n if (typeof src === \"string\" && !src.startsWith(\"http\")) {\r\n resolved = `https://raw.githubusercontent.com/${org}/${repoName}/main/${src}`;\r\n }\r\n return <img src={resolved} alt={alt || \"\"} style={{ maxWidth: \"100%\" }} {...props} />;\r\n },\r\n a: ({ href, children, ...props }) => (\r\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: t.accentLight }} {...props}>\r\n {children}\r\n </a>\r\n ),\r\n code: ({ children, className, ...props }) => {\r\n const isBlock = className?.includes(\"language-\");\r\n if (isBlock) {\r\n return (\r\n <code\r\n style={{\r\n display: \"block\", background: t.bg, padding: 16, borderRadius: 8,\r\n overflow: \"auto\", fontSize: 13, lineHeight: 1.6,\r\n }}\r\n {...props}\r\n >\r\n {children}\r\n </code>\r\n );\r\n }\r\n return (\r\n <code style={{ background: t.accentGlow, padding: \"2px 6px\", borderRadius: 4, fontSize: 13 }} {...props}>\r\n {children}\r\n </code>\r\n );\r\n },\r\n }}\r\n >\r\n {content}\r\n </ReactMarkdown>\r\n </div>\r\n );\r\n}\r\n\r\nfunction markdownStyles(t: Theme): string {\r\n return `\r\n .xgen-markdown h1, .xgen-markdown h2, .xgen-markdown h3 { color: ${t.text}; margin: 1.2em 0 0.5em; }\r\n .xgen-markdown h1 { font-size: 1.8em; border-bottom: 1px solid ${t.border}; padding-bottom: 8px; }\r\n .xgen-markdown h2 { font-size: 1.4em; border-bottom: 1px solid ${t.border}; padding-bottom: 6px; }\r\n .xgen-markdown h3 { font-size: 1.15em; }\r\n .xgen-markdown p { margin: 0.8em 0; }\r\n .xgen-markdown ul, .xgen-markdown ol { padding-left: 24px; }\r\n .xgen-markdown li { margin: 4px 0; }\r\n .xgen-markdown pre { background: ${t.bg}; border: 1px solid ${t.border}; border-radius: 8px; padding: 16px; overflow: auto; margin: 12px 0; }\r\n .xgen-markdown blockquote { border-left: 3px solid ${t.accent}; padding-left: 12px; color: ${t.textSecondary}; margin: 12px 0; }\r\n .xgen-markdown table { border-collapse: collapse; width: 100%; margin: 12px 0; }\r\n .xgen-markdown th, .xgen-markdown td { border: 1px solid ${t.border}; padding: 8px 12px; text-align: left; }\r\n .xgen-markdown th { background: ${t.bgCard}; font-weight: 600; }\r\n .xgen-markdown hr { border: none; border-top: 1px solid ${t.border}; margin: 16px 0; }\r\n `;\r\n}\r\n"],"mappings":"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","names":["jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/XgenGallery.tsx","../src/api.ts","../src/styles.ts","../src/ReadmeView.tsx"],"sourcesContent":["import { useEffect, useState, useCallback } from \"react\";\r\nimport type { Repo, GalleryProps, DemoSnippet } from \"./types\";\r\nimport { fetchRepos, fetchReadme, fetchDemoSnippets } from \"./api\";\r\nimport { themes, LANG_COLORS, Theme } from \"./styles\";\r\nimport { ReadmeView } from \"./ReadmeView\";\r\n\r\ntype View = { type: \"list\" } | { type: \"detail\"; repo: Repo };\r\n\r\nexport function XgenGallery({ org, token, theme: themeName = \"dark\", limit, onRepoClick }: GalleryProps) {\r\n const t = themes[themeName];\r\n const [repos, setRepos] = useState<Repo[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState(\"\");\r\n const [lang, setLang] = useState<string | null>(null);\r\n const [view, setView] = useState<View>({ type: \"list\" });\r\n\r\n useEffect(() => {\r\n fetchRepos(org, token).then((data) => {\r\n setRepos(limit ? data.slice(0, limit) : data);\r\n setLoading(false);\r\n });\r\n }, [org, token, limit]);\r\n\r\n const languages = [...new Set(repos.map((r) => r.language).filter(Boolean))] as string[];\r\n\r\n const filtered = repos.filter((r) => {\r\n if (lang && r.language !== lang) return false;\r\n if (search) {\r\n const q = search.toLowerCase();\r\n return r.name.toLowerCase().includes(q) || (r.description || \"\").toLowerCase().includes(q);\r\n }\r\n return true;\r\n });\r\n\r\n const handleCardClick = useCallback((repo: Repo) => {\r\n if (onRepoClick) {\r\n onRepoClick(repo);\r\n } else {\r\n setView({ type: \"detail\", repo });\r\n }\r\n }, [onRepoClick]);\r\n\r\n if (view.type === \"detail\") {\r\n return <RepoDetail org={org} repo={view.repo} token={token} t={t} themeName={themeName} onBack={() => setView({ type: \"list\" })} />;\r\n }\r\n\r\n return (\r\n <div data-theme={themeName} style={{ background: t.bg, color: t.text, fontFamily: \"system-ui, -apple-system, sans-serif\", padding: 24 }}>\r\n {/* Header */}\r\n <div style={{ marginBottom: 24 }}>\r\n <h2 style={{ fontSize: 24, fontWeight: 700, margin: 0 }}>{org}</h2>\r\n <p style={{ color: t.textMuted, fontSize: 14, margin: \"4px 0 0\" }}>\r\n {repos.length} repositories\r\n </p>\r\n </div>\r\n\r\n {/* Search + Filter */}\r\n <div style={{ display: \"flex\", gap: 8, flexWrap: \"wrap\", marginBottom: 16 }}>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n style={{\r\n background: t.bgCard, border: `1px solid ${t.border}`, borderRadius: 8,\r\n padding: \"8px 12px\", color: t.text, fontSize: 14, outline: \"none\", flex: \"1 1 200px\",\r\n }}\r\n />\r\n <button\r\n onClick={() => setLang(null)}\r\n style={{\r\n padding: \"6px 12px\", borderRadius: 8, fontSize: 12, fontWeight: 500, cursor: \"pointer\",\r\n background: !lang ? t.accent : t.bgBadge,\r\n color: !lang ? \"#fff\" : t.textBadge,\r\n border: `1px solid ${!lang ? t.accent : t.border}`,\r\n }}\r\n >\r\n All\r\n </button>\r\n {languages.map((l) => (\r\n <button\r\n key={l}\r\n onClick={() => setLang(lang === l ? null : l)}\r\n style={{\r\n padding: \"6px 12px\", borderRadius: 8, fontSize: 12, fontWeight: 500, cursor: \"pointer\",\r\n background: lang === l ? t.accent : t.bgBadge,\r\n color: lang === l ? \"#fff\" : t.textBadge,\r\n border: `1px solid ${lang === l ? t.accent : t.border}`,\r\n }}\r\n >\r\n {l}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Grid */}\r\n {loading ? (\r\n <div style={{ textAlign: \"center\", padding: 60, color: t.textMuted }}>Loading...</div>\r\n ) : (\r\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(auto-fill, minmax(300px, 1fr))\", gap: 16 }}>\r\n {filtered.map((repo) => (\r\n <RepoCard key={repo.name} repo={repo} t={t} onClick={() => handleCardClick(repo)} />\r\n ))}\r\n </div>\r\n )}\r\n {!loading && filtered.length === 0 && (\r\n <div style={{ textAlign: \"center\", padding: 60, color: t.textMuted }}>No results</div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/* ---------- RepoCard ---------- */\r\n\r\nfunction RepoCard({ repo, t, onClick }: { repo: Repo; t: Theme; onClick: () => void }) {\r\n const [hover, setHover] = useState(false);\r\n const langColor = repo.language ? LANG_COLORS[repo.language] || \"#888\" : null;\r\n const date = new Date(repo.updated_at).toLocaleDateString(\"ko-KR\", { year: \"numeric\", month: \"short\", day: \"numeric\" });\r\n\r\n return (\r\n <div\r\n onClick={onClick}\r\n onMouseEnter={() => setHover(true)}\r\n onMouseLeave={() => setHover(false)}\r\n style={{\r\n background: hover ? t.bgCardHover : t.bgCard,\r\n border: `1px solid ${hover ? t.accent : t.border}`,\r\n borderRadius: 12, padding: 20, cursor: \"pointer\",\r\n transform: hover ? \"translateY(-2px)\" : \"none\",\r\n boxShadow: hover ? t.shadowHover : \"none\",\r\n transition: \"all 0.2s\",\r\n }}\r\n >\r\n <div style={{ display: \"flex\", justifyContent: \"space-between\", marginBottom: 8 }}>\r\n <span style={{ fontSize: 16, fontWeight: 600, color: t.accent }}>{repo.name}</span>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); window.open(repo.html_url, \"_blank\"); }}\r\n style={{\r\n fontSize: 11, padding: \"2px 8px\", borderRadius: 6, cursor: \"pointer\",\r\n border: `1px solid ${t.border}`, background: \"transparent\", color: t.textMuted,\r\n }}\r\n >\r\n GitHub →\r\n </button>\r\n </div>\r\n <p style={{ fontSize: 13, color: t.textSecondary, margin: \"0 0 12px\", lineHeight: 1.5, minHeight: 40 }}>\r\n {repo.description || \"No description\"}\r\n </p>\r\n <div style={{ display: \"flex\", gap: 12, fontSize: 12, color: t.textMuted }}>\r\n {langColor && (\r\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\r\n <span style={{ width: 10, height: 10, borderRadius: \"50%\", background: langColor, display: \"inline-block\" }} />\r\n {repo.language}\r\n </span>\r\n )}\r\n {repo.stargazers_count > 0 && <span>★ {repo.stargazers_count}</span>}\r\n {repo.forks_count > 0 && <span>Fork {repo.forks_count}</span>}\r\n <span>{date}</span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ---------- RepoDetail ---------- */\r\n\r\nfunction RepoDetail({ org, repo, token, t, themeName, onBack }: { org: string; repo: Repo; token?: string; t: Theme; themeName: string; onBack: () => void }) {\r\n const [tab, setTab] = useState<\"readme\" | \"demo\">(\"readme\");\r\n const [readme, setReadme] = useState<string | null>(null);\r\n const [snippets, setSnippets] = useState<DemoSnippet[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n\r\n useEffect(() => {\r\n Promise.all([\r\n fetchReadme(org, repo.name, token),\r\n fetchDemoSnippets(org, repo.name, undefined, token),\r\n ]).then(([md, s]) => {\r\n setReadme(md);\r\n setSnippets(s);\r\n setLoading(false);\r\n });\r\n }, [org, repo.name, token]);\r\n\r\n return (\r\n <div data-theme={themeName} style={{ background: t.bg, color: t.text, fontFamily: \"system-ui, -apple-system, sans-serif\", padding: 24 }}>\r\n {/* Back */}\r\n <button\r\n onClick={onBack}\r\n style={{\r\n background: \"transparent\", border: \"none\", color: t.accent,\r\n cursor: \"pointer\", fontSize: 14, padding: 0, marginBottom: 16,\r\n }}\r\n >\r\n ← Back\r\n </button>\r\n\r\n {/* Header */}\r\n <div style={{ background: t.bgCard, border: `1px solid ${t.border}`, borderRadius: 12, padding: 24, marginBottom: 16 }}>\r\n <div style={{ display: \"flex\", justifyContent: \"space-between\", flexWrap: \"wrap\", gap: 16 }}>\r\n <div>\r\n <h1 style={{ fontSize: 22, fontWeight: 700, margin: 0 }}>{repo.name}</h1>\r\n <p style={{ color: t.textSecondary, fontSize: 14, margin: \"8px 0\" }}>{repo.description || \"No description\"}</p>\r\n </div>\r\n <a\r\n href={repo.html_url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n style={{\r\n display: \"inline-flex\", alignItems: \"center\", gap: 8,\r\n padding: \"8px 16px\", borderRadius: 8, fontSize: 14, fontWeight: 500,\r\n background: t.accent, color: \"#fff\", textDecoration: \"none\",\r\n height: \"fit-content\",\r\n }}\r\n >\r\n View on GitHub\r\n </a>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div style={{ display: \"flex\", gap: 4, borderBottom: `1px solid ${t.border}`, marginBottom: 16 }}>\r\n {([\"readme\", ...(snippets.length > 0 ? [\"demo\"] : [])] as const).map((key) => (\r\n <button\r\n key={key}\r\n onClick={() => setTab(key as typeof tab)}\r\n style={{\r\n padding: \"10px 16px\", fontSize: 14, fontWeight: 500, cursor: \"pointer\",\r\n background: \"transparent\", border: \"none\",\r\n color: tab === key ? t.accentLight : t.textMuted,\r\n borderBottom: tab === key ? `2px solid ${t.accent}` : \"2px solid transparent\",\r\n }}\r\n >\r\n {key === \"readme\" ? \"README\" : \"Demo\"}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Content */}\r\n <div style={{ background: t.bgCard, border: `1px solid ${t.border}`, borderRadius: 12, padding: 24 }}>\r\n {loading ? (\r\n <div style={{ textAlign: \"center\", padding: 40, color: t.textMuted }}>Loading...</div>\r\n ) : tab === \"readme\" ? (\r\n <ReadmeView org={org} repoName={repo.name} content={readme} t={t} />\r\n ) : (\r\n <DemoView snippets={snippets} t={t} />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ---------- DemoView ---------- */\r\n\r\nfunction DemoView({ snippets, t }: { snippets: DemoSnippet[]; t: Theme }) {\r\n const [idx, setIdx] = useState(0);\r\n const snippet = snippets[idx];\r\n\r\n if (!snippet) return null;\r\n\r\n return (\r\n <div>\r\n {snippets.length > 1 && (\r\n <div style={{ display: \"flex\", gap: 6, marginBottom: 12, flexWrap: \"wrap\" }}>\r\n {snippets.map((s, i) => (\r\n <button\r\n key={i}\r\n onClick={() => setIdx(i)}\r\n style={{\r\n padding: \"4px 12px\", borderRadius: 99, fontSize: 12, cursor: \"pointer\",\r\n background: i === idx ? t.accentGlow : t.bgBadge,\r\n color: i === idx ? t.accent : t.textBadge,\r\n border: `1px solid ${i === idx ? t.accent : t.border}`,\r\n }}\r\n >\r\n {s.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n <pre\r\n style={{\r\n background: t.bg, border: `1px solid ${t.border}`, borderRadius: 8,\r\n padding: 16, fontSize: 13, lineHeight: 1.6, overflow: \"auto\",\r\n color: t.textSecondary, margin: 0,\r\n }}\r\n >\r\n <code>{snippet.code}</code>\r\n </pre>\r\n {snippet.expectedOutput && (\r\n <div style={{ marginTop: 12 }}>\r\n <span style={{ fontSize: 12, color: t.textMuted }}>Expected Output:</span>\r\n <pre\r\n style={{\r\n background: t.bg, border: `1px solid ${t.border}`, borderRadius: 8,\r\n padding: 12, fontSize: 12, color: t.textMuted, margin: \"4px 0 0\",\r\n }}\r\n >\r\n {snippet.expectedOutput}\r\n </pre>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { Repo, DemoSnippet } from \"./types\";\r\n\r\nconst API = \"https://api.github.com\";\r\n\r\nfunction headers(token?: string): HeadersInit {\r\n const h: Record<string, string> = { Accept: \"application/vnd.github.v3+json\" };\r\n if (token) h.Authorization = `Bearer ${token}`;\r\n return h;\r\n}\r\n\r\nexport async function fetchRepos(org: string, token?: string): Promise<Repo[]> {\r\n try {\r\n const res = await fetch(`${API}/orgs/${org}/repos?per_page=100&sort=updated`, {\r\n headers: headers(token),\r\n });\r\n if (!res.ok) return [];\r\n return res.json();\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nexport async function fetchReadme(org: string, repo: string, token?: string): Promise<string | null> {\r\n try {\r\n const res = await fetch(`${API}/repos/${org}/${repo}/readme`, {\r\n headers: { ...headers(token), Accept: \"application/vnd.github.v3.raw\" },\r\n });\r\n if (!res.ok) return null;\r\n return res.text();\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport async function fetchDemoSnippets(\r\n org: string,\r\n repo: string,\r\n readme?: string | null,\r\n token?: string,\r\n): Promise<DemoSnippet[]> {\r\n // 1. demo.json\r\n for (const path of [\".xgen-gallery/demo.json\", \"demo.json\"]) {\r\n try {\r\n const res = await fetch(`${API}/repos/${org}/${repo}/contents/${path}`, {\r\n headers: { ...headers(token), Accept: \"application/vnd.github.v3.raw\" },\r\n });\r\n if (!res.ok) continue;\r\n const data = await res.json();\r\n if (data.snippets?.length) return data.snippets;\r\n } catch {\r\n continue;\r\n }\r\n }\r\n\r\n // 2. examples/\r\n try {\r\n const res = await fetch(`${API}/repos/${org}/${repo}/contents/examples`, {\r\n headers: headers(token),\r\n });\r\n if (res.ok) {\r\n const files: { name: string; download_url: string }[] = await res.json();\r\n const pyFiles = files.filter((f) => f.name.endsWith(\".py\")).slice(0, 5);\r\n const snippets: DemoSnippet[] = [];\r\n for (const f of pyFiles) {\r\n try {\r\n const r = await fetch(f.download_url);\r\n if (r.ok) {\r\n const code = await r.text();\r\n snippets.push({ label: f.name.replace(/\\.py$/, \"\").replace(/[_-]/g, \" \"), code: code.trim() });\r\n }\r\n } catch { continue; }\r\n }\r\n if (snippets.length) return snippets;\r\n }\r\n } catch { /* ignore */ }\r\n\r\n // 3. README python blocks\r\n let md = readme;\r\n if (!md) md = await fetchReadme(org, repo, token);\r\n if (md) {\r\n const blocks = extractPythonBlocks(md);\r\n if (blocks.length) return blocks;\r\n }\r\n\r\n return [];\r\n}\r\n\r\nfunction extractPythonBlocks(readme: string): DemoSnippet[] {\r\n const snippets: DemoSnippet[] = [];\r\n const lines = readme.split(\"\\n\");\r\n let i = 0;\r\n while (i < lines.length) {\r\n if (/^```(?:python|py)\\s*$/i.test(lines[i].trim())) {\r\n let label = \"\";\r\n for (let j = i - 1; j >= Math.max(0, i - 5); j--) {\r\n const prev = lines[j].trim();\r\n if (/^#{1,4}\\s+/.test(prev)) { label = prev.replace(/^#+\\s+/, \"\"); break; }\r\n if (prev && !label) label = prev;\r\n }\r\n const codeLines: string[] = [];\r\n i++;\r\n while (i < lines.length && !lines[i].trim().startsWith(\"```\")) { codeLines.push(lines[i]); i++; }\r\n const code = codeLines.join(\"\\n\").trim();\r\n if (code && code.split(\"\\n\").length >= 2 && !code.startsWith(\"pip \") && !code.startsWith(\"$ pip\")) {\r\n snippets.push({ label: label || `Example ${snippets.length + 1}`, code });\r\n }\r\n }\r\n i++;\r\n }\r\n return snippets;\r\n}\r\n","export const themes = {\r\n dark: {\r\n bg: \"#0a0a0f\",\r\n bgCard: \"#12121a\",\r\n bgCardHover: \"#1a1a25\",\r\n border: \"#1e1e2e\",\r\n text: \"#e8e8f0\",\r\n textSecondary: \"#a0a0b8\",\r\n textMuted: \"#6b6b80\",\r\n accent: \"#6c63ff\",\r\n accentLight: \"#8b83ff\",\r\n accentGlow: \"rgba(108,99,255,0.15)\",\r\n shadowHover: \"0 0 20px rgba(108,99,255,0.2)\",\r\n bgBadge: \"rgba(108,99,255,0.15)\",\r\n textBadge: \"#a0a0b8\",\r\n },\r\n light: {\r\n bg: \"#f8fafc\",\r\n bgCard: \"#ffffff\",\r\n bgCardHover: \"#ffffff\",\r\n border: \"rgba(0,0,0,0.08)\",\r\n text: \"#1e293b\",\r\n textSecondary: \"#4b5563\",\r\n textMuted: \"#6b7280\",\r\n accent: \"#2563eb\",\r\n accentLight: \"#2563eb\",\r\n accentGlow: \"rgba(37,99,235,0.08)\",\r\n shadowHover: \"0 8px 20px rgba(0,0,0,0.08)\",\r\n bgBadge: \"#f1f5f9\",\r\n textBadge: \"#475569\",\r\n },\r\n};\r\n\r\nexport type Theme = {\r\n bg: string; bgCard: string; bgCardHover: string; border: string;\r\n text: string; textSecondary: string; textMuted: string;\r\n accent: string; accentLight: string; accentGlow: string;\r\n shadowHover: string; bgBadge: string; textBadge: string;\r\n};\r\n\r\nexport const LANG_COLORS: Record<string, string> = {\r\n Python: \"#3572A5\",\r\n TypeScript: \"#3178c6\",\r\n JavaScript: \"#f1e05a\",\r\n Rust: \"#dea584\",\r\n HTML: \"#e34c26\",\r\n CSS: \"#563d7c\",\r\n Go: \"#00ADD8\",\r\n Shell: \"#89e051\",\r\n Java: \"#b07219\",\r\n \"C++\": \"#f34b7d\",\r\n C: \"#555555\",\r\n Ruby: \"#701516\",\r\n};\r\n","import ReactMarkdown from \"react-markdown\";\r\nimport remarkGfm from \"remark-gfm\";\r\nimport rehypeRaw from \"rehype-raw\";\r\nimport type { Theme } from \"./styles\";\r\n\r\nexport function ReadmeView({\r\n org,\r\n repoName,\r\n content,\r\n t,\r\n}: {\r\n org: string;\r\n repoName: string;\r\n content: string | null;\r\n t: Theme;\r\n}) {\r\n if (!content) {\r\n return <div style={{ textAlign: \"center\", padding: 40, color: t.textMuted }}>README not found</div>;\r\n }\r\n\r\n return (\r\n <div className=\"xgen-markdown\" style={{ color: t.text, lineHeight: 1.7, fontSize: 14 }}>\r\n <style>{markdownStyles(t)}</style>\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeRaw]}\r\n components={{\r\n img: ({ src, alt, ...props }) => {\r\n let resolved = src;\r\n if (typeof src === \"string\" && !src.startsWith(\"http\")) {\r\n resolved = `https://raw.githubusercontent.com/${org}/${repoName}/main/${src}`;\r\n }\r\n return <img src={resolved} alt={alt || \"\"} style={{ maxWidth: \"100%\" }} {...props} />;\r\n },\r\n a: ({ href, children, ...props }) => (\r\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: t.accentLight }} {...props}>\r\n {children}\r\n </a>\r\n ),\r\n code: ({ children, className, ...props }) => {\r\n const isBlock = className?.includes(\"language-\");\r\n if (isBlock) {\r\n return (\r\n <code\r\n style={{\r\n display: \"block\", background: t.bg, padding: 16, borderRadius: 8,\r\n overflow: \"auto\", fontSize: 13, lineHeight: 1.6,\r\n }}\r\n {...props}\r\n >\r\n {children}\r\n </code>\r\n );\r\n }\r\n return (\r\n <code style={{ background: t.accentGlow, padding: \"2px 6px\", borderRadius: 4, fontSize: 13 }} {...props}>\r\n {children}\r\n </code>\r\n );\r\n },\r\n }}\r\n >\r\n {content}\r\n </ReactMarkdown>\r\n </div>\r\n );\r\n}\r\n\r\nfunction markdownStyles(t: Theme): string {\r\n return `\r\n .xgen-markdown h1, .xgen-markdown h2, .xgen-markdown h3 { color: ${t.text}; margin: 1.2em 0 0.5em; }\r\n .xgen-markdown h1 { font-size: 1.8em; border-bottom: 1px solid ${t.border}; padding-bottom: 8px; }\r\n .xgen-markdown h2 { font-size: 1.4em; border-bottom: 1px solid ${t.border}; padding-bottom: 6px; }\r\n .xgen-markdown h3 { font-size: 1.15em; }\r\n .xgen-markdown p { margin: 0.8em 0; }\r\n .xgen-markdown ul, .xgen-markdown ol { padding-left: 24px; }\r\n .xgen-markdown li { margin: 4px 0; }\r\n .xgen-markdown pre { background: ${t.bg}; border: 1px solid ${t.border}; border-radius: 8px; padding: 16px; overflow: auto; margin: 12px 0; }\r\n .xgen-markdown blockquote { border-left: 3px solid ${t.accent}; padding-left: 12px; color: ${t.textSecondary}; margin: 12px 0; }\r\n .xgen-markdown table { border-collapse: collapse; width: 100%; margin: 12px 0; }\r\n .xgen-markdown th, .xgen-markdown td { border: 1px solid ${t.border}; padding: 8px 12px; text-align: left; }\r\n .xgen-markdown th { background: ${t.bgCard}; font-weight: 600; }\r\n .xgen-markdown hr { border: none; border-top: 1px solid ${t.border}; margin: 16px 0; }\r\n `;\r\n}\r\n"],"mappings":"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","names":["jsx","jsxs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plateerlab/xgen-gallery",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "React component to showcase GitHub organization repositories",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",