@burdenoff/microfe-coolandlovely 2026.706.1 → 2026.706.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.js +14 -6
- package/dist/coolandlovely/CoolAndLovelyRoutes.js.map +1 -1
- package/dist/coolandlovely/components/ActorName.js +29 -0
- package/dist/coolandlovely/components/ActorName.js.map +1 -0
- package/dist/coolandlovely/components/AddToLookbookButton.js +81 -0
- package/dist/coolandlovely/components/AddToLookbookButton.js.map +1 -0
- package/dist/coolandlovely/components/Comments.js +109 -0
- package/dist/coolandlovely/components/Comments.js.map +1 -0
- package/dist/coolandlovely/components/Field.js +22 -2
- package/dist/coolandlovely/components/Field.js.map +1 -1
- package/dist/coolandlovely/components/FileImage.js +17 -0
- package/dist/coolandlovely/components/FileImage.js.map +1 -0
- package/dist/coolandlovely/components/FollowButton.js +24 -0
- package/dist/coolandlovely/components/FollowButton.js.map +1 -0
- package/dist/coolandlovely/components/ImageUploadField.js +71 -0
- package/dist/coolandlovely/components/ImageUploadField.js.map +1 -0
- package/dist/coolandlovely/components/Thumbnail.js +20 -13
- package/dist/coolandlovely/components/Thumbnail.js.map +1 -1
- package/dist/coolandlovely/hooks/index.js +2 -0
- package/dist/coolandlovely/hooks/useComments.js +68 -0
- package/dist/coolandlovely/hooks/useComments.js.map +1 -0
- package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js +74 -4
- package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js.map +1 -1
- package/dist/coolandlovely/hooks/useFiles.js +94 -0
- package/dist/coolandlovely/hooks/useFiles.js.map +1 -0
- package/dist/coolandlovely/pages/HomePage.js +105 -87
- package/dist/coolandlovely/pages/HomePage.js.map +1 -1
- package/dist/coolandlovely/pages/brands/BrandDetailPage.js +144 -122
- package/dist/coolandlovely/pages/brands/BrandDetailPage.js.map +1 -1
- package/dist/coolandlovely/pages/brands/BrandFormPage.js +128 -90
- package/dist/coolandlovely/pages/brands/BrandFormPage.js.map +1 -1
- package/dist/coolandlovely/pages/brands/BrandsListPage.js +2 -0
- package/dist/coolandlovely/pages/brands/BrandsListPage.js.map +1 -1
- package/dist/coolandlovely/pages/collections/CollectionDetailPage.js +5 -1
- package/dist/coolandlovely/pages/collections/CollectionDetailPage.js.map +1 -1
- package/dist/coolandlovely/pages/collections/CollectionFormPage.js +117 -102
- package/dist/coolandlovely/pages/collections/CollectionFormPage.js.map +1 -1
- package/dist/coolandlovely/pages/collections/CollectionsListPage.js +2 -0
- package/dist/coolandlovely/pages/collections/CollectionsListPage.js.map +1 -1
- package/dist/coolandlovely/pages/discover/DiscoverPage.js +223 -0
- package/dist/coolandlovely/pages/discover/DiscoverPage.js.map +1 -0
- package/dist/coolandlovely/pages/items/StyleItemDetailPage.js +99 -95
- package/dist/coolandlovely/pages/items/StyleItemDetailPage.js.map +1 -1
- package/dist/coolandlovely/pages/items/StyleItemFormPage.js +144 -130
- package/dist/coolandlovely/pages/items/StyleItemFormPage.js.map +1 -1
- package/dist/coolandlovely/pages/items/StyleItemsListPage.js +2 -0
- package/dist/coolandlovely/pages/items/StyleItemsListPage.js.map +1 -1
- package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js +190 -99
- package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js.map +1 -1
- package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js +81 -68
- package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js.map +1 -1
- package/dist/coolandlovely/pages/looks/LookDetailPage.js +195 -155
- package/dist/coolandlovely/pages/looks/LookDetailPage.js.map +1 -1
- package/dist/coolandlovely/pages/looks/LookFormPage.js +127 -88
- package/dist/coolandlovely/pages/looks/LookFormPage.js.map +1 -1
- package/dist/coolandlovely/pages/looks/LooksListPage.js +2 -0
- package/dist/coolandlovely/pages/looks/LooksListPage.js.map +1 -1
- package/dist/coolandlovely/pages/profile/StyleProfilePage.js +169 -101
- package/dist/coolandlovely/pages/profile/StyleProfilePage.js.map +1 -1
- package/dist/coolandlovely/pages/trends/TrendsPage.js +249 -0
- package/dist/coolandlovely/pages/trends/TrendsPage.js.map +1 -0
- package/dist/coolandlovely/pages/wardrobe/WardrobeFormPage.js +88 -76
- package/dist/coolandlovely/pages/wardrobe/WardrobeFormPage.js.map +1 -1
- package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js +2 -0
- package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,13 +8,14 @@ import { useBrand as s, useTransitionBrand as c } from "../../hooks/useCoolAndLo
|
|
|
8
8
|
import "../../hooks/index.js";
|
|
9
9
|
import { formatDate as l, formatPrice as u, titleCase as d } from "../../utils/formatters.js";
|
|
10
10
|
import { TagList as f } from "../../components/TagList.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
11
|
+
import { Comments as p } from "../../components/Comments.js";
|
|
12
|
+
import { categoryIcon as m } from "../../utils/icons.js";
|
|
13
|
+
import { ArrowLeft as h, ExternalLink as g, Loader2 as _, Pencil as v, Plus as y, Shapes as b, Shirt as x, Star as S, Store as C } from "lucide-react";
|
|
14
|
+
import { useParams as w } from "react-router-dom";
|
|
15
|
+
import { jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
16
|
+
import { GlassCard as D } from "@burdenoff/fe-libs/ui";
|
|
16
17
|
//#region src/coolandlovely/pages/brands/BrandDetailPage.tsx
|
|
17
|
-
var
|
|
18
|
+
var O = {
|
|
18
19
|
DRAFT: ["PENDING_REVIEW", "ARCHIVED"],
|
|
19
20
|
PENDING_REVIEW: [
|
|
20
21
|
"PUBLISHED",
|
|
@@ -25,282 +26,303 @@ var E = {
|
|
|
25
26
|
SUSPENDED: ["PUBLISHED", "ARCHIVED"],
|
|
26
27
|
ARCHIVED: []
|
|
27
28
|
};
|
|
28
|
-
function
|
|
29
|
-
let { brandId:
|
|
30
|
-
if (
|
|
29
|
+
function k() {
|
|
30
|
+
let { brandId: k } = w(), { navigateTo: A } = e(), j = s(k), M = c();
|
|
31
|
+
if (j.isLoading) return /* @__PURE__ */ T(n, {
|
|
31
32
|
title: "Brand",
|
|
32
|
-
children: /* @__PURE__ */
|
|
33
|
+
children: /* @__PURE__ */ T(a, { label: "Loading brand…" })
|
|
33
34
|
});
|
|
34
|
-
if (
|
|
35
|
+
if (j.isError || !j.data) return /* @__PURE__ */ T(n, {
|
|
35
36
|
title: "Brand",
|
|
36
|
-
children: /* @__PURE__ */
|
|
37
|
+
children: /* @__PURE__ */ T(i, {
|
|
37
38
|
title: "Brand not found",
|
|
38
39
|
message: "This storefront could not be loaded or does not exist.",
|
|
39
|
-
onRetry: () => void
|
|
40
|
+
onRetry: () => void j.refetch()
|
|
40
41
|
})
|
|
41
42
|
});
|
|
42
|
-
let
|
|
43
|
-
return /* @__PURE__ */
|
|
44
|
-
title:
|
|
45
|
-
description: `@${
|
|
46
|
-
actions: /* @__PURE__ */
|
|
47
|
-
className: "flex items-center gap-2",
|
|
48
|
-
children: [/* @__PURE__ */
|
|
43
|
+
let N = j.data, P = N.collections ?? [], F = N.items ?? [], I = O[N.status], L = N.websiteUrl && /^https?:\/\//i.test(N.websiteUrl) ? N.websiteUrl : void 0;
|
|
44
|
+
return /* @__PURE__ */ T(n, {
|
|
45
|
+
title: N.name,
|
|
46
|
+
description: `@${N.handle}`,
|
|
47
|
+
actions: /* @__PURE__ */ E("div", {
|
|
48
|
+
className: "flex flex-wrap items-center gap-2",
|
|
49
|
+
children: [/* @__PURE__ */ E("button", {
|
|
49
50
|
type: "button",
|
|
50
|
-
onClick: () =>
|
|
51
|
+
onClick: () => A("/brands"),
|
|
51
52
|
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",
|
|
52
|
-
children: [/* @__PURE__ */
|
|
53
|
-
}), /* @__PURE__ */
|
|
53
|
+
children: [/* @__PURE__ */ T(h, { className: "h-4 w-4" }), " Back"]
|
|
54
|
+
}), /* @__PURE__ */ E("button", {
|
|
54
55
|
type: "button",
|
|
55
|
-
onClick: () =>
|
|
56
|
+
onClick: () => A(`/brands/${N.id}/edit`),
|
|
56
57
|
className: "inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90",
|
|
57
|
-
children: [/* @__PURE__ */
|
|
58
|
+
children: [/* @__PURE__ */ T(v, { className: "h-4 w-4" }), " Edit"]
|
|
58
59
|
})]
|
|
59
60
|
}),
|
|
60
|
-
children: /* @__PURE__ */
|
|
61
|
+
children: /* @__PURE__ */ E("div", {
|
|
61
62
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
62
|
-
children: [/* @__PURE__ */
|
|
63
|
+
children: [/* @__PURE__ */ E("div", {
|
|
63
64
|
className: "lg:col-span-2",
|
|
64
65
|
children: [
|
|
65
|
-
/* @__PURE__ */
|
|
66
|
+
/* @__PURE__ */ E(D, {
|
|
66
67
|
treatment: "glass",
|
|
67
68
|
className: "overflow-hidden p-0",
|
|
68
|
-
children: [/* @__PURE__ */
|
|
69
|
-
icon: /* @__PURE__ */ C
|
|
70
|
-
seed:
|
|
69
|
+
children: [/* @__PURE__ */ T(o, {
|
|
70
|
+
icon: /* @__PURE__ */ T(C, { className: "h-12 w-12" }),
|
|
71
|
+
seed: N.id,
|
|
72
|
+
fileId: N.cover?.id ?? N.logo?.id,
|
|
73
|
+
alt: N.name,
|
|
71
74
|
className: "h-44 w-full"
|
|
72
|
-
}), /* @__PURE__ */
|
|
75
|
+
}), /* @__PURE__ */ E("div", {
|
|
73
76
|
className: "p-6",
|
|
74
77
|
children: [
|
|
75
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ E("div", {
|
|
76
79
|
className: "flex items-center gap-2",
|
|
77
80
|
children: [
|
|
78
|
-
/* @__PURE__ */
|
|
81
|
+
/* @__PURE__ */ T("h2", {
|
|
79
82
|
className: "text-xl font-semibold text-text-primary",
|
|
80
|
-
children:
|
|
83
|
+
children: N.name
|
|
81
84
|
}),
|
|
82
|
-
|
|
83
|
-
/* @__PURE__ */
|
|
84
|
-
status:
|
|
85
|
+
N.isFeatured && /* @__PURE__ */ T(S, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" }),
|
|
86
|
+
/* @__PURE__ */ T(r, {
|
|
87
|
+
status: N.status,
|
|
85
88
|
className: "ml-auto"
|
|
86
89
|
})
|
|
87
90
|
]
|
|
88
91
|
}),
|
|
89
|
-
|
|
92
|
+
N.tagline && /* @__PURE__ */ T("p", {
|
|
90
93
|
className: "mt-2 text-sm text-text-primary",
|
|
91
|
-
children:
|
|
94
|
+
children: N.tagline
|
|
92
95
|
}),
|
|
93
|
-
|
|
96
|
+
N.bio && /* @__PURE__ */ T("p", {
|
|
94
97
|
className: "mt-3 text-sm text-text-secondary",
|
|
95
|
-
children:
|
|
98
|
+
children: N.bio
|
|
96
99
|
}),
|
|
97
|
-
|
|
100
|
+
N.aesthetics.length > 0 && /* @__PURE__ */ E("div", {
|
|
98
101
|
className: "mt-4",
|
|
99
|
-
children: [/* @__PURE__ */
|
|
102
|
+
children: [/* @__PURE__ */ T("p", {
|
|
100
103
|
className: "mb-1.5 text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
101
104
|
children: "Aesthetics"
|
|
102
|
-
}), /* @__PURE__ */
|
|
103
|
-
tags:
|
|
105
|
+
}), /* @__PURE__ */ T(f, {
|
|
106
|
+
tags: N.aesthetics.map(d),
|
|
104
107
|
tone: "accent",
|
|
105
108
|
max: 12
|
|
106
109
|
})]
|
|
107
110
|
}),
|
|
108
|
-
|
|
111
|
+
N.tags.length > 0 && /* @__PURE__ */ E("div", {
|
|
109
112
|
className: "mt-3",
|
|
110
|
-
children: [/* @__PURE__ */
|
|
113
|
+
children: [/* @__PURE__ */ T("p", {
|
|
111
114
|
className: "mb-1.5 text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
112
115
|
children: "Tags"
|
|
113
|
-
}), /* @__PURE__ */
|
|
114
|
-
tags:
|
|
116
|
+
}), /* @__PURE__ */ T(f, {
|
|
117
|
+
tags: N.tags,
|
|
115
118
|
max: 12
|
|
116
119
|
})]
|
|
117
120
|
}),
|
|
118
|
-
|
|
119
|
-
href:
|
|
121
|
+
L ? /* @__PURE__ */ E("a", {
|
|
122
|
+
href: L,
|
|
120
123
|
target: "_blank",
|
|
121
|
-
rel: "noreferrer",
|
|
122
|
-
className: "mt-4 inline-flex items-center gap-1.5 text-sm font-medium text-primary hover:underline",
|
|
124
|
+
rel: "noopener noreferrer",
|
|
125
|
+
className: "mt-4 inline-flex max-w-full items-center gap-1.5 text-sm font-medium text-action-primary-bg hover:underline",
|
|
123
126
|
children: [
|
|
124
|
-
/* @__PURE__ */
|
|
127
|
+
/* @__PURE__ */ T(g, { className: "h-4 w-4 shrink-0" }),
|
|
125
128
|
" ",
|
|
126
|
-
|
|
129
|
+
/* @__PURE__ */ T("span", {
|
|
130
|
+
className: "break-all",
|
|
131
|
+
children: L
|
|
132
|
+
})
|
|
127
133
|
]
|
|
128
|
-
})
|
|
134
|
+
}) : N.websiteUrl ? /* @__PURE__ */ T("p", {
|
|
135
|
+
className: "mt-4 break-all text-sm text-text-secondary",
|
|
136
|
+
children: N.websiteUrl
|
|
137
|
+
}) : null
|
|
129
138
|
]
|
|
130
139
|
})]
|
|
131
140
|
}),
|
|
132
|
-
/* @__PURE__ */
|
|
141
|
+
/* @__PURE__ */ E("section", {
|
|
133
142
|
className: "mt-6",
|
|
134
|
-
children: [/* @__PURE__ */
|
|
135
|
-
className: "mb-3 flex items-center justify-between",
|
|
136
|
-
children: /* @__PURE__ */
|
|
143
|
+
children: [/* @__PURE__ */ E("div", {
|
|
144
|
+
className: "mb-3 flex items-center justify-between gap-2",
|
|
145
|
+
children: [/* @__PURE__ */ E("h3", {
|
|
137
146
|
className: "flex items-center gap-2 text-lg font-semibold text-text-primary",
|
|
138
147
|
children: [
|
|
139
|
-
/* @__PURE__ */
|
|
148
|
+
/* @__PURE__ */ T(b, { className: "h-5 w-5" }),
|
|
140
149
|
" Collections (",
|
|
141
|
-
|
|
150
|
+
P.length,
|
|
142
151
|
")"
|
|
143
152
|
]
|
|
144
|
-
})
|
|
145
|
-
|
|
153
|
+
}), /* @__PURE__ */ E("button", {
|
|
154
|
+
type: "button",
|
|
155
|
+
onClick: () => A(`/collections/new?brandId=${N.id}`),
|
|
156
|
+
className: "inline-flex shrink-0 items-center gap-1.5 rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken",
|
|
157
|
+
children: [/* @__PURE__ */ T(y, { className: "h-4 w-4" }), " Add collection"]
|
|
158
|
+
})]
|
|
159
|
+
}), P.length === 0 ? /* @__PURE__ */ T("p", {
|
|
146
160
|
className: "rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary",
|
|
147
161
|
children: "No collections yet."
|
|
148
|
-
}) : /* @__PURE__ */
|
|
162
|
+
}) : /* @__PURE__ */ T("div", {
|
|
149
163
|
className: "grid grid-cols-1 gap-3 sm:grid-cols-2",
|
|
150
|
-
children:
|
|
164
|
+
children: P.map((e) => /* @__PURE__ */ E("button", {
|
|
151
165
|
type: "button",
|
|
152
|
-
onClick: () =>
|
|
166
|
+
onClick: () => A(`/collections/${e.id}`),
|
|
153
167
|
className: "flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-3 text-left transition-colors hover:bg-bg-sunken/50",
|
|
154
168
|
children: [
|
|
155
|
-
/* @__PURE__ */
|
|
156
|
-
icon: /* @__PURE__ */
|
|
169
|
+
/* @__PURE__ */ T(o, {
|
|
170
|
+
icon: /* @__PURE__ */ T(b, { className: "h-5 w-5" }),
|
|
157
171
|
seed: e.id,
|
|
172
|
+
fileId: e.cover?.id,
|
|
173
|
+
alt: e.name,
|
|
158
174
|
className: "h-11 w-11 shrink-0"
|
|
159
175
|
}),
|
|
160
|
-
/* @__PURE__ */
|
|
176
|
+
/* @__PURE__ */ E("div", {
|
|
161
177
|
className: "min-w-0 flex-1",
|
|
162
|
-
children: [/* @__PURE__ */
|
|
178
|
+
children: [/* @__PURE__ */ T("p", {
|
|
163
179
|
className: "truncate text-sm font-medium text-text-primary",
|
|
164
180
|
children: e.name
|
|
165
|
-
}), /* @__PURE__ */
|
|
181
|
+
}), /* @__PURE__ */ T("p", {
|
|
166
182
|
className: "text-xs text-text-secondary",
|
|
167
183
|
children: d(e.season)
|
|
168
184
|
})]
|
|
169
185
|
}),
|
|
170
|
-
/* @__PURE__ */
|
|
186
|
+
/* @__PURE__ */ T(r, { status: e.status })
|
|
171
187
|
]
|
|
172
188
|
}, e.id))
|
|
173
189
|
})]
|
|
174
190
|
}),
|
|
175
|
-
/* @__PURE__ */
|
|
191
|
+
/* @__PURE__ */ E("section", {
|
|
176
192
|
className: "mt-6",
|
|
177
|
-
children: [/* @__PURE__ */
|
|
193
|
+
children: [/* @__PURE__ */ E("h3", {
|
|
178
194
|
className: "mb-3 flex items-center gap-2 text-lg font-semibold text-text-primary",
|
|
179
195
|
children: [
|
|
180
|
-
/* @__PURE__ */
|
|
196
|
+
/* @__PURE__ */ T(x, { className: "h-5 w-5" }),
|
|
181
197
|
" Style items (",
|
|
182
|
-
|
|
198
|
+
F.length,
|
|
183
199
|
")"
|
|
184
200
|
]
|
|
185
|
-
}),
|
|
201
|
+
}), F.length === 0 ? /* @__PURE__ */ T("p", {
|
|
186
202
|
className: "rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary",
|
|
187
203
|
children: "No items yet."
|
|
188
|
-
}) : /* @__PURE__ */
|
|
204
|
+
}) : /* @__PURE__ */ T("div", {
|
|
189
205
|
className: "grid grid-cols-2 gap-3 sm:grid-cols-3",
|
|
190
|
-
children:
|
|
206
|
+
children: F.map((e) => /* @__PURE__ */ E("button", {
|
|
191
207
|
type: "button",
|
|
192
|
-
onClick: () =>
|
|
208
|
+
onClick: () => A(`/items/${e.id}`),
|
|
193
209
|
className: "overflow-hidden rounded-lg border border-border-seam bg-bg-surface text-left transition-all hover:border-accent-foreground/20 hover:shadow-md",
|
|
194
|
-
children: [/* @__PURE__ */
|
|
195
|
-
icon:
|
|
210
|
+
children: [/* @__PURE__ */ T(o, {
|
|
211
|
+
icon: m(e.category, 24),
|
|
196
212
|
seed: e.id,
|
|
213
|
+
fileId: e.image?.id,
|
|
214
|
+
alt: e.name,
|
|
197
215
|
className: "h-24 w-full"
|
|
198
|
-
}), /* @__PURE__ */
|
|
216
|
+
}), /* @__PURE__ */ E("div", {
|
|
199
217
|
className: "p-3",
|
|
200
|
-
children: [/* @__PURE__ */
|
|
218
|
+
children: [/* @__PURE__ */ T("p", {
|
|
201
219
|
className: "truncate text-sm font-medium text-text-primary",
|
|
202
220
|
children: e.name
|
|
203
|
-
}), /* @__PURE__ */
|
|
221
|
+
}), /* @__PURE__ */ T("p", {
|
|
204
222
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
205
223
|
children: u(e.price, e.currency)
|
|
206
224
|
})]
|
|
207
225
|
})]
|
|
208
226
|
}, e.id))
|
|
209
227
|
})]
|
|
228
|
+
}),
|
|
229
|
+
/* @__PURE__ */ T(p, {
|
|
230
|
+
entityType: "CooBrand",
|
|
231
|
+
entityId: N.id
|
|
210
232
|
})
|
|
211
233
|
]
|
|
212
|
-
}), /* @__PURE__ */
|
|
234
|
+
}), /* @__PURE__ */ E("div", {
|
|
213
235
|
className: "space-y-4",
|
|
214
|
-
children: [/* @__PURE__ */
|
|
236
|
+
children: [/* @__PURE__ */ E(D, {
|
|
215
237
|
treatment: "insight",
|
|
216
238
|
className: "p-5",
|
|
217
239
|
children: [
|
|
218
|
-
/* @__PURE__ */
|
|
240
|
+
/* @__PURE__ */ T("h3", {
|
|
219
241
|
className: "mb-3 text-sm font-semibold text-text-primary",
|
|
220
242
|
children: "Lifecycle"
|
|
221
243
|
}),
|
|
222
|
-
/* @__PURE__ */
|
|
244
|
+
/* @__PURE__ */ E("div", {
|
|
223
245
|
className: "mb-3 flex items-center gap-2",
|
|
224
|
-
children: [/* @__PURE__ */
|
|
246
|
+
children: [/* @__PURE__ */ T("span", {
|
|
225
247
|
className: "text-sm text-text-secondary",
|
|
226
248
|
children: "Current:"
|
|
227
|
-
}), /* @__PURE__ */
|
|
249
|
+
}), /* @__PURE__ */ T(r, { status: N.status })]
|
|
228
250
|
}),
|
|
229
|
-
|
|
251
|
+
I.length === 0 ? /* @__PURE__ */ T("p", {
|
|
230
252
|
className: "text-xs text-text-secondary",
|
|
231
253
|
children: "This brand is archived (terminal state)."
|
|
232
|
-
}) : /* @__PURE__ */
|
|
254
|
+
}) : /* @__PURE__ */ T("div", {
|
|
233
255
|
className: "flex flex-col gap-2",
|
|
234
|
-
children:
|
|
256
|
+
children: I.map((e) => /* @__PURE__ */ E("button", {
|
|
235
257
|
type: "button",
|
|
236
|
-
disabled:
|
|
237
|
-
onClick: () =>
|
|
238
|
-
id:
|
|
258
|
+
disabled: M.isPending,
|
|
259
|
+
onClick: () => M.mutate({
|
|
260
|
+
id: N.id,
|
|
239
261
|
status: e
|
|
240
262
|
}),
|
|
241
263
|
className: t("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"),
|
|
242
264
|
children: [
|
|
243
|
-
|
|
265
|
+
M.isPending && /* @__PURE__ */ T(_, { className: "h-3.5 w-3.5 animate-spin" }),
|
|
244
266
|
"Move to ",
|
|
245
267
|
d(e)
|
|
246
268
|
]
|
|
247
269
|
}, e))
|
|
248
270
|
}),
|
|
249
|
-
|
|
271
|
+
M.isError && /* @__PURE__ */ T("p", {
|
|
250
272
|
className: "mt-2 text-xs text-status-error-text",
|
|
251
|
-
children:
|
|
273
|
+
children: M.error instanceof Error ? M.error.message : "Transition failed"
|
|
252
274
|
})
|
|
253
275
|
]
|
|
254
|
-
}), /* @__PURE__ */
|
|
276
|
+
}), /* @__PURE__ */ E(D, {
|
|
255
277
|
treatment: "plain",
|
|
256
278
|
className: "p-5",
|
|
257
|
-
children: [/* @__PURE__ */
|
|
279
|
+
children: [/* @__PURE__ */ T("h3", {
|
|
258
280
|
className: "mb-3 text-sm font-semibold text-text-primary",
|
|
259
281
|
children: "Details"
|
|
260
|
-
}), /* @__PURE__ */
|
|
282
|
+
}), /* @__PURE__ */ E("dl", {
|
|
261
283
|
className: "space-y-2 text-sm",
|
|
262
284
|
children: [
|
|
263
|
-
/* @__PURE__ */
|
|
285
|
+
/* @__PURE__ */ E("div", {
|
|
264
286
|
className: "flex justify-between gap-2",
|
|
265
|
-
children: [/* @__PURE__ */
|
|
287
|
+
children: [/* @__PURE__ */ T("dt", {
|
|
266
288
|
className: "text-text-secondary",
|
|
267
289
|
children: "Handle"
|
|
268
|
-
}), /* @__PURE__ */
|
|
290
|
+
}), /* @__PURE__ */ E("dd", {
|
|
269
291
|
className: "text-text-primary",
|
|
270
|
-
children: ["@",
|
|
292
|
+
children: ["@", N.handle]
|
|
271
293
|
})]
|
|
272
294
|
}),
|
|
273
|
-
/* @__PURE__ */
|
|
295
|
+
/* @__PURE__ */ E("div", {
|
|
274
296
|
className: "flex justify-between gap-2",
|
|
275
|
-
children: [/* @__PURE__ */
|
|
297
|
+
children: [/* @__PURE__ */ T("dt", {
|
|
276
298
|
className: "text-text-secondary",
|
|
277
299
|
children: "Featured"
|
|
278
|
-
}), /* @__PURE__ */
|
|
300
|
+
}), /* @__PURE__ */ T("dd", {
|
|
279
301
|
className: "text-text-primary",
|
|
280
|
-
children:
|
|
302
|
+
children: N.isFeatured ? "Yes" : "No"
|
|
281
303
|
})]
|
|
282
304
|
}),
|
|
283
|
-
/* @__PURE__ */
|
|
305
|
+
/* @__PURE__ */ E("div", {
|
|
284
306
|
className: "flex justify-between gap-2",
|
|
285
|
-
children: [/* @__PURE__ */
|
|
307
|
+
children: [/* @__PURE__ */ T("dt", {
|
|
286
308
|
className: "text-text-secondary",
|
|
287
309
|
children: "Created"
|
|
288
|
-
}), /* @__PURE__ */
|
|
310
|
+
}), /* @__PURE__ */ T("dd", {
|
|
289
311
|
className: "text-text-primary",
|
|
290
|
-
children: l(
|
|
312
|
+
children: l(N.createdAt, {
|
|
291
313
|
hour: void 0,
|
|
292
314
|
minute: void 0
|
|
293
315
|
})
|
|
294
316
|
})]
|
|
295
317
|
}),
|
|
296
|
-
/* @__PURE__ */
|
|
318
|
+
/* @__PURE__ */ E("div", {
|
|
297
319
|
className: "flex justify-between gap-2",
|
|
298
|
-
children: [/* @__PURE__ */
|
|
320
|
+
children: [/* @__PURE__ */ T("dt", {
|
|
299
321
|
className: "text-text-secondary",
|
|
300
322
|
children: "Updated"
|
|
301
|
-
}), /* @__PURE__ */
|
|
323
|
+
}), /* @__PURE__ */ T("dd", {
|
|
302
324
|
className: "text-text-primary",
|
|
303
|
-
children: l(
|
|
325
|
+
children: l(N.updatedAt, {
|
|
304
326
|
hour: void 0,
|
|
305
327
|
minute: void 0
|
|
306
328
|
})
|
|
@@ -314,6 +336,6 @@ function D() {
|
|
|
314
336
|
});
|
|
315
337
|
}
|
|
316
338
|
//#endregion
|
|
317
|
-
export {
|
|
339
|
+
export { k as BrandDetailPage };
|
|
318
340
|
|
|
319
341
|
//# sourceMappingURL=BrandDetailPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrandDetailPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/brands/BrandDetailPage.tsx"],"sourcesContent":["/**\n * Brand Detail Page\n * @module coolandlovely/pages/brands\n *\n * Renders a single brand storefront (`cooBrand`) with its publish-lifecycle\n * transitions (`cooTransitionBrand`), collections and style items.\n */\n\nimport { useParams } from 'react-router-dom';\nimport { Store, Star, ExternalLink, Pencil, ArrowLeft, Shapes, Shirt, Loader2 } 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 { TagList } from '../../components/TagList';\nimport { useCoolAndLovely } from '../../context/CoolAndLovelyContext';\nimport { useBrand, useTransitionBrand } from '../../hooks';\nimport { categoryIcon } from '../../utils/icons';\nimport { formatPrice, formatDate, titleCase } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\nimport type { CooBrandStatus } from '../../types';\n\n/** Allowed next states per the svc brand state machine (UX guidance only;\n * the service is the authority and rejects illegal jumps). */\nconst NEXT_STATES: Record<CooBrandStatus, CooBrandStatus[]> = {\n DRAFT: ['PENDING_REVIEW', 'ARCHIVED'],\n PENDING_REVIEW: ['PUBLISHED', 'DRAFT', 'ARCHIVED'],\n PUBLISHED: ['SUSPENDED', 'ARCHIVED'],\n SUSPENDED: ['PUBLISHED', 'ARCHIVED'],\n ARCHIVED: [],\n};\n\nexport function BrandDetailPage() {\n const { brandId } = useParams<{ brandId: string }>();\n const { navigateTo } = useCoolAndLovely();\n const query = useBrand(brandId);\n const transition = useTransitionBrand();\n\n if (query.isLoading) {\n return (\n <PageLayout title=\"Brand\">\n <LoadingView label=\"Loading brand…\" />\n </PageLayout>\n );\n }\n\n if (query.isError || !query.data) {\n return (\n <PageLayout title=\"Brand\">\n <ErrorView\n title=\"Brand not found\"\n message=\"This storefront could not be loaded or does not exist.\"\n onRetry={() => void query.refetch()}\n />\n </PageLayout>\n );\n }\n\n const brand = query.data;\n const collections = brand.collections ?? [];\n const items = brand.items ?? [];\n const nextStates = NEXT_STATES[brand.status];\n\n return (\n <PageLayout\n title={brand.name}\n description={`@${brand.handle}`}\n actions={\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/brands')}\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 <button\n type=\"button\"\n onClick={() => navigateTo(`/brands/${brand.id}/edit`)}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90\"\n >\n <Pencil className=\"h-4 w-4\" /> Edit\n </button>\n </div>\n }\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Main column */}\n <div className=\"lg:col-span-2\">\n <GlassCard treatment=\"glass\" className=\"overflow-hidden p-0\">\n <Thumbnail\n icon={<Store className=\"h-12 w-12\" />}\n seed={brand.id}\n className=\"h-44 w-full\"\n />\n <div className=\"p-6\">\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-xl font-semibold text-text-primary\">{brand.name}</h2>\n {brand.isFeatured && (\n <Star className=\"h-4 w-4 fill-status-warning-text text-status-warning-text\" />\n )}\n <StatusBadge status={brand.status} className=\"ml-auto\" />\n </div>\n {brand.tagline && <p className=\"mt-2 text-sm text-text-primary\">{brand.tagline}</p>}\n {brand.bio && <p className=\"mt-3 text-sm text-text-secondary\">{brand.bio}</p>}\n\n {brand.aesthetics.length > 0 && (\n <div className=\"mt-4\">\n <p className=\"mb-1.5 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Aesthetics\n </p>\n <TagList tags={brand.aesthetics.map(titleCase)} tone=\"accent\" max={12} />\n </div>\n )}\n {brand.tags.length > 0 && (\n <div className=\"mt-3\">\n <p className=\"mb-1.5 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Tags\n </p>\n <TagList tags={brand.tags} max={12} />\n </div>\n )}\n {brand.websiteUrl && (\n <a\n href={brand.websiteUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"mt-4 inline-flex items-center gap-1.5 text-sm font-medium text-primary hover:underline\"\n >\n <ExternalLink className=\"h-4 w-4\" /> {brand.websiteUrl}\n </a>\n )}\n </div>\n </GlassCard>\n\n {/* Collections */}\n <section className=\"mt-6\">\n <div className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"flex items-center gap-2 text-lg font-semibold text-text-primary\">\n <Shapes className=\"h-5 w-5\" /> Collections ({collections.length})\n </h3>\n </div>\n {collections.length === 0 ? (\n <p className=\"rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary\">\n No collections yet.\n </p>\n ) : (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {collections.map((c) => (\n <button\n key={c.id}\n type=\"button\"\n onClick={() => navigateTo(`/collections/${c.id}`)}\n className=\"flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-3 text-left transition-colors hover:bg-bg-sunken/50\"\n >\n <Thumbnail\n icon={<Shapes className=\"h-5 w-5\" />}\n seed={c.id}\n className=\"h-11 w-11 shrink-0\"\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{c.name}</p>\n <p className=\"text-xs text-text-secondary\">{titleCase(c.season)}</p>\n </div>\n <StatusBadge status={c.status} />\n </button>\n ))}\n </div>\n )}\n </section>\n\n {/* Items */}\n <section className=\"mt-6\">\n <h3 className=\"mb-3 flex items-center gap-2 text-lg font-semibold text-text-primary\">\n <Shirt className=\"h-5 w-5\" /> Style items ({items.length})\n </h3>\n {items.length === 0 ? (\n <p className=\"rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary\">\n No items yet.\n </p>\n ) : (\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => navigateTo(`/items/${item.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={categoryIcon(item.category, 24)}\n seed={item.id}\n className=\"h-24 w-full\"\n />\n <div className=\"p-3\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{item.name}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {formatPrice(item.price, item.currency)}\n </p>\n </div>\n </button>\n ))}\n </div>\n )}\n </section>\n </div>\n\n {/* Sidebar */}\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 <div className=\"mb-3 flex items-center gap-2\">\n <span className=\"text-sm text-text-secondary\">Current:</span>\n <StatusBadge status={brand.status} />\n </div>\n {nextStates.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n This brand is archived (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: brand.id, status: next })}\n className={cn(\n '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 >\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\">Details</h3>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Handle</dt>\n <dd className=\"text-text-primary\">@{brand.handle}</dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Featured</dt>\n <dd className=\"text-text-primary\">{brand.isFeatured ? 'Yes' : 'No'}</dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Created</dt>\n <dd className=\"text-text-primary\">\n {formatDate(brand.createdAt, { hour: undefined, minute: undefined })}\n </dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Updated</dt>\n <dd className=\"text-text-primary\">\n {formatDate(brand.updatedAt, { hour: undefined, minute: undefined })}\n </dd>\n </div>\n </dl>\n </GlassCard>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BrandDetailPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/brands/BrandDetailPage.tsx"],"sourcesContent":["/**\n * Brand Detail Page\n * @module coolandlovely/pages/brands\n *\n * Renders a single brand storefront (`cooBrand`) with its publish-lifecycle\n * transitions (`cooTransitionBrand`), collections and style items.\n */\n\nimport { useParams } from 'react-router-dom';\nimport {\n Store,\n Star,\n ExternalLink,\n Pencil,\n ArrowLeft,\n Shapes,\n Shirt,\n Loader2,\n Plus,\n} 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 { TagList } from '../../components/TagList';\nimport { Comments } from '../../components/Comments';\nimport { useCoolAndLovely } from '../../context/CoolAndLovelyContext';\nimport { useBrand, useTransitionBrand } from '../../hooks';\nimport { categoryIcon } from '../../utils/icons';\nimport { formatPrice, formatDate, titleCase } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\nimport type { CooBrandStatus } from '../../types';\n\n/** Allowed next states per the svc brand state machine (UX guidance only;\n * the service is the authority and rejects illegal jumps). */\nconst NEXT_STATES: Record<CooBrandStatus, CooBrandStatus[]> = {\n DRAFT: ['PENDING_REVIEW', 'ARCHIVED'],\n PENDING_REVIEW: ['PUBLISHED', 'DRAFT', 'ARCHIVED'],\n PUBLISHED: ['SUSPENDED', 'ARCHIVED'],\n SUSPENDED: ['PUBLISHED', 'ARCHIVED'],\n ARCHIVED: [],\n};\n\nexport function BrandDetailPage() {\n const { brandId } = useParams<{ brandId: string }>();\n const { navigateTo } = useCoolAndLovely();\n const query = useBrand(brandId);\n const transition = useTransitionBrand();\n\n if (query.isLoading) {\n return (\n <PageLayout title=\"Brand\">\n <LoadingView label=\"Loading brand…\" />\n </PageLayout>\n );\n }\n\n if (query.isError || !query.data) {\n return (\n <PageLayout title=\"Brand\">\n <ErrorView\n title=\"Brand not found\"\n message=\"This storefront could not be loaded or does not exist.\"\n onRetry={() => void query.refetch()}\n />\n </PageLayout>\n );\n }\n\n const brand = query.data;\n const collections = brand.collections ?? [];\n const items = brand.items ?? [];\n const nextStates = NEXT_STATES[brand.status];\n // Only render a website link for safe http(s) URLs (block javascript:/data: sinks).\n const safeWebsiteUrl =\n brand.websiteUrl && /^https?:\\/\\//i.test(brand.websiteUrl) ? brand.websiteUrl : undefined;\n\n return (\n <PageLayout\n title={brand.name}\n description={`@${brand.handle}`}\n actions={\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/brands')}\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 <button\n type=\"button\"\n onClick={() => navigateTo(`/brands/${brand.id}/edit`)}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90\"\n >\n <Pencil className=\"h-4 w-4\" /> Edit\n </button>\n </div>\n }\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Main column */}\n <div className=\"lg:col-span-2\">\n <GlassCard treatment=\"glass\" className=\"overflow-hidden p-0\">\n <Thumbnail\n icon={<Store className=\"h-12 w-12\" />}\n seed={brand.id}\n fileId={brand.cover?.id ?? brand.logo?.id}\n alt={brand.name}\n className=\"h-44 w-full\"\n />\n <div className=\"p-6\">\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-xl font-semibold text-text-primary\">{brand.name}</h2>\n {brand.isFeatured && (\n <Star className=\"h-4 w-4 fill-status-warning-text text-status-warning-text\" />\n )}\n <StatusBadge status={brand.status} className=\"ml-auto\" />\n </div>\n {brand.tagline && <p className=\"mt-2 text-sm text-text-primary\">{brand.tagline}</p>}\n {brand.bio && <p className=\"mt-3 text-sm text-text-secondary\">{brand.bio}</p>}\n\n {brand.aesthetics.length > 0 && (\n <div className=\"mt-4\">\n <p className=\"mb-1.5 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Aesthetics\n </p>\n <TagList tags={brand.aesthetics.map(titleCase)} tone=\"accent\" max={12} />\n </div>\n )}\n {brand.tags.length > 0 && (\n <div className=\"mt-3\">\n <p className=\"mb-1.5 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Tags\n </p>\n <TagList tags={brand.tags} max={12} />\n </div>\n )}\n {safeWebsiteUrl ? (\n <a\n href={safeWebsiteUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-4 inline-flex max-w-full items-center gap-1.5 text-sm font-medium text-action-primary-bg hover:underline\"\n >\n <ExternalLink className=\"h-4 w-4 shrink-0\" />{' '}\n <span className=\"break-all\">{safeWebsiteUrl}</span>\n </a>\n ) : brand.websiteUrl ? (\n <p className=\"mt-4 break-all text-sm text-text-secondary\">{brand.websiteUrl}</p>\n ) : null}\n </div>\n </GlassCard>\n\n {/* Collections */}\n <section className=\"mt-6\">\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <h3 className=\"flex items-center gap-2 text-lg font-semibold text-text-primary\">\n <Shapes className=\"h-5 w-5\" /> Collections ({collections.length})\n </h3>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/collections/new?brandId=${brand.id}`)}\n className=\"inline-flex shrink-0 items-center gap-1.5 rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <Plus className=\"h-4 w-4\" /> Add collection\n </button>\n </div>\n {collections.length === 0 ? (\n <p className=\"rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary\">\n No collections yet.\n </p>\n ) : (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {collections.map((c) => (\n <button\n key={c.id}\n type=\"button\"\n onClick={() => navigateTo(`/collections/${c.id}`)}\n className=\"flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-3 text-left transition-colors hover:bg-bg-sunken/50\"\n >\n <Thumbnail\n icon={<Shapes className=\"h-5 w-5\" />}\n seed={c.id}\n fileId={c.cover?.id}\n alt={c.name}\n className=\"h-11 w-11 shrink-0\"\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{c.name}</p>\n <p className=\"text-xs text-text-secondary\">{titleCase(c.season)}</p>\n </div>\n <StatusBadge status={c.status} />\n </button>\n ))}\n </div>\n )}\n </section>\n\n {/* Items */}\n <section className=\"mt-6\">\n <h3 className=\"mb-3 flex items-center gap-2 text-lg font-semibold text-text-primary\">\n <Shirt className=\"h-5 w-5\" /> Style items ({items.length})\n </h3>\n {items.length === 0 ? (\n <p className=\"rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary\">\n No items yet.\n </p>\n ) : (\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => navigateTo(`/items/${item.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={categoryIcon(item.category, 24)}\n seed={item.id}\n fileId={item.image?.id}\n alt={item.name}\n className=\"h-24 w-full\"\n />\n <div className=\"p-3\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{item.name}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {formatPrice(item.price, item.currency)}\n </p>\n </div>\n </button>\n ))}\n </div>\n )}\n </section>\n\n <Comments entityType=\"CooBrand\" entityId={brand.id} />\n </div>\n\n {/* Sidebar */}\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 <div className=\"mb-3 flex items-center gap-2\">\n <span className=\"text-sm text-text-secondary\">Current:</span>\n <StatusBadge status={brand.status} />\n </div>\n {nextStates.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n This brand is archived (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: brand.id, status: next })}\n className={cn(\n '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 >\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\">Details</h3>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Handle</dt>\n <dd className=\"text-text-primary\">@{brand.handle}</dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Featured</dt>\n <dd className=\"text-text-primary\">{brand.isFeatured ? 'Yes' : 'No'}</dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Created</dt>\n <dd className=\"text-text-primary\">\n {formatDate(brand.createdAt, { hour: undefined, minute: undefined })}\n </dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Updated</dt>\n <dd className=\"text-text-primary\">\n {formatDate(brand.updatedAt, { hour: undefined, minute: undefined })}\n </dd>\n </div>\n </dl>\n </GlassCard>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|