@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.
Files changed (66) hide show
  1. package/dist/coolandlovely/CoolAndLovelyRoot.d.ts.map +1 -1
  2. package/dist/coolandlovely/CoolAndLovelyRoot.js +60 -58
  3. package/dist/coolandlovely/CoolAndLovelyRoot.js.map +1 -1
  4. package/dist/coolandlovely/components/AddToLookbookButton.d.ts.map +1 -1
  5. package/dist/coolandlovely/components/AddToLookbookButton.js +1 -0
  6. package/dist/coolandlovely/components/AddToLookbookButton.js.map +1 -1
  7. package/dist/coolandlovely/components/BrandCard.d.ts +11 -0
  8. package/dist/coolandlovely/components/BrandCard.d.ts.map +1 -0
  9. package/dist/coolandlovely/components/BrandCard.js +55 -0
  10. package/dist/coolandlovely/components/BrandCard.js.map +1 -0
  11. package/dist/coolandlovely/components/CollectionCard.d.ts +11 -0
  12. package/dist/coolandlovely/components/CollectionCard.d.ts.map +1 -0
  13. package/dist/coolandlovely/components/CollectionCard.js +60 -0
  14. package/dist/coolandlovely/components/CollectionCard.js.map +1 -0
  15. package/dist/coolandlovely/components/FeedbackWidget.d.ts +4 -0
  16. package/dist/coolandlovely/components/FeedbackWidget.d.ts.map +1 -0
  17. package/dist/coolandlovely/components/FeedbackWidget.js +134 -0
  18. package/dist/coolandlovely/components/FeedbackWidget.js.map +1 -0
  19. package/dist/coolandlovely/components/LookbookCard.d.ts +11 -0
  20. package/dist/coolandlovely/components/LookbookCard.d.ts.map +1 -0
  21. package/dist/coolandlovely/components/LookbookCard.js +60 -0
  22. package/dist/coolandlovely/components/LookbookCard.js.map +1 -0
  23. package/dist/coolandlovely/components/WardrobeItemCard.d.ts +14 -0
  24. package/dist/coolandlovely/components/WardrobeItemCard.d.ts.map +1 -0
  25. package/dist/coolandlovely/components/WardrobeItemCard.js +92 -0
  26. package/dist/coolandlovely/components/WardrobeItemCard.js.map +1 -0
  27. package/dist/coolandlovely/components/index.d.ts +5 -0
  28. package/dist/coolandlovely/components/index.d.ts.map +1 -1
  29. package/dist/coolandlovely/components/index.js +26 -0
  30. package/dist/coolandlovely/pages/HomePage.d.ts.map +1 -1
  31. package/dist/coolandlovely/pages/HomePage.js +10 -4
  32. package/dist/coolandlovely/pages/HomePage.js.map +1 -1
  33. package/dist/coolandlovely/pages/brands/BrandDetailPage.js +7 -7
  34. package/dist/coolandlovely/pages/brands/BrandsListPage.d.ts.map +1 -1
  35. package/dist/coolandlovely/pages/brands/BrandsListPage.js +48 -89
  36. package/dist/coolandlovely/pages/brands/BrandsListPage.js.map +1 -1
  37. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js +4 -4
  38. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js +13 -13
  39. package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js +4 -4
  40. package/dist/coolandlovely/pages/collections/CollectionsListPage.d.ts.map +1 -1
  41. package/dist/coolandlovely/pages/collections/CollectionsListPage.js +28 -74
  42. package/dist/coolandlovely/pages/collections/CollectionsListPage.js.map +1 -1
  43. package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js +5 -5
  44. package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.d.ts.map +1 -1
  45. package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js +66 -112
  46. package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js.map +1 -1
  47. package/dist/coolandlovely/pages/profile/StyleProfilePage.js +124 -124
  48. package/dist/coolandlovely/pages/profile/StyleProfilePage.js.map +1 -1
  49. package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.d.ts.map +1 -1
  50. package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js +46 -120
  51. package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js.map +1 -1
  52. package/dist/stories/BrandCard.stories.d.ts +10 -0
  53. package/dist/stories/BrandCard.stories.d.ts.map +1 -0
  54. package/dist/stories/CollectionCard.stories.d.ts +10 -0
  55. package/dist/stories/CollectionCard.stories.d.ts.map +1 -0
  56. package/dist/stories/FeedbackWidget.stories.d.ts +9 -0
  57. package/dist/stories/FeedbackWidget.stories.d.ts.map +1 -0
  58. package/dist/stories/LookCard.stories.d.ts +10 -0
  59. package/dist/stories/LookCard.stories.d.ts.map +1 -0
  60. package/dist/stories/LookbookCard.stories.d.ts +10 -0
  61. package/dist/stories/LookbookCard.stories.d.ts.map +1 -0
  62. package/dist/stories/WardrobeItemCard.stories.d.ts +11 -0
  63. package/dist/stories/WardrobeItemCard.stories.d.ts.map +1 -0
  64. package/dist/stories/__fixtures__/coolandlovely.d.ts +13 -0
  65. package/dist/stories/__fixtures__/coolandlovely.d.ts.map +1 -0
  66. 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 { TagList as d } from "../../components/TagList.js";
