@stapel/listings-react 0.3.1 → 0.7.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 (164) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/MODULE.md +12 -6
  3. package/README.md +33 -17
  4. package/dist/api/generated/schema.d.ts +129 -3
  5. package/dist/api/generated/schema.d.ts.map +1 -1
  6. package/dist/api/listingsApi.d.ts +35 -22
  7. package/dist/api/listingsApi.d.ts.map +1 -1
  8. package/dist/api/listingsApi.js +17 -0
  9. package/dist/api/listingsApi.js.map +1 -1
  10. package/dist/api/types.d.ts +43 -2
  11. package/dist/api/types.d.ts.map +1 -1
  12. package/dist/api/types.js.map +1 -1
  13. package/dist/default/FavoritesPane.d.ts +40 -3
  14. package/dist/default/FavoritesPane.d.ts.map +1 -1
  15. package/dist/default/FavoritesPane.js +30 -18
  16. package/dist/default/FavoritesPane.js.map +1 -1
  17. package/dist/default/ListingCard.d.ts +25 -4
  18. package/dist/default/ListingCard.d.ts.map +1 -1
  19. package/dist/default/ListingCard.js +19 -12
  20. package/dist/default/ListingCard.js.map +1 -1
  21. package/dist/default/ListingComposerPage.d.ts +163 -23
  22. package/dist/default/ListingComposerPage.d.ts.map +1 -1
  23. package/dist/default/ListingComposerPage.js +85 -43
  24. package/dist/default/ListingComposerPage.js.map +1 -1
  25. package/dist/default/ListingDetailPane.d.ts +41 -4
  26. package/dist/default/ListingDetailPane.d.ts.map +1 -1
  27. package/dist/default/ListingDetailPane.js +38 -25
  28. package/dist/default/ListingDetailPane.js.map +1 -1
  29. package/dist/default/ListingPhoto.d.ts +13 -1
  30. package/dist/default/ListingPhoto.d.ts.map +1 -1
  31. package/dist/default/ListingPhoto.js +47 -9
  32. package/dist/default/ListingPhoto.js.map +1 -1
  33. package/dist/default/ListingPrice.d.ts +13 -0
  34. package/dist/default/ListingPrice.d.ts.map +1 -0
  35. package/dist/default/ListingPrice.js +60 -0
  36. package/dist/default/ListingPrice.js.map +1 -0
  37. package/dist/default/MyListingsPane.d.ts +9 -17
  38. package/dist/default/MyListingsPane.d.ts.map +1 -1
  39. package/dist/default/MyListingsPane.js +148 -63
  40. package/dist/default/MyListingsPane.js.map +1 -1
  41. package/dist/default/SignInLink.js +8 -7
  42. package/dist/default/SignInLink.js.map +1 -1
  43. package/dist/default/StatusTags.d.ts +16 -5
  44. package/dist/default/StatusTags.d.ts.map +1 -1
  45. package/dist/default/StatusTags.js +19 -13
  46. package/dist/default/StatusTags.js.map +1 -1
  47. package/dist/default/index.d.ts +15 -9
  48. package/dist/default/index.d.ts.map +1 -1
  49. package/dist/default/index.js +13 -6
  50. package/dist/default/index.js.map +1 -1
  51. package/dist/headless/Favorites.d.ts +6 -0
  52. package/dist/headless/Favorites.d.ts.map +1 -1
  53. package/dist/headless/Favorites.js +4 -0
  54. package/dist/headless/Favorites.js.map +1 -1
  55. package/dist/headless/ListingActions.d.ts +12 -0
  56. package/dist/headless/ListingActions.d.ts.map +1 -1
  57. package/dist/headless/ListingActions.js +3 -0
  58. package/dist/headless/ListingActions.js.map +1 -1
  59. package/dist/headless/ListingComposer.d.ts +23 -0
  60. package/dist/headless/ListingComposer.d.ts.map +1 -1
  61. package/dist/headless/ListingComposer.js +33 -7
  62. package/dist/headless/ListingComposer.js.map +1 -1
  63. package/dist/headless/MyListings.d.ts +27 -12
  64. package/dist/headless/MyListings.d.ts.map +1 -1
  65. package/dist/headless/MyListings.js +29 -7
  66. package/dist/headless/MyListings.js.map +1 -1
  67. package/dist/i18n/es.d.ts +6 -1
  68. package/dist/i18n/es.d.ts.map +1 -1
  69. package/dist/i18n/es.js +28 -6
  70. package/dist/i18n/es.js.map +1 -1
  71. package/dist/i18n/generated/errors.es.gen.d.ts +1 -1
  72. package/dist/i18n/generated/errors.es.gen.js +1 -1
  73. package/dist/i18n/generated/errors.gen.d.ts +6 -0
  74. package/dist/i18n/generated/errors.gen.d.ts.map +1 -1
  75. package/dist/i18n/generated/errors.gen.js +3 -0
  76. package/dist/i18n/generated/errors.gen.js.map +1 -1
  77. package/dist/i18n/generated/errors.ru.gen.d.ts +1 -1
  78. package/dist/i18n/generated/errors.ru.gen.js +1 -1
  79. package/dist/i18n/keys.d.ts +28 -4
  80. package/dist/i18n/keys.d.ts.map +1 -1
  81. package/dist/i18n/keys.js +49 -8
  82. package/dist/i18n/keys.js.map +1 -1
  83. package/dist/i18n/ru.d.ts +16 -1
  84. package/dist/i18n/ru.d.ts.map +1 -1
  85. package/dist/i18n/ru.js +40 -6
  86. package/dist/i18n/ru.js.map +1 -1
  87. package/dist/index.d.ts +8 -6
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +8 -6
  90. package/dist/index.js.map +1 -1
  91. package/dist/model/draft.d.ts +9 -6
  92. package/dist/model/draft.d.ts.map +1 -1
  93. package/dist/model/draft.js +3 -1
  94. package/dist/model/draft.js.map +1 -1
  95. package/dist/model/features.d.ts +21 -7
  96. package/dist/model/features.d.ts.map +1 -1
  97. package/dist/model/features.js +26 -0
  98. package/dist/model/features.js.map +1 -1
  99. package/dist/model/mine.d.ts +44 -0
  100. package/dist/model/mine.d.ts.map +1 -0
  101. package/dist/model/mine.js +52 -0
  102. package/dist/model/mine.js.map +1 -0
  103. package/dist/model/mineSource.d.ts +39 -34
  104. package/dist/model/mineSource.d.ts.map +1 -1
  105. package/dist/model/mineSource.js +10 -41
  106. package/dist/model/mineSource.js.map +1 -1
  107. package/dist/model/mutations.d.ts.map +1 -1
  108. package/dist/model/mutations.js +11 -4
  109. package/dist/model/mutations.js.map +1 -1
  110. package/dist/model/queryKeys.d.ts +7 -2
  111. package/dist/model/queryKeys.d.ts.map +1 -1
  112. package/dist/model/queryKeys.js +2 -0
  113. package/dist/model/queryKeys.js.map +1 -1
  114. package/dist/model/status.d.ts +12 -31
  115. package/dist/model/status.d.ts.map +1 -1
  116. package/dist/model/status.js +44 -0
  117. package/dist/model/status.js.map +1 -1
  118. package/llms.txt +11 -8
  119. package/manifest.json +88 -14
  120. package/nav-manifest.json +1 -1
  121. package/package.json +17 -12
  122. package/src/analytics/generated/events.json +1 -1
  123. package/src/api/generated/schema.ts +129 -3
  124. package/src/api/listingsApi.ts +60 -21
  125. package/src/api/types.ts +46 -2
  126. package/src/default/FavoritesPane.tsx +156 -82
  127. package/src/default/ListingCard.tsx +88 -46
  128. package/src/default/ListingComposerPage.tsx +403 -187
  129. package/src/default/ListingDetailPane.tsx +200 -98
  130. package/src/default/ListingPhoto.tsx +89 -16
  131. package/src/default/ListingPrice.tsx +77 -0
  132. package/src/default/MyListingsPane.tsx +344 -222
  133. package/src/default/SignInLink.tsx +4 -4
  134. package/src/default/StatusTags.tsx +36 -18
  135. package/src/default/index.ts +18 -7
  136. package/src/headless/Favorites.tsx +10 -0
  137. package/src/headless/ListingActions.tsx +19 -0
  138. package/src/headless/ListingComposer.tsx +56 -5
  139. package/src/headless/MyListings.tsx +62 -22
  140. package/src/i18n/es.ts +36 -7
  141. package/src/i18n/generated/errors.es.gen.ts +1 -1
  142. package/src/i18n/generated/errors.gen.ts +3 -0
  143. package/src/i18n/generated/errors.json +9 -0
  144. package/src/i18n/generated/errors.ru.gen.ts +1 -1
  145. package/src/i18n/keys.ts +58 -9
  146. package/src/i18n/ru.ts +48 -7
  147. package/src/index.ts +16 -5
  148. package/src/model/draft.ts +12 -7
  149. package/src/model/features.ts +48 -7
  150. package/src/model/mine.ts +70 -0
  151. package/src/model/mineSource.ts +46 -41
  152. package/src/model/mutations.ts +11 -4
  153. package/src/model/queryKeys.ts +9 -2
  154. package/src/model/status.ts +15 -0
  155. package/dist/default/ErrorAlert.d.ts +0 -9
  156. package/dist/default/ErrorAlert.d.ts.map +0 -1
  157. package/dist/default/ErrorAlert.js +0 -27
  158. package/dist/default/ErrorAlert.js.map +0 -1
  159. package/dist/default/theme.d.ts +0 -25
  160. package/dist/default/theme.d.ts.map +0 -1
  161. package/dist/default/theme.js +0 -40
  162. package/dist/default/theme.js.map +0 -1
  163. package/src/default/ErrorAlert.tsx +0 -46
  164. package/src/default/theme.tsx +0 -67
