@burdenoff/microfe-coolandlovely 2026.720.1 → 2026.720.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/coolandlovely/CoolAndLovelyRoutes.d.ts.map +1 -1
  2. package/dist/coolandlovely/CoolAndLovelyRoutes.js +8 -0
  3. package/dist/coolandlovely/CoolAndLovelyRoutes.js.map +1 -1
  4. package/dist/coolandlovely/components/Field.d.ts +3 -0
  5. package/dist/coolandlovely/components/Field.d.ts.map +1 -1
  6. package/dist/coolandlovely/components/Field.js +12 -9
  7. package/dist/coolandlovely/components/Field.js.map +1 -1
  8. package/dist/coolandlovely/components/MetricsCard.d.ts +7 -0
  9. package/dist/coolandlovely/components/MetricsCard.d.ts.map +1 -1
  10. package/dist/coolandlovely/components/MetricsCard.js +37 -13
  11. package/dist/coolandlovely/components/MetricsCard.js.map +1 -1
  12. package/dist/coolandlovely/hooks/index.d.ts +1 -1
  13. package/dist/coolandlovely/hooks/index.d.ts.map +1 -1
  14. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.d.ts +54 -4
  15. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.d.ts.map +1 -1
  16. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js +197 -79
  17. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js.map +1 -1
  18. package/dist/coolandlovely/pages/HomePage.d.ts.map +1 -1
  19. package/dist/coolandlovely/pages/HomePage.js +112 -101
  20. package/dist/coolandlovely/pages/HomePage.js.map +1 -1
  21. package/dist/coolandlovely/pages/brands/BrandDetailPage.js +9 -9
  22. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.d.ts.map +1 -1
  23. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js +135 -111
  24. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js.map +1 -1
  25. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.d.ts +5 -4
  26. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.d.ts.map +1 -1
  27. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js +201 -107
  28. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js.map +1 -1
  29. package/dist/coolandlovely/pages/collections/CollectionDetailPage.d.ts.map +1 -1
  30. package/dist/coolandlovely/pages/collections/CollectionDetailPage.js +110 -99
  31. package/dist/coolandlovely/pages/collections/CollectionDetailPage.js.map +1 -1
  32. package/dist/coolandlovely/pages/discover/DiscoverPage.js +7 -6
  33. package/dist/coolandlovely/pages/discover/DiscoverPage.js.map +1 -1
  34. package/dist/coolandlovely/pages/items/StyleItemDetailPage.js +4 -4
  35. package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.d.ts.map +1 -1
  36. package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js +116 -104
  37. package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js.map +1 -1
  38. package/dist/coolandlovely/pages/looks/LookDetailPage.d.ts.map +1 -1
  39. package/dist/coolandlovely/pages/looks/LookDetailPage.js +15 -13
  40. package/dist/coolandlovely/pages/looks/LookDetailPage.js.map +1 -1
  41. package/dist/coolandlovely/pages/profile/StyleProfilePage.d.ts +11 -6
  42. package/dist/coolandlovely/pages/profile/StyleProfilePage.d.ts.map +1 -1
  43. package/dist/coolandlovely/pages/profile/StyleProfilePage.js +195 -176
  44. package/dist/coolandlovely/pages/profile/StyleProfilePage.js.map +1 -1
  45. package/dist/coolandlovely/types/index.d.ts +40 -0
  46. package/dist/coolandlovely/types/index.d.ts.map +1 -1
  47. package/dist/coolandlovely/utils/index.d.ts +1 -0
  48. package/dist/coolandlovely/utils/index.d.ts.map +1 -1
  49. package/dist/coolandlovely/utils/index.js +5 -0
  50. package/dist/coolandlovely/utils/sparkline.d.ts +31 -0
  51. package/dist/coolandlovely/utils/sparkline.d.ts.map +1 -0
  52. package/dist/coolandlovely/utils/sparkline.js +29 -0
  53. package/dist/coolandlovely/utils/sparkline.js.map +1 -0
  54. package/dist/utils/pageContext.d.ts +8 -1
  55. package/dist/utils/pageContext.d.ts.map +1 -1
  56. package/dist/utils/pageContext.js +22 -27
  57. package/dist/utils/pageContext.js.map +1 -1
  58. package/package.json +1 -1
@@ -3,19 +3,19 @@ import { PageLayout as t } from "../../components/PageLayout.js";
3
3
  import { StatusBadge as n } from "../../components/StatusBadge.js";
4
4
  import { ErrorView as r, LoadingView as i } from "../../components/StateViews.js";
5
5
  import { Thumbnail as a } from "../../components/Thumbnail.js";
6
- import { useCollaboration as o, useTransitionCollaboration as s } from "../../hooks/useCoolAndLovelyApi.js";
7
- import { formatDate as c, formatPrice as l, titleCase as u } from "../../utils/formatters.js";
6
+ import { useCollaboration as o, useDeleteCollaboration as s, useTransitionCollaboration as c } from "../../hooks/useCoolAndLovelyApi.js";
7
+ import { formatDate as l, formatPrice as u, titleCase as d } from "../../utils/formatters.js";
8
8
  import "../../hooks/index.js";
