version-pill-react 1.2.0 β†’ 1.2.1

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