version-pill-react 1.2.0 β†’ 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -104,7 +104,7 @@ function VersionPill({
104
104
  position = "inline",
105
105
  className,
106
106
  theme = "auto",
107
- style = "gradient",
107
+ style = "glass",
108
108
  size = "md",
109
109
  showBranding = true,
110
110
  accent = "green",
@@ -203,86 +203,79 @@ function VersionPill({
203
203
  "bottom-right": "fixed bottom-4 right-4 z-[9999]",
204
204
  inline: ""
205
205
  };
206
+ const getBadgeStyle = () => {
207
+ const base = {
208
+ display: "inline-flex",
209
+ alignItems: "center",
210
+ gap: sizeConfig.gap,
211
+ height: sizeConfig.height,
212
+ padding: sizeConfig.padding,
213
+ fontSize: sizeConfig.font,
214
+ fontFamily: "ui-monospace, monospace",
215
+ fontWeight: 600,
216
+ borderRadius: 999,
217
+ cursor: "pointer",
218
+ transition: "all 150ms ease",
219
+ outline: "none"
220
+ };
221
+ if (style === "gradient") {
222
+ return {
223
+ ...base,
224
+ background: "linear-gradient(135deg, #22c55e 0%, #16a34a 100%)",
225
+ border: "none",
226
+ color: "#fff",
227
+ boxShadow: "0 2px 8px rgba(34,197,94,0.3)"
228
+ };
229
+ }
230
+ return {
231
+ ...base,
232
+ background: isLight ? "rgba(34, 197, 94, 0.12)" : "rgba(34, 197, 94, 0.18)",
233
+ backdropFilter: "blur(8px)",
234
+ WebkitBackdropFilter: "blur(8px)",
235
+ border: isLight ? "1px solid rgba(34, 197, 94, 0.25)" : "1px solid rgba(34, 197, 94, 0.35)",
236
+ color: isLight ? "#16a34a" : "#4ade80",
237
+ boxShadow: isLight ? "0 2px 8px rgba(34, 197, 94, 0.15), inset 0 1px 0 rgba(255,255,255,0.5)" : "0 2px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.1)"
238
+ };
239
+ };
240
+ const getDotStyle = () => ({
241
+ width: sizeConfig.dotSize,
242
+ height: sizeConfig.dotSize,
243
+ borderRadius: "50%",
244
+ background: style === "gradient" ? "#fff" : "#22c55e",
245
+ boxShadow: style === "gradient" ? "0 0 6px rgba(255,255,255,0.8)" : "0 0 6px rgba(34,197,94,0.6)",
246
+ flexShrink: 0
247
+ });
206
248
  if (loading) {
207
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_clsx.default)(positionStyles[position], className), style: { display: "inline-flex" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
208
- "span",
209
- {
210
- style: {
211
- display: "inline-flex",
212
- alignItems: "center",
213
- gap: sizeConfig.gap,
214
- height: sizeConfig.height,
215
- padding: sizeConfig.padding,
216
- fontSize: sizeConfig.font,
217
- fontFamily: "ui-monospace, monospace",
218
- fontWeight: 500,
219
- borderRadius: 999,
220
- background: "linear-gradient(135deg, #22c55e 0%, #16a34a 100%)",
221
- color: "#fff",
222
- opacity: 0.6
223
- },
224
- children: [
225
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
226
- "span",
227
- {
228
- style: {
229
- width: sizeConfig.dotSize,
230
- height: sizeConfig.dotSize,
231
- borderRadius: "50%",
232
- background: "#fff",
233
- opacity: 0.6
234
- }
235
- }
236
- ),
237
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { width: 32, height: sizeConfig.font, background: "rgba(255,255,255,0.3)", borderRadius: 2 } })
238
- ]
239
- }
240
- ) });
249
+ const loadingStyle = getBadgeStyle();
250
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_clsx.default)(positionStyles[position], className), style: { display: "inline-flex" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { ...loadingStyle, opacity: 0.6, cursor: "default" }, children: [
251
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { ...getDotStyle(), opacity: 0.6 } }),
252
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: {
253
+ width: 32,
254
+ height: sizeConfig.font,
255
+ background: style === "gradient" ? "rgba(255,255,255,0.3)" : "rgba(34,197,94,0.3)",
256
+ borderRadius: 2
257
+ } })
258
+ ] }) });
241
259
  }
242
260
  if (!currentVersion) return null;
243
261
  const renderBadge = () => {
262
+ const badgeStyle = getBadgeStyle();
263
+ const dotStyle = getDotStyle();
244
264
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
245
265
  "button",
246
266
  {
247
267
  onClick: handleOpen,
248
- style: {
249
- display: "inline-flex",
250
- alignItems: "center",
251
- gap: sizeConfig.gap,
252
- height: sizeConfig.height,
253
- padding: sizeConfig.padding,
254
- fontSize: sizeConfig.font,
255
- fontFamily: "ui-monospace, monospace",
256
- fontWeight: 600,
257
- borderRadius: 999,
258
- cursor: "pointer",
259
- border: "none",
260
- transition: "all 150ms ease",
261
- outline: "none",
262
- background: "linear-gradient(135deg, #22c55e 0%, #16a34a 100%)",
263
- color: "#fff",
264
- boxShadow: "0 2px 8px rgba(34,197,94,0.3)"
265
- },
268
+ style: badgeStyle,
266
269
  onMouseEnter: (e) => {
267
- e.currentTarget.style.boxShadow = "0 4px 12px rgba(34,197,94,0.4)";
270
+ e.currentTarget.style.transform = "scale(1.02)";
271
+ e.currentTarget.style.boxShadow = style === "gradient" ? "0 4px 12px rgba(34,197,94,0.4)" : isLight ? "0 4px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.5)" : "0 4px 16px rgba(34, 197, 94, 0.35), inset 0 1px 0 rgba(255,255,255,0.1)";
268
272
  },
269
273
  onMouseLeave: (e) => {
270
- e.currentTarget.style.boxShadow = "0 2px 8px rgba(34,197,94,0.3)";
274
+ e.currentTarget.style.transform = "scale(1)";
275
+ e.currentTarget.style.boxShadow = style === "gradient" ? "0 2px 8px rgba(34,197,94,0.3)" : isLight ? "0 2px 8px rgba(34, 197, 94, 0.15), inset 0 1px 0 rgba(255,255,255,0.5)" : "0 2px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.1)";
271
276
  },
272
277
  children: [
273
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
274
- "span",
275
- {
276
- style: {
277
- width: sizeConfig.dotSize,
278
- height: sizeConfig.dotSize,
279
- borderRadius: "50%",
280
- background: "#fff",
281
- boxShadow: "0 0 6px rgba(255,255,255,0.8)",
282
- flexShrink: 0
283
- }
284
- }
285
- ),
278
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: dotStyle }),
286
279
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
287
280
  "v",
288
281
  currentVersion
@@ -303,7 +296,7 @@ function VersionPill({
303
296
  }
304
297
  );
305
298
  };
306
- const groupedTasks = roadmapTasks.reduce((acc, task) => {
299
+ const groupedTasks = (roadmapTasks || []).reduce((acc, task) => {
307
300
  const col = task.column || "backlog";
308
301
  if (!acc[col]) acc[col] = [];
309
302
  acc[col].push(task);
@@ -593,7 +586,7 @@ function VersionBadge({
593
586
  projectId,
594
587
  baseUrl = DEFAULT_BASE_URL,
595
588
  theme = "auto",
596
- style = "gradient",
589
+ style = "glass",
597
590
  size = "md",
598
591
  accent = "green",
599
592
  className,
@@ -608,74 +601,99 @@ function VersionBadge({
608
601
  (0, import_react.useEffect)(() => {
609
602
  fetch(`${baseUrl}/api/badge/${projectId}`).then((res) => res.json()).then((data) => setVersion(data.version)).catch(() => setVersion(null)).finally(() => setLoading(false));
610
603
  }, [projectId, baseUrl]);
611
- if (loading) {
612
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
613
- "span",
614
- {
615
- className,
616
- style: {
617
- display: "inline-flex",
618
- alignItems: "center",
619
- gap: sizeConfig.gap,
620
- height: sizeConfig.height,
621
- padding: sizeConfig.padding,
622
- fontSize: sizeConfig.font,
623
- fontFamily: "ui-monospace, monospace",
624
- fontWeight: 500,
625
- borderRadius: 999,
604
+ const getStyleConfig = () => {
605
+ const base = {
606
+ display: "inline-flex",
607
+ alignItems: "center",
608
+ gap: sizeConfig.gap,
609
+ height: sizeConfig.height,
610
+ padding: sizeConfig.padding,
611
+ fontSize: sizeConfig.font,
612
+ fontFamily: "ui-monospace, monospace",
613
+ fontWeight: 600,
614
+ borderRadius: 999,
615
+ textDecoration: "none",
616
+ transition: "all 150ms ease",
617
+ cursor: "pointer"
618
+ };
619
+ switch (style) {
620
+ case "glass":
621
+ return {
622
+ ...base,
623
+ background: isLight ? "rgba(34, 197, 94, 0.12)" : "rgba(34, 197, 94, 0.18)",
624
+ backdropFilter: "blur(8px)",
625
+ WebkitBackdropFilter: "blur(8px)",
626
+ border: isLight ? "1px solid rgba(34, 197, 94, 0.25)" : "1px solid rgba(34, 197, 94, 0.35)",
627
+ color: isLight ? "#16a34a" : "#4ade80",
628
+ boxShadow: isLight ? "0 2px 8px rgba(34, 197, 94, 0.15), inset 0 1px 0 rgba(255,255,255,0.5)" : "0 2px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.1)"
629
+ };
630
+ case "gradient":
631
+ return {
632
+ ...base,
626
633
  background: "linear-gradient(135deg, #22c55e 0%, #16a34a 100%)",
627
634
  color: "#fff",
628
- opacity: 0.6
629
- },
630
- children: [
631
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
632
- "span",
633
- {
634
- style: {
635
- width: sizeConfig.dotSize,
636
- height: sizeConfig.dotSize,
637
- borderRadius: "50%",
638
- background: "#fff",
639
- opacity: 0.6
640
- }
641
- }
642
- ),
643
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { width: 32, height: sizeConfig.font, background: "rgba(255,255,255,0.3)", borderRadius: 2 } })
644
- ]
645
- }
646
- );
635
+ boxShadow: "0 2px 8px rgba(34,197,94,0.3)"
636
+ };
637
+ case "pill":
638
+ return {
639
+ ...base,
640
+ background: colors.bg,
641
+ border: `1px solid ${colors.border}`,
642
+ color: colors.text
643
+ };
644
+ case "minimal":
645
+ return {
646
+ ...base,
647
+ background: "transparent",
648
+ color: colors.text,
649
+ padding: "0 4px"
650
+ };
651
+ case "dot":
652
+ return {
653
+ ...base,
654
+ background: colors.bg,
655
+ border: `1px solid ${colors.border}`,
656
+ color: colors.text
657
+ };
658
+ default:
659
+ return {
660
+ ...base,
661
+ background: isLight ? "rgba(34, 197, 94, 0.12)" : "rgba(34, 197, 94, 0.18)",
662
+ backdropFilter: "blur(8px)",
663
+ border: isLight ? "1px solid rgba(34, 197, 94, 0.25)" : "1px solid rgba(34, 197, 94, 0.35)",
664
+ color: isLight ? "#16a34a" : "#4ade80",
665
+ boxShadow: "0 2px 8px rgba(34, 197, 94, 0.15)"
666
+ };
667
+ }
668
+ };
669
+ const getDotStyle = () => {
670
+ const isGlassOrPill = style === "glass" || style === "pill" || style === "dot";
671
+ return {
672
+ width: sizeConfig.dotSize,
673
+ height: sizeConfig.dotSize,
674
+ borderRadius: "50%",
675
+ background: style === "gradient" ? "#fff" : "#22c55e",
676
+ boxShadow: style === "gradient" ? "0 0 6px rgba(255,255,255,0.8)" : "0 0 6px rgba(34,197,94,0.6)",
677
+ flexShrink: 0
678
+ };
679
+ };
680
+ if (loading) {
681
+ const loadingStyle = getStyleConfig();
682
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className, style: { ...loadingStyle, opacity: 0.6 }, children: [
683
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { ...getDotStyle(), opacity: 0.6 } }),
684
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: {
685
+ width: 32,
686
+ height: sizeConfig.font,
687
+ background: style === "gradient" ? "rgba(255,255,255,0.3)" : "rgba(34,197,94,0.3)",
688
+ borderRadius: 2
689
+ } })
690
+ ] });
647
691
  }
648
692
  if (!version) return null;
649
- const badgeStyle = {
650
- display: "inline-flex",
651
- alignItems: "center",
652
- gap: sizeConfig.gap,
653
- height: sizeConfig.height,
654
- padding: sizeConfig.padding,
655
- fontSize: sizeConfig.font,
656
- fontFamily: "ui-monospace, monospace",
657
- fontWeight: 600,
658
- borderRadius: 999,
659
- textDecoration: "none",
660
- transition: "all 150ms ease",
661
- background: "linear-gradient(135deg, #22c55e 0%, #16a34a 100%)",
662
- color: "#fff",
663
- boxShadow: "0 2px 8px rgba(34,197,94,0.3)"
664
- };
693
+ const badgeStyle = getStyleConfig();
694
+ const dotStyle = getDotStyle();
665
695
  const content = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
666
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
667
- "span",
668
- {
669
- style: {
670
- width: sizeConfig.dotSize,
671
- height: sizeConfig.dotSize,
672
- borderRadius: "50%",
673
- background: "#fff",
674
- boxShadow: "0 0 6px rgba(255,255,255,0.8)",
675
- flexShrink: 0
676
- }
677
- }
678
- ),
696
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: dotStyle }),
679
697
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
680
698
  "v",
