@stapel/listings-react 0.1.0

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 (225) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/MODULE.md +191 -0
  3. package/README.md +169 -0
  4. package/dist/api/generated/schema.d.ts +1253 -0
  5. package/dist/api/generated/schema.d.ts.map +1 -0
  6. package/dist/api/generated/schema.js +2 -0
  7. package/dist/api/generated/schema.js.map +1 -0
  8. package/dist/api/listingsApi.d.ts +145 -0
  9. package/dist/api/listingsApi.d.ts.map +1 -0
  10. package/dist/api/listingsApi.js +38 -0
  11. package/dist/api/listingsApi.js.map +1 -0
  12. package/dist/api/types.d.ts +156 -0
  13. package/dist/api/types.d.ts.map +1 -0
  14. package/dist/api/types.js +37 -0
  15. package/dist/api/types.js.map +1 -0
  16. package/dist/default/ErrorAlert.d.ts +9 -0
  17. package/dist/default/ErrorAlert.d.ts.map +1 -0
  18. package/dist/default/ErrorAlert.js +27 -0
  19. package/dist/default/ErrorAlert.js.map +1 -0
  20. package/dist/default/FavoritesPane.d.ts +18 -0
  21. package/dist/default/FavoritesPane.d.ts.map +1 -0
  22. package/dist/default/FavoritesPane.js +28 -0
  23. package/dist/default/FavoritesPane.js.map +1 -0
  24. package/dist/default/ListingCard.d.ts +42 -0
  25. package/dist/default/ListingCard.d.ts.map +1 -0
  26. package/dist/default/ListingCard.js +37 -0
  27. package/dist/default/ListingCard.js.map +1 -0
  28. package/dist/default/ListingComposerPage.d.ts +46 -0
  29. package/dist/default/ListingComposerPage.d.ts.map +1 -0
  30. package/dist/default/ListingComposerPage.js +99 -0
  31. package/dist/default/ListingComposerPage.js.map +1 -0
  32. package/dist/default/ListingDetailPane.d.ts +33 -0
  33. package/dist/default/ListingDetailPane.d.ts.map +1 -0
  34. package/dist/default/ListingDetailPane.js +48 -0
  35. package/dist/default/ListingDetailPane.js.map +1 -0
  36. package/dist/default/ListingPhoto.d.ts +25 -0
  37. package/dist/default/ListingPhoto.d.ts.map +1 -0
  38. package/dist/default/ListingPhoto.js +20 -0
  39. package/dist/default/ListingPhoto.js.map +1 -0
  40. package/dist/default/MyListingsPane.d.ts +25 -0
  41. package/dist/default/MyListingsPane.d.ts.map +1 -0
  42. package/dist/default/MyListingsPane.js +84 -0
  43. package/dist/default/MyListingsPane.js.map +1 -0
  44. package/dist/default/StatusTags.d.ts +31 -0
  45. package/dist/default/StatusTags.d.ts.map +1 -0
  46. package/dist/default/StatusTags.js +40 -0
  47. package/dist/default/StatusTags.js.map +1 -0
  48. package/dist/default/icons.d.ts +16 -0
  49. package/dist/default/icons.d.ts.map +1 -0
  50. package/dist/default/icons.js +5 -0
  51. package/dist/default/icons.js.map +1 -0
  52. package/dist/default/index.d.ts +35 -0
  53. package/dist/default/index.d.ts.map +1 -0
  54. package/dist/default/index.js +26 -0
  55. package/dist/default/index.js.map +1 -0
  56. package/dist/default/theme.d.ts +25 -0
  57. package/dist/default/theme.d.ts.map +1 -0
  58. package/dist/default/theme.js +40 -0
  59. package/dist/default/theme.js.map +1 -0
  60. package/dist/default/types.d.ts +12 -0
  61. package/dist/default/types.d.ts.map +1 -0
  62. package/dist/default/types.js +2 -0
  63. package/dist/default/types.js.map +1 -0
  64. package/dist/flows/registry.d.ts +35 -0
  65. package/dist/flows/registry.d.ts.map +1 -0
  66. package/dist/flows/registry.js +33 -0
  67. package/dist/flows/registry.js.map +1 -0
  68. package/dist/headless/Favorites.d.ts +52 -0
  69. package/dist/headless/Favorites.d.ts.map +1 -0
  70. package/dist/headless/Favorites.js +78 -0
  71. package/dist/headless/Favorites.js.map +1 -0
  72. package/dist/headless/ListingActions.d.ts +30 -0
  73. package/dist/headless/ListingActions.d.ts.map +1 -0
  74. package/dist/headless/ListingActions.js +54 -0
  75. package/dist/headless/ListingActions.js.map +1 -0
  76. package/dist/headless/ListingComposer.d.ts +133 -0
  77. package/dist/headless/ListingComposer.d.ts.map +1 -0
  78. package/dist/headless/ListingComposer.js +246 -0
  79. package/dist/headless/ListingComposer.js.map +1 -0
  80. package/dist/headless/ListingDetail.d.ts +81 -0
  81. package/dist/headless/ListingDetail.d.ts.map +1 -0
  82. package/dist/headless/ListingDetail.js +101 -0
  83. package/dist/headless/ListingDetail.js.map +1 -0
  84. package/dist/headless/ListingsProvider.d.ts +17 -0
  85. package/dist/headless/ListingsProvider.d.ts.map +1 -0
  86. package/dist/headless/ListingsProvider.js +16 -0
  87. package/dist/headless/ListingsProvider.js.map +1 -0
  88. package/dist/headless/MyListings.d.ts +44 -0
  89. package/dist/headless/MyListings.d.ts.map +1 -0
  90. package/dist/headless/MyListings.js +82 -0
  91. package/dist/headless/MyListings.js.map +1 -0
  92. package/dist/headless/useMandateGate.d.ts +28 -0
  93. package/dist/headless/useMandateGate.d.ts.map +1 -0
  94. package/dist/headless/useMandateGate.js +39 -0
  95. package/dist/headless/useMandateGate.js.map +1 -0
  96. package/dist/i18n/errorsMap.d.ts +34 -0
  97. package/dist/i18n/errorsMap.d.ts.map +1 -0
  98. package/dist/i18n/errorsMap.js +45 -0
  99. package/dist/i18n/errorsMap.js.map +1 -0
  100. package/dist/i18n/es.d.ts +21 -0
  101. package/dist/i18n/es.d.ts.map +1 -0
  102. package/dist/i18n/es.js +146 -0
  103. package/dist/i18n/es.js.map +1 -0
  104. package/dist/i18n/generated/errors.es.gen.d.ts +16 -0
  105. package/dist/i18n/generated/errors.es.gen.d.ts.map +1 -0
  106. package/dist/i18n/generated/errors.es.gen.js +58 -0
  107. package/dist/i18n/generated/errors.es.gen.js.map +1 -0
  108. package/dist/i18n/generated/errors.gen.d.ts +413 -0
  109. package/dist/i18n/generated/errors.gen.d.ts.map +1 -0
  110. package/dist/i18n/generated/errors.gen.js +210 -0
  111. package/dist/i18n/generated/errors.gen.js.map +1 -0
  112. package/dist/i18n/generated/errors.ru.gen.d.ts +16 -0
  113. package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -0
  114. package/dist/i18n/generated/errors.ru.gen.js +58 -0
  115. package/dist/i18n/generated/errors.ru.gen.js.map +1 -0
  116. package/dist/i18n/keys.d.ts +170 -0
  117. package/dist/i18n/keys.d.ts.map +1 -0
  118. package/dist/i18n/keys.js +295 -0
  119. package/dist/i18n/keys.js.map +1 -0
  120. package/dist/i18n/ru.d.ts +37 -0
  121. package/dist/i18n/ru.d.ts.map +1 -0
  122. package/dist/i18n/ru.js +162 -0
  123. package/dist/i18n/ru.js.map +1 -0
  124. package/dist/index.d.ts +103 -0
  125. package/dist/index.d.ts.map +1 -0
  126. package/dist/index.js +98 -0
  127. package/dist/index.js.map +1 -0
  128. package/dist/model/context.d.ts +11 -0
  129. package/dist/model/context.d.ts.map +1 -0
  130. package/dist/model/context.js +16 -0
  131. package/dist/model/context.js.map +1 -0
  132. package/dist/model/draft.d.ts +138 -0
  133. package/dist/model/draft.d.ts.map +1 -0
  134. package/dist/model/draft.js +192 -0
  135. package/dist/model/draft.js.map +1 -0
  136. package/dist/model/features.d.ts +69 -0
  137. package/dist/model/features.d.ts.map +1 -0
  138. package/dist/model/features.js +73 -0
  139. package/dist/model/features.js.map +1 -0
  140. package/dist/model/mineSource.d.ts +47 -0
  141. package/dist/model/mineSource.d.ts.map +1 -0
  142. package/dist/model/mineSource.js +45 -0
  143. package/dist/model/mineSource.js.map +1 -0
  144. package/dist/model/mutations.d.ts +60 -0
  145. package/dist/model/mutations.d.ts.map +1 -0
  146. package/dist/model/mutations.js +165 -0
  147. package/dist/model/mutations.js.map +1 -0
  148. package/dist/model/queries.d.ts +75 -0
  149. package/dist/model/queries.d.ts.map +1 -0
  150. package/dist/model/queries.js +117 -0
  151. package/dist/model/queries.js.map +1 -0
  152. package/dist/model/queryKeys.d.ts +50 -0
  153. package/dist/model/queryKeys.d.ts.map +1 -0
  154. package/dist/model/queryKeys.js +24 -0
  155. package/dist/model/queryKeys.js.map +1 -0
  156. package/dist/model/runtime.d.ts +69 -0
  157. package/dist/model/runtime.d.ts.map +1 -0
  158. package/dist/model/runtime.js +14 -0
  159. package/dist/model/runtime.js.map +1 -0
  160. package/dist/model/status.d.ts +117 -0
  161. package/dist/model/status.d.ts.map +1 -0
  162. package/dist/model/status.js +164 -0
  163. package/dist/model/status.js.map +1 -0
  164. package/dist/model/transitions.d.ts +41 -0
  165. package/dist/model/transitions.d.ts.map +1 -0
  166. package/dist/model/transitions.js +25 -0
  167. package/dist/model/transitions.js.map +1 -0
  168. package/dist/model/validation.d.ts +135 -0
  169. package/dist/model/validation.d.ts.map +1 -0
  170. package/dist/model/validation.js +191 -0
  171. package/dist/model/validation.js.map +1 -0
  172. package/dist/nav/manifest.d.ts +46 -0
  173. package/dist/nav/manifest.d.ts.map +1 -0
  174. package/dist/nav/manifest.js +56 -0
  175. package/dist/nav/manifest.js.map +1 -0
  176. package/llms.txt +118 -0
  177. package/manifest.json +1044 -0
  178. package/nav-manifest.json +84 -0
  179. package/package.json +121 -0
  180. package/src/analytics/generated/events.json +7 -0
  181. package/src/api/generated/schema.ts +1255 -0
  182. package/src/api/listingsApi.ts +237 -0
  183. package/src/api/types.ts +193 -0
  184. package/src/default/ErrorAlert.tsx +46 -0
  185. package/src/default/FavoritesPane.tsx +123 -0
  186. package/src/default/ListingCard.tsx +178 -0
  187. package/src/default/ListingComposerPage.tsx +466 -0
  188. package/src/default/ListingDetailPane.tsx +271 -0
  189. package/src/default/ListingPhoto.tsx +62 -0
  190. package/src/default/MyListingsPane.tsx +333 -0
  191. package/src/default/StatusTags.tsx +86 -0
  192. package/src/default/icons.tsx +31 -0
  193. package/src/default/index.ts +35 -0
  194. package/src/default/theme.tsx +67 -0
  195. package/src/default/types.ts +12 -0
  196. package/src/flows/registry.ts +45 -0
  197. package/src/headless/Favorites.tsx +137 -0
  198. package/src/headless/ListingActions.tsx +101 -0
  199. package/src/headless/ListingComposer.tsx +476 -0
  200. package/src/headless/ListingDetail.tsx +231 -0
  201. package/src/headless/ListingsProvider.tsx +20 -0
  202. package/src/headless/MyListings.tsx +148 -0
  203. package/src/headless/useMandateGate.ts +40 -0
  204. package/src/i18n/errorsMap.ts +62 -0
  205. package/src/i18n/es.ts +198 -0
  206. package/src/i18n/generated/errors.es.gen.ts +64 -0
  207. package/src/i18n/generated/errors.gen.ts +241 -0
  208. package/src/i18n/generated/errors.json +499 -0
  209. package/src/i18n/generated/errors.ru.gen.ts +64 -0
  210. package/src/i18n/keys.ts +356 -0
  211. package/src/i18n/ru.ts +215 -0
  212. package/src/index.ts +260 -0
  213. package/src/model/context.tsx +28 -0
  214. package/src/model/draft.ts +307 -0
  215. package/src/model/features.ts +122 -0
  216. package/src/model/mineSource.ts +55 -0
  217. package/src/model/mutations.ts +224 -0
  218. package/src/model/queries.ts +150 -0
  219. package/src/model/queryKeys.ts +76 -0
  220. package/src/model/runtime.ts +87 -0
  221. package/src/model/status.ts +279 -0
  222. package/src/model/transitions.ts +62 -0
  223. package/src/model/validation.ts +271 -0
  224. package/src/nav/manifest.ts +97 -0
  225. package/tsconfig.json +26 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListingCard.d.ts","sourceRoot":"","sources":["../../src/default/ListingCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIrD,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAQtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC;;4BAEwB;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC;oEACgE;IAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B;gFAC4E;IAC5E,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CA6HjE"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, Card, Flex, Tooltip, Typography } from "antd";