9
- import { SelectField as f, TextField as p } from "../../components/Field.js";
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(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(f, {
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(p, {
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;AAqBH,wBAAgB,iBAAiB,gCAqMhC"}
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 { Thumbnail as a } from "../../components/Thumbnail.js";
6
- import { useCreateLookbook as o, useLookbooks as s } from "../../hooks/useCoolAndLovelyApi.js";
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 { TagList as u } from "../../components/TagList.js";
10
- import { SelectField as d, TextAreaField as f, TextField as p } from "../../components/Field.js";
11
- import { ImageUploadField as m } from "../../components/ImageUploadField.js";
12
- import { EmptyState as h } from "../../components/EmptyState.js";
13
- import { VisibilityChip as g } from "../../components/VisibilityChip.js";
14
- import { useState as _ } from "react";
15
- import { BookHeart as v, Loader2 as y, Plus as b, X as x } from "lucide-react";
16
- import { jsx as S, jsxs as C } from "react/jsx-runtime";
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 T = [
17
+ var C = [
20
18
  "PRIVATE",
21
19
  "FOLLOWERS",
22
20
  "PUBLIC"
23
21
  ];
24
- function E() {
25
- let { navigateTo: E } = e(), D = s(), O = o(), [k, A] = _(!1), [j, M] = _(""), [N, P] = _(""), [F, I] = _("PRIVATE"), [L, R] = _(""), [z, B] = _(""), [V, H] = _(), U = D.data ?? [], W = T.map((e) => ({
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: l(e)
25
+ label: c(e)
28
26
  }));
29
- return /* @__PURE__ */ C(t, {
27
+ return /* @__PURE__ */ x(t, {
30
28
  title: "Lookbooks",
31
29
  description: "Themed boards of saved catalogue pieces and looks",
32
- actions: /* @__PURE__ */ C("button", {
30
+ actions: /* @__PURE__ */ x("button", {
33
31
  type: "button",
34
- onClick: () => A((e) => !e),
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: [S(k ? x : b, { className: "h-4 w-4" }), k ? "Close" : "New lookbook"]
34
+ children: [b(D ? y : v, { className: "h-4 w-4" }), D ? "Close" : "New lookbook"]
37
35
  }),
38
- children: [k && /* @__PURE__ */ S("form", {
36
+ children: [D && /* @__PURE__ */ b("form", {
39
37
  onSubmit: (e) => {
40
- if (e.preventDefault(), !j.trim()) {
41
- H("Name is required");
38
+ if (e.preventDefault(), !k.trim()) {
39
+ B("Name is required");
42
40
  return;
43
41
  }
44
- H(void 0), O.mutate({
45
- name: j.trim(),
46
- description: N.trim() || void 0,
47
- visibility: F,
48
- tags: c(L),
49
- coverFileId: z || void 0
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
- A(!1), M(""), P(""), R(""), I("PRIVATE"), B(""), E(`/lookbooks/${e.id}`);
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__ */ C(w, {
53
+ children: /* @__PURE__ */ x(S, {
56
54
  treatment: "plain",
57
55
  className: "p-5",
58
56
  children: [
59
- /* @__PURE__ */ C("h2", {
57
+ /* @__PURE__ */ x("h2", {
60
58
  className: "mb-4 flex items-center gap-2 text-base font-semibold text-text-primary",
61
- children: [/* @__PURE__ */ S(v, { className: "h-5 w-5" }), " New lookbook"]
59
+ children: [/* @__PURE__ */ b(g, { className: "h-5 w-5" }), " New lookbook"]
62
60
  }),
63
- /* @__PURE__ */ C("div", {
61
+ /* @__PURE__ */ x("div", {
64
62
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
65
- children: [/* @__PURE__ */ S(p, {
63
+ children: [/* @__PURE__ */ b(f, {
66
64
  label: "Name",
67
- value: j,
68
- onChange: M,
65
+ value: k,
66
+ onChange: A,
69
67
  placeholder: "Summer wedding guest",
70
68
  required: !0,
71
- error: V
72
- }), /* @__PURE__ */ S(d, {
69
+ error: z
70
+ }), /* @__PURE__ */ b(u, {
73
71
  label: "Visibility",
74
- value: F,
75
- onChange: (e) => I(e),
76
- options: W
72
+ value: N,
73
+ onChange: (e) => P(e),
74
+ options: H
77
75
  })]
78
76
  }),
79
- /* @__PURE__ */ S(f, {
77
+ /* @__PURE__ */ b(d, {
80
78
  label: "Description",
81
- value: N,
82
- onChange: P,
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__ */ S(p, {
85
+ /* @__PURE__ */ b(f, {
88
86
  label: "Tags",
89
- value: L,
90
- onChange: R,
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__ */ S(m, {
93
+ /* @__PURE__ */ b(p, {
96
94
  label: "Cover image",
97
95
  aspect: "wide",
98
- value: z,
99
- onChange: B,
96
+ value: L,
97
+ onChange: R,
100
98
  folder: i.lookbooks,
101
99
  className: "mt-4"
102
100
  }),
103
- O.isError && /* @__PURE__ */ S("p", {
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: O.error instanceof Error ? O.error.message : "Something went wrong"
103
+ children: E.error instanceof Error ? E.error.message : "Something went wrong"
106
104
  }),
107
- /* @__PURE__ */ S("div", {
105
+ /* @__PURE__ */ b("div", {
108
106
  className: "mt-4 flex justify-end",
109
- children: /* @__PURE__ */ C("button", {
107
+ children: /* @__PURE__ */ x("button", {
110
108
  type: "submit",
111
- disabled: O.isPending,
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: [O.isPending ? /* @__PURE__ */ S(y, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ S(b, { className: "h-4 w-4" }), "Create lookbook"]
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
- }), D.isLoading ? /* @__PURE__ */ S(r, { label: "Loading lookbooks…" }) : D.isError ? /* @__PURE__ */ S(n, { onRetry: () => void D.refetch() }) : U.length === 0 ? /* @__PURE__ */ S(h, {
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__ */ S(v, { className: "h-10 w-10" }),
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__ */ C("button", {
121
+ action: /* @__PURE__ */ x("button", {
124
122
  type: "button",
125
- onClick: () => A(!0),
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__ */ S(b, { className: "h-4 w-4" }), " New lookbook"]
125
+ children: [/* @__PURE__ */ b(v, { className: "h-4 w-4" }), " New lookbook"]
128
126
  })
129
- }) : /* @__PURE__ */ S("div", {
127
+ }) : /* @__PURE__ */ b("div", {
130
128
  className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3",
131
- children: U.map((e) => {
132
- let t = Array.isArray(e.entries) ? e.entries.length : null;
133
- return /* @__PURE__ */ C("button", {
134
- type: "button",
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 { E as LookbooksListPage };
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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"}