version-pill-react 1.3.0 → 1.5.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
@@ -40,6 +40,7 @@ __export(index_exports, {
40
40
  });
41
41
  module.exports = __toCommonJS(index_exports);
42
42
  var import_react = require("react");
43
+ var import_react_dom = require("react-dom");
43
44
  var import_clsx = __toESM(require("clsx"));
44
45
  var import_jsx_runtime = require("react/jsx-runtime");
45
46
  var DEFAULT_BASE_URL = "https://www.versionpill.com";
@@ -76,16 +77,37 @@ var TYPE_COLORS = {
76
77
  improvement: "#3b82f6",
77
78
  chore: "#71717a"
78
79
  };
79
- var COLUMN_LABELS = {
80
- backlog: "Backlog",
81
- todo: "Planned",
82
- "in-progress": "In Progress",
83
- "in progress": "In Progress",
84
- inProgress: "In Progress",
85
- done: "Shipped",
86
- shipped: "Shipped",
87
- completed: "Shipped"
80
+ var TYPE_EMOJIS = {
81
+ feature: "\u2728",
82
+ bug: "\u{1F41B}",
83
+ improvement: "\u{1F4C8}",
84
+ chore: "\u{1F527}",
85
+ idea: "\u{1F4A1}"
88
86
  };
87
+ var PRIORITY_COLORS = {
88
+ urgent: "#ef4444",
89
+ high: "#f97316",
90
+ medium: "#3b82f6",
91
+ low: "#9ca3af"
92
+ };
93
+ var STATUS_CONFIG = {
94
+ new: { color: "#3b82f6", label: "New" },
95
+ "under review": { color: "#f59e0b", label: "Under Review" },
96
+ planned: { color: "#8b5cf6", label: "Planned" },
97
+ "in progress": { color: "#3b82f6", label: "In Progress" },
98
+ shipped: { color: "#22c55e", label: "Shipped" },
99
+ declined: { color: "#ef4444", label: "Declined" }
100
+ };
101
+ var FADE_IN_KEYFRAMES = `
102
+ @keyframes vpFadeIn {
103
+ from { opacity: 0; }
104
+ to { opacity: 1; }
105
+ }
106
+ @keyframes vpSlideUp {
107
+ from { opacity: 0; transform: translateY(8px); }
108
+ to { opacity: 1; transform: translateY(0); }
109
+ }
110
+ `;
89
111
  function useTheme(theme) {
90
112
  const [resolved, setResolved] = (0, import_react.useState)("light");
91
113
  (0, import_react.useEffect)(() => {
@@ -118,6 +140,8 @@ function VersionPill({
118
140
  const [project, setProject] = (0, import_react.useState)(null);
119
141
  const [versions, setVersions] = (0, import_react.useState)([]);
120
142
  const [roadmapTasks, setRoadmapTasks] = (0, import_react.useState)([]);
143
+ const [roadmapColumns, setRoadmapColumns] = (0, import_react.useState)([]);
144
+ const [roadmapItems, setRoadmapItems] = (0, import_react.useState)([]);
121
145
  const [ideas, setIdeas] = (0, import_react.useState)([]);
122
146
  const [loading, setLoading] = (0, import_react.useState)(true);
123
147
  const [isOpen, setIsOpen] = (0, import_react.useState)(false);
@@ -130,6 +154,10 @@ function VersionPill({
130
154
  const [ideaAuthorEmail, setIdeaAuthorEmail] = (0, import_react.useState)("");
131
155
  const [submittingIdea, setSubmittingIdea] = (0, import_react.useState)(false);
132
156
  const [ideaSubmitMessage, setIdeaSubmitMessage] = (0, import_react.useState)(null);
157
+ const [roadmapView, setRoadmapView] = (0, import_react.useState)("board");
158
+ const [isMobile, setIsMobile] = (0, import_react.useState)(false);
159
+ const [votedIdeas, setVotedIdeas] = (0, import_react.useState)(/* @__PURE__ */ new Set());
160
+ const [collapsedColumns, setCollapsedColumns] = (0, import_react.useState)(/* @__PURE__ */ new Set());
133
161
  const resolvedTheme = useTheme(theme);
134
162
  const isLight = resolvedTheme === "light";
135
163
  const sizeConfig = SIZE_CONFIG[size];
@@ -175,6 +203,11 @@ function VersionPill({
175
203
  const response = await fetch(`${baseUrl}/api/roadmap/${projectId}`);
176
204
  if (!response.ok) return;
177
205
  const data = await response.json();
206
+ if (data.columns && data.items) {
207
+ setRoadmapColumns(data.columns);
208
+ setRoadmapItems(data.items);
209
+ return;
210
+ }
178
211
  let tasks = [];
179
212
  if (Array.isArray(data.tasks)) {
180
213
  tasks = data.tasks;
@@ -194,6 +227,20 @@ function VersionPill({
194
227
  const planned = (grouped.planned || []).map((t) => mapTask(t, "todo"));
195
228
  tasks = [...inProgress, ...planned];
196
229
  }
230
+ setRoadmapColumns([
231
+ { id: "planned", name: "Planned" },
232
+ { id: "in_progress", name: "In Progress" },
233
+ { id: "completed", name: "Completed" }
234
+ ]);
235
+ setRoadmapItems(tasks.map((t) => ({
236
+ id: t.id,
237
+ title: t.title,
238
+ description: t.description,
239
+ type: t.type,
240
+ priority: t.priority,
241
+ itemType: "task",
242
+ columnId: t.column === "in-progress" ? "in_progress" : t.column === "done" || t.column === "shipped" ? "completed" : "planned"
243
+ })));
197
244
  setRoadmapTasks(tasks);
198
245
  } catch {
199
246
  }
@@ -237,9 +284,63 @@ function VersionPill({
237
284
  setSubmittingIdea(false);
238
285
  }
239
286
  }, [baseUrl, projectId, ideaTitle, ideaDescription, ideaAuthorName, ideaAuthorEmail, fetchIdeas]);
287
+ const voteIdea = (0, import_react.useCallback)(async (ideaId) => {
288
+ if (votedIdeas.has(ideaId)) return;
289
+ setIdeas((prev) => prev.map((i) => i.id === ideaId ? { ...i, votes: i.votes + 1 } : i));
290
+ setVotedIdeas((prev) => new Set(prev).add(ideaId));
291
+ try {
292
+ await fetch(`${baseUrl}/api/ideas/${projectId}/vote`, {
293
+ method: "POST",
294
+ headers: { "Content-Type": "application/json" },
295
+ body: JSON.stringify({ ideaId })
296
+ });
297
+ } catch {
298
+ setIdeas((prev) => prev.map((i) => i.id === ideaId ? { ...i, votes: i.votes - 1 } : i));
299
+ setVotedIdeas((prev) => {
300
+ const s = new Set(prev);
301
+ s.delete(ideaId);
302
+ return s;
303
+ });
304
+ }
305
+ }, [baseUrl, projectId, votedIdeas]);
240
306
  (0, import_react.useEffect)(() => {
241
307
  fetchVersion();
242
308
  }, [fetchVersion]);
309
+ (0, import_react.useEffect)(() => {
310
+ if (isOpen) {
311
+ const prev = document.body.style.overflow;
312
+ document.body.style.overflow = "hidden";
313
+ return () => {
314
+ document.body.style.overflow = prev;
315
+ };
316
+ }
317
+ }, [isOpen]);
318
+ (0, import_react.useEffect)(() => {
319
+ if (!isOpen) return;
320
+ const handleKey = (e) => {
321
+ if (e.key === "Escape") setIsOpen(false);
322
+ };
323
+ document.addEventListener("keydown", handleKey);
324
+ return () => document.removeEventListener("keydown", handleKey);
325
+ }, [isOpen]);
326
+ (0, import_react.useEffect)(() => {
327
+ const check = () => setIsMobile(window.innerWidth < 640);
328
+ check();
329
+ window.addEventListener("resize", check);
330
+ return () => window.removeEventListener("resize", check);
331
+ }, []);
332
+ (0, import_react.useEffect)(() => {
333
+ if (!isOpen) return;
334
+ const id = "vp-modal-keyframes";
335
+ if (document.getElementById(id)) return;
336
+ const style2 = document.createElement("style");
337
+ style2.id = id;
338
+ style2.textContent = FADE_IN_KEYFRAMES;
339
+ document.head.appendChild(style2);
340
+ return () => {
341
+ document.getElementById(id)?.remove();
342
+ };
343
+ }, [isOpen]);
243
344
  const handleOpen = () => {
244
345
  if (onClick) {
245
346
  onClick();
@@ -356,494 +457,865 @@ function VersionPill({
356
457
  );
357
458
  };
358
459
  const versionsArray = Array.isArray(versions) ? versions : [];
359
- const tasksArray = Array.isArray(roadmapTasks) ? roadmapTasks : [];
360
460
  const ideasArray = Array.isArray(ideas) ? ideas : [];
361
- const groupedTasks = tasksArray.reduce((acc, task) => {
362
- const col = task.column || "backlog";
363
- if (!acc[col]) acc[col] = [];
364
- acc[col].push(task);
365
- return acc;
366
- }, {});
367
461
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
368
462
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_clsx.default)(positionStyles[position], className), style: { display: "inline-flex" }, children: renderBadge() }),
369
- isOpen && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: {
370
- position: "fixed",
371
- top: 0,
372
- left: 0,
373
- right: 0,
374
- bottom: 0,
375
- width: "100vw",
376
- height: "100vh",
377
- zIndex: 2147483647,
378
- display: "flex",
379
- flexDirection: "column",
380
- boxSizing: "border-box",
381
- background: isLight ? "#fff" : "#0a0a0a"
382
- }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
383
- "div",
384
- {
385
- style: {
386
- display: "flex",
387
- flexDirection: "column",
388
- width: "100%",
389
- height: "100%",
390
- borderRadius: 12,
391
- overflow: "hidden"
392
- },
393
- children: [
394
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
395
- "div",
396
- {
397
- style: {
398
- flexShrink: 0,
399
- padding: "16px 20px",
400
- borderBottom: `1px solid ${isLight ? "#e5e5e5" : "#1f1f1f"}`,
401
- display: "flex",
402
- alignItems: "center",
403
- justifyContent: "space-between"
404
- },
405
- children: [
406
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 12 }, children: [
407
- project?.icon && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 24 }, children: project.icon }),
408
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
409
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { style: { fontWeight: 600, fontSize: 18, color: isLight ? "#18181b" : "#fff", margin: 0 }, children: project?.name || "What's New" }),
410
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { style: { fontSize: 13, color: isLight ? "#71717a" : "#a1a1aa", margin: 0 }, children: [
411
- "v",
412
- currentVersion
413
- ] })
414
- ] })
415
- ] }),
416
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
417
- "button",
418
- {
419
- onClick: () => setIsOpen(false),
420
- style: {
421
- width: 36,
422
- height: 36,
423
- display: "flex",
424
- alignItems: "center",
425
- justifyContent: "center",
426
- borderRadius: 8,
427
- background: isLight ? "#f5f5f5" : "#1f1f1f",
428
- border: "none",
429
- cursor: "pointer",
430
- color: isLight ? "#71717a" : "#a1a1aa",
431
- transition: "background 150ms"
432
- },
433
- onMouseEnter: (e) => e.currentTarget.style.background = isLight ? "#e5e5e5" : "#2a2a2a",
434
- onMouseLeave: (e) => e.currentTarget.style.background = isLight ? "#f5f5f5" : "#1f1f1f",
435
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M18 6L6 18M6 6l12 12" }) })
436
- }
437
- )
438
- ]
463
+ isOpen && (0, import_react_dom.createPortal)(
464
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
465
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
466
+ "div",
467
+ {
468
+ onClick: () => setIsOpen(false),
469
+ style: {
470
+ position: "fixed",
471
+ top: 0,
472
+ left: 0,
473
+ right: 0,
474
+ bottom: 0,
475
+ zIndex: 2147483646,
476
+ background: "rgba(0,0,0,0.5)",
477
+ animation: "vpFadeIn 200ms ease-out"
439
478
  }
440
- ),
441
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
442
- "div",
443
- {
444
- style: {
445
- flexShrink: 0,
446
- display: "flex",
447
- gap: 4,
448
- padding: "12px 20px",
449
- borderBottom: `1px solid ${isLight ? "#e5e5e5" : "#1f1f1f"}`
450
- },
451
- children: ["changelog", "roadmap", "ideas"].map((tab) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
452
- "button",
453
- {
454
- onClick: () => setActiveTab(tab),
455
- style: {
456
- padding: "10px 16px",
457
- borderRadius: 8,
458
- border: "none",
459
- cursor: "pointer",
460
- fontSize: 14,
461
- fontWeight: 500,
462
- background: activeTab === tab ? isLight ? "#18181b" : "#fff" : "transparent",
463
- color: activeTab === tab ? isLight ? "#fff" : "#18181b" : isLight ? "#71717a" : "#71717a",
464
- transition: "all 150ms"
465
- },
466
- children: [
467
- tab === "changelog" && "\u{1F680} Changelog",
468
- tab === "roadmap" && "\u{1F5FA}\uFE0F Roadmap",
469
- tab === "ideas" && "\u{1F4A1} Ideas"
470
- ]
471
- },
472
- tab
473
- ))
474
- }
475
- ),
476
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { flex: 1, overflowY: "auto", padding: "20px 24px", minHeight: 0 }, children: [
477
- activeTab === "changelog" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { maxWidth: 640 }, children: versionsArray.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { textAlign: "center", padding: 60, color: isLight ? "#71717a" : "#a1a1aa" }, children: [
478
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 48, marginBottom: 12 }, children: "\u{1F680}" }),
479
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 16 }, children: "No releases yet" })
480
- ] }) : versionsArray.slice(0, 10).map((version, idx) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { marginBottom: 24, paddingBottom: 24, borderBottom: idx < versionsArray.length - 1 && idx < 9 ? `1px solid ${isLight ? "#f0f0f0" : "#1f1f1f"}` : "none" }, children: [
481
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 6 }, children: [
482
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 20 }, children: version.emoji || "\u{1F4E6}" }),
483
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontWeight: 600, fontSize: 18, color: isLight ? "#18181b" : "#fff" }, children: version.title }),
484
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
485
- "span",
486
- {
487
- style: {
488
- padding: "3px 8px",
489
- fontSize: 11,
490
- fontWeight: 500,
491
- borderRadius: 4,
492
- background: version.type === "major" ? "#f3e8ff" : version.type === "minor" ? "#dbeafe" : isLight ? "#f4f4f5" : "#1f1f1f",
493
- color: version.type === "major" ? "#7c3aed" : version.type === "minor" ? "#2563eb" : isLight ? "#52525b" : "#a1a1aa"
494
- },
495
- children: version.type
496
- }
497
- )
498
- ] }),
499
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { fontSize: 13, color: isLight ? "#71717a" : "#71717a", marginBottom: 10 }, children: [
500
- "v",
501
- version.version,
502
- " \xB7 ",
503
- new Date(version.date).toLocaleDateString()
504
- ] }),
505
- version.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: { fontSize: 15, color: isLight ? "#52525b" : "#a1a1aa", margin: "0 0 12px 0", lineHeight: 1.6 }, children: version.description }),
506
- version.features && version.features.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { style: { margin: 0, paddingLeft: 0, listStyle: "none" }, children: version.features.map((feature, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { style: { display: "flex", alignItems: "flex-start", gap: 10, fontSize: 14, color: isLight ? "#52525b" : "#a1a1aa", marginBottom: 6, lineHeight: 1.5 }, children: [
507
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { color: "#22c55e", fontSize: 14, marginTop: 2 }, children: "\u2713" }),
508
- feature
509
- ] }, i)) })
510
- ] }, idx)) }),
511
- activeTab === "roadmap" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { maxWidth: 640 }, children: Object.keys(groupedTasks).length === 0 || tasksArray.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { textAlign: "center", padding: 60, color: isLight ? "#71717a" : "#a1a1aa" }, children: [
512
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 48, marginBottom: 12 }, children: "\u{1F5FA}\uFE0F" }),
513
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 16 }, children: "No public roadmap items" })
514
- ] }) : (
515
- // Show all columns that have tasks, prioritizing known columns first
516
- [.../* @__PURE__ */ new Set([
517
- ...["in-progress", "todo", "backlog"].filter((c) => groupedTasks[c]?.length > 0),
518
- ...Object.keys(groupedTasks).filter((c) => !["in-progress", "todo", "backlog", "done"].includes(c))
519
- ])].map((col) => {
520
- const tasks = groupedTasks[col];
521
- if (!tasks || tasks.length === 0) return null;
522
- const columnLabel = tasks[0]?.columnName || COLUMN_LABELS[col] || col;
523
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { marginBottom: 24 }, children: [
524
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("h3", { style: { fontSize: 12, fontWeight: 600, color: isLight ? "#a1a1aa" : "#71717a", marginBottom: 12, textTransform: "uppercase", letterSpacing: "0.5px" }, children: [
525
- columnLabel,
526
- " (",
527
- tasks.length,
528
- ")"
529
- ] }),
530
- tasks.map((task) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
531
- "div",
532
- {
533
- style: {
534
- padding: "12px 16px",
535
- marginBottom: 8,
536
- borderRadius: 8,
537
- background: isLight ? "#f5f5f5" : "#151515",
538
- border: `1px solid ${isLight ? "#e5e5e5" : "#1f1f1f"}`
539
- },
540
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", gap: 10 }, children: [
541
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
542
- "span",
543
- {
544
- style: {
545
- width: 8,
546
- height: 8,
547
- borderRadius: "50%",
548
- background: TYPE_COLORS[task.type] || "#71717a",
549
- flexShrink: 0,
550
- marginTop: 5
551
- }
552
- }
553
- ),
554
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
555
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 14, color: isLight ? "#18181b" : "#fff" }, children: task.title }),
556
- task.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: { fontSize: 13, color: isLight ? "#71717a" : "#a1a1aa", margin: "4px 0 0 0", lineHeight: 1.5 }, children: task.description })
557
- ] })
558
- ] })
559
- },
560
- task.id
561
- ))
562
- ] }, col);
563
- })
564
- ) }),
565
- activeTab === "ideas" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { maxWidth: 640 }, children: [
566
- !showIdeaForm ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
567
- "button",
479
+ }
480
+ ),
481
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
482
+ "div",
483
+ {
484
+ onClick: (e) => e.stopPropagation(),
485
+ style: {
486
+ position: "fixed",
487
+ top: isMobile ? 0 : 20,
488
+ left: isMobile ? 0 : 20,
489
+ right: isMobile ? 0 : 20,
490
+ bottom: isMobile ? 0 : 20,
491
+ zIndex: 2147483647,
492
+ display: "flex",
493
+ flexDirection: "column",
494
+ boxSizing: "border-box",
495
+ background: isLight ? "#fff" : "#0a0a0a",
496
+ borderRadius: isMobile ? 0 : 16,
497
+ overflow: "hidden",
498
+ boxShadow: "0 25px 50px -12px rgba(0,0,0,0.25)",
499
+ animation: "vpSlideUp 250ms ease-out"
500
+ },
501
+ children: [
502
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
503
+ "div",
568
504
  {
569
- onClick: () => setShowIdeaForm(true),
570
505
  style: {
506
+ flexShrink: 0,
507
+ padding: isMobile ? "12px 16px" : "16px 20px",
508
+ borderBottom: `1px solid ${isLight ? "#e5e5e5" : "#1f1f1f"}`,
571
509
  display: "flex",
572
510
  alignItems: "center",
573
- justifyContent: "center",
574
- gap: 8,
575
- width: "100%",
576
- padding: "12px 16px",
577
- marginBottom: 20,
578
- borderRadius: 8,
579
- border: `1px dashed ${isLight ? "#d4d4d8" : "#3f3f46"}`,
580
- background: "transparent",
581
- color: isLight ? "#71717a" : "#a1a1aa",
582
- fontSize: 14,
583
- fontWeight: 500,
584
- cursor: "pointer",
585
- transition: "all 150ms"
586
- },
587
- onMouseEnter: (e) => {
588
- e.currentTarget.style.borderColor = isLight ? "#a1a1aa" : "#71717a";
589
- e.currentTarget.style.color = isLight ? "#52525b" : "#d4d4d8";
590
- },
591
- onMouseLeave: (e) => {
592
- e.currentTarget.style.borderColor = isLight ? "#d4d4d8" : "#3f3f46";
593
- e.currentTarget.style.color = isLight ? "#71717a" : "#a1a1aa";
511
+ justifyContent: "space-between"
594
512
  },
595
513
  children: [
596
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 18 }, children: "\u{1F4A1}" }),
597
- "Suggest a feature"
514
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: isMobile ? 8 : 12 }, children: [
515
+ project?.icon && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: isMobile ? 20 : 24 }, children: project.icon }),
516
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
517
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { style: { fontWeight: 600, fontSize: isMobile ? 16 : 18, color: isLight ? "#18181b" : "#fff", margin: 0 }, children: project?.name || "What's New" }),
518
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { style: { fontSize: 12, color: isLight ? "#71717a" : "#a1a1aa", margin: 0 }, children: [
519
+ "v",
520
+ currentVersion
521
+ ] })
522
+ ] })
523
+ ] }),
524
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
525
+ "button",
526
+ {
527
+ onClick: () => setIsOpen(false),
528
+ style: {
529
+ width: 36,
530
+ height: 36,
531
+ display: "flex",
532
+ alignItems: "center",
533
+ justifyContent: "center",
534
+ borderRadius: 8,
535
+ background: isLight ? "#f5f5f5" : "#1f1f1f",
536
+ border: "none",
537
+ cursor: "pointer",
538
+ color: isLight ? "#71717a" : "#a1a1aa",
539
+ transition: "background 150ms"
540
+ },
541
+ onMouseEnter: (e) => e.currentTarget.style.background = isLight ? "#e5e5e5" : "#2a2a2a",
542
+ onMouseLeave: (e) => e.currentTarget.style.background = isLight ? "#f5f5f5" : "#1f1f1f",
543
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M18 6L6 18M6 6l12 12" }) })
544
+ }
545
+ )
598
546
  ]
