@burdenoff/microfe-coolandlovely 2026.706.2 → 2026.710.1

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 (213) hide show
  1. package/dist/coolandlovely/CoolAndLovelyRoot.d.ts +5 -0
  2. package/dist/coolandlovely/CoolAndLovelyRoot.d.ts.map +1 -0
  3. package/dist/coolandlovely/CoolAndLovelyRoot.js +62 -46
  4. package/dist/coolandlovely/CoolAndLovelyRoot.js.map +1 -1
  5. package/dist/coolandlovely/CoolAndLovelyRoutes.d.ts +4 -0
  6. package/dist/coolandlovely/CoolAndLovelyRoutes.d.ts.map +1 -0
  7. package/dist/coolandlovely/components/ActorName.d.ts +14 -0
  8. package/dist/coolandlovely/components/ActorName.d.ts.map +1 -0
  9. package/dist/coolandlovely/components/AddToLookbookButton.d.ts +10 -0
  10. package/dist/coolandlovely/components/AddToLookbookButton.d.ts.map +1 -0
  11. package/dist/coolandlovely/components/AddToLookbookButton.js +22 -22
  12. package/dist/coolandlovely/components/AddToLookbookButton.js.map +1 -1
  13. package/dist/coolandlovely/components/BrandCover.d.ts +17 -0
  14. package/dist/coolandlovely/components/BrandCover.d.ts.map +1 -0
  15. package/dist/coolandlovely/components/BrandCover.js +39 -0
  16. package/dist/coolandlovely/components/BrandCover.js.map +1 -0
  17. package/dist/coolandlovely/components/BrandCreatorAvatars.d.ts +14 -0
  18. package/dist/coolandlovely/components/BrandCreatorAvatars.d.ts.map +1 -0
  19. package/dist/coolandlovely/components/BrandCreatorAvatars.js +57 -0
  20. package/dist/coolandlovely/components/BrandCreatorAvatars.js.map +1 -0
  21. package/dist/coolandlovely/components/ColourSwatchRow.d.ts +11 -0
  22. package/dist/coolandlovely/components/ColourSwatchRow.d.ts.map +1 -0
  23. package/dist/coolandlovely/components/ColourSwatchRow.js +86 -0
  24. package/dist/coolandlovely/components/ColourSwatchRow.js.map +1 -0
  25. package/dist/coolandlovely/components/Comments.d.ts +14 -0
  26. package/dist/coolandlovely/components/Comments.d.ts.map +1 -0
  27. package/dist/coolandlovely/components/Comments.js +4 -4
  28. package/dist/coolandlovely/components/Comments.js.map +1 -1
  29. package/dist/coolandlovely/components/EmptyState.d.ts +14 -0
  30. package/dist/coolandlovely/components/EmptyState.d.ts.map +1 -0
  31. package/dist/coolandlovely/components/Field.d.ts +68 -0
  32. package/dist/coolandlovely/components/Field.d.ts.map +1 -0
  33. package/dist/coolandlovely/components/FileImage.d.ts +10 -0
  34. package/dist/coolandlovely/components/FileImage.d.ts.map +1 -0
  35. package/dist/coolandlovely/components/FileImage.js.map +1 -1
  36. package/dist/coolandlovely/components/FollowButton.d.ts +11 -0
  37. package/dist/coolandlovely/components/FollowButton.d.ts.map +1 -0
  38. package/dist/coolandlovely/components/ImageUploadField.d.ts +21 -0
  39. package/dist/coolandlovely/components/ImageUploadField.d.ts.map +1 -0
  40. package/dist/coolandlovely/components/ImageUploadField.js +139 -57
  41. package/dist/coolandlovely/components/ImageUploadField.js.map +1 -1
  42. package/dist/coolandlovely/components/LookCard.d.ts +17 -0
  43. package/dist/coolandlovely/components/LookCard.d.ts.map +1 -0
  44. package/dist/coolandlovely/components/LookCard.js +77 -0
  45. package/dist/coolandlovely/components/LookCard.js.map +1 -0
  46. package/dist/coolandlovely/components/MetricsCard.d.ts +16 -0
  47. package/dist/coolandlovely/components/MetricsCard.d.ts.map +1 -0
  48. package/dist/coolandlovely/components/MetricsCard.js +1 -1
  49. package/dist/coolandlovely/components/MetricsCard.js.map +1 -1
  50. package/dist/coolandlovely/components/PageLayout.d.ts +17 -0
  51. package/dist/coolandlovely/components/PageLayout.d.ts.map +1 -0
  52. package/dist/coolandlovely/components/ShopItemCard.d.ts +15 -0
  53. package/dist/coolandlovely/components/ShopItemCard.d.ts.map +1 -0
  54. package/dist/coolandlovely/components/ShopItemCard.js +45 -0
  55. package/dist/coolandlovely/components/ShopItemCard.js.map +1 -0
  56. package/dist/coolandlovely/components/StateViews.d.ts +16 -0
  57. package/dist/coolandlovely/components/StateViews.d.ts.map +1 -0
  58. package/dist/coolandlovely/components/StatusBadge.d.ts +9 -0
  59. package/dist/coolandlovely/components/StatusBadge.d.ts.map +1 -0
  60. package/dist/coolandlovely/components/StepTracker.d.ts +12 -0
  61. package/dist/coolandlovely/components/StepTracker.d.ts.map +1 -0
  62. package/dist/coolandlovely/components/StepTracker.js +35 -0
  63. package/dist/coolandlovely/components/StepTracker.js.map +1 -0
  64. package/dist/coolandlovely/components/TagList.d.ts +12 -0
  65. package/dist/coolandlovely/components/TagList.d.ts.map +1 -0
  66. package/dist/coolandlovely/components/Thumbnail.d.ts +23 -0
  67. package/dist/coolandlovely/components/Thumbnail.d.ts.map +1 -0
  68. package/dist/coolandlovely/components/Thumbnail.js +15 -11
  69. package/dist/coolandlovely/components/Thumbnail.js.map +1 -1
  70. package/dist/coolandlovely/components/VisibilityChip.d.ts +10 -0
  71. package/dist/coolandlovely/components/VisibilityChip.d.ts.map +1 -0
  72. package/dist/coolandlovely/components/VisibilityChip.js +32 -0
  73. package/dist/coolandlovely/components/VisibilityChip.js.map +1 -0
  74. package/dist/coolandlovely/components/index.d.ts +26 -0
  75. package/dist/coolandlovely/components/index.d.ts.map +1 -0
  76. package/dist/coolandlovely/context/CoolAndLovelyContext.d.ts +16 -0
  77. package/dist/coolandlovely/context/CoolAndLovelyContext.d.ts.map +1 -0
  78. package/dist/coolandlovely/context/index.d.ts +6 -0
  79. package/dist/coolandlovely/context/index.d.ts.map +1 -0
  80. package/dist/coolandlovely/hooks/index.d.ts +11 -0
  81. package/dist/coolandlovely/hooks/index.d.ts.map +1 -0
  82. package/dist/coolandlovely/hooks/useComments.d.ts +37 -0
  83. package/dist/coolandlovely/hooks/useComments.d.ts.map +1 -0
  84. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.d.ts +106 -0
  85. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.d.ts.map +1 -0
  86. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js +94 -69
  87. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js.map +1 -1
  88. package/dist/coolandlovely/hooks/useFiles.d.ts +62 -0
  89. package/dist/coolandlovely/hooks/useFiles.d.ts.map +1 -0
  90. package/dist/coolandlovely/hooks/useFiles.js +49 -32
  91. package/dist/coolandlovely/hooks/useFiles.js.map +1 -1
  92. package/dist/coolandlovely/index.d.ts +11 -0
  93. package/dist/coolandlovely/index.d.ts.map +1 -0
  94. package/dist/coolandlovely/pages/HomePage.d.ts +10 -0
  95. package/dist/coolandlovely/pages/HomePage.d.ts.map +1 -0
  96. package/dist/coolandlovely/pages/HomePage.js +112 -133
  97. package/dist/coolandlovely/pages/HomePage.js.map +1 -1
  98. package/dist/coolandlovely/pages/brands/BrandDetailPage.d.ts +9 -0
  99. package/dist/coolandlovely/pages/brands/BrandDetailPage.d.ts.map +1 -0
  100. package/dist/coolandlovely/pages/brands/BrandDetailPage.js +253 -242
  101. package/dist/coolandlovely/pages/brands/BrandDetailPage.js.map +1 -1
  102. package/dist/coolandlovely/pages/brands/BrandFormPage.d.ts +9 -0
  103. package/dist/coolandlovely/pages/brands/BrandFormPage.d.ts.map +1 -0
  104. package/dist/coolandlovely/pages/brands/BrandFormPage.js +116 -112
  105. package/dist/coolandlovely/pages/brands/BrandFormPage.js.map +1 -1
  106. package/dist/coolandlovely/pages/brands/BrandsListPage.d.ts +9 -0
  107. package/dist/coolandlovely/pages/brands/BrandsListPage.d.ts.map +1 -0
  108. package/dist/coolandlovely/pages/brands/BrandsListPage.js +13 -13
  109. package/dist/coolandlovely/pages/brands/BrandsListPage.js.map +1 -1
  110. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.d.ts +9 -0
  111. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.d.ts.map +1 -0
  112. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js +117 -95
  113. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js.map +1 -1
  114. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.d.ts +10 -0
  115. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.d.ts.map +1 -0
  116. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js +1 -1
  117. package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.d.ts +9 -0
  118. package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.d.ts.map +1 -0
  119. package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js +50 -43
  120. package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js.map +1 -1
  121. package/dist/coolandlovely/pages/collections/CollectionDetailPage.d.ts +9 -0
  122. package/dist/coolandlovely/pages/collections/CollectionDetailPage.d.ts.map +1 -0
  123. package/dist/coolandlovely/pages/collections/CollectionDetailPage.js +131 -108
  124. package/dist/coolandlovely/pages/collections/CollectionDetailPage.js.map +1 -1
  125. package/dist/coolandlovely/pages/collections/CollectionFormPage.d.ts +9 -0
  126. package/dist/coolandlovely/pages/collections/CollectionFormPage.d.ts.map +1 -0
  127. package/dist/coolandlovely/pages/collections/CollectionFormPage.js +1 -1
  128. package/dist/coolandlovely/pages/collections/CollectionsListPage.d.ts +8 -0
  129. package/dist/coolandlovely/pages/collections/CollectionsListPage.d.ts.map +1 -0
  130. package/dist/coolandlovely/pages/collections/CollectionsListPage.js +59 -56
  131. package/dist/coolandlovely/pages/collections/CollectionsListPage.js.map +1 -1
  132. package/dist/coolandlovely/pages/discover/DiscoverPage.d.ts +13 -0
  133. package/dist/coolandlovely/pages/discover/DiscoverPage.d.ts.map +1 -0
  134. package/dist/coolandlovely/pages/discover/DiscoverPage.js +1 -1
  135. package/dist/coolandlovely/pages/discover/DiscoverPage.js.map +1 -1
  136. package/dist/coolandlovely/pages/items/StyleItemDetailPage.d.ts +9 -0
  137. package/dist/coolandlovely/pages/items/StyleItemDetailPage.d.ts.map +1 -0
  138. package/dist/coolandlovely/pages/items/StyleItemDetailPage.js +175 -147
  139. package/dist/coolandlovely/pages/items/StyleItemDetailPage.js.map +1 -1
  140. package/dist/coolandlovely/pages/items/StyleItemFormPage.d.ts +10 -0
  141. package/dist/coolandlovely/pages/items/StyleItemFormPage.d.ts.map +1 -0
  142. package/dist/coolandlovely/pages/items/StyleItemFormPage.js +1 -1
  143. package/dist/coolandlovely/pages/items/StyleItemsListPage.d.ts +9 -0
  144. package/dist/coolandlovely/pages/items/StyleItemsListPage.d.ts.map +1 -0
  145. package/dist/coolandlovely/pages/items/StyleItemsListPage.js +71 -62
  146. package/dist/coolandlovely/pages/items/StyleItemsListPage.js.map +1 -1
  147. package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.d.ts +12 -0
  148. package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.d.ts.map +1 -0
  149. package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js +149 -127
  150. package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js.map +1 -1
  151. package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.d.ts +10 -0
  152. package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.d.ts.map +1 -0
  153. package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js +69 -53
  154. package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js.map +1 -1
  155. package/dist/coolandlovely/pages/looks/LookDetailPage.d.ts +9 -0
  156. package/dist/coolandlovely/pages/looks/LookDetailPage.d.ts.map +1 -0
  157. package/dist/coolandlovely/pages/looks/LookDetailPage.js +135 -113
  158. package/dist/coolandlovely/pages/looks/LookDetailPage.js.map +1 -1
  159. package/dist/coolandlovely/pages/looks/LookFormPage.d.ts +10 -0
  160. package/dist/coolandlovely/pages/looks/LookFormPage.d.ts.map +1 -0
  161. package/dist/coolandlovely/pages/looks/LookFormPage.js +122 -110
  162. package/dist/coolandlovely/pages/looks/LookFormPage.js.map +1 -1
  163. package/dist/coolandlovely/pages/looks/LooksListPage.d.ts +9 -0
  164. package/dist/coolandlovely/pages/looks/LooksListPage.d.ts.map +1 -0
  165. package/dist/coolandlovely/pages/looks/LooksListPage.js +60 -97
  166. package/dist/coolandlovely/pages/looks/LooksListPage.js.map +1 -1
  167. package/dist/coolandlovely/pages/profile/StyleProfilePage.d.ts +12 -0
  168. package/dist/coolandlovely/pages/profile/StyleProfilePage.d.ts.map +1 -0
  169. package/dist/coolandlovely/pages/profile/StyleProfilePage.js +372 -210
  170. package/dist/coolandlovely/pages/profile/StyleProfilePage.js.map +1 -1
  171. package/dist/coolandlovely/pages/trends/TrendsPage.d.ts +11 -0
  172. package/dist/coolandlovely/pages/trends/TrendsPage.d.ts.map +1 -0
  173. package/dist/coolandlovely/pages/trends/TrendsPage.js +1 -1
  174. package/dist/coolandlovely/pages/trends/TrendsPage.js.map +1 -1
  175. package/dist/coolandlovely/pages/wardrobe/WardrobeFormPage.d.ts +10 -0
  176. package/dist/coolandlovely/pages/wardrobe/WardrobeFormPage.d.ts.map +1 -0
  177. package/dist/coolandlovely/pages/wardrobe/WardrobeFormPage.js +130 -94
  178. package/dist/coolandlovely/pages/wardrobe/WardrobeFormPage.js.map +1 -1
  179. package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.d.ts +12 -0
  180. package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.d.ts.map +1 -0
  181. package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js +75 -76
  182. package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js.map +1 -1
  183. package/dist/coolandlovely/store/coolandlovelyStore.d.ts +56 -0
  184. package/dist/coolandlovely/store/coolandlovelyStore.d.ts.map +1 -0
  185. package/dist/coolandlovely/store/index.d.ts +6 -0
  186. package/dist/coolandlovely/store/index.d.ts.map +1 -0
  187. package/dist/coolandlovely/types/index.d.ts +451 -0
  188. package/dist/coolandlovely/types/index.d.ts.map +1 -0
  189. package/dist/coolandlovely/utils/cn.d.ts +4 -0
  190. package/dist/coolandlovely/utils/cn.d.ts.map +1 -0
  191. package/dist/coolandlovely/utils/formatters.d.ts +101 -0
  192. package/dist/coolandlovely/utils/formatters.d.ts.map +1 -0
  193. package/dist/coolandlovely/utils/icons.d.ts +6 -0
  194. package/dist/coolandlovely/utils/icons.d.ts.map +1 -0
  195. package/dist/coolandlovely/utils/index.d.ts +9 -0
  196. package/dist/coolandlovely/utils/index.d.ts.map +1 -0
  197. package/dist/coolandlovely/utils/navigation.d.ts +20 -0
  198. package/dist/coolandlovely/utils/navigation.d.ts.map +1 -0
  199. package/dist/generated/global-operations.d.ts +2 -0
  200. package/dist/generated/global-operations.d.ts.map +1 -0
  201. package/dist/generated/global-types.d.ts +23527 -0
  202. package/dist/generated/global-types.d.ts.map +1 -0
  203. package/dist/generated/wspace-operations.d.ts +2 -0
  204. package/dist/generated/wspace-operations.d.ts.map +1 -0
  205. package/dist/generated/wspace-types.d.ts +57851 -0
  206. package/dist/generated/wspace-types.d.ts.map +1 -0
  207. package/dist/index.d.ts +6 -0
  208. package/dist/index.d.ts.map +1 -0
  209. package/dist/services/createSandboxAssistantTransport.d.ts +44 -0
  210. package/dist/services/createSandboxAssistantTransport.d.ts.map +1 -0
  211. package/dist/utils/pageContext.d.ts +28 -0
  212. package/dist/utils/pageContext.d.ts.map +1 -0
  213. package/package.json +5 -1