@@ -1 +1 @@
1
- {"version":3,"file":"queryKeys.d.ts","sourceRoot":"","sources":["../../src/model/queryKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;wBAEwB;AACxB,wBAAgB,OAAO,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAMlE;AAID,eAAO,MAAM,iBAAiB,EAAE;IAC9B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACpC,+BAA+B;IAC/B,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1E,2BAA2B;IAC3B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D;;0EAEsE;IACtE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D,oCAAoC;IACpC,UAAU,IAAI,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACtD,gDAAgD;IAChD,WAAW,CACT,IAAI,EAAE,cAAc,GACnB,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IAC5D;oDACgD;IAChD,IAAI,CACF,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,cAAc,GACnB,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IACnE,8DAA8D;IAC9D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC3E;8EAC0E;IAC1E,YAAY,IAAI,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACzD,8CAA8C;IAC9C,QAAQ,IAAI,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;CAY3C,CAAC"}
1
+ {"version":3,"file":"queryKeys.d.ts","sourceRoot":"","sources":["../../src/model/queryKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;wBAEwB;AACxB,wBAAgB,OAAO,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAMlE;AAID,eAAO,MAAM,iBAAiB,EAAE;IAC9B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACpC,+BAA+B;IAC/B,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1E,2BAA2B;IAC3B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D;;0EAEsE;IACtE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D,oCAAoC;IACpC,UAAU,IAAI,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACtD,gDAAgD;IAChD,WAAW,CACT,IAAI,EAAE,cAAc,GACnB,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IAC5D,mEAAmE;IACnE,IAAI,CACF,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,cAAc,GACnB,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IACnE;;sCAEkC;IAClC,YAAY,IAAI,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACpE,+DAA+D;IAC/D,OAAO,IAAI,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACnD,8DAA8D;IAC9D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC3E;8EAC0E;IAC1E,YAAY,IAAI,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACzD,8CAA8C;IAC9C,QAAQ,IAAI,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;CAc3C,CAAC"}
@@ -17,6 +17,8 @@ export const listingsQueryKeys = {
17
17
  myCounters: () => [ROOT, "my", "counters"],
18
18
  myFavorites: (page) => [ROOT, "my", "favorites", page],
19
19
  mine: (tab, page) => [ROOT, "my", "listings", tab, page],
20
+ mineUntabbed: () => [ROOT, "my", "listings", "untabbed"],
21
+ allMine: () => [ROOT, "my", "listings"],
20
22
  validateDraft: (id) => [ROOT, "validate-draft", id],
21
23
  allFavorites: () => [ROOT, "my", "favorites"],
22
24
  allLists: () => [ROOT, "list"],
@@ -1 +1 @@
1
- {"version":3,"file":"queryKeys.js","sourceRoot":"","sources":["../../src/model/queryKeys.ts"],"names":[],"mappings":"AAsBA;;wBAEwB;AACxB,MAAM,UAAU,OAAO,CAAC,MAA0B;IAChD,OAAO;QACL,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI;QAC9B,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,IAAI;QACpC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAAG,UAAmB,CAAC;AAEjC,MAAM,CAAC,MAAM,iBAAiB,GA6B1B;IACF,GAAG,EAAE,CAAC,IAAI,CAAC;IACX,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC;IACpC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;IACpC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;IACpC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC;IAC1C,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC;IACtD,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC;IACxD,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAC;IACnD,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;IAC7C,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;CAC/B,CAAC"}
1
+ {"version":3,"file":"queryKeys.js","sourceRoot":"","sources":["../../src/model/queryKeys.ts"],"names":[],"mappings":"AAsBA;;wBAEwB;AACxB,MAAM,UAAU,OAAO,CAAC,MAA0B;IAChD,OAAO;QACL,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI;QAC9B,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,IAAI;QACpC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAAG,UAAmB,CAAC;AAEjC,MAAM,CAAC,MAAM,iBAAiB,GAkC1B;IACF,GAAG,EAAE,CAAC,IAAI,CAAC;IACX,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC;IACpC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;IACpC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;IACpC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC;IAC1C,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC;IACtD,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC;IACxD,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC;IACxD,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC;IACvC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAC;IACnD,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;IAC7C,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;CAC/B,CAAC"}
@@ -1,34 +1,3 @@
1
- /**
2
- * TWO AXES, BOTH ON SCREEN, NEITHER STANDING IN FOR THE OTHER.
3
- *
4
- * `status` (nine states) is the lifecycle and the ONLY thing that decides
5
- * whether a listing is public: `Listing.objects.published()` filters on it
6
- * alone, `INDEXED_STATUSES` is `{published}`, and the model says so out loud
7
- * ("no visibility-reads-moderation_status coupling", `models.py`).
8
- * `moderation_status` (four states) is the content verdict and decides
9
- * NOTHING about visibility.
10
- *
11
- * Since stapel-listings 0.5.0 the two genuinely diverge, and that divergence
12
- * is the reason this file exists:
13
- *
14
- * first publication status draft → PENDING, moderation → pending
15
- * (nothing public until a verdict arrives)
16
- * editing a LIVE listing status published (UNCHANGED), moderation → pending
17
- * (the edit is visible immediately; a rejecting
18
- * verdict later lands as PUBLISHED → BLOCKED)
19
- *
20
- * A dashboard that computed "under re-review" from `status` would show
21
- * nothing at all for the second row — the listing looks exactly as it did —
22
- * and the owner would never learn their edit is being screened. A dashboard
23
- * that computed "visible" from `moderation_status` would tell them their live
24
- * listing is offline while strangers are reading it. Both mistakes are one
25
- * `if` away, which is why the sentence a person reads is produced HERE, from
26
- * BOTH fields, once.
27
- *
28
- * Everything below is pure: no React, no antd, no fetch. `test/status.test.ts`
29
- * asserts the whole 9 × 4 table, so a state added upstream is a red test and
30
- * not a bare enum value on a page.
31
- */
32
1
  import type { ListingLifecycleStatus, ListingModerationStatus } from "../api/types.js";
33
2
  /**
34
3
  * How a status should READ, independent of the words: neutral (nothing is
@@ -114,4 +83,16 @@ export declare const MY_LISTINGS_TAB_STATUSES: Readonly<Record<MyListingsTab, re
114
83
  * status `my/counters` counts in no tab at all. A dashboard that silently
115
84
  * dropped it would hide exactly the listing whose owner most needs to know. */
116
85
  export declare function tabOf(status: ListingLifecycleStatus): MyListingsTab | undefined;
86
+ /**
87
+ * The statuses no tab folds in — `blocked`, and nothing else today.
88
+ *
89
+ * DERIVED, not written down a second time: a status added upstream and left
90
+ * out of the counter groupings lands here automatically and gets shown, which
91
+ * is the opposite of what a hardcoded `["blocked"]` would do the day it goes
92
+ * stale. The dashboard renders these rows OUTSIDE the tabs (see
93
+ * `default/MyListingsPane.tsx`) rather than folding them into one, because a
94
+ * tab's rows and its `my/counters` badge have to describe the same set — and
95
+ * `my/counters` counts a takedown in no tab at all.
96
+ */
97
+ export declare const MY_LISTINGS_UNTABBED_STATUSES: readonly ListingLifecycleStatus[];
117
98
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/model/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,iBAAiB,CAAC;AAIzB;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,SAAS,GACT,MAAM,GACN,SAAS,GACT,SAAS,CAAC;AAEd,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC;8DAC0D;IAC1D,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAoDD,4CAA4C;AAC5C,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,sBAAsB,GAC7B,gBAAgB,CAElB;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAEzE;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,sBAAsB,EAC9B,gBAAgB,EAAE,uBAAuB,GACxC,gBAAgB,GAAG,SAAS,CA0D9B;AAED,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAClD;;;2BAGuB;IACvB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC;sCACkC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAChE;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,sBAAsB,EAC9B,gBAAgB,EAAE,uBAAuB,GACxC,iBAAiB,CAQnB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,2CAA4C,CAAC;AAE1E,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAC7C,MAAM,CAAC,aAAa,EAAE,SAAS,sBAAsB,EAAE,CAAC,CAKzD,CAAC;AAEF;;+EAE+E;AAC/E,wBAAgB,KAAK,CACnB,MAAM,EAAE,sBAAsB,GAC7B,aAAa,GAAG,SAAS,CAK3B"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/model/status.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,iBAAiB,CAAC;AAIzB;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,SAAS,GACT,MAAM,GACN,SAAS,GACT,SAAS,CAAC;AAEd,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC;8DAC0D;IAC1D,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAoDD,4CAA4C;AAC5C,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,sBAAsB,GAC7B,gBAAgB,CAElB;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAEzE;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,sBAAsB,EAC9B,gBAAgB,EAAE,uBAAuB,GACxC,gBAAgB,GAAG,SAAS,CA0D9B;AAED,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAClD;;;2BAGuB;IACvB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC;sCACkC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAChE;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,sBAAsB,EAC9B,gBAAgB,EAAE,uBAAuB,GACxC,iBAAiB,CAQnB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,2CAA4C,CAAC;AAE1E,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAC7C,MAAM,CAAC,aAAa,EAAE,SAAS,sBAAsB,EAAE,CAAC,CAKzD,CAAC;AAEF;;+EAE+E;AAC/E,wBAAgB,KAAK,CACnB,MAAM,EAAE,sBAAsB,GAC7B,aAAa,GAAG,SAAS,CAK3B;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,6BAA6B,EAAE,SAAS,sBAAsB,EACT,CAAC"}
@@ -1,3 +1,35 @@
1
+ /**
2
+ * TWO AXES, BOTH ON SCREEN, NEITHER STANDING IN FOR THE OTHER.
3
+ *
4
+ * `status` (nine states) is the lifecycle and the ONLY thing that decides
5
+ * whether a listing is public: `Listing.objects.published()` filters on it
6
+ * alone, `INDEXED_STATUSES` is `{published}`, and the model says so out loud
7
+ * ("no visibility-reads-moderation_status coupling", `models.py`).
8
+ * `moderation_status` (four states) is the content verdict and decides
9
+ * NOTHING about visibility.
10
+ *
11
+ * Since stapel-listings 0.5.0 the two genuinely diverge, and that divergence
12
+ * is the reason this file exists:
13
+ *
14
+ * first publication status draft → PENDING, moderation → pending
15
+ * (nothing public until a verdict arrives)
16
+ * editing a LIVE listing status published (UNCHANGED), moderation → pending
17
+ * (the edit is visible immediately; a rejecting
18
+ * verdict later lands as PUBLISHED → BLOCKED)
19
+ *
20
+ * A dashboard that computed "under re-review" from `status` would show
21
+ * nothing at all for the second row — the listing looks exactly as it did —
22
+ * and the owner would never learn their edit is being screened. A dashboard
23
+ * that computed "visible" from `moderation_status` would tell them their live
24
+ * listing is offline while strangers are reading it. Both mistakes are one
25
+ * `if` away, which is why the sentence a person reads is produced HERE, from
26
+ * BOTH fields, once.
27
+ *
28
+ * Everything below is pure: no React, no antd, no fetch. `test/status.test.ts`
29
+ * asserts the whole 9 × 4 table, so a state added upstream is a red test and
30
+ * not a bare enum value on a page.
31
+ */
32
+ import { LISTING_STATUSES } from "../api/types.js";
1
33
  import { LISTING_TRANSITIONS } from "./transitions.js";
2
34
  import { LISTINGS_I18N_KEYS } from "../i18n/keys.js";
3
35
  const LIFECYCLE = {
@@ -161,4 +193,16 @@ export function tabOf(status) {
161
193
  }
162
194
  return undefined;
163
195
  }
196
+ /**
197
+ * The statuses no tab folds in — `blocked`, and nothing else today.
198
+ *
199
+ * DERIVED, not written down a second time: a status added upstream and left
200
+ * out of the counter groupings lands here automatically and gets shown, which
201
+ * is the opposite of what a hardcoded `["blocked"]` would do the day it goes
202
+ * stale. The dashboard renders these rows OUTSIDE the tabs (see
203
+ * `default/MyListingsPane.tsx`) rather than folding them into one, because a
204
+ * tab's rows and its `my/counters` badge have to describe the same set — and
205
+ * `my/counters` counts a takedown in no tab at all.
206
+ */
207
+ export const MY_LISTINGS_UNTABBED_STATUSES = LISTING_STATUSES.filter((status) => tabOf(status) === undefined);
164
208
  //# sourceMappingURL=status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/model/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/model/status.ts"],"names":[],"mappings":"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"}
package/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
- # @stapel/listings-react 0.3.1
1
+ # @stapel/listings-react 0.7.0
2
2
 
3
- Headless React flow pair for stapel-listings (contract >=0.6 <0.7) — business + state, zero visual opinion.
3
+ Headless React flow pair for stapel-listings (contract >=0.7 <0.8) — business + state, zero visual opinion.
4
4
  Built on @stapel/core: typed client + StapelApiError envelope, auth token refresh,
5
5
  verification-403 interception, i18n engine, analytics facade, TanStack Query layer.
6
6
 
@@ -29,6 +29,7 @@ Paths are relative to `/listings/api/v1/`.
29
29
  - listings_api_v1_listings_list: GET /listings/
30
30
  - listings_api_v1_listings_my_counters_retrieve: GET /listings/my/counters/
31
31
  - listings_api_v1_listings_my_favorites_list: GET /listings/my/favorites/
32
+ - listings_api_v1_listings_my_listings_list: GET /listings/my/listings/
32
33
  - listings_api_v1_listings_partial_update: PATCH /listings/{id}/
33
34
  - listings_api_v1_listings_publish_create: POST /listings/{id}/publish/
34
35
  - listings_api_v1_listings_retrieve: GET /listings/{id}/
@@ -54,7 +55,7 @@ Paths are relative to `/listings/api/v1/`.
54
55
  - useValidateDraft (query) → validateDraft
55
56
 
56
57
  ## Errors (render t(code, params); UX from remediation)
57
- 63 keys (full catalog: manifest.json §errors). By remediation: fix_input 35 · retry 15 · verify 5 · wait_and_retry 5 · contact_support 2 · reauthenticate 1.
58
+ 64 keys (full catalog: manifest.json §errors). By remediation: fix_input 36 · retry 15 · verify 5 · wait_and_retry 5 · contact_support 2 · reauthenticate 1.
58
59
  Param-bearing keys (interpolation slots matter):
59
60
  - error.400.description_too_long [400] → fix_input {max_length}
60
61
  - error.400.description_too_short [400] → fix_input {min_length}
@@ -80,6 +81,7 @@ Param-bearing keys (interpolation slots matter):
80
81
  - error.400.field.required [400] → fix_input {field}
81
82
  - error.400.field.unique [400] → fix_input {field}
82
83
  - error.400.listing_feature_not_allowed [400] → fix_input {feature}
84
+ - error.400.listing_invalid_status_filter [400] → fix_input {status}
83
85
  - error.409.invalid_listing_transition [409] → fix_input {from_status}
84
86
  - error.429.rate_limit [429] → wait_and_retry {retry_after_minutes}
85
87
 
@@ -103,11 +105,12 @@ const { tracked } = useTracked();
103
105
  ```
104
106
 
105
107
  ## Demos (defineDemo → manifest.demos; compiled, linted, rendered examples)
106
- - listings.card → <ListingCard> [default|visitor] demo/ListingCard.demo.tsx
107
- - listings.composer → <ListingComposerPage> [default|photos-in-flight|unsupported-type] demo/ListingComposer.demo.tsx
108
- - listings.detail → <ListingDetailPane> [default|owner] demo/ListingDetail.demo.tsx
109
- - listings.favorites → <FavoritesPane> [default|empty|failed|visitor] demo/Favorites.demo.tsx
110
- - listings.mine → <MyListingsPane> [default|no-source] demo/MyListings.demo.tsx
108
+ - listings.card → <ListingCard> [default|saved|visitor|no-photo] demo/ListingCard.demo.tsx
109
+ - listings.composer → <ListingComposerPage> [default|unwired|photos-in-flight|unsupported-type] demo/ListingComposer.demo.tsx
110
+ - listings.detail → <ListingDetailPane> [default|contact-unwired|owner|not-found] demo/ListingDetail.demo.tsx
111
+ - listings.favorites → <FavoritesPane> [default|paged|empty|failed|visitor] demo/Favorites.demo.tsx
112
+ - listings.mine → <MyListingsPane> [default|no-editor|taken-down|visitor|failed] demo/MyListings.demo.tsx
113
+ - listings.parts → <ListingStatusBlock> [default|tags|notes|media|door] demo/ListingParts.demo.tsx
111
114
  Each source file is the canonical usage snippet (open the default variant).
112
115
 
113
116
  ## Snippets
package/manifest.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "$generated": "by scripts/gen-manifest.mjs — do not edit; drift-gated (pnpm gen:manifest:check)",
3
3
  "package": "@stapel/listings-react",
4
- "version": "0.3.1",
4
+ "version": "0.7.0",
5
5
  "backend": {
6
6
  "module": "stapel-listings",
7
- "contract": ">=0.6 <0.7"
7
+ "contract": ">=0.7 <0.8"
8
8
  },
9
9
  "layers": [
10
10
  "api",
@@ -72,6 +72,13 @@
72
72
  "request": null,
73
73
  "response": "PaginatedListingCardList"
74
74
  },
75
+ "listings_api_v1_listings_my_listings_list": {
76
+ "method": "GET",
77
+ "path": "/listings/api/v1/listings/my/listings/",
78
+ "tag": "Listings",
79
+ "request": null,
80
+ "response": "PaginatedMyListingCardList"
81
+ },
75
82
  "listings_api_v1_listings_partial_update": {
76
83
  "method": "PATCH",
77
84
  "path": "/listings/api/v1/listings/{id}/",
@@ -142,6 +149,11 @@
142
149
  "kind": "mutation",
143
150
  "operation": "createDraft",
144
151
  "invalidates": [
152
+ [
153
+ "listings",
154
+ "my",
155
+ "listings"
156
+ ],
145
157
  [
146
158
  "listings",
147
159
  "my",
@@ -453,6 +465,13 @@
453
465
  ],
454
466
  "remediation": "fix_input"
455
467
  },
468
+ "error.400.listing_invalid_status_filter": {
469
+ "status": 400,
470
+ "params": [
471
+ "status"
472
+ ],
473
+ "remediation": "fix_input"
474
+ },
456
475
  "error.400.publish_validation_failed": {
457
476
  "status": 400,
458
477
  "params": [],
@@ -626,7 +645,7 @@
626
645
  {
627
646
  "id": "listings.card",
628
647
  "title": "Listing card",
629
- "description": "The slot @stapel/search-react fills through the container — the two pairs never import each other. Badges come out of the stored DAO projection, which carries each type's display config beside its value, so a grid of forty cards costs one query and no category read. The heart is never hidden from a visitor: it is blocked, with the reason, and the container attaches the sign-in CTA.",
648
+ "description": "The slot @stapel/search-react fills through the container — the two pairs never import each other. Badges come out of the stored DAO projection, which carries each type's display config beside its value, so a grid of forty cards costs one query and no category read. The heart is never hidden from a visitor: it is blocked, the reason is printed beside it as ordinary text (a disabled button never fires the events a tooltip needs), and the container attaches the sign-in door.",
630
649
  "component": "ListingCard",
631
650
  "covers": [
632
651
  "ListingsProvider"
@@ -636,14 +655,16 @@
636
655
  ],
637
656
  "variants": [
638
657
  "default",
639
- "visitor"
658
+ "saved",
659
+ "visitor",
660
+ "no-photo"
640
661
  ],
641
662
  "source": "demo/ListingCard.demo.tsx"
642
663
  },
643
664
  {
644
665
  "id": "listings.composer",
645
666
  "title": "Listing composer",
646
- "description": "The submission screen, where four contracts meet through three seams: the category schema arrives as FeatureDef[], the photos as @stapel/cdn-react's upload bag (its refs ARE images_draft, its settled gates the submit), and the value editors from @stapel/attributes-react. The variants show two of the six reasons the publish button can be off photos in flight, and a value type this build has no editor for, which blocks the submit loudly rather than dropping a possibly-mandatory field.",
667
+ "description": "The submission screen, where five contracts meet through four slots: the category picker and its schema (@stapel/categories-react), the location picker (@stapel/geo-react), the currency vocabulary, and the photo grid whose upload bag's refs ARE images_draft and whose settled gates the submit (@stapel/cdn-react). An UNFILLED slot renders its own name and nothing else — the composer will not ask a seller for a numeric category id, a currency code or a pair of decimal coordinates, which is what it used to do. The variants show two of the six reasons the publish button can be off: photos in flight, and a value type this build has no editor for.",
647
668
  "component": "ListingComposerPage",
648
669
  "covers": [
649
670
  "ListingComposer"
@@ -653,6 +674,7 @@
653
674
  ],
654
675
  "variants": [
655
676
  "default",
677
+ "unwired",
656
678
  "photos-in-flight",
657
679
  "unsupported-type"
658
680
  ],
@@ -661,7 +683,7 @@
661
683
  {
662
684
  "id": "listings.detail",
663
685
  "title": "Listing detail",
664
- "description": "The same listing, read by two people. A buyer sees a live page. The OWNER also sees the moderation axis — 'published, changes under review' because since stapel-listings 0.5.0 an edit to a live listing keeps status=published and moves only moderation_status, and a dashboard that derived one field from the other would either hide the listing or hide the review.",
686
+ "description": "The money screen, read by two people. A buyer gets ONE primary — the container's 'message the seller' in contactSlot — with favouriting as the secondary beside it. The OWNER gets Edit and Take down instead, plus the moderation axis: since stapel-listings 0.5.0 an edit to a live listing keeps status=published and moves only moderation_status, and a page that derived one field from the other would either hide the listing or hide the review. An unfilled contactSlot names itself rather than leaving 'save to favourites' as the only verb on the page.",
665
687
  "component": "ListingDetailPane",
666
688
  "covers": [
667
689
  "ListingDetail"
@@ -671,14 +693,16 @@
671
693
  ],
672
694
  "variants": [
673
695
  "default",
674
- "owner"
696
+ "contact-unwired",
697
+ "owner",
698
+ "not-found"
675
699
  ],
676
700
  "source": "demo/ListingDetail.demo.tsx"
677
701
  },
678
702
  {
679
703
  "id": "listings.favorites",
680
704
  "title": "Favourites",
681
- "description": "The plainest place to see the load-state discipline: 'you have not saved anything yet' and 'we could not load your favourites' are two arms, not one. Merging them is the substitution that turned a 5xx into an empty result page on 2026-08-09. A visitor is told to sign in and no request is made at all.",
705
+ "description": "The plainest place to see the load-state discipline: 'you have not saved anything yet' and 'we could not load your favourites' are two arms, not one. Merging them is the substitution that turned a 5xx into an empty result page on 2026-08-09. A visitor makes no request at all and is shown ONE state — the reason plus the door — where the pane used to render a blocked notice with a spinner turning underneath it. The pager renders only when there is a page to go to.",
682
706
  "component": "FavoritesPane",
683
707
  "covers": [
684
708
  "Favorites"
@@ -688,6 +712,7 @@
688
712
  ],
689
713
  "variants": [
690
714
  "default",
715
+ "paged",
691
716
  "empty",
692
717
  "failed",
693
718
  "visitor"
@@ -697,7 +722,7 @@
697
722
  {
698
723
  "id": "listings.mine",
699
724
  "title": "My listings",
700
- "description": "stapel-listings 0.6.1 has no owner-scoped list endpoint: GET /listings/ answers published() and takes no owner parameter, so a seller's own drafts are unreachable by any call the contract offers. The counters ARE real and are shown; the rows come from an injected source, and with none the pane says so instead of drawing an empty grid that reads as 'you have no listings'.",
725
+ "description": "stapel-listings 0.7.0 gave the owner's own listings a route (GET my/listings/, every status, ?status= for a tab's set), so the rows here are the contract's own. Four things the pane refuses to smooth over: both axes on every row (a LIVE listing whose edit is under review says so — status alone cannot); a moderation takedown, which my/counters counts in no tab at all, sits ABOVE the tabs; every switched-off action prints its reason beside itself instead of hiding it in a hover a phone cannot open; and Delete asks first, through a bottom sheet. The row is a thumbnail plus a min-width:0 column, so four actions wrap at 390px instead of clipping.",
701
726
  "component": "MyListingsPane",
702
727
  "covers": [
703
728
  "MyListings"
@@ -707,9 +732,35 @@
707
732
  ],
708
733
  "variants": [
709
734
  "default",
710
- "no-source"
735
+ "no-editor",
736
+ "taken-down",
737
+ "visitor",
738
+ "failed"
711
739
  ],
712
740
  "source": "demo/MyListings.demo.tsx"
741
+ },
742
+ {
743
+ "id": "listings.parts",
744
+ "title": "Listing parts",
745
+ "description": "The pieces the panes are built from. ONE status treatment: a tag carrying the tone and the moderation sentence as ordinary text beneath it — it used to be three (a full-bleed olive bar, a full-bleed grey bar, bare red text) down a single dashboard. The media placeholder is the aspect-ratio box the photo would have filled, painted from theme tokens, so it belongs to whichever side the theme is on instead of glaring white in the dark. The sign-in door is the container's route, never the pair's.",
746
+ "component": "ListingStatusBlock",
747
+ "covers": [
748
+ "LifecycleTag",
749
+ "ModerationNote",
750
+ "ListingPhoto",
751
+ "SignInLink"
752
+ ],
753
+ "tokens": [
754
+ "surface-raised"
755
+ ],
756
+ "variants": [
757
+ "default",
758
+ "tags",
759
+ "notes",
760
+ "media",
761
+ "door"
762
+ ],
763
+ "source": "demo/ListingParts.demo.tsx"
713
764
  }
714
765
  ],
715
766
  "i18nKeys": [
@@ -744,6 +795,7 @@
744
795
  "error.400.image_required",
745
796
  "error.400.invalid_ad_id",
746
797
  "error.400.listing_feature_not_allowed",
798
+ "error.400.listing_invalid_status_filter",
747
799
  "error.400.publish_validation_failed",
748
800
  "error.400.validation_error",
749
801
  "error.400.verification_failed",
@@ -780,6 +832,7 @@
780
832
  "listings.blocked.guest",
781
833
  "listings.blocked.in_flight",
782
834
  "listings.blocked.mandate_unknown",
835
+ "listings.blocked.no_editor",
783
836
  "listings.blocked.sign_in",
784
837
  "listings.blocked.transition",
785
838
  "listings.card.favorite_add",
@@ -792,6 +845,7 @@
792
845
  "listings.compose.auto_republish",
793
846
  "listings.compose.blocked.busy",
794
847
  "listings.compose.blocked.details_unavailable",
848
+ "listings.compose.blocked.incomplete",
795
849
  "listings.compose.blocked.mirror",
796
850
  "listings.compose.blocked.no_category",
797
851
  "listings.compose.blocked.no_draft",
@@ -811,9 +865,8 @@
811
865
  "listings.compose.edit_title",
812
866
  "listings.compose.geo_incomplete",
813
867
  "listings.compose.invalid_summary",
814
- "listings.compose.lat_label",
868
+ "listings.compose.location_help",
815
869
  "listings.compose.location_label",
816
- "listings.compose.lon_label",
817
870
  "listings.compose.new_title",
818
871
  "listings.compose.photos",
819
872
  "listings.compose.price_invalid",
@@ -831,6 +884,7 @@
831
884
  "listings.compose.title_too_long",
832
885
  "listings.compose.too_many_images",
833
886
  "listings.detail.description",
887
+ "listings.detail.edit",
834
888
  "listings.detail.expires_at",
835
889
  "listings.detail.load_failed",
836
890
  "listings.detail.loading",
@@ -845,23 +899,34 @@
845
899
  "listings.detail.retry",
846
900
  "listings.detail.specs",
847
901
  "listings.detail.stock",
902
+ "listings.detail.take_down",
848
903
  "listings.detail.unreadable_features",
849
904
  "listings.error.unknown",
850
905
  "listings.favorites.empty",
906
+ "listings.favorites.empty_hint",
851
907
  "listings.favorites.load_failed",
852
908
  "listings.favorites.loading",
909
+ "listings.favorites.sign_in_hint",
853
910
  "listings.favorites.title",
854
911
  "listings.mine.archive",
912
+ "listings.mine.blocked.load_failed",
913
+ "listings.mine.blocked.title",
914
+ "listings.mine.blocked.title.one",
915
+ "listings.mine.blocked.title.other",
855
916
  "listings.mine.complete",
856
917
  "listings.mine.counters_failed",
857
918
  "listings.mine.delete",
919
+ "listings.mine.delete_confirm_body",
920
+ "listings.mine.delete_confirm_title",
858
921
  "listings.mine.edit",
859
922
  "listings.mine.empty",
923
+ "listings.mine.empty.active",
924
+ "listings.mine.empty.archived",
925
+ "listings.mine.empty.drafts",
860
926
  "listings.mine.live_under_review",
861
927
  "listings.mine.load_failed",
862
928
  "listings.mine.loading",
863
929
  "listings.mine.retry",
864
- "listings.mine.source_missing",
865
930
  "listings.mine.tab.active",
866
931
  "listings.mine.tab.archived",
867
932
  "listings.mine.tab.drafts",
@@ -877,6 +942,7 @@
877
942
  "listings.nav.detail",
878
943
  "listings.nav.favorites",
879
944
  "listings.nav.mine",
945
+ "listings.page.indicator",
880
946
  "listings.page.next",
881
947
  "listings.page.prev",
882
948
  "listings.status.archived",
@@ -914,9 +980,9 @@
914
980
  "ListingsProvider",
915
981
  "ListingsRuntimeContext",
916
982
  "MODERATION_STATUSES",
917
- "MY_LISTINGS_SOURCE_MISSING",
918
983
  "MY_LISTINGS_TABS",
919
984
  "MY_LISTINGS_TAB_STATUSES",
985
+ "MY_LISTINGS_UNTABBED_STATUSES",
920
986
  "MyListings",
921
987
  "PRICE_FIELD",
922
988
  "TITLE_FIELD",
@@ -926,6 +992,7 @@
926
992
  "createDraftBody",
927
993
  "createListingsApi",
928
994
  "createListingsRuntime",
995
+ "defaultMyListingsSource",
929
996
  "draftPatchFromValues",
930
997
  "draftValuesFromDetail",
931
998
  "draftValuesFromWire",
@@ -948,11 +1015,15 @@
948
1015
  "mirrorDraft",
949
1016
  "mirrorListingFields",
950
1017
  "moderationNotice",
1018
+ "myListingImages",
1019
+ "myListingPrice",
1020
+ "myListingTitle",
951
1021
  "navEntries",
952
1022
  "pageKey",
953
1023
  "publishRefusal",
954
1024
  "registerListingsI18n",
955
1025
  "retainKnownFeatureValues",
1026
+ "showsDraft",
956
1027
  "tabOf",
957
1028
  "unreadableFeatureCount",
958
1029
  "useArchiveListing",
@@ -1026,10 +1097,13 @@
1026
1097
  "ListingsRuntime",
1027
1098
  "ModerationNotice",
1028
1099
  "MyCounters",
1100
+ "MyListingCard",
1029
1101
  "MyListingsBag",
1102
+ "MyListingsParams",
1030
1103
  "MyListingsSource",
1031
1104
  "MyListingsTab",
1032
1105
  "PaginatedListingCards",
1106
+ "PaginatedMyListingCards",
1033
1107
  "PublishOutcome",
1034
1108
  "PublishRefusal",
1035
1109
  "PublishResponse",
package/nav-manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@stapel/listings-react",
3
- "version": "0.3.1",
3
+ "version": "0.7.0",
4
4
  "entries": [
5
5
  {
6
6
  "id": "listings.detail",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stapel/listings-react",
3
- "version": "0.3.1",
3
+ "version": "0.7.0",
4
4
  "description": "Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility and `moderation_status` decides nothing about it, so an edit to a live listing stays live and says 'under review' instead of vanishing. Feature values are drawn and mirrored by @stapel/attributes-react; photos arrive as an injected upload bag whose `refs` ARE `images_draft` and whose `settled` gates the submit; a publish refusal is routed onto the control that caused it by slug. Zero visual opinion in the main entry; an opt-in /default subpath ships the antd skin.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -53,14 +53,14 @@
53
53
  "limit": "11 KB"
54
54
  },
55
55
  {
56
- "name": "default — the antd skin (card, detail, composer, dashboard) must stay out of the main bundle",
56
+ "name": "default — the antd skin (card, detail, composer, dashboard, the four named slots and the delete confirmation) must stay out of the main bundle",
57
57
  "path": "dist/default/index.js",
58
- "limit": "14 KB"
58
+ "limit": "16 KB"
59
59
  },
60
60
  {
61
61
  "name": "i18n/ru — the Russian bundle is opt-in, not carried by the main entry",
62
62
  "path": "dist/i18n/ru.js",
63
- "limit": "4.5 KB"
63
+ "limit": "5 KB"
64
64
  },
65
65
  {
66
66
  "name": "i18n/es — the Spanish bundle is opt-in, not carried by the main entry",
@@ -70,14 +70,18 @@
70
70
  ],
71
71
  "peerDependencies": {
72
72
  "@stapel/attributes-react": ">=0.1.0",
73
- "@stapel/core": ">=0.16.0 <1.0.0",
73
+ "@stapel/core": ">=0.18.1 <1.0.0",
74
+ "@stapel/currencies-react": ">=0.2.0",
74
75
  "@stapel/image": ">=0.2.0",
75
- "@stapel/tokens-antd": ">=0.5.0",
76
+ "@stapel/tokens-antd": ">=0.7.0",
76
77
  "@tanstack/react-query": "^5.0.0",
77
78
  "antd": ">=5.20.0 <7",
78
79
  "react": ">=19"
79
80
  },
80
81
  "peerDependenciesMeta": {
82
+ "@stapel/currencies-react": {
83
+ "optional": true
84
+ },
81
85
  "@stapel/tokens-antd": {
82
86
  "optional": true
83
87
  },
@@ -98,12 +102,13 @@
98
102
  "size-limit": "^11.2.0",
99
103
  "typescript": "^5.8.3",
100
104
  "vitest": "^3.2.4",
101
- "@stapel/attributes-react": "^0.2.0",
102
- "@stapel/core": "^0.17.0",
103
- "@stapel/image": "^0.3.0",
104
- "@stapel/showcase": "^0.2.0",
105
- "@stapel/tokens": "^0.5.0",
106
- "@stapel/tokens-antd": "^0.5.0"
105
+ "@stapel/attributes-react": "^0.3.1",
106
+ "@stapel/core": "^0.18.1",
107
+ "@stapel/currencies-react": "^0.2.0",
108
+ "@stapel/image": "^0.4.1",
109
+ "@stapel/showcase": "^0.3.0",
110
+ "@stapel/tokens": "^0.5.1",
111
+ "@stapel/tokens-antd": "^0.7.0"
107
112
  },
108
113
  "engines": {
109
114
  "node": ">=22"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$generated": "by scripts/gen-events.mjs — do not edit; drift-gated (pnpm gen:events:check)",
3
3
  "package": "@stapel/listings-react",
4
- "version": "0.3.1",
4
+ "version": "0.7.0",
5
5
  "defined": [],
6
6
  "flows": []
7
7
  }