599
547
  }
600
- ) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
548
+ ),
549
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
601
550
  "div",
602
551
  {
603
552
  style: {
604
- padding: 16,
605
- marginBottom: 20,
606
- borderRadius: 8,
607
- background: isLight ? "#f5f5f5" : "#151515",
608
- border: `1px solid ${isLight ? "#e5e5e5" : "#1f1f1f"}`
553
+ flexShrink: 0,
554
+ display: "flex",
555
+ justifyContent: "center",
556
+ gap: 2,
557
+ padding: isMobile ? "8px 12px" : "10px 20px",
558
+ borderBottom: `1px solid ${isLight ? "#e5e5e5" : "#1f1f1f"}`,
559
+ overflowX: "auto"
609
560
  },
610
- children: [
611
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: 12 }, children: [
612
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontWeight: 600, color: isLight ? "#18181b" : "#fff" }, children: "Suggest a Feature" }),
613
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
614
- "button",
615
- {
616
- onClick: () => {
617
- setShowIdeaForm(false);
618
- setIdeaSubmitMessage(null);
619
- },
620
- style: {
621
- background: "transparent",
622
- border: "none",
623
- color: isLight ? "#71717a" : "#a1a1aa",
624
- cursor: "pointer",
625
- fontSize: 18
626
- },
627
- children: "\xD7"
561
+ children: ["changelog", "roadmap", "ideas"].map((tab) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
562
+ "button",
563
+ {
564
+ onClick: () => setActiveTab(tab),
565
+ style: {
566
+ padding: isMobile ? "8px 16px" : "8px 20px",
567
+ borderRadius: 999,
568
+ border: "none",
569
+ cursor: "pointer",
570
+ fontSize: isMobile ? 13 : 14,
571
+ fontWeight: 500,
572
+ whiteSpace: "nowrap",
573
+ background: activeTab === tab ? isLight ? "#18181b" : "#fff" : "transparent",
574
+ color: activeTab === tab ? isLight ? "#fff" : "#18181b" : isLight ? "#71717a" : "#71717a",
575
+ transition: "all 150ms"
576
+ },
577
+ onMouseEnter: (e) => {
578
+ if (activeTab !== tab) {
579
+ e.currentTarget.style.background = isLight ? "#f4f4f5" : "#1f1f1f";
628
580
  }
629
- )
630
- ] }),
631
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
632
- "input",
581
+ },
582
+ onMouseLeave: (e) => {
583
+ if (activeTab !== tab) {
584
+ e.currentTarget.style.background = "transparent";
585
+ }
586
+ },
587
+ children: [
588
+ tab === "changelog" && "\u{1F680} Changelog",
589
+ tab === "roadmap" && "\u{1F5FA}\uFE0F Roadmap",
590
+ tab === "ideas" && "\u{1F4A1} Ideas"
591
+ ]
592
+ },
593
+ tab
594
+ ))
595
+ }
596
+ ),
597
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { flex: 1, overflow: activeTab === "roadmap" ? "hidden" : "auto", padding: isMobile ? "16px" : "20px 24px", minHeight: 0, display: "flex", flexDirection: "column", alignItems: "center" }, children: [
598
+ activeTab === "changelog" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { maxWidth: 640, width: "100%", overflowY: "auto", flex: 1 }, children: versionsArray.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { textAlign: "center", padding: 60, color: isLight ? "#71717a" : "#a1a1aa" }, children: [
599
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 48, marginBottom: 12 }, children: "\u{1F680}" }),
600
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 16 }, children: "No releases yet" })
601
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
602
+ versionsArray.slice(0, 10).map((version, idx) => {
603
+ const isLatest = idx === 0;
604
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: {
605
+ marginBottom: 24,
606
+ paddingBottom: 24,
607
+ paddingLeft: isLatest ? 16 : 0,
608
+ borderLeft: isLatest ? `3px solid #22c55e` : "none",
609
+ borderBottom: idx < versionsArray.length - 1 && idx < 9 ? `1px solid ${isLight ? "#f0f0f0" : "#1f1f1f"}` : "none"
610
+ }, children: [
611
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 6, flexWrap: "wrap" }, children: [
612
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: isLatest ? 22 : 20 }, children: version.emoji || "\u{1F4E6}" }),
613
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontWeight: 600, fontSize: isLatest ? 20 : 18, color: isLight ? "#18181b" : "#fff" }, children: version.title }),
614
+ isLatest && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: {
615
+ padding: "2px 8px",
616
+ fontSize: 10,
617
+ fontWeight: 600,
618
+ borderRadius: 999,
619
+ background: isLight ? "#dcfce7" : "rgba(34,197,94,0.15)",
620
+ color: "#22c55e",
621
+ textTransform: "uppercase",
622
+ letterSpacing: "0.5px"
623
+ }, children: "Latest" }),
624
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
625
+ "span",
626
+ {
627
+ style: {
628
+ padding: "3px 10px",
629
+ fontSize: 11,
630
+ fontWeight: 500,
631
+ borderRadius: 999,
632
+ background: version.type === "major" ? isLight ? "#f3e8ff" : "rgba(147,51,234,0.15)" : version.type === "minor" ? isLight ? "#dbeafe" : "rgba(59,130,246,0.15)" : isLight ? "#f4f4f5" : "#1f1f1f",
633
+ color: version.type === "major" ? "#7c3aed" : version.type === "minor" ? "#2563eb" : isLight ? "#52525b" : "#a1a1aa"
634
+ },
635
+ children: version.type
636
+ }
637
+ )
638
+ ] }),
639
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { fontSize: 13, color: isLight ? "#71717a" : "#71717a", marginBottom: 10 }, children: [
640
+ "v",
641
+ version.version,
642
+ " \xB7 ",
643
+ new Date(version.date).toLocaleDateString()
644
+ ] }),
645
+ version.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: { fontSize: 15, color: isLight ? "#52525b" : "#a1a1aa", margin: "0 0 12px 0", lineHeight: 1.6 }, children: version.description }),
646
+ version.features && version.features.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { style: { margin: 0, paddingLeft: 0, listStyle: "none" }, children: version.features.map((feature, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { style: { display: "flex", alignItems: "flex-start", gap: 10, fontSize: 14, color: isLight ? "#52525b" : "#a1a1aa", marginBottom: 6, lineHeight: 1.5 }, children: [
647
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { color: "#22c55e", fontSize: 14, marginTop: 2 }, children: "\u2713" }),
648
+ feature
649
+ ] }, i)) }),
650
+ version.tasks && version.tasks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { marginTop: 10, paddingTop: 10, borderTop: `1px solid ${isLight ? "#f0f0f0" : "#1f1f1f"}` }, children: version.tasks.map((task, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, fontSize: 13, color: isLight ? "#71717a" : "#a1a1aa", marginBottom: 4 }, children: [
651
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: {
652
+ width: 6,
653
+ height: 6,
654
+ borderRadius: "50%",
655
+ background: TYPE_COLORS[task.type] || "#71717a",
656
+ flexShrink: 0
657
+ } }),
658
+ task.title
659
+ ] }, i)) })
660
+ ] }, idx);
661
+ }),
662
+ versionsArray.length > 10 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
663
+ "a",
664
+ {
665
+ href: `${baseUrl}/${projectId}/changelog`,
666
+ target: "_blank",
667
+ rel: "noopener noreferrer",
668
+ style: {
669
+ display: "block",
670
+ textAlign: "center",
671
+ padding: 12,
672
+ fontSize: 14,
673
+ color: "#22c55e",
674
+ textDecoration: "none"
675
+ },
676
+ children: "View all releases \u2192"
677
+ }
678
+ )
679
+ ] }) }),
680
+ activeTab === "roadmap" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { display: "flex", flexDirection: "column", flex: 1, minHeight: 0, width: "100%" }, children: roadmapItems.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { textAlign: "center", padding: 60, color: isLight ? "#71717a" : "#a1a1aa" }, children: [
681
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 48, marginBottom: 12 }, children: "\u{1F5FA}\uFE0F" }),
682
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 16 }, children: "No public roadmap items" })
683
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
684
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", gap: 4, marginBottom: 12, flexShrink: 0 }, children: [
685
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
686
+ "button",
633
687
  {
634
- type: "text",
635
- value: ideaTitle,
636
- onChange: (e) => setIdeaTitle(e.target.value),
637
- placeholder: "Feature title *",
688
+ onClick: () => setRoadmapView("board"),
638
689
  style: {
639
- width: "100%",
640
- padding: "10px 12px",
641
- marginBottom: 8,
690
+ padding: "6px 10px",
642
691
  borderRadius: 6,
643
- border: `1px solid ${isLight ? "#e5e5e5" : "#2a2a2a"}`,
644
- background: isLight ? "#fff" : "#0a0a0a",
645
- color: isLight ? "#18181b" : "#fff",
646
- fontSize: 14,
647
- outline: "none",
648
- boxSizing: "border-box"
649
- }
692
+ border: `1px solid ${roadmapView === "board" ? isLight ? "#18181b" : "#fff" : isLight ? "#e5e5e5" : "#2a2a2a"}`,
693
+ background: roadmapView === "board" ? isLight ? "#18181b" : "#fff" : "transparent",
694
+ color: roadmapView === "board" ? isLight ? "#fff" : "#18181b" : isLight ? "#71717a" : "#a1a1aa",
695
+ cursor: "pointer",
696
+ fontSize: 12,
697
+ fontWeight: 500,
698
+ display: "flex",
699
+ alignItems: "center",
700
+ gap: 4
701
+ },
702
+ children: [
703
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [
704
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "3", y: "3", width: "7", height: "7" }),
705
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "14", y: "3", width: "7", height: "7" }),
706
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "3", y: "14", width: "7", height: "7" }),
707
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "14", y: "14", width: "7", height: "7" })
708
+ ] }),
709
+ "Board"
710
+ ]
650
711
  }