3
+ import { useT } from "@stapel/core";
4
+ import { FeatureBadges } from "@stapel/attributes-react/default";
5
+ import { asFeatureDaoList, featuresDtoFromDaoList, featuresFromDaoList } from "../model/features.js";
6
+ import { lifecycleCaption } from "../model/status.js";
7
+ import { useFavoriteToggle } from "../headless/Favorites.js";
8
+ import { LISTINGS_I18N_KEYS } from "../i18n/keys.js";
9
+ import { HeartIcon } from "./icons.js";
10
+ import { ListingPhoto } from "./ListingPhoto.js";
11
+ import { ListingsSkinTheme } from "./theme.js";
12
+ export function ListingCard(props) {
13
+ const t = useT();
14
+ const { listing } = props;
15
+ const favorite = useFavoriteToggle(listing.id, listing.is_favorited);
16
+ const badgeDaos = asFeatureDaoList(listing.features_badges);
17
+ const badgeFeatures = featuresFromDaoList(badgeDaos);
18
+ const badgeValues = featuresDtoFromDaoList(badgeDaos);
19
+ const titleDaos = asFeatureDaoList(listing.features_title);
20
+ const status = listing.status === undefined ? undefined : lifecycleCaption(listing.status);
21
+ const price = listing.price !== undefined && listing.price.length > 0
22
+ ? `${listing.price} ${listing.currency ?? ""}`.trim()
23
+ : t(LISTINGS_I18N_KEYS.cardPriceAbsent);
24
+ const favoriteLabel = t(favorite.favorited
25
+ ? LISTINGS_I18N_KEYS.cardFavoriteRemove
26
+ : LISTINGS_I18N_KEYS.cardFavoriteAdd);
27
+ return (_jsx(ListingsSkinTheme, { ...(props.mode !== undefined ? { mode: props.mode } : {}), children: _jsx(Card, { size: "small", "data-testid": "listings-card", "data-listing-id": listing.id, ...(status !== undefined
28
+ ? { "data-listing-status": status.status }
29
+ : {}), cover: _jsx(ListingPhoto, { imageRef: listing.images?.[0], alt: listing.title ?? String(listing.id), style: { aspectRatio: "4 / 3" } }), children: _jsxs(Flex, { vertical: true, gap: 4, children: [props.badge, _jsx(Typography.Text, { strong: true, "data-testid": "listings-card-price", children: price }), _jsx(Typography.Text, { ellipsis: true, "data-testid": "listings-card-title", children: listing.title ?? "" }), titleDaos.length > 0 ? (_jsx(Typography.Text, { type: "secondary", ellipsis: true, children: _jsx(FeatureBadges, { features: featuresFromDaoList(titleDaos)
30
+ .map((view) => view.feature), values: featuresDtoFromDaoList(titleDaos) }) })) : null, badgeFeatures.length > 0 ? (_jsx(FeatureBadges, { features: badgeFeatures.map((view) => view.feature), values: badgeValues })) : null, listing.location_label !== undefined &&
31
+ listing.location_label.length > 0 ? (_jsx(Typography.Text, { type: "secondary", "data-testid": "listings-card-location", children: listing.location_label })) : null, _jsxs(Flex, { gap: 8, align: "center", children: [props.href !== undefined || props.onOpen !== undefined ? (_jsx(Button, { size: "small", type: "link", ...(props.href !== undefined ? { href: props.href } : {}), "data-testid": "listings-card-open", "data-analytics": "none", "data-analytics-reason": "business action \u2014 host app wraps with its own tracked()", onClick: () => {
32
+ props.onOpen?.(listing.id);
33
+ }, children: t(LISTINGS_I18N_KEYS.cardOpen) })) : null, props.showFavorite === false ? null : (_jsx(Tooltip, { title: favorite.gate.available
34
+ ? favoriteLabel
35
+ : t(favorite.gate.block.code, favorite.gate.block.params), children: _jsx("span", { "data-testid": "listings-card-favorite-wrap", children: _jsx(Button, { size: "small", disabled: !favorite.gate.available, "aria-label": favoriteLabel, "aria-pressed": favorite.favorited, "data-testid": "listings-card-favorite", "data-favorited": String(favorite.favorited), "data-analytics": "none", "data-analytics-reason": "business action \u2014 host app wraps with its own tracked()", onClick: favorite.toggle, icon: _jsx(HeartIcon, { filled: favorite.favorited }) }) }) }))] })] }) }) }));
36
+ }
37
+ //# sourceMappingURL=ListingCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListingCard.js","sourceRoot":"","sources":["../../src/default/ListingCard.tsx"],"names":[],"mappings":";AAuBA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAmB/C,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3F,MAAM,KAAK,GACT,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QACrD,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;QACrD,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,aAAa,GAAG,CAAC,CACrB,QAAQ,CAAC,SAAS;QAChB,CAAC,CAAC,kBAAkB,CAAC,kBAAkB;QACvC,CAAC,CAAC,kBAAkB,CAAC,eAAe,CACvC,CAAC;IAEF,OAAO,CACL,KAAC,iBAAiB,OAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,YAC3E,KAAC,IAAI,IACH,IAAI,EAAC,OAAO,iBACA,eAAe,qBACV,OAAO,CAAC,EAAE,KACvB,CAAC,MAAM,KAAK,SAAS;gBACvB,CAAC,CAAC,EAAE,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE;gBAC1C,CAAC,CAAC,EAAE,CAAC,EACP,KAAK,EACH,KAAC,YAAY,IACX,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAC7B,GAAG,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EACxC,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,GAC/B,YAGJ,MAAC,IAAI,IAAC,QAAQ,QAAC,GAAG,EAAE,CAAC,aAClB,KAAK,CAAC,KAAK,EAEZ,KAAC,UAAU,CAAC,IAAI,IAAC,MAAM,uBAAa,qBAAqB,YACtD,KAAK,GACU,EAElB,KAAC,UAAU,CAAC,IAAI,IAAC,QAAQ,uBAAa,qBAAqB,YACxD,OAAO,CAAC,KAAK,IAAI,EAAE,GACJ,EAIjB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACtB,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,WAAW,EAAC,QAAQ,kBACxC,KAAC,aAAa,IACZ,QAAQ,EAAE,mBAAmB,CAAC,SAAS,CAAC;iCACrC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAC9B,MAAM,EAAE,sBAAsB,CAAC,SAAS,CAAC,GACzC,GACc,CACnB,CAAC,CAAC,CAAC,IAAI,EAEP,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC1B,KAAC,aAAa,IACZ,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EACnD,MAAM,EAAE,WAAW,GACnB,CACH,CAAC,CAAC,CAAC,IAAI,EAEP,OAAO,CAAC,cAAc,KAAK,SAAS;wBACrC,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAClC,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,WAAW,iBAAa,wBAAwB,YACnE,OAAO,CAAC,cAAc,GACP,CACnB,CAAC,CAAC,CAAC,IAAI,EAER,MAAC,IAAI,IAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAC,QAAQ,aACzB,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CACxD,KAAC,MAAM,IACL,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,MAAM,KACP,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,iBAC9C,oBAAoB,oBACjB,MAAM,2BACC,8DAAyD,EAC/E,OAAO,EAAE,GAAG,EAAE;oCACZ,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gCAC7B,CAAC,YAEA,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,GACxB,CACV,CAAC,CAAC,CAAC,IAAI,EAEP,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACrC,KAAC,OAAO,IACN,KAAK,EACH,QAAQ,CAAC,IAAI,CAAC,SAAS;oCACrB,CAAC,CAAC,aAAa;oCACf,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAM7D,8BAAkB,6BAA6B,YAC7C,KAAC,MAAM,IACL,IAAI,EAAC,OAAO,EACZ,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,gBACtB,aAAa,kBACX,QAAQ,CAAC,SAAS,iBACpB,wBAAwB,oBACpB,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,oBAC3B,MAAM,2BACC,8DAAyD,EAC/E,OAAO,EAAE,QAAQ,CAAC,MAAM,EACxB,IAAI,EAAE,KAAC,SAAS,IAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,GAAI,GAC/C,GACG,GACC,CACX,IACI,IACF,GACF,GACW,CACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * `<ListingComposerPage>` — the submission screen.
3
+ *
4
+ * Four contracts meet on this page and each arrives through its own seam, so
5
+ * the component can be read top to bottom without knowing any of the other
6
+ * pairs:
7
+ *
8
+ * category `categorySlot` — the container's `<CategoryPickerField>`
9
+ * details `features` — the schema, drawn by `<FeatureFields>` (L0)
10
+ * photos `gallerySlot` — the container's `<MediaGalleryField>`, whose
11
+ * bag is handed to the composer as `images`
12
+ * the draft this pair
13
+ *
14
+ * ── Every blocked control says which of six reasons it is ──────────────────
15
+ *
16
+ * The publish button is the most-gated control in the fleet, and that is the
17
+ * point: "sign in", "choose a category", "we could not load what this
18
+ * category asks for", "this build cannot draw one of these details", "wait
19
+ * for the photos", "fix the highlighted fields" are six different problems
20
+ * with six different next actions. `firstBlock` orders them the way a person
21
+ * would be told, and the reason is rendered beside the button — never left
22
+ * as a grey rectangle.
23
+ */
24
+ import type { ReactElement, ReactNode } from "react";
25
+ import type { FeatureDef } from "@stapel/attributes-react";
26
+ import type { ListingImagesBag } from "../headless/ListingComposer.js";
27
+ import type { ThemeModeProp } from "./types.js";
28
+ export interface ListingComposerPageProps extends ThemeModeProp {
29
+ /** Editing an existing listing; absent for a new one. */
30
+ readonly listingId?: number;
31
+ /** The chosen category's features — from `@stapel/categories-react` via the
32
+ * container (L2 pairs do not import each other). */
33
+ readonly features: readonly FeatureDef[];
34
+ readonly featuresLoading?: boolean;
35
+ readonly featuresError?: unknown;
36
+ /** The category chooser. A slot for the same reason. */
37
+ readonly categorySlot?: ReactNode;
38
+ /** The photo grid. Its bag is what `images` carries. */
39
+ readonly gallerySlot?: ReactNode;
40
+ /** `useUploadQueue()`'s bag from `@stapel/cdn-react` — `refs` becomes
41
+ * `images_draft`, `settled` gates the submit. */
42
+ readonly images?: ListingImagesBag;
43
+ readonly onPublished?: (listingId: number) => void;
44
+ }
45
+ export declare function ListingComposerPage(props: ListingComposerPageProps): ReactElement;
46
+ //# sourceMappingURL=ListingComposerPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListingComposerPage.d.ts","sourceRoot":"","sources":["../../src/default/ListingComposerPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAcrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAM3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAYvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,wBAAyB,SAAQ,aAAa;IAC7D,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;wDACoD;IACpD,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;IACzC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,wDAAwD;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC;IAClC,wDAAwD;IACxD,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC;qDACiD;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,YAAY,CAoYd"}
@@ -0,0 +1,99 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Alert, Button, Checkbox, Divider, Flex, Form, Input, InputNumber, Space, Typography, } from "antd";
3
+ import { useDescribeFlowError, useT } from "@stapel/core";
4
+ import { BUILTIN_VALUE_EDITOR_TYPES, FeatureFields, } from "@stapel/attributes-react/default";
5
+ import { useListingComposer } from "../headless/ListingComposer.js";
6
+ import { CATEGORY_FIELD, DESCRIPTION_FIELD, IMAGES_FIELD, PRICE_FIELD, TITLE_FIELD, failedResults, } from "../model/validation.js";
7
+ import { LISTINGS_I18N_KEYS } from "../i18n/keys.js";
8
+ import { ErrorAlert } from "./ErrorAlert.js";
9
+ import { ListingsSkinTheme } from "./theme.js";
10
+ export function ListingComposerPage(props) {
11
+ const t = useT();
12
+ const describe = useDescribeFlowError();
13
+ const bag = useListingComposer({
14
+ ...(props.listingId !== undefined ? { listingId: props.listingId } : {}),
15
+ features: props.features,
16
+ ...(props.featuresLoading !== undefined
17
+ ? { featuresLoading: props.featuresLoading }
18
+ : {}),
19
+ ...(props.featuresError !== undefined
20
+ ? { featuresError: props.featuresError }
21
+ : {}),
22
+ editorTypes: BUILTIN_VALUE_EDITOR_TYPES,
23
+ ...(props.images !== undefined ? { images: props.images } : {}),
24
+ ...(props.onPublished !== undefined
25
+ ? {
26
+ // `listing_id` comes back in the response, so the callback never
27
+ // has to reach for a piece of state that may be one render behind.
28
+ onPublished: (response) => {
29
+ props.onPublished?.(response.listing_id);
30
+ },
31
+ }
32
+ : {}),
33
+ });
34
+ /** Spread onto a `Form.Item`: the two props exist only when there IS a
35
+ * refusal, which is what `exactOptionalPropertyTypes` asks for and what
36
+ * keeps a clean field from rendering an empty help line. */
37
+ const errorOf = (field) => {
38
+ const error = bag.fieldErrors[field];
39
+ if (error === undefined)
40
+ return {};
41
+ return { help: describe(error).message, validateStatus: "error" };
42
+ };
43
+ const publishLabel = t(bag.isLiveEdit
44
+ ? LISTINGS_I18N_KEYS.composeRepublish
45
+ : LISTINGS_I18N_KEYS.composePublish);
46
+ return (_jsx(ListingsSkinTheme, { ...(props.mode !== undefined ? { mode: props.mode } : {}), children: _jsxs(Flex, { vertical: true, gap: 16, "data-testid": "listings-composer", "data-stage": bag.stage, children: [_jsx(Typography.Title, { level: 3, children: t(props.listingId === undefined
47
+ ? LISTINGS_I18N_KEYS.composeNewTitle
48
+ : LISTINGS_I18N_KEYS.composeEditTitle) }), bag.draftNotReadable ? (_jsx(Alert, { type: "warning", showIcon: true, "data-testid": "listings-composer-draft-unreadable", message: t(LISTINGS_I18N_KEYS.composeBlockedNoDraft) })) : null, bag.outcome !== undefined ? (_jsx(Alert, { type: "success", showIcon: true, "data-testid": "listings-composer-published", "data-outcome": bag.outcome, message: t(bag.outcome === "live_edit_under_review"
49
+ ? LISTINGS_I18N_KEYS.composePublishedLive
50
+ : LISTINGS_I18N_KEYS.composePublishedFirst) })) : null, _jsxs(Form, { layout: "vertical", "data-testid": "listings-composer-form", children: [_jsx(Form.Item, { label: t(LISTINGS_I18N_KEYS.composeCategory), extra: t(LISTINGS_I18N_KEYS.composeCategoryHelp), ...errorOf(CATEGORY_FIELD), children: props.categorySlot ?? (_jsx(Input, { value: bag.values.categoryId, "aria-label": t(LISTINGS_I18N_KEYS.composeCategory), "data-testid": "listings-composer-category", onChange: (event) => {
51
+ bag.setCategory(event.target.value);
52
+ } })) }), bag.droppedOnCategoryChange.length > 0 ? (_jsx(Alert, { type: "info", showIcon: true, "data-testid": "listings-composer-dropped", message: t(LISTINGS_I18N_KEYS.composeCategoryChangedDropped, {
53
+ count: bag.droppedOnCategoryChange.length,
54
+ }) })) : null, _jsx(Form.Item, { label: t(LISTINGS_I18N_KEYS.composeTitleLabel), ...errorOf(TITLE_FIELD), children: _jsx(Input, { value: bag.values.title, "aria-label": t(LISTINGS_I18N_KEYS.composeTitleLabel), "data-testid": "listings-composer-title", onChange: (event) => {
55
+ bag.setValue("title", event.target.value);
56
+ }, onBlur: bag.save }) }), _jsx(Form.Item, { label: t(LISTINGS_I18N_KEYS.composeDescriptionLabel), ...errorOf(DESCRIPTION_FIELD), children: _jsx(Input.TextArea, { rows: 5, value: bag.values.description, "aria-label": t(LISTINGS_I18N_KEYS.composeDescriptionLabel), "data-testid": "listings-composer-description", onChange: (event) => {
57
+ bag.setValue("description", event.target.value);
58
+ }, onBlur: bag.save }) }), _jsxs(Space, { align: "start", wrap: true, children: [_jsx(Form.Item, { label: t(LISTINGS_I18N_KEYS.composePriceLabel), ...errorOf(PRICE_FIELD), children: _jsx(Input, { inputMode: "decimal", value: bag.values.price, "aria-label": t(LISTINGS_I18N_KEYS.composePriceLabel), "data-testid": "listings-composer-price", onChange: (event) => {
59
+ bag.setValue("price", event.target.value);
60
+ }, onBlur: bag.save }) }), _jsx(Form.Item, { label: t(LISTINGS_I18N_KEYS.composeCurrencyLabel), children: _jsx(Input, { value: bag.values.currency, "aria-label": t(LISTINGS_I18N_KEYS.composeCurrencyLabel), "data-testid": "listings-composer-currency", onChange: (event) => {
61
+ bag.setValue("currency", event.target.value);
62
+ }, onBlur: bag.save }) })] }), _jsx(Form.Item, { label: t(LISTINGS_I18N_KEYS.composeLocationLabel), children: _jsx(Input, { value: bag.values.location.locationLabel, "aria-label": t(LISTINGS_I18N_KEYS.composeLocationLabel), "data-testid": "listings-composer-location", onChange: (event) => {
63
+ bag.setLocation({
64
+ ...bag.values.location,
65
+ locationLabel: event.target.value,
66
+ });
67
+ }, onBlur: bag.save }) }), _jsxs(Space, { align: "start", wrap: true, children: [_jsx(Form.Item, { label: t(LISTINGS_I18N_KEYS.composeLatLabel), ...(bag.fieldErrors["location"] ? { validateStatus: "error" } : {}), children: _jsx(Input, { inputMode: "decimal", value: bag.values.location.lat ?? "", "aria-label": t(LISTINGS_I18N_KEYS.composeLatLabel), "data-testid": "listings-composer-lat", onChange: (event) => {
68
+ bag.setLocation({
69
+ ...bag.values.location,
70
+ lat: event.target.value.length > 0 ? event.target.value : null,
71
+ });
72
+ }, onBlur: bag.save }) }), _jsx(Form.Item, { label: t(LISTINGS_I18N_KEYS.composeLonLabel), ...errorOf("location"), children: _jsx(Input, { inputMode: "decimal", value: bag.values.location.lon ?? "", "aria-label": t(LISTINGS_I18N_KEYS.composeLonLabel), "data-testid": "listings-composer-lon", onChange: (event) => {
73
+ bag.setLocation({
74
+ ...bag.values.location,
75
+ lon: event.target.value.length > 0 ? event.target.value : null,
76
+ });
77
+ }, onBlur: bag.save }) })] }), _jsx(Divider, {}), _jsx(Typography.Title, { level: 5, children: t(LISTINGS_I18N_KEYS.composePhotos) }), props.gallerySlot, bag.fieldErrors[IMAGES_FIELD] ? (_jsx(Typography.Text, { type: "danger", "data-testid": "listings-composer-images-error", children: describe(bag.fieldErrors[IMAGES_FIELD]).message })) : null, _jsx(Divider, {}), _jsx(Typography.Title, { level: 5, children: t(LISTINGS_I18N_KEYS.composeDetails) }), props.featuresError !== undefined ? (_jsx(Alert, { type: "error", showIcon: true, "data-testid": "listings-composer-features-failed", message: t(LISTINGS_I18N_KEYS.composeDetailsFailed) })) : props.featuresLoading === true ? (_jsx(Typography.Text, { type: "secondary", "data-testid": "listings-composer-features-loading", children: t(LISTINGS_I18N_KEYS.composeDetailsLoading) })) : props.features.length === 0 ? (_jsx(Typography.Text, { type: "secondary", "data-testid": "listings-composer-features-empty", children: t(LISTINGS_I18N_KEYS.composeDetailsEmpty) })) : (_jsx(FeatureFields, { features: props.features, values: bag.values.features, errors: bag.fieldErrors, disabled: bag.publishing, onChange: bag.setFeature })), _jsx(Divider, {}), _jsx(Form.Item, { children: _jsx(Checkbox, { checked: bag.values.countable, "data-testid": "listings-composer-countable", onChange: (event) => {
78
+ bag.setValue("countable", event.target.checked);
79
+ }, children: t(LISTINGS_I18N_KEYS.composeCountable) }) }), bag.values.countable ? (_jsx(Form.Item, { label: t(LISTINGS_I18N_KEYS.composeStock), children: _jsx(InputNumber, { min: 0, value: bag.values.stockQuantity, "aria-label": t(LISTINGS_I18N_KEYS.composeStock), "data-testid": "listings-composer-stock", onChange: (value) => {
80
+ bag.setValue("stockQuantity", value ?? null);
81
+ } }) })) : null, _jsx(Form.Item, { children: _jsx(Checkbox, { checked: bag.values.autoRepublish, "data-testid": "listings-composer-auto-republish", onChange: (event) => {
82
+ bag.setValue("autoRepublish", event.target.checked);
83
+ }, children: t(LISTINGS_I18N_KEYS.composeAutoRepublish) }) })] }), bag.refusal?.kind === "invalid_draft" ? (_jsx(Alert, { type: "error", showIcon: true, "data-testid": "listings-composer-invalid", message: t(LISTINGS_I18N_KEYS.composeInvalidSummary, {
84
+ count: failedResults(bag.refusal.batch).length,
85
+ }) })) : null, bag.refusal?.kind === "error" ? (_jsx(ErrorAlert, { testId: "listings-composer-error", error: describe({
86
+ code: bag.refusal.error.code,
87
+ params: bag.refusal.error.params,
88
+ status: bag.refusal.error.status,
89
+ message: bag.refusal.error.message,
90
+ language: bag.refusal.error.language,
91
+ }) })) : null, bag.saveError !== undefined && bag.saveError !== null ? (_jsx(ErrorAlert, { testId: "listings-composer-save-error", error: describe({
92
+ code: LISTINGS_I18N_KEYS.unknownError,
93
+ params: {},
94
+ status: 0,
95
+ message: undefined,
96
+ language: undefined,
97
+ }) })) : null, _jsxs(Space, { children: [_jsx(Button, { disabled: !bag.saveGate.available, loading: bag.saving, "data-testid": "listings-composer-save", "data-analytics": "none", "data-analytics-reason": "business action \u2014 host app wraps with its own tracked()", onClick: bag.save, children: t(bag.saving ? LISTINGS_I18N_KEYS.composeSaving : LISTINGS_I18N_KEYS.composeSave) }), _jsx(Button, { type: "primary", disabled: !bag.publishGate.available, loading: bag.publishing, "data-testid": "listings-composer-publish", "data-analytics": "none", "data-analytics-reason": "business action \u2014 host app wraps with its own tracked()", onClick: bag.publish, children: bag.publishing ? t(LISTINGS_I18N_KEYS.composePublishing) : publishLabel }), bag.saved ? (_jsx(Typography.Text, { type: "success", "data-testid": "listings-composer-saved", children: t(LISTINGS_I18N_KEYS.composeSaved) })) : null] }), !bag.publishGate.available ? (_jsx(Typography.Text, { type: "secondary", "data-testid": "listings-composer-publish-blocked", children: t(bag.publishGate.block.code, bag.publishGate.block.params) })) : null] }) }));
98
+ }
99
+ //# sourceMappingURL=ListingComposerPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListingComposerPage.js","sourceRoot":"","sources":["../../src/default/ListingComposerPage.tsx"],"names":[],"mappings":";AAwBA,OAAO,EACL,KAAK,EACL,MAAM,EACN,QAAQ,EACR,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,WAAW,EACX,KAAK,EACL,UAAU,GACX,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EACL,0BAA0B,EAC1B,aAAa,GACd,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,WAAW,EACX,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAqB/C,MAAM,UAAU,mBAAmB,CACjC,KAA+B;IAE/B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,kBAAkB,CAAC;QAC7B,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,GAAG,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS;YACrC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE;YAC5C,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS;YACnC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE;YACxC,CAAC,CAAC,EAAE,CAAC;QACP,WAAW,EAAE,0BAA0B;QACvC,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS;YACjC,CAAC,CAAC;gBACE,iEAAiE;gBACjE,mEAAmE;gBACnE,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE;oBACxB,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC3C,CAAC;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IAEH;;gEAE4D;IAC5D,MAAM,OAAO,GAAG,CACd,KAAa,EACyD,EAAE;QACxE,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;IACpE,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,CACpB,GAAG,CAAC,UAAU;QACZ,CAAC,CAAC,kBAAkB,CAAC,gBAAgB;QACrC,CAAC,CAAC,kBAAkB,CAAC,cAAc,CACtC,CAAC;IAEF,OAAO,CACL,KAAC,iBAAiB,OAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,YAC3E,MAAC,IAAI,IAAC,QAAQ,QAAC,GAAG,EAAE,EAAE,iBAAc,mBAAmB,gBAAa,GAAG,CAAC,KAAK,aAC3E,KAAC,UAAU,CAAC,KAAK,IAAC,KAAK,EAAE,CAAC,YACvB,CAAC,CACA,KAAK,CAAC,SAAS,KAAK,SAAS;wBAC3B,CAAC,CAAC,kBAAkB,CAAC,eAAe;wBACpC,CAAC,CAAC,kBAAkB,CAAC,gBAAgB,CACxC,GACgB,EAKlB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CACtB,KAAC,KAAK,IACJ,IAAI,EAAC,SAAS,EACd,QAAQ,uBACI,oCAAoC,EAChD,OAAO,EAAE,CAAC,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,GACpD,CACH,CAAC,CAAC,CAAC,IAAI,EAEP,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAC3B,KAAC,KAAK,IACJ,IAAI,EAAC,SAAS,EACd,QAAQ,uBACI,6BAA6B,kBAC3B,GAAG,CAAC,OAAO,EACzB,OAAO,EAAE,CAAC,CACR,GAAG,CAAC,OAAO,KAAK,wBAAwB;wBACtC,CAAC,CAAC,kBAAkB,CAAC,oBAAoB;wBACzC,CAAC,CAAC,kBAAkB,CAAC,qBAAqB,CAC7C,GACD,CACH,CAAC,CAAC,CAAC,IAAI,EAER,MAAC,IAAI,IAAC,MAAM,EAAC,UAAU,iBAAa,wBAAwB,aAC1D,KAAC,IAAI,CAAC,IAAI,IACR,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAC5C,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,KAC5C,OAAO,CAAC,cAAc,CAAC,YAE1B,KAAK,CAAC,YAAY,IAAI,CACrB,KAAC,KAAK,IACJ,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,gBAChB,CAAC,CAAC,kBAAkB,CAAC,eAAe,CAAC,iBACrC,4BAA4B,EACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oCAClB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gCACtC,CAAC,GACD,CACH,GACS,EAEX,GAAG,CAAC,uBAAuB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACxC,KAAC,KAAK,IACJ,IAAI,EAAC,MAAM,EACX,QAAQ,uBACI,2BAA2B,EACvC,OAAO,EAAE,CAAC,CAAC,kBAAkB,CAAC,6BAA6B,EAAE;gCAC3D,KAAK,EAAE,GAAG,CAAC,uBAAuB,CAAC,MAAM;6BAC1C,CAAC,GACF,CACH,CAAC,CAAC,CAAC,IAAI,EAER,KAAC,IAAI,CAAC,IAAI,IACR,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,KAC1C,OAAO,CAAC,WAAW,CAAC,YAExB,KAAC,KAAK,IACJ,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,gBACX,CAAC,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,iBACvC,yBAAyB,EACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oCAClB,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gCAC5C,CAAC,EACD,MAAM,EAAE,GAAG,CAAC,IAAI,GAChB,GACQ,EAEZ,KAAC,IAAI,CAAC,IAAI,IACR,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,KAChD,OAAO,CAAC,iBAAiB,CAAC,YAE9B,KAAC,KAAK,CAAC,QAAQ,IACb,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,gBACjB,CAAC,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,iBAC7C,+BAA+B,EAC3C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oCAClB,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gCAClD,CAAC,EACD,MAAM,EAAE,GAAG,CAAC,IAAI,GAChB,GACQ,EAEZ,MAAC,KAAK,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,mBACvB,KAAC,IAAI,CAAC,IAAI,IACR,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,KAC1C,OAAO,CAAC,WAAW,CAAC,YAExB,KAAC,KAAK,IACJ,SAAS,EAAC,SAAS,EACnB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,gBACX,CAAC,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,iBACvC,yBAAyB,EACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4CAClB,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wCAC5C,CAAC,EACD,MAAM,EAAE,GAAG,CAAC,IAAI,GAChB,GACQ,EAEZ,KAAC,IAAI,CAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,YAC1D,KAAC,KAAK,IACJ,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,gBACd,CAAC,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,iBAC1C,4BAA4B,EACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4CAClB,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wCAC/C,CAAC,EACD,MAAM,EAAE,GAAG,CAAC,IAAI,GAChB,GACQ,IACN,EAER,KAAC,IAAI,CAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,YAC1D,KAAC,KAAK,IACJ,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,gBAC5B,CAAC,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,iBAC1C,4BAA4B,EACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oCAClB,GAAG,CAAC,WAAW,CAAC;wCACd,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ;wCACtB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;qCAClC,CAAC,CAAC;gCACL,CAAC,EACD,MAAM,EAAE,GAAG,CAAC,IAAI,GAChB,GACQ,EAQZ,MAAC,KAAK,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,mBACvB,KAAC,IAAI,CAAC,IAAI,IACR,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,eAAe,CAAC,KACxC,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,YAE7E,KAAC,KAAK,IACJ,SAAS,EAAC,SAAS,EACnB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,gBACxB,CAAC,CAAC,kBAAkB,CAAC,eAAe,CAAC,iBACrC,uBAAuB,EACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4CAClB,GAAG,CAAC,WAAW,CAAC;gDACd,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ;gDACtB,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;6CAC/D,CAAC,CAAC;wCACL,CAAC,EACD,MAAM,EAAE,GAAG,CAAC,IAAI,GAChB,GACQ,EACZ,KAAC,IAAI,CAAC,IAAI,IACR,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,eAAe,CAAC,KACxC,OAAO,CAAC,UAAU,CAAC,YAEvB,KAAC,KAAK,IACJ,SAAS,EAAC,SAAS,EACnB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,gBACxB,CAAC,CAAC,kBAAkB,CAAC,eAAe,CAAC,iBACrC,uBAAuB,EACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4CAClB,GAAG,CAAC,WAAW,CAAC;gDACd,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ;gDACtB,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;6CAC/D,CAAC,CAAC;wCACL,CAAC,EACD,MAAM,EAAE,GAAG,CAAC,IAAI,GAChB,GACQ,IACN,EAER,KAAC,OAAO,KAAG,EAEX,KAAC,UAAU,CAAC,KAAK,IAAC,KAAK,EAAE,CAAC,YACvB,CAAC,CAAC,kBAAkB,CAAC,aAAa,CAAC,GACnB,EAClB,KAAK,CAAC,WAAW,EACjB,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAC/B,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,iBAAa,gCAAgC,YACxE,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,GAChC,CACnB,CAAC,CAAC,CAAC,IAAI,EAER,KAAC,OAAO,KAAG,EAEX,KAAC,UAAU,CAAC,KAAK,IAAC,KAAK,EAAE,CAAC,YACvB,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC,GACpB,EAClB,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,CACnC,KAAC,KAAK,IACJ,IAAI,EAAC,OAAO,EACZ,QAAQ,uBACI,mCAAmC,EAC/C,OAAO,EAAE,CAAC,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,GACnD,CACH,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,CACnC,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,WAAW,iBAAa,oCAAoC,YAC/E,CAAC,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,GAC5B,CACnB,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAChC,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,WAAW,iBAAa,kCAAkC,YAC7E,CAAC,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,GAC1B,CACnB,CAAC,CAAC,CAAC,CACF,KAAC,aAAa,IACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,EAC3B,MAAM,EAAE,GAAG,CAAC,WAAW,EACvB,QAAQ,EAAE,GAAG,CAAC,UAAU,EACxB,QAAQ,EAAE,GAAG,CAAC,UAAU,GACxB,CACH,EAED,KAAC,OAAO,KAAG,EAEX,KAAC,IAAI,CAAC,IAAI,cACR,KAAC,QAAQ,IACP,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,iBACjB,6BAA6B,EACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oCAClB,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gCAClD,CAAC,YAEA,CAAC,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,GAC9B,GACD,EAEX,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CACtB,KAAC,IAAI,CAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,YAAY,CAAC,YAClD,KAAC,WAAW,IACV,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,gBACnB,CAAC,CAAC,kBAAkB,CAAC,YAAY,CAAC,iBAClC,yBAAyB,EACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oCAClB,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC;gCAC/C,CAAC,GACD,GACQ,CACb,CAAC,CAAC,CAAC,IAAI,EAER,KAAC,IAAI,CAAC,IAAI,cACR,KAAC,QAAQ,IACP,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,iBACrB,kCAAkC,EAC9C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oCAClB,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gCACtD,CAAC,YAEA,CAAC,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,GAClC,GACD,IACP,EAEN,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,CACvC,KAAC,KAAK,IACJ,IAAI,EAAC,OAAO,EACZ,QAAQ,uBACI,2BAA2B,EACvC,OAAO,EAAE,CAAC,CAAC,kBAAkB,CAAC,qBAAqB,EAAE;wBACnD,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM;qBAC/C,CAAC,GACF,CACH,CAAC,CAAC,CAAC,IAAI,EAEP,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAC/B,KAAC,UAAU,IACT,MAAM,EAAC,yBAAyB,EAChC,KAAK,EAAE,QAAQ,CAAC;wBACd,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI;wBAC5B,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;wBAChC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;wBAChC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO;wBAClC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ;qBACrC,CAAC,GACF,CACH,CAAC,CAAC,CAAC,IAAI,EAEP,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CACvD,KAAC,UAAU,IACT,MAAM,EAAC,8BAA8B,EACrC,KAAK,EAAE,QAAQ,CAAC;wBACd,IAAI,EAAE,kBAAkB,CAAC,YAAY;wBACrC,MAAM,EAAE,EAAE;wBACV,MAAM,EAAE,CAAC;wBACT,OAAO,EAAE,SAAS;wBAClB,QAAQ,EAAE,SAAS;qBACpB,CAAC,GACF,CACH,CAAC,CAAC,CAAC,IAAI,EAER,MAAC,KAAK,eACJ,KAAC,MAAM,IACL,QAAQ,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EACjC,OAAO,EAAE,GAAG,CAAC,MAAM,iBACP,wBAAwB,oBACrB,MAAM,2BACC,8DAAyD,EAC/E,OAAO,EAAE,GAAG,CAAC,IAAI,YAEhB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,GAC3E,EAET,KAAC,MAAM,IACL,IAAI,EAAC,SAAS,EACd,QAAQ,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,EACpC,OAAO,EAAE,GAAG,CAAC,UAAU,iBACX,2BAA2B,oBACxB,MAAM,2BACC,8DAAyD,EAC/E,OAAO,EAAE,GAAG,CAAC,OAAO,YAEnB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,YAAY,GACjE,EAER,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CACX,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,SAAS,iBAAa,yBAAyB,YAClE,CAAC,CAAC,kBAAkB,CAAC,YAAY,CAAC,GACnB,CACnB,CAAC,CAAC,CAAC,IAAI,IACF,EAEP,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAC5B,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,WAAW,iBAAa,mCAAmC,YAC9E,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAC5C,CACnB,CAAC,CAAC,CAAC,IAAI,IACH,GACW,CACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `<ListingDetailPane>` — the listing page.
3
+ *
4
+ * Four distinct absences, four distinct sentences, and the whole point of the
5
+ * component is that none of them collapses into another:
6
+ *
7
+ * loading — we are asking
8
+ * failed — we could not ask (retry, never "nothing here")
9
+ * not found — no listing ever had this id
10
+ * removed — one did, and it is gone (the AllowAny status probe
11
+ * is the only read that can still say so)
12
+ *
13
+ * On top of that, a listing that IS returned may still not be on sale: the
14
+ * detail endpoint has no `published()` filter, so a draft answers 200 to
15
+ * anyone holding the id. The pane says which side of that it is on rather
16
+ * than dressing a draft up as a shop page.
17
+ */
18
+ import type { ReactElement, ReactNode } from "react";
19
+ import type { ThemeModeProp } from "./types.js";
20
+ export interface ListingDetailPaneProps extends ThemeModeProp {
21
+ readonly id: number;
22
+ /** The reader's own uuid, when the host knows it. Enables the owner view —
23
+ * the only place the moderation axis is shown, because it is the only
24
+ * person it concerns. */
25
+ readonly viewerId?: string;
26
+ /** Slots the container fills: "message the seller" (chat-react), the
27
+ * seller's profile link, reviews. Cross-pair navigation is the container's
28
+ * job (spec §6.2 item 5), so this pair takes nodes rather than routes. */
29
+ readonly actions?: ReactNode;
30
+ readonly footer?: ReactNode;
31
+ }
32
+ export declare function ListingDetailPane(props: ListingDetailPaneProps): ReactElement;
33
+ //# sourceMappingURL=ListingDetailPane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListingDetailPane.d.ts","sourceRoot":"","sources":["../../src/default/ListingDetailPane.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAarD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB;;6BAEyB;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;8EAE0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;CAC7B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,YAAY,CAiO7E"}
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Alert, Button, Descriptions, Divider, Flex, Space, Spin, Typography } from "antd";
3
+ import { matchLoad, useDescribeFlowError, useT, useI18n } from "@stapel/core";
4
+ import { FeatureValueList } from "@stapel/attributes-react/default";
5
+ import { formatFeatureValue } from "@stapel/attributes-react";
6
+ import { useListingDetail } from "../headless/ListingDetail.js";
7
+ import { asFeatureDaoList, featuresDtoFromDaoList } from "../model/features.js";
8
+ import { LISTINGS_I18N_KEYS } from "../i18n/keys.js";
9
+ import { ErrorAlert } from "./ErrorAlert.js";
10
+ import { HeartIcon } from "./icons.js";
11
+ import { ListingPhoto } from "./ListingPhoto.js";
12
+ import { ListingStatusBlock } from "./StatusTags.js";
13
+ import { ListingsSkinTheme } from "./theme.js";
14
+ export function ListingDetailPane(props) {
15
+ const t = useT();
16
+ const { locale } = useI18n();
17
+ const describe = useDescribeFlowError();
18
+ const bag = useListingDetail(props.id, props.viewerId !== undefined ? { viewerId: props.viewerId } : {});
19
+ return (_jsx(ListingsSkinTheme, { ...(props.mode !== undefined ? { mode: props.mode } : {}), children: _jsxs(Flex, { vertical: true, gap: 16, "data-testid": "listings-detail", children: [bag.removed ? (_jsx(Alert, { type: "warning", showIcon: true, "data-testid": "listings-detail-removed", message: t(LISTINGS_I18N_KEYS.detailRemoved) })) : null, matchLoad(bag.state, {
20
+ loading: () => (_jsx(Flex, { justify: "center", "data-testid": "listings-detail-loading", children: _jsx(Spin, { "aria-label": t(LISTINGS_I18N_KEYS.detailLoading) }) })),
21
+ failed: () => bag.removed ? null : (_jsx(ErrorAlert, { testId: "listings-detail-error", error: describe({
22
+ code: bag.notFound
23
+ ? LISTINGS_I18N_KEYS.detailNotFound
24
+ : LISTINGS_I18N_KEYS.detailLoadFailed,
25
+ params: {},
26
+ status: 0,
27
+ message: undefined,
28
+ language: undefined,
29
+ }), action: _jsx(Button, { size: "small", "data-analytics": "none", "data-analytics-reason": "retrying a read the person already asked for; not a business action", onClick: bag.refetch, children: t(LISTINGS_I18N_KEYS.detailRetry) }) })),
30
+ ready: (listing) => (_jsxs(_Fragment, { children: [bag.viewerIsOwner === true && bag.status !== undefined ? (_jsxs(Flex, { vertical: true, gap: 8, "data-testid": "listings-detail-owner-view", children: [_jsx(ListingStatusBlock, { status: bag.status }), !bag.publiclyVisible ? (_jsx(Alert, { type: "info", showIcon: true, message: t(LISTINGS_I18N_KEYS.detailOwnerOnlyView) })) : null] })) : null, bag.viewerIsOwner !== true && !bag.publiclyVisible ? (_jsx(Alert, { type: "warning", showIcon: true, "data-testid": "listings-detail-not-published", message: t(LISTINGS_I18N_KEYS.detailNotPublished) })) : null, _jsx(Flex, { gap: 16, wrap: true, children: bag.images.length === 0 ? (_jsx(ListingPhoto, { imageRef: undefined, alt: listing.title ?? String(listing.id), style: { width: 320, aspectRatio: "4 / 3" } })) : (bag.images.map((ref, index) => (_jsx(ListingPhoto, { imageRef: ref, alt: t(LISTINGS_I18N_KEYS.detailPhotoAlt, {
31
+ index: index + 1,
32
+ total: bag.images.length,
33
+ }), style: { width: 320, aspectRatio: "4 / 3" } }, ref)))) }), _jsx(Typography.Title, { level: 3, "data-testid": "listings-detail-title", children: listing.title ?? "" }), bag.titleFeatures.length > 0 ? (_jsx(Typography.Text, { type: "secondary", "data-testid": "listings-detail-title-features", children: bag.titleFeatures
34
+ .map((view) => formatFeatureValue(view.feature, view.value, { t, locale }))
35
+ .filter((text) => text !== undefined)
36
+ .join(" · ") })) : null, _jsx(Typography.Title, { level: 4, "data-testid": "listings-detail-price", children: listing.price !== undefined && listing.price.length > 0
37
+ ? `${listing.price} ${listing.currency ?? ""}`.trim()
38
+ : t(LISTINGS_I18N_KEYS.cardPriceAbsent) }), _jsxs(Space, { wrap: true, children: [_jsx(Button, { disabled: !bag.favoriteGate.available, "aria-label": t(bag.isFavorited === true
39
+ ? LISTINGS_I18N_KEYS.cardFavoriteRemove
40
+ : LISTINGS_I18N_KEYS.cardFavoriteAdd), "aria-pressed": bag.isFavorited === true, icon: _jsx(HeartIcon, { filled: bag.isFavorited === true }), "data-testid": "listings-detail-favorite", "data-analytics": "none", "data-analytics-reason": "business action \u2014 host app wraps with its own tracked()", onClick: bag.toggleFavorite, children: t(bag.isFavorited === true
41
+ ? LISTINGS_I18N_KEYS.cardFavoriteRemove
42
+ : LISTINGS_I18N_KEYS.cardFavoriteAdd) }), props.actions] }), !bag.favoriteGate.available ? (_jsx(Typography.Text, { type: "secondary", "data-testid": "listings-detail-favorite-blocked", children: t(bag.favoriteGate.block.code, bag.favoriteGate.block.params) })) : null, _jsx(Divider, {}), _jsx(Typography.Title, { level: 5, children: t(LISTINGS_I18N_KEYS.detailDescription) }), _jsx(Typography.Paragraph, { "data-testid": "listings-detail-description", children: listing.description ?? "" }), _jsx(Typography.Title, { level: 5, children: t(LISTINGS_I18N_KEYS.detailSpecs) }), bag.features.length === 0 ? (_jsx(Typography.Text, { type: "secondary", "data-testid": "listings-detail-no-specs", children: t(LISTINGS_I18N_KEYS.detailNoSpecs) })) : (_jsx(FeatureValueList, { features: bag.features.map((view) => view.feature), values: featuresDtoFromDaoList(asFeatureDaoList(listing.features)) })), bag.unreadableFeatures > 0 ? (_jsx(Alert, { type: "warning", showIcon: true, "data-testid": "listings-detail-unreadable", message: t(LISTINGS_I18N_KEYS.detailUnreadableFeatures, {
43
+ count: bag.unreadableFeatures,
44
+ }) })) : null, _jsxs(Descriptions, { size: "small", column: 1, children: [listing.stock_quantity != null ? (_jsx(Descriptions.Item, { label: t(LISTINGS_I18N_KEYS.detailStock), children: listing.stock_quantity })) : null, listing.location_label !== undefined &&
45
+ listing.location_label.length > 0 ? (_jsx(Descriptions.Item, { label: t(LISTINGS_I18N_KEYS.composeLocationLabel), children: listing.location_label })) : null] }), props.footer] })),
46
+ })] }) }));
47
+ }
48
+ //# sourceMappingURL=ListingDetailPane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListingDetailPane.js","sourceRoot":"","sources":["../../src/default/ListingDetailPane.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * A stored CDN reference, drawn — or the reason it cannot be.
3
+ *
4
+ * `Listing.images` carries opaque `<type>/<hash>` strings and no contract in
5
+ * this fleet resolves a stranger's reference (`model/runtime.ts` argues it at
6
+ * length). So this component asks the runtime's `resolveImage`, and when
7
+ * there is no resolver — or the resolver has nothing for this reference — it
8
+ * says so instead of emitting a broken `<img>`. An empty grey box that never
9
+ * loads teaches a person nothing; a sentence gets the wiring fixed.
10
+ *
11
+ * When the resolver DOES answer, `@stapel/image`'s `<Image>` takes over: it
12
+ * measures the slot, picks the variant tier that fits, blur-ups from
13
+ * `preview_b64` and never downgrades on a re-measure. None of that logic
14
+ * belongs here — it is why `@stapel/image` exists.
15
+ */
16
+ import type { CSSProperties, ReactElement } from "react";
17
+ export interface ListingPhotoProps {
18
+ /** The stored reference, or `undefined` for a listing with no photos. */
19
+ readonly imageRef: string | undefined;
20
+ /** Alt text — required, and the caller has the context to write it. */
21
+ readonly alt: string;
22
+ readonly style?: CSSProperties;
23
+ }
24
+ export declare function ListingPhoto(props: ListingPhotoProps): ReactElement;
25
+ //# sourceMappingURL=ListingPhoto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListingPhoto.d.ts","sourceRoot":"","sources":["../../src/default/ListingPhoto.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAOzD,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;CAChC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CA+BnE"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Empty } from "antd";
3
+ import { Image } from "@stapel/image";
4
+ import { useT } from "@stapel/core";
5
+ import { useListingsRuntime } from "../model/context.js";
6
+ import { LISTINGS_I18N_KEYS } from "../i18n/keys.js";
7
+ export function ListingPhoto(props) {
8
+ const t = useT();
9
+ const runtime = useListingsRuntime();
10
+ const meta = props.imageRef === undefined || runtime.resolveImage === undefined
11
+ ? undefined
12
+ : runtime.resolveImage(props.imageRef);
13
+ if (meta === undefined) {
14
+ return (_jsx(Empty, { image: Empty.PRESENTED_IMAGE_SIMPLE, "data-testid": "listings-photo-absent", description: t(props.imageRef === undefined
15
+ ? LISTINGS_I18N_KEYS.cardNoPhoto
16
+ : LISTINGS_I18N_KEYS.cardPhotoUnavailable), ...(props.style ? { style: props.style } : {}) }));
17
+ }
18
+ return (_jsx(Image, { meta: meta, alt: props.alt, "data-testid": "listings-photo", ...(props.style ? { style: props.style } : {}) }));
19
+ }
20
+ //# sourceMappingURL=ListingPhoto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListingPhoto.js","sourceRoot":"","sources":["../../src/default/ListingPhoto.tsx"],"names":[],"mappings":";AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAUrD,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,IAAI,GACR,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS;QAChE,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CACL,KAAC,KAAK,IACJ,KAAK,EAAE,KAAK,CAAC,sBAAsB,iBACvB,uBAAuB,EACnC,WAAW,EAAE,CAAC,CACZ,KAAK,CAAC,QAAQ,KAAK,SAAS;gBAC1B,CAAC,CAAC,kBAAkB,CAAC,WAAW;gBAChC,CAAC,CAAC,kBAAkB,CAAC,oBAAoB,CAC5C,KACG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC/C,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CACL,KAAC,KAAK,IACJ,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,KAAK,CAAC,GAAG,iBACF,gBAAgB,KACxB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC/C,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `<MyListingsPane>` — the seller's dashboard.
3
+ *
4
+ * Three counts that are real, and rows that may not be: stapel-listings 0.6.1
5
+ * has no owner-scoped list endpoint (`headless/MyListings.tsx` argues it in
6
+ * full), so the rows come from an injected source and the pane NAMES the gap
7
+ * when there is none. The counters are shown either way, because they are the
8
+ * one thing the contract can actually answer.
9
+ *
10
+ * Each row carries both axes. "Published" and "changes under review" appear
11
+ * beside each other, which is the entire reason `model/status.ts` exists: a
12
+ * dashboard that derived one from the other would tell a seller their live
13
+ * listing is offline, or never tell them their edit is being screened.
14
+ */
15
+ import type { ReactElement } from "react";
16
+ import type { MyListingsSource } from "../model/mineSource.js";
17
+ import type { ThemeModeProp } from "./types.js";
18
+ export interface MyListingsPaneProps extends ThemeModeProp {
19
+ /** How the host gets the caller's own rows. Absent: the pane says the
20
+ * contract cannot answer, and still shows the counts. */
21
+ readonly source?: MyListingsSource;
22
+ readonly onEdit?: (id: number) => void;
23
+ }
24
+ export declare function MyListingsPane(props: MyListingsPaneProps): ReactElement;
25
+ //# sourceMappingURL=MyListingsPane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MyListingsPane.d.ts","sourceRoot":"","sources":["../../src/default/MyListingsPane.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAkB1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAQ/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAyIhD,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD;6DACyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,CAoJvE"}
@@ -0,0 +1,84 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Alert, Badge, Button, Empty, Flex, List, Space, Spin, Tabs, Tooltip, Typography, } from "antd";
3
+ import { matchList, matchLoad, useDescribeFlowError, useT } from "@stapel/core";
4
+ import { useMyListings } from "../headless/MyListings.js";
5
+ import { useListingActions } from "../headless/ListingActions.js";
6
+ import { listingStatusView } from "../model/status.js";
7
+ import { LISTINGS_I18N_KEYS } from "../i18n/keys.js";
8
+ import { ErrorAlert } from "./ErrorAlert.js";
9
+ import { ListingStatusBlock } from "./StatusTags.js";
10
+ import { ListingsSkinTheme } from "./theme.js";
11
+ const TAB_LABEL = {
12
+ active: LISTINGS_I18N_KEYS.mineTabActive,
13
+ drafts: LISTINGS_I18N_KEYS.mineTabDrafts,
14
+ archived: LISTINGS_I18N_KEYS.mineTabArchived,
15
+ };
16
+ /** A control plus the sentence that explains it when it is off. Written once
17
+ * here because this pane has six of them and a grey button with no reason is
18
+ * the one shape `ActionAvailability` exists to make impossible. */
19
+ function GatedButton(props) {
20
+ const t = useT();
21
+ return (_jsx(Tooltip, { title: props.gate.available
22
+ ? props.label
23
+ : t(props.gate.block.code, props.gate.block.params), children: _jsx("span", { children: _jsx(Button, { size: "small", danger: props.danger === true, disabled: !props.gate.available, "data-testid": props.testId, "data-analytics": "none", "data-analytics-reason": "business action \u2014 host app wraps with its own tracked()", onClick: props.onClick, children: props.label }) }) }));
24
+ }
25
+ function MyListingRow(props) {
26
+ const t = useT();
27
+ const describe = useDescribeFlowError();
28
+ const actions = useListingActions(props.listing.id, props.listing.status);
29
+ // The card list carries `status` but NOT `moderation_status`
30
+ // (`ListingCardSerializer` omits it), so a row shows the moderation axis
31
+ // only through the one thing the projection does say. Pending is the
32
+ // honest default for the notice table's second argument here: it is the
33
+ // value that produces a note only when the lifecycle also implies one.
34
+ const status = props.listing.status === undefined
35
+ ? undefined
36
+ : listingStatusView(props.listing.status, "approved");
37
+ return (_jsx(List.Item, { "data-testid": "listings-mine-row", "data-listing-id": props.listing.id, actions: [
38
+ _jsx(GatedButton, { "data-analytics": "none", "data-analytics-reason": "passthrough \u2014 GatedButton owns the real click point", gate: { available: true }, label: t(LISTINGS_I18N_KEYS.mineEdit), testId: "listings-mine-edit", onClick: () => {
39
+ props.onEdit?.(props.listing.id);
40
+ } }, "edit"),
41
+ _jsx(GatedButton, { "data-analytics": "none", "data-analytics-reason": "passthrough \u2014 GatedButton owns the real click point", gate: actions.complete, label: t(LISTINGS_I18N_KEYS.mineComplete), testId: "listings-mine-complete", onClick: actions.doComplete }, "complete"),
42
+ _jsx(GatedButton, { "data-analytics": "none", "data-analytics-reason": "passthrough \u2014 GatedButton owns the real click point", gate: actions.archive, label: t(LISTINGS_I18N_KEYS.mineArchive), testId: "listings-mine-archive", onClick: actions.doArchive }, "archive"),
43
+ _jsx(GatedButton, { "data-analytics": "none", "data-analytics-reason": "passthrough \u2014 GatedButton owns the real click point", danger: true, gate: actions.remove, label: t(LISTINGS_I18N_KEYS.mineDelete), testId: "listings-mine-delete", onClick: actions.doRemove }, "delete"),
44
+ ], children: _jsx(List.Item.Meta, { title: props.listing.title ?? String(props.listing.id), description: _jsxs(Flex, { vertical: true, gap: 4, children: [status !== undefined ? _jsx(ListingStatusBlock, { status: status }) : null, actions.error !== undefined && actions.error !== null ? (_jsx(ErrorAlert, { testId: "listings-mine-action-error", error: describe({
45
+ code: LISTINGS_I18N_KEYS.unknownError,
46
+ params: {},
47
+ status: 0,
48
+ message: undefined,
49
+ language: undefined,
50
+ }) })) : null] }) }) }));
51
+ }
52
+ export function MyListingsPane(props) {
53
+ const t = useT();
54
+ const describe = useDescribeFlowError();
55
+ const bag = useMyListings(props.source !== undefined ? { source: props.source } : {});
56
+ return (_jsx(ListingsSkinTheme, { ...(props.mode !== undefined ? { mode: props.mode } : {}), children: _jsxs(Flex, { vertical: true, gap: 16, "data-testid": "listings-mine", children: [_jsx(Typography.Title, { level: 3, children: t(LISTINGS_I18N_KEYS.mineTitle) }), !bag.gate.available ? (_jsx(Alert, { type: "info", showIcon: true, "data-testid": "listings-mine-blocked", message: t(bag.gate.block.code, bag.gate.block.params) })) : null, _jsx(Tabs, { activeKey: bag.tab, "data-testid": "listings-mine-tabs", onChange: (key) => {
57
+ bag.setTab(key);
58
+ }, items: bag.tabs.map((tab) => ({
59
+ key: tab,
60
+ label: (_jsxs(Space, { size: 6, children: [t(TAB_LABEL[tab]), matchLoad(bag.counters, {
61
+ loading: () => null,
62
+ // A count we could not fetch is not zero. The badge is
63
+ // simply absent and the failure is stated once, below.
64
+ failed: () => null,
65
+ ready: (counters) => (_jsx(Badge, { count: counters[tab], showZero: true, "data-testid": `listings-mine-count-${tab}` })),
66
+ })] })),
67
+ })) }), matchLoad(bag.counters, {
68
+ loading: () => null,
69
+ failed: () => (_jsx(Typography.Text, { type: "secondary", "data-testid": "listings-mine-counters-failed", children: t(LISTINGS_I18N_KEYS.mineCountersFailed) })),
70
+ ready: () => null,
71
+ }), matchList(bag.rows, {
72
+ loading: () => (_jsx(Flex, { justify: "center", "data-testid": "listings-mine-loading", children: _jsx(Spin, { "aria-label": t(LISTINGS_I18N_KEYS.mineLoading) }) })),
73
+ failed: () => (_jsx(ErrorAlert, { testId: "listings-mine-error", error: describe({
74
+ code: LISTINGS_I18N_KEYS.mineLoadFailed,
75
+ params: {},
76
+ status: 0,
77
+ message: undefined,
78
+ language: undefined,
79
+ }), action: _jsx(Button, { size: "small", "data-analytics": "none", "data-analytics-reason": "retrying a read the person already asked for; not a business action", onClick: bag.refetch, children: t(LISTINGS_I18N_KEYS.mineRetry) }) })),
80
+ empty: () => (_jsx(Empty, { "data-testid": "listings-mine-empty", description: t(LISTINGS_I18N_KEYS.mineEmpty) })),
81
+ ready: (rows) => (_jsx(List, { dataSource: [...rows], rowKey: (row) => row.id, renderItem: (row) => (_jsx(MyListingRow, { listing: row, ...(props.onEdit !== undefined ? { onEdit: props.onEdit } : {}) })) })),
82
+ }), props.source === undefined ? (_jsx(Alert, { type: "warning", showIcon: true, "data-testid": "listings-mine-source-missing", message: t(LISTINGS_I18N_KEYS.mineSourceMissing) })) : null, _jsxs(Space, { children: [_jsx(Button, { size: "small", disabled: !bag.prevPage.available, "data-testid": "listings-mine-prev", "data-analytics": "none", "data-analytics-reason": "paging a list the person is already reading; not a business action", onClick: bag.goPrev, children: t(LISTINGS_I18N_KEYS.pagePrev) }), _jsx(Button, { size: "small", disabled: !bag.nextPage.available, "data-testid": "listings-mine-next", "data-analytics": "none", "data-analytics-reason": "paging a list the person is already reading; not a business action", onClick: bag.goNext, children: t(LISTINGS_I18N_KEYS.pageNext) })] })] }) }));
83
+ }
84
+ //# sourceMappingURL=MyListingsPane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MyListingsPane.js","sourceRoot":"","sources":["../../src/default/MyListingsPane.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The two axes, drawn as two.
3
+ *
4
+ * `<LifecycleTag>` is the state; `<ModerationNote>` is what the moderation
5
+ * axis adds ON TOP of it, and it renders nothing when there is nothing to add
6
+ * (an approved listing owes its owner no note). Keeping them separate is what
7
+ * makes "Published" and "changes under review" appear side by side rather
8
+ * than one overwriting the other — the failure `model/status.ts` exists to
9
+ * prevent, made visual.
10
+ *
11
+ * A tone maps to an antd preset here and nowhere else. No hex leaves this
12
+ * file, because none enters it: the presets resolve through the theme, which
13
+ * resolves through `@stapel/tokens`.
14
+ */
15
+ import type { ReactElement } from "react";
16
+ import type { ListingStatusView } from "../model/status.js";
17
+ export interface ListingStatusProps {
18
+ readonly status: ListingStatusView;
19
+ }
20
+ /** The lifecycle state — the field that decides whether anyone else can see
21
+ * this listing. */
22
+ export declare function LifecycleTag(props: ListingStatusProps): ReactElement;
23
+ /**
24
+ * What the moderation axis adds. Renders `null` when it adds nothing, so a
25
+ * calm listing shows no banner at all.
26
+ */
27
+ export declare function ModerationNote(props: ListingStatusProps): ReactElement | null;
28
+ /** Both, in the order a person reads them: what it IS, then what is happening
29
+ * to it. */
30
+ export declare function ListingStatusBlock(props: ListingStatusProps): ReactElement;
31
+ //# sourceMappingURL=StatusTags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusTags.d.ts","sourceRoot":"","sources":["../../src/default/StatusTags.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAoB/E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;CACpC;AAED;mBACmB;AACnB,wBAAgB,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,CAWpE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CAc7E;AAED;YACY;AACZ,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,CAO1E"}