@@ -5,46 +5,83 @@ import { StatusBadge as r } from "../../components/StatusBadge.js";
5
5
  import { ErrorView as i, LoadingView as a } from "../../components/StateViews.js";
6
6
  import { Thumbnail as o } from "../../components/Thumbnail.js";
7
7
  import { useDeleteLook as s, useLikeLook as c, useLook as l, usePublishLook as u, useUpdateLook as d } from "../../hooks/useCoolAndLovelyApi.js";
8
+ import { AddToLookbookButton as f } from "../../components/AddToLookbookButton.js";
9
+ import { formatDate as p, titleCase as m } from "../../utils/formatters.js";
8
10
  import "../../hooks/index.js";
9
- import { formatDate as f, formatPrice as p, titleCase as m } from "../../utils/formatters.js";
10
11
  import { TagList as h } from "../../components/TagList.js";
11
- import { ActorName as g } from "../../components/ActorName.js";
12
- import { Comments as _ } from "../../components/Comments.js";
13
- import { AddToLookbookButton as v } from "../../components/AddToLookbookButton.js";
14
- import { FollowButton as y } from "../../components/FollowButton.js";
15
- import { ArrowLeft as b, Bookmark as x, Heart as S, Loader2 as C, Rocket as w, Sparkles as T, Star as E, Trash2 as D } from "lucide-react";
16
- import { useParams as O } from "react-router-dom";
17
- import { jsx as k, jsxs as A } from "react/jsx-runtime";
18
- import { GlassCard as j } from "@burdenoff/fe-libs/ui";
12
+ import { Comments as g } from "../../components/Comments.js";
13
+ import { FollowButton as _ } from "../../components/FollowButton.js";
14
+ import { ShopItemCard as v } from "../../components/ShopItemCard.js";
15
+ import { useMemo as y, useState as b } from "react";
16
+ import { ArrowLeft as x, Bookmark as S, Heart as C, Loader2 as w, Rocket as T, Sparkles as E, Star as D, Trash2 as O } from "lucide-react";
17
+ import { useParams as k } from "react-router-dom";
18
+ import { jsx as A, jsxs as j } from "react/jsx-runtime";
19
+ import { GlassCard as M } from "@burdenoff/fe-libs/ui";
20
+ import { useActorProfiles as N } from "@burdenoff/fe-libs/shared";
19
21
  //#region src/coolandlovely/pages/looks/LookDetailPage.tsx