651
712
  ),
652
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
653
- "textarea",
713
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
714
+ "button",
654
715
  {
655
- value: ideaDescription,
656
- onChange: (e) => setIdeaDescription(e.target.value),
657
- placeholder: "Describe your idea...",
658
- rows: 3,
716
+ onClick: () => setRoadmapView("list"),
659
717
  style: {
660
- width: "100%",
661
- padding: "10px 12px",
662
- marginBottom: 8,
718
+ padding: "6px 10px",
663
719
  borderRadius: 6,
664
- border: `1px solid ${isLight ? "#e5e5e5" : "#2a2a2a"}`,
665
- background: isLight ? "#fff" : "#0a0a0a",
666
- color: isLight ? "#18181b" : "#fff",
667
- fontSize: 14,
668
- outline: "none",
669
- resize: "none",
670
- boxSizing: "border-box"
671
- }
720
+ border: `1px solid ${roadmapView === "list" ? isLight ? "#18181b" : "#fff" : isLight ? "#e5e5e5" : "#2a2a2a"}`,
721
+ background: roadmapView === "list" ? isLight ? "#18181b" : "#fff" : "transparent",
722
+ color: roadmapView === "list" ? isLight ? "#fff" : "#18181b" : isLight ? "#71717a" : "#a1a1aa",
723
+ cursor: "pointer",
724
+ fontSize: 12,
725
+ fontWeight: 500,
726
+ display: "flex",
727
+ alignItems: "center",
728
+ gap: 4
729
+ },
730
+ children: [
731
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [
732
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "8", y1: "6", x2: "21", y2: "6" }),
733
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "8", y1: "12", x2: "21", y2: "12" }),
734
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "8", y1: "18", x2: "21", y2: "18" }),
735
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "3", y1: "6", x2: "3.01", y2: "6" }),
736
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "3", y1: "12", x2: "3.01", y2: "12" }),
737
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "3", y1: "18", x2: "3.01", y2: "18" })
738
+ ] }),
739
+ "List"
740
+ ]
672
741
  }
