@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.
- package/dist/coolandlovely/CoolAndLovelyRoutes.d.ts.map +1 -1
- package/dist/coolandlovely/CoolAndLovelyRoutes.js +8 -0
- package/dist/coolandlovely/CoolAndLovelyRoutes.js.map +1 -1
- package/dist/coolandlovely/components/Field.d.ts +3 -0
- package/dist/coolandlovely/components/Field.d.ts.map +1 -1
- package/dist/coolandlovely/components/Field.js +12 -9
- package/dist/coolandlovely/components/Field.js.map +1 -1
- package/dist/coolandlovely/components/MetricsCard.d.ts +7 -0
- package/dist/coolandlovely/components/MetricsCard.d.ts.map +1 -1
- package/dist/coolandlovely/components/MetricsCard.js +37 -13
- package/dist/coolandlovely/components/MetricsCard.js.map +1 -1
- package/dist/coolandlovely/hooks/index.d.ts +1 -1
- package/dist/coolandlovely/hooks/index.d.ts.map +1 -1
- package/dist/coolandlovely/hooks/useCoolAndLovelyApi.d.ts +54 -4
- package/dist/coolandlovely/hooks/useCoolAndLovelyApi.d.ts.map +1 -1
- package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js +197 -79
- package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js.map +1 -1
- package/dist/coolandlovely/pages/HomePage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/HomePage.js +112 -101
- package/dist/coolandlovely/pages/HomePage.js.map +1 -1
- package/dist/coolandlovely/pages/brands/BrandDetailPage.js +9 -9
- package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js +135 -111
- package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js.map +1 -1
- package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.d.ts +5 -4
- package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js +201 -107
- package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js.map +1 -1
- package/dist/coolandlovely/pages/collections/CollectionDetailPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/collections/CollectionDetailPage.js +110 -99
- package/dist/coolandlovely/pages/collections/CollectionDetailPage.js.map +1 -1
- package/dist/coolandlovely/pages/discover/DiscoverPage.js +7 -6
- package/dist/coolandlovely/pages/discover/DiscoverPage.js.map +1 -1
- package/dist/coolandlovely/pages/items/StyleItemDetailPage.js +4 -4
- package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js +116 -104
- package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js.map +1 -1
- package/dist/coolandlovely/pages/looks/LookDetailPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/looks/LookDetailPage.js +15 -13
- package/dist/coolandlovely/pages/looks/LookDetailPage.js.map +1 -1
- package/dist/coolandlovely/pages/profile/StyleProfilePage.d.ts +11 -6
- package/dist/coolandlovely/pages/profile/StyleProfilePage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/profile/StyleProfilePage.js +195 -176
- package/dist/coolandlovely/pages/profile/StyleProfilePage.js.map +1 -1
- package/dist/coolandlovely/types/index.d.ts +40 -0
- package/dist/coolandlovely/types/index.d.ts.map +1 -1
- package/dist/coolandlovely/utils/index.d.ts +1 -0
- package/dist/coolandlovely/utils/index.d.ts.map +1 -1
- package/dist/coolandlovely/utils/index.js +5 -0
- package/dist/coolandlovely/utils/sparkline.d.ts +31 -0
- package/dist/coolandlovely/utils/sparkline.d.ts.map +1 -0
- package/dist/coolandlovely/utils/sparkline.js +29 -0
- package/dist/coolandlovely/utils/sparkline.js.map +1 -0
- package/dist/utils/pageContext.d.ts +8 -1
- package/dist/utils/pageContext.d.ts.map +1 -1
- package/dist/utils/pageContext.js +22 -27
- package/dist/utils/pageContext.js.map +1 -1
- 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,
|
|
7
|
-
import { formatDate as
|
|
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
|
|
10
|
-
import { ActorName as
|
|
11
|
-
import { BrandCreatorAvatars as
|
|
12
|
-
import { StepTracker as
|
|
13
|
-
import { ArrowLeft as
|
|
14
|
-
import { useParams as
|
|
15
|
-
import { jsx as
|
|
16
|
-
import { GlassCard as
|
|
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
|
|
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
|
-
},
|
|
29
|
+
}, D = [
|
|
30
30
|
"PROPOSED",
|
|
31
31
|
"ACCEPTED",
|
|
32
32
|
"IN_PROGRESS",
|
|
33
33
|
"PUBLISHED"
|
|
34
34
|
];
|
|
35
|
-
function
|
|
36
|
-
let { collaborationId:
|
|
37
|
-
if (
|
|
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__ */
|
|
39
|
+
children: /* @__PURE__ */ C(i, { label: "Loading collaboration…" })
|
|
40
40
|
});
|
|
41
|
-
if (
|
|
41
|
+
if (A.isError || !A.data) return /* @__PURE__ */ C(t, {
|
|
42
42
|
title: "Collaboration",
|
|
43
|
-
children: /* @__PURE__ */
|
|
43
|
+
children: /* @__PURE__ */ C(r, {
|
|
44
44
|
title: "Collaboration not found",
|
|
45
|
-
onRetry: () => void
|
|
45
|
+
onRetry: () => void A.refetch()
|
|
46
46
|
})
|
|
47
47
|
});
|
|
48
|
-
let
|
|
49
|
-
return /* @__PURE__ */
|
|
50
|
-
title:
|
|
51
|
-
description:
|
|
52
|
-
actions: /* @__PURE__ */
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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__ */
|
|
76
|
+
children: /* @__PURE__ */ w("div", {
|
|
59
77
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
60
|
-
children: [/* @__PURE__ */
|
|
78
|
+
children: [/* @__PURE__ */ w("div", {
|
|
61
79
|
className: "lg:col-span-2",
|
|
62
|
-
children: [/* @__PURE__ */
|
|
80
|
+
children: [/* @__PURE__ */ w(T, {
|
|
63
81
|
treatment: "glass",
|
|
64
82
|
className: "p-6",
|
|
65
83
|
children: [
|
|
66
|
-
/* @__PURE__ */
|
|
84
|
+
/* @__PURE__ */ w("div", {
|
|
67
85
|
className: "flex items-center gap-3",
|
|
68
86
|
children: [
|
|
69
|
-
/* @__PURE__ */
|
|
70
|
-
brandLogoFileId:
|
|
71
|
-
brandSeed:
|
|
72
|
-
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__ */
|
|
93
|
+
/* @__PURE__ */ w("div", {
|
|
76
94
|
className: "min-w-0 flex-1",
|
|
77
|
-
children: [/* @__PURE__ */
|
|
95
|
+
children: [/* @__PURE__ */ C("h2", {
|
|
78
96
|
className: "truncate text-xl font-semibold text-text-primary",
|
|
79
|
-
children:
|
|
80
|
-
}), /* @__PURE__ */
|
|
97
|
+
children: N.title
|
|
98
|
+
}), /* @__PURE__ */ w("p", {
|
|
81
99
|
className: "text-xs text-text-secondary",
|
|
82
100
|
children: [
|
|
83
|
-
|
|
84
|
-
" ×
|
|
85
|
-
/* @__PURE__ */ b(f, { id: k.creatorId }),
|
|
86
|
-
" ·",
|
|
101
|
+
N.brand?.name ?? "Brand",
|
|
102
|
+
" ×",
|
|
87
103
|
" ",
|
|
88
|
-
|
|
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__ */
|
|
117
|
+
/* @__PURE__ */ C(n, { status: N.status })
|
|
94
118
|
]
|
|
95
119
|
}),
|
|
96
|
-
|
|
120
|
+
N.brief && /* @__PURE__ */ C("p", {
|
|
97
121
|
className: "mt-4 text-sm text-text-secondary",
|
|
98
|
-
children:
|
|
122
|
+
children: N.brief
|
|
99
123
|
}),
|
|
100
|
-
|
|
101
|
-
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__ */
|
|
130
|
+
}), /* @__PURE__ */ w("section", {
|
|
107
131
|
className: "mt-6",
|
|
108
|
-
children: [/* @__PURE__ */
|
|
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
|
-
|
|
136
|
+
P.length,
|
|
113
137
|
")"
|
|
114
138
|
]
|
|
115
|
-
}),
|
|
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__ */
|
|
142
|
+
}) : /* @__PURE__ */ C("div", {
|
|
119
143
|
className: "grid grid-cols-2 gap-3 sm:grid-cols-3",
|
|
120
|
-
children:
|
|
144
|
+
children: P.map((e) => /* @__PURE__ */ w("button", {
|
|
121
145
|
type: "button",
|
|
122
|
-
onClick: () =>
|
|
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__ */
|
|
125
|
-
icon: /* @__PURE__ */
|
|
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__ */
|
|
152
|
+
}), /* @__PURE__ */ w("div", {
|
|
129
153
|
className: "p-3",
|
|
130
|
-
children: [/* @__PURE__ */
|
|
154
|
+
children: [/* @__PURE__ */ C("p", {
|
|
131
155
|
className: "truncate text-sm font-medium text-text-primary",
|
|
132
156
|
children: e.title
|
|
133
|
-
}), /* @__PURE__ */
|
|
157
|
+
}), /* @__PURE__ */ C("p", {
|
|
134
158
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
135
|
-
children:
|
|
159
|
+
children: d(e.occasion)
|
|
136
160
|
})]
|
|
137
161
|
})]
|
|
138
162
|
}, e.id))
|
|
139
163
|
})]
|
|
140
164
|
})]
|
|
141
|
-
}), /* @__PURE__ */
|
|
165
|
+
}), /* @__PURE__ */ w("div", {
|
|
142
166
|
className: "space-y-4",
|
|
143
167
|
children: [
|
|
144
|
-
/* @__PURE__ */
|
|
168
|
+
/* @__PURE__ */ w(T, {
|
|
145
169
|
treatment: "insight",
|
|
146
170
|
className: "p-5",
|
|
147
171
|
children: [
|
|
148
|
-
/* @__PURE__ */
|
|
172
|
+
/* @__PURE__ */ C("h3", {
|
|
149
173
|
className: "mb-3 text-sm font-semibold text-text-primary",
|
|
150
174
|
children: "Lifecycle"
|
|
151
175
|
}),
|
|
152
|
-
/* @__PURE__ */
|
|
153
|
-
steps:
|
|
154
|
-
current:
|
|
176
|
+
/* @__PURE__ */ C(h, {
|
|
177
|
+
steps: I,
|
|
178
|
+
current: N.status,
|
|
155
179
|
className: "mb-5"
|
|
156
180
|
}),
|
|
157
|
-
/* @__PURE__ */
|
|
181
|
+
/* @__PURE__ */ w("div", {
|
|
158
182
|
className: "mb-3 flex items-center gap-2",
|
|
159
|
-
children: [/* @__PURE__ */
|
|
183
|
+
children: [/* @__PURE__ */ C("span", {
|
|
160
184
|
className: "text-sm text-text-secondary",
|
|
161
185
|
children: "Current:"
|
|
162
|
-
}), /* @__PURE__ */
|
|
186
|
+
}), /* @__PURE__ */ C(n, { status: N.status })]
|
|
163
187
|
}),
|
|
164
|
-
|
|
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__ */
|
|
191
|
+
}) : /* @__PURE__ */ C("div", {
|
|
168
192
|
className: "flex flex-col gap-2",
|
|
169
|
-
children:
|
|
193
|
+
children: F.map((e) => /* @__PURE__ */ w("button", {
|
|
170
194
|
type: "button",
|
|
171
|
-
disabled:
|
|
172
|
-
onClick: () =>
|
|
173
|
-
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
|
-
|
|
202
|
+
j.isPending && /* @__PURE__ */ C(_, { className: "h-3.5 w-3.5 animate-spin" }),
|
|
179
203
|
"Move to ",
|
|
180
|
-
|
|
204
|
+
d(e)
|
|
181
205
|
]
|
|
182
206
|
}, e))
|
|
183
207
|
}),
|
|
184
|
-
|
|
208
|
+
j.isError && /* @__PURE__ */ C("p", {
|
|
185
209
|
className: "mt-2 text-xs text-status-error-text",
|
|
186
|
-
children:
|
|
210
|
+
children: j.error instanceof Error ? j.error.message : "Transition failed"
|
|
187
211
|
})
|
|
188
212
|
]
|
|
189
213
|
}),
|
|
190
|
-
/* @__PURE__ */
|
|
214
|
+
/* @__PURE__ */ w(T, {
|
|
191
215
|
treatment: "plain",
|
|
192
216
|
className: "p-5",
|
|
193
|
-
children: [/* @__PURE__ */
|
|
217
|
+
children: [/* @__PURE__ */ C("h3", {
|
|
194
218
|
className: "mb-3 text-sm font-semibold text-text-primary",
|
|
195
219
|
children: "Terms"
|
|
196
|
-
}), /* @__PURE__ */
|
|
220
|
+
}), /* @__PURE__ */ w("dl", {
|
|
197
221
|
className: "space-y-2 text-sm",
|
|
198
222
|
children: [
|
|
199
|
-
/* @__PURE__ */
|
|
223
|
+
/* @__PURE__ */ w("div", {
|
|
200
224
|
className: "flex justify-between gap-2",
|
|
201
|
-
children: [/* @__PURE__ */
|
|
225
|
+
children: [/* @__PURE__ */ C("dt", {
|
|
202
226
|
className: "text-text-secondary",
|
|
203
227
|
children: "Role"
|
|
204
|
-
}), /* @__PURE__ */
|
|
228
|
+
}), /* @__PURE__ */ C("dd", {
|
|
205
229
|
className: "text-text-primary",
|
|
206
|
-
children:
|
|
230
|
+
children: d(N.role)
|
|
207
231
|
})]
|
|
208
232
|
}),
|
|
209
|
-
/* @__PURE__ */
|
|
233
|
+
/* @__PURE__ */ w("div", {
|
|
210
234
|
className: "flex justify-between gap-2",
|
|
211
|
-
children: [/* @__PURE__ */
|
|
235
|
+
children: [/* @__PURE__ */ C("dt", {
|
|
212
236
|
className: "text-text-secondary",
|
|
213
237
|
children: "Compensation"
|
|
214
|
-
}), /* @__PURE__ */
|
|
238
|
+
}), /* @__PURE__ */ C("dd", {
|
|
215
239
|
className: "text-text-primary",
|
|
216
|
-
children:
|
|
240
|
+
children: u(N.compensation, N.currency)
|
|
217
241
|
})]
|
|
218
242
|
}),
|
|
219
|
-
/* @__PURE__ */
|
|
243
|
+
/* @__PURE__ */ w("div", {
|
|
220
244
|
className: "flex justify-between gap-2",
|
|
221
|
-
children: [/* @__PURE__ */
|
|
245
|
+
children: [/* @__PURE__ */ C("dt", {
|
|
222
246
|
className: "text-text-secondary",
|
|
223
247
|
children: "Starts"
|
|
224
|
-
}), /* @__PURE__ */
|
|
248
|
+
}), /* @__PURE__ */ C("dd", {
|
|
225
249
|
className: "text-text-primary",
|
|
226
|
-
children:
|
|
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__ */
|
|
256
|
+
/* @__PURE__ */ w("div", {
|
|
233
257
|
className: "flex justify-between gap-2",
|
|
234
|
-
children: [/* @__PURE__ */
|
|
258
|
+
children: [/* @__PURE__ */ C("dt", {
|
|
235
259
|
className: "text-text-secondary",
|
|
236
260
|
children: "Ends"
|
|
237
|
-
}), /* @__PURE__ */
|
|
261
|
+
}), /* @__PURE__ */ C("dd", {
|
|
238
262
|
className: "text-text-primary",
|
|
239
|
-
children:
|
|
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
|
-
|
|
272
|
+
N.brand && /* @__PURE__ */ w("button", {
|
|
249
273
|
type: "button",
|
|
250
|
-
onClick: () =>
|
|
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__ */
|
|
253
|
-
icon: /* @__PURE__ */ b
|
|
254
|
-
seed:
|
|
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__ */
|
|
280
|
+
}), /* @__PURE__ */ w("div", {
|
|
257
281
|
className: "min-w-0",
|
|
258
|
-
children: [/* @__PURE__ */
|
|
282
|
+
children: [/* @__PURE__ */ C("p", {
|
|
259
283
|
className: "truncate text-sm font-medium text-text-primary",
|
|
260
|
-
children:
|
|
261
|
-
}), /* @__PURE__ */
|
|
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 {
|
|
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
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
|
1
|
+
{"version":3,"file":"CollaborationFormPage.d.ts","sourceRoot":"","sources":["../../../../src/coolandlovely/pages/collaborations/CollaborationFormPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgEH,wBAAgB,qBAAqB,gCAoTpC"}
|