20
- function M() {
21
- let { lookId: M } = O(), { navigateTo: N, currentUser: P } = e(), F = l(M), I = c(), L = u(), R = s(), z = d();
22
- if (F.isLoading) return /* @__PURE__ */ k(n, {
22
+ function P(e) {
23
+ let t = e.trim().split(/\s+/).filter(Boolean);
24
+ return t.length === 0 ? "?" : t.length === 1 ? t[0].slice(0, 2).toUpperCase() : (t[0][0] + t[t.length - 1][0]).toUpperCase();
25
+ }
26
+ function F({ authorId: t }) {
27
+ let { apiGatewayUrl: n, authToken: r, workspaceId: i } = e(), [a, o] = b(!1), s = N(y(() => [{
28
+ actorId: t,
29
+ actorType: "user"
30
+ }], [t]), {
31
+ apiGatewayUrl: n,
32
+ authToken: r,
33
+ workspaceId: i
34
+ })[t], c = s?.displayName ?? "Creator", l = s?.avatarUrl;
35
+ return /* @__PURE__ */ j("span", {
36
+ className: "inline-flex items-center gap-2",
37
+ children: [/* @__PURE__ */ A("span", {
38
+ title: c,
39
+ className: "relative flex h-7 w-7 shrink-0 items-center justify-center overflow-hidden rounded-full bg-bg-sunken ring-1 ring-border-seam",
40
+ children: l && !a ? /* @__PURE__ */ A("img", {
41
+ src: l,
42
+ alt: c,
43
+ loading: "lazy",
44
+ onError: () => o(!0),
45
+ className: "h-full w-full object-cover"
46
+ }) : /* @__PURE__ */ A("span", {
47
+ className: "text-[10px] font-semibold text-text-secondary",
48
+ children: P(c)
49
+ })
50
+ }), /* @__PURE__ */ A("span", {
51
+ className: "font-medium text-text-primary",
52
+ title: s?.email ?? t,
53
+ children: c
54
+ })]
55
+ });
56
+ }
57
+ function I() {
58
+ let { lookId: y } = k(), { navigateTo: b, currentUser: N } = e(), P = l(y), I = c(), L = u(), R = s(), z = d();
59
+ if (P.isLoading) return /* @__PURE__ */ A(n, {
23
60
  title: "Look",
24
- children: /* @__PURE__ */ k(a, { label: "Loading look…" })
61
+ children: /* @__PURE__ */ A(a, { label: "Loading look…" })
25
62
  });
26
- if (F.isError || !F.data) return /* @__PURE__ */ k(n, {
63
+ if (P.isError || !P.data) return /* @__PURE__ */ A(n, {
27
64
  title: "Look",
28
- children: /* @__PURE__ */ k(i, {
65
+ children: /* @__PURE__ */ A(i, {
29
66
  title: "Look not found",
30
- onRetry: () => void F.refetch()
67
+ onRetry: () => void P.refetch()
31
68
  })
32
69
  });
33
- let B = F.data, V = B.items ?? [], H = B.publishedAt !== null, U = !!(P?.id && P.id === B.authorId);
34
- return /* @__PURE__ */ k(n, {
70
+ let B = P.data, V = B.items ?? [], H = B.publishedAt !== null, U = !!(N?.id && N.id === B.authorId);
71
+ return /* @__PURE__ */ A(n, {
35
72
  title: B.title,
36
73
  description: m(B.occasion),
37
- actions: /* @__PURE__ */ A("div", {
74
+ actions: /* @__PURE__ */ j("div", {
38
75
  className: "flex flex-wrap items-center gap-2",
39
76
  children: [
40
- /* @__PURE__ */ A("button", {
77
+ /* @__PURE__ */ j("button", {
41
78
  type: "button",
42
- onClick: () => N("/looks"),
79
+ onClick: () => b("/looks"),
43
80
  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",
44
- children: [/* @__PURE__ */ k(b, { className: "h-4 w-4" }), " Back"]
81
+ children: [/* @__PURE__ */ A(x, { className: "h-4 w-4" }), " Back"]
45
82
  }),
46
- /* @__PURE__ */ k(v, { lookId: B.id }),
47
- /* @__PURE__ */ A("button", {
83
+ /* @__PURE__ */ A(f, { lookId: B.id }),
84
+ /* @__PURE__ */ j("button", {
48
85
  type: "button",
49
86
  disabled: z.isPending,
50
87
  onClick: () => z.mutate({
@@ -53,94 +90,87 @@ function M() {
53
90
  }),
54
91
  "aria-pressed": B.isFeatured,
55
92
  className: t("inline-flex items-center gap-1.5 rounded-lg border px-3 py-2 text-sm font-medium transition-colors disabled:opacity-50", B.isFeatured ? "border-status-warning-text/40 bg-status-warning-bg-subtle text-status-warning-text" : "border-border-seam text-text-primary hover:bg-bg-sunken"),
56
- children: [z.isPending ? /* @__PURE__ */ k(C, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ k(E, { className: t("h-4 w-4", B.isFeatured && "fill-status-warning-text") }), B.isFeatured ? "Featured" : "Feature"]
93
+ children: [z.isPending ? /* @__PURE__ */ A(w, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ A(D, { className: t("h-4 w-4", B.isFeatured && "fill-status-warning-text") }), B.isFeatured ? "Featured" : "Feature"]
57
94
  }),
58
- !H && /* @__PURE__ */ A("button", {
95
+ !H && /* @__PURE__ */ j("button", {
59
96
  type: "button",
60
97
  disabled: L.isPending,
61
98
  onClick: () => L.mutate(B.id),
62
99
  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 disabled:opacity-50",
63
- children: [L.isPending ? /* @__PURE__ */ k(C, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ k(w, { className: "h-4 w-4" }), "Publish"]
100
+ children: [L.isPending ? /* @__PURE__ */ A(w, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ A(T, { className: "h-4 w-4" }), "Publish"]
64
101
  }),
65
- /* @__PURE__ */ A("button", {
102
+ /* @__PURE__ */ j("button", {
66
103
  type: "button",
67
104
  disabled: R.isPending,
68
- onClick: () => R.mutate(B.id, { onSuccess: () => N("/looks") }),
105
+ onClick: () => R.mutate(B.id, { onSuccess: () => b("/looks") }),
69
106
  className: "inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50",
70
- children: [R.isPending ? /* @__PURE__ */ k(C, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ k(D, { className: "h-4 w-4" }), "Delete"]
107
+ children: [R.isPending ? /* @__PURE__ */ A(w, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ A(O, { className: "h-4 w-4" }), "Delete"]
71
108
  })
72
109
  ]
73
110
  }),
74
- children: /* @__PURE__ */ A("div", {
111
+ children: /* @__PURE__ */ j("div", {
75
112
  className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
76
- children: [/* @__PURE__ */ A("div", {
113
+ children: [/* @__PURE__ */ j("div", {
77
114
  className: "lg:col-span-2",
78
115
  children: [
79
- /* @__PURE__ */ A(j, {
116
+ /* @__PURE__ */ j(M, {
80
117
  treatment: "glass",
81
- className: "overflow-hidden p-0",
82
- children: [/* @__PURE__ */ k(o, {
83
- icon: /* @__PURE__ */ k(T, { className: "h-14 w-14" }),
118
+ className: "group overflow-hidden p-0",
119
+ children: [/* @__PURE__ */ A(o, {
120
+ icon: /* @__PURE__ */ A(E, { className: "h-14 w-14" }),
84
121
  seed: B.id,
85
122
  fileId: B.image?.id,
86
123
  alt: B.title,
87
- className: "h-60 w-full"
88
- }), /* @__PURE__ */ A("div", {
124
+ className: "aspect-[4/5] max-h-[38rem] w-full rounded-none"
125
+ }), /* @__PURE__ */ j("div", {
89
126
  className: "p-6",
90
127
  children: [
91
- /* @__PURE__ */ A("div", {
128
+ /* @__PURE__ */ j("div", {
92
129
  className: "flex items-center gap-2",
93
130
  children: [
94
- /* @__PURE__ */ k("h2", {
131
+ /* @__PURE__ */ A("h2", {
95
132
  className: "text-xl font-semibold text-text-primary",
96
133
  children: B.title
97
134
  }),
98
- B.isFeatured && /* @__PURE__ */ k(E, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" }),
99
- /* @__PURE__ */ k(r, {
135
+ B.isFeatured && /* @__PURE__ */ A(D, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" }),
136
+ /* @__PURE__ */ A(r, {
100
137
  status: H ? "published" : "draft",
101
138
  className: "ml-auto"
102
139
  })
103
140
  ]
104
141
  }),
105
- B.caption && /* @__PURE__ */ k("p", {
142
+ B.caption && /* @__PURE__ */ A("p", {
106
143
  className: "mt-3 text-sm text-text-secondary",
107
144
  children: B.caption
108
145
  }),
109
- B.tags.length > 0 && /* @__PURE__ */ k(h, {
146
+ B.tags.length > 0 && /* @__PURE__ */ A(h, {
110
147
  tags: B.tags,
111
148
  className: "mt-4",
112
149
  tone: "accent"
113
150
  }),
114
- /* @__PURE__ */ A("div", {
115
- className: "mt-4 flex flex-wrap items-center gap-2 text-sm text-text-secondary",
116
- children: [/* @__PURE__ */ A("span", { children: [
117
- "By",
118
- " ",
119
- /* @__PURE__ */ k(g, {
120
- id: B.authorId,
121
- className: "font-medium text-text-primary"
122
- })
123
- ] }), !U && /* @__PURE__ */ k(y, {
151
+ /* @__PURE__ */ j("div", {
152
+ className: "mt-4 flex flex-wrap items-center gap-3 text-sm text-text-secondary",
153
+ children: [/* @__PURE__ */ A(F, { authorId: B.authorId }), !U && /* @__PURE__ */ A(_, {
124
154
  followeeId: B.authorId,
125
155
  size: "sm"
126
156
  })]
127
157
  }),
128
- /* @__PURE__ */ A("div", {
158
+ /* @__PURE__ */ j("div", {
129
159
  className: "mt-5 flex items-center gap-3",
130
- children: [/* @__PURE__ */ A("button", {
160
+ children: [/* @__PURE__ */ j("button", {
131
161
  type: "button",
132
162
  disabled: I.isPending,
133
163
  onClick: () => I.mutate(B.id),
134
164
  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-status-error-bg-subtle disabled:opacity-50",
135
165
  children: [
136
- I.isPending ? /* @__PURE__ */ k(C, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ k(S, { className: "h-4 w-4" }),
166
+ I.isPending ? /* @__PURE__ */ A(w, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ A(C, { className: "h-4 w-4" }),
137
167
  "Like · ",
138
168
  B.likeCount
139
169
  ]
140
- }), /* @__PURE__ */ A("span", {
170
+ }), /* @__PURE__ */ j("span", {
141
171
  className: "inline-flex items-center gap-1.5 text-sm text-text-secondary",
142
172
  children: [
143
- /* @__PURE__ */ k(x, { className: "h-4 w-4" }),
173
+ /* @__PURE__ */ A(S, { className: "h-4 w-4" }),
144
174
  " ",
145
175
  B.saveCount,
146
176
  " saves"
@@ -150,93 +180,85 @@ function M() {
150
180
  ]
151
181
  })]
152
182
  }),
153
- /* @__PURE__ */ A("section", {
183
+ /* @__PURE__ */ j("section", {
154
184
  className: "mt-6",
155
- children: [/* @__PURE__ */ A("h3", {
185
+ children: [/* @__PURE__ */ j("h3", {
156
186
  className: "mb-3 text-lg font-semibold text-text-primary",
157
187
  children: [
158
188
  "Shop the look (",
159
189
  V.length,
160
190
  ")"
161
191
  ]
162
- }), V.length === 0 ? /* @__PURE__ */ k("p", {
192
+ }), V.length === 0 ? /* @__PURE__ */ A("p", {
163
193
  className: "rounded-lg border border-border-seam bg-bg-surface p-4 text-sm text-text-secondary",
164
194
  children: "No items tagged in this look yet."
165
- }) : /* @__PURE__ */ k("div", {
166
- className: "divide-y divide-border-seam rounded-lg border border-border-seam bg-bg-surface",
167
- children: [...V].sort((e, t) => e.position - t.position).map((e) => /* @__PURE__ */ A("button", {
168
- type: "button",
169
- onClick: () => e.styleItem && N(`/items/${e.styleItem.id}`),
170
- className: "flex w-full items-center gap-4 px-4 py-3 text-left transition-colors hover:bg-bg-sunken/50",
171
- children: [
172
- /* @__PURE__ */ k(o, {
173
- icon: /* @__PURE__ */ k(T, { className: "h-5 w-5" }),
174
- seed: e.id,
175
- className: "h-11 w-11 shrink-0"
176
- }),
177
- /* @__PURE__ */ A("div", {
178
- className: "min-w-0 flex-1",
179
- children: [/* @__PURE__ */ k("p", {
180
- className: "truncate text-sm font-medium text-text-primary",
181
- children: e.styleItem?.name ?? "Catalogue piece"
182
- }), e.styling && /* @__PURE__ */ k("p", {
183
- className: "truncate text-xs text-text-secondary",
184
- children: e.styling
185
- })]
186
- }),
187
- e.styleItem && /* @__PURE__ */ k("span", {
188
- className: "shrink-0 text-sm font-semibold text-text-primary",
189
- children: p(e.styleItem.price, e.styleItem.currency)
190
- })
191
- ]
195
+ }) : /* @__PURE__ */ A("div", {
196
+ className: "grid grid-cols-1 gap-3 sm:grid-cols-2",
197
+ children: [...V].sort((e, t) => e.position - t.position).map((e) => e.styleItem ? /* @__PURE__ */ A(v, {
198
+ id: e.styleItem.id,
199
+ name: e.styleItem.name,
200
+ brandName: e.styleItem.brand?.name,
201
+ price: e.styleItem.price,
202
+ currency: e.styleItem.currency,
203
+ imageFileId: e.styleItem.image?.id,
204
+ onOpen: () => b(`/items/${e.styleItem?.id}`)
205
+ }, e.id) : /* @__PURE__ */ j("div", {
206
+ className: "flex flex-col justify-center rounded-xl border border-border-seam bg-bg-surface p-4",
207
+ children: [/* @__PURE__ */ A("p", {
208
+ className: "truncate text-sm font-medium text-text-primary",
209
+ children: "Catalogue piece"
210
+ }), e.styling && /* @__PURE__ */ A("p", {
211
+ className: "mt-0.5 truncate text-xs text-text-secondary",
212
+ children: e.styling
213
+ })]
192
214
  }, e.id))
193
215
  })]
194
216
  }),
195
- /* @__PURE__ */ k(_, {
217
+ /* @__PURE__ */ A(g, {
196
218
  entityType: "CooLook",
197
219
  entityId: B.id
198
220
  })
199
221
  ]
200
- }), /* @__PURE__ */ A("div", {
222
+ }), /* @__PURE__ */ j("div", {
201
223
  className: "space-y-4",
202
224
  children: [
203
- /* @__PURE__ */ A(j, {
225
+ /* @__PURE__ */ j(M, {
204
226
  treatment: "plain",
205
227
  className: "p-5",
206
- children: [/* @__PURE__ */ k("h3", {
228
+ children: [/* @__PURE__ */ A("h3", {
207
229
  className: "mb-3 text-sm font-semibold text-text-primary",
208
230
  children: "Details"
209
- }), /* @__PURE__ */ A("dl", {
231
+ }), /* @__PURE__ */ j("dl", {
210
232
  className: "space-y-2 text-sm",
211
233
  children: [
212
- /* @__PURE__ */ A("div", {
234
+ /* @__PURE__ */ j("div", {
213
235
  className: "flex justify-between gap-2",
214
- children: [/* @__PURE__ */ k("dt", {
236
+ children: [/* @__PURE__ */ A("dt", {
215
237
  className: "text-text-secondary",
216
238
  children: "Occasion"
217
- }), /* @__PURE__ */ k("dd", {
239
+ }), /* @__PURE__ */ A("dd", {
218
240
  className: "text-text-primary",
219
241
  children: m(B.occasion)
220
242
  })]
221
243
  }),
222
- /* @__PURE__ */ A("div", {
244
+ /* @__PURE__ */ j("div", {
223
245
  className: "flex justify-between gap-2",
224
- children: [/* @__PURE__ */ k("dt", {
246
+ children: [/* @__PURE__ */ A("dt", {
225
247
  className: "text-text-secondary",
226
248
  children: "Visibility"
227
- }), /* @__PURE__ */ k("dd", {
249
+ }), /* @__PURE__ */ A("dd", {
228
250
  className: "text-text-primary",
229
251
  children: m(B.visibility)
230
252
  })]
231
253
  }),
232
- /* @__PURE__ */ A("div", {
254
+ /* @__PURE__ */ j("div", {
233
255
  className: "flex justify-between gap-2",
234
- children: [/* @__PURE__ */ k("dt", {
256
+ children: [/* @__PURE__ */ A("dt", {
235
257
  className: "text-text-secondary",
236
258
  children: "Published"
237
- }), /* @__PURE__ */ k("dd", {
259
+ }), /* @__PURE__ */ A("dd", {
238
260
  className: "text-text-primary",
239
- children: B.publishedAt ? f(B.publishedAt, {
261
+ children: B.publishedAt ? p(B.publishedAt, {
240
262
  hour: void 0,
241
263
  minute: void 0
242
264
  }) : "—"
@@ -245,25 +267,25 @@ function M() {
245
267
  ]
246
268
  })]
247
269
  }),
248
- B.collaborationId && /* @__PURE__ */ A("button", {
270
+ B.collaborationId && /* @__PURE__ */ j("button", {
249
271
  type: "button",
250
- onClick: () => N(`/collaborations/${B.collaborationId}`),
272
+ onClick: () => b(`/collaborations/${B.collaborationId}`),
251
273
  className: "flex w-full items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 text-left transition-colors hover:bg-bg-sunken/50",
252
- children: [/* @__PURE__ */ k("div", {
274
+ children: [/* @__PURE__ */ A("div", {
253
275
  className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-warning-bg-subtle text-status-warning-text",
254
- children: /* @__PURE__ */ k(T, { className: "h-5 w-5" })
255
- }), /* @__PURE__ */ A("div", {
276
+ children: /* @__PURE__ */ A(E, { className: "h-5 w-5" })
277
+ }), /* @__PURE__ */ j("div", {
256
278
  className: "min-w-0",
257
- children: [/* @__PURE__ */ k("p", {
279
+ children: [/* @__PURE__ */ A("p", {
258
280
  className: "truncate text-sm font-medium text-text-primary",
259
281
  children: "Part of a collaboration"
260
- }), /* @__PURE__ */ k("p", {
282
+ }), /* @__PURE__ */ A("p", {
261
283
  className: "truncate text-xs text-text-secondary",
262
284
  children: "View collaboration"
263
285
  })]
264
286
  })]
265
287
  }),
266
- (L.isError || R.isError || I.isError) && /* @__PURE__ */ k("p", {
288
+ (L.isError || R.isError || I.isError) && /* @__PURE__ */ A("p", {
267
289
  className: "rounded-lg bg-status-error-bg-subtle px-3 py-2 text-xs text-status-error-text",
268
290
  children: (L.error ?? R.error ?? I.error) instanceof Error ? (L.error ?? R.error ?? I.error)?.message : "Action failed"
269
291
  })
@@ -273,6 +295,6 @@ function M() {
273
295
  });
274
296
  }
275
297
  //#endregion
276
- export { M as LookDetailPage };
298
+ export { I as LookDetailPage };
277
299
 
278
300
  //# sourceMappingURL=LookDetailPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LookDetailPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/looks/LookDetailPage.tsx"],"sourcesContent":["/**\n * Look Detail Page\n * @module coolandlovely/pages/looks\n *\n * Single look (`cooLook`) with its look items, like (`cooLikeLook`), publish\n * (`cooPublishLook`) and delete (`cooDeleteLook`) actions.\n */\n\nimport { useParams } from 'react-router-dom';\nimport { ArrowLeft, Heart, Bookmark, Rocket, Trash2, Loader2, Sparkles, Star } 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 { ActorName } from '../../components/ActorName';\nimport { Comments } from '../../components/Comments';\nimport { FollowButton } from '../../components/FollowButton';\nimport { AddToLookbookButton } from '../../components/AddToLookbookButton';\nimport { useCoolAndLovely } from '../../context/CoolAndLovelyContext';\nimport { useLook, useLikeLook, usePublishLook, useDeleteLook, useUpdateLook } from '../../hooks';\nimport { formatPrice, formatDate, titleCase } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\nexport function LookDetailPage() {\n const { lookId } = useParams<{ lookId: string }>();\n const { navigateTo, currentUser } = useCoolAndLovely();\n const query = useLook(lookId);\n const like = useLikeLook();\n const publish = usePublishLook();\n const remove = useDeleteLook();\n const update = useUpdateLook();\n\n if (query.isLoading) {\n return (\n <PageLayout title=\"Look\">\n <LoadingView label=\"Loading look…\" />\n </PageLayout>\n );\n }\n\n if (query.isError || !query.data) {\n return (\n <PageLayout title=\"Look\">\n <ErrorView title=\"Look not found\" onRetry={() => void query.refetch()} />\n </PageLayout>\n );\n }\n\n const look = query.data;\n const items = look.items ?? [];\n const isPublished = look.publishedAt !== null;\n const isOwnLook = Boolean(currentUser?.id && currentUser.id === look.authorId);\n\n return (\n <PageLayout\n title={look.title}\n description={titleCase(look.occasion)}\n actions={\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/looks')}\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 <AddToLookbookButton lookId={look.id} />\n <button\n type=\"button\"\n disabled={update.isPending}\n onClick={() => update.mutate({ id: look.id, input: { isFeatured: !look.isFeatured } })}\n aria-pressed={look.isFeatured}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg border px-3 py-2 text-sm font-medium transition-colors disabled:opacity-50',\n look.isFeatured\n ? 'border-status-warning-text/40 bg-status-warning-bg-subtle text-status-warning-text'\n : 'border-border-seam text-text-primary hover:bg-bg-sunken'\n )}\n >\n {update.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Star className={cn('h-4 w-4', look.isFeatured && 'fill-status-warning-text')} />\n )}\n {look.isFeatured ? 'Featured' : 'Feature'}\n </button>\n {!isPublished && (\n <button\n type=\"button\"\n disabled={publish.isPending}\n onClick={() => publish.mutate(look.id)}\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 disabled:opacity-50\"\n >\n {publish.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Rocket className=\"h-4 w-4\" />\n )}\n Publish\n </button>\n )}\n <button\n type=\"button\"\n disabled={remove.isPending}\n onClick={() => remove.mutate(look.id, { onSuccess: () => navigateTo('/looks') })}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50\"\n >\n {remove.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Trash2 className=\"h-4 w-4\" />\n )}\n Delete\n </button>\n </div>\n }\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2\">\n <GlassCard treatment=\"glass\" className=\"overflow-hidden p-0\">\n <Thumbnail\n icon={<Sparkles className=\"h-14 w-14\" />}\n seed={look.id}\n fileId={look.image?.id}\n alt={look.title}\n className=\"h-60 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\">{look.title}</h2>\n {look.isFeatured && (\n <Star className=\"h-4 w-4 fill-status-warning-text text-status-warning-text\" />\n )}\n <StatusBadge status={isPublished ? 'published' : 'draft'} className=\"ml-auto\" />\n </div>\n {look.caption && <p className=\"mt-3 text-sm text-text-secondary\">{look.caption}</p>}\n {look.tags.length > 0 && <TagList tags={look.tags} className=\"mt-4\" tone=\"accent\" />}\n\n <div className=\"mt-4 flex flex-wrap items-center gap-2 text-sm text-text-secondary\">\n <span>\n By{' '}\n <ActorName id={look.authorId} className=\"font-medium text-text-primary\" />\n </span>\n {!isOwnLook && <FollowButton followeeId={look.authorId} size=\"sm\" />}\n </div>\n\n <div className=\"mt-5 flex items-center gap-3\">\n <button\n type=\"button\"\n disabled={like.isPending}\n onClick={() => like.mutate(look.id)}\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-status-error-bg-subtle disabled:opacity-50\"\n >\n {like.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Heart className=\"h-4 w-4\" />\n )}\n Like · {look.likeCount}\n </button>\n <span className=\"inline-flex items-center gap-1.5 text-sm text-text-secondary\">\n <Bookmark className=\"h-4 w-4\" /> {look.saveCount} saves\n </span>\n </div>\n </div>\n </GlassCard>\n\n {/* Shop the look */}\n <section className=\"mt-6\">\n <h3 className=\"mb-3 text-lg font-semibold text-text-primary\">\n Shop the look ({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 tagged in this look yet.\n </p>\n ) : (\n <div className=\"divide-y divide-border-seam rounded-lg border border-border-seam bg-bg-surface\">\n {[...items]\n .sort((a, b) => a.position - b.position)\n .map((li) => (\n <button\n key={li.id}\n type=\"button\"\n onClick={() => li.styleItem && navigateTo(`/items/${li.styleItem.id}`)}\n className=\"flex w-full items-center gap-4 px-4 py-3 text-left transition-colors hover:bg-bg-sunken/50\"\n >\n <Thumbnail\n icon={<Sparkles className=\"h-5 w-5\" />}\n seed={li.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\">\n {li.styleItem?.name ?? 'Catalogue piece'}\n </p>\n {li.styling && (\n <p className=\"truncate text-xs text-text-secondary\">{li.styling}</p>\n )}\n </div>\n {li.styleItem && (\n <span className=\"shrink-0 text-sm font-semibold text-text-primary\">\n {formatPrice(li.styleItem.price, li.styleItem.currency)}\n </span>\n )}\n </button>\n ))}\n </div>\n )}\n </section>\n\n <Comments entityType=\"CooLook\" entityId={look.id} />\n </div>\n\n <div className=\"space-y-4\">\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\">Occasion</dt>\n <dd className=\"text-text-primary\">{titleCase(look.occasion)}</dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Visibility</dt>\n <dd className=\"text-text-primary\">{titleCase(look.visibility)}</dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Published</dt>\n <dd className=\"text-text-primary\">\n {look.publishedAt\n ? formatDate(look.publishedAt, { hour: undefined, minute: undefined })\n : '—'}\n </dd>\n </div>\n </dl>\n </GlassCard>\n\n {look.collaborationId && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/collaborations/${look.collaborationId}`)}\n className=\"flex w-full items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 text-left transition-colors hover:bg-bg-sunken/50\"\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-warning-bg-subtle text-status-warning-text\">\n <Sparkles className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n Part of a collaboration\n </p>\n <p className=\"truncate text-xs text-text-secondary\">View collaboration</p>\n </div>\n </button>\n )}\n\n {(publish.isError || remove.isError || like.isError) && (\n <p className=\"rounded-lg bg-status-error-bg-subtle px-3 py-2 text-xs text-status-error-text\">\n {(publish.error ?? remove.error ?? like.error) instanceof Error\n ? (publish.error ?? remove.error ?? like.error)?.message\n : 'Action failed'}\n </p>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"LookDetailPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/looks/LookDetailPage.tsx"],"sourcesContent":["/**\n * Look Detail Page\n * @module coolandlovely/pages/looks\n *\n * Single look (`cooLook`) with its look items, like (`cooLikeLook`), publish\n * (`cooPublishLook`) and delete (`cooDeleteLook`) actions.\n */\n\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { ArrowLeft, Heart, Bookmark, Rocket, Trash2, Loader2, Sparkles, Star } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { useActorProfiles, type ActorInput } from '@burdenoff/fe-libs/shared';\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 { FollowButton } from '../../components/FollowButton';\nimport { AddToLookbookButton } from '../../components/AddToLookbookButton';\nimport { ShopItemCard } from '../../components/ShopItemCard';\nimport { useCoolAndLovely } from '../../context/CoolAndLovelyContext';\nimport { useLook, useLikeLook, usePublishLook, useDeleteLook, useUpdateLook } from '../../hooks';\nimport { formatDate, titleCase } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\n/** Compute up-to-two-letter initials for the avatar fallback. */\nfunction initials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\n/**\n * Author chip — avatar + display name resolved via fe-libs `useActorProfiles`\n * on the GLOBAL gateway (never select firstName on a federated wspace User).\n */\nfunction LookAuthor({ authorId }: { authorId: string }) {\n const { apiGatewayUrl, authToken, workspaceId } = useCoolAndLovely();\n const [avatarFailed, setAvatarFailed] = useState(false);\n const actors = useMemo<ActorInput[]>(\n () => [{ actorId: authorId, actorType: 'user' }],\n [authorId]\n );\n const profiles = useActorProfiles(actors, { apiGatewayUrl, authToken, workspaceId });\n const profile = profiles[authorId];\n const name = profile?.displayName ?? 'Creator';\n const avatarUrl = profile?.avatarUrl;\n\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span\n title={name}\n className=\"relative flex h-7 w-7 shrink-0 items-center justify-center overflow-hidden rounded-full bg-bg-sunken ring-1 ring-border-seam\"\n >\n {avatarUrl && !avatarFailed ? (\n <img\n src={avatarUrl}\n alt={name}\n loading=\"lazy\"\n onError={() => setAvatarFailed(true)}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <span className=\"text-[10px] font-semibold text-text-secondary\">{initials(name)}</span>\n )}\n </span>\n <span className=\"font-medium text-text-primary\" title={profile?.email ?? authorId}>\n {name}\n </span>\n </span>\n );\n}\n\nexport function LookDetailPage() {\n const { lookId } = useParams<{ lookId: string }>();\n const { navigateTo, currentUser } = useCoolAndLovely();\n const query = useLook(lookId);\n const like = useLikeLook();\n const publish = usePublishLook();\n const remove = useDeleteLook();\n const update = useUpdateLook();\n\n if (query.isLoading) {\n return (\n <PageLayout title=\"Look\">\n <LoadingView label=\"Loading look…\" />\n </PageLayout>\n );\n }\n\n if (query.isError || !query.data) {\n return (\n <PageLayout title=\"Look\">\n <ErrorView title=\"Look not found\" onRetry={() => void query.refetch()} />\n </PageLayout>\n );\n }\n\n const look = query.data;\n const items = look.items ?? [];\n const isPublished = look.publishedAt !== null;\n const isOwnLook = Boolean(currentUser?.id && currentUser.id === look.authorId);\n\n return (\n <PageLayout\n title={look.title}\n description={titleCase(look.occasion)}\n actions={\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/looks')}\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 <AddToLookbookButton lookId={look.id} />\n <button\n type=\"button\"\n disabled={update.isPending}\n onClick={() => update.mutate({ id: look.id, input: { isFeatured: !look.isFeatured } })}\n aria-pressed={look.isFeatured}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg border px-3 py-2 text-sm font-medium transition-colors disabled:opacity-50',\n look.isFeatured\n ? 'border-status-warning-text/40 bg-status-warning-bg-subtle text-status-warning-text'\n : 'border-border-seam text-text-primary hover:bg-bg-sunken'\n )}\n >\n {update.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Star className={cn('h-4 w-4', look.isFeatured && 'fill-status-warning-text')} />\n )}\n {look.isFeatured ? 'Featured' : 'Feature'}\n </button>\n {!isPublished && (\n <button\n type=\"button\"\n disabled={publish.isPending}\n onClick={() => publish.mutate(look.id)}\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 disabled:opacity-50\"\n >\n {publish.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Rocket className=\"h-4 w-4\" />\n )}\n Publish\n </button>\n )}\n <button\n type=\"button\"\n disabled={remove.isPending}\n onClick={() => remove.mutate(look.id, { onSuccess: () => navigateTo('/looks') })}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50\"\n >\n {remove.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Trash2 className=\"h-4 w-4\" />\n )}\n Delete\n </button>\n </div>\n }\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2\">\n <GlassCard treatment=\"glass\" className=\"group overflow-hidden p-0\">\n <Thumbnail\n icon={<Sparkles className=\"h-14 w-14\" />}\n seed={look.id}\n fileId={look.image?.id}\n alt={look.title}\n className=\"aspect-[4/5] max-h-[38rem] w-full rounded-none\"\n />\n <div className=\"p-6\">\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-xl font-semibold text-text-primary\">{look.title}</h2>\n {look.isFeatured && (\n <Star className=\"h-4 w-4 fill-status-warning-text text-status-warning-text\" />\n )}\n <StatusBadge status={isPublished ? 'published' : 'draft'} className=\"ml-auto\" />\n </div>\n {look.caption && <p className=\"mt-3 text-sm text-text-secondary\">{look.caption}</p>}\n {look.tags.length > 0 && <TagList tags={look.tags} className=\"mt-4\" tone=\"accent\" />}\n\n <div className=\"mt-4 flex flex-wrap items-center gap-3 text-sm text-text-secondary\">\n <LookAuthor authorId={look.authorId} />\n {!isOwnLook && <FollowButton followeeId={look.authorId} size=\"sm\" />}\n </div>\n\n <div className=\"mt-5 flex items-center gap-3\">\n <button\n type=\"button\"\n disabled={like.isPending}\n onClick={() => like.mutate(look.id)}\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-status-error-bg-subtle disabled:opacity-50\"\n >\n {like.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Heart className=\"h-4 w-4\" />\n )}\n Like · {look.likeCount}\n </button>\n <span className=\"inline-flex items-center gap-1.5 text-sm text-text-secondary\">\n <Bookmark className=\"h-4 w-4\" /> {look.saveCount} saves\n </span>\n </div>\n </div>\n </GlassCard>\n\n {/* Shop the look */}\n <section className=\"mt-6\">\n <h3 className=\"mb-3 text-lg font-semibold text-text-primary\">\n Shop the look ({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 tagged in this look yet.\n </p>\n ) : (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {[...items]\n .sort((a, b) => a.position - b.position)\n .map((li) =>\n li.styleItem ? (\n <ShopItemCard\n key={li.id}\n id={li.styleItem.id}\n name={li.styleItem.name}\n brandName={li.styleItem.brand?.name}\n price={li.styleItem.price}\n currency={li.styleItem.currency}\n imageFileId={li.styleItem.image?.id}\n onOpen={() => navigateTo(`/items/${li.styleItem?.id}`)}\n />\n ) : (\n <div\n key={li.id}\n className=\"flex flex-col justify-center rounded-xl border border-border-seam bg-bg-surface p-4\"\n >\n <p className=\"truncate text-sm font-medium text-text-primary\">\n Catalogue piece\n </p>\n {li.styling && (\n <p className=\"mt-0.5 truncate text-xs text-text-secondary\">\n {li.styling}\n </p>\n )}\n </div>\n )\n )}\n </div>\n )}\n </section>\n\n <Comments entityType=\"CooLook\" entityId={look.id} />\n </div>\n\n <div className=\"space-y-4\">\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\">Occasion</dt>\n <dd className=\"text-text-primary\">{titleCase(look.occasion)}</dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Visibility</dt>\n <dd className=\"text-text-primary\">{titleCase(look.visibility)}</dd>\n </div>\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-text-secondary\">Published</dt>\n <dd className=\"text-text-primary\">\n {look.publishedAt\n ? formatDate(look.publishedAt, { hour: undefined, minute: undefined })\n : '—'}\n </dd>\n </div>\n </dl>\n </GlassCard>\n\n {look.collaborationId && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/collaborations/${look.collaborationId}`)}\n className=\"flex w-full items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 text-left transition-colors hover:bg-bg-sunken/50\"\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-warning-bg-subtle text-status-warning-text\">\n <Sparkles className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n Part of a collaboration\n </p>\n <p className=\"truncate text-xs text-text-secondary\">View collaboration</p>\n </div>\n </button>\n )}\n\n {(publish.isError || remove.isError || like.isError) && (\n <p className=\"rounded-lg bg-status-error-bg-subtle px-3 py-2 text-xs text-status-error-text\">\n {(publish.error ?? remove.error ?? like.error) instanceof Error\n ? (publish.error ?? remove.error ?? like.error)?.message\n : 'Action failed'}\n </p>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Look Create Page
3
+ * @module coolandlovely/pages/looks
4
+ *
5
+ * Drives `cooCreateLook`. A look is created with its title/occasion/visibility
6
+ * and an inline list of look items (catalogue pieces + styling notes), matching
7
+ * the `CooCreateLookInput` shape exactly.
8
+ */
9
+ export declare function LookFormPage(): import("react").JSX.Element;
10
+ //# sourceMappingURL=LookFormPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LookFormPage.d.ts","sourceRoot":"","sources":["../../../../src/coolandlovely/pages/looks/LookFormPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiCH,wBAAgB,YAAY,gCA2T3B"}