673
- ),
674
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: 8, marginBottom: 12 }, children: [
675
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
676
- "input",
742
+ )
743
+ ] }),
744
+ roadmapView === "board" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: {
745
+ display: "flex",
746
+ gap: 12,
747
+ flex: 1,
748
+ minHeight: 0,
749
+ overflow: "hidden",
750
+ flexDirection: isMobile ? "column" : "row",
751
+ overflowY: isMobile ? "auto" : "hidden"
752
+ }, children: roadmapColumns.map((col) => {
753
+ const colItems = roadmapItems.filter((item) => item.columnId === col.id);
754
+ const isCollapsed = isMobile && collapsedColumns.has(col.id);
755
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: {
756
+ flex: isMobile ? "none" : 1,
757
+ minWidth: 0,
758
+ display: "flex",
759
+ flexDirection: "column",
760
+ minHeight: isMobile ? "auto" : 0
761
+ }, children: [
762
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
763
+ "button",
677
764
  {
678
- type: "text",
679
- value: ideaAuthorName,
680
- onChange: (e) => setIdeaAuthorName(e.target.value),
681
- placeholder: "Name (optional)",
765
+ onClick: () => isMobile && setCollapsedColumns((prev) => {
766
+ const s = new Set(prev);
767
+ s.has(col.id) ? s.delete(col.id) : s.add(col.id);
768
+ return s;
769
+ }),
682
770
  style: {
771
+ display: "flex",
772
+ alignItems: "center",
773
+ gap: 6,
774
+ fontSize: 12,
775
+ fontWeight: 600,
776
+ color: isLight ? "#a1a1aa" : "#71717a",
777
+ marginBottom: 8,
778
+ textTransform: "uppercase",
779
+ letterSpacing: "0.5px",
780
+ flexShrink: 0,
781
+ background: "none",
782
+ border: "none",
783
+ cursor: isMobile ? "pointer" : "default",
784
+ padding: 0,
683
785
  width: "100%",
684
- padding: "8px 12px",
685
- borderRadius: 6,
686
- border: `1px solid ${isLight ? "#e5e5e5" : "#2a2a2a"}`,
687
- background: isLight ? "#fff" : "#0a0a0a",
688
- color: isLight ? "#18181b" : "#fff",
689
- fontSize: 13,
690
- outline: "none",
691
- boxSizing: "border-box"
692
- }
786
+ textAlign: "left"
787
+ },
788
+ children: [
789
+ isMobile && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", style: { transform: isCollapsed ? "rotate(-90deg)" : "rotate(0)", transition: "transform 150ms" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M6 9l6 6 6-6" }) }),
790
+ col.name,
791
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: {
792
+ padding: "1px 6px",
793
+ fontSize: 11,
794
+ fontWeight: 500,
795
+ borderRadius: 999,
796
+ background: isLight ? "#f4f4f5" : "#1f1f1f",
797
+ color: isLight ? "#71717a" : "#a1a1aa"
798
+ }, children: colItems.length })
799
+ ]
693
800
  }
