version-pill-react 1.2.3 β†’ 1.2.4

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
@@ -295,7 +295,8 @@ function VersionPill({
295
295
  }
296
296
  );
297
297
  };
298
- const groupedTasks = (roadmapTasks || []).reduce((acc, task) => {
298
+ const tasksArray = Array.isArray(roadmapTasks) ? roadmapTasks : [];
299
+ const groupedTasks = tasksArray.reduce((acc, task) => {
299
300
  const col = task.column || "backlog";
300
301
  if (!acc[col]) acc[col] = [];
301
302
  acc[col].push(task);
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 = \"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) {\n setLoading(false);\n return;\n }\n const data: BadgeAPIResponse = await response.json();\n if (data.version) {\n setProject({ name: data.name, slug: data.slug, currentVersion: data.version });\n const storedVersion = localStorage.getItem(`vp_${projectId}_seen`);\n if (data.version !== storedVersion) {\n setHasNewVersion(true);\n }\n }\n } catch {\n // Silently fail\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 const data: ChangelogAPIResponse = await response.json();\n setVersions(data.changelog || []);\n setProject(data.project);\n if (data.changelog && 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 {\n // Silently fail\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 const data: RoadmapAPIResponse = await response.json();\n setRoadmapTasks(data.tasks || []);\n } catch {\n // Silently fail\n }\n }, [projectId, baseUrl]);\n\n // Fetch ideas (silently fails if API unavailable)\n const fetchIdeas = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/ideas/${projectId}`);\n if (!response.ok) return;\n const data = await response.json();\n setIdeas(data.ideas || []);\n } catch {\n // Silently fail - ideas API might not exist\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"]}
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) {\n setLoading(false);\n return;\n }\n const data: BadgeAPIResponse = await response.json();\n if (data.version) {\n setProject({ name: data.name, slug: data.slug, currentVersion: data.version });\n const storedVersion = localStorage.getItem(`vp_${projectId}_seen`);\n if (data.version !== storedVersion) {\n setHasNewVersion(true);\n }\n }\n } catch {\n // Silently fail\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 const data: ChangelogAPIResponse = await response.json();\n setVersions(data.changelog || []);\n setProject(data.project);\n if (data.changelog && 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 {\n // Silently fail\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 const data: RoadmapAPIResponse = await response.json();\n setRoadmapTasks(data.tasks || []);\n } catch {\n // Silently fail\n }\n }, [projectId, baseUrl]);\n\n // Fetch ideas (silently fails if API unavailable)\n const fetchIdeas = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/ideas/${projectId}`);\n if (!response.ok) return;\n const data = await response.json();\n setIdeas(data.ideas || []);\n } catch {\n // Silently fail - ideas API might not exist\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 tasksArray = Array.isArray(roadmapTasks) ? roadmapTasks : [];\n const groupedTasks = tasksArray.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
@@ -257,7 +257,8 @@ function VersionPill({
257
257
  }
258
258
  );
259
259
  };
260
- const groupedTasks = (roadmapTasks || []).reduce((acc, task) => {
260
+ const tasksArray = Array.isArray(roadmapTasks) ? roadmapTasks : [];
261
+ const groupedTasks = tasksArray.reduce((acc, task) => {
261
262
  const col = task.column || "backlog";
262
263
  if (!acc[col]) acc[col] = [];
263
264
  acc[col].push(task);
@@ -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 = \"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) {\n setLoading(false);\n return;\n }\n const data: BadgeAPIResponse = await response.json();\n if (data.version) {\n setProject({ name: data.name, slug: data.slug, currentVersion: data.version });\n const storedVersion = localStorage.getItem(`vp_${projectId}_seen`);\n if (data.version !== storedVersion) {\n setHasNewVersion(true);\n }\n }\n } catch {\n // Silently fail\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 const data: ChangelogAPIResponse = await response.json();\n setVersions(data.changelog || []);\n setProject(data.project);\n if (data.changelog && 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 {\n // Silently fail\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 const data: RoadmapAPIResponse = await response.json();\n setRoadmapTasks(data.tasks || []);\n } catch {\n // Silently fail\n }\n }, [projectId, baseUrl]);\n\n // Fetch ideas (silently fails if API unavailable)\n const fetchIdeas = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/ideas/${projectId}`);\n if (!response.ok) return;\n const data = await response.json();\n setIdeas(data.ideas || []);\n } catch {\n // Silently fail - ideas API might not exist\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":[]}
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) {\n setLoading(false);\n return;\n }\n const data: BadgeAPIResponse = await response.json();\n if (data.version) {\n setProject({ name: data.name, slug: data.slug, currentVersion: data.version });\n const storedVersion = localStorage.getItem(`vp_${projectId}_seen`);\n if (data.version !== storedVersion) {\n setHasNewVersion(true);\n }\n }\n } catch {\n // Silently fail\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 const data: ChangelogAPIResponse = await response.json();\n setVersions(data.changelog || []);\n setProject(data.project);\n if (data.changelog && 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 {\n // Silently fail\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 const data: RoadmapAPIResponse = await response.json();\n setRoadmapTasks(data.tasks || []);\n } catch {\n // Silently fail\n }\n }, [projectId, baseUrl]);\n\n // Fetch ideas (silently fails if API unavailable)\n const fetchIdeas = useCallback(async () => {\n try {\n const response = await fetch(`${baseUrl}/api/ideas/${projectId}`);\n if (!response.ok) return;\n const data = await response.json();\n setIdeas(data.ideas || []);\n } catch {\n // Silently fail - ideas API might not exist\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 tasksArray = Array.isArray(roadmapTasks) ? roadmapTasks : [];\n const groupedTasks = tasksArray.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.3",
3
+ "version": "1.2.4",
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",