@burdenoff/microfe-coolandlovely 2026.805.1 → 2026.820.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/CoolAndLovelyRoot.d.ts.map +1 -1
- package/dist/coolandlovely/CoolAndLovelyRoot.js +60 -58
- package/dist/coolandlovely/CoolAndLovelyRoot.js.map +1 -1
- package/dist/coolandlovely/components/AddToLookbookButton.d.ts.map +1 -1
- package/dist/coolandlovely/components/AddToLookbookButton.js +1 -0
- package/dist/coolandlovely/components/AddToLookbookButton.js.map +1 -1
- package/dist/coolandlovely/components/BrandCard.d.ts +11 -0
- package/dist/coolandlovely/components/BrandCard.d.ts.map +1 -0
- package/dist/coolandlovely/components/BrandCard.js +55 -0
- package/dist/coolandlovely/components/BrandCard.js.map +1 -0
- package/dist/coolandlovely/components/CollectionCard.d.ts +11 -0
- package/dist/coolandlovely/components/CollectionCard.d.ts.map +1 -0
- package/dist/coolandlovely/components/CollectionCard.js +60 -0
- package/dist/coolandlovely/components/CollectionCard.js.map +1 -0
- package/dist/coolandlovely/components/FeedbackWidget.d.ts +4 -0
- package/dist/coolandlovely/components/FeedbackWidget.d.ts.map +1 -0
- package/dist/coolandlovely/components/FeedbackWidget.js +134 -0
- package/dist/coolandlovely/components/FeedbackWidget.js.map +1 -0
- package/dist/coolandlovely/components/LookbookCard.d.ts +11 -0
- package/dist/coolandlovely/components/LookbookCard.d.ts.map +1 -0
- package/dist/coolandlovely/components/LookbookCard.js +60 -0
- package/dist/coolandlovely/components/LookbookCard.js.map +1 -0
- package/dist/coolandlovely/components/WardrobeItemCard.d.ts +14 -0
- package/dist/coolandlovely/components/WardrobeItemCard.d.ts.map +1 -0
- package/dist/coolandlovely/components/WardrobeItemCard.js +92 -0
- package/dist/coolandlovely/components/WardrobeItemCard.js.map +1 -0
- package/dist/coolandlovely/components/index.d.ts +5 -0
- package/dist/coolandlovely/components/index.d.ts.map +1 -1
- package/dist/coolandlovely/components/index.js +26 -0
- package/dist/coolandlovely/pages/HomePage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/HomePage.js +10 -4
- package/dist/coolandlovely/pages/HomePage.js.map +1 -1
- package/dist/coolandlovely/pages/brands/BrandDetailPage.js +7 -7
- package/dist/coolandlovely/pages/brands/BrandsListPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/brands/BrandsListPage.js +48 -89
- package/dist/coolandlovely/pages/brands/BrandsListPage.js.map +1 -1
- package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js +4 -4
- package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js +13 -13
- package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js +4 -4
- package/dist/coolandlovely/pages/collections/CollectionsListPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/collections/CollectionsListPage.js +28 -74
- package/dist/coolandlovely/pages/collections/CollectionsListPage.js.map +1 -1
- package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js +5 -5
- package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js +66 -112
- package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js.map +1 -1
- package/dist/coolandlovely/pages/profile/StyleProfilePage.js +124 -124
- package/dist/coolandlovely/pages/profile/StyleProfilePage.js.map +1 -1
- package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.d.ts.map +1 -1
- package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js +46 -120
- package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js.map +1 -1
- package/dist/stories/BrandCard.stories.d.ts +10 -0
- package/dist/stories/BrandCard.stories.d.ts.map +1 -0
- package/dist/stories/CollectionCard.stories.d.ts +10 -0
- package/dist/stories/CollectionCard.stories.d.ts.map +1 -0
- package/dist/stories/FeedbackWidget.stories.d.ts +9 -0
- package/dist/stories/FeedbackWidget.stories.d.ts.map +1 -0
- package/dist/stories/LookCard.stories.d.ts +10 -0
- package/dist/stories/LookCard.stories.d.ts.map +1 -0
- package/dist/stories/LookbookCard.stories.d.ts +10 -0
- package/dist/stories/LookbookCard.stories.d.ts.map +1 -0
- package/dist/stories/WardrobeItemCard.stories.d.ts +11 -0
- package/dist/stories/WardrobeItemCard.stories.d.ts.map +1 -0
- package/dist/stories/__fixtures__/coolandlovely.d.ts +13 -0
- package/dist/stories/__fixtures__/coolandlovely.d.ts.map +1 -0
- package/package.json +4 -1
|
@@ -5,8 +5,8 @@ import { Thumbnail as i } from "../../components/Thumbnail.js";
|
|
|
5
5
|
import { useAddLookbookEntry as a, useDeleteLookbook as o, useLookbook as s, useLooks as c, useRemoveLookbookEntry as l, useStyleItems as ee } from "../../hooks/useCoolAndLovelyApi.js";
|
|
6
6
|
import { formatRelativeTime as u } from "../../utils/formatters.js";
|
|
7
7
|
import "../../hooks/index.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { SelectField as d, TextField as f } from "../../components/Field.js";
|
|
9
|
+
import { TagList as p } from "../../components/TagList.js";
|
|
10
10
|
import { VisibilityChip as m } from "../../components/VisibilityChip.js";
|
|
11
11
|
import { useMemo as h, useState as g } from "react";
|
|
12
12
|
import { ArrowLeft as _, BookHeart as v, Clock as y, Loader2 as b, Plus as x, Sparkles as S, Tag as C, Trash2 as w, X as T } from "lucide-react";
|
|
@@ -116,7 +116,7 @@ function j() {
|
|
|
116
116
|
]
|
|
117
117
|
})]
|
|
118
118
|
})]
|
|
119
|
-
}), Q.tags.length > 0 && /* @__PURE__ */ D(
|
|
119
|
+
}), Q.tags.length > 0 && /* @__PURE__ */ D(p, {
|
|
120
120
|
tags: Q.tags,
|
|
121
121
|
className: "mt-4"
|
|
122
122
|
})]
|
|
@@ -152,14 +152,14 @@ function j() {
|
|
|
152
152
|
children: e === "look" ? "Save a look" : "Clip a piece"
|
|
153
153
|
}, e))
|
|
154
154
|
}),
|
|
155
|
-
/* @__PURE__ */ D(
|
|
155
|
+
/* @__PURE__ */ D(d, {
|
|
156
156
|
label: z === "look" ? "Look" : "Style item",
|
|
157
157
|
value: V,
|
|
158
158
|
onChange: H,
|
|
159
159
|
options: z === "look" ? X : Z,
|
|
160
160
|
placeholder: z === "look" ? G.isLoading ? "Loading looks…" : "Select a look" : K.isLoading ? "Loading items…" : "Select a style item"
|
|
161
161
|
}),
|
|
162
|
-
/* @__PURE__ */ D(
|
|
162
|
+
/* @__PURE__ */ D(f, {
|
|
163
163
|
label: "Note (optional)",
|
|
164
164
|
value: U,
|
|
165
165
|
onChange: W,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LookbooksListPage.d.ts","sourceRoot":"","sources":["../../../../src/coolandlovely/pages/lookbooks/LookbooksListPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"LookbooksListPage.d.ts","sourceRoot":"","sources":["../../../../src/coolandlovely/pages/lookbooks/LookbooksListPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,wBAAgB,iBAAiB,gCAoKhC"}
|
|
@@ -2,184 +2,138 @@ import { useCoolAndLovely as e } from "../../context/CoolAndLovelyContext.js";
|
|
|
2
2
|
import { PageLayout as t } from "../../components/PageLayout.js";
|
|
3
3
|
import { ErrorView as n, LoadingView as r } from "../../components/StateViews.js";
|
|
4
4
|
import { COO_FILE_FOLDERS as i } from "../../hooks/useFiles.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { parseCsv as c, titleCase as l } from "../../utils/formatters.js";
|
|
5
|
+
import { useCreateLookbook as a, useLookbooks as o } from "../../hooks/useCoolAndLovelyApi.js";
|
|
6
|
+
import { parseCsv as s, titleCase as c } from "../../utils/formatters.js";
|
|
8
7
|
import "../../hooks/index.js";
|
|
9
|
-
import {
|
|
10
|
-
import { SelectField as
|
|
11
|
-
import { ImageUploadField as
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import { GlassCard as w } from "@burdenoff/fe-libs/ui";
|
|
8
|
+
import { EmptyState as l } from "../../components/EmptyState.js";
|
|
9
|
+
import { SelectField as u, TextAreaField as d, TextField as f } from "../../components/Field.js";
|
|
10
|
+
import { ImageUploadField as p } from "../../components/ImageUploadField.js";
|
|
11
|
+
import { LookbookCard as m } from "../../components/LookbookCard.js";
|
|
12
|
+
import { useState as h } from "react";
|
|
13
|
+
import { BookHeart as g, Loader2 as _, Plus as v, X as y } from "lucide-react";
|
|
14
|
+
import { jsx as b, jsxs as x } from "react/jsx-runtime";
|
|
15
|
+
import { GlassCard as S } from "@burdenoff/fe-libs/ui";
|
|
18
16
|
//#region src/coolandlovely/pages/lookbooks/LookbooksListPage.tsx
|
|
19
|
-
var
|
|
17
|
+
var C = [
|
|
20
18
|
"PRIVATE",
|
|
21
19
|
"FOLLOWERS",
|
|
22
20
|
"PUBLIC"
|
|
23
21
|
];
|
|
24
|
-
function
|
|
25
|
-
let { navigateTo:
|
|
22
|
+
function w() {
|
|
23
|
+
let { navigateTo: w } = e(), T = o(), E = a(), [D, O] = h(!1), [k, A] = h(""), [j, M] = h(""), [N, P] = h("PRIVATE"), [F, I] = h(""), [L, R] = h(""), [z, B] = h(), V = T.data ?? [], H = C.map((e) => ({
|
|
26
24
|
value: e,
|
|
27
|
-
label:
|
|
25
|
+
label: c(e)
|
|
28
26
|
}));
|
|
29
|
-
return /* @__PURE__ */
|
|
27
|
+
return /* @__PURE__ */ x(t, {
|
|
30
28
|
title: "Lookbooks",
|
|
31
29
|
description: "Themed boards of saved catalogue pieces and looks",
|
|
32
|
-
actions: /* @__PURE__ */
|
|
30
|
+
actions: /* @__PURE__ */ x("button", {
|
|
33
31
|
type: "button",
|
|
34
|
-
onClick: () =>
|
|
32
|
+
onClick: () => O((e) => !e),
|
|
35
33
|
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",
|
|
36
|
-
children: [
|
|
34
|
+
children: [b(D ? y : v, { className: "h-4 w-4" }), D ? "Close" : "New lookbook"]
|
|
37
35
|
}),
|
|
38
|
-
children: [
|
|
36
|
+
children: [D && /* @__PURE__ */ b("form", {
|
|
39
37
|
onSubmit: (e) => {
|
|
40
|
-
if (e.preventDefault(), !
|
|
41
|
-
|
|
38
|
+
if (e.preventDefault(), !k.trim()) {
|
|
39
|
+
B("Name is required");
|
|
42
40
|
return;
|
|
43
41
|
}
|
|
44
|
-
|
|
45
|
-
name:
|
|
46
|
-
description:
|
|
47
|
-
visibility:
|
|
48
|
-
tags:
|
|
49
|
-
coverFileId:
|
|
42
|
+
B(void 0), E.mutate({
|
|
43
|
+
name: k.trim(),
|
|
44
|
+
description: j.trim() || void 0,
|
|
45
|
+
visibility: N,
|
|
46
|
+
tags: s(F),
|
|
47
|
+
coverFileId: L || void 0
|
|
50
48
|
}, { onSuccess: (e) => {
|
|
51
|
-
|
|
49
|
+
O(!1), A(""), M(""), I(""), P("PRIVATE"), R(""), w(`/lookbooks/${e.id}`);
|
|
52
50
|
} });
|
|
53
51
|
},
|
|
54
52
|
className: "mb-6",
|
|
55
|
-
children: /* @__PURE__ */
|
|
53
|
+
children: /* @__PURE__ */ x(S, {
|
|
56
54
|
treatment: "plain",
|
|
57
55
|
className: "p-5",
|
|
58
56
|
children: [
|
|
59
|
-
/* @__PURE__ */
|
|
57
|
+
/* @__PURE__ */ x("h2", {
|
|
60
58
|
className: "mb-4 flex items-center gap-2 text-base font-semibold text-text-primary",
|
|
61
|
-
children: [/* @__PURE__ */
|
|
59
|
+
children: [/* @__PURE__ */ b(g, { className: "h-5 w-5" }), " New lookbook"]
|
|
62
60
|
}),
|
|
63
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ x("div", {
|
|
64
62
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
65
|
-
children: [/* @__PURE__ */
|
|
63
|
+
children: [/* @__PURE__ */ b(f, {
|
|
66
64
|
label: "Name",
|
|
67
|
-
value:
|
|
68
|
-
onChange:
|
|
65
|
+
value: k,
|
|
66
|
+
onChange: A,
|
|
69
67
|
placeholder: "Summer wedding guest",
|
|
70
68
|
required: !0,
|
|
71
|
-
error:
|
|
72
|
-
}), /* @__PURE__ */
|
|
69
|
+
error: z
|
|
70
|
+
}), /* @__PURE__ */ b(u, {
|
|
73
71
|
label: "Visibility",
|
|
74
|
-
value:
|
|
75
|
-
onChange: (e) =>
|
|
76
|
-
options:
|
|
72
|
+
value: N,
|
|
73
|
+
onChange: (e) => P(e),
|
|
74
|
+
options: H
|
|
77
75
|
})]
|
|
78
76
|
}),
|
|
79
|
-
/* @__PURE__ */
|
|
77
|
+
/* @__PURE__ */ b(d, {
|
|
80
78
|
label: "Description",
|
|
81
|
-
value:
|
|
82
|
-
onChange:
|
|
79
|
+
value: j,
|
|
80
|
+
onChange: M,
|
|
83
81
|
placeholder: "What this board is for…",
|
|
84
82
|
rows: 2,
|
|
85
83
|
className: "mt-4"
|
|
86
84
|
}),
|
|
87
|
-
/* @__PURE__ */
|
|
85
|
+
/* @__PURE__ */ b(f, {
|
|
88
86
|
label: "Tags",
|
|
89
|
-
value:
|
|
90
|
-
onChange:
|
|
87
|
+
value: F,
|
|
88
|
+
onChange: I,
|
|
91
89
|
placeholder: "summer, formal",
|
|
92
90
|
hint: "Comma-separated",
|
|
93
91
|
className: "mt-4"
|
|
94
92
|
}),
|
|
95
|
-
/* @__PURE__ */
|
|
93
|
+
/* @__PURE__ */ b(p, {
|
|
96
94
|
label: "Cover image",
|
|
97
95
|
aspect: "wide",
|
|
98
|
-
value:
|
|
99
|
-
onChange:
|
|
96
|
+
value: L,
|
|
97
|
+
onChange: R,
|
|
100
98
|
folder: i.lookbooks,
|
|
101
99
|
className: "mt-4"
|
|
102
100
|
}),
|
|
103
|
-
|
|
101
|
+
E.isError && /* @__PURE__ */ b("p", {
|
|
104
102
|
className: "mt-4 rounded-lg bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text",
|
|
105
|
-
children:
|
|
103
|
+
children: E.error instanceof Error ? E.error.message : "Something went wrong"
|
|
106
104
|
}),
|
|
107
|
-
/* @__PURE__ */
|
|
105
|
+
/* @__PURE__ */ b("div", {
|
|
108
106
|
className: "mt-4 flex justify-end",
|
|
109
|
-
children: /* @__PURE__ */
|
|
107
|
+
children: /* @__PURE__ */ x("button", {
|
|
110
108
|
type: "submit",
|
|
111
|
-
disabled:
|
|
109
|
+
disabled: E.isPending,
|
|
112
110
|
className: "inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-5 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90 disabled:opacity-50",
|
|
113
|
-
children: [
|
|
111
|
+
children: [E.isPending ? /* @__PURE__ */ b(_, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ b(v, { className: "h-4 w-4" }), "Create lookbook"]
|
|
114
112
|
})
|
|
115
113
|
})
|
|
116
114
|
]
|
|
117
115
|
})
|
|
118
|
-
}),
|
|
116
|
+
}), T.isLoading ? /* @__PURE__ */ b(r, { label: "Loading lookbooks…" }) : T.isError ? /* @__PURE__ */ b(n, { onRetry: () => void T.refetch() }) : V.length === 0 ? /* @__PURE__ */ b(l, {
|
|
119
117
|
illustration: "empty-data",
|
|
120
|
-
icon: /* @__PURE__ */
|
|
118
|
+
icon: /* @__PURE__ */ b(g, { className: "h-10 w-10" }),
|
|
121
119
|
title: "No lookbooks yet",
|
|
122
120
|
description: "Create a themed board to clip catalogue pieces and looks.",
|
|
123
|
-
action: /* @__PURE__ */
|
|
121
|
+
action: /* @__PURE__ */ x("button", {
|
|
124
122
|
type: "button",
|
|
125
|
-
onClick: () =>
|
|
123
|
+
onClick: () => O(!0),
|
|
126
124
|
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",
|
|
127
|
-
children: [/* @__PURE__ */
|
|
125
|
+
children: [/* @__PURE__ */ b(v, { className: "h-4 w-4" }), " New lookbook"]
|
|
128
126
|
})
|
|
129
|
-
}) : /* @__PURE__ */
|
|
127
|
+
}) : /* @__PURE__ */ b("div", {
|
|
130
128
|
className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3",
|
|
131
|
-
children:
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
onClick: () => E(`/lookbooks/${e.id}`),
|
|
136
|
-
className: "group flex flex-col overflow-hidden rounded-xl border border-border-seam bg-bg-surface text-left shadow-sm transition-all hover:border-accent-foreground/20 hover:shadow-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--color-focus-ring)]",
|
|
137
|
-
children: [/* @__PURE__ */ S(a, {
|
|
138
|
-
icon: /* @__PURE__ */ S(v, { className: "h-10 w-10" }),
|
|
139
|
-
seed: e.id,
|
|
140
|
-
fileId: e.cover?.id,
|
|
141
|
-
alt: e.name,
|
|
142
|
-
className: "aspect-[4/3] w-full rounded-none"
|
|
143
|
-
}), /* @__PURE__ */ C("div", {
|
|
144
|
-
className: "flex flex-1 flex-col p-4",
|
|
145
|
-
children: [
|
|
146
|
-
/* @__PURE__ */ C("div", {
|
|
147
|
-
className: "flex items-start justify-between gap-2",
|
|
148
|
-
children: [/* @__PURE__ */ C("div", {
|
|
149
|
-
className: "min-w-0",
|
|
150
|
-
children: [/* @__PURE__ */ S("h3", {
|
|
151
|
-
className: "truncate text-base font-semibold text-text-primary",
|
|
152
|
-
children: e.name
|
|
153
|
-
}), t !== null && /* @__PURE__ */ C("p", {
|
|
154
|
-
className: "mt-0.5 text-xs text-text-secondary tabular-nums",
|
|
155
|
-
children: [
|
|
156
|
-
t,
|
|
157
|
-
" ",
|
|
158
|
-
t === 1 ? "item" : "items"
|
|
159
|
-
]
|
|
160
|
-
})]
|
|
161
|
-
}), /* @__PURE__ */ S(g, {
|
|
162
|
-
visibility: e.visibility,
|
|
163
|
-
className: "shrink-0"
|
|
164
|
-
})]
|
|
165
|
-
}),
|
|
166
|
-
e.description && /* @__PURE__ */ S("p", {
|
|
167
|
-
className: "mt-1.5 line-clamp-2 text-sm text-text-secondary",
|
|
168
|
-
children: e.description
|
|
169
|
-
}),
|
|
170
|
-
e.tags.length > 0 && /* @__PURE__ */ S(u, {
|
|
171
|
-
tags: e.tags,
|
|
172
|
-
max: 4,
|
|
173
|
-
className: "mt-3"
|
|
174
|
-
})
|
|
175
|
-
]
|
|
176
|
-
})]
|
|
177
|
-
}, e.id);
|
|
178
|
-
})
|
|
129
|
+
children: V.map((e) => /* @__PURE__ */ b(m, {
|
|
130
|
+
lookbook: e,
|
|
131
|
+
onClick: () => w(`/lookbooks/${e.id}`)
|
|
132
|
+
}, e.id))
|
|
179
133
|
})]
|
|
180
134
|
});
|
|
181
135
|
}
|
|
182
136
|
//#endregion
|
|
183
|
-
export {
|
|
137
|
+
export { w as LookbooksListPage };
|
|
184
138
|
|
|
185
139
|
//# sourceMappingURL=LookbooksListPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LookbooksListPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/lookbooks/LookbooksListPage.tsx"],"sourcesContent":["/**\n * Lookbooks List Page\n * @module coolandlovely/pages/lookbooks\n *\n * Lists themed lookbook boards (`cooListLookbooks`) as mood-board cards — a\n * cover, a visibility chip and (when the list selection carries entries) an\n * item count — and supports creating one inline (`cooCreateLookbook`).\n */\n\nimport { useState } from 'react';\nimport { Plus, BookHeart, Loader2, X } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { Thumbnail } from '../../components/Thumbnail';\nimport { TagList } from '../../components/TagList';\nimport { VisibilityChip } from '../../components/VisibilityChip';\nimport { TextField, TextAreaField, SelectField } from '../../components/Field';\nimport { ImageUploadField } from '../../components/ImageUploadField';\nimport { useCoolAndLovely } from '../../context/CoolAndLovelyContext';\nimport { useLookbooks, useCreateLookbook } from '../../hooks';\nimport { COO_FILE_FOLDERS } from '../../hooks/useFiles';\nimport { parseCsv, titleCase } from '../../utils/formatters';\nimport type { CooVisibility } from '../../types';\n\nconst VISIBILITIES: CooVisibility[] = ['PRIVATE', 'FOLLOWERS', 'PUBLIC'];\n\nexport function LookbooksListPage() {\n const { navigateTo } = useCoolAndLovely();\n const query = useLookbooks();\n const createLookbook = useCreateLookbook();\n\n const [creating, setCreating] = useState(false);\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [visibility, setVisibility] = useState<CooVisibility>('PRIVATE');\n const [tags, setTags] = useState('');\n const [coverFileId, setCoverFileId] = useState('');\n const [nameError, setNameError] = useState<string | undefined>();\n\n const lookbooks = query.data ?? [];\n const visibilityOptions = VISIBILITIES.map((v) => ({ value: v, label: titleCase(v) }));\n\n const handleCreate = (e: React.FormEvent) => {\n e.preventDefault();\n if (!name.trim()) {\n setNameError('Name is required');\n return;\n }\n setNameError(undefined);\n createLookbook.mutate(\n {\n name: name.trim(),\n description: description.trim() || undefined,\n visibility,\n tags: parseCsv(tags),\n coverFileId: coverFileId || undefined,\n },\n {\n onSuccess: (lb) => {\n setCreating(false);\n setName('');\n setDescription('');\n setTags('');\n setVisibility('PRIVATE');\n setCoverFileId('');\n navigateTo(`/lookbooks/${lb.id}`);\n },\n }\n );\n };\n\n return (\n <PageLayout\n title=\"Lookbooks\"\n description=\"Themed boards of saved catalogue pieces and looks\"\n actions={\n <button\n type=\"button\"\n onClick={() => setCreating((v) => !v)}\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 {creating ? <X className=\"h-4 w-4\" /> : <Plus className=\"h-4 w-4\" />}\n {creating ? 'Close' : 'New lookbook'}\n </button>\n }\n >\n {creating && (\n <form onSubmit={handleCreate} className=\"mb-6\">\n <GlassCard treatment=\"plain\" className=\"p-5\">\n <h2 className=\"mb-4 flex items-center gap-2 text-base font-semibold text-text-primary\">\n <BookHeart className=\"h-5 w-5\" /> New lookbook\n </h2>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <TextField\n label=\"Name\"\n value={name}\n onChange={setName}\n placeholder=\"Summer wedding guest\"\n required\n error={nameError}\n />\n <SelectField\n label=\"Visibility\"\n value={visibility}\n onChange={(v) => setVisibility(v as CooVisibility)}\n options={visibilityOptions}\n />\n </div>\n <TextAreaField\n label=\"Description\"\n value={description}\n onChange={setDescription}\n placeholder=\"What this board is for…\"\n rows={2}\n className=\"mt-4\"\n />\n <TextField\n label=\"Tags\"\n value={tags}\n onChange={setTags}\n placeholder=\"summer, formal\"\n hint=\"Comma-separated\"\n className=\"mt-4\"\n />\n <ImageUploadField\n label=\"Cover image\"\n aspect=\"wide\"\n value={coverFileId}\n onChange={setCoverFileId}\n folder={COO_FILE_FOLDERS.lookbooks}\n className=\"mt-4\"\n />\n {createLookbook.isError && (\n <p className=\"mt-4 rounded-lg bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {createLookbook.error instanceof Error\n ? createLookbook.error.message\n : 'Something went wrong'}\n </p>\n )}\n <div className=\"mt-4 flex justify-end\">\n <button\n type=\"submit\"\n disabled={createLookbook.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-5 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {createLookbook.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Plus className=\"h-4 w-4\" />\n )}\n Create lookbook\n </button>\n </div>\n </GlassCard>\n </form>\n )}\n\n {query.isLoading ? (\n <LoadingView label=\"Loading lookbooks…\" />\n ) : query.isError ? (\n <ErrorView onRetry={() => void query.refetch()} />\n ) : lookbooks.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<BookHeart className=\"h-10 w-10\" />}\n title=\"No lookbooks yet\"\n description=\"Create a themed board to clip catalogue pieces and looks.\"\n action={\n <button\n type=\"button\"\n onClick={() => setCreating(true)}\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\"\n >\n <Plus className=\"h-4 w-4\" /> New lookbook\n </button>\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {lookbooks.map((lb) => {\n const entryCount = Array.isArray(lb.entries) ? lb.entries.length : null;\n return (\n <button\n key={lb.id}\n type=\"button\"\n onClick={() => navigateTo(`/lookbooks/${lb.id}`)}\n className=\"group flex flex-col overflow-hidden rounded-xl border border-border-seam bg-bg-surface text-left shadow-sm transition-all hover:border-accent-foreground/20 hover:shadow-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <Thumbnail\n icon={<BookHeart className=\"h-10 w-10\" />}\n seed={lb.id}\n fileId={lb.cover?.id}\n alt={lb.name}\n className=\"aspect-[4/3] w-full rounded-none\"\n />\n <div className=\"flex flex-1 flex-col p-4\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">\n {lb.name}\n </h3>\n {entryCount !== null && (\n <p className=\"mt-0.5 text-xs text-text-secondary tabular-nums\">\n {entryCount} {entryCount === 1 ? 'item' : 'items'}\n </p>\n )}\n </div>\n <VisibilityChip visibility={lb.visibility} className=\"shrink-0\" />\n </div>\n {lb.description && (\n <p className=\"mt-1.5 line-clamp-2 text-sm text-text-secondary\">\n {lb.description}\n </p>\n )}\n {lb.tags.length > 0 && <TagList tags={lb.tags} max={4} className=\"mt-3\" />}\n </div>\n </button>\n );\n })}\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LookbooksListPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/lookbooks/LookbooksListPage.tsx"],"sourcesContent":["/**\n * Lookbooks List Page\n * @module coolandlovely/pages/lookbooks\n *\n * Lists themed lookbook boards (`cooListLookbooks`) as mood-board cards — a\n * cover, a visibility chip and (when the list selection carries entries) an\n * item count — and supports creating one inline (`cooCreateLookbook`).\n */\n\nimport { useState } from 'react';\nimport { Plus, BookHeart, Loader2, X } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { LookbookCard } from '../../components/LookbookCard';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { TextField, TextAreaField, SelectField } from '../../components/Field';\nimport { ImageUploadField } from '../../components/ImageUploadField';\nimport { useCoolAndLovely } from '../../context/CoolAndLovelyContext';\nimport { useLookbooks, useCreateLookbook } from '../../hooks';\nimport { COO_FILE_FOLDERS } from '../../hooks/useFiles';\nimport { parseCsv, titleCase } from '../../utils/formatters';\nimport type { CooVisibility } from '../../types';\n\nconst VISIBILITIES: CooVisibility[] = ['PRIVATE', 'FOLLOWERS', 'PUBLIC'];\n\nexport function LookbooksListPage() {\n const { navigateTo } = useCoolAndLovely();\n const query = useLookbooks();\n const createLookbook = useCreateLookbook();\n\n const [creating, setCreating] = useState(false);\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [visibility, setVisibility] = useState<CooVisibility>('PRIVATE');\n const [tags, setTags] = useState('');\n const [coverFileId, setCoverFileId] = useState('');\n const [nameError, setNameError] = useState<string | undefined>();\n\n const lookbooks = query.data ?? [];\n const visibilityOptions = VISIBILITIES.map((v) => ({ value: v, label: titleCase(v) }));\n\n const handleCreate = (e: React.FormEvent) => {\n e.preventDefault();\n if (!name.trim()) {\n setNameError('Name is required');\n return;\n }\n setNameError(undefined);\n createLookbook.mutate(\n {\n name: name.trim(),\n description: description.trim() || undefined,\n visibility,\n tags: parseCsv(tags),\n coverFileId: coverFileId || undefined,\n },\n {\n onSuccess: (lb) => {\n setCreating(false);\n setName('');\n setDescription('');\n setTags('');\n setVisibility('PRIVATE');\n setCoverFileId('');\n navigateTo(`/lookbooks/${lb.id}`);\n },\n }\n );\n };\n\n return (\n <PageLayout\n title=\"Lookbooks\"\n description=\"Themed boards of saved catalogue pieces and looks\"\n actions={\n <button\n type=\"button\"\n onClick={() => setCreating((v) => !v)}\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 {creating ? <X className=\"h-4 w-4\" /> : <Plus className=\"h-4 w-4\" />}\n {creating ? 'Close' : 'New lookbook'}\n </button>\n }\n >\n {creating && (\n <form onSubmit={handleCreate} className=\"mb-6\">\n <GlassCard treatment=\"plain\" className=\"p-5\">\n <h2 className=\"mb-4 flex items-center gap-2 text-base font-semibold text-text-primary\">\n <BookHeart className=\"h-5 w-5\" /> New lookbook\n </h2>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <TextField\n label=\"Name\"\n value={name}\n onChange={setName}\n placeholder=\"Summer wedding guest\"\n required\n error={nameError}\n />\n <SelectField\n label=\"Visibility\"\n value={visibility}\n onChange={(v) => setVisibility(v as CooVisibility)}\n options={visibilityOptions}\n />\n </div>\n <TextAreaField\n label=\"Description\"\n value={description}\n onChange={setDescription}\n placeholder=\"What this board is for…\"\n rows={2}\n className=\"mt-4\"\n />\n <TextField\n label=\"Tags\"\n value={tags}\n onChange={setTags}\n placeholder=\"summer, formal\"\n hint=\"Comma-separated\"\n className=\"mt-4\"\n />\n <ImageUploadField\n label=\"Cover image\"\n aspect=\"wide\"\n value={coverFileId}\n onChange={setCoverFileId}\n folder={COO_FILE_FOLDERS.lookbooks}\n className=\"mt-4\"\n />\n {createLookbook.isError && (\n <p className=\"mt-4 rounded-lg bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {createLookbook.error instanceof Error\n ? createLookbook.error.message\n : 'Something went wrong'}\n </p>\n )}\n <div className=\"mt-4 flex justify-end\">\n <button\n type=\"submit\"\n disabled={createLookbook.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-5 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {createLookbook.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Plus className=\"h-4 w-4\" />\n )}\n Create lookbook\n </button>\n </div>\n </GlassCard>\n </form>\n )}\n\n {query.isLoading ? (\n <LoadingView label=\"Loading lookbooks…\" />\n ) : query.isError ? (\n <ErrorView onRetry={() => void query.refetch()} />\n ) : lookbooks.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<BookHeart className=\"h-10 w-10\" />}\n title=\"No lookbooks yet\"\n description=\"Create a themed board to clip catalogue pieces and looks.\"\n action={\n <button\n type=\"button\"\n onClick={() => setCreating(true)}\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\"\n >\n <Plus className=\"h-4 w-4\" /> New lookbook\n </button>\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {lookbooks.map((lb) => (\n <LookbookCard\n key={lb.id}\n lookbook={lb}\n onClick={() => navigateTo(`/lookbooks/${lb.id}`)}\n />\n ))}\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|