694
801
  ),
695
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
696
- "input",
802
+ !isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: {
803
+ display: "flex",
804
+ flexDirection: "column",
805
+ gap: 8,
806
+ flex: isMobile ? "none" : 1,
807
+ overflowY: isMobile ? "visible" : "auto",
808
+ minHeight: 0,
809
+ paddingRight: isMobile ? 0 : 2,
810
+ paddingBottom: isMobile ? 12 : 0
811
+ }, children: [
812
+ colItems.map((item) => {
813
+ const priorityColor = PRIORITY_COLORS[item.priority || ""] || "transparent";
814
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
815
+ "div",
816
+ {
817
+ style: {
818
+ padding: "12px 14px",
819
+ borderRadius: 8,
820
+ background: isLight ? "#f9fafb" : "#151515",
821
+ border: `1px solid ${isLight ? "#e5e5e5" : "#1f1f1f"}`,
822
+ borderLeft: `3px solid ${priorityColor}`,
823
+ transition: "border-color 150ms"
824
+ },
825
+ onMouseEnter: (e) => e.currentTarget.style.borderColor = isLight ? "#d4d4d8" : "#3f3f46",
826
+ onMouseLeave: (e) => e.currentTarget.style.borderColor = isLight ? "#e5e5e5" : "#1f1f1f",
827
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", gap: 8 }, children: [
828
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
829
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 6, marginBottom: 4 }, children: [
830
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 13 }, children: TYPE_EMOJIS[item.type || ""] || "\u{1F4CB}" }),
831
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 13, fontWeight: 500, color: isLight ? "#18181b" : "#fff" }, children: item.title })
832
+ ] }),
833
+ item.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: {
834
+ fontSize: 12,
835
+ color: isLight ? "#71717a" : "#a1a1aa",
836
+ margin: "0 0 0 0",
837
+ lineHeight: 1.4,
838
+ overflow: "hidden",
839
+ display: "-webkit-box",
840
+ WebkitLineClamp: 2,
841
+ WebkitBoxOrient: "vertical"
842
+ }, children: item.description })
843
+ ] }),
844
+ item.itemType === "idea" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: {
845
+ fontSize: 11,
846
+ fontWeight: 600,
847
+ color: isLight ? "#ea580c" : "#fb923c",
848
+ background: isLight ? "rgba(249,115,22,0.1)" : "rgba(249,115,22,0.15)",
849
+ padding: "2px 6px",
850
+ borderRadius: 4,
851
+ flexShrink: 0
852
+ }, children: [
853
+ item.votes ?? 0,
854
+ "\u2191"
855
+ ] })
856
+ ] })
857
+ },
858
+ item.id
859
+ );
860
+ }),
861
+ colItems.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: {
862
+ padding: 20,
863
+ textAlign: "center",
864
+ fontSize: 13,
865
+ color: isLight ? "#a1a1aa" : "#525252",
866
+ borderRadius: 8,
867
+ border: `1px dashed ${isLight ? "#e5e5e5" : "#1f1f1f"}`
868
+ }, children: "No items" })
869
+ ] })
870
+ ] }, col.id);
871
+ }) }),
872
+ roadmapView === "list" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { flex: 1, overflowY: "auto", minHeight: 0 }, children: roadmapColumns.map((col) => {
873
+ const colItems = roadmapItems.filter((item) => item.columnId === col.id);
874
+ if (colItems.length === 0) return null;
875
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { marginBottom: 20 }, children: [
876
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("h3", { style: {
877
+ fontSize: 12,
878
+ fontWeight: 600,
879
+ color: isLight ? "#a1a1aa" : "#71717a",
880
+ marginBottom: 8,
881
+ textTransform: "uppercase",
882
+ letterSpacing: "0.5px",
883
+ display: "flex",
884
+ alignItems: "center",
885
+ gap: 6
886
+ }, children: [
887
+ col.name,
888
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: {
889
+ padding: "1px 6px",
890
+ fontSize: 11,
891
+ fontWeight: 500,
892
+ borderRadius: 999,
893
+ background: isLight ? "#f4f4f5" : "#1f1f1f",
894
+ color: isLight ? "#71717a" : "#a1a1aa"
895
+ }, children: colItems.length })
896
+ ] }),
897
+ colItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
898
+ "div",
697
899
  {
698
- type: "email",
699
- value: ideaAuthorEmail,
700
- onChange: (e) => setIdeaAuthorEmail(e.target.value),
701
- placeholder: "Email (optional)",
702
900
  style: {
703
- width: "100%",
704
- padding: "8px 12px",
901
+ display: "flex",
902
+ alignItems: "center",
903
+ gap: 10,
904
+ padding: "10px 12px",
705
905
  borderRadius: 6,
706
- border: `1px solid ${isLight ? "#e5e5e5" : "#2a2a2a"}`,
707
- background: isLight ? "#fff" : "#0a0a0a",
708
- color: isLight ? "#18181b" : "#fff",
709
- fontSize: 13,
710
- outline: "none",
711
- boxSizing: "border-box"
906
+ marginBottom: 4,
907
+ background: isLight ? "#f9fafb" : "#151515",
908
+ border: `1px solid ${isLight ? "#f0f0f0" : "#1a1a1a"}`
909
+ },
910
+ children: [
911
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 13, flexShrink: 0 }, children: TYPE_EMOJIS[item.type || ""] || "\u{1F4CB}" }),
912
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 13, fontWeight: 500, color: isLight ? "#18181b" : "#fff", flex: 1, minWidth: 0 }, children: item.title }),
913
+ item.priority && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: {
914
+ padding: "2px 8px",
915
+ fontSize: 10,
916
+ fontWeight: 500,
917
+ borderRadius: 999,
918
+ background: isLight ? "#f4f4f5" : "#1f1f1f",
919
+ color: PRIORITY_COLORS[item.priority] || (isLight ? "#71717a" : "#a1a1aa"),
920
+ flexShrink: 0
921
+ }, children: item.priority })
922
+ ]
923
+ },
924
+ item.id
925
+ ))
926
+ ] }, col.id);
927
+ }) })
928
+ ] }) }),
929
+ activeTab === "ideas" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { maxWidth: 640, width: "100%", overflowY: "auto", flex: 1 }, children: [
930
+ !showIdeaForm ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
931
+ "button",
932
+ {
933
+ onClick: () => setShowIdeaForm(true),
934
+ style: {
935
+ display: "flex",
936
+ alignItems: "center",
937
+ justifyContent: "center",
938
+ gap: 8,
939
+ width: "100%",
940
+ padding: "12px 16px",
941
+ marginBottom: 20,
942
+ borderRadius: 999,
943
+ border: `1px dashed ${isLight ? "#d4d4d8" : "#3f3f46"}`,
944
+ background: "transparent",
945
+ color: isLight ? "#71717a" : "#a1a1aa",
946
+ fontSize: 14,
947
+ fontWeight: 500,
948
+ cursor: "pointer",
949
+ transition: "all 150ms"
950
+ },
951
+ onMouseEnter: (e) => {
952
+ e.currentTarget.style.borderColor = isLight ? "#a1a1aa" : "#71717a";
953
+ e.currentTarget.style.color = isLight ? "#52525b" : "#d4d4d8";
954
+ },
955
+ onMouseLeave: (e) => {
956
+ e.currentTarget.style.borderColor = isLight ? "#d4d4d8" : "#3f3f46";
957
+ e.currentTarget.style.color = isLight ? "#71717a" : "#a1a1aa";
958
+ },
959
+ children: [
960
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 18 }, children: "\u{1F4A1}" }),
961
+ "Suggest a feature"
962
+ ]
963
+ }
964
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
965
+ "div",
966
+ {
967
+ style: {
968
+ padding: 16,
969
+ marginBottom: 20,
970
+ borderRadius: 12,
971
+ background: isLight ? "#f5f5f5" : "#151515",
972
+ border: `1px solid ${isLight ? "#e5e5e5" : "#1f1f1f"}`
973
+ },
974
+ children: [
975
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: 12 }, children: [
976
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontWeight: 600, color: isLight ? "#18181b" : "#fff" }, children: "Suggest a Feature" }),
977
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
978
+ "button",
979
+ {
980
+ onClick: () => {
981
+ setShowIdeaForm(false);
982
+ setIdeaSubmitMessage(null);
983
+ },
984
+ style: {
985
+ background: "transparent",
986
+ border: "none",
987
+ color: isLight ? "#71717a" : "#a1a1aa",
988
+ cursor: "pointer",
989
+ fontSize: 18
990
+ },
991
+ children: "\xD7"
992
+ }
993
+ )
994
+ ] }),
995
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
996
+ "input",
997
+ {
998
+ type: "text",
999
+ value: ideaTitle,
1000
+ onChange: (e) => setIdeaTitle(e.target.value),
1001
+ placeholder: "Feature title *",
1002
+ style: {
1003
+ width: "100%",
1004
+ padding: "10px 12px",
1005
+ marginBottom: 8,
1006
+ borderRadius: 6,
1007
+ border: `1px solid ${isLight ? "#e5e5e5" : "#2a2a2a"}`,
1008
+ background: isLight ? "#fff" : "#0a0a0a",
1009
+ color: isLight ? "#18181b" : "#fff",
1010
+ fontSize: 14,
1011
+ outline: "none",
1012
+ boxSizing: "border-box"
1013
+ }
712
1014
  }