9
- import { TagList as d } from "../../components/TagList.js";
10
- import { ActorName as f } from "../../components/ActorName.js";
11
- import { BrandCreatorAvatars as p } from "../../components/BrandCreatorAvatars.js";
12
- import { StepTracker as m } from "../../components/StepTracker.js";
13
- import { ArrowLeft as h, Loader2 as g, Sparkles as _, Store as v } from "lucide-react";
14
- import { useParams as y } from "react-router-dom";
15
- import { jsx as b, jsxs as x } from "react/jsx-runtime";
16
- import { GlassCard as S } from "@burdenoff/fe-libs/ui";
9
+ import { TagList as f } from "../../components/TagList.js";
10
+ import { ActorName as p } from "../../components/ActorName.js";
11
+ import { BrandCreatorAvatars as m } from "../../components/BrandCreatorAvatars.js";
12
+ import { StepTracker as h } from "../../components/StepTracker.js";
13
+ import { ArrowLeft as g, Loader2 as _, Pencil as v, Sparkles as y, Store as b, Trash2 as x } from "lucide-react";
14
+ import { useParams as S } from "react-router-dom";
15
+ import { jsx as C, jsxs as w } from "react/jsx-runtime";
16
+ import { GlassCard as T } from "@burdenoff/fe-libs/ui";
17
17
  //#region src/coolandlovely/pages/collaborations/CollaborationDetailPage.tsx
