@burdenoff/microfe-vibecontrols 2026.602.1 → 2026.602.3
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/components/sessions/SessionShareDialog.js +24 -462
- package/dist/components/sessions/SessionShareDialog.js.map +1 -1
- package/dist/components/sharing/entityShareOps.js +106 -0
- package/dist/components/sharing/entityShareOps.js.map +1 -1
- package/dist/components/sharing/shareRegistry.js +3 -3
- package/dist/components/sharing/shareRegistry.js.map +1 -1
- package/dist/components/vibedeck/VibeDeckShareDialog.js +19 -335
- package/dist/components/vibedeck/VibeDeckShareDialog.js.map +1 -1
- package/dist/components/vibes/DeleteVibeDialog.js +130 -0
- package/dist/components/vibes/DeleteVibeDialog.js.map +1 -0
- package/dist/components/vibes/VibeCard.js +64 -56
- package/dist/components/vibes/VibeCard.js.map +1 -1
- package/dist/components/vibes/VibeList.js +132 -113
- package/dist/components/vibes/VibeList.js.map +1 -1
- package/dist/components/vibes/index.js +1 -0
- package/dist/constants/permissions.js +1 -0
- package/dist/constants/permissions.js.map +1 -1
- package/dist/generated/wspace-operations.js +2 -2
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.js +9 -11
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/pages/SessionsPage.js +1011 -1007
- package/dist/pages/SessionsPage.js.map +1 -1
- package/dist/pages/VibeDeckPage.js +40 -41
- package/dist/pages/VibeDeckPage.js.map +1 -1
- package/dist/pages/VibeDetailsPage.js +560 -523
- package/dist/pages/VibeDetailsPage.js.map +1 -1
- package/dist/pages/VibesPage.js +311 -280
- package/dist/pages/VibesPage.js.map +1 -1
- package/package.json +1 -1
- package/dist/utils/shareUrl.js +0 -41
- package/dist/utils/shareUrl.js.map +0 -1
|
@@ -4,62 +4,62 @@ import { cardHoverVariants as n } from "../shared/cardMotion.js";
|
|
|
4
4
|
import { vibeTypeIcons as r } from "./icons.js";
|
|
5
5
|
import { useState as i } from "react";
|
|
6
6
|
import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
7
|
-
import { Archive as o, ExternalLink as s, FolderOpen as c, GitBranch as l, MoreVertical as u, Play as d, Settings as f, Tag as p } from "lucide-react";
|
|
8
|
-
import { AnimatePresence as
|
|
9
|
-
import { jsx as
|
|
7
|
+
import { Archive as o, ExternalLink as s, FolderOpen as c, GitBranch as l, MoreVertical as u, Play as d, Settings as f, Tag as p, Trash2 as m } from "lucide-react";
|
|
8
|
+
import { AnimatePresence as h, motion as g } from "framer-motion";
|
|
9
|
+
import { jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
10
10
|
//#region src/components/vibes/VibeCard.tsx
|
|
11
|
-
var
|
|
12
|
-
let { t:
|
|
13
|
-
return /* @__PURE__ */
|
|
11
|
+
var y = ({ vibe: y, onOpen: b, onEdit: x, onArchive: S, onDelete: C, onActivate: w, onOpenInEditor: T, className: E = "", selected: D = !1, onToggleSelect: O }) => {
|
|
12
|
+
let { t: k } = a(), [A, j] = i(!1), M = r[y.type] || c;
|
|
13
|
+
return /* @__PURE__ */ v(g.div, {
|
|
14
14
|
initial: "rest",
|
|
15
15
|
animate: "rest",
|
|
16
16
|
whileHover: "hover",
|
|
17
17
|
whileTap: "tap",
|
|
18
18
|
variants: n,
|
|
19
|
-
className: `bg-bg-surface border rounded-lg p-4 hover:border-border-strong transition-colors cursor-pointer ${
|
|
20
|
-
onClick: () =>
|
|
19
|
+
className: `bg-bg-surface border rounded-lg p-4 hover:border-border-strong transition-colors cursor-pointer ${D ? "border-action-primary-bg ring-1 ring-action-primary-bg/25" : "border-border-default"} ${E}`,
|
|
20
|
+
onClick: () => b?.(y),
|
|
21
21
|
children: [
|
|
22
|
-
/* @__PURE__ */
|
|
22
|
+
/* @__PURE__ */ v("div", {
|
|
23
23
|
className: "flex items-start justify-between gap-2",
|
|
24
|
-
children: [/* @__PURE__ */
|
|
24
|
+
children: [/* @__PURE__ */ v("div", {
|
|
25
25
|
className: "flex items-start gap-2 sm:gap-3 min-w-0 flex-1",
|
|
26
26
|
children: [
|
|
27
|
-
|
|
27
|
+
O && /* @__PURE__ */ _("div", {
|
|
28
28
|
onClick: (e) => e.stopPropagation(),
|
|
29
|
-
children: /* @__PURE__ */
|
|
30
|
-
checked:
|
|
31
|
-
onChange:
|
|
32
|
-
ariaLabel: `Select vibe ${
|
|
29
|
+
children: /* @__PURE__ */ _(t, {
|
|
30
|
+
checked: D,
|
|
31
|
+
onChange: O,
|
|
32
|
+
ariaLabel: `Select vibe ${y.name}`,
|
|
33
33
|
className: "mt-2"
|
|
34
34
|
})
|
|
35
35
|
}),
|
|
36
|
-
/* @__PURE__ */
|
|
36
|
+
/* @__PURE__ */ _("div", {
|
|
37
37
|
className: "flex-shrink-0 size-8 sm:w-10 sm:h-10 rounded-lg bg-action-primary-bg/10 flex items-center justify-center",
|
|
38
|
-
children: /* @__PURE__ */
|
|
38
|
+
children: /* @__PURE__ */ _(M, { className: "size-4 sm:w-5 sm:h-5 text-action-primary-bg" })
|
|
39
39
|
}),
|
|
40
|
-
/* @__PURE__ */
|
|
40
|
+
/* @__PURE__ */ v("div", {
|
|
41
41
|
className: "min-w-0 flex-1",
|
|
42
|
-
children: [/* @__PURE__ */
|
|
42
|
+
children: [/* @__PURE__ */ _("h3", {
|
|
43
43
|
className: "font-semibold text-text-primary truncate text-sm sm:text-base",
|
|
44
|
-
children:
|
|
45
|
-
}),
|
|
44
|
+
children: y.name
|
|
45
|
+
}), y.description && /* @__PURE__ */ _("p", {
|
|
46
46
|
className: "text-xs sm:text-sm text-text-secondary truncate",
|
|
47
|
-
children:
|
|
47
|
+
children: y.description
|
|
48
48
|
})]
|
|
49
49
|
})
|
|
50
50
|
]
|
|
51
|
-
}), /* @__PURE__ */
|
|
51
|
+
}), /* @__PURE__ */ v("div", {
|
|
52
52
|
className: "flex items-center gap-1 sm:gap-2 flex-shrink-0",
|
|
53
|
-
children: [/* @__PURE__ */
|
|
53
|
+
children: [/* @__PURE__ */ _(e, { status: y.status }), (x || S || C || w || T) && /* @__PURE__ */ v("div", {
|
|
54
54
|
className: "relative",
|
|
55
|
-
children: [/* @__PURE__ */
|
|
55
|
+
children: [/* @__PURE__ */ _("button", {
|
|
56
56
|
type: "button",
|
|
57
57
|
onClick: (e) => {
|
|
58
|
-
e.stopPropagation(),
|
|
58
|
+
e.stopPropagation(), j(!A);
|
|
59
59
|
},
|
|
60
60
|
className: "p-1 sm:p-1.5 rounded hover:bg-bg-sunken transition-colors",
|
|
61
|
-
children: /* @__PURE__ */
|
|
62
|
-
}), /* @__PURE__ */
|
|
61
|
+
children: /* @__PURE__ */ _(u, { className: "size-4 text-text-secondary" })
|
|
62
|
+
}), /* @__PURE__ */ _(h, { children: A && /* @__PURE__ */ v(g.div, {
|
|
63
63
|
initial: {
|
|
64
64
|
opacity: 0,
|
|
65
65
|
scale: .95,
|
|
@@ -78,79 +78,87 @@ var v = ({ vibe: v, onOpen: y, onEdit: b, onArchive: x, onActivate: S, onOpenInE
|
|
|
78
78
|
transition: { duration: .15 },
|
|
79
79
|
className: "absolute right-0 mt-1 w-40 bg-bg-surface border border-border-default rounded-lg shadow-lg z-10",
|
|
80
80
|
children: [
|
|
81
|
-
|
|
81
|
+
w && y.status !== "ACTIVE" && /* @__PURE__ */ v(g.button, {
|
|
82
82
|
whileTap: { scale: .97 },
|
|
83
83
|
onClick: (e) => {
|
|
84
|
-
e.stopPropagation(),
|
|
84
|
+
e.stopPropagation(), w(y), j(!1);
|
|
85
85
|
},
|
|
86
86
|
className: "flex items-center gap-2 w-full px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken rounded-t-lg",
|
|
87
|
-
children: [/* @__PURE__ */
|
|
87
|
+
children: [/* @__PURE__ */ _(d, { className: "size-4" }), "Activate"]
|
|
88
88
|
}),
|
|
89
|
-
|
|
89
|
+
x && /* @__PURE__ */ v(g.button, {
|
|
90
90
|
whileTap: { scale: .97 },
|
|
91
91
|
onClick: (e) => {
|
|
92
|
-
e.stopPropagation(),
|
|
92
|
+
e.stopPropagation(), x(y), j(!1);
|
|
93
93
|
},
|
|
94
94
|
className: "flex items-center gap-2 w-full px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken",
|
|
95
|
-
children: [/* @__PURE__ */
|
|
95
|
+
children: [/* @__PURE__ */ _(f, { className: "size-4" }), "Edit"]
|
|
96
96
|
}),
|
|
97
|
-
|
|
97
|
+
T && y.path && /* @__PURE__ */ v(g.button, {
|
|
98
98
|
whileTap: { scale: .97 },
|
|
99
99
|
onClick: (e) => {
|
|
100
|
-
e.stopPropagation(),
|
|
100
|
+
e.stopPropagation(), T(y), j(!1);
|
|
101
101
|
},
|
|
102
102
|
className: "flex items-center gap-2 w-full px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken",
|
|
103
|
-
children: [/* @__PURE__ */
|
|
103
|
+
children: [/* @__PURE__ */ _(s, { className: "size-4" }), "Open in VS Code"]
|
|
104
104
|
}),
|
|
105
|
-
|
|
105
|
+
S && y.status !== "ARCHIVED" && /* @__PURE__ */ v(g.button, {
|
|
106
106
|
whileTap: { scale: .97 },
|
|
107
107
|
onClick: (e) => {
|
|
108
|
-
e.stopPropagation(),
|
|
108
|
+
e.stopPropagation(), S(y), j(!1);
|
|
109
109
|
},
|
|
110
110
|
className: "flex items-center gap-2 w-full px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken rounded-b-lg",
|
|
111
|
-
children: [/* @__PURE__ */
|
|
111
|
+
children: [/* @__PURE__ */ _(o, { className: "size-4" }), "Archive"]
|
|
112
|
+
}),
|
|
113
|
+
C && /* @__PURE__ */ v(g.button, {
|
|
114
|
+
whileTap: { scale: .97 },
|
|
115
|
+
onClick: (e) => {
|
|
116
|
+
e.stopPropagation(), C(y), j(!1);
|
|
117
|
+
},
|
|
118
|
+
className: "flex items-center gap-2 w-full px-3 py-2 text-sm text-status-error-text hover:bg-bg-sunken rounded-b-lg",
|
|
119
|
+
children: [/* @__PURE__ */ _(m, { className: "size-4" }), "Delete"]
|
|
112
120
|
})
|
|
113
121
|
]
|
|
114
122
|
}) })]
|
|
115
123
|
})]
|
|
116
124
|
})]
|
|
117
125
|
}),
|
|
118
|
-
|
|
126
|
+
y.description && /* @__PURE__ */ _("p", {
|
|
119
127
|
className: "mt-2 text-sm text-text-secondary line-clamp-2",
|
|
120
|
-
children:
|
|
128
|
+
children: y.description
|
|
121
129
|
}),
|
|
122
|
-
|
|
130
|
+
y.path && /* @__PURE__ */ _("div", {
|
|
123
131
|
className: "mt-3 text-xs text-text-secondary font-mono bg-bg-sunken p-2 rounded truncate",
|
|
124
|
-
children:
|
|
132
|
+
children: y.path
|
|
125
133
|
}),
|
|
126
|
-
|
|
134
|
+
y.gitBranch && /* @__PURE__ */ v("div", {
|
|
127
135
|
className: "mt-2 flex items-center gap-2 text-sm text-text-secondary",
|
|
128
136
|
children: [
|
|
129
|
-
/* @__PURE__ */
|
|
130
|
-
/* @__PURE__ */
|
|
137
|
+
/* @__PURE__ */ _(l, { className: "size-4" }),
|
|
138
|
+
/* @__PURE__ */ _("span", {
|
|
131
139
|
className: "truncate",
|
|
132
|
-
children:
|
|
140
|
+
children: y.gitBranch
|
|
133
141
|
}),
|
|
134
|
-
|
|
142
|
+
y.gitStatus && y.gitStatus !== "clean" && /* @__PURE__ */ _("span", {
|
|
135
143
|
className: "px-1.5 py-0.5 text-xs bg-status-warning-bg text-status-warning-text rounded",
|
|
136
|
-
children:
|
|
144
|
+
children: y.gitStatus
|
|
137
145
|
})
|
|
138
146
|
]
|
|
139
147
|
}),
|
|
140
|
-
|
|
148
|
+
y.tags && y.tags.length > 0 && /* @__PURE__ */ v("div", {
|
|
141
149
|
className: "mt-3 flex flex-wrap gap-1",
|
|
142
|
-
children: [
|
|
150
|
+
children: [y.tags.slice(0, 3).map((e) => /* @__PURE__ */ v("span", {
|
|
143
151
|
className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded",
|
|
144
|
-
children: [/* @__PURE__ */
|
|
145
|
-
}, e)),
|
|
152
|
+
children: [/* @__PURE__ */ _(p, { className: "size-3" }), e]
|
|
153
|
+
}, e)), y.tags.length > 3 && /* @__PURE__ */ v("span", {
|
|
146
154
|
className: "px-2 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded",
|
|
147
|
-
children: ["+",
|
|
155
|
+
children: ["+", y.tags.length - 3]
|
|
148
156
|
})]
|
|
149
157
|
})
|
|
150
158
|
]
|
|
151
159
|
});
|
|
152
160
|
};
|
|
153
161
|
//#endregion
|
|
154
|
-
export {
|
|
162
|
+
export { y as VibeCard };
|
|
155
163
|
|
|
156
164
|
//# sourceMappingURL=VibeCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VibeCard.js","names":[],"sources":["../../../src/components/vibes/VibeCard.tsx"],"sourcesContent":["import { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { FC } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport {\n FolderOpen,\n GitBranch,\n MoreVertical,\n Play,\n Archive,\n Settings,\n Tag,\n ExternalLink,\n} from 'lucide-react';\nimport { useState } from 'react';\nimport type { Vibe } from './types';\nimport { vibeTypeIcons } from './icons';\nimport { StatusBadge } from '../shared/StatusBadge';\nimport { SelectionCheckbox } from '../shared/SelectionCheckbox';\nimport { cardHoverVariants } from '../shared/cardMotion';\n\nexport interface VibeCardProps {\n vibe: Vibe;\n onOpen?: (vibe: Vibe) => void;\n onEdit?: (vibe: Vibe) => void;\n onArchive?: (vibe: Vibe) => void;\n onActivate?: (vibe: Vibe) => void;\n onOpenInEditor?: (vibe: Vibe) => void;\n className?: string;\n selected?: boolean;\n onToggleSelect?: (checked: boolean) => void;\n}\n\n/**\n * VibeCard - Display project/vibe information\n */\nexport const VibeCard: FC<VibeCardProps> = ({\n vibe,\n onOpen,\n onEdit,\n onArchive,\n onActivate,\n onOpenInEditor,\n className = '',\n selected = false,\n onToggleSelect,\n}) => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string) => {\n const v = t(key);\n return v === key ? fallback : v;\n };\n const [showMenu, setShowMenu] = useState(false);\n const Icon = vibeTypeIcons[vibe.type] || FolderOpen;\n\n return (\n <motion.div\n initial=\"rest\"\n animate=\"rest\"\n whileHover=\"hover\"\n whileTap=\"tap\"\n variants={cardHoverVariants}\n className={`bg-bg-surface border rounded-lg p-4 hover:border-border-strong transition-colors cursor-pointer ${\n selected\n ? 'border-action-primary-bg ring-1 ring-action-primary-bg/25'\n : 'border-border-default'\n } ${className}`}\n onClick={() => onOpen?.(vibe)}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-start gap-2 sm:gap-3 min-w-0 flex-1\">\n {onToggleSelect && (\n <div onClick={(event) => event.stopPropagation()}>\n <SelectionCheckbox\n checked={selected}\n onChange={onToggleSelect}\n ariaLabel={`Select vibe ${vibe.name}`}\n className=\"mt-2\"\n />\n </div>\n )}\n <div className=\"flex-shrink-0 size-8 sm:w-10 sm:h-10 rounded-lg bg-action-primary-bg/10 flex items-center justify-center\">\n <Icon className=\"size-4 sm:w-5 sm:h-5 text-action-primary-bg\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold text-text-primary truncate text-sm sm:text-base\">\n {vibe.name}\n </h3>\n {vibe.description && (\n <p className=\"text-xs sm:text-sm text-text-secondary truncate\">{vibe.description}</p>\n )}\n </div>\n </div>\n {/* Status and Actions - always visible */}\n <div className=\"flex items-center gap-1 sm:gap-2 flex-shrink-0\">\n <StatusBadge status={vibe.status} />\n {(onEdit || onArchive || onActivate || onOpenInEditor) && (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setShowMenu(!showMenu);\n }}\n className=\"p-1 sm:p-1.5 rounded hover:bg-bg-sunken transition-colors\"\n >\n <MoreVertical className=\"size-4 text-text-secondary\" />\n </button>\n <AnimatePresence>\n {showMenu && (\n <motion.div\n initial={{ opacity: 0, scale: 0.95, y: -4 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, y: -4 }}\n transition={{ duration: 0.15 }}\n className=\"absolute right-0 mt-1 w-40 bg-bg-surface border border-border-default rounded-lg shadow-lg z-10\"\n >\n {onActivate && vibe.status !== 'ACTIVE' && (\n <motion.button\n whileTap={{ scale: 0.97 }}\n onClick={(e) => {\n e.stopPropagation();\n onActivate(vibe);\n setShowMenu(false);\n }}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken rounded-t-lg\"\n >\n <Play className=\"size-4\" />\n Activate\n </motion.button>\n )}\n {onEdit && (\n <motion.button\n whileTap={{ scale: 0.97 }}\n onClick={(e) => {\n e.stopPropagation();\n onEdit(vibe);\n setShowMenu(false);\n }}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken\"\n >\n <Settings className=\"size-4\" />\n Edit\n </motion.button>\n )}\n {onOpenInEditor && vibe.path && (\n <motion.button\n whileTap={{ scale: 0.97 }}\n onClick={(e) => {\n e.stopPropagation();\n onOpenInEditor(vibe);\n setShowMenu(false);\n }}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken\"\n >\n <ExternalLink className=\"size-4\" />\n Open in VS Code\n </motion.button>\n )}\n {onArchive && vibe.status !== 'ARCHIVED' && (\n <motion.button\n whileTap={{ scale: 0.97 }}\n onClick={(e) => {\n e.stopPropagation();\n onArchive(vibe);\n setShowMenu(false);\n }}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken rounded-b-lg\"\n >\n <Archive className=\"size-4\" />\n Archive\n </motion.button>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n )}\n </div>\n </div>\n\n {vibe.description && (\n <p className=\"mt-2 text-sm text-text-secondary line-clamp-2\">{vibe.description}</p>\n )}\n\n {vibe.path && (\n <div className=\"mt-3 text-xs text-text-secondary font-mono bg-bg-sunken p-2 rounded truncate\">\n {vibe.path}\n </div>\n )}\n\n {vibe.gitBranch && (\n <div className=\"mt-2 flex items-center gap-2 text-sm text-text-secondary\">\n <GitBranch className=\"size-4\" />\n <span className=\"truncate\">{vibe.gitBranch}</span>\n {vibe.gitStatus && vibe.gitStatus !== 'clean' && (\n <span className=\"px-1.5 py-0.5 text-xs bg-status-warning-bg text-status-warning-text rounded\">\n {vibe.gitStatus}\n </span>\n )}\n </div>\n )}\n\n {vibe.tags && vibe.tags.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1\">\n {vibe.tags.slice(0, 3).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded\"\n >\n <Tag className=\"size-3\" />\n {tag}\n </span>\n ))}\n {vibe.tags.length > 3 && (\n <span className=\"px-2 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded\">\n +{vibe.tags.length - 3}\n </span>\n )}\n </div>\n )}\n </motion.div>\n );\n};\n"],"mappings":";;;;;;;;;;AAmCA,IAAa,KAA+B,EAC1C,SACA,WACA,WACA,cACA,eACA,mBACA,eAAY,IACZ,cAAW,IACX,wBACI;CACJ,IAAM,EAAE,SAAM,GAAS,EAKjB,CAAC,GAAU,KAAe,EAAS,GAAM,EACzC,IAAO,EAAc,EAAK,SAAS;AAEzC,QACE,kBAAC,EAAO,KAAR;EACE,SAAQ;EACR,SAAQ;EACR,YAAW;EACX,UAAS;EACT,UAAU;EACV,WAAW,mGACT,IACI,8DACA,wBACL,GAAG;EACJ,eAAe,IAAS,EAAK;YAX/B;GAaE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,KACC,kBAAC,OAAD;OAAK,UAAU,MAAU,EAAM,iBAAiB;iBAC9C,kBAAC,GAAD;QACE,SAAS;QACT,UAAU;QACV,WAAW,eAAe,EAAK;QAC/B,WAAU;QACV,CAAA;OACE,CAAA;MAER,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD,EAAM,WAAU,+CAAgD,CAAA;OAC5D,CAAA;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAK;QACH,CAAA,EACJ,EAAK,eACJ,kBAAC,KAAD;QAAG,WAAU;kBAAmD,EAAK;QAAgB,CAAA,CAEnF;;MACF;QAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAa,QAAQ,EAAK,QAAU,CAAA,GAClC,KAAU,KAAa,KAAc,MACrC,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,UAAD;OACE,MAAK;OACL,UAAU,MAAM;AAEd,QADA,EAAE,iBAAiB,EACnB,EAAY,CAAC,EAAS;;OAExB,WAAU;iBAEV,kBAAC,GAAD,EAAc,WAAU,8BAA+B,CAAA;OAChD,CAAA,EACT,kBAAC,GAAD,EAAA,UACG,KACC,kBAAC,EAAO,KAAR;OACE,SAAS;QAAE,SAAS;QAAG,OAAO;QAAM,GAAG;QAAI;OAC3C,SAAS;QAAE,SAAS;QAAG,OAAO;QAAG,GAAG;QAAG;OACvC,MAAM;QAAE,SAAS;QAAG,OAAO;QAAM,GAAG;QAAI;OACxC,YAAY,EAAE,UAAU,KAAM;OAC9B,WAAU;iBALZ;QAOG,KAAc,EAAK,WAAW,YAC7B,kBAAC,EAAO,QAAR;SACE,UAAU,EAAE,OAAO,KAAM;SACzB,UAAU,MAAM;AAGd,UAFA,EAAE,iBAAiB,EACnB,EAAW,EAAK,EAChB,EAAY,GAAM;;SAEpB,WAAU;mBAPZ,CASE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA,EAAA,WAEb;;QAEjB,KACC,kBAAC,EAAO,QAAR;SACE,UAAU,EAAE,OAAO,KAAM;SACzB,UAAU,MAAM;AAGd,UAFA,EAAE,iBAAiB,EACnB,EAAO,EAAK,EACZ,EAAY,GAAM;;SAEpB,WAAU;mBAPZ,CASE,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA,EAAA,OAEjB;;QAEjB,KAAkB,EAAK,QACtB,kBAAC,EAAO,QAAR;SACE,UAAU,EAAE,OAAO,KAAM;SACzB,UAAU,MAAM;AAGd,UAFA,EAAE,iBAAiB,EACnB,EAAe,EAAK,EACpB,EAAY,GAAM;;SAEpB,WAAU;mBAPZ,CASE,kBAAC,GAAD,EAAc,WAAU,UAAW,CAAA,EAAA,kBAErB;;QAEjB,KAAa,EAAK,WAAW,cAC5B,kBAAC,EAAO,QAAR;SACE,UAAU,EAAE,OAAO,KAAM;SACzB,UAAU,MAAM;AAGd,UAFA,EAAE,iBAAiB,EACnB,EAAU,EAAK,EACf,EAAY,GAAM;;SAEpB,WAAU;mBAPZ,CASE,kBAAC,GAAD,EAAS,WAAU,UAAW,CAAA,EAAA,UAEhB;;QAEP;UAEC,CAAA,CACd;QAEJ;OACF;;GAEL,EAAK,eACJ,kBAAC,KAAD;IAAG,WAAU;cAAiD,EAAK;IAAgB,CAAA;GAGpF,EAAK,QACJ,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAK;IACF,CAAA;GAGP,EAAK,aACJ,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;KAChC,kBAAC,QAAD;MAAM,WAAU;gBAAY,EAAK;MAAiB,CAAA;KACjD,EAAK,aAAa,EAAK,cAAc,WACpC,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAK;MACD,CAAA;KAEL;;GAGP,EAAK,QAAQ,EAAK,KAAK,SAAS,KAC/B,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,EAAK,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,MAC1B,kBAAC,QAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,GAAD,EAAK,WAAU,UAAW,CAAA,EACzB,EACI;OALA,EAKA,CACP,EACD,EAAK,KAAK,SAAS,KAClB,kBAAC,QAAD;KAAM,WAAU;eAAhB,CAA+E,KAC3E,EAAK,KAAK,SAAS,EAChB;OAEL;;GAEG"}
|
|
1
|
+
{"version":3,"file":"VibeCard.js","names":[],"sources":["../../../src/components/vibes/VibeCard.tsx"],"sourcesContent":["import { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { FC } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport {\n FolderOpen,\n GitBranch,\n MoreVertical,\n Play,\n Archive,\n Settings,\n Tag,\n ExternalLink,\n Trash2,\n} from 'lucide-react';\nimport { useState } from 'react';\nimport type { Vibe } from './types';\nimport { vibeTypeIcons } from './icons';\nimport { StatusBadge } from '../shared/StatusBadge';\nimport { SelectionCheckbox } from '../shared/SelectionCheckbox';\nimport { cardHoverVariants } from '../shared/cardMotion';\n\nexport interface VibeCardProps {\n vibe: Vibe;\n onOpen?: (vibe: Vibe) => void;\n onEdit?: (vibe: Vibe) => void;\n onArchive?: (vibe: Vibe) => void;\n onDelete?: (vibe: Vibe) => void;\n onActivate?: (vibe: Vibe) => void;\n onOpenInEditor?: (vibe: Vibe) => void;\n className?: string;\n selected?: boolean;\n onToggleSelect?: (checked: boolean) => void;\n}\n\n/**\n * VibeCard - Display project/vibe information\n */\nexport const VibeCard: FC<VibeCardProps> = ({\n vibe,\n onOpen,\n onEdit,\n onArchive,\n onDelete,\n onActivate,\n onOpenInEditor,\n className = '',\n selected = false,\n onToggleSelect,\n}) => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string) => {\n const v = t(key);\n return v === key ? fallback : v;\n };\n const [showMenu, setShowMenu] = useState(false);\n const Icon = vibeTypeIcons[vibe.type] || FolderOpen;\n\n return (\n <motion.div\n initial=\"rest\"\n animate=\"rest\"\n whileHover=\"hover\"\n whileTap=\"tap\"\n variants={cardHoverVariants}\n className={`bg-bg-surface border rounded-lg p-4 hover:border-border-strong transition-colors cursor-pointer ${\n selected\n ? 'border-action-primary-bg ring-1 ring-action-primary-bg/25'\n : 'border-border-default'\n } ${className}`}\n onClick={() => onOpen?.(vibe)}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-start gap-2 sm:gap-3 min-w-0 flex-1\">\n {onToggleSelect && (\n <div onClick={(event) => event.stopPropagation()}>\n <SelectionCheckbox\n checked={selected}\n onChange={onToggleSelect}\n ariaLabel={`Select vibe ${vibe.name}`}\n className=\"mt-2\"\n />\n </div>\n )}\n <div className=\"flex-shrink-0 size-8 sm:w-10 sm:h-10 rounded-lg bg-action-primary-bg/10 flex items-center justify-center\">\n <Icon className=\"size-4 sm:w-5 sm:h-5 text-action-primary-bg\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold text-text-primary truncate text-sm sm:text-base\">\n {vibe.name}\n </h3>\n {vibe.description && (\n <p className=\"text-xs sm:text-sm text-text-secondary truncate\">{vibe.description}</p>\n )}\n </div>\n </div>\n {/* Status and Actions - always visible */}\n <div className=\"flex items-center gap-1 sm:gap-2 flex-shrink-0\">\n <StatusBadge status={vibe.status} />\n {(onEdit || onArchive || onDelete || onActivate || onOpenInEditor) && (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setShowMenu(!showMenu);\n }}\n className=\"p-1 sm:p-1.5 rounded hover:bg-bg-sunken transition-colors\"\n >\n <MoreVertical className=\"size-4 text-text-secondary\" />\n </button>\n <AnimatePresence>\n {showMenu && (\n <motion.div\n initial={{ opacity: 0, scale: 0.95, y: -4 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, y: -4 }}\n transition={{ duration: 0.15 }}\n className=\"absolute right-0 mt-1 w-40 bg-bg-surface border border-border-default rounded-lg shadow-lg z-10\"\n >\n {onActivate && vibe.status !== 'ACTIVE' && (\n <motion.button\n whileTap={{ scale: 0.97 }}\n onClick={(e) => {\n e.stopPropagation();\n onActivate(vibe);\n setShowMenu(false);\n }}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken rounded-t-lg\"\n >\n <Play className=\"size-4\" />\n Activate\n </motion.button>\n )}\n {onEdit && (\n <motion.button\n whileTap={{ scale: 0.97 }}\n onClick={(e) => {\n e.stopPropagation();\n onEdit(vibe);\n setShowMenu(false);\n }}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken\"\n >\n <Settings className=\"size-4\" />\n Edit\n </motion.button>\n )}\n {onOpenInEditor && vibe.path && (\n <motion.button\n whileTap={{ scale: 0.97 }}\n onClick={(e) => {\n e.stopPropagation();\n onOpenInEditor(vibe);\n setShowMenu(false);\n }}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken\"\n >\n <ExternalLink className=\"size-4\" />\n Open in VS Code\n </motion.button>\n )}\n {onArchive && vibe.status !== 'ARCHIVED' && (\n <motion.button\n whileTap={{ scale: 0.97 }}\n onClick={(e) => {\n e.stopPropagation();\n onArchive(vibe);\n setShowMenu(false);\n }}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken rounded-b-lg\"\n >\n <Archive className=\"size-4\" />\n Archive\n </motion.button>\n )}\n {onDelete && (\n <motion.button\n whileTap={{ scale: 0.97 }}\n onClick={(e) => {\n e.stopPropagation();\n onDelete(vibe);\n setShowMenu(false);\n }}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-sm text-status-error-text hover:bg-bg-sunken rounded-b-lg\"\n >\n <Trash2 className=\"size-4\" />\n Delete\n </motion.button>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n )}\n </div>\n </div>\n\n {vibe.description && (\n <p className=\"mt-2 text-sm text-text-secondary line-clamp-2\">{vibe.description}</p>\n )}\n\n {vibe.path && (\n <div className=\"mt-3 text-xs text-text-secondary font-mono bg-bg-sunken p-2 rounded truncate\">\n {vibe.path}\n </div>\n )}\n\n {vibe.gitBranch && (\n <div className=\"mt-2 flex items-center gap-2 text-sm text-text-secondary\">\n <GitBranch className=\"size-4\" />\n <span className=\"truncate\">{vibe.gitBranch}</span>\n {vibe.gitStatus && vibe.gitStatus !== 'clean' && (\n <span className=\"px-1.5 py-0.5 text-xs bg-status-warning-bg text-status-warning-text rounded\">\n {vibe.gitStatus}\n </span>\n )}\n </div>\n )}\n\n {vibe.tags && vibe.tags.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1\">\n {vibe.tags.slice(0, 3).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded\"\n >\n <Tag className=\"size-3\" />\n {tag}\n </span>\n ))}\n {vibe.tags.length > 3 && (\n <span className=\"px-2 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded\">\n +{vibe.tags.length - 3}\n </span>\n )}\n </div>\n )}\n </motion.div>\n );\n};\n"],"mappings":"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"}
|