713
- }
714
- )
715
- ] }),
716
- ideaSubmitMessage && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: {
717
- padding: "8px 12px",
718
- marginBottom: 12,
719
- borderRadius: 6,
720
- background: ideaSubmitMessage.type === "success" ? isLight ? "#dcfce7" : "#14532d" : isLight ? "#fee2e2" : "#450a0a",
721
- color: ideaSubmitMessage.type === "success" ? isLight ? "#166534" : "#86efac" : isLight ? "#dc2626" : "#fca5a5",
722
- fontSize: 13
723
- }, children: ideaSubmitMessage.text }),
1015
+ ),
1016
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1017
+ "textarea",
1018
+ {
1019
+ value: ideaDescription,
1020
+ onChange: (e) => setIdeaDescription(e.target.value),
1021
+ placeholder: "Describe your idea...",
1022
+ rows: 3,
1023
+ style: {
1024
+ width: "100%",
1025
+ padding: "10px 12px",
1026
+ marginBottom: 8,
1027
+ borderRadius: 6,
1028
+ border: `1px solid ${isLight ? "#e5e5e5" : "#2a2a2a"}`,
1029
+ background: isLight ? "#fff" : "#0a0a0a",
1030
+ color: isLight ? "#18181b" : "#fff",
1031
+ fontSize: 14,
1032
+ outline: "none",
1033
+ resize: "none",
1034
+ boxSizing: "border-box"
1035
+ }
1036
+ }
1037
+ ),
1038
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "grid", gridTemplateColumns: isMobile ? "1fr" : "1fr 1fr", gap: 8, marginBottom: 12 }, children: [
1039
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1040
+ "input",
1041
+ {
1042
+ type: "text",
1043
+ value: ideaAuthorName,
1044
+ onChange: (e) => setIdeaAuthorName(e.target.value),
1045
+ placeholder: "Name (optional)",
1046
+ style: {
1047
+ width: "100%",
1048
+ padding: "8px 12px",
1049
+ borderRadius: 6,
1050
+ border: `1px solid ${isLight ? "#e5e5e5" : "#2a2a2a"}`,
1051
+ background: isLight ? "#fff" : "#0a0a0a",
1052
+ color: isLight ? "#18181b" : "#fff",
1053
+ fontSize: 13,
1054
+ outline: "none",
1055
+ boxSizing: "border-box"
1056
+ }
1057
+ }
1058
+ ),
1059
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1060
+ "input",
1061
+ {
1062
+ type: "email",
1063
+ value: ideaAuthorEmail,
1064
+ onChange: (e) => setIdeaAuthorEmail(e.target.value),
1065
+ placeholder: "Email *",
1066
+ style: {
1067
+ width: "100%",
1068
+ padding: "8px 12px",
1069
+ borderRadius: 6,
1070
+ border: `1px solid ${isLight ? "#e5e5e5" : "#2a2a2a"}`,
1071
+ background: isLight ? "#fff" : "#0a0a0a",
1072
+ color: isLight ? "#18181b" : "#fff",
1073
+ fontSize: 13,
1074
+ outline: "none",
1075
+ boxSizing: "border-box"
1076
+ }
1077
+ }
1078
+ )
1079
+ ] }),
1080
+ ideaSubmitMessage && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: {
1081
+ padding: "8px 12px",
1082
+ marginBottom: 12,
1083
+ borderRadius: 6,
1084
+ background: ideaSubmitMessage.type === "success" ? isLight ? "#dcfce7" : "#14532d" : isLight ? "#fee2e2" : "#450a0a",
1085
+ color: ideaSubmitMessage.type === "success" ? isLight ? "#166534" : "#86efac" : isLight ? "#dc2626" : "#fca5a5",
1086
+ fontSize: 13
1087
+ }, children: ideaSubmitMessage.text }),
1088
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1089
+ "button",
1090
+ {
1091
+ onClick: submitIdea,
1092
+ disabled: submittingIdea || !ideaTitle.trim() || !ideaAuthorEmail.trim(),
1093
+ style: {
1094
+ width: "100%",
1095
+ padding: "10px 16px",
1096
+ borderRadius: 999,
1097
+ border: "none",
1098
+ background: "#22c55e",
1099
+ color: "#fff",
1100
+ fontSize: 14,
1101
+ fontWeight: 500,
1102
+ cursor: submittingIdea || !ideaTitle.trim() || !ideaAuthorEmail.trim() ? "not-allowed" : "pointer",
1103
+ opacity: submittingIdea || !ideaTitle.trim() || !ideaAuthorEmail.trim() ? 0.6 : 1,
1104
+ transition: "opacity 150ms"
1105
+ },
1106
+ children: submittingIdea ? "Submitting..." : "Submit Idea"
1107
+ }
1108
+ )
1109
+ ]
1110
+ }
1111
+ ),
1112
+ ideasArray.length === 0 && !showIdeaForm ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { textAlign: "center", padding: 60, color: isLight ? "#71717a" : "#a1a1aa" }, children: [
1113
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { width: "48", height: "48", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", style: { marginBottom: 12, opacity: 0.5 }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z" }) }),
1114
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 16, fontWeight: 500, marginBottom: 8 }, children: "No feature requests yet" }),
724
1115
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
725
1116
  "button",