681
699
  version
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useEffect, useCallback } from \"react\";\nimport clsx from \"clsx\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface Version {\n version: string;\n type: \"major\" | \"minor\" | \"patch\";\n title: string;\n description?: string | null;\n emoji?: string | null;\n features?: string[];\n date: string | number;\n tasks?: { title: string; type: string }[];\n}\n\nexport interface RoadmapTask {\n id: string;\n title: string;\n type: string;\n priority: string;\n column: string;\n isPublic?: boolean;\n}\n\nexport interface Idea {\n id: string;\n title: string;\n description?: string;\n status: string;\n votes: number;\n hasVoted?: boolean;\n}\n\nexport interface ProjectInfo {\n name: string;\n slug: string;\n icon?: string | null;\n currentVersion?: string | null;\n}\n\nexport interface ChangelogAPIResponse {\n project: ProjectInfo;\n changelog: Version[];\n}\n\nexport interface RoadmapAPIResponse {\n project: ProjectInfo;\n tasks: RoadmapTask[];\n}\n\nexport interface BadgeAPIResponse {\n version: string | null;\n name: string;\n slug: string;\n}\n\nexport interface VersionPillConfig {\n projectId: string;\n baseUrl?: string;\n}\n\nexport type BadgeStyle = \"dot\" | \"pill\" | \"minimal\" | \"glass\" | \"gradient\";\nexport type BadgeSize = \"sm\" | \"md\" | \"lg\";\nexport type ModalTab = \"changelog\" | \"roadmap\" | \"ideas\";\n\nexport interface VersionPillProps extends VersionPillConfig {\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\" | \"inline\";\n className?: string;\n theme?: \"light\" | \"dark\" | \"auto\";\n style?: BadgeStyle;\n size?: BadgeSize;\n showBranding?: boolean;\n accent?: \"green\" | \"blue\" | \"purple\" | \"orange\" | \"neutral\";\n onNewVersion?: (version: Version) => void;\n onClick?: () => void;\n}\n\nexport interface ChangelogProps extends VersionPillConfig {\n maxHeight?: number;\n theme?: \"light\" | \"dark\" | \"auto\";\n className?: string;\n}\n\nexport interface RoadmapProps extends VersionPillConfig {\n maxHeight?: number;\n theme?: \"light\" | \"dark\" | \"auto\";\n className?: string;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst DEFAULT_BASE_URL = \"https://www.versionpill.com\";\n\nconst ACCENT_COLORS = {\n green: {\n light: { bg: \"rgba(34,197,94,0.1)\", border: \"rgba(34,197,94,0.25)\", text: \"#16a34a\", dot: \"#22c55e\" },\n dark: { bg: \"rgba(34,197,94,0.15)\", border: \"rgba(34,197,94,0.3)\", text: \"#4ade80\", dot: \"#22c55e\" },\n },\n blue: {\n light: { bg: \"rgba(59,130,246,0.1)\", border: \"rgba(59,130,246,0.25)\", text: \"#2563eb\", dot: \"#3b82f6\" },\n dark: { bg: \"rgba(59,130,246,0.15)\", border: \"rgba(59,130,246,0.3)\", text: \"#60a5fa\", dot: \"#3b82f6\" },\n },\n purple: {\n light: { bg: \"rgba(147,51,234,0.1)\", border: \"rgba(147,51,234,0.25)\", text: \"#7c3aed\", dot: \"#a855f7\" },\n dark: { bg: \"rgba(147,51,234,0.15)\", border: \"rgba(147,51,234,0.3)\", text: \"#c084fc\", dot: \"#a855f7\" },\n },\n orange: {\n light: { bg: \"rgba(249,115,22,0.1)\", border: \"rgba(249,115,22,0.25)\", text: \"#ea580c\", dot: \"#f97316\" },\n dark: { bg: \"rgba(249,115,22,0.15)\", border: \"rgba(249,115,22,0.3)\", text: \"#fb923c\", dot: \"#f97316\" },\n },\n neutral: {\n light: { bg: \"rgba(0,0,0,0.05)\", border: \"rgba(0,0,0,0.1)\", text: \"#52525b\", dot: \"#71717a\" },\n dark: { bg: \"rgba(255,255,255,0.08)\", border: \"rgba(255,255,255,0.12)\", text: \"#a1a1aa\", dot: \"#71717a\" },\n },\n};\n\nconst SIZE_CONFIG = {\n sm: { height: 22, padding: \"0 8px\", gap: 4, font: 10, dotSize: 5 },\n md: { height: 26, padding: \"0 10px\", gap: 5, font: 11, dotSize: 6 },\n lg: { height: 30, padding: \"0 12px\", gap: 6, font: 12, dotSize: 7 },\n};\n\nconst TYPE_COLORS: Record<string, string> = {\n feature: \"#a855f7\",\n bug: \"#ef4444\",\n improvement: \"#3b82f6\",\n chore: \"#71717a\",\n};\n\nconst COLUMN_LABELS: Record<string, string> = {\n backlog: \"Backlog\",\n todo: \"Planned\",\n \"in-progress\": \"In Progress\",\n done: \"Shipped\",\n};\n\n// =============================================================================\n// HOOKS\n// =============================================================================\n\nfunction useTheme(theme: \"light\" | \"dark\" | \"auto\"): \"light\" | \"dark\" {\n const [resolved, setResolved] = useState<\"light\" | \"dark\">(\"light\");\n\n useEffect(() => {\n if (theme === \"auto\") {\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n setResolved(isDark ? \"dark\" : \"light\");\n\n const listener = (e: MediaQueryListEvent) => setResolved(e.matches ? \"dark\" : \"light\");\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener(\"change\", listener);\n return () => mq.removeEventListener(\"change\", listener);\n } else {\n setResolved(theme);\n }\n }, [theme]);\n\n return resolved;\n}\n\n// =============================================================================\n// VERSION PILL COMPONENT (with full modal)\n// =============================================================================\n\nexport function VersionPill({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n position = \"inline\",\n className,\n theme = \"auto\",\n style = \"gradient\",\n size = \"md\",\n showBranding = true,\n accent = \"green\",\n onNewVersion,\n onClick,\n}: VersionPillProps) {\n const [project, setProject] = useState<ProjectInfo | null>(null);\n const [versions, setVersions] = useState<Version[]>([]);\n const [roadmapTasks, setRoadmapTasks] = useState<RoadmapTask[]>([]);\n const [ideas, setIdeas] = useState<Idea[]>([]);\n const [loading, setLoading] = useState(true);\n const [isOpen, setIsOpen] = useState(false);\n const [activeTab, setActiveTab] = useState<ModalTab>(\"changelog\");\n const [hasNewVersion, setHasNewVersion] = useState(false);\n\n const resolvedTheme = useTheme(theme);\n const isLight = resolvedTheme === \"light\";\n const sizeConfig = SIZE_CONFIG[size];\n\n // Fetch version from badge API\n const fetchVersion = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/badge/${projectId}`);\n if (!response.ok) throw new Error(\"Failed to fetch version\");\n\n const data: BadgeAPIResponse = await response.json();\n if (data.version) {\n setProject({ name: data.name, slug: data.slug, currentVersion: data.version });\n\n const storedVersion = localStorage.getItem(`vp_${projectId}_seen`);\n if (data.version !== storedVersion) {\n setHasNewVersion(true);\n }\n }\n } catch (err) {\n console.error(\"Failed to fetch version:\", err);\n } finally {\n setLoading(false);\n }\n }, [projectId, baseUrl]);\n\n // Fetch changelog\n const fetchChangelog = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/changelog/${projectId}?limit=10`);\n if (!response.ok) return;\n\n const data: ChangelogAPIResponse = await response.json();\n setVersions(data.changelog);\n setProject(data.project);\n\n if (data.changelog.length > 0) {\n const storedVersion = localStorage.getItem(`vp_${projectId}_seen`);\n if (data.changelog[0].version !== storedVersion) {\n setHasNewVersion(true);\n onNewVersion?.(data.changelog[0]);\n }\n }\n } catch (err) {\n console.error(\"Failed to fetch changelog:\", err);\n }\n }, [projectId, baseUrl, onNewVersion]);\n\n // Fetch roadmap\n const fetchRoadmap = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/roadmap/${projectId}`);\n if (!response.ok) return;\n\n const data: RoadmapAPIResponse = await response.json();\n setRoadmapTasks(data.tasks || []);\n } catch (err) {\n console.error(\"Failed to fetch roadmap:\", err);\n }\n }, [projectId, baseUrl]);\n\n // Fetch ideas\n const fetchIdeas = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/ideas/${projectId}`);\n if (!response.ok) return;\n\n const data = await response.json();\n setIdeas(data.ideas || []);\n } catch (err) {\n console.error(\"Failed to fetch ideas:\", err);\n }\n }, [projectId, baseUrl]);\n\n useEffect(() => {\n fetchVersion();\n }, [fetchVersion]);\n\n const handleOpen = () => {\n if (onClick) {\n onClick();\n return;\n }\n setIsOpen(true);\n fetchChangelog();\n fetchRoadmap();\n fetchIdeas();\n if (project?.currentVersion) {\n localStorage.setItem(`vp_${projectId}_seen`, project.currentVersion);\n setHasNewVersion(false);\n }\n };\n\n const currentVersion = project?.currentVersion;\n\n const positionStyles: Record<string, string> = {\n \"top-left\": \"fixed top-4 left-4 z-[9999]\",\n \"top-right\": \"fixed top-4 right-4 z-[9999]\",\n \"bottom-left\": \"fixed bottom-4 left-4 z-[9999]\",\n \"bottom-right\": \"fixed bottom-4 right-4 z-[9999]\",\n inline: \"\",\n };\n\n // Loading state\n if (loading) {\n return (\n <div className={clsx(positionStyles[position], className)} style={{ display: \"inline-flex\" }}>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.font,\n fontFamily: \"ui-monospace, monospace\",\n fontWeight: 500,\n borderRadius: 999,\n background: \"linear-gradient(135deg, #22c55e 0%, #16a34a 100%)\",\n color: \"#fff\",\n opacity: 0.6,\n }}\n >\n <span\n style={{\n width: sizeConfig.dotSize,\n height: sizeConfig.dotSize,\n borderRadius: \"50%\",\n background: \"#fff\",\n opacity: 0.6,\n }}\n />\n <span style={{ width: 32, height: sizeConfig.font, background: \"rgba(255,255,255,0.3)\", borderRadius: 2 }} />\n </span>\n </div>\n );\n }\n\n if (!currentVersion) return null;\n\n // Render the green gradient pill badge\n const renderBadge = () => {\n return (\n <button\n onClick={handleOpen}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.font,\n fontFamily: \"ui-monospace, monospace\",\n fontWeight: 600,\n borderRadius: 999,\n cursor: \"pointer\",\n border: \"none\",\n transition: \"all 150ms ease\",\n outline: \"none\",\n background: \"linear-gradient(135deg, #22c55e 0%, #16a34a 100%)\",\n color: \"#fff\",\n boxShadow: \"0 2px 8px rgba(34,197,94,0.3)\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.boxShadow = \"0 4px 12px rgba(34,197,94,0.4)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.boxShadow = \"0 2px 8px rgba(34,197,94,0.3)\";\n }}\n >\n <span\n style={{\n width: sizeConfig.dotSize,\n height: sizeConfig.dotSize,\n borderRadius: \"50%\",\n background: \"#fff\",\n boxShadow: \"0 0 6px rgba(255,255,255,0.8)\",\n flexShrink: 0,\n }}\n />\n <span>v{currentVersion}</span>\n {hasNewVersion && (\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"#fbbf24\",\n marginLeft: 2,\n }}\n />\n )}\n </button>\n );\n };\n\n // Group roadmap tasks by column\n const groupedTasks = roadmapTasks.reduce((acc, task) => {\n const col = task.column || \"backlog\";\n if (!acc[col]) acc[col] = [];\n acc[col].push(task);\n return acc;\n }, {} as Record<string, RoadmapTask[]>);\n\n return (\n <>\n <div className={clsx(positionStyles[position], className)} style={{ display: \"inline-flex\" }}>\n {renderBadge()}\n </div>\n\n {isOpen && (\n <div style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 99999,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 16,\n }}>\n {/* Backdrop */}\n <div\n onClick={() => setIsOpen(false)}\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"rgba(0,0,0,0.5)\",\n backdropFilter: \"blur(4px)\",\n }}\n />\n\n {/* Modal Panel */}\n <div\n style={{\n position: \"relative\",\n width: \"100%\",\n maxWidth: 480,\n maxHeight: \"80vh\",\n overflow: \"hidden\",\n borderRadius: 16,\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.25)\",\n background: isLight ? \"#fff\" : \"#18181b\",\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: 16,\n borderBottom: `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n {project?.icon && <span style={{ fontSize: 20 }}>{project.icon}</span>}\n <div>\n <h2 style={{ fontWeight: 600, color: isLight ? \"#18181b\" : \"#fff\", margin: 0 }}>\n {project?.name || \"What's New\"}\n </h2>\n <p style={{ fontSize: 12, color: isLight ? \"#71717a\" : \"#a1a1aa\", margin: 0 }}>\n v{currentVersion}\n </p>\n </div>\n </div>\n <button\n onClick={() => setIsOpen(false)}\n style={{\n padding: 4,\n borderRadius: 6,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n color: isLight ? \"#71717a\" : \"#a1a1aa\",\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Tabs */}\n <div\n style={{\n display: \"flex\",\n gap: 4,\n padding: \"8px 16px\",\n borderBottom: `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}`,\n }}\n >\n {([\"changelog\", \"roadmap\", \"ideas\"] as ModalTab[]).map((tab) => (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{\n padding: \"6px 12px\",\n borderRadius: 6,\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 500,\n background: activeTab === tab\n ? (isLight ? \"#f4f4f5\" : \"#27272a\")\n : \"transparent\",\n color: activeTab === tab\n ? (isLight ? \"#18181b\" : \"#fff\")\n : (isLight ? \"#71717a\" : \"#a1a1aa\"),\n }}\n >\n {tab === \"changelog\" && \"πŸš€ Changelog\"}\n {tab === \"roadmap\" && \"πŸ—ΊοΈ Roadmap\"}\n {tab === \"ideas\" && \"πŸ’‘ Ideas\"}\n </button>\n ))}\n </div>\n\n {/* Content */}\n <div style={{ padding: 16, overflowY: \"auto\", maxHeight: \"50vh\" }}>\n {/* Changelog Tab */}\n {activeTab === \"changelog\" && (\n <div>\n {versions.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: 40, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n <div style={{ fontSize: 32, marginBottom: 8 }}>πŸš€</div>\n <div>No releases yet</div>\n </div>\n ) : (\n versions.slice(0, 5).map((version, idx) => (\n <div key={idx} style={{ marginBottom: 16, paddingBottom: 16, borderBottom: idx < 4 ? `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}` : \"none\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 4 }}>\n <span style={{ fontSize: 16 }}>{version.emoji || \"πŸ“¦\"}</span>\n <span style={{ fontWeight: 600, color: isLight ? \"#18181b\" : \"#fff\" }}>\n {version.title}\n </span>\n <span\n style={{\n padding: \"2px 6px\",\n fontSize: 10,\n fontWeight: 500,\n borderRadius: 4,\n background: version.type === \"major\" ? \"#f3e8ff\" : version.type === \"minor\" ? \"#dbeafe\" : \"#f4f4f5\",\n color: version.type === \"major\" ? \"#7c3aed\" : version.type === \"minor\" ? \"#2563eb\" : \"#52525b\",\n }}\n >\n {version.type}\n </span>\n </div>\n <div style={{ fontSize: 12, color: isLight ? \"#71717a\" : \"#a1a1aa\", marginBottom: 8 }}>\n v{version.version} Β· {new Date(version.date).toLocaleDateString()}\n </div>\n {version.description && (\n <p style={{ fontSize: 14, color: isLight ? \"#52525b\" : \"#d4d4d8\", marginBottom: 8 }}>\n {version.description}\n </p>\n )}\n {version.features && version.features.length > 0 && (\n <ul style={{ margin: 0, paddingLeft: 0, listStyle: \"none\" }}>\n {version.features.map((feature, i) => (\n <li key={i} style={{ display: \"flex\", alignItems: \"flex-start\", gap: 8, fontSize: 14, color: isLight ? \"#52525b\" : \"#d4d4d8\", marginBottom: 4 }}>\n <span style={{ color: \"#22c55e\", marginTop: 2 }}>βœ“</span>\n {feature}\n </li>\n ))}\n </ul>\n )}\n </div>\n ))\n )}\n </div>\n )}\n\n {/* Roadmap Tab */}\n {activeTab === \"roadmap\" && (\n <div>\n {Object.keys(groupedTasks).length === 0 ? (\n <div style={{ textAlign: \"center\", padding: 40, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n <div style={{ fontSize: 32, marginBottom: 8 }}>πŸ—ΊοΈ</div>\n <div>No public roadmap items</div>\n </div>\n ) : (\n [\"in-progress\", \"todo\", \"backlog\", \"done\"].map((col) => {\n const tasks = groupedTasks[col];\n if (!tasks || tasks.length === 0) return null;\n return (\n <div key={col} style={{ marginBottom: 16 }}>\n <h3 style={{ fontSize: 12, fontWeight: 600, color: isLight ? \"#71717a\" : \"#a1a1aa\", marginBottom: 8, textTransform: \"uppercase\" }}>\n {COLUMN_LABELS[col] || col} ({tasks.length})\n </h3>\n {tasks.map((task) => (\n <div\n key={task.id}\n style={{\n padding: 12,\n marginBottom: 8,\n borderRadius: 8,\n background: isLight ? \"#f4f4f5\" : \"#27272a\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: TYPE_COLORS[task.type] || \"#71717a\",\n }}\n />\n <span style={{ fontSize: 14, color: isLight ? \"#18181b\" : \"#fff\" }}>\n {task.title}\n </span>\n </div>\n </div>\n ))}\n </div>\n );\n })\n )}\n </div>\n )}\n\n {/* Ideas Tab */}\n {activeTab === \"ideas\" && (\n <div>\n {ideas.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: 40, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n <div style={{ fontSize: 32, marginBottom: 8 }}>πŸ’‘</div>\n <div>No feature requests yet</div>\n </div>\n ) : (\n ideas.map((idea) => (\n <div\n key={idea.id}\n style={{\n padding: 12,\n marginBottom: 8,\n borderRadius: 8,\n background: isLight ? \"#f4f4f5\" : \"#27272a\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 12,\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n padding: \"4px 8px\",\n borderRadius: 6,\n background: isLight ? \"#fff\" : \"#18181b\",\n minWidth: 40,\n }}\n >\n <span style={{ fontSize: 14, fontWeight: 600, color: isLight ? \"#18181b\" : \"#fff\" }}>\n {idea.votes}\n </span>\n <span style={{ fontSize: 10, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>votes</span>\n </div>\n <div>\n <div style={{ fontSize: 14, fontWeight: 500, color: isLight ? \"#18181b\" : \"#fff\", marginBottom: 4 }}>\n {idea.title}\n </div>\n {idea.description && (\n <div style={{ fontSize: 13, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n {idea.description.slice(0, 100)}...\n </div>\n )}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: 12,\n borderTop: `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}`,\n background: isLight ? \"#fafafa\" : \"#0a0a0a\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n {showBranding && (\n <a\n href=\"https://versionpill.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ fontSize: 10, color: isLight ? \"#a1a1aa\" : \"#52525b\", textDecoration: \"none\" }}\n >\n Powered by Version Pill\n </a>\n )}\n <a\n href={`${baseUrl}/${projectId}/${activeTab === \"ideas\" ? \"feature-requests\" : activeTab}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n padding: \"6px 12px\",\n fontSize: 12,\n fontWeight: 500,\n borderRadius: 6,\n background: \"#22c55e\",\n color: \"#fff\",\n textDecoration: \"none\",\n }}\n >\n View All β†’\n </a>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n\n// =============================================================================\n// VERSION BADGE COMPONENT (No Modal - just badge)\n// =============================================================================\n\nexport interface VersionBadgeProps {\n projectId: string;\n baseUrl?: string;\n theme?: \"light\" | \"dark\" | \"auto\";\n style?: BadgeStyle;\n size?: BadgeSize;\n accent?: \"green\" | \"blue\" | \"purple\" | \"orange\" | \"neutral\";\n className?: string;\n href?: string;\n}\n\nexport function VersionBadge({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n theme = \"auto\",\n style = \"gradient\",\n size = \"md\",\n accent = \"green\",\n className,\n href,\n}: VersionBadgeProps) {\n const [version, setVersion] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n const resolvedTheme = useTheme(theme);\n const isLight = resolvedTheme === \"light\";\n const colors = ACCENT_COLORS[accent][isLight ? \"light\" : \"dark\"];\n const sizeConfig = SIZE_CONFIG[size];\n\n useEffect(() => {\n fetch(`${baseUrl}/api/badge/${projectId}`)\n .then((res) => res.json())\n .then((data) => setVersion(data.version))\n .catch(() => setVersion(null))\n .finally(() => setLoading(false));\n }, [projectId, baseUrl]);\n\n if (loading) {\n return (\n <span\n className={className}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.font,\n fontFamily: \"ui-monospace, monospace\",\n fontWeight: 500,\n borderRadius: 999,\n background: \"linear-gradient(135deg, #22c55e 0%, #16a34a 100%)\",\n color: \"#fff\",\n opacity: 0.6,\n }}\n >\n <span\n style={{\n width: sizeConfig.dotSize,\n height: sizeConfig.dotSize,\n borderRadius: \"50%\",\n background: \"#fff\",\n opacity: 0.6,\n }}\n />\n <span style={{ width: 32, height: sizeConfig.font, background: \"rgba(255,255,255,0.3)\", borderRadius: 2 }} />\n </span>\n );\n }\n\n if (!version) return null;\n\n const badgeStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.font,\n fontFamily: \"ui-monospace, monospace\",\n fontWeight: 600,\n borderRadius: 999,\n textDecoration: \"none\",\n transition: \"all 150ms ease\",\n background: \"linear-gradient(135deg, #22c55e 0%, #16a34a 100%)\",\n color: \"#fff\",\n boxShadow: \"0 2px 8px rgba(34,197,94,0.3)\",\n };\n\n const content = (\n <>\n <span\n style={{\n width: sizeConfig.dotSize,\n height: sizeConfig.dotSize,\n borderRadius: \"50%\",\n background: \"#fff\",\n boxShadow: \"0 0 6px rgba(255,255,255,0.8)\",\n flexShrink: 0,\n }}\n />\n <span>v{version}</span>\n </>\n );\n\n if (href) {\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={className} style={badgeStyle}>\n {content}\n </a>\n );\n }\n\n return (\n <span className={className} style={badgeStyle}>\n {content}\n </span>\n );\n}\n\n// =============================================================================\n// USE VERSION HOOK\n// =============================================================================\n\nexport interface UseVersionOptions {\n projectId: string;\n baseUrl?: string;\n refetchInterval?: number;\n}\n\nexport interface UseVersionResult {\n version: string | null;\n name: string | null;\n slug: string | null;\n loading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\nconst versionCache: Record<string, { version: string | null; name: string | null; slug: string | null }> = {};\n\nexport function useVersion({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n refetchInterval = 0,\n}: UseVersionOptions): UseVersionResult {\n const cacheKey = `${baseUrl}:${projectId}`;\n const cached = versionCache[cacheKey];\n\n const [version, setVersion] = useState<string | null>(cached?.version ?? null);\n const [name, setName] = useState<string | null>(cached?.name ?? null);\n const [slug, setSlug] = useState<string | null>(cached?.slug ?? null);\n const [loading, setLoading] = useState(!cached);\n const [error, setError] = useState<string | null>(null);\n\n const fetchVersion = useCallback(async () => {\n if (typeof window === \"undefined\") return;\n\n try {\n setError(null);\n const response = await fetch(`${baseUrl}/api/badge/${projectId}`);\n if (!response.ok) throw new Error(\"Failed to fetch version\");\n\n const data: BadgeAPIResponse = await response.json();\n versionCache[cacheKey] = { version: data.version, name: data.name, slug: data.slug };\n\n setVersion(data.version);\n setName(data.name);\n setSlug(data.slug);\n } catch (err: any) {\n setError(err.message);\n } finally {\n setLoading(false);\n }\n }, [projectId, baseUrl, cacheKey]);\n\n useEffect(() => {\n if (!cached) {\n fetchVersion();\n }\n }, [fetchVersion, cached]);\n\n useEffect(() => {\n if (refetchInterval > 0) {\n const interval = setInterval(fetchVersion, refetchInterval);\n return () => clearInterval(interval);\n }\n }, [refetchInterval, fetchVersion]);\n\n return { version, name, slug, loading, error, refetch: fetchVersion };\n}\n\n// =============================================================================\n// EMBED COMPONENTS\n// =============================================================================\n\nexport function Changelog({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n maxHeight = 600,\n theme = \"auto\",\n className,\n}: ChangelogProps) {\n const resolvedTheme = useTheme(theme);\n\n return (\n <iframe\n src={`${baseUrl}/embed/${projectId}/changelog?theme=${resolvedTheme}`}\n className={className}\n style={{ width: \"100%\", height: maxHeight, border: \"none\" }}\n title=\"Changelog\"\n />\n );\n}\n\nexport function Roadmap({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n maxHeight = 800,\n theme = \"auto\",\n className,\n}: RoadmapProps) {\n const resolvedTheme = useTheme(theme);\n\n return (\n <iframe\n src={`${baseUrl}/embed/${projectId}/roadmap?theme=${resolvedTheme}`}\n className={className}\n style={{ width: \"100%\", height: maxHeight, border: \"none\" }}\n title=\"Roadmap\"\n />\n );\n}\n\n// =============================================================================\n// DEFAULT EXPORT\n// =============================================================================\n\nexport default VersionPill;\n"],"mappings":"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","names":["clsx"]}
1
+ {"version":3,"sources":["../src/index.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useEffect, useCallback } from \"react\";\nimport clsx from \"clsx\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface Version {\n version: string;\n type: \"major\" | \"minor\" | \"patch\";\n title: string;\n description?: string | null;\n emoji?: string | null;\n features?: string[];\n date: string | number;\n tasks?: { title: string; type: string }[];\n}\n\nexport interface RoadmapTask {\n id: string;\n title: string;\n type: string;\n priority: string;\n column: string;\n isPublic?: boolean;\n}\n\nexport interface Idea {\n id: string;\n title: string;\n description?: string;\n status: string;\n votes: number;\n hasVoted?: boolean;\n}\n\nexport interface ProjectInfo {\n name: string;\n slug: string;\n icon?: string | null;\n currentVersion?: string | null;\n}\n\nexport interface ChangelogAPIResponse {\n project: ProjectInfo;\n changelog: Version[];\n}\n\nexport interface RoadmapAPIResponse {\n project: ProjectInfo;\n tasks: RoadmapTask[];\n}\n\nexport interface BadgeAPIResponse {\n version: string | null;\n name: string;\n slug: string;\n}\n\nexport interface VersionPillConfig {\n projectId: string;\n baseUrl?: string;\n}\n\nexport type BadgeStyle = \"dot\" | \"pill\" | \"minimal\" | \"glass\" | \"gradient\";\nexport type BadgeSize = \"sm\" | \"md\" | \"lg\";\nexport type ModalTab = \"changelog\" | \"roadmap\" | \"ideas\";\n\nexport interface VersionPillProps extends VersionPillConfig {\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\" | \"inline\";\n className?: string;\n theme?: \"light\" | \"dark\" | \"auto\";\n style?: BadgeStyle;\n size?: BadgeSize;\n showBranding?: boolean;\n accent?: \"green\" | \"blue\" | \"purple\" | \"orange\" | \"neutral\";\n onNewVersion?: (version: Version) => void;\n onClick?: () => void;\n}\n\nexport interface ChangelogProps extends VersionPillConfig {\n maxHeight?: number;\n theme?: \"light\" | \"dark\" | \"auto\";\n className?: string;\n}\n\nexport interface RoadmapProps extends VersionPillConfig {\n maxHeight?: number;\n theme?: \"light\" | \"dark\" | \"auto\";\n className?: string;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst DEFAULT_BASE_URL = \"https://www.versionpill.com\";\n\nconst ACCENT_COLORS = {\n green: {\n light: { bg: \"rgba(34,197,94,0.1)\", border: \"rgba(34,197,94,0.25)\", text: \"#16a34a\", dot: \"#22c55e\" },\n dark: { bg: \"rgba(34,197,94,0.15)\", border: \"rgba(34,197,94,0.3)\", text: \"#4ade80\", dot: \"#22c55e\" },\n },\n blue: {\n light: { bg: \"rgba(59,130,246,0.1)\", border: \"rgba(59,130,246,0.25)\", text: \"#2563eb\", dot: \"#3b82f6\" },\n dark: { bg: \"rgba(59,130,246,0.15)\", border: \"rgba(59,130,246,0.3)\", text: \"#60a5fa\", dot: \"#3b82f6\" },\n },\n purple: {\n light: { bg: \"rgba(147,51,234,0.1)\", border: \"rgba(147,51,234,0.25)\", text: \"#7c3aed\", dot: \"#a855f7\" },\n dark: { bg: \"rgba(147,51,234,0.15)\", border: \"rgba(147,51,234,0.3)\", text: \"#c084fc\", dot: \"#a855f7\" },\n },\n orange: {\n light: { bg: \"rgba(249,115,22,0.1)\", border: \"rgba(249,115,22,0.25)\", text: \"#ea580c\", dot: \"#f97316\" },\n dark: { bg: \"rgba(249,115,22,0.15)\", border: \"rgba(249,115,22,0.3)\", text: \"#fb923c\", dot: \"#f97316\" },\n },\n neutral: {\n light: { bg: \"rgba(0,0,0,0.05)\", border: \"rgba(0,0,0,0.1)\", text: \"#52525b\", dot: \"#71717a\" },\n dark: { bg: \"rgba(255,255,255,0.08)\", border: \"rgba(255,255,255,0.12)\", text: \"#a1a1aa\", dot: \"#71717a\" },\n },\n};\n\nconst SIZE_CONFIG = {\n sm: { height: 22, padding: \"0 8px\", gap: 4, font: 10, dotSize: 5 },\n md: { height: 26, padding: \"0 10px\", gap: 5, font: 11, dotSize: 6 },\n lg: { height: 30, padding: \"0 12px\", gap: 6, font: 12, dotSize: 7 },\n};\n\nconst TYPE_COLORS: Record<string, string> = {\n feature: \"#a855f7\",\n bug: \"#ef4444\",\n improvement: \"#3b82f6\",\n chore: \"#71717a\",\n};\n\nconst COLUMN_LABELS: Record<string, string> = {\n backlog: \"Backlog\",\n todo: \"Planned\",\n \"in-progress\": \"In Progress\",\n done: \"Shipped\",\n};\n\n// =============================================================================\n// HOOKS\n// =============================================================================\n\nfunction useTheme(theme: \"light\" | \"dark\" | \"auto\"): \"light\" | \"dark\" {\n const [resolved, setResolved] = useState<\"light\" | \"dark\">(\"light\");\n\n useEffect(() => {\n if (theme === \"auto\") {\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n setResolved(isDark ? \"dark\" : \"light\");\n\n const listener = (e: MediaQueryListEvent) => setResolved(e.matches ? \"dark\" : \"light\");\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener(\"change\", listener);\n return () => mq.removeEventListener(\"change\", listener);\n } else {\n setResolved(theme);\n }\n }, [theme]);\n\n return resolved;\n}\n\n// =============================================================================\n// VERSION PILL COMPONENT (with full modal)\n// =============================================================================\n\nexport function VersionPill({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n position = \"inline\",\n className,\n theme = \"auto\",\n style = \"glass\",\n size = \"md\",\n showBranding = true,\n accent = \"green\",\n onNewVersion,\n onClick,\n}: VersionPillProps) {\n const [project, setProject] = useState<ProjectInfo | null>(null);\n const [versions, setVersions] = useState<Version[]>([]);\n const [roadmapTasks, setRoadmapTasks] = useState<RoadmapTask[]>([]);\n const [ideas, setIdeas] = useState<Idea[]>([]);\n const [loading, setLoading] = useState(true);\n const [isOpen, setIsOpen] = useState(false);\n const [activeTab, setActiveTab] = useState<ModalTab>(\"changelog\");\n const [hasNewVersion, setHasNewVersion] = useState(false);\n\n const resolvedTheme = useTheme(theme);\n const isLight = resolvedTheme === \"light\";\n const sizeConfig = SIZE_CONFIG[size];\n\n // Fetch version from badge API\n const fetchVersion = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/badge/${projectId}`);\n if (!response.ok) throw new Error(\"Failed to fetch version\");\n\n const data: BadgeAPIResponse = await response.json();\n if (data.version) {\n setProject({ name: data.name, slug: data.slug, currentVersion: data.version });\n\n const storedVersion = localStorage.getItem(`vp_${projectId}_seen`);\n if (data.version !== storedVersion) {\n setHasNewVersion(true);\n }\n }\n } catch (err) {\n console.error(\"Failed to fetch version:\", err);\n } finally {\n setLoading(false);\n }\n }, [projectId, baseUrl]);\n\n // Fetch changelog\n const fetchChangelog = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/changelog/${projectId}?limit=10`);\n if (!response.ok) return;\n\n const data: ChangelogAPIResponse = await response.json();\n setVersions(data.changelog);\n setProject(data.project);\n\n if (data.changelog.length > 0) {\n const storedVersion = localStorage.getItem(`vp_${projectId}_seen`);\n if (data.changelog[0].version !== storedVersion) {\n setHasNewVersion(true);\n onNewVersion?.(data.changelog[0]);\n }\n }\n } catch (err) {\n console.error(\"Failed to fetch changelog:\", err);\n }\n }, [projectId, baseUrl, onNewVersion]);\n\n // Fetch roadmap\n const fetchRoadmap = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/roadmap/${projectId}`);\n if (!response.ok) return;\n\n const data: RoadmapAPIResponse = await response.json();\n setRoadmapTasks(data.tasks || []);\n } catch (err) {\n console.error(\"Failed to fetch roadmap:\", err);\n }\n }, [projectId, baseUrl]);\n\n // Fetch ideas\n const fetchIdeas = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/ideas/${projectId}`);\n if (!response.ok) return;\n\n const data = await response.json();\n setIdeas(data.ideas || []);\n } catch (err) {\n console.error(\"Failed to fetch ideas:\", err);\n }\n }, [projectId, baseUrl]);\n\n useEffect(() => {\n fetchVersion();\n }, [fetchVersion]);\n\n const handleOpen = () => {\n if (onClick) {\n onClick();\n return;\n }\n setIsOpen(true);\n fetchChangelog();\n fetchRoadmap();\n fetchIdeas();\n if (project?.currentVersion) {\n localStorage.setItem(`vp_${projectId}_seen`, project.currentVersion);\n setHasNewVersion(false);\n }\n };\n\n const currentVersion = project?.currentVersion;\n\n const positionStyles: Record<string, string> = {\n \"top-left\": \"fixed top-4 left-4 z-[9999]\",\n \"top-right\": \"fixed top-4 right-4 z-[9999]\",\n \"bottom-left\": \"fixed bottom-4 left-4 z-[9999]\",\n \"bottom-right\": \"fixed bottom-4 right-4 z-[9999]\",\n inline: \"\",\n };\n\n // Get badge style based on style prop\n const getBadgeStyle = (): React.CSSProperties => {\n const base: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.font,\n fontFamily: \"ui-monospace, monospace\",\n fontWeight: 600,\n borderRadius: 999,\n cursor: \"pointer\",\n transition: \"all 150ms ease\",\n outline: \"none\",\n };\n\n if (style === \"gradient\") {\n return {\n ...base,\n background: \"linear-gradient(135deg, #22c55e 0%, #16a34a 100%)\",\n border: \"none\",\n color: \"#fff\",\n boxShadow: \"0 2px 8px rgba(34,197,94,0.3)\",\n };\n }\n\n // Glass style (default)\n return {\n ...base,\n background: isLight\n ? \"rgba(34, 197, 94, 0.12)\"\n : \"rgba(34, 197, 94, 0.18)\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n border: isLight\n ? \"1px solid rgba(34, 197, 94, 0.25)\"\n : \"1px solid rgba(34, 197, 94, 0.35)\",\n color: isLight ? \"#16a34a\" : \"#4ade80\",\n boxShadow: isLight\n ? \"0 2px 8px rgba(34, 197, 94, 0.15), inset 0 1px 0 rgba(255,255,255,0.5)\"\n : \"0 2px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.1)\",\n };\n };\n\n const getDotStyle = (): React.CSSProperties => ({\n width: sizeConfig.dotSize,\n height: sizeConfig.dotSize,\n borderRadius: \"50%\",\n background: style === \"gradient\" ? \"#fff\" : \"#22c55e\",\n boxShadow: style === \"gradient\"\n ? \"0 0 6px rgba(255,255,255,0.8)\"\n : \"0 0 6px rgba(34,197,94,0.6)\",\n flexShrink: 0,\n });\n\n // Loading state\n if (loading) {\n const loadingStyle = getBadgeStyle();\n return (\n <div className={clsx(positionStyles[position], className)} style={{ display: \"inline-flex\" }}>\n <span style={{ ...loadingStyle, opacity: 0.6, cursor: \"default\" }}>\n <span style={{ ...getDotStyle(), opacity: 0.6 }} />\n <span style={{\n width: 32,\n height: sizeConfig.font,\n background: style === \"gradient\" ? \"rgba(255,255,255,0.3)\" : \"rgba(34,197,94,0.3)\",\n borderRadius: 2\n }} />\n </span>\n </div>\n );\n }\n\n if (!currentVersion) return null;\n\n // Render the badge\n const renderBadge = () => {\n const badgeStyle = getBadgeStyle();\n const dotStyle = getDotStyle();\n\n return (\n <button\n onClick={handleOpen}\n style={badgeStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = \"scale(1.02)\";\n e.currentTarget.style.boxShadow = style === \"gradient\"\n ? \"0 4px 12px rgba(34,197,94,0.4)\"\n : isLight\n ? \"0 4px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.5)\"\n : \"0 4px 16px rgba(34, 197, 94, 0.35), inset 0 1px 0 rgba(255,255,255,0.1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = \"scale(1)\";\n e.currentTarget.style.boxShadow = style === \"gradient\"\n ? \"0 2px 8px rgba(34,197,94,0.3)\"\n : isLight\n ? \"0 2px 8px rgba(34, 197, 94, 0.15), inset 0 1px 0 rgba(255,255,255,0.5)\"\n : \"0 2px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.1)\";\n }}\n >\n <span style={dotStyle} />\n <span>v{currentVersion}</span>\n {hasNewVersion && (\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"#fbbf24\",\n marginLeft: 2,\n }}\n />\n )}\n </button>\n );\n };\n\n // Group roadmap tasks by column\n const groupedTasks = (roadmapTasks || []).reduce((acc, task) => {\n const col = task.column || \"backlog\";\n if (!acc[col]) acc[col] = [];\n acc[col].push(task);\n return acc;\n }, {} as Record<string, RoadmapTask[]>);\n\n return (\n <>\n <div className={clsx(positionStyles[position], className)} style={{ display: \"inline-flex\" }}>\n {renderBadge()}\n </div>\n\n {isOpen && (\n <div style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 99999,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 16,\n }}>\n {/* Backdrop */}\n <div\n onClick={() => setIsOpen(false)}\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"rgba(0,0,0,0.5)\",\n backdropFilter: \"blur(4px)\",\n }}\n />\n\n {/* Modal Panel */}\n <div\n style={{\n position: \"relative\",\n width: \"100%\",\n maxWidth: 480,\n maxHeight: \"80vh\",\n overflow: \"hidden\",\n borderRadius: 16,\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.25)\",\n background: isLight ? \"#fff\" : \"#18181b\",\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: 16,\n borderBottom: `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n {project?.icon && <span style={{ fontSize: 20 }}>{project.icon}</span>}\n <div>\n <h2 style={{ fontWeight: 600, color: isLight ? \"#18181b\" : \"#fff\", margin: 0 }}>\n {project?.name || \"What's New\"}\n </h2>\n <p style={{ fontSize: 12, color: isLight ? \"#71717a\" : \"#a1a1aa\", margin: 0 }}>\n v{currentVersion}\n </p>\n </div>\n </div>\n <button\n onClick={() => setIsOpen(false)}\n style={{\n padding: 4,\n borderRadius: 6,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n color: isLight ? \"#71717a\" : \"#a1a1aa\",\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Tabs */}\n <div\n style={{\n display: \"flex\",\n gap: 4,\n padding: \"8px 16px\",\n borderBottom: `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}`,\n }}\n >\n {([\"changelog\", \"roadmap\", \"ideas\"] as ModalTab[]).map((tab) => (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{\n padding: \"6px 12px\",\n borderRadius: 6,\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 500,\n background: activeTab === tab\n ? (isLight ? \"#f4f4f5\" : \"#27272a\")\n : \"transparent\",\n color: activeTab === tab\n ? (isLight ? \"#18181b\" : \"#fff\")\n : (isLight ? \"#71717a\" : \"#a1a1aa\"),\n }}\n >\n {tab === \"changelog\" && \"πŸš€ Changelog\"}\n {tab === \"roadmap\" && \"πŸ—ΊοΈ Roadmap\"}\n {tab === \"ideas\" && \"πŸ’‘ Ideas\"}\n </button>\n ))}\n </div>\n\n {/* Content */}\n <div style={{ padding: 16, overflowY: \"auto\", maxHeight: \"50vh\" }}>\n {/* Changelog Tab */}\n {activeTab === \"changelog\" && (\n <div>\n {versions.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: 40, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n <div style={{ fontSize: 32, marginBottom: 8 }}>πŸš€</div>\n <div>No releases yet</div>\n </div>\n ) : (\n versions.slice(0, 5).map((version, idx) => (\n <div key={idx} style={{ marginBottom: 16, paddingBottom: 16, borderBottom: idx < 4 ? `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}` : \"none\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 4 }}>\n <span style={{ fontSize: 16 }}>{version.emoji || \"πŸ“¦\"}</span>\n <span style={{ fontWeight: 600, color: isLight ? \"#18181b\" : \"#fff\" }}>\n {version.title}\n </span>\n <span\n style={{\n padding: \"2px 6px\",\n fontSize: 10,\n fontWeight: 500,\n borderRadius: 4,\n background: version.type === \"major\" ? \"#f3e8ff\" : version.type === \"minor\" ? \"#dbeafe\" : \"#f4f4f5\",\n color: version.type === \"major\" ? \"#7c3aed\" : version.type === \"minor\" ? \"#2563eb\" : \"#52525b\",\n }}\n >\n {version.type}\n </span>\n </div>\n <div style={{ fontSize: 12, color: isLight ? \"#71717a\" : \"#a1a1aa\", marginBottom: 8 }}>\n v{version.version} Β· {new Date(version.date).toLocaleDateString()}\n </div>\n {version.description && (\n <p style={{ fontSize: 14, color: isLight ? \"#52525b\" : \"#d4d4d8\", marginBottom: 8 }}>\n {version.description}\n </p>\n )}\n {version.features && version.features.length > 0 && (\n <ul style={{ margin: 0, paddingLeft: 0, listStyle: \"none\" }}>\n {version.features.map((feature, i) => (\n <li key={i} style={{ display: \"flex\", alignItems: \"flex-start\", gap: 8, fontSize: 14, color: isLight ? \"#52525b\" : \"#d4d4d8\", marginBottom: 4 }}>\n <span style={{ color: \"#22c55e\", marginTop: 2 }}>βœ“</span>\n {feature}\n </li>\n ))}\n </ul>\n )}\n </div>\n ))\n )}\n </div>\n )}\n\n {/* Roadmap Tab */}\n {activeTab === \"roadmap\" && (\n <div>\n {Object.keys(groupedTasks).length === 0 ? (\n <div style={{ textAlign: \"center\", padding: 40, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n <div style={{ fontSize: 32, marginBottom: 8 }}>πŸ—ΊοΈ</div>\n <div>No public roadmap items</div>\n </div>\n ) : (\n [\"in-progress\", \"todo\", \"backlog\", \"done\"].map((col) => {\n const tasks = groupedTasks[col];\n if (!tasks || tasks.length === 0) return null;\n return (\n <div key={col} style={{ marginBottom: 16 }}>\n <h3 style={{ fontSize: 12, fontWeight: 600, color: isLight ? \"#71717a\" : \"#a1a1aa\", marginBottom: 8, textTransform: \"uppercase\" }}>\n {COLUMN_LABELS[col] || col} ({tasks.length})\n </h3>\n {tasks.map((task) => (\n <div\n key={task.id}\n style={{\n padding: 12,\n marginBottom: 8,\n borderRadius: 8,\n background: isLight ? \"#f4f4f5\" : \"#27272a\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: TYPE_COLORS[task.type] || \"#71717a\",\n }}\n />\n <span style={{ fontSize: 14, color: isLight ? \"#18181b\" : \"#fff\" }}>\n {task.title}\n </span>\n </div>\n </div>\n ))}\n </div>\n );\n })\n )}\n </div>\n )}\n\n {/* Ideas Tab */}\n {activeTab === \"ideas\" && (\n <div>\n {ideas.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: 40, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n <div style={{ fontSize: 32, marginBottom: 8 }}>πŸ’‘</div>\n <div>No feature requests yet</div>\n </div>\n ) : (\n ideas.map((idea) => (\n <div\n key={idea.id}\n style={{\n padding: 12,\n marginBottom: 8,\n borderRadius: 8,\n background: isLight ? \"#f4f4f5\" : \"#27272a\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 12,\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n padding: \"4px 8px\",\n borderRadius: 6,\n background: isLight ? \"#fff\" : \"#18181b\",\n minWidth: 40,\n }}\n >\n <span style={{ fontSize: 14, fontWeight: 600, color: isLight ? \"#18181b\" : \"#fff\" }}>\n {idea.votes}\n </span>\n <span style={{ fontSize: 10, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>votes</span>\n </div>\n <div>\n <div style={{ fontSize: 14, fontWeight: 500, color: isLight ? \"#18181b\" : \"#fff\", marginBottom: 4 }}>\n {idea.title}\n </div>\n {idea.description && (\n <div style={{ fontSize: 13, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n {idea.description.slice(0, 100)}...\n </div>\n )}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: 12,\n borderTop: `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}`,\n background: isLight ? \"#fafafa\" : \"#0a0a0a\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n {showBranding && (\n <a\n href=\"https://versionpill.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ fontSize: 10, color: isLight ? \"#a1a1aa\" : \"#52525b\", textDecoration: \"none\" }}\n >\n Powered by Version Pill\n </a>\n )}\n <a\n href={`${baseUrl}/${projectId}/${activeTab === \"ideas\" ? \"feature-requests\" : activeTab}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n padding: \"6px 12px\",\n fontSize: 12,\n fontWeight: 500,\n borderRadius: 6,\n background: \"#22c55e\",\n color: \"#fff\",\n textDecoration: \"none\",\n }}\n >\n View All β†’\n </a>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n\n// =============================================================================\n// VERSION BADGE COMPONENT (No Modal - just badge)\n// =============================================================================\n\nexport interface VersionBadgeProps {\n projectId: string;\n baseUrl?: string;\n theme?: \"light\" | \"dark\" | \"auto\";\n style?: BadgeStyle;\n size?: BadgeSize;\n accent?: \"green\" | \"blue\" | \"purple\" | \"orange\" | \"neutral\";\n className?: string;\n href?: string;\n}\n\nexport function VersionBadge({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n theme = \"auto\",\n style = \"glass\",\n size = \"md\",\n accent = \"green\",\n className,\n href,\n}: VersionBadgeProps) {\n const [version, setVersion] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n const resolvedTheme = useTheme(theme);\n const isLight = resolvedTheme === \"light\";\n const colors = ACCENT_COLORS[accent][isLight ? \"light\" : \"dark\"];\n const sizeConfig = SIZE_CONFIG[size];\n\n useEffect(() => {\n fetch(`${baseUrl}/api/badge/${projectId}`)\n .then((res) => res.json())\n .then((data) => setVersion(data.version))\n .catch(() => setVersion(null))\n .finally(() => setLoading(false));\n }, [projectId, baseUrl]);\n\n // Style configurations\n const getStyleConfig = (): React.CSSProperties => {\n const base: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.font,\n fontFamily: \"ui-monospace, monospace\",\n fontWeight: 600,\n borderRadius: 999,\n textDecoration: \"none\",\n transition: \"all 150ms ease\",\n cursor: \"pointer\",\n };\n\n switch (style) {\n case \"glass\":\n return {\n ...base,\n background: isLight\n ? \"rgba(34, 197, 94, 0.12)\"\n : \"rgba(34, 197, 94, 0.18)\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n border: isLight\n ? \"1px solid rgba(34, 197, 94, 0.25)\"\n : \"1px solid rgba(34, 197, 94, 0.35)\",\n color: isLight ? \"#16a34a\" : \"#4ade80\",\n boxShadow: isLight\n ? \"0 2px 8px rgba(34, 197, 94, 0.15), inset 0 1px 0 rgba(255,255,255,0.5)\"\n : \"0 2px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.1)\",\n };\n case \"gradient\":\n return {\n ...base,\n background: \"linear-gradient(135deg, #22c55e 0%, #16a34a 100%)\",\n color: \"#fff\",\n boxShadow: \"0 2px 8px rgba(34,197,94,0.3)\",\n };\n case \"pill\":\n return {\n ...base,\n background: colors.bg,\n border: `1px solid ${colors.border}`,\n color: colors.text,\n };\n case \"minimal\":\n return {\n ...base,\n background: \"transparent\",\n color: colors.text,\n padding: \"0 4px\",\n };\n case \"dot\":\n return {\n ...base,\n background: colors.bg,\n border: `1px solid ${colors.border}`,\n color: colors.text,\n };\n default:\n return {\n ...base,\n background: isLight\n ? \"rgba(34, 197, 94, 0.12)\"\n : \"rgba(34, 197, 94, 0.18)\",\n backdropFilter: \"blur(8px)\",\n border: isLight\n ? \"1px solid rgba(34, 197, 94, 0.25)\"\n : \"1px solid rgba(34, 197, 94, 0.35)\",\n color: isLight ? \"#16a34a\" : \"#4ade80\",\n boxShadow: \"0 2px 8px rgba(34, 197, 94, 0.15)\",\n };\n }\n };\n\n const getDotStyle = (): React.CSSProperties => {\n const isGlassOrPill = style === \"glass\" || style === \"pill\" || style === \"dot\";\n return {\n width: sizeConfig.dotSize,\n height: sizeConfig.dotSize,\n borderRadius: \"50%\",\n background: style === \"gradient\" ? \"#fff\" : \"#22c55e\",\n boxShadow: style === \"gradient\"\n ? \"0 0 6px rgba(255,255,255,0.8)\"\n : \"0 0 6px rgba(34,197,94,0.6)\",\n flexShrink: 0,\n };\n };\n\n if (loading) {\n const loadingStyle = getStyleConfig();\n return (\n <span className={className} style={{ ...loadingStyle, opacity: 0.6 }}>\n <span style={{ ...getDotStyle(), opacity: 0.6 }} />\n <span style={{\n width: 32,\n height: sizeConfig.font,\n background: style === \"gradient\" ? \"rgba(255,255,255,0.3)\" : \"rgba(34,197,94,0.3)\",\n borderRadius: 2\n }} />\n </span>\n );\n }\n\n if (!version) return null;\n\n const badgeStyle = getStyleConfig();\n const dotStyle = getDotStyle();\n\n const content = (\n <>\n <span style={dotStyle} />\n <span>v{version}</span>\n </>\n );\n\n if (href) {\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={className} style={badgeStyle}>\n {content}\n </a>\n );\n }\n\n return (\n <span className={className} style={badgeStyle}>\n {content}\n </span>\n );\n}\n\n// =============================================================================\n// USE VERSION HOOK\n// =============================================================================\n\nexport interface UseVersionOptions {\n projectId: string;\n baseUrl?: string;\n refetchInterval?: number;\n}\n\nexport interface UseVersionResult {\n version: string | null;\n name: string | null;\n slug: string | null;\n loading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\nconst versionCache: Record<string, { version: string | null; name: string | null; slug: string | null }> = {};\n\nexport function useVersion({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n refetchInterval = 0,\n}: UseVersionOptions): UseVersionResult {\n const cacheKey = `${baseUrl}:${projectId}`;\n const cached = versionCache[cacheKey];\n\n const [version, setVersion] = useState<string | null>(cached?.version ?? null);\n const [name, setName] = useState<string | null>(cached?.name ?? null);\n const [slug, setSlug] = useState<string | null>(cached?.slug ?? null);\n const [loading, setLoading] = useState(!cached);\n const [error, setError] = useState<string | null>(null);\n\n const fetchVersion = useCallback(async () => {\n if (typeof window === \"undefined\") return;\n\n try {\n setError(null);\n const response = await fetch(`${baseUrl}/api/badge/${projectId}`);\n if (!response.ok) throw new Error(\"Failed to fetch version\");\n\n const data: BadgeAPIResponse = await response.json();\n versionCache[cacheKey] = { version: data.version, name: data.name, slug: data.slug };\n\n setVersion(data.version);\n setName(data.name);\n setSlug(data.slug);\n } catch (err: any) {\n setError(err.message);\n } finally {\n setLoading(false);\n }\n }, [projectId, baseUrl, cacheKey]);\n\n useEffect(() => {\n if (!cached) {\n fetchVersion();\n }\n }, [fetchVersion, cached]);\n\n useEffect(() => {\n if (refetchInterval > 0) {\n const interval = setInterval(fetchVersion, refetchInterval);\n return () => clearInterval(interval);\n }\n }, [refetchInterval, fetchVersion]);\n\n return { version, name, slug, loading, error, refetch: fetchVersion };\n}\n\n// =============================================================================\n// EMBED COMPONENTS\n// =============================================================================\n\nexport function Changelog({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n maxHeight = 600,\n theme = \"auto\",\n className,\n}: ChangelogProps) {\n const resolvedTheme = useTheme(theme);\n\n return (\n <iframe\n src={`${baseUrl}/embed/${projectId}/changelog?theme=${resolvedTheme}`}\n className={className}\n style={{ width: \"100%\", height: maxHeight, border: \"none\" }}\n title=\"Changelog\"\n />\n );\n}\n\nexport function Roadmap({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n maxHeight = 800,\n theme = \"auto\",\n className,\n}: RoadmapProps) {\n const resolvedTheme = useTheme(theme);\n\n return (\n <iframe\n src={`${baseUrl}/embed/${projectId}/roadmap?theme=${resolvedTheme}`}\n className={className}\n style={{ width: \"100%\", height: maxHeight, border: \"none\" }}\n title=\"Roadmap\"\n />\n );\n}\n\n// =============================================================================\n// DEFAULT EXPORT\n// =============================================================================\n\nexport default VersionPill;\n"],"mappings":"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","names":["clsx"]}
package/dist/index.mjs CHANGED
@@ -66,7 +66,7 @@ function VersionPill({
66
66
  position = "inline",
67
67
  className,
68
68
  theme = "auto",
69
- style = "gradient",
69
+ style = "glass",
70
70
  size = "md",
71
71
  showBranding = true,
72
72
  accent = "green",
@@ -165,86 +165,79 @@ function VersionPill({
165
165
  "bottom-right": "fixed bottom-4 right-4 z-[9999]",
166
166
  inline: ""
167
167
  };
168
+ const getBadgeStyle = () => {
169
+ const base = {
170
+ display: "inline-flex",
171
+ alignItems: "center",
172
+ gap: sizeConfig.gap,
173
+ height: sizeConfig.height,
174
+ padding: sizeConfig.padding,
175
+ fontSize: sizeConfig.font,
176
+ fontFamily: "ui-monospace, monospace",
177
+ fontWeight: 600,
178
+ borderRadius: 999,
179
+ cursor: "pointer",
180
+ transition: "all 150ms ease",
181
+ outline: "none"
182
+ };
183
+ if (style === "gradient") {
184
+ return {
185
+ ...base,
186
+ background: "linear-gradient(135deg, #22c55e 0%, #16a34a 100%)",
187
+ border: "none",
188
+ color: "#fff",
189
+ boxShadow: "0 2px 8px rgba(34,197,94,0.3)"
190
+ };
191
+ }
192
+ return {
193
+ ...base,
194
+ background: isLight ? "rgba(34, 197, 94, 0.12)" : "rgba(34, 197, 94, 0.18)",
195
+ backdropFilter: "blur(8px)",
196
+ WebkitBackdropFilter: "blur(8px)",
197
+ border: isLight ? "1px solid rgba(34, 197, 94, 0.25)" : "1px solid rgba(34, 197, 94, 0.35)",
198
+ color: isLight ? "#16a34a" : "#4ade80",
199
+ boxShadow: isLight ? "0 2px 8px rgba(34, 197, 94, 0.15), inset 0 1px 0 rgba(255,255,255,0.5)" : "0 2px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.1)"
200
+ };
201
+ };
202
+ const getDotStyle = () => ({
203
+ width: sizeConfig.dotSize,
204
+ height: sizeConfig.dotSize,
205
+ borderRadius: "50%",
206
+ background: style === "gradient" ? "#fff" : "#22c55e",
207
+ boxShadow: style === "gradient" ? "0 0 6px rgba(255,255,255,0.8)" : "0 0 6px rgba(34,197,94,0.6)",
208
+ flexShrink: 0
209
+ });
168
210
  if (loading) {
169
- return /* @__PURE__ */ jsx("div", { className: clsx(positionStyles[position], className), style: { display: "inline-flex" }, children: /* @__PURE__ */ jsxs(
170
- "span",
171
- {
172
- style: {
173
- display: "inline-flex",
174
- alignItems: "center",
175
- gap: sizeConfig.gap,
176
- height: sizeConfig.height,
177
- padding: sizeConfig.padding,
178
- fontSize: sizeConfig.font,
179
- fontFamily: "ui-monospace, monospace",
180
- fontWeight: 500,
181
- borderRadius: 999,
182
- background: "linear-gradient(135deg, #22c55e 0%, #16a34a 100%)",
183
- color: "#fff",
184
- opacity: 0.6
185
- },
186
- children: [
187
- /* @__PURE__ */ jsx(
188
- "span",
189
- {
190
- style: {
191
- width: sizeConfig.dotSize,
192
- height: sizeConfig.dotSize,
193
- borderRadius: "50%",
194
- background: "#fff",
195
- opacity: 0.6
196
- }
197
- }
198
- ),
199
- /* @__PURE__ */ jsx("span", { style: { width: 32, height: sizeConfig.font, background: "rgba(255,255,255,0.3)", borderRadius: 2 } })
200
- ]
201
- }
202
- ) });
211
+ const loadingStyle = getBadgeStyle();
212
+ return /* @__PURE__ */ jsx("div", { className: clsx(positionStyles[position], className), style: { display: "inline-flex" }, children: /* @__PURE__ */ jsxs("span", { style: { ...loadingStyle, opacity: 0.6, cursor: "default" }, children: [
213
+ /* @__PURE__ */ jsx("span", { style: { ...getDotStyle(), opacity: 0.6 } }),
214
+ /* @__PURE__ */ jsx("span", { style: {
215
+ width: 32,
216
+ height: sizeConfig.font,
217
+ background: style === "gradient" ? "rgba(255,255,255,0.3)" : "rgba(34,197,94,0.3)",
218
+ borderRadius: 2
219
+ } })
220
+ ] }) });
203
221
  }
204
222
  if (!currentVersion) return null;
205
223
  const renderBadge = () => {
224
+ const badgeStyle = getBadgeStyle();
225
+ const dotStyle = getDotStyle();
206
226
  return /* @__PURE__ */ jsxs(
207
227
  "button",
208
228
  {
209
229
  onClick: handleOpen,
210
- style: {
211
- display: "inline-flex",
212
- alignItems: "center",
213
- gap: sizeConfig.gap,
214
- height: sizeConfig.height,
215
- padding: sizeConfig.padding,
216
- fontSize: sizeConfig.font,
217
- fontFamily: "ui-monospace, monospace",
218
- fontWeight: 600,
219
- borderRadius: 999,
220
- cursor: "pointer",
221
- border: "none",
222
- transition: "all 150ms ease",
223
- outline: "none",
224
- background: "linear-gradient(135deg, #22c55e 0%, #16a34a 100%)",
225
- color: "#fff",
226
- boxShadow: "0 2px 8px rgba(34,197,94,0.3)"
227
- },
230
+ style: badgeStyle,
228
231
  onMouseEnter: (e) => {
229
- e.currentTarget.style.boxShadow = "0 4px 12px rgba(34,197,94,0.4)";
232
+ e.currentTarget.style.transform = "scale(1.02)";
233
+ e.currentTarget.style.boxShadow = style === "gradient" ? "0 4px 12px rgba(34,197,94,0.4)" : isLight ? "0 4px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.5)" : "0 4px 16px rgba(34, 197, 94, 0.35), inset 0 1px 0 rgba(255,255,255,0.1)";
230
234
  },
231
235
  onMouseLeave: (e) => {
232
- e.currentTarget.style.boxShadow = "0 2px 8px rgba(34,197,94,0.3)";
236
+ e.currentTarget.style.transform = "scale(1)";
237
+ e.currentTarget.style.boxShadow = style === "gradient" ? "0 2px 8px rgba(34,197,94,0.3)" : isLight ? "0 2px 8px rgba(34, 197, 94, 0.15), inset 0 1px 0 rgba(255,255,255,0.5)" : "0 2px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.1)";
233
238
  },
234
239
  children: [
235
- /* @__PURE__ */ jsx(
236
- "span",
237
- {
238
- style: {
239
- width: sizeConfig.dotSize,
240
- height: sizeConfig.dotSize,
241
- borderRadius: "50%",
242
- background: "#fff",
243
- boxShadow: "0 0 6px rgba(255,255,255,0.8)",
244
- flexShrink: 0
245
- }
246
- }
247
- ),
240
+ /* @__PURE__ */ jsx("span", { style: dotStyle }),
248
241
  /* @__PURE__ */ jsxs("span", { children: [
249
242
  "v",
250
243
  currentVersion
@@ -265,7 +258,7 @@ function VersionPill({
265
258
  }
266
259
  );
267
260
  };
268
- const groupedTasks = roadmapTasks.reduce((acc, task) => {
261
+ const groupedTasks = (roadmapTasks || []).reduce((acc, task) => {
269
262
  const col = task.column || "backlog";
270
263
  if (!acc[col]) acc[col] = [];
271
264
  acc[col].push(task);
@@ -555,7 +548,7 @@ function VersionBadge({
555
548
  projectId,
556
549
  baseUrl = DEFAULT_BASE_URL,
557
550
  theme = "auto",
558
- style = "gradient",
551
+ style = "glass",
559
552
  size = "md",
560
553
  accent = "green",
561
554
  className,
@@ -570,74 +563,99 @@ function VersionBadge({
570
563
  useEffect(() => {
571
564
  fetch(`${baseUrl}/api/badge/${projectId}`).then((res) => res.json()).then((data) => setVersion(data.version)).catch(() => setVersion(null)).finally(() => setLoading(false));
572
565
  }, [projectId, baseUrl]);
573
- if (loading) {
574
- return /* @__PURE__ */ jsxs(
575
- "span",
576
- {
577
- className,
578
- style: {
579
- display: "inline-flex",
580
- alignItems: "center",
581
- gap: sizeConfig.gap,
582
- height: sizeConfig.height,
583
- padding: sizeConfig.padding,
584
- fontSize: sizeConfig.font,
585
- fontFamily: "ui-monospace, monospace",
586
- fontWeight: 500,
587
- borderRadius: 999,
566
+ const getStyleConfig = () => {
567
+ const base = {
568
+ display: "inline-flex",
569
+ alignItems: "center",
570
+ gap: sizeConfig.gap,
571
+ height: sizeConfig.height,
572
+ padding: sizeConfig.padding,
573
+ fontSize: sizeConfig.font,
574
+ fontFamily: "ui-monospace, monospace",
575
+ fontWeight: 600,
576
+ borderRadius: 999,
577
+ textDecoration: "none",
578
+ transition: "all 150ms ease",
579
+ cursor: "pointer"
580
+ };
581
+ switch (style) {
582
+ case "glass":
583
+ return {
584
+ ...base,
585
+ background: isLight ? "rgba(34, 197, 94, 0.12)" : "rgba(34, 197, 94, 0.18)",
586
+ backdropFilter: "blur(8px)",
587
+ WebkitBackdropFilter: "blur(8px)",
588
+ border: isLight ? "1px solid rgba(34, 197, 94, 0.25)" : "1px solid rgba(34, 197, 94, 0.35)",
589
+ color: isLight ? "#16a34a" : "#4ade80",
590
+ boxShadow: isLight ? "0 2px 8px rgba(34, 197, 94, 0.15), inset 0 1px 0 rgba(255,255,255,0.5)" : "0 2px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.1)"
591
+ };
592
+ case "gradient":
593
+ return {
594
+ ...base,
588
595
  background: "linear-gradient(135deg, #22c55e 0%, #16a34a 100%)",
589
596
  color: "#fff",
590
- opacity: 0.6
591
- },
592
- children: [
593
- /* @__PURE__ */ jsx(
594
- "span",
595
- {
596
- style: {
597
- width: sizeConfig.dotSize,
598
- height: sizeConfig.dotSize,
599
- borderRadius: "50%",
600
- background: "#fff",
601
- opacity: 0.6
602
- }
603
- }
604
- ),
605
- /* @__PURE__ */ jsx("span", { style: { width: 32, height: sizeConfig.font, background: "rgba(255,255,255,0.3)", borderRadius: 2 } })
606
- ]
607
- }
608
- );
597
+ boxShadow: "0 2px 8px rgba(34,197,94,0.3)"
598
+ };
599
+ case "pill":
600
+ return {
601
+ ...base,
602
+ background: colors.bg,
603
+ border: `1px solid ${colors.border}`,
604
+ color: colors.text
605
+ };
606
+ case "minimal":
607
+ return {
608
+ ...base,
609
+ background: "transparent",
610
+ color: colors.text,
611
+ padding: "0 4px"
612
+ };
613
+ case "dot":
614
+ return {
615
+ ...base,
616
+ background: colors.bg,
617
+ border: `1px solid ${colors.border}`,
618
+ color: colors.text
619
+ };
620
+ default:
621
+ return {
622
+ ...base,
623
+ background: isLight ? "rgba(34, 197, 94, 0.12)" : "rgba(34, 197, 94, 0.18)",
624
+ backdropFilter: "blur(8px)",
625
+ border: isLight ? "1px solid rgba(34, 197, 94, 0.25)" : "1px solid rgba(34, 197, 94, 0.35)",
626
+ color: isLight ? "#16a34a" : "#4ade80",
627
+ boxShadow: "0 2px 8px rgba(34, 197, 94, 0.15)"
628
+ };
629
+ }
630
+ };
631
+ const getDotStyle = () => {
632
+ const isGlassOrPill = style === "glass" || style === "pill" || style === "dot";
633
+ return {
634
+ width: sizeConfig.dotSize,
635
+ height: sizeConfig.dotSize,
636
+ borderRadius: "50%",
637
+ background: style === "gradient" ? "#fff" : "#22c55e",
638
+ boxShadow: style === "gradient" ? "0 0 6px rgba(255,255,255,0.8)" : "0 0 6px rgba(34,197,94,0.6)",
639
+ flexShrink: 0
640
+ };
641
+ };
642
+ if (loading) {
643
+ const loadingStyle = getStyleConfig();
644
+ return /* @__PURE__ */ jsxs("span", { className, style: { ...loadingStyle, opacity: 0.6 }, children: [
645
+ /* @__PURE__ */ jsx("span", { style: { ...getDotStyle(), opacity: 0.6 } }),
646
+ /* @__PURE__ */ jsx("span", { style: {
647
+ width: 32,
648
+ height: sizeConfig.font,
649
+ background: style === "gradient" ? "rgba(255,255,255,0.3)" : "rgba(34,197,94,0.3)",
650
+ borderRadius: 2
651
+ } })
652
+ ] });
609
653
  }
610
654
  if (!version) return null;
611
- const badgeStyle = {
612
- display: "inline-flex",
613
- alignItems: "center",
614
- gap: sizeConfig.gap,
615
- height: sizeConfig.height,
616
- padding: sizeConfig.padding,
617
- fontSize: sizeConfig.font,
618
- fontFamily: "ui-monospace, monospace",
619
- fontWeight: 600,
620
- borderRadius: 999,
621
- textDecoration: "none",
622
- transition: "all 150ms ease",
623
- background: "linear-gradient(135deg, #22c55e 0%, #16a34a 100%)",
624
- color: "#fff",
625
- boxShadow: "0 2px 8px rgba(34,197,94,0.3)"
626
- };
655
+ const badgeStyle = getStyleConfig();
656
+ const dotStyle = getDotStyle();
627
657
  const content = /* @__PURE__ */ jsxs(Fragment, { children: [
628
- /* @__PURE__ */ jsx(
629
- "span",
630
- {
631
- style: {
632
- width: sizeConfig.dotSize,
633
- height: sizeConfig.dotSize,
634
- borderRadius: "50%",
635
- background: "#fff",
636
- boxShadow: "0 0 6px rgba(255,255,255,0.8)",
637
- flexShrink: 0
638
- }
639
- }
640
- ),
658
+ /* @__PURE__ */ jsx("span", { style: dotStyle }),
641
659
  /* @__PURE__ */ jsxs("span", { children: [
642
660
  "v",
643
661
  version
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useEffect, useCallback } from \"react\";\nimport clsx from \"clsx\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface Version {\n version: string;\n type: \"major\" | \"minor\" | \"patch\";\n title: string;\n description?: string | null;\n emoji?: string | null;\n features?: string[];\n date: string | number;\n tasks?: { title: string; type: string }[];\n}\n\nexport interface RoadmapTask {\n id: string;\n title: string;\n type: string;\n priority: string;\n column: string;\n isPublic?: boolean;\n}\n\nexport interface Idea {\n id: string;\n title: string;\n description?: string;\n status: string;\n votes: number;\n hasVoted?: boolean;\n}\n\nexport interface ProjectInfo {\n name: string;\n slug: string;\n icon?: string | null;\n currentVersion?: string | null;\n}\n\nexport interface ChangelogAPIResponse {\n project: ProjectInfo;\n changelog: Version[];\n}\n\nexport interface RoadmapAPIResponse {\n project: ProjectInfo;\n tasks: RoadmapTask[];\n}\n\nexport interface BadgeAPIResponse {\n version: string | null;\n name: string;\n slug: string;\n}\n\nexport interface VersionPillConfig {\n projectId: string;\n baseUrl?: string;\n}\n\nexport type BadgeStyle = \"dot\" | \"pill\" | \"minimal\" | \"glass\" | \"gradient\";\nexport type BadgeSize = \"sm\" | \"md\" | \"lg\";\nexport type ModalTab = \"changelog\" | \"roadmap\" | \"ideas\";\n\nexport interface VersionPillProps extends VersionPillConfig {\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\" | \"inline\";\n className?: string;\n theme?: \"light\" | \"dark\" | \"auto\";\n style?: BadgeStyle;\n size?: BadgeSize;\n showBranding?: boolean;\n accent?: \"green\" | \"blue\" | \"purple\" | \"orange\" | \"neutral\";\n onNewVersion?: (version: Version) => void;\n onClick?: () => void;\n}\n\nexport interface ChangelogProps extends VersionPillConfig {\n maxHeight?: number;\n theme?: \"light\" | \"dark\" | \"auto\";\n className?: string;\n}\n\nexport interface RoadmapProps extends VersionPillConfig {\n maxHeight?: number;\n theme?: \"light\" | \"dark\" | \"auto\";\n className?: string;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst DEFAULT_BASE_URL = \"https://www.versionpill.com\";\n\nconst ACCENT_COLORS = {\n green: {\n light: { bg: \"rgba(34,197,94,0.1)\", border: \"rgba(34,197,94,0.25)\", text: \"#16a34a\", dot: \"#22c55e\" },\n dark: { bg: \"rgba(34,197,94,0.15)\", border: \"rgba(34,197,94,0.3)\", text: \"#4ade80\", dot: \"#22c55e\" },\n },\n blue: {\n light: { bg: \"rgba(59,130,246,0.1)\", border: \"rgba(59,130,246,0.25)\", text: \"#2563eb\", dot: \"#3b82f6\" },\n dark: { bg: \"rgba(59,130,246,0.15)\", border: \"rgba(59,130,246,0.3)\", text: \"#60a5fa\", dot: \"#3b82f6\" },\n },\n purple: {\n light: { bg: \"rgba(147,51,234,0.1)\", border: \"rgba(147,51,234,0.25)\", text: \"#7c3aed\", dot: \"#a855f7\" },\n dark: { bg: \"rgba(147,51,234,0.15)\", border: \"rgba(147,51,234,0.3)\", text: \"#c084fc\", dot: \"#a855f7\" },\n },\n orange: {\n light: { bg: \"rgba(249,115,22,0.1)\", border: \"rgba(249,115,22,0.25)\", text: \"#ea580c\", dot: \"#f97316\" },\n dark: { bg: \"rgba(249,115,22,0.15)\", border: \"rgba(249,115,22,0.3)\", text: \"#fb923c\", dot: \"#f97316\" },\n },\n neutral: {\n light: { bg: \"rgba(0,0,0,0.05)\", border: \"rgba(0,0,0,0.1)\", text: \"#52525b\", dot: \"#71717a\" },\n dark: { bg: \"rgba(255,255,255,0.08)\", border: \"rgba(255,255,255,0.12)\", text: \"#a1a1aa\", dot: \"#71717a\" },\n },\n};\n\nconst SIZE_CONFIG = {\n sm: { height: 22, padding: \"0 8px\", gap: 4, font: 10, dotSize: 5 },\n md: { height: 26, padding: \"0 10px\", gap: 5, font: 11, dotSize: 6 },\n lg: { height: 30, padding: \"0 12px\", gap: 6, font: 12, dotSize: 7 },\n};\n\nconst TYPE_COLORS: Record<string, string> = {\n feature: \"#a855f7\",\n bug: \"#ef4444\",\n improvement: \"#3b82f6\",\n chore: \"#71717a\",\n};\n\nconst COLUMN_LABELS: Record<string, string> = {\n backlog: \"Backlog\",\n todo: \"Planned\",\n \"in-progress\": \"In Progress\",\n done: \"Shipped\",\n};\n\n// =============================================================================\n// HOOKS\n// =============================================================================\n\nfunction useTheme(theme: \"light\" | \"dark\" | \"auto\"): \"light\" | \"dark\" {\n const [resolved, setResolved] = useState<\"light\" | \"dark\">(\"light\");\n\n useEffect(() => {\n if (theme === \"auto\") {\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n setResolved(isDark ? \"dark\" : \"light\");\n\n const listener = (e: MediaQueryListEvent) => setResolved(e.matches ? \"dark\" : \"light\");\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener(\"change\", listener);\n return () => mq.removeEventListener(\"change\", listener);\n } else {\n setResolved(theme);\n }\n }, [theme]);\n\n return resolved;\n}\n\n// =============================================================================\n// VERSION PILL COMPONENT (with full modal)\n// =============================================================================\n\nexport function VersionPill({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n position = \"inline\",\n className,\n theme = \"auto\",\n style = \"gradient\",\n size = \"md\",\n showBranding = true,\n accent = \"green\",\n onNewVersion,\n onClick,\n}: VersionPillProps) {\n const [project, setProject] = useState<ProjectInfo | null>(null);\n const [versions, setVersions] = useState<Version[]>([]);\n const [roadmapTasks, setRoadmapTasks] = useState<RoadmapTask[]>([]);\n const [ideas, setIdeas] = useState<Idea[]>([]);\n const [loading, setLoading] = useState(true);\n const [isOpen, setIsOpen] = useState(false);\n const [activeTab, setActiveTab] = useState<ModalTab>(\"changelog\");\n const [hasNewVersion, setHasNewVersion] = useState(false);\n\n const resolvedTheme = useTheme(theme);\n const isLight = resolvedTheme === \"light\";\n const sizeConfig = SIZE_CONFIG[size];\n\n // Fetch version from badge API\n const fetchVersion = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/badge/${projectId}`);\n if (!response.ok) throw new Error(\"Failed to fetch version\");\n\n const data: BadgeAPIResponse = await response.json();\n if (data.version) {\n setProject({ name: data.name, slug: data.slug, currentVersion: data.version });\n\n const storedVersion = localStorage.getItem(`vp_${projectId}_seen`);\n if (data.version !== storedVersion) {\n setHasNewVersion(true);\n }\n }\n } catch (err) {\n console.error(\"Failed to fetch version:\", err);\n } finally {\n setLoading(false);\n }\n }, [projectId, baseUrl]);\n\n // Fetch changelog\n const fetchChangelog = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/changelog/${projectId}?limit=10`);\n if (!response.ok) return;\n\n const data: ChangelogAPIResponse = await response.json();\n setVersions(data.changelog);\n setProject(data.project);\n\n if (data.changelog.length > 0) {\n const storedVersion = localStorage.getItem(`vp_${projectId}_seen`);\n if (data.changelog[0].version !== storedVersion) {\n setHasNewVersion(true);\n onNewVersion?.(data.changelog[0]);\n }\n }\n } catch (err) {\n console.error(\"Failed to fetch changelog:\", err);\n }\n }, [projectId, baseUrl, onNewVersion]);\n\n // Fetch roadmap\n const fetchRoadmap = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/roadmap/${projectId}`);\n if (!response.ok) return;\n\n const data: RoadmapAPIResponse = await response.json();\n setRoadmapTasks(data.tasks || []);\n } catch (err) {\n console.error(\"Failed to fetch roadmap:\", err);\n }\n }, [projectId, baseUrl]);\n\n // Fetch ideas\n const fetchIdeas = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/ideas/${projectId}`);\n if (!response.ok) return;\n\n const data = await response.json();\n setIdeas(data.ideas || []);\n } catch (err) {\n console.error(\"Failed to fetch ideas:\", err);\n }\n }, [projectId, baseUrl]);\n\n useEffect(() => {\n fetchVersion();\n }, [fetchVersion]);\n\n const handleOpen = () => {\n if (onClick) {\n onClick();\n return;\n }\n setIsOpen(true);\n fetchChangelog();\n fetchRoadmap();\n fetchIdeas();\n if (project?.currentVersion) {\n localStorage.setItem(`vp_${projectId}_seen`, project.currentVersion);\n setHasNewVersion(false);\n }\n };\n\n const currentVersion = project?.currentVersion;\n\n const positionStyles: Record<string, string> = {\n \"top-left\": \"fixed top-4 left-4 z-[9999]\",\n \"top-right\": \"fixed top-4 right-4 z-[9999]\",\n \"bottom-left\": \"fixed bottom-4 left-4 z-[9999]\",\n \"bottom-right\": \"fixed bottom-4 right-4 z-[9999]\",\n inline: \"\",\n };\n\n // Loading state\n if (loading) {\n return (\n <div className={clsx(positionStyles[position], className)} style={{ display: \"inline-flex\" }}>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.font,\n fontFamily: \"ui-monospace, monospace\",\n fontWeight: 500,\n borderRadius: 999,\n background: \"linear-gradient(135deg, #22c55e 0%, #16a34a 100%)\",\n color: \"#fff\",\n opacity: 0.6,\n }}\n >\n <span\n style={{\n width: sizeConfig.dotSize,\n height: sizeConfig.dotSize,\n borderRadius: \"50%\",\n background: \"#fff\",\n opacity: 0.6,\n }}\n />\n <span style={{ width: 32, height: sizeConfig.font, background: \"rgba(255,255,255,0.3)\", borderRadius: 2 }} />\n </span>\n </div>\n );\n }\n\n if (!currentVersion) return null;\n\n // Render the green gradient pill badge\n const renderBadge = () => {\n return (\n <button\n onClick={handleOpen}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.font,\n fontFamily: \"ui-monospace, monospace\",\n fontWeight: 600,\n borderRadius: 999,\n cursor: \"pointer\",\n border: \"none\",\n transition: \"all 150ms ease\",\n outline: \"none\",\n background: \"linear-gradient(135deg, #22c55e 0%, #16a34a 100%)\",\n color: \"#fff\",\n boxShadow: \"0 2px 8px rgba(34,197,94,0.3)\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.boxShadow = \"0 4px 12px rgba(34,197,94,0.4)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.boxShadow = \"0 2px 8px rgba(34,197,94,0.3)\";\n }}\n >\n <span\n style={{\n width: sizeConfig.dotSize,\n height: sizeConfig.dotSize,\n borderRadius: \"50%\",\n background: \"#fff\",\n boxShadow: \"0 0 6px rgba(255,255,255,0.8)\",\n flexShrink: 0,\n }}\n />\n <span>v{currentVersion}</span>\n {hasNewVersion && (\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"#fbbf24\",\n marginLeft: 2,\n }}\n />\n )}\n </button>\n );\n };\n\n // Group roadmap tasks by column\n const groupedTasks = roadmapTasks.reduce((acc, task) => {\n const col = task.column || \"backlog\";\n if (!acc[col]) acc[col] = [];\n acc[col].push(task);\n return acc;\n }, {} as Record<string, RoadmapTask[]>);\n\n return (\n <>\n <div className={clsx(positionStyles[position], className)} style={{ display: \"inline-flex\" }}>\n {renderBadge()}\n </div>\n\n {isOpen && (\n <div style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 99999,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 16,\n }}>\n {/* Backdrop */}\n <div\n onClick={() => setIsOpen(false)}\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"rgba(0,0,0,0.5)\",\n backdropFilter: \"blur(4px)\",\n }}\n />\n\n {/* Modal Panel */}\n <div\n style={{\n position: \"relative\",\n width: \"100%\",\n maxWidth: 480,\n maxHeight: \"80vh\",\n overflow: \"hidden\",\n borderRadius: 16,\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.25)\",\n background: isLight ? \"#fff\" : \"#18181b\",\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: 16,\n borderBottom: `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n {project?.icon && <span style={{ fontSize: 20 }}>{project.icon}</span>}\n <div>\n <h2 style={{ fontWeight: 600, color: isLight ? \"#18181b\" : \"#fff\", margin: 0 }}>\n {project?.name || \"What's New\"}\n </h2>\n <p style={{ fontSize: 12, color: isLight ? \"#71717a\" : \"#a1a1aa\", margin: 0 }}>\n v{currentVersion}\n </p>\n </div>\n </div>\n <button\n onClick={() => setIsOpen(false)}\n style={{\n padding: 4,\n borderRadius: 6,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n color: isLight ? \"#71717a\" : \"#a1a1aa\",\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Tabs */}\n <div\n style={{\n display: \"flex\",\n gap: 4,\n padding: \"8px 16px\",\n borderBottom: `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}`,\n }}\n >\n {([\"changelog\", \"roadmap\", \"ideas\"] as ModalTab[]).map((tab) => (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{\n padding: \"6px 12px\",\n borderRadius: 6,\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 500,\n background: activeTab === tab\n ? (isLight ? \"#f4f4f5\" : \"#27272a\")\n : \"transparent\",\n color: activeTab === tab\n ? (isLight ? \"#18181b\" : \"#fff\")\n : (isLight ? \"#71717a\" : \"#a1a1aa\"),\n }}\n >\n {tab === \"changelog\" && \"πŸš€ Changelog\"}\n {tab === \"roadmap\" && \"πŸ—ΊοΈ Roadmap\"}\n {tab === \"ideas\" && \"πŸ’‘ Ideas\"}\n </button>\n ))}\n </div>\n\n {/* Content */}\n <div style={{ padding: 16, overflowY: \"auto\", maxHeight: \"50vh\" }}>\n {/* Changelog Tab */}\n {activeTab === \"changelog\" && (\n <div>\n {versions.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: 40, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n <div style={{ fontSize: 32, marginBottom: 8 }}>πŸš€</div>\n <div>No releases yet</div>\n </div>\n ) : (\n versions.slice(0, 5).map((version, idx) => (\n <div key={idx} style={{ marginBottom: 16, paddingBottom: 16, borderBottom: idx < 4 ? `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}` : \"none\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 4 }}>\n <span style={{ fontSize: 16 }}>{version.emoji || \"πŸ“¦\"}</span>\n <span style={{ fontWeight: 600, color: isLight ? \"#18181b\" : \"#fff\" }}>\n {version.title}\n </span>\n <span\n style={{\n padding: \"2px 6px\",\n fontSize: 10,\n fontWeight: 500,\n borderRadius: 4,\n background: version.type === \"major\" ? \"#f3e8ff\" : version.type === \"minor\" ? \"#dbeafe\" : \"#f4f4f5\",\n color: version.type === \"major\" ? \"#7c3aed\" : version.type === \"minor\" ? \"#2563eb\" : \"#52525b\",\n }}\n >\n {version.type}\n </span>\n </div>\n <div style={{ fontSize: 12, color: isLight ? \"#71717a\" : \"#a1a1aa\", marginBottom: 8 }}>\n v{version.version} Β· {new Date(version.date).toLocaleDateString()}\n </div>\n {version.description && (\n <p style={{ fontSize: 14, color: isLight ? \"#52525b\" : \"#d4d4d8\", marginBottom: 8 }}>\n {version.description}\n </p>\n )}\n {version.features && version.features.length > 0 && (\n <ul style={{ margin: 0, paddingLeft: 0, listStyle: \"none\" }}>\n {version.features.map((feature, i) => (\n <li key={i} style={{ display: \"flex\", alignItems: \"flex-start\", gap: 8, fontSize: 14, color: isLight ? \"#52525b\" : \"#d4d4d8\", marginBottom: 4 }}>\n <span style={{ color: \"#22c55e\", marginTop: 2 }}>βœ“</span>\n {feature}\n </li>\n ))}\n </ul>\n )}\n </div>\n ))\n )}\n </div>\n )}\n\n {/* Roadmap Tab */}\n {activeTab === \"roadmap\" && (\n <div>\n {Object.keys(groupedTasks).length === 0 ? (\n <div style={{ textAlign: \"center\", padding: 40, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n <div style={{ fontSize: 32, marginBottom: 8 }}>πŸ—ΊοΈ</div>\n <div>No public roadmap items</div>\n </div>\n ) : (\n [\"in-progress\", \"todo\", \"backlog\", \"done\"].map((col) => {\n const tasks = groupedTasks[col];\n if (!tasks || tasks.length === 0) return null;\n return (\n <div key={col} style={{ marginBottom: 16 }}>\n <h3 style={{ fontSize: 12, fontWeight: 600, color: isLight ? \"#71717a\" : \"#a1a1aa\", marginBottom: 8, textTransform: \"uppercase\" }}>\n {COLUMN_LABELS[col] || col} ({tasks.length})\n </h3>\n {tasks.map((task) => (\n <div\n key={task.id}\n style={{\n padding: 12,\n marginBottom: 8,\n borderRadius: 8,\n background: isLight ? \"#f4f4f5\" : \"#27272a\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: TYPE_COLORS[task.type] || \"#71717a\",\n }}\n />\n <span style={{ fontSize: 14, color: isLight ? \"#18181b\" : \"#fff\" }}>\n {task.title}\n </span>\n </div>\n </div>\n ))}\n </div>\n );\n })\n )}\n </div>\n )}\n\n {/* Ideas Tab */}\n {activeTab === \"ideas\" && (\n <div>\n {ideas.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: 40, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n <div style={{ fontSize: 32, marginBottom: 8 }}>πŸ’‘</div>\n <div>No feature requests yet</div>\n </div>\n ) : (\n ideas.map((idea) => (\n <div\n key={idea.id}\n style={{\n padding: 12,\n marginBottom: 8,\n borderRadius: 8,\n background: isLight ? \"#f4f4f5\" : \"#27272a\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 12,\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n padding: \"4px 8px\",\n borderRadius: 6,\n background: isLight ? \"#fff\" : \"#18181b\",\n minWidth: 40,\n }}\n >\n <span style={{ fontSize: 14, fontWeight: 600, color: isLight ? \"#18181b\" : \"#fff\" }}>\n {idea.votes}\n </span>\n <span style={{ fontSize: 10, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>votes</span>\n </div>\n <div>\n <div style={{ fontSize: 14, fontWeight: 500, color: isLight ? \"#18181b\" : \"#fff\", marginBottom: 4 }}>\n {idea.title}\n </div>\n {idea.description && (\n <div style={{ fontSize: 13, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n {idea.description.slice(0, 100)}...\n </div>\n )}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: 12,\n borderTop: `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}`,\n background: isLight ? \"#fafafa\" : \"#0a0a0a\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n {showBranding && (\n <a\n href=\"https://versionpill.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ fontSize: 10, color: isLight ? \"#a1a1aa\" : \"#52525b\", textDecoration: \"none\" }}\n >\n Powered by Version Pill\n </a>\n )}\n <a\n href={`${baseUrl}/${projectId}/${activeTab === \"ideas\" ? \"feature-requests\" : activeTab}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n padding: \"6px 12px\",\n fontSize: 12,\n fontWeight: 500,\n borderRadius: 6,\n background: \"#22c55e\",\n color: \"#fff\",\n textDecoration: \"none\",\n }}\n >\n View All β†’\n </a>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n\n// =============================================================================\n// VERSION BADGE COMPONENT (No Modal - just badge)\n// =============================================================================\n\nexport interface VersionBadgeProps {\n projectId: string;\n baseUrl?: string;\n theme?: \"light\" | \"dark\" | \"auto\";\n style?: BadgeStyle;\n size?: BadgeSize;\n accent?: \"green\" | \"blue\" | \"purple\" | \"orange\" | \"neutral\";\n className?: string;\n href?: string;\n}\n\nexport function VersionBadge({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n theme = \"auto\",\n style = \"gradient\",\n size = \"md\",\n accent = \"green\",\n className,\n href,\n}: VersionBadgeProps) {\n const [version, setVersion] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n const resolvedTheme = useTheme(theme);\n const isLight = resolvedTheme === \"light\";\n const colors = ACCENT_COLORS[accent][isLight ? \"light\" : \"dark\"];\n const sizeConfig = SIZE_CONFIG[size];\n\n useEffect(() => {\n fetch(`${baseUrl}/api/badge/${projectId}`)\n .then((res) => res.json())\n .then((data) => setVersion(data.version))\n .catch(() => setVersion(null))\n .finally(() => setLoading(false));\n }, [projectId, baseUrl]);\n\n if (loading) {\n return (\n <span\n className={className}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.font,\n fontFamily: \"ui-monospace, monospace\",\n fontWeight: 500,\n borderRadius: 999,\n background: \"linear-gradient(135deg, #22c55e 0%, #16a34a 100%)\",\n color: \"#fff\",\n opacity: 0.6,\n }}\n >\n <span\n style={{\n width: sizeConfig.dotSize,\n height: sizeConfig.dotSize,\n borderRadius: \"50%\",\n background: \"#fff\",\n opacity: 0.6,\n }}\n />\n <span style={{ width: 32, height: sizeConfig.font, background: \"rgba(255,255,255,0.3)\", borderRadius: 2 }} />\n </span>\n );\n }\n\n if (!version) return null;\n\n const badgeStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.font,\n fontFamily: \"ui-monospace, monospace\",\n fontWeight: 600,\n borderRadius: 999,\n textDecoration: \"none\",\n transition: \"all 150ms ease\",\n background: \"linear-gradient(135deg, #22c55e 0%, #16a34a 100%)\",\n color: \"#fff\",\n boxShadow: \"0 2px 8px rgba(34,197,94,0.3)\",\n };\n\n const content = (\n <>\n <span\n style={{\n width: sizeConfig.dotSize,\n height: sizeConfig.dotSize,\n borderRadius: \"50%\",\n background: \"#fff\",\n boxShadow: \"0 0 6px rgba(255,255,255,0.8)\",\n flexShrink: 0,\n }}\n />\n <span>v{version}</span>\n </>\n );\n\n if (href) {\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={className} style={badgeStyle}>\n {content}\n </a>\n );\n }\n\n return (\n <span className={className} style={badgeStyle}>\n {content}\n </span>\n );\n}\n\n// =============================================================================\n// USE VERSION HOOK\n// =============================================================================\n\nexport interface UseVersionOptions {\n projectId: string;\n baseUrl?: string;\n refetchInterval?: number;\n}\n\nexport interface UseVersionResult {\n version: string | null;\n name: string | null;\n slug: string | null;\n loading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\nconst versionCache: Record<string, { version: string | null; name: string | null; slug: string | null }> = {};\n\nexport function useVersion({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n refetchInterval = 0,\n}: UseVersionOptions): UseVersionResult {\n const cacheKey = `${baseUrl}:${projectId}`;\n const cached = versionCache[cacheKey];\n\n const [version, setVersion] = useState<string | null>(cached?.version ?? null);\n const [name, setName] = useState<string | null>(cached?.name ?? null);\n const [slug, setSlug] = useState<string | null>(cached?.slug ?? null);\n const [loading, setLoading] = useState(!cached);\n const [error, setError] = useState<string | null>(null);\n\n const fetchVersion = useCallback(async () => {\n if (typeof window === \"undefined\") return;\n\n try {\n setError(null);\n const response = await fetch(`${baseUrl}/api/badge/${projectId}`);\n if (!response.ok) throw new Error(\"Failed to fetch version\");\n\n const data: BadgeAPIResponse = await response.json();\n versionCache[cacheKey] = { version: data.version, name: data.name, slug: data.slug };\n\n setVersion(data.version);\n setName(data.name);\n setSlug(data.slug);\n } catch (err: any) {\n setError(err.message);\n } finally {\n setLoading(false);\n }\n }, [projectId, baseUrl, cacheKey]);\n\n useEffect(() => {\n if (!cached) {\n fetchVersion();\n }\n }, [fetchVersion, cached]);\n\n useEffect(() => {\n if (refetchInterval > 0) {\n const interval = setInterval(fetchVersion, refetchInterval);\n return () => clearInterval(interval);\n }\n }, [refetchInterval, fetchVersion]);\n\n return { version, name, slug, loading, error, refetch: fetchVersion };\n}\n\n// =============================================================================\n// EMBED COMPONENTS\n// =============================================================================\n\nexport function Changelog({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n maxHeight = 600,\n theme = \"auto\",\n className,\n}: ChangelogProps) {\n const resolvedTheme = useTheme(theme);\n\n return (\n <iframe\n src={`${baseUrl}/embed/${projectId}/changelog?theme=${resolvedTheme}`}\n className={className}\n style={{ width: \"100%\", height: maxHeight, border: \"none\" }}\n title=\"Changelog\"\n />\n );\n}\n\nexport function Roadmap({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n maxHeight = 800,\n theme = \"auto\",\n className,\n}: RoadmapProps) {\n const resolvedTheme = useTheme(theme);\n\n return (\n <iframe\n src={`${baseUrl}/embed/${projectId}/roadmap?theme=${resolvedTheme}`}\n className={className}\n style={{ width: \"100%\", height: maxHeight, border: \"none\" }}\n title=\"Roadmap\"\n />\n );\n}\n\n// =============================================================================\n// DEFAULT EXPORT\n// =============================================================================\n\nexport default VersionPill;\n"],"mappings":";;;AAEA,SAAgB,UAAU,WAAW,mBAAmB;AACxD,OAAO,UAAU;AAyST,SAkGJ,UAlFM,KAhBF;AA1MR,IAAM,mBAAmB;AAEzB,IAAM,gBAAgB;AAAA,EACpB,OAAO;AAAA,IACL,OAAO,EAAE,IAAI,uBAAuB,QAAQ,wBAAwB,MAAM,WAAW,KAAK,UAAU;AAAA,IACpG,MAAM,EAAE,IAAI,wBAAwB,QAAQ,uBAAuB,MAAM,WAAW,KAAK,UAAU;AAAA,EACrG;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,IAAI,wBAAwB,QAAQ,yBAAyB,MAAM,WAAW,KAAK,UAAU;AAAA,IACtG,MAAM,EAAE,IAAI,yBAAyB,QAAQ,wBAAwB,MAAM,WAAW,KAAK,UAAU;AAAA,EACvG;AAAA,EACA,QAAQ;AAAA,IACN,OAAO,EAAE,IAAI,wBAAwB,QAAQ,yBAAyB,MAAM,WAAW,KAAK,UAAU;AAAA,IACtG,MAAM,EAAE,IAAI,yBAAyB,QAAQ,wBAAwB,MAAM,WAAW,KAAK,UAAU;AAAA,EACvG;AAAA,EACA,QAAQ;AAAA,IACN,OAAO,EAAE,IAAI,wBAAwB,QAAQ,yBAAyB,MAAM,WAAW,KAAK,UAAU;AAAA,IACtG,MAAM,EAAE,IAAI,yBAAyB,QAAQ,wBAAwB,MAAM,WAAW,KAAK,UAAU;AAAA,EACvG;AAAA,EACA,SAAS;AAAA,IACP,OAAO,EAAE,IAAI,oBAAoB,QAAQ,mBAAmB,MAAM,WAAW,KAAK,UAAU;AAAA,IAC5F,MAAM,EAAE,IAAI,0BAA0B,QAAQ,0BAA0B,MAAM,WAAW,KAAK,UAAU;AAAA,EAC1G;AACF;AAEA,IAAM,cAAc;AAAA,EAClB,IAAI,EAAE,QAAQ,IAAI,SAAS,SAAS,KAAK,GAAG,MAAM,IAAI,SAAS,EAAE;AAAA,EACjE,IAAI,EAAE,QAAQ,IAAI,SAAS,UAAU,KAAK,GAAG,MAAM,IAAI,SAAS,EAAE;AAAA,EAClE,IAAI,EAAE,QAAQ,IAAI,SAAS,UAAU,KAAK,GAAG,MAAM,IAAI,SAAS,EAAE;AACpE;AAEA,IAAM,cAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,KAAK;AAAA,EACL,aAAa;AAAA,EACb,OAAO;AACT;AAEA,IAAM,gBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,MAAM;AAAA,EACN,eAAe;AAAA,EACf,MAAM;AACR;AAMA,SAAS,SAAS,OAAoD;AACpE,QAAM,CAAC,UAAU,WAAW,IAAI,SAA2B,OAAO;AAElE,YAAU,MAAM;AACd,QAAI,UAAU,QAAQ;AACpB,YAAM,SAAS,OAAO,WAAW,8BAA8B,EAAE;AACjE,kBAAY,SAAS,SAAS,OAAO;AAErC,YAAM,WAAW,CAAC,MAA2B,YAAY,EAAE,UAAU,SAAS,OAAO;AACrF,YAAM,KAAK,OAAO,WAAW,8BAA8B;AAC3D,SAAG,iBAAiB,UAAU,QAAQ;AACtC,aAAO,MAAM,GAAG,oBAAoB,UAAU,QAAQ;AAAA,IACxD,OAAO;AACL,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,SAAO;AACT;AAMO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,eAAe;AAAA,EACf,SAAS;AAAA,EACT;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,CAAC,SAAS,UAAU,IAAI,SAA6B,IAAI;AAC/D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAoB,CAAC,CAAC;AACtD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAwB,CAAC,CAAC;AAClE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAiB,CAAC,CAAC;AAC7C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAmB,WAAW;AAChE,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AAExD,QAAM,gBAAgB,SAAS,KAAK;AACpC,QAAM,UAAU,kBAAkB;AAClC,QAAM,aAAa,YAAY,IAAI;AAGnC,QAAM,eAAe,YAAY,YAAY;AAC3C,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,cAAc,SAAS,EAAE;AAChE,UAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,yBAAyB;AAE3D,YAAM,OAAyB,MAAM,SAAS,KAAK;AACnD,UAAI,KAAK,SAAS;AAChB,mBAAW,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,gBAAgB,KAAK,QAAQ,CAAC;AAE7E,cAAM,gBAAgB,aAAa,QAAQ,MAAM,SAAS,OAAO;AACjE,YAAI,KAAK,YAAY,eAAe;AAClC,2BAAiB,IAAI;AAAA,QACvB;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAM,4BAA4B,GAAG;AAAA,IAC/C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,OAAO,CAAC;AAGvB,QAAM,iBAAiB,YAAY,YAAY;AAC7C,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,kBAAkB,SAAS,WAAW;AAC7E,UAAI,CAAC,SAAS,GAAI;AAElB,YAAM,OAA6B,MAAM,SAAS,KAAK;AACvD,kBAAY,KAAK,SAAS;AAC1B,iBAAW,KAAK,OAAO;AAEvB,UAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,cAAM,gBAAgB,aAAa,QAAQ,MAAM,SAAS,OAAO;AACjE,YAAI,KAAK,UAAU,CAAC,EAAE,YAAY,eAAe;AAC/C,2BAAiB,IAAI;AACrB,yBAAe,KAAK,UAAU,CAAC,CAAC;AAAA,QAClC;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAM,8BAA8B,GAAG;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,WAAW,SAAS,YAAY,CAAC;AAGrC,QAAM,eAAe,YAAY,YAAY;AAC3C,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,gBAAgB,SAAS,EAAE;AAClE,UAAI,CAAC,SAAS,GAAI;AAElB,YAAM,OAA2B,MAAM,SAAS,KAAK;AACrD,sBAAgB,KAAK,SAAS,CAAC,CAAC;AAAA,IAClC,SAAS,KAAK;AACZ,cAAQ,MAAM,4BAA4B,GAAG;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,WAAW,OAAO,CAAC;AAGvB,QAAM,aAAa,YAAY,YAAY;AACzC,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,cAAc,SAAS,EAAE;AAChE,UAAI,CAAC,SAAS,GAAI;AAElB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,eAAS,KAAK,SAAS,CAAC,CAAC;AAAA,IAC3B,SAAS,KAAK;AACZ,cAAQ,MAAM,0BAA0B,GAAG;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,WAAW,OAAO,CAAC;AAEvB,YAAU,MAAM;AACd,iBAAa;AAAA,EACf,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,aAAa,MAAM;AACvB,QAAI,SAAS;AACX,cAAQ;AACR;AAAA,IACF;AACA,cAAU,IAAI;AACd,mBAAe;AACf,iBAAa;AACb,eAAW;AACX,QAAI,SAAS,gBAAgB;AAC3B,mBAAa,QAAQ,MAAM,SAAS,SAAS,QAAQ,cAAc;AACnE,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,iBAAiB,SAAS;AAEhC,QAAM,iBAAyC;AAAA,IAC7C,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EACV;AAGA,MAAI,SAAS;AACX,WACE,oBAAC,SAAI,WAAW,KAAK,eAAe,QAAQ,GAAG,SAAS,GAAG,OAAO,EAAE,SAAS,cAAc,GACzF;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK,WAAW;AAAA,UAChB,QAAQ,WAAW;AAAA,UACnB,SAAS,WAAW;AAAA,UACpB,UAAU,WAAW;AAAA,UACrB,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO,WAAW;AAAA,gBAClB,QAAQ,WAAW;AAAA,gBACnB,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,SAAS;AAAA,cACX;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,UAAK,OAAO,EAAE,OAAO,IAAI,QAAQ,WAAW,MAAM,YAAY,yBAAyB,cAAc,EAAE,GAAG;AAAA;AAAA;AAAA,IAC7G,GACF;AAAA,EAEJ;AAEA,MAAI,CAAC,eAAgB,QAAO;AAG5B,QAAM,cAAc,MAAM;AACxB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK,WAAW;AAAA,UAChB,QAAQ,WAAW;AAAA,UACnB,SAAS,WAAW;AAAA,UACpB,UAAU,WAAW;AAAA,UACrB,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,WAAW;AAAA,QACb;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,YAAY;AAAA,QACpC;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,YAAY;AAAA,QACpC;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO,WAAW;AAAA,gBAClB,QAAQ,WAAW;AAAA,gBACnB,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA,UACA,qBAAC,UAAK;AAAA;AAAA,YAAE;AAAA,aAAe;AAAA,UACtB,iBACC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AAGA,QAAM,eAAe,aAAa,OAAO,CAAC,KAAK,SAAS;AACtD,UAAM,MAAM,KAAK,UAAU;AAC3B,QAAI,CAAC,IAAI,GAAG,EAAG,KAAI,GAAG,IAAI,CAAC;AAC3B,QAAI,GAAG,EAAE,KAAK,IAAI;AAClB,WAAO;AAAA,EACT,GAAG,CAAC,CAAkC;AAEtC,SACE,iCACE;AAAA,wBAAC,SAAI,WAAW,KAAK,eAAe,QAAQ,GAAG,SAAS,GAAG,OAAO,EAAE,SAAS,cAAc,GACxF,sBAAY,GACf;AAAA,IAEC,UACC,qBAAC,SAAI,OAAO;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,SAAS;AAAA,IACX,GAEE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,UAAU,KAAK;AAAA,UAC9B,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,gBAAgB;AAAA,UAClB;AAAA;AAAA,MACF;AAAA,MAGA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU;AAAA,YACV,WAAW;AAAA,YACX,UAAU;AAAA,YACV,cAAc;AAAA,YACd,WAAW;AAAA,YACX,YAAY,UAAU,SAAS;AAAA,UACjC;AAAA,UAGA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,cAAc,aAAa,UAAU,YAAY,SAAS;AAAA,kBAC1D,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,gBAClB;AAAA,gBAEA;AAAA,uCAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,GAC1D;AAAA,6BAAS,QAAQ,oBAAC,UAAK,OAAO,EAAE,UAAU,GAAG,GAAI,kBAAQ,MAAK;AAAA,oBAC/D,qBAAC,SACC;AAAA,0CAAC,QAAG,OAAO,EAAE,YAAY,KAAK,OAAO,UAAU,YAAY,QAAQ,QAAQ,EAAE,GAC1E,mBAAS,QAAQ,cACpB;AAAA,sBACA,qBAAC,OAAE,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,YAAY,WAAW,QAAQ,EAAE,GAAG;AAAA;AAAA,wBAC3E;AAAA,yBACJ;AAAA,uBACF;AAAA,qBACF;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAS,MAAM,UAAU,KAAK;AAAA,sBAC9B,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,YAAY;AAAA,wBACZ,QAAQ;AAAA,wBACR,QAAQ;AAAA,wBACR,OAAO,UAAU,YAAY;AAAA,sBAC/B;AAAA,sBAEA,8BAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAC5F,8BAAC,UAAK,GAAE,wBAAuB,GACjC;AAAA;AAAA,kBACF;AAAA;AAAA;AAAA,YACF;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,KAAK;AAAA,kBACL,SAAS;AAAA,kBACT,cAAc,aAAa,UAAU,YAAY,SAAS;AAAA,gBAC5D;AAAA,gBAEE,WAAC,aAAa,WAAW,OAAO,EAAiB,IAAI,CAAC,QACtD;AAAA,kBAAC;AAAA;AAAA,oBAEC,SAAS,MAAM,aAAa,GAAG;AAAA,oBAC/B,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,cAAc;AAAA,sBACd,QAAQ;AAAA,sBACR,QAAQ;AAAA,sBACR,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,YAAY,cAAc,MACrB,UAAU,YAAY,YACvB;AAAA,sBACJ,OAAO,cAAc,MAChB,UAAU,YAAY,SACtB,UAAU,YAAY;AAAA,oBAC7B;AAAA,oBAEC;AAAA,8BAAQ,eAAe;AAAA,sBACvB,QAAQ,aAAa;AAAA,sBACrB,QAAQ,WAAW;AAAA;AAAA;AAAA,kBAnBf;AAAA,gBAoBP,CACD;AAAA;AAAA,YACH;AAAA,YAGA,qBAAC,SAAI,OAAO,EAAE,SAAS,IAAI,WAAW,QAAQ,WAAW,OAAO,GAE7D;AAAA,4BAAc,eACb,oBAAC,SACE,mBAAS,WAAW,IACnB,qBAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,IAAI,OAAO,UAAU,YAAY,UAAU,GACrF;AAAA,oCAAC,SAAI,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,GAAG,uBAAE;AAAA,gBACjD,oBAAC,SAAI,6BAAe;AAAA,iBACtB,IAEA,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,QACjC,qBAAC,SAAc,OAAO,EAAE,cAAc,IAAI,eAAe,IAAI,cAAc,MAAM,IAAI,aAAa,UAAU,YAAY,SAAS,KAAK,OAAO,GAC3I;AAAA,qCAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,cAAc,EAAE,GAC3E;AAAA,sCAAC,UAAK,OAAO,EAAE,UAAU,GAAG,GAAI,kBAAQ,SAAS,aAAK;AAAA,kBACtD,oBAAC,UAAK,OAAO,EAAE,YAAY,KAAK,OAAO,UAAU,YAAY,OAAO,GACjE,kBAAQ,OACX;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,cAAc;AAAA,wBACd,YAAY,QAAQ,SAAS,UAAU,YAAY,QAAQ,SAAS,UAAU,YAAY;AAAA,wBAC1F,OAAO,QAAQ,SAAS,UAAU,YAAY,QAAQ,SAAS,UAAU,YAAY;AAAA,sBACvF;AAAA,sBAEC,kBAAQ;AAAA;AAAA,kBACX;AAAA,mBACF;AAAA,gBACA,qBAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,YAAY,WAAW,cAAc,EAAE,GAAG;AAAA;AAAA,kBACnF,QAAQ;AAAA,kBAAQ;AAAA,kBAAI,IAAI,KAAK,QAAQ,IAAI,EAAE,mBAAmB;AAAA,mBAClE;AAAA,gBACC,QAAQ,eACP,oBAAC,OAAE,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,YAAY,WAAW,cAAc,EAAE,GAC/E,kBAAQ,aACX;AAAA,gBAED,QAAQ,YAAY,QAAQ,SAAS,SAAS,KAC7C,oBAAC,QAAG,OAAO,EAAE,QAAQ,GAAG,aAAa,GAAG,WAAW,OAAO,GACvD,kBAAQ,SAAS,IAAI,CAAC,SAAS,MAC9B,qBAAC,QAAW,OAAO,EAAE,SAAS,QAAQ,YAAY,cAAc,KAAK,GAAG,UAAU,IAAI,OAAO,UAAU,YAAY,WAAW,cAAc,EAAE,GAC5I;AAAA,sCAAC,UAAK,OAAO,EAAE,OAAO,WAAW,WAAW,EAAE,GAAG,oBAAC;AAAA,kBACjD;AAAA,qBAFM,CAGT,CACD,GACH;AAAA,mBAnCM,GAqCV,CACD,GAEL;AAAA,cAID,cAAc,aACb,oBAAC,SACE,iBAAO,KAAK,YAAY,EAAE,WAAW,IACpC,qBAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,IAAI,OAAO,UAAU,YAAY,UAAU,GACrF;AAAA,oCAAC,SAAI,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,GAAG,6BAAG;AAAA,gBAClD,oBAAC,SAAI,qCAAuB;AAAA,iBAC9B,IAEA,CAAC,eAAe,QAAQ,WAAW,MAAM,EAAE,IAAI,CAAC,QAAQ;AACtD,sBAAM,QAAQ,aAAa,GAAG;AAC9B,oBAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO;AACzC,uBACE,qBAAC,SAAc,OAAO,EAAE,cAAc,GAAG,GACvC;AAAA,uCAAC,QAAG,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,UAAU,YAAY,WAAW,cAAc,GAAG,eAAe,YAAY,GAC7H;AAAA,kCAAc,GAAG,KAAK;AAAA,oBAAI;AAAA,oBAAG,MAAM;AAAA,oBAAO;AAAA,qBAC7C;AAAA,kBACC,MAAM,IAAI,CAAC,SACV;AAAA,oBAAC;AAAA;AAAA,sBAEC,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,cAAc;AAAA,wBACd,YAAY,UAAU,YAAY;AAAA,sBACpC;AAAA,sBAEA,+BAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GAC1D;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,OAAO;AAAA,8BACL,OAAO;AAAA,8BACP,QAAQ;AAAA,8BACR,cAAc;AAAA,8BACd,YAAY,YAAY,KAAK,IAAI,KAAK;AAAA,4BACxC;AAAA;AAAA,wBACF;AAAA,wBACA,oBAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,YAAY,OAAO,GAC9D,eAAK,OACR;AAAA,yBACF;AAAA;AAAA,oBApBK,KAAK;AAAA,kBAqBZ,CACD;AAAA,qBA5BO,GA6BV;AAAA,cAEJ,CAAC,GAEL;AAAA,cAID,cAAc,WACb,oBAAC,SACE,gBAAM,WAAW,IAChB,qBAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,IAAI,OAAO,UAAU,YAAY,UAAU,GACrF;AAAA,oCAAC,SAAI,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,GAAG,uBAAE;AAAA,gBACjD,oBAAC,SAAI,qCAAuB;AAAA,iBAC9B,IAEA,MAAM,IAAI,CAAC,SACT;AAAA,gBAAC;AAAA;AAAA,kBAEC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,cAAc;AAAA,oBACd,cAAc;AAAA,oBACd,YAAY,UAAU,YAAY;AAAA,oBAClC,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,KAAK;AAAA,kBACP;AAAA,kBAEA;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,SAAS;AAAA,0BACT,eAAe;AAAA,0BACf,YAAY;AAAA,0BACZ,SAAS;AAAA,0BACT,cAAc;AAAA,0BACd,YAAY,UAAU,SAAS;AAAA,0BAC/B,UAAU;AAAA,wBACZ;AAAA,wBAEA;AAAA,8CAAC,UAAK,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,UAAU,YAAY,OAAO,GAC/E,eAAK,OACR;AAAA,0BACA,oBAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,YAAY,UAAU,GAAG,mBAAK;AAAA;AAAA;AAAA,oBAC9E;AAAA,oBACA,qBAAC,SACC;AAAA,0CAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,UAAU,YAAY,QAAQ,cAAc,EAAE,GAC/F,eAAK,OACR;AAAA,sBACC,KAAK,eACJ,qBAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,YAAY,UAAU,GAChE;AAAA,6BAAK,YAAY,MAAM,GAAG,GAAG;AAAA,wBAAE;AAAA,yBAClC;AAAA,uBAEJ;AAAA;AAAA;AAAA,gBApCK,KAAK;AAAA,cAqCZ,CACD,GAEL;AAAA,eAEJ;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,WAAW,aAAa,UAAU,YAAY,SAAS;AAAA,kBACvD,YAAY,UAAU,YAAY;AAAA,kBAClC,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,gBAClB;AAAA,gBAEC;AAAA,kCACC;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,KAAI;AAAA,sBACJ,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,YAAY,WAAW,gBAAgB,OAAO;AAAA,sBACvF;AAAA;AAAA,kBAED;AAAA,kBAEF;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAM,GAAG,OAAO,IAAI,SAAS,IAAI,cAAc,UAAU,qBAAqB,SAAS;AAAA,sBACvF,QAAO;AAAA,sBACP,KAAI;AAAA,sBACJ,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,cAAc;AAAA,wBACd,YAAY;AAAA,wBACZ,OAAO;AAAA,wBACP,gBAAgB;AAAA,sBAClB;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KAEJ;AAEJ;AAiBO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,CAAC,SAAS,UAAU,IAAI,SAAwB,IAAI;AAC1D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAE3C,QAAM,gBAAgB,SAAS,KAAK;AACpC,QAAM,UAAU,kBAAkB;AAClC,QAAM,SAAS,cAAc,MAAM,EAAE,UAAU,UAAU,MAAM;AAC/D,QAAM,aAAa,YAAY,IAAI;AAEnC,YAAU,MAAM;AACd,UAAM,GAAG,OAAO,cAAc,SAAS,EAAE,EACtC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EACxB,KAAK,CAAC,SAAS,WAAW,KAAK,OAAO,CAAC,EACvC,MAAM,MAAM,WAAW,IAAI,CAAC,EAC5B,QAAQ,MAAM,WAAW,KAAK,CAAC;AAAA,EACpC,GAAG,CAAC,WAAW,OAAO,CAAC;AAEvB,MAAI,SAAS;AACX,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK,WAAW;AAAA,UAChB,QAAQ,WAAW;AAAA,UACnB,SAAS,WAAW;AAAA,UACpB,UAAU,WAAW;AAAA,UACrB,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO,WAAW;AAAA,gBAClB,QAAQ,WAAW;AAAA,gBACnB,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,SAAS;AAAA,cACX;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,UAAK,OAAO,EAAE,OAAO,IAAI,QAAQ,WAAW,MAAM,YAAY,yBAAyB,cAAc,EAAE,GAAG;AAAA;AAAA;AAAA,IAC7G;AAAA,EAEJ;AAEA,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,aAAkC;AAAA,IACtC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK,WAAW;AAAA,IAChB,QAAQ,WAAW;AAAA,IACnB,SAAS,WAAW;AAAA,IACpB,UAAU,WAAW;AAAA,IACrB,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAEA,QAAM,UACJ,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO,WAAW;AAAA,UAClB,QAAQ,WAAW;AAAA,UACnB,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,YAAY;AAAA,QACd;AAAA;AAAA,IACF;AAAA,IACA,qBAAC,UAAK;AAAA;AAAA,MAAE;AAAA,OAAQ;AAAA,KAClB;AAGF,MAAI,MAAM;AACR,WACE,oBAAC,OAAE,MAAY,QAAO,UAAS,KAAI,uBAAsB,WAAsB,OAAO,YACnF,mBACH;AAAA,EAEJ;AAEA,SACE,oBAAC,UAAK,WAAsB,OAAO,YAChC,mBACH;AAEJ;AAqBA,IAAM,eAAqG,CAAC;AAErG,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,UAAU;AAAA,EACV,kBAAkB;AACpB,GAAwC;AACtC,QAAM,WAAW,GAAG,OAAO,IAAI,SAAS;AACxC,QAAM,SAAS,aAAa,QAAQ;AAEpC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAwB,QAAQ,WAAW,IAAI;AAC7E,QAAM,CAAC,MAAM,OAAO,IAAI,SAAwB,QAAQ,QAAQ,IAAI;AACpE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAwB,QAAQ,QAAQ,IAAI;AACpE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,CAAC,MAAM;AAC9C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAEtD,QAAM,eAAe,YAAY,YAAY;AAC3C,QAAI,OAAO,WAAW,YAAa;AAEnC,QAAI;AACF,eAAS,IAAI;AACb,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,cAAc,SAAS,EAAE;AAChE,UAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,yBAAyB;AAE3D,YAAM,OAAyB,MAAM,SAAS,KAAK;AACnD,mBAAa,QAAQ,IAAI,EAAE,SAAS,KAAK,SAAS,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK;AAEnF,iBAAW,KAAK,OAAO;AACvB,cAAQ,KAAK,IAAI;AACjB,cAAQ,KAAK,IAAI;AAAA,IACnB,SAAS,KAAU;AACjB,eAAS,IAAI,OAAO;AAAA,IACtB,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,SAAS,QAAQ,CAAC;AAEjC,YAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX,mBAAa;AAAA,IACf;AAAA,EACF,GAAG,CAAC,cAAc,MAAM,CAAC;AAEzB,YAAU,MAAM;AACd,QAAI,kBAAkB,GAAG;AACvB,YAAM,WAAW,YAAY,cAAc,eAAe;AAC1D,aAAO,MAAM,cAAc,QAAQ;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,iBAAiB,YAAY,CAAC;AAElC,SAAO,EAAE,SAAS,MAAM,MAAM,SAAS,OAAO,SAAS,aAAa;AACtE;AAMO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR;AACF,GAAmB;AACjB,QAAM,gBAAgB,SAAS,KAAK;AAEpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,GAAG,OAAO,UAAU,SAAS,oBAAoB,aAAa;AAAA,MACnE;AAAA,MACA,OAAO,EAAE,OAAO,QAAQ,QAAQ,WAAW,QAAQ,OAAO;AAAA,MAC1D,OAAM;AAAA;AAAA,EACR;AAEJ;AAEO,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR;AACF,GAAiB;AACf,QAAM,gBAAgB,SAAS,KAAK;AAEpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,GAAG,OAAO,UAAU,SAAS,kBAAkB,aAAa;AAAA,MACjE;AAAA,MACA,OAAO,EAAE,OAAO,QAAQ,QAAQ,WAAW,QAAQ,OAAO;AAAA,MAC1D,OAAM;AAAA;AAAA,EACR;AAEJ;AAMA,IAAO,gBAAQ;","names":[]}
1
+ {"version":3,"sources":["../src/index.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useEffect, useCallback } from \"react\";\nimport clsx from \"clsx\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface Version {\n version: string;\n type: \"major\" | \"minor\" | \"patch\";\n title: string;\n description?: string | null;\n emoji?: string | null;\n features?: string[];\n date: string | number;\n tasks?: { title: string; type: string }[];\n}\n\nexport interface RoadmapTask {\n id: string;\n title: string;\n type: string;\n priority: string;\n column: string;\n isPublic?: boolean;\n}\n\nexport interface Idea {\n id: string;\n title: string;\n description?: string;\n status: string;\n votes: number;\n hasVoted?: boolean;\n}\n\nexport interface ProjectInfo {\n name: string;\n slug: string;\n icon?: string | null;\n currentVersion?: string | null;\n}\n\nexport interface ChangelogAPIResponse {\n project: ProjectInfo;\n changelog: Version[];\n}\n\nexport interface RoadmapAPIResponse {\n project: ProjectInfo;\n tasks: RoadmapTask[];\n}\n\nexport interface BadgeAPIResponse {\n version: string | null;\n name: string;\n slug: string;\n}\n\nexport interface VersionPillConfig {\n projectId: string;\n baseUrl?: string;\n}\n\nexport type BadgeStyle = \"dot\" | \"pill\" | \"minimal\" | \"glass\" | \"gradient\";\nexport type BadgeSize = \"sm\" | \"md\" | \"lg\";\nexport type ModalTab = \"changelog\" | \"roadmap\" | \"ideas\";\n\nexport interface VersionPillProps extends VersionPillConfig {\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\" | \"inline\";\n className?: string;\n theme?: \"light\" | \"dark\" | \"auto\";\n style?: BadgeStyle;\n size?: BadgeSize;\n showBranding?: boolean;\n accent?: \"green\" | \"blue\" | \"purple\" | \"orange\" | \"neutral\";\n onNewVersion?: (version: Version) => void;\n onClick?: () => void;\n}\n\nexport interface ChangelogProps extends VersionPillConfig {\n maxHeight?: number;\n theme?: \"light\" | \"dark\" | \"auto\";\n className?: string;\n}\n\nexport interface RoadmapProps extends VersionPillConfig {\n maxHeight?: number;\n theme?: \"light\" | \"dark\" | \"auto\";\n className?: string;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst DEFAULT_BASE_URL = \"https://www.versionpill.com\";\n\nconst ACCENT_COLORS = {\n green: {\n light: { bg: \"rgba(34,197,94,0.1)\", border: \"rgba(34,197,94,0.25)\", text: \"#16a34a\", dot: \"#22c55e\" },\n dark: { bg: \"rgba(34,197,94,0.15)\", border: \"rgba(34,197,94,0.3)\", text: \"#4ade80\", dot: \"#22c55e\" },\n },\n blue: {\n light: { bg: \"rgba(59,130,246,0.1)\", border: \"rgba(59,130,246,0.25)\", text: \"#2563eb\", dot: \"#3b82f6\" },\n dark: { bg: \"rgba(59,130,246,0.15)\", border: \"rgba(59,130,246,0.3)\", text: \"#60a5fa\", dot: \"#3b82f6\" },\n },\n purple: {\n light: { bg: \"rgba(147,51,234,0.1)\", border: \"rgba(147,51,234,0.25)\", text: \"#7c3aed\", dot: \"#a855f7\" },\n dark: { bg: \"rgba(147,51,234,0.15)\", border: \"rgba(147,51,234,0.3)\", text: \"#c084fc\", dot: \"#a855f7\" },\n },\n orange: {\n light: { bg: \"rgba(249,115,22,0.1)\", border: \"rgba(249,115,22,0.25)\", text: \"#ea580c\", dot: \"#f97316\" },\n dark: { bg: \"rgba(249,115,22,0.15)\", border: \"rgba(249,115,22,0.3)\", text: \"#fb923c\", dot: \"#f97316\" },\n },\n neutral: {\n light: { bg: \"rgba(0,0,0,0.05)\", border: \"rgba(0,0,0,0.1)\", text: \"#52525b\", dot: \"#71717a\" },\n dark: { bg: \"rgba(255,255,255,0.08)\", border: \"rgba(255,255,255,0.12)\", text: \"#a1a1aa\", dot: \"#71717a\" },\n },\n};\n\nconst SIZE_CONFIG = {\n sm: { height: 22, padding: \"0 8px\", gap: 4, font: 10, dotSize: 5 },\n md: { height: 26, padding: \"0 10px\", gap: 5, font: 11, dotSize: 6 },\n lg: { height: 30, padding: \"0 12px\", gap: 6, font: 12, dotSize: 7 },\n};\n\nconst TYPE_COLORS: Record<string, string> = {\n feature: \"#a855f7\",\n bug: \"#ef4444\",\n improvement: \"#3b82f6\",\n chore: \"#71717a\",\n};\n\nconst COLUMN_LABELS: Record<string, string> = {\n backlog: \"Backlog\",\n todo: \"Planned\",\n \"in-progress\": \"In Progress\",\n done: \"Shipped\",\n};\n\n// =============================================================================\n// HOOKS\n// =============================================================================\n\nfunction useTheme(theme: \"light\" | \"dark\" | \"auto\"): \"light\" | \"dark\" {\n const [resolved, setResolved] = useState<\"light\" | \"dark\">(\"light\");\n\n useEffect(() => {\n if (theme === \"auto\") {\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n setResolved(isDark ? \"dark\" : \"light\");\n\n const listener = (e: MediaQueryListEvent) => setResolved(e.matches ? \"dark\" : \"light\");\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener(\"change\", listener);\n return () => mq.removeEventListener(\"change\", listener);\n } else {\n setResolved(theme);\n }\n }, [theme]);\n\n return resolved;\n}\n\n// =============================================================================\n// VERSION PILL COMPONENT (with full modal)\n// =============================================================================\n\nexport function VersionPill({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n position = \"inline\",\n className,\n theme = \"auto\",\n style = \"glass\",\n size = \"md\",\n showBranding = true,\n accent = \"green\",\n onNewVersion,\n onClick,\n}: VersionPillProps) {\n const [project, setProject] = useState<ProjectInfo | null>(null);\n const [versions, setVersions] = useState<Version[]>([]);\n const [roadmapTasks, setRoadmapTasks] = useState<RoadmapTask[]>([]);\n const [ideas, setIdeas] = useState<Idea[]>([]);\n const [loading, setLoading] = useState(true);\n const [isOpen, setIsOpen] = useState(false);\n const [activeTab, setActiveTab] = useState<ModalTab>(\"changelog\");\n const [hasNewVersion, setHasNewVersion] = useState(false);\n\n const resolvedTheme = useTheme(theme);\n const isLight = resolvedTheme === \"light\";\n const sizeConfig = SIZE_CONFIG[size];\n\n // Fetch version from badge API\n const fetchVersion = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/badge/${projectId}`);\n if (!response.ok) throw new Error(\"Failed to fetch version\");\n\n const data: BadgeAPIResponse = await response.json();\n if (data.version) {\n setProject({ name: data.name, slug: data.slug, currentVersion: data.version });\n\n const storedVersion = localStorage.getItem(`vp_${projectId}_seen`);\n if (data.version !== storedVersion) {\n setHasNewVersion(true);\n }\n }\n } catch (err) {\n console.error(\"Failed to fetch version:\", err);\n } finally {\n setLoading(false);\n }\n }, [projectId, baseUrl]);\n\n // Fetch changelog\n const fetchChangelog = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/changelog/${projectId}?limit=10`);\n if (!response.ok) return;\n\n const data: ChangelogAPIResponse = await response.json();\n setVersions(data.changelog);\n setProject(data.project);\n\n if (data.changelog.length > 0) {\n const storedVersion = localStorage.getItem(`vp_${projectId}_seen`);\n if (data.changelog[0].version !== storedVersion) {\n setHasNewVersion(true);\n onNewVersion?.(data.changelog[0]);\n }\n }\n } catch (err) {\n console.error(\"Failed to fetch changelog:\", err);\n }\n }, [projectId, baseUrl, onNewVersion]);\n\n // Fetch roadmap\n const fetchRoadmap = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/roadmap/${projectId}`);\n if (!response.ok) return;\n\n const data: RoadmapAPIResponse = await response.json();\n setRoadmapTasks(data.tasks || []);\n } catch (err) {\n console.error(\"Failed to fetch roadmap:\", err);\n }\n }, [projectId, baseUrl]);\n\n // Fetch ideas\n const fetchIdeas = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/ideas/${projectId}`);\n if (!response.ok) return;\n\n const data = await response.json();\n setIdeas(data.ideas || []);\n } catch (err) {\n console.error(\"Failed to fetch ideas:\", err);\n }\n }, [projectId, baseUrl]);\n\n useEffect(() => {\n fetchVersion();\n }, [fetchVersion]);\n\n const handleOpen = () => {\n if (onClick) {\n onClick();\n return;\n }\n setIsOpen(true);\n fetchChangelog();\n fetchRoadmap();\n fetchIdeas();\n if (project?.currentVersion) {\n localStorage.setItem(`vp_${projectId}_seen`, project.currentVersion);\n setHasNewVersion(false);\n }\n };\n\n const currentVersion = project?.currentVersion;\n\n const positionStyles: Record<string, string> = {\n \"top-left\": \"fixed top-4 left-4 z-[9999]\",\n \"top-right\": \"fixed top-4 right-4 z-[9999]\",\n \"bottom-left\": \"fixed bottom-4 left-4 z-[9999]\",\n \"bottom-right\": \"fixed bottom-4 right-4 z-[9999]\",\n inline: \"\",\n };\n\n // Get badge style based on style prop\n const getBadgeStyle = (): React.CSSProperties => {\n const base: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.font,\n fontFamily: \"ui-monospace, monospace\",\n fontWeight: 600,\n borderRadius: 999,\n cursor: \"pointer\",\n transition: \"all 150ms ease\",\n outline: \"none\",\n };\n\n if (style === \"gradient\") {\n return {\n ...base,\n background: \"linear-gradient(135deg, #22c55e 0%, #16a34a 100%)\",\n border: \"none\",\n color: \"#fff\",\n boxShadow: \"0 2px 8px rgba(34,197,94,0.3)\",\n };\n }\n\n // Glass style (default)\n return {\n ...base,\n background: isLight\n ? \"rgba(34, 197, 94, 0.12)\"\n : \"rgba(34, 197, 94, 0.18)\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n border: isLight\n ? \"1px solid rgba(34, 197, 94, 0.25)\"\n : \"1px solid rgba(34, 197, 94, 0.35)\",\n color: isLight ? \"#16a34a\" : \"#4ade80\",\n boxShadow: isLight\n ? \"0 2px 8px rgba(34, 197, 94, 0.15), inset 0 1px 0 rgba(255,255,255,0.5)\"\n : \"0 2px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.1)\",\n };\n };\n\n const getDotStyle = (): React.CSSProperties => ({\n width: sizeConfig.dotSize,\n height: sizeConfig.dotSize,\n borderRadius: \"50%\",\n background: style === \"gradient\" ? \"#fff\" : \"#22c55e\",\n boxShadow: style === \"gradient\"\n ? \"0 0 6px rgba(255,255,255,0.8)\"\n : \"0 0 6px rgba(34,197,94,0.6)\",\n flexShrink: 0,\n });\n\n // Loading state\n if (loading) {\n const loadingStyle = getBadgeStyle();\n return (\n <div className={clsx(positionStyles[position], className)} style={{ display: \"inline-flex\" }}>\n <span style={{ ...loadingStyle, opacity: 0.6, cursor: \"default\" }}>\n <span style={{ ...getDotStyle(), opacity: 0.6 }} />\n <span style={{\n width: 32,\n height: sizeConfig.font,\n background: style === \"gradient\" ? \"rgba(255,255,255,0.3)\" : \"rgba(34,197,94,0.3)\",\n borderRadius: 2\n }} />\n </span>\n </div>\n );\n }\n\n if (!currentVersion) return null;\n\n // Render the badge\n const renderBadge = () => {\n const badgeStyle = getBadgeStyle();\n const dotStyle = getDotStyle();\n\n return (\n <button\n onClick={handleOpen}\n style={badgeStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = \"scale(1.02)\";\n e.currentTarget.style.boxShadow = style === \"gradient\"\n ? \"0 4px 12px rgba(34,197,94,0.4)\"\n : isLight\n ? \"0 4px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.5)\"\n : \"0 4px 16px rgba(34, 197, 94, 0.35), inset 0 1px 0 rgba(255,255,255,0.1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = \"scale(1)\";\n e.currentTarget.style.boxShadow = style === \"gradient\"\n ? \"0 2px 8px rgba(34,197,94,0.3)\"\n : isLight\n ? \"0 2px 8px rgba(34, 197, 94, 0.15), inset 0 1px 0 rgba(255,255,255,0.5)\"\n : \"0 2px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.1)\";\n }}\n >\n <span style={dotStyle} />\n <span>v{currentVersion}</span>\n {hasNewVersion && (\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"#fbbf24\",\n marginLeft: 2,\n }}\n />\n )}\n </button>\n );\n };\n\n // Group roadmap tasks by column\n const groupedTasks = (roadmapTasks || []).reduce((acc, task) => {\n const col = task.column || \"backlog\";\n if (!acc[col]) acc[col] = [];\n acc[col].push(task);\n return acc;\n }, {} as Record<string, RoadmapTask[]>);\n\n return (\n <>\n <div className={clsx(positionStyles[position], className)} style={{ display: \"inline-flex\" }}>\n {renderBadge()}\n </div>\n\n {isOpen && (\n <div style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 99999,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 16,\n }}>\n {/* Backdrop */}\n <div\n onClick={() => setIsOpen(false)}\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"rgba(0,0,0,0.5)\",\n backdropFilter: \"blur(4px)\",\n }}\n />\n\n {/* Modal Panel */}\n <div\n style={{\n position: \"relative\",\n width: \"100%\",\n maxWidth: 480,\n maxHeight: \"80vh\",\n overflow: \"hidden\",\n borderRadius: 16,\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.25)\",\n background: isLight ? \"#fff\" : \"#18181b\",\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: 16,\n borderBottom: `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n {project?.icon && <span style={{ fontSize: 20 }}>{project.icon}</span>}\n <div>\n <h2 style={{ fontWeight: 600, color: isLight ? \"#18181b\" : \"#fff\", margin: 0 }}>\n {project?.name || \"What's New\"}\n </h2>\n <p style={{ fontSize: 12, color: isLight ? \"#71717a\" : \"#a1a1aa\", margin: 0 }}>\n v{currentVersion}\n </p>\n </div>\n </div>\n <button\n onClick={() => setIsOpen(false)}\n style={{\n padding: 4,\n borderRadius: 6,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n color: isLight ? \"#71717a\" : \"#a1a1aa\",\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Tabs */}\n <div\n style={{\n display: \"flex\",\n gap: 4,\n padding: \"8px 16px\",\n borderBottom: `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}`,\n }}\n >\n {([\"changelog\", \"roadmap\", \"ideas\"] as ModalTab[]).map((tab) => (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{\n padding: \"6px 12px\",\n borderRadius: 6,\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 500,\n background: activeTab === tab\n ? (isLight ? \"#f4f4f5\" : \"#27272a\")\n : \"transparent\",\n color: activeTab === tab\n ? (isLight ? \"#18181b\" : \"#fff\")\n : (isLight ? \"#71717a\" : \"#a1a1aa\"),\n }}\n >\n {tab === \"changelog\" && \"πŸš€ Changelog\"}\n {tab === \"roadmap\" && \"πŸ—ΊοΈ Roadmap\"}\n {tab === \"ideas\" && \"πŸ’‘ Ideas\"}\n </button>\n ))}\n </div>\n\n {/* Content */}\n <div style={{ padding: 16, overflowY: \"auto\", maxHeight: \"50vh\" }}>\n {/* Changelog Tab */}\n {activeTab === \"changelog\" && (\n <div>\n {versions.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: 40, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n <div style={{ fontSize: 32, marginBottom: 8 }}>πŸš€</div>\n <div>No releases yet</div>\n </div>\n ) : (\n versions.slice(0, 5).map((version, idx) => (\n <div key={idx} style={{ marginBottom: 16, paddingBottom: 16, borderBottom: idx < 4 ? `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}` : \"none\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 4 }}>\n <span style={{ fontSize: 16 }}>{version.emoji || \"πŸ“¦\"}</span>\n <span style={{ fontWeight: 600, color: isLight ? \"#18181b\" : \"#fff\" }}>\n {version.title}\n </span>\n <span\n style={{\n padding: \"2px 6px\",\n fontSize: 10,\n fontWeight: 500,\n borderRadius: 4,\n background: version.type === \"major\" ? \"#f3e8ff\" : version.type === \"minor\" ? \"#dbeafe\" : \"#f4f4f5\",\n color: version.type === \"major\" ? \"#7c3aed\" : version.type === \"minor\" ? \"#2563eb\" : \"#52525b\",\n }}\n >\n {version.type}\n </span>\n </div>\n <div style={{ fontSize: 12, color: isLight ? \"#71717a\" : \"#a1a1aa\", marginBottom: 8 }}>\n v{version.version} Β· {new Date(version.date).toLocaleDateString()}\n </div>\n {version.description && (\n <p style={{ fontSize: 14, color: isLight ? \"#52525b\" : \"#d4d4d8\", marginBottom: 8 }}>\n {version.description}\n </p>\n )}\n {version.features && version.features.length > 0 && (\n <ul style={{ margin: 0, paddingLeft: 0, listStyle: \"none\" }}>\n {version.features.map((feature, i) => (\n <li key={i} style={{ display: \"flex\", alignItems: \"flex-start\", gap: 8, fontSize: 14, color: isLight ? \"#52525b\" : \"#d4d4d8\", marginBottom: 4 }}>\n <span style={{ color: \"#22c55e\", marginTop: 2 }}>βœ“</span>\n {feature}\n </li>\n ))}\n </ul>\n )}\n </div>\n ))\n )}\n </div>\n )}\n\n {/* Roadmap Tab */}\n {activeTab === \"roadmap\" && (\n <div>\n {Object.keys(groupedTasks).length === 0 ? (\n <div style={{ textAlign: \"center\", padding: 40, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n <div style={{ fontSize: 32, marginBottom: 8 }}>πŸ—ΊοΈ</div>\n <div>No public roadmap items</div>\n </div>\n ) : (\n [\"in-progress\", \"todo\", \"backlog\", \"done\"].map((col) => {\n const tasks = groupedTasks[col];\n if (!tasks || tasks.length === 0) return null;\n return (\n <div key={col} style={{ marginBottom: 16 }}>\n <h3 style={{ fontSize: 12, fontWeight: 600, color: isLight ? \"#71717a\" : \"#a1a1aa\", marginBottom: 8, textTransform: \"uppercase\" }}>\n {COLUMN_LABELS[col] || col} ({tasks.length})\n </h3>\n {tasks.map((task) => (\n <div\n key={task.id}\n style={{\n padding: 12,\n marginBottom: 8,\n borderRadius: 8,\n background: isLight ? \"#f4f4f5\" : \"#27272a\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: TYPE_COLORS[task.type] || \"#71717a\",\n }}\n />\n <span style={{ fontSize: 14, color: isLight ? \"#18181b\" : \"#fff\" }}>\n {task.title}\n </span>\n </div>\n </div>\n ))}\n </div>\n );\n })\n )}\n </div>\n )}\n\n {/* Ideas Tab */}\n {activeTab === \"ideas\" && (\n <div>\n {ideas.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: 40, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n <div style={{ fontSize: 32, marginBottom: 8 }}>πŸ’‘</div>\n <div>No feature requests yet</div>\n </div>\n ) : (\n ideas.map((idea) => (\n <div\n key={idea.id}\n style={{\n padding: 12,\n marginBottom: 8,\n borderRadius: 8,\n background: isLight ? \"#f4f4f5\" : \"#27272a\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 12,\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n padding: \"4px 8px\",\n borderRadius: 6,\n background: isLight ? \"#fff\" : \"#18181b\",\n minWidth: 40,\n }}\n >\n <span style={{ fontSize: 14, fontWeight: 600, color: isLight ? \"#18181b\" : \"#fff\" }}>\n {idea.votes}\n </span>\n <span style={{ fontSize: 10, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>votes</span>\n </div>\n <div>\n <div style={{ fontSize: 14, fontWeight: 500, color: isLight ? \"#18181b\" : \"#fff\", marginBottom: 4 }}>\n {idea.title}\n </div>\n {idea.description && (\n <div style={{ fontSize: 13, color: isLight ? \"#71717a\" : \"#a1a1aa\" }}>\n {idea.description.slice(0, 100)}...\n </div>\n )}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: 12,\n borderTop: `1px solid ${isLight ? \"#f4f4f5\" : \"#27272a\"}`,\n background: isLight ? \"#fafafa\" : \"#0a0a0a\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n {showBranding && (\n <a\n href=\"https://versionpill.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ fontSize: 10, color: isLight ? \"#a1a1aa\" : \"#52525b\", textDecoration: \"none\" }}\n >\n Powered by Version Pill\n </a>\n )}\n <a\n href={`${baseUrl}/${projectId}/${activeTab === \"ideas\" ? \"feature-requests\" : activeTab}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n padding: \"6px 12px\",\n fontSize: 12,\n fontWeight: 500,\n borderRadius: 6,\n background: \"#22c55e\",\n color: \"#fff\",\n textDecoration: \"none\",\n }}\n >\n View All β†’\n </a>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n\n// =============================================================================\n// VERSION BADGE COMPONENT (No Modal - just badge)\n// =============================================================================\n\nexport interface VersionBadgeProps {\n projectId: string;\n baseUrl?: string;\n theme?: \"light\" | \"dark\" | \"auto\";\n style?: BadgeStyle;\n size?: BadgeSize;\n accent?: \"green\" | \"blue\" | \"purple\" | \"orange\" | \"neutral\";\n className?: string;\n href?: string;\n}\n\nexport function VersionBadge({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n theme = \"auto\",\n style = \"glass\",\n size = \"md\",\n accent = \"green\",\n className,\n href,\n}: VersionBadgeProps) {\n const [version, setVersion] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n const resolvedTheme = useTheme(theme);\n const isLight = resolvedTheme === \"light\";\n const colors = ACCENT_COLORS[accent][isLight ? \"light\" : \"dark\"];\n const sizeConfig = SIZE_CONFIG[size];\n\n useEffect(() => {\n fetch(`${baseUrl}/api/badge/${projectId}`)\n .then((res) => res.json())\n .then((data) => setVersion(data.version))\n .catch(() => setVersion(null))\n .finally(() => setLoading(false));\n }, [projectId, baseUrl]);\n\n // Style configurations\n const getStyleConfig = (): React.CSSProperties => {\n const base: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.font,\n fontFamily: \"ui-monospace, monospace\",\n fontWeight: 600,\n borderRadius: 999,\n textDecoration: \"none\",\n transition: \"all 150ms ease\",\n cursor: \"pointer\",\n };\n\n switch (style) {\n case \"glass\":\n return {\n ...base,\n background: isLight\n ? \"rgba(34, 197, 94, 0.12)\"\n : \"rgba(34, 197, 94, 0.18)\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n border: isLight\n ? \"1px solid rgba(34, 197, 94, 0.25)\"\n : \"1px solid rgba(34, 197, 94, 0.35)\",\n color: isLight ? \"#16a34a\" : \"#4ade80\",\n boxShadow: isLight\n ? \"0 2px 8px rgba(34, 197, 94, 0.15), inset 0 1px 0 rgba(255,255,255,0.5)\"\n : \"0 2px 12px rgba(34, 197, 94, 0.25), inset 0 1px 0 rgba(255,255,255,0.1)\",\n };\n case \"gradient\":\n return {\n ...base,\n background: \"linear-gradient(135deg, #22c55e 0%, #16a34a 100%)\",\n color: \"#fff\",\n boxShadow: \"0 2px 8px rgba(34,197,94,0.3)\",\n };\n case \"pill\":\n return {\n ...base,\n background: colors.bg,\n border: `1px solid ${colors.border}`,\n color: colors.text,\n };\n case \"minimal\":\n return {\n ...base,\n background: \"transparent\",\n color: colors.text,\n padding: \"0 4px\",\n };\n case \"dot\":\n return {\n ...base,\n background: colors.bg,\n border: `1px solid ${colors.border}`,\n color: colors.text,\n };\n default:\n return {\n ...base,\n background: isLight\n ? \"rgba(34, 197, 94, 0.12)\"\n : \"rgba(34, 197, 94, 0.18)\",\n backdropFilter: \"blur(8px)\",\n border: isLight\n ? \"1px solid rgba(34, 197, 94, 0.25)\"\n : \"1px solid rgba(34, 197, 94, 0.35)\",\n color: isLight ? \"#16a34a\" : \"#4ade80\",\n boxShadow: \"0 2px 8px rgba(34, 197, 94, 0.15)\",\n };\n }\n };\n\n const getDotStyle = (): React.CSSProperties => {\n const isGlassOrPill = style === \"glass\" || style === \"pill\" || style === \"dot\";\n return {\n width: sizeConfig.dotSize,\n height: sizeConfig.dotSize,\n borderRadius: \"50%\",\n background: style === \"gradient\" ? \"#fff\" : \"#22c55e\",\n boxShadow: style === \"gradient\"\n ? \"0 0 6px rgba(255,255,255,0.8)\"\n : \"0 0 6px rgba(34,197,94,0.6)\",\n flexShrink: 0,\n };\n };\n\n if (loading) {\n const loadingStyle = getStyleConfig();\n return (\n <span className={className} style={{ ...loadingStyle, opacity: 0.6 }}>\n <span style={{ ...getDotStyle(), opacity: 0.6 }} />\n <span style={{\n width: 32,\n height: sizeConfig.font,\n background: style === \"gradient\" ? \"rgba(255,255,255,0.3)\" : \"rgba(34,197,94,0.3)\",\n borderRadius: 2\n }} />\n </span>\n );\n }\n\n if (!version) return null;\n\n const badgeStyle = getStyleConfig();\n const dotStyle = getDotStyle();\n\n const content = (\n <>\n <span style={dotStyle} />\n <span>v{version}</span>\n </>\n );\n\n if (href) {\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={className} style={badgeStyle}>\n {content}\n </a>\n );\n }\n\n return (\n <span className={className} style={badgeStyle}>\n {content}\n </span>\n );\n}\n\n// =============================================================================\n// USE VERSION HOOK\n// =============================================================================\n\nexport interface UseVersionOptions {\n projectId: string;\n baseUrl?: string;\n refetchInterval?: number;\n}\n\nexport interface UseVersionResult {\n version: string | null;\n name: string | null;\n slug: string | null;\n loading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\nconst versionCache: Record<string, { version: string | null; name: string | null; slug: string | null }> = {};\n\nexport function useVersion({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n refetchInterval = 0,\n}: UseVersionOptions): UseVersionResult {\n const cacheKey = `${baseUrl}:${projectId}`;\n const cached = versionCache[cacheKey];\n\n const [version, setVersion] = useState<string | null>(cached?.version ?? null);\n const [name, setName] = useState<string | null>(cached?.name ?? null);\n const [slug, setSlug] = useState<string | null>(cached?.slug ?? null);\n const [loading, setLoading] = useState(!cached);\n const [error, setError] = useState<string | null>(null);\n\n const fetchVersion = useCallback(async () => {\n if (typeof window === \"undefined\") return;\n\n try {\n setError(null);\n const response = await fetch(`${baseUrl}/api/badge/${projectId}`);\n if (!response.ok) throw new Error(\"Failed to fetch version\");\n\n const data: BadgeAPIResponse = await response.json();\n versionCache[cacheKey] = { version: data.version, name: data.name, slug: data.slug };\n\n setVersion(data.version);\n setName(data.name);\n setSlug(data.slug);\n } catch (err: any) {\n setError(err.message);\n } finally {\n setLoading(false);\n }\n }, [projectId, baseUrl, cacheKey]);\n\n useEffect(() => {\n if (!cached) {\n fetchVersion();\n }\n }, [fetchVersion, cached]);\n\n useEffect(() => {\n if (refetchInterval > 0) {\n const interval = setInterval(fetchVersion, refetchInterval);\n return () => clearInterval(interval);\n }\n }, [refetchInterval, fetchVersion]);\n\n return { version, name, slug, loading, error, refetch: fetchVersion };\n}\n\n// =============================================================================\n// EMBED COMPONENTS\n// =============================================================================\n\nexport function Changelog({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n maxHeight = 600,\n theme = \"auto\",\n className,\n}: ChangelogProps) {\n const resolvedTheme = useTheme(theme);\n\n return (\n <iframe\n src={`${baseUrl}/embed/${projectId}/changelog?theme=${resolvedTheme}`}\n className={className}\n style={{ width: \"100%\", height: maxHeight, border: \"none\" }}\n title=\"Changelog\"\n />\n );\n}\n\nexport function Roadmap({\n projectId,\n baseUrl = DEFAULT_BASE_URL,\n maxHeight = 800,\n theme = \"auto\",\n className,\n}: RoadmapProps) {\n const resolvedTheme = useTheme(theme);\n\n return (\n <iframe\n src={`${baseUrl}/embed/${projectId}/roadmap?theme=${resolvedTheme}`}\n className={className}\n style={{ width: \"100%\", height: maxHeight, border: \"none\" }}\n title=\"Roadmap\"\n />\n );\n}\n\n// =============================================================================\n// DEFAULT EXPORT\n// =============================================================================\n\nexport default VersionPill;\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "version-pill-react",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "React components for Version Pill - changelog, roadmap & feedback widgets",
5
5
  "author": "Jimmy Harika <jimmy@jimmyharika.com>",
6
6
  "homepage": "https://versionpill.com",