18
- var C = {
18
+ var E = {
19
19
  PROPOSED: [
20
20
  "ACCEPTED",
21
21
  "DECLINED",
@@ -26,217 +26,241 @@ var C = {
26
26
  PUBLISHED: [],
27
27
  DECLINED: [],
28
28
  CANCELLED: []
29
- }, w = [
29
+ }, D = [
30
30
  "PROPOSED",
31
31
  "ACCEPTED",
32
32
  "IN_PROGRESS",
33
33
  "PUBLISHED"
34
34
  ];
35
- function T() {
36
- let { collaborationId: T } = y(), { navigateTo: E } = e(), D = o(T), O = s();
37
- if (D.isLoading) return /* @__PURE__ */ b(t, {
35
+ function O() {
36
+ let { collaborationId: O } = S(), { navigateTo: k } = e(), A = o(O), j = c(), M = s();
37
+ if (A.isLoading) return /* @__PURE__ */ C(t, {
38
38
  title: "Collaboration",
39
- children: /* @__PURE__ */ b(i, { label: "Loading collaboration…" })
39
+ children: /* @__PURE__ */ C(i, { label: "Loading collaboration…" })
40
40
  });
41
- if (D.isError || !D.data) return /* @__PURE__ */ b(t, {
41
+ if (A.isError || !A.data) return /* @__PURE__ */ C(t, {
42
42
  title: "Collaboration",
43
- children: /* @__PURE__ */ b(r, {
43
+ children: /* @__PURE__ */ C(r, {
44
44
  title: "Collaboration not found",
45
- onRetry: () => void D.refetch()
45
+ onRetry: () => void A.refetch()
46
46
  })
47
47
  });
48
- let k = D.data, A = k.looks ?? [], j = C[k.status], M = w.includes(k.status) ? w : ["PROPOSED", k.status];
49
- return /* @__PURE__ */ b(t, {
50
- title: k.title,
51
- description: k.brand?.name ?? void 0,
52
- actions: /* @__PURE__ */ x("button", {
53
- type: "button",
54
- onClick: () => E("/collaborations"),
55
- className: "inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken",
56
- children: [/* @__PURE__ */ b(h, { className: "h-4 w-4" }), " Back"]
48
+ let N = A.data, P = N.looks ?? [], F = E[N.status], I = D.includes(N.status) ? D : ["PROPOSED", N.status];
49
+ return /* @__PURE__ */ C(t, {
50
+ title: N.title,
51
+ description: N.brand?.name ?? void 0,
52
+ actions: /* @__PURE__ */ w("div", {
53
+ className: "flex items-center gap-2",
54
+ children: [
55
+ F.length > 0 && /* @__PURE__ */ w("button", {
56
+ type: "button",
57
+ onClick: () => k(`/collaborations/${N.id}/edit`),
58
+ className: "inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken",
59
+ children: [/* @__PURE__ */ C(v, { className: "h-4 w-4" }), " Edit"]
60
+ }),
61
+ N.status === "PROPOSED" && /* @__PURE__ */ w("button", {
62
+ type: "button",
63
+ disabled: M.isPending,
64
+ onClick: () => M.mutate(N.id, { onSuccess: () => k("/collaborations") }),
65
+ className: "inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50",
66
+ children: [M.isPending ? /* @__PURE__ */ C(_, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ C(x, { className: "h-4 w-4" }), "Delete"]
67
+ }),
68
+ /* @__PURE__ */ w("button", {
69
+ type: "button",
70
+ onClick: () => k("/collaborations"),
71
+ className: "inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken",
72
+ children: [/* @__PURE__ */ C(g, { className: "h-4 w-4" }), " Back"]
73
+ })
74
+ ]
57
75
  }),
58
- children: /* @__PURE__ */ x("div", {
76
+ children: /* @__PURE__ */ w("div", {
59
77
  className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
60
- children: [/* @__PURE__ */ x("div", {
78
+ children: [/* @__PURE__ */ w("div", {
61
79
  className: "lg:col-span-2",
62
- children: [/* @__PURE__ */ x(S, {
80
+ children: [/* @__PURE__ */ w(T, {
63
81
  treatment: "glass",
64
82
  className: "p-6",
65
83
  children: [
66
- /* @__PURE__ */ x("div", {
84
+ /* @__PURE__ */ w("div", {
67
85
  className: "flex items-center gap-3",
68
86
  children: [
69
- /* @__PURE__ */ b(p, {
70
- brandLogoFileId: k.brand?.logo?.id,
71
- brandSeed: k.brandId,
72
- creatorId: k.creatorId,
87
+ /* @__PURE__ */ C(m, {
88
+ brandLogoFileId: N.brand?.logo?.id,
89
+ brandSeed: N.brandId,
90
+ creatorId: N.creatorId,
73
91
  className: "shrink-0"
74
92
  }),
75
- /* @__PURE__ */ x("div", {
93
+ /* @__PURE__ */ w("div", {
76
94
  className: "min-w-0 flex-1",
77
- children: [/* @__PURE__ */ b("h2", {
95
+ children: [/* @__PURE__ */ C("h2", {
78
96
  className: "truncate text-xl font-semibold text-text-primary",
79
- children: k.title
80
- }), /* @__PURE__ */ x("p", {
97
+ children: N.title
98
+ }), /* @__PURE__ */ w("p", {
81
99
  className: "text-xs text-text-secondary",
82
100
  children: [
83
- k.brand?.name ?? "Brand",
84
- " × ",
85
- /* @__PURE__ */ b(f, { id: k.creatorId }),
86
- " ·",
101
+ N.brand?.name ?? "Brand",
102
+ " ×",
87
103
  " ",
88
- u(k.role),
104
+ /* @__PURE__ */ C("button", {
105
+ type: "button",
106
+ onClick: () => k(`/profile/${N.creatorId}`),
107
+ className: "font-medium text-text-primary hover:underline focus-visible:outline-none",
108
+ children: /* @__PURE__ */ C(p, { id: N.creatorId })
109
+ }),
110
+ " ",
111
+ "· ",
112
+ d(N.role),
89
113
  " collaboration"
90
114
  ]
91
115
  })]
92
116
  }),
93
- /* @__PURE__ */ b(n, { status: k.status })
117
+ /* @__PURE__ */ C(n, { status: N.status })
94
118
  ]
95
119
  }),
96
- k.brief && /* @__PURE__ */ b("p", {
120
+ N.brief && /* @__PURE__ */ C("p", {
97
121
  className: "mt-4 text-sm text-text-secondary",
98
- children: k.brief
122
+ children: N.brief
99
123
  }),
100
- k.tags.length > 0 && /* @__PURE__ */ b(d, {
101
- tags: k.tags,
124
+ N.tags.length > 0 && /* @__PURE__ */ C(f, {
125
+ tags: N.tags,
102
126
  className: "mt-4",
103
127
  tone: "accent"
104
128
  })
105
129
  ]
106
- }), /* @__PURE__ */ x("section", {
130
+ }), /* @__PURE__ */ w("section", {
107
131
  className: "mt-6",
108
- children: [/* @__PURE__ */ x("h3", {
132
+ children: [/* @__PURE__ */ w("h3", {
109
133
  className: "mb-3 text-lg font-semibold text-text-primary",
110
134
  children: [
111
135
  "Attributed looks (",
112
- A.length,
136
+ P.length,
113
137
  ")"
114
138
  ]
115
- }), A.length === 0 ? /* @__PURE__ */ b("p", {
139
+ }), P.length === 0 ? /* @__PURE__ */ C("p", {
116
140
  className: "rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary",
117
141
  children: "No looks attributed to this collaboration yet."
118
- }) : /* @__PURE__ */ b("div", {
142
+ }) : /* @__PURE__ */ C("div", {
119
143
  className: "grid grid-cols-2 gap-3 sm:grid-cols-3",
120
- children: A.map((e) => /* @__PURE__ */ x("button", {
144
+ children: P.map((e) => /* @__PURE__ */ w("button", {
121
145
  type: "button",
122
- onClick: () => E(`/looks/${e.id}`),
146
+ onClick: () => k(`/looks/${e.id}`),
123
147
  className: "overflow-hidden rounded-lg border border-border-seam bg-bg-surface text-left transition-all hover:border-accent-foreground/20 hover:shadow-md",
124
- children: [/* @__PURE__ */ b(a, {
125
- icon: /* @__PURE__ */ b(_, { className: "h-6 w-6" }),
148
+ children: [/* @__PURE__ */ C(a, {
149
+ icon: /* @__PURE__ */ C(y, { className: "h-6 w-6" }),
126
150
  seed: e.id,
127
151
  className: "h-24 w-full"
128
- }), /* @__PURE__ */ x("div", {
152
+ }), /* @__PURE__ */ w("div", {
129
153
  className: "p-3",
130
- children: [/* @__PURE__ */ b("p", {
154
+ children: [/* @__PURE__ */ C("p", {
131
155
  className: "truncate text-sm font-medium text-text-primary",
132
156
  children: e.title
133
- }), /* @__PURE__ */ b("p", {
157
+ }), /* @__PURE__ */ C("p", {
134
158
  className: "mt-0.5 text-xs text-text-secondary",
135
- children: u(e.occasion)
159
+ children: d(e.occasion)
136
160
  })]
137
161
  })]
138
162
  }, e.id))
139
163
  })]
140
164
  })]
141
- }), /* @__PURE__ */ x("div", {
165
+ }), /* @__PURE__ */ w("div", {
142
166
  className: "space-y-4",
143
167
  children: [
144
- /* @__PURE__ */ x(S, {
168
+ /* @__PURE__ */ w(T, {
145
169
  treatment: "insight",
146
170
  className: "p-5",
147
171
  children: [
148
- /* @__PURE__ */ b("h3", {
172
+ /* @__PURE__ */ C("h3", {
149
173
  className: "mb-3 text-sm font-semibold text-text-primary",
150
174
  children: "Lifecycle"
151
175
  }),
152
- /* @__PURE__ */ b(m, {
153
- steps: M,
154
- current: k.status,
176
+ /* @__PURE__ */ C(h, {
177
+ steps: I,
178
+ current: N.status,
155
179
  className: "mb-5"
156
180
  }),
157
- /* @__PURE__ */ x("div", {
181
+ /* @__PURE__ */ w("div", {
158
182
  className: "mb-3 flex items-center gap-2",
159
- children: [/* @__PURE__ */ b("span", {
183
+ children: [/* @__PURE__ */ C("span", {
160
184
  className: "text-sm text-text-secondary",
161
185
  children: "Current:"
162
- }), /* @__PURE__ */ b(n, { status: k.status })]
186
+ }), /* @__PURE__ */ C(n, { status: N.status })]
163
187
  }),
164
- j.length === 0 ? /* @__PURE__ */ b("p", {
188
+ F.length === 0 ? /* @__PURE__ */ C("p", {
165
189
  className: "text-xs text-text-secondary",
166
190
  children: "This collaboration is in a terminal state."
167
- }) : /* @__PURE__ */ b("div", {
191
+ }) : /* @__PURE__ */ C("div", {
168
192
  className: "flex flex-col gap-2",
169
- children: j.map((e) => /* @__PURE__ */ x("button", {
193
+ children: F.map((e) => /* @__PURE__ */ w("button", {
170
194
  type: "button",
171
- disabled: O.isPending,
172
- onClick: () => O.mutate({
173
- id: k.id,
195
+ disabled: j.isPending,
196
+ onClick: () => j.mutate({
197
+ id: N.id,
174
198
  status: e
175
199
  }),
176
200
  className: "inline-flex items-center justify-center gap-2 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken disabled:opacity-50",
177
201
  children: [
178
- O.isPending && /* @__PURE__ */ b(g, { className: "h-3.5 w-3.5 animate-spin" }),
202
+ j.isPending && /* @__PURE__ */ C(_, { className: "h-3.5 w-3.5 animate-spin" }),
179
203
  "Move to ",
180
- u(e)
204
+ d(e)
181
205
  ]
182
206
  }, e))
183
207
  }),
184
- O.isError && /* @__PURE__ */ b("p", {
208
+ j.isError && /* @__PURE__ */ C("p", {
185
209
  className: "mt-2 text-xs text-status-error-text",
186
- children: O.error instanceof Error ? O.error.message : "Transition failed"
210
+ children: j.error instanceof Error ? j.error.message : "Transition failed"
187
211
  })
188
212
  ]
189
213
  }),
190
- /* @__PURE__ */ x(S, {
214
+ /* @__PURE__ */ w(T, {
191
215
  treatment: "plain",
192
216
  className: "p-5",
193
- children: [/* @__PURE__ */ b("h3", {
217
+ children: [/* @__PURE__ */ C("h3", {
194
218
  className: "mb-3 text-sm font-semibold text-text-primary",
195
219
  children: "Terms"
196
- }), /* @__PURE__ */ x("dl", {
220
+ }), /* @__PURE__ */ w("dl", {
197
221
  className: "space-y-2 text-sm",
198
222
  children: [
199
- /* @__PURE__ */ x("div", {
223
+ /* @__PURE__ */ w("div", {
200
224
  className: "flex justify-between gap-2",
201
- children: [/* @__PURE__ */ b("dt", {
225
+ children: [/* @__PURE__ */ C("dt", {
202
226
  className: "text-text-secondary",
203
227
  children: "Role"
204
- }), /* @__PURE__ */ b("dd", {
228
+ }), /* @__PURE__ */ C("dd", {
205
229
  className: "text-text-primary",
206
- children: u(k.role)
230
+ children: d(N.role)
207
231
  })]
208
232
  }),
209
- /* @__PURE__ */ x("div", {
233
+ /* @__PURE__ */ w("div", {
210
234
  className: "flex justify-between gap-2",
211
- children: [/* @__PURE__ */ b("dt", {
235
+ children: [/* @__PURE__ */ C("dt", {
212
236
  className: "text-text-secondary",
213
237
  children: "Compensation"
214
- }), /* @__PURE__ */ b("dd", {
238
+ }), /* @__PURE__ */ C("dd", {
215
239
  className: "text-text-primary",
216
- children: l(k.compensation, k.currency)
240
+ children: u(N.compensation, N.currency)
217
241
  })]
218
242
  }),
219
- /* @__PURE__ */ x("div", {
243
+ /* @__PURE__ */ w("div", {
220
244
  className: "flex justify-between gap-2",
221
- children: [/* @__PURE__ */ b("dt", {
245
+ children: [/* @__PURE__ */ C("dt", {
222
246
  className: "text-text-secondary",
223
247
  children: "Starts"
224
- }), /* @__PURE__ */ b("dd", {
248
+ }), /* @__PURE__ */ C("dd", {
225
249
  className: "text-text-primary",
226
- children: k.startDate ? c(k.startDate, {
250
+ children: N.startDate ? l(N.startDate, {
227
251
  hour: void 0,
228
252
  minute: void 0
229
253
  }) : "—"
230
254
  })]
231
255
  }),
232
- /* @__PURE__ */ x("div", {
256
+ /* @__PURE__ */ w("div", {
233
257
  className: "flex justify-between gap-2",
234
- children: [/* @__PURE__ */ b("dt", {
258
+ children: [/* @__PURE__ */ C("dt", {
235
259
  className: "text-text-secondary",
236
260
  children: "Ends"
237
- }), /* @__PURE__ */ b("dd", {
261
+ }), /* @__PURE__ */ C("dd", {
238
262
  className: "text-text-primary",
239
- children: k.endDate ? c(k.endDate, {
263
+ children: N.endDate ? l(N.endDate, {
240
264
  hour: void 0,
241
265
  minute: void 0
242
266
  }) : "—"
@@ -245,20 +269,20 @@ function T() {
245
269
  ]
246
270
  })]
247
271
  }),
248
- k.brand && /* @__PURE__ */ x("button", {
272
+ N.brand && /* @__PURE__ */ w("button", {
249
273
  type: "button",
250
- onClick: () => E(`/brands/${k.brand?.id}`),
274
+ onClick: () => k(`/brands/${N.brand?.id}`),
251
275
  className: "flex w-full items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 text-left transition-colors hover:bg-bg-sunken/50",
252
- children: [/* @__PURE__ */ b(a, {
253
- icon: /* @__PURE__ */ b(v, { className: "h-5 w-5" }),
254
- seed: k.brand.id,
276
+ children: [/* @__PURE__ */ C(a, {
277
+ icon: /* @__PURE__ */ C(b, { className: "h-5 w-5" }),
278
+ seed: N.brand.id,
255
279
  className: "h-10 w-10 shrink-0"
256
- }), /* @__PURE__ */ x("div", {
280
+ }), /* @__PURE__ */ w("div", {
257
281
  className: "min-w-0",
258
- children: [/* @__PURE__ */ b("p", {
282
+ children: [/* @__PURE__ */ C("p", {
259
283
  className: "truncate text-sm font-medium text-text-primary",
260
- children: k.brand.name
261
- }), /* @__PURE__ */ b("p", {
284
+ children: N.brand.name
285
+ }), /* @__PURE__ */ C("p", {
262
286
  className: "truncate text-xs text-text-secondary",
263
287
  children: "View brand"
264
288
  })]
@@ -270,6 +294,6 @@ function T() {
270
294
  });
271
295
  }
272
296
  //#endregion
273
- export { T as CollaborationDetailPage };
297
+ export { O as CollaborationDetailPage };
274
298
 
275
299
  //# sourceMappingURL=CollaborationDetailPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CollaborationDetailPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/collaborations/CollaborationDetailPage.tsx"],"sourcesContent":["/**\n * Collaboration Detail Page\n * @module coolandlovely/pages/collaborations\n *\n * Single collaboration (`cooCollaboration`) with validated lifecycle\n * transitions (`cooTransitionCollaboration`), its brand and attributed looks.\n */\n\nimport { useParams } from 'react-router-dom';\nimport { ArrowLeft, Loader2, Store, Sparkles } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { Thumbnail } from '../../components/Thumbnail';\nimport { BrandCreatorAvatars } from '../../components/BrandCreatorAvatars';\nimport { ActorName } from '../../components/ActorName';\nimport { StepTracker } from '../../components/StepTracker';\nimport { TagList } from '../../components/TagList';\nimport { useCoolAndLovely } from '../../context/CoolAndLovelyContext';\nimport { useCollaboration, useTransitionCollaboration } from '../../hooks';\nimport { formatPrice, formatDate, titleCase } from '../../utils/formatters';\nimport type { CooCollaborationStatus } from '../../types';\n\n/** Allowed next states per the svc collaboration state machine (UX guidance;\n * the service is authoritative and rejects illegal jumps). */\nconst NEXT_STATES: Record<CooCollaborationStatus, CooCollaborationStatus[]> = {\n PROPOSED: ['ACCEPTED', 'DECLINED', 'CANCELLED'],\n ACCEPTED: ['IN_PROGRESS', 'CANCELLED'],\n IN_PROGRESS: ['PUBLISHED', 'CANCELLED'],\n PUBLISHED: [],\n DECLINED: [],\n CANCELLED: [],\n};\n\nconst LIFECYCLE_STEPS: CooCollaborationStatus[] = [\n 'PROPOSED',\n 'ACCEPTED',\n 'IN_PROGRESS',\n 'PUBLISHED',\n];\n\nexport function CollaborationDetailPage() {\n const { collaborationId } = useParams<{ collaborationId: string }>();\n const { navigateTo } = useCoolAndLovely();\n const query = useCollaboration(collaborationId);\n const transition = useTransitionCollaboration();\n\n if (query.isLoading) {\n return (\n <PageLayout title=\"Collaboration\">\n <LoadingView label=\"Loading collaboration…\" />\n </PageLayout>\n );\n }\n\n if (query.isError || !query.data) {\n return (\n <PageLayout title=\"Collaboration\">\n <ErrorView title=\"Collaboration not found\" onRetry={() => void query.refetch()} />\n </PageLayout>\n );\n }\n\n const collab = query.data;\n const looks = collab.looks ?? [];\n const nextStates = NEXT_STATES[collab.status];\n const trackerSteps = LIFECYCLE_STEPS.includes(collab.status)\n ? LIFECYCLE_STEPS\n : (['PROPOSED', collab.status] as CooCollaborationStatus[]);\n\n return (\n <PageLayout\n title={collab.title}\n description={collab.brand?.name ?? undefined}\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/collaborations')}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n }\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <div className=\"flex items-center gap-3\">\n <BrandCreatorAvatars\n brandLogoFileId={collab.brand?.logo?.id}\n brandSeed={collab.brandId}\n creatorId={collab.creatorId}\n className=\"shrink-0\"\n />\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-xl font-semibold text-text-primary\">{collab.title}</h2>\n <p className=\"text-xs text-text-secondary\">\n {collab.brand?.name ?? 'Brand'} × <ActorName id={collab.creatorId} /> ·{' '}\n {titleCase(collab.role)} collaboration\n </p>\n </div>\n <StatusBadge status={collab.status} />\n </div>\n {collab.brief && <p className=\"mt-4 text-sm text-text-secondary\">{collab.brief}</p>}\n {collab.tags.length > 0 && (\n <TagList tags={collab.tags} className=\"mt-4\" tone=\"accent\" />\n )}\n </GlassCard>\n\n {/* Attributed looks */}\n <section className=\"mt-6\">\n <h3 className=\"mb-3 text-lg font-semibold text-text-primary\">\n Attributed looks ({looks.length})\n </h3>\n {looks.length === 0 ? (\n <p className=\"rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary\">\n No looks attributed to this collaboration yet.\n </p>\n ) : (\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n {looks.map((look) => (\n <button\n key={look.id}\n type=\"button\"\n onClick={() => navigateTo(`/looks/${look.id}`)}\n className=\"overflow-hidden rounded-lg border border-border-seam bg-bg-surface text-left transition-all hover:border-accent-foreground/20 hover:shadow-md\"\n >\n <Thumbnail\n icon={<Sparkles className=\"h-6 w-6\" />}\n seed={look.id}\n className=\"h-24 w-full\"\n />\n <div className=\"p-3\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{look.title}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {titleCase(look.occasion)}\n </p>\n </div>\n </button>\n ))}\n </div>\n )}\n </section>\n </div>\n\n <div className=\"space-y-4\">\n <GlassCard treatment=\"insight\" className=\"p-5\">\n <h3 className=\"mb-3 text-sm font-semibold text-text-primary\">Lifecycle</h3>\n <StepTracker steps={trackerSteps} current={collab.status} className=\"mb-5\" />\n <div className=\"mb-3 flex items-center gap-2\">\n <span className=\"text-sm text-text-secondary\">Current:</span>\n <StatusBadge status={collab.status} />\n </div>\n {nextStates.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n This collaboration is in a terminal state.\n </p>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {nextStates.map((next) => (\n <button\n key={next}\n type=\"button\"\n disabled={transition.isPending}\n onClick={() => transition.mutate({ id: collab.id, status: next })}\n className=\"inline-flex items-center justify-center gap-2 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken disabled:opacity-50\"\n >\n {transition.isPending && <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />}\n Move to {titleCase(next)}\n </button>\n ))}\n </div>\n )}\n {transition.isError && (\n <p className=\"mt-2 text-xs text-status-error-text\">\n {transition.error instanceof Error ? transition.error.message : 'Transition failed'}\n </p>\n )}\n </GlassCard>\n\n <GlassCard treatment=\"plain\" className=\"p-5\">\n <h3 className=\"mb-3 text-sm font-semibold text-text-primary\">Terms</h3>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Role</dt>\n <dd className=\"text-text-primary\">{titleCase(collab.role)}</dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Compensation</dt>\n <dd className=\"text-text-primary\">\n {formatPrice(collab.compensation, collab.currency)}\n </dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Starts</dt>\n <dd className=\"text-text-primary\">\n {collab.startDate\n ? formatDate(collab.startDate, { hour: undefined, minute: undefined })\n : '—'}\n </dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Ends</dt>\n <dd className=\"text-text-primary\">\n {collab.endDate\n ? formatDate(collab.endDate, { hour: undefined, minute: undefined })\n : '—'}\n </dd>\n </div>\n </dl>\n </GlassCard>\n\n {collab.brand && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/brands/${collab.brand?.id}`)}\n className=\"flex w-full items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 text-left transition-colors hover:bg-bg-sunken/50\"\n >\n <Thumbnail\n icon={<Store className=\"h-5 w-5\" />}\n seed={collab.brand.id}\n className=\"h-10 w-10 shrink-0\"\n />\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {collab.brand.name}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">View brand</p>\n </div>\n </button>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CollaborationDetailPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/collaborations/CollaborationDetailPage.tsx"],"sourcesContent":["/**\n * Collaboration Detail Page\n * @module coolandlovely/pages/collaborations\n *\n * Single collaboration (`cooCollaboration`) with validated lifecycle\n * transitions (`cooTransitionCollaboration`), its brand and attributed looks.\n */\n\nimport { useParams } from 'react-router-dom';\nimport { ArrowLeft, Loader2, Pencil, Trash2, Store, Sparkles } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { Thumbnail } from '../../components/Thumbnail';\nimport { BrandCreatorAvatars } from '../../components/BrandCreatorAvatars';\nimport { ActorName } from '../../components/ActorName';\nimport { StepTracker } from '../../components/StepTracker';\nimport { TagList } from '../../components/TagList';\nimport { useCoolAndLovely } from '../../context/CoolAndLovelyContext';\nimport { useCollaboration, useTransitionCollaboration, useDeleteCollaboration } from '../../hooks';\nimport { formatPrice, formatDate, titleCase } from '../../utils/formatters';\nimport type { CooCollaborationStatus } from '../../types';\n\n/** Allowed next states per the svc collaboration state machine (UX guidance;\n * the service is authoritative and rejects illegal jumps). */\nconst NEXT_STATES: Record<CooCollaborationStatus, CooCollaborationStatus[]> = {\n PROPOSED: ['ACCEPTED', 'DECLINED', 'CANCELLED'],\n ACCEPTED: ['IN_PROGRESS', 'CANCELLED'],\n IN_PROGRESS: ['PUBLISHED', 'CANCELLED'],\n PUBLISHED: [],\n DECLINED: [],\n CANCELLED: [],\n};\n\nconst LIFECYCLE_STEPS: CooCollaborationStatus[] = [\n 'PROPOSED',\n 'ACCEPTED',\n 'IN_PROGRESS',\n 'PUBLISHED',\n];\n\nexport function CollaborationDetailPage() {\n const { collaborationId } = useParams<{ collaborationId: string }>();\n const { navigateTo } = useCoolAndLovely();\n const query = useCollaboration(collaborationId);\n const transition = useTransitionCollaboration();\n const deleteCollaboration = useDeleteCollaboration();\n\n if (query.isLoading) {\n return (\n <PageLayout title=\"Collaboration\">\n <LoadingView label=\"Loading collaboration…\" />\n </PageLayout>\n );\n }\n\n if (query.isError || !query.data) {\n return (\n <PageLayout title=\"Collaboration\">\n <ErrorView title=\"Collaboration not found\" onRetry={() => void query.refetch()} />\n </PageLayout>\n );\n }\n\n const collab = query.data;\n const looks = collab.looks ?? [];\n const nextStates = NEXT_STATES[collab.status];\n const trackerSteps = LIFECYCLE_STEPS.includes(collab.status)\n ? LIFECYCLE_STEPS\n : (['PROPOSED', collab.status] as CooCollaborationStatus[]);\n\n return (\n <PageLayout\n title={collab.title}\n description={collab.brand?.name ?? undefined}\n actions={\n <div className=\"flex items-center gap-2\">\n {nextStates.length > 0 && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/collaborations/${collab.id}/edit`)}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <Pencil className=\"h-4 w-4\" /> Edit\n </button>\n )}\n {collab.status === 'PROPOSED' && (\n <button\n type=\"button\"\n disabled={deleteCollaboration.isPending}\n onClick={() =>\n deleteCollaboration.mutate(collab.id, {\n onSuccess: () => navigateTo('/collaborations'),\n })\n }\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50\"\n >\n {deleteCollaboration.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Trash2 className=\"h-4 w-4\" />\n )}\n Delete\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => navigateTo('/collaborations')}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n </div>\n }\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <div className=\"flex items-center gap-3\">\n <BrandCreatorAvatars\n brandLogoFileId={collab.brand?.logo?.id}\n brandSeed={collab.brandId}\n creatorId={collab.creatorId}\n className=\"shrink-0\"\n />\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-xl font-semibold text-text-primary\">{collab.title}</h2>\n <p className=\"text-xs text-text-secondary\">\n {collab.brand?.name ?? 'Brand'} ×{' '}\n <button\n type=\"button\"\n onClick={() => navigateTo(`/profile/${collab.creatorId}`)}\n className=\"font-medium text-text-primary hover:underline focus-visible:outline-none\"\n >\n <ActorName id={collab.creatorId} />\n </button>{' '}\n · {titleCase(collab.role)} collaboration\n </p>\n </div>\n <StatusBadge status={collab.status} />\n </div>\n {collab.brief && <p className=\"mt-4 text-sm text-text-secondary\">{collab.brief}</p>}\n {collab.tags.length > 0 && (\n <TagList tags={collab.tags} className=\"mt-4\" tone=\"accent\" />\n )}\n </GlassCard>\n\n {/* Attributed looks */}\n <section className=\"mt-6\">\n <h3 className=\"mb-3 text-lg font-semibold text-text-primary\">\n Attributed looks ({looks.length})\n </h3>\n {looks.length === 0 ? (\n <p className=\"rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary\">\n No looks attributed to this collaboration yet.\n </p>\n ) : (\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n {looks.map((look) => (\n <button\n key={look.id}\n type=\"button\"\n onClick={() => navigateTo(`/looks/${look.id}`)}\n className=\"overflow-hidden rounded-lg border border-border-seam bg-bg-surface text-left transition-all hover:border-accent-foreground/20 hover:shadow-md\"\n >\n <Thumbnail\n icon={<Sparkles className=\"h-6 w-6\" />}\n seed={look.id}\n className=\"h-24 w-full\"\n />\n <div className=\"p-3\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{look.title}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {titleCase(look.occasion)}\n </p>\n </div>\n </button>\n ))}\n </div>\n )}\n </section>\n </div>\n\n <div className=\"space-y-4\">\n <GlassCard treatment=\"insight\" className=\"p-5\">\n <h3 className=\"mb-3 text-sm font-semibold text-text-primary\">Lifecycle</h3>\n <StepTracker steps={trackerSteps} current={collab.status} className=\"mb-5\" />\n <div className=\"mb-3 flex items-center gap-2\">\n <span className=\"text-sm text-text-secondary\">Current:</span>\n <StatusBadge status={collab.status} />\n </div>\n {nextStates.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n This collaboration is in a terminal state.\n </p>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {nextStates.map((next) => (\n <button\n key={next}\n type=\"button\"\n disabled={transition.isPending}\n onClick={() => transition.mutate({ id: collab.id, status: next })}\n className=\"inline-flex items-center justify-center gap-2 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken disabled:opacity-50\"\n >\n {transition.isPending && <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />}\n Move to {titleCase(next)}\n </button>\n ))}\n </div>\n )}\n {transition.isError && (\n <p className=\"mt-2 text-xs text-status-error-text\">\n {transition.error instanceof Error ? transition.error.message : 'Transition failed'}\n </p>\n )}\n </GlassCard>\n\n <GlassCard treatment=\"plain\" className=\"p-5\">\n <h3 className=\"mb-3 text-sm font-semibold text-text-primary\">Terms</h3>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Role</dt>\n <dd className=\"text-text-primary\">{titleCase(collab.role)}</dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Compensation</dt>\n <dd className=\"text-text-primary\">\n {formatPrice(collab.compensation, collab.currency)}\n </dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Starts</dt>\n <dd className=\"text-text-primary\">\n {collab.startDate\n ? formatDate(collab.startDate, { hour: undefined, minute: undefined })\n : '—'}\n </dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Ends</dt>\n <dd className=\"text-text-primary\">\n {collab.endDate\n ? formatDate(collab.endDate, { hour: undefined, minute: undefined })\n : '—'}\n </dd>\n </div>\n </dl>\n </GlassCard>\n\n {collab.brand && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/brands/${collab.brand?.id}`)}\n className=\"flex w-full items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 text-left transition-colors hover:bg-bg-sunken/50\"\n >\n <Thumbnail\n icon={<Store className=\"h-5 w-5\" />}\n seed={collab.brand.id}\n className=\"h-10 w-10 shrink-0\"\n />\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {collab.brand.name}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">View brand</p>\n </div>\n </button>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  /**
2
- * Collaboration Create Page
2
+ * Collaboration Create / Edit Page
3
3
  * @module coolandlovely/pages/collaborations
4
4
  *
5
- * Drives `cooCreateCollaboration`. Brand and creator are required by the svc
6
- * input; the creator defaults to the current user (you propose as a creator)
7
- * but can be overridden.
5
+ * Create mode drives `cooCreateCollaboration`. Edit mode (route
6
+ * `/collaborations/:collaborationId/edit`) drives `cooUpdateCollaboration`
7
+ * identity (brand/creator) and status are immutable there, so those fields
8
+ * render read-only and status transitions stay on CollaborationDetailPage.
8
9
  */
9
10
  export declare function CollaborationFormPage(): import("react").JSX.Element;
10
11
  //# sourceMappingURL=CollaborationFormPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CollaborationFormPage.d.ts","sourceRoot":"","sources":["../../../../src/coolandlovely/pages/collaborations/CollaborationFormPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiCH,wBAAgB,qBAAqB,gCAmNpC"}
1
+ {"version":3,"file":"CollaborationFormPage.d.ts","sourceRoot":"","sources":["../../../../src/coolandlovely/pages/collaborations/CollaborationFormPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgEH,wBAAgB,qBAAqB,gCAoTpC"}