726
1117
  {
727
- onClick: submitIdea,
728
- disabled: submittingIdea || !ideaTitle.trim(),
1118
+ onClick: () => setShowIdeaForm(true),
729
1119
  style: {
730
- width: "100%",
731
- padding: "10px 16px",
732
- borderRadius: 6,
1120
+ padding: "8px 20px",
1121
+ borderRadius: 999,
733
1122
  border: "none",
734
1123
  background: "#22c55e",
735
1124
  color: "#fff",
736
1125
  fontSize: 14,
737
1126
  fontWeight: 500,
738
- cursor: submittingIdea || !ideaTitle.trim() ? "not-allowed" : "pointer",
739
- opacity: submittingIdea || !ideaTitle.trim() ? 0.6 : 1,
740
- transition: "opacity 150ms"
1127
+ cursor: "pointer"
741
1128
  },
742
- children: submittingIdea ? "Submitting..." : "Submit Idea"
1129
+ children: "Suggest a feature"
743
1130
  }
744
1131
  )
745
- ]
746
- }
747
- ),
748
- ideasArray.length === 0 && !showIdeaForm ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { textAlign: "center", padding: 60, color: isLight ? "#71717a" : "#a1a1aa" }, children: [
749
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 48, marginBottom: 12 }, children: "\u{1F4A1}" }),
750
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 16 }, children: "No feature requests yet" }),
751
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 14, marginTop: 8 }, children: "Be the first to suggest one!" })
752
- ] }) : ideasArray.map((idea) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
1132
+ ] }) : (() => {
1133
+ const statusOrder = ["under review", "planned", "in progress", "new", "shipped"];
1134
+ const grouped = {};
1135
+ ideasArray.forEach((idea) => {
1136
+ const status = (idea.status || "new").toLowerCase();
1137
+ if (!grouped[status]) grouped[status] = [];
1138
+ grouped[status].push(idea);
1139
+ });
1140
+ return statusOrder.map((status) => {
1141
+ const items = grouped[status];
1142
+ if (!items || items.length === 0) return null;
1143
+ const cfg = STATUS_CONFIG[status] || { color: "#71717a", label: status };
1144
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { marginBottom: 20 }, children: [
1145
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 10 }, children: [
1146
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: {
1147
+ width: 8,
1148
+ height: 8,
1149
+ borderRadius: "50%",
1150
+ background: cfg.color,
1151
+ flexShrink: 0
1152
+ } }),
1153
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: isLight ? "#52525b" : "#a1a1aa", textTransform: "uppercase", letterSpacing: "0.5px" }, children: cfg.label }),
1154
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: {
1155
+ padding: "1px 6px",
1156
+ fontSize: 11,
1157
+ fontWeight: 500,
1158
+ borderRadius: 999,
1159
+ background: isLight ? "#f4f4f5" : "#1f1f1f",
1160
+ color: isLight ? "#71717a" : "#a1a1aa"
1161
+ }, children: items.length })
1162
+ ] }),
1163
+ items.map((idea) => {
1164
+ const hasVoted = votedIdeas.has(idea.id) || idea.hasVoted;
1165
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
1166
+ "div",
1167
+ {
1168
+ style: {
1169
+ padding: isMobile ? 12 : 16,
1170
+ marginBottom: 8,
1171
+ borderRadius: 10,
1172
+ background: isLight ? "#f9fafb" : "#151515",
1173
+ border: `1px solid ${isLight ? "#e5e5e5" : "#1f1f1f"}`,
1174
+ display: "flex",
1175
+ alignItems: "flex-start",
1176
+ gap: isMobile ? 10 : 16
1177
+ },
1178
+ children: [
1179
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
1180
+ "button",
1181
+ {
1182
+ onClick: () => voteIdea(idea.id),
1183
+ disabled: hasVoted,
1184
+ style: {
1185
+ display: "flex",
1186
+ flexDirection: "column",
1187
+ alignItems: "center",
1188
+ padding: "8px 12px",
1189
+ borderRadius: 8,
1190
+ background: hasVoted ? isLight ? "#dcfce7" : "rgba(34,197,94,0.15)" : isLight ? "#fff" : "#0a0a0a",
1191
+ border: `1px solid ${hasVoted ? "#22c55e" : isLight ? "#e5e5e5" : "#2a2a2a"}`,
1192
+ minWidth: 48,
1193
+ cursor: hasVoted ? "default" : "pointer",
1194
+ transition: "all 150ms"
1195
+ },
1196
+ onMouseEnter: (e) => {
1197
+ if (!hasVoted) {
1198
+ e.currentTarget.style.borderColor = "#22c55e";
1199
+ e.currentTarget.style.background = isLight ? "#f0fdf4" : "rgba(34,197,94,0.1)";
1200
+ }
1201
+ },
1202
+ onMouseLeave: (e) => {
1203
+ if (!hasVoted) {
1204
+ e.currentTarget.style.borderColor = isLight ? "#e5e5e5" : "#2a2a2a";
1205
+ e.currentTarget.style.background = isLight ? "#fff" : "#0a0a0a";
1206
+ }
1207
+ },
1208
+ children: [
1209
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: hasVoted ? "#22c55e" : "none", stroke: hasVoted ? "#22c55e" : isLight ? "#71717a" : "#a1a1aa", strokeWidth: "2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M18 15l-6-6-6 6" }) }),
1210
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 16, fontWeight: 600, color: hasVoted ? "#22c55e" : isLight ? "#18181b" : "#fff" }, children: idea.votes })
1211
+ ]
1212
+ }
1213
+ ),
1214
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
1215
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4, flexWrap: "wrap" }, children: [
1216
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1217
+ "a",
1218
+ {
1219
+ href: `${baseUrl}/${projectId}/feature-requests`,
1220
+ target: "_blank",
1221
+ rel: "noopener noreferrer",
1222
+ style: { fontSize: 15, fontWeight: 500, color: isLight ? "#18181b" : "#fff", textDecoration: "none" },
1223
+ onMouseEnter: (e) => e.currentTarget.style.textDecoration = "underline",
1224
+ onMouseLeave: (e) => e.currentTarget.style.textDecoration = "none",
1225
+ children: idea.title
1226
+ }
1227
+ ),
1228
+ idea.status && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: {
1229
+ padding: "2px 8px",
1230
+ fontSize: 10,
1231
+ fontWeight: 500,
1232
+ borderRadius: 999,
1233
+ background: isLight ? `${cfg.color}15` : `${cfg.color}20`,
1234
+ color: cfg.color,
1235
+ textTransform: "uppercase",
1236
+ letterSpacing: "0.3px"
1237
+ }, children: cfg.label })
1238
+ ] }),
1239
+ idea.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 14, color: isLight ? "#71717a" : "#a1a1aa", lineHeight: 1.5 }, children: idea.description }),
1240
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1241
+ "a",
1242
+ {
1243
+ href: `${baseUrl}/${projectId}/feature-requests`,
1244
+ target: "_blank",
1245
+ rel: "noopener noreferrer",
1246
+ style: { fontSize: 12, color: isLight ? "#71717a" : "#a1a1aa", textDecoration: "none", marginTop: 6, display: "inline-flex", alignItems: "center", gap: 4 },
1247
+ onMouseEnter: (e) => e.currentTarget.style.color = "#22c55e",
1248
+ onMouseLeave: (e) => e.currentTarget.style.color = isLight ? "#71717a" : "#a1a1aa",
1249
+ children: "Join discussion \u2192"
1250
+ }
1251
+ )
1252
+ ] })
1253
+ ]
1254
+ },
1255
+ idea.id
1256
+ );
1257
+ })
1258
+ ] }, status);
1259
+ });
1260
+ })()
1261
+ ] })
1262
+ ] }),
1263
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
753
1264
  "div",
754
1265
  {
755
1266
  style: {
756
- padding: 16,
757
- marginBottom: 12,
758
- borderRadius: 8,
759
- background: isLight ? "#f5f5f5" : "#151515",
760
- border: `1px solid ${isLight ? "#e5e5e5" : "#1f1f1f"}`,
1267
+ flexShrink: 0,
1268
+ padding: "16px 24px",
1269
+ borderTop: `1px solid ${isLight ? "#e5e5e5" : "#1f1f1f"}`,
761
1270
  display: "flex",
762
- alignItems: "flex-start",
763
- gap: 16
1271
+ alignItems: "center",
1272
+ justifyContent: "space-between"
764
1273
  },
765
1274
  children: [
1275
+ showBranding && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1276
+ "a",
1277
+ {
1278
+ href: "https://versionpill.com",
1279
+ target: "_blank",
1280
+ rel: "noopener noreferrer",
1281
+ style: { fontSize: 12, color: isLight ? "#a1a1aa" : "#525252", textDecoration: "none" },
1282
+ children: "Powered by Version Pill"
1283
+ }
1284
+ ),
766
1285
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
767
- "div",
1286
+ "a",
768
1287
  {
1288
+ href: `${baseUrl}/${projectId}/${activeTab === "ideas" ? "feature-requests" : activeTab}`,
1289
+ target: "_blank",
1290
+ rel: "noopener noreferrer",
769
1291
  style: {
770
- display: "flex",
771
- flexDirection: "column",
772
- alignItems: "center",
773
- padding: "8px 12px",
774
- borderRadius: 6,
775
- background: isLight ? "#fff" : "#0a0a0a",
776
- minWidth: 50
1292
+ padding: "10px 20px",
1293
+ fontSize: 14,
1294
+ fontWeight: 500,
1295
+ borderRadius: 8,
1296
+ background: "#22c55e",
1297
+ color: "#fff",
1298
+ textDecoration: "none",
1299
+ transition: "background 150ms"
777
1300
  },
1301
+ onMouseEnter: (e) => e.currentTarget.style.background = "#16a34a",
1302
+ onMouseLeave: (e) => e.currentTarget.style.background = "#22c55e",
778
1303
  children: [
779
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 18, fontWeight: 600, color: isLight ? "#18181b" : "#fff" }, children: idea.votes }),
780
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 11, color: isLight ? "#71717a" : "#71717a" }, children: "votes" })
1304
+ "View Full ",
1305
+ activeTab === "changelog" ? "Changelog" : activeTab === "roadmap" ? "Roadmap" : "Ideas",
1306
+ " \u2192"
781
1307
  ]
782
1308
  }
783
- ),
784
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
785
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 16, fontWeight: 500, color: isLight ? "#18181b" : "#fff", marginBottom: 4 }, children: idea.title }),
786
- idea.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 14, color: isLight ? "#71717a" : "#71717a", lineHeight: 1.5 }, children: idea.description })
787
- ] })
1309
+ )
788
1310
  ]
789
- },
790
- idea.id
791
- ))
792
- ] })
793
- ] }),
794
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
795
- "div",
796
- {
797
- style: {
798
- flexShrink: 0,
799
- padding: "16px 24px",
800
- borderTop: `1px solid ${isLight ? "#e5e5e5" : "#1f1f1f"}`,
801
- display: "flex",
802
- alignItems: "center",
803
- justifyContent: "space-between"
804
- },
805
- children: [
806
- showBranding && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
807
- "a",
808
- {
809
- href: "https://versionpill.com",
810
- target: "_blank",
811
- rel: "noopener noreferrer",
812
- style: { fontSize: 12, color: isLight ? "#a1a1aa" : "#525252", textDecoration: "none" },
813
- children: "Powered by Version Pill"
814
- }
815
- ),
816
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
817
- "a",
818
- {
819
- href: `${baseUrl}/${projectId}/${activeTab === "ideas" ? "feature-requests" : activeTab}`,
820
- target: "_blank",
821
- rel: "noopener noreferrer",
822
- style: {
823
- padding: "10px 20px",
824
- fontSize: 14,
825
- fontWeight: 500,
826
- borderRadius: 8,
827
- background: "#22c55e",
828
- color: "#fff",
829
- textDecoration: "none",
830
- transition: "background 150ms"
831
- },
832
- onMouseEnter: (e) => e.currentTarget.style.background = "#16a34a",
833
- onMouseLeave: (e) => e.currentTarget.style.background = "#22c55e",
834
- children: [
835
- "View Full ",
836
- activeTab === "changelog" ? "Changelog" : activeTab === "roadmap" ? "Roadmap" : "Ideas",
837
- " \u2192"
838
- ]
839
- }
840
- )
841
- ]
842
- }
843
- )
844
- ]
845
- }
846
- ) })
1311
+ }
1312
+ )
1313
+ ]
1314
+ }
1315
+ )
1316
+ ] }),
1317
+ document.body
1318
+ )
847
1319
  ] });
848
1320
  }
849
1321
  function VersionBadge({