@stapel/listings-react 0.25.10 → 0.27.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 (144) hide show
  1. package/CHANGELOG.md +259 -0
  2. package/MODULE.md +3 -1
  3. package/README.md +122 -9
  4. package/dist/api/generated/schema.d.ts +22 -12
  5. package/dist/api/generated/schema.d.ts.map +1 -1
  6. package/dist/default/CardBadges.d.ts.map +1 -1
  7. package/dist/default/CardBadges.js +3 -1
  8. package/dist/default/CardBadges.js.map +1 -1
  9. package/dist/default/ListingActions.d.ts +108 -0
  10. package/dist/default/ListingActions.d.ts.map +1 -0
  11. package/dist/default/ListingActions.js +29 -0
  12. package/dist/default/ListingActions.js.map +1 -0
  13. package/dist/default/ListingCard.d.ts.map +1 -1
  14. package/dist/default/ListingCard.js +15 -8
  15. package/dist/default/ListingCard.js.map +1 -1
  16. package/dist/default/ListingDetailPane.d.ts +170 -62
  17. package/dist/default/ListingDetailPane.d.ts.map +1 -1
  18. package/dist/default/ListingDetailPane.js +284 -28
  19. package/dist/default/ListingDetailPane.js.map +1 -1
  20. package/dist/default/ListingFeedCard.d.ts.map +1 -1
  21. package/dist/default/ListingFeedCard.js +2 -1
  22. package/dist/default/ListingFeedCard.js.map +1 -1
  23. package/dist/default/ListingPhoto.d.ts.map +1 -1
  24. package/dist/default/ListingPhoto.js +5 -2
  25. package/dist/default/ListingPhoto.js.map +1 -1
  26. package/dist/default/ListingSerpCard.d.ts.map +1 -1
  27. package/dist/default/ListingSerpCard.js +18 -4
  28. package/dist/default/ListingSerpCard.js.map +1 -1
  29. package/dist/default/MyListingsPane.d.ts.map +1 -1
  30. package/dist/default/MyListingsPane.js +49 -21
  31. package/dist/default/MyListingsPane.js.map +1 -1
  32. package/dist/default/ShareAction.d.ts +32 -0
  33. package/dist/default/ShareAction.d.ts.map +1 -0
  34. package/dist/default/ShareAction.js +116 -0
  35. package/dist/default/ShareAction.js.map +1 -0
  36. package/dist/default/actionRow.d.ts +58 -0
  37. package/dist/default/actionRow.d.ts.map +1 -0
  38. package/dist/default/actionRow.js +128 -0
  39. package/dist/default/actionRow.js.map +1 -0
  40. package/dist/default/cardGallery.d.ts +2 -0
  41. package/dist/default/cardGallery.d.ts.map +1 -1
  42. package/dist/default/cardGallery.js +31 -0
  43. package/dist/default/cardGallery.js.map +1 -1
  44. package/dist/default/detailGallery.d.ts +77 -0
  45. package/dist/default/detailGallery.d.ts.map +1 -0
  46. package/dist/default/detailGallery.js +91 -0
  47. package/dist/default/detailGallery.js.map +1 -0
  48. package/dist/default/favorite.d.ts +25 -0
  49. package/dist/default/favorite.d.ts.map +1 -1
  50. package/dist/default/favorite.js +29 -3
  51. package/dist/default/favorite.js.map +1 -1
  52. package/dist/default/icons.d.ts +19 -0
  53. package/dist/default/icons.d.ts.map +1 -1
  54. package/dist/default/icons.js +23 -0
  55. package/dist/default/icons.js.map +1 -1
  56. package/dist/default/index.d.ts +11 -2
  57. package/dist/default/index.d.ts.map +1 -1
  58. package/dist/default/index.js +10 -1
  59. package/dist/default/index.js.map +1 -1
  60. package/dist/default/movableCluster.d.ts +18 -0
  61. package/dist/default/movableCluster.d.ts.map +1 -0
  62. package/dist/default/movableCluster.js +110 -0
  63. package/dist/default/movableCluster.js.map +1 -0
  64. package/dist/default/notice.d.ts +14 -0
  65. package/dist/default/notice.d.ts.map +1 -0
  66. package/dist/default/notice.js +62 -0
  67. package/dist/default/notice.js.map +1 -0
  68. package/dist/headless/MyListings.d.ts +61 -19
  69. package/dist/headless/MyListings.d.ts.map +1 -1
  70. package/dist/headless/MyListings.js +58 -19
  71. package/dist/headless/MyListings.js.map +1 -1
  72. package/dist/headless/Share.d.ts +103 -0
  73. package/dist/headless/Share.d.ts.map +1 -0
  74. package/dist/headless/Share.js +190 -0
  75. package/dist/headless/Share.js.map +1 -0
  76. package/dist/i18n/es.d.ts.map +1 -1
  77. package/dist/i18n/es.js +21 -0
  78. package/dist/i18n/es.js.map +1 -1
  79. package/dist/i18n/generated/errors.es.gen.d.ts +1 -1
  80. package/dist/i18n/generated/errors.es.gen.js +1 -1
  81. package/dist/i18n/generated/errors.gen.d.ts +18 -0
  82. package/dist/i18n/generated/errors.gen.d.ts.map +1 -1
  83. package/dist/i18n/generated/errors.gen.js +9 -0
  84. package/dist/i18n/generated/errors.gen.js.map +1 -1
  85. package/dist/i18n/generated/errors.ru.gen.d.ts +1 -1
  86. package/dist/i18n/generated/errors.ru.gen.js +1 -1
  87. package/dist/i18n/keys.d.ts +45 -0
  88. package/dist/i18n/keys.d.ts.map +1 -1
  89. package/dist/i18n/keys.js +60 -0
  90. package/dist/i18n/keys.js.map +1 -1
  91. package/dist/i18n/ru.d.ts.map +1 -1
  92. package/dist/i18n/ru.js +21 -0
  93. package/dist/i18n/ru.js.map +1 -1
  94. package/dist/index.d.ts +5 -3
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +2 -1
  97. package/dist/index.js.map +1 -1
  98. package/dist/model/cardBadges.d.ts +52 -3
  99. package/dist/model/cardBadges.d.ts.map +1 -1
  100. package/dist/model/cardBadges.js +74 -12
  101. package/dist/model/cardBadges.js.map +1 -1
  102. package/dist/model/mineSource.d.ts +9 -3
  103. package/dist/model/mineSource.d.ts.map +1 -1
  104. package/dist/model/mineSource.js.map +1 -1
  105. package/dist/model/status.d.ts +79 -15
  106. package/dist/model/status.d.ts.map +1 -1
  107. package/dist/model/status.js +86 -17
  108. package/dist/model/status.js.map +1 -1
  109. package/llms.txt +8 -3
  110. package/manifest.json +96 -4
  111. package/nav-manifest.json +1 -1
  112. package/package.json +10 -10
  113. package/src/analytics/generated/events.json +1 -1
  114. package/src/api/generated/schema.ts +22 -12
  115. package/src/default/CardBadges.tsx +3 -1
  116. package/src/default/ListingActions.tsx +196 -0
  117. package/src/default/ListingCard.tsx +79 -43
  118. package/src/default/ListingDetailPane.tsx +520 -89
  119. package/src/default/ListingFeedCard.tsx +2 -0
  120. package/src/default/ListingPhoto.tsx +28 -0
  121. package/src/default/ListingSerpCard.tsx +39 -12
  122. package/src/default/MyListingsPane.tsx +81 -44
  123. package/src/default/ShareAction.tsx +260 -0
  124. package/src/default/actionRow.ts +131 -0
  125. package/src/default/cardGallery.ts +31 -0
  126. package/src/default/detailGallery.ts +97 -0
  127. package/src/default/favorite.tsx +68 -1
  128. package/src/default/icons.tsx +60 -0
  129. package/src/default/index.ts +37 -1
  130. package/src/default/movableCluster.tsx +137 -0
  131. package/src/default/notice.ts +68 -0
  132. package/src/headless/MyListings.tsx +130 -39
  133. package/src/headless/Share.tsx +278 -0
  134. package/src/i18n/es.ts +28 -0
  135. package/src/i18n/generated/errors.es.gen.ts +1 -1
  136. package/src/i18n/generated/errors.gen.ts +9 -0
  137. package/src/i18n/generated/errors.json +31 -0
  138. package/src/i18n/generated/errors.ru.gen.ts +1 -1
  139. package/src/i18n/keys.ts +63 -0
  140. package/src/i18n/ru.ts +28 -0
  141. package/src/index.ts +22 -0
  142. package/src/model/cardBadges.ts +124 -12
  143. package/src/model/mineSource.ts +9 -3
  144. package/src/model/status.ts +102 -20
@@ -41,8 +41,10 @@ export { ListingFeedCard } from "./ListingFeedCard.js";
41
41
  export type { ListingFeedCardProps, ListingFeedCardBaseProps, } from "./ListingFeedCard.js";
42
42
  export { FeedGrid, FEED_GRID_COLUMNS } from "./FeedGrid.js";
43
43
  export type { FeedGridProps } from "./FeedGrid.js";
44
- export { ListingDetailPane, DETAIL_MEASURE, DETAIL_SPLIT_MEASURE, DETAIL_SPLIT_ASIDE, DETAIL_PHOTO_MIN, } from "./ListingDetailPane.js";
45
- export type { ListingDetailPaneProps } from "./ListingDetailPane.js";
44
+ export { ListingDetailPane, DETAIL_MEASURE, DETAIL_SPLIT_MEASURE, DETAIL_SPLIT_ASIDE, DETAIL_PHOTO_MIN, DETAIL_GALLERY_GUTTER, } from "./ListingDetailPane.js";
45
+ export type { ListingDetailPaneProps, ListingActionsPlacement, } from "./ListingDetailPane.js";
46
+ export { LISTINGS_GALLERY_CLASS, LISTINGS_GALLERY_STYLE_HREF, LISTINGS_GALLERY_STRIP_BASIS, detailGalleryCss, } from "./detailGallery.js";
47
+ export type { ListingGalleryLayout } from "./detailGallery.js";
46
48
  export { ListingComposerPage, COMPOSER_DETAILS_PLACEMENT, COMPOSER_MEASURE, composerFieldId, } from "./ListingComposerPage.js";
47
49
  export type { ListingComposerPageProps, ComposerCategorySlot, ComposerCurrencySlot, ComposerLocationSlot, ComposerLocationValue, ComposerLocationPickerProps, } from "./ListingComposerPage.js";
48
50
  export { MyListingsPane } from "./MyListingsPane.js";
@@ -59,6 +61,13 @@ export { CardBadges, CardSpecLine } from "./CardBadges.js";
59
61
  export type { CardBadgesProps } from "./CardBadges.js";
60
62
  export { SWIPE_AXIS_RATIO, SWIPE_MIN_PX, cardGalleryCss, hasFinePointer, segmentIndex, swipeStep, useCardGallery, } from "./cardGallery.js";
61
63
  export type { CardGallery } from "./cardGallery.js";
64
+ export { ListingActions } from "./ListingActions.js";
65
+ export type { ListingActionsConfig, ListingActionsProps, } from "./ListingActions.js";
66
+ export { ShareAction } from "./ShareAction.js";
67
+ export type { ShareActionProps } from "./ShareAction.js";
68
+ export { LISTING_ACTIONS_CLASS, LISTING_ACTIONS_OVERLAY_CLASS, LISTING_ACTIONS_STYLE_HREF, LISTING_ACTION_CLASS, LISTING_ACTION_HIT, LISTING_ACTION_LABEL_CLASS, LISTING_CARD_ACTION_CLASS, LISTING_CARD_ACTION_HIT, actionRowCss, } from "./actionRow.js";
69
+ export { NOTICE_SECONDS, useNotice } from "./notice.js";
70
+ export type { Notice } from "./notice.js";
62
71
  export { SignInLink } from "./SignInLink.js";
63
72
  export type { SignInLinkProps } from "./SignInLink.js";
64
73
  export type { CategoryFeaturesProp, ThemeModeProp } from "./types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/default/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EACL,WAAW,EAGX,oBAAoB,EACpB,sBAAsB,EAGtB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EACV,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EACV,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5D,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,iBAAiB,EACjB,cAAc,EAGd,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACvE,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnF,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,SAAS,EACT,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/default/index.ts"],"names":[],"mappings":"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"}
@@ -46,7 +46,11 @@ export { FeedGrid, FEED_GRID_COLUMNS } from "./FeedGrid.js";
46
46
  export { ListingDetailPane, DETAIL_MEASURE,
47
47
  // The split layout's two geometry constants, for a container laying out
48
48
  // against the same tracks (and for a test that measures them).
49
- DETAIL_SPLIT_MEASURE, DETAIL_SPLIT_ASIDE, DETAIL_PHOTO_MIN, } from "./ListingDetailPane.js";
49
+ DETAIL_SPLIT_MEASURE, DETAIL_SPLIT_ASIDE, DETAIL_PHOTO_MIN, DETAIL_GALLERY_GUTTER, } from "./ListingDetailPane.js";
50
+ // The gallery's two shapes, its class and the stylesheet behind them — a host
51
+ // that wants a third writes CSS against these rather than `!important` over an
52
+ // inline `display`.
53
+ export { LISTINGS_GALLERY_CLASS, LISTINGS_GALLERY_STYLE_HREF, LISTINGS_GALLERY_STRIP_BASIS, detailGalleryCss, } from "./detailGallery.js";
50
54
  export { ListingComposerPage, COMPOSER_DETAILS_PLACEMENT, COMPOSER_MEASURE, composerFieldId, } from "./ListingComposerPage.js";
51
55
  export { MyListingsPane } from "./MyListingsPane.js";
52
56
  export { FavoritesPane, FAVORITES_CARD_MIN } from "./FavoritesPane.js";
@@ -57,5 +61,10 @@ export { ListingSpecColumns, ListingSpecList, specListCss, } from "./ListingSpec
57
61
  export { CardBadges, CardSpecLine } from "./CardBadges.js";
58
62
  // ── the card gallery's two gestures ─────────────────────────────────────────
59
63
  export { SWIPE_AXIS_RATIO, SWIPE_MIN_PX, cardGalleryCss, hasFinePointer, segmentIndex, swipeStep, useCardGallery, } from "./cardGallery.js";
64
+ // ── the reader's two actions: save it, or send it to somebody ───────────────
65
+ export { ListingActions } from "./ListingActions.js";
66
+ export { ShareAction } from "./ShareAction.js";
67
+ export { LISTING_ACTIONS_CLASS, LISTING_ACTIONS_OVERLAY_CLASS, LISTING_ACTIONS_STYLE_HREF, LISTING_ACTION_CLASS, LISTING_ACTION_HIT, LISTING_ACTION_LABEL_CLASS, LISTING_CARD_ACTION_CLASS, LISTING_CARD_ACTION_HIT, actionRowCss, } from "./actionRow.js";
68
+ export { NOTICE_SECONDS, useNotice } from "./notice.js";
60
69
  export { SignInLink } from "./SignInLink.js";
61
70
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/default/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EACL,WAAW;AACX,6EAA6E;AAC7E,6EAA6E;AAC7E,oBAAoB,EACpB,sBAAsB;AACtB,0EAA0E;AAC1E,4EAA4E;AAC5E,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAMvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAKvD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE5D,OAAO,EACL,iBAAiB,EACjB,cAAc;AACd,wEAAwE;AACxE,+DAA+D;AAC/D,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AASlC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAOvE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEnF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,gFAAgF;AAChF,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG3D,+EAA+E;AAC/E,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,SAAS,EACT,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/default/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EACL,WAAW;AACX,6EAA6E;AAC7E,6EAA6E;AAC7E,oBAAoB,EACpB,sBAAsB;AACtB,0EAA0E;AAC1E,4EAA4E;AAC5E,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAMvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAKvD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE5D,OAAO,EACL,iBAAiB,EACjB,cAAc;AACd,wEAAwE;AACxE,+DAA+D;AAC/D,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAKhC,8EAA8E;AAC9E,+EAA+E;AAC/E,oBAAoB;AACpB,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AASlC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAOvE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEnF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,gFAAgF;AAChF,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG3D,+EAA+E;AAC/E,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,SAAS,EACT,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,+EAA+E;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAKrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,uBAAuB,EACvB,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ export interface MovableCluster {
3
+ /**
4
+ * True when there is a document to portal into. `false` under SSR, where
5
+ * the caller renders the cluster inline at its primary placement instead —
6
+ * a server render has no scrolling and therefore no second placement.
7
+ */
8
+ readonly portable: boolean;
9
+ /** Render the cluster ONCE, anywhere in the tree. Returns the portal. */
10
+ render(cluster: ReactNode): ReactNode;
11
+ /**
12
+ * A mount point. The highest `priority` currently on screen holds the
13
+ * cluster; when it goes, the next one down gets it back.
14
+ */
15
+ slot(priority: number, name: string): ReactElement;
16
+ }
17
+ export declare function useMovableCluster(enabled: boolean): MovableCluster;
18
+ //# sourceMappingURL=movableCluster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movableCluster.d.ts","sourceRoot":"","sources":["../../src/default/movableCluster.tsx"],"names":[],"mappings":"AAoDA,OAAO,KAAK,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMpE,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,yEAAyE;IACzE,MAAM,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC;IACtC;;;OAGG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;CACpD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CA8DlE"}
@@ -0,0 +1,110 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * ONE CLUSTER, TWO PLACES ON THE PAGE — the same instance, moved.
4
+ *
5
+ * ── The ask this answers, and why the obvious shape does not ──────────────
6
+ *
7
+ * A listing page wants the reader's two verbs beside the title AND in the
8
+ * condensed bar that arrives when the title scrolls away (reference §24). A
9
+ * host cannot do that today: `<ListingDetailPane>` mounts its cluster at
10
+ * exactly one `actionsPlacement`, so a container that wants the second one
11
+ * mounts a `<ListingActions>` of its own — which is a SECOND
12
+ * `useFavoriteToggle` on one page, two hearts that agree only after a refetch,
13
+ * and two copies of a control whose geometry this pair exists to rule once.
14
+ *
15
+ * The shapes that do NOT close it, stated because each looks like it would:
16
+ *
17
+ * a render prop handed the cluster ELEMENT
18
+ * A React element is a description, not an instance. Rendered in two
19
+ * places it mounts twice — exactly the defect, now with the pair's name
20
+ * on it.
21
+ *
22
+ * the host moving one element between two parents
23
+ * React unmounts and remounts across a parent change: the hook state
24
+ * goes, the DOM node is a different node, and an optimistic favourite
25
+ * in flight is lost mid-write.
26
+ *
27
+ * two mounts kept in step by lifting the state
28
+ * Two controls, one state — and then the page has two `aria-pressed`
29
+ * hearts, two focus targets and two things for a probe to count.
30
+ *
31
+ * ── What this does ────────────────────────────────────────────────────────
32
+ *
33
+ * The cluster is rendered ONCE, through a portal, into a `<div>` this hook
34
+ * owns. The page draws SLOTS — empty `display: contents` divs — wherever the
35
+ * cluster may sit, and the container element is `appendChild`-ed into whichever
36
+ * slot is currently on screen with the highest priority. Moving a DOM node
37
+ * between parents is not a React tree change, so:
38
+ *
39
+ * - `<ListingActions>` (and everything under it) mounts exactly once;
40
+ * - the favourite button is literally the SAME `HTMLElement` in both
41
+ * placements — `test/detailActionsPlacements.test.tsx` holds the node
42
+ * across the move and asserts identity, which is the only assertion that
43
+ * can tell this apart from a well-behaved remount;
44
+ * - a slot that unmounts hands the cluster back to the next one down,
45
+ * rather than taking it off the page.
46
+ *
47
+ * `display: contents` on both the slot and the container is load-bearing: the
48
+ * cluster must remain a direct flex item of the heading row (it is laid out by
49
+ * `justify="space-between"`) and must stay absolutely positionable against the
50
+ * gallery's containing block in the overlay arm. A wrapper that generated a
51
+ * box would change both.
52
+ */
53
+ import { useCallback, useEffect, useRef } from "react";
54
+ import { createPortal } from "react-dom";
55
+ /** Neither slot nor container may generate a box — see the file header. */
56
+ const CONTENTS = { display: "contents" };
57
+ export function useMovableCluster(enabled) {
58
+ const container = useRef(null);
59
+ if (enabled && container.current === null && typeof document !== "undefined") {
60
+ const host = document.createElement("div");
61
+ host.style.display = "contents";
62
+ host.setAttribute("data-listings-cluster-portal", "");
63
+ container.current = host;
64
+ }
65
+ const slots = useRef(new Map());
66
+ const refs = useRef(new Map());
67
+ /** Put the container in the highest-priority slot that is on the page. */
68
+ const settle = useCallback(() => {
69
+ const host = container.current;
70
+ if (host === null)
71
+ return;
72
+ let best;
73
+ let bestPriority = -1;
74
+ for (const [priority, node] of slots.current) {
75
+ // `isConnected` matters during a commit that removes a slot: React may
76
+ // hand back a node it is about to drop, and appending into it would take
77
+ // the cluster off the page with it.
78
+ if (node.isConnected && priority > bestPriority) {
79
+ bestPriority = priority;
80
+ best = node;
81
+ }
82
+ }
83
+ if (best !== undefined && host.parentNode !== best)
84
+ best.appendChild(host);
85
+ }, []);
86
+ // The belt. A slot's ref cleanup is what normally moves the cluster, but a
87
+ // subtree removed around it would leave the container detached with nothing
88
+ // to notice; this runs after every commit and repairs that in one comparison.
89
+ useEffect(settle);
90
+ const refFor = useCallback((priority) => {
91
+ let ref = refs.current.get(priority);
92
+ if (ref === undefined) {
93
+ ref = (node) => {
94
+ if (node === null)
95
+ slots.current.delete(priority);
96
+ else
97
+ slots.current.set(priority, node);
98
+ settle();
99
+ };
100
+ refs.current.set(priority, ref);
101
+ }
102
+ return ref;
103
+ }, [settle]);
104
+ return {
105
+ portable: container.current !== null,
106
+ render: (cluster) => container.current === null ? null : createPortal(cluster, container.current),
107
+ slot: (priority, name) => (_jsx("div", { ref: refFor(priority), style: CONTENTS, "data-listings-cluster-slot": name })),
108
+ };
109
+ }
110
+ //# sourceMappingURL=movableCluster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movableCluster.js","sourceRoot":"","sources":["../../src/default/movableCluster.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** Say one short sentence. Resolved copy — this is the skin, not a bag. */
2
+ export type Notice = (text: string) => void;
3
+ /**
4
+ * How long a confirmation stands, in seconds.
5
+ *
6
+ * Two, not antd's default three. Every notice this package raises confirms
7
+ * something the person can already SEE — a filled heart, a sentence standing
8
+ * in the open share menu — so it is an acknowledgement, not information, and
9
+ * an acknowledgement that outstays the gesture is a strip of chrome sitting
10
+ * over the page a thumb was about to press next.
11
+ */
12
+ export declare const NOTICE_SECONDS = 2;
13
+ export declare function useNotice(): Notice;
14
+ //# sourceMappingURL=notice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notice.d.ts","sourceRoot":"","sources":["../../src/default/notice.ts"],"names":[],"mappings":"AAoCA,2EAA2E;AAC3E,MAAM,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAE5C;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,wBAAgB,SAAS,IAAI,MAAM,CAiBlC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * A one-line confirmation, spoken once — the message seam this skin uses and
3
+ * the reason it is not a new dependency.
4
+ *
5
+ * ── There is no fleet-wide toast primitive, and this does not invent one ──
6
+ *
7
+ * `@stapel/tokens-antd/skin` carries `ErrorAlert`, `EmptyState`,
8
+ * `GatedControl`, `SkinDialog` and `SkinConfirm` — every way a pair states a
9
+ * REFUSAL or asks a question — and nothing at all for "that worked". So the
10
+ * seam here is antd's own, which this package already renders through:
11
+ *
12
+ * 1. `App.useApp().message` when the host mounts antd's `<App>`, which is
13
+ * the arrangement antd itself asks for — the notice then inherits the
14
+ * host's `ConfigProvider` theme, its locale and its container;
15
+ * 2. antd's STATIC `message` otherwise, so a host that never mounted `<App>`
16
+ * still gets the confirmation instead of silence.
17
+ *
18
+ * Outside an `<App>`, `App.useApp()` returns `{message: {}, …}` — antd's own
19
+ * default context — which is why the arm is chosen by asking whether the
20
+ * function is there rather than by asking whether a provider is. A version
21
+ * that assumed the context would have been a confirmation that worked in
22
+ * every test and on no deployment.
23
+ *
24
+ * ── And a toast is never the ONLY copy of a confirmation ──────────────────
25
+ *
26
+ * A toast is transient by construction: it appears for three seconds
27
+ * somewhere the person may not be looking, and on a phone it can land under a
28
+ * thumb. So every caller here also paints the same sentence where the gesture
29
+ * happened — `<ShareAction>` states "Link copied" inside the open menu, and
30
+ * the heart's state is on the heart. This is the AMPLIFIER, never the record.
31
+ * A future `SkinNotice` in the substrate replaces the body of this function
32
+ * and nothing else; the callers already speak in resolved sentences.
33
+ */
34
+ import { useCallback } from "react";
35
+ import { App, message as staticMessage } from "antd";
36
+ /**
37
+ * How long a confirmation stands, in seconds.
38
+ *
39
+ * Two, not antd's default three. Every notice this package raises confirms
40
+ * something the person can already SEE — a filled heart, a sentence standing
41
+ * in the open share menu — so it is an acknowledgement, not information, and
42
+ * an acknowledgement that outstays the gesture is a strip of chrome sitting
43
+ * over the page a thumb was about to press next.
44
+ */
45
+ export const NOTICE_SECONDS = 2;
46
+ export function useNotice() {
47
+ const app = App.useApp();
48
+ const contextual = app.message.success;
49
+ return useCallback((text) => {
50
+ if (typeof contextual === "function") {
51
+ contextual(text, NOTICE_SECONDS);
52
+ return;
53
+ }
54
+ // No `<App>` above us. antd's static entry renders its own holder into
55
+ // the document, which is exactly right for a host that never opted in,
56
+ // and is a no-op on a server where there is no document to render into.
57
+ if (typeof document === "undefined")
58
+ return;
59
+ staticMessage.success(text, NOTICE_SECONDS);
60
+ }, [contextual]);
61
+ }
62
+ //# sourceMappingURL=notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notice.js","sourceRoot":"","sources":["../../src/default/notice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAKrD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;IACzB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;IACvC,OAAO,WAAW,CAChB,CAAC,IAAY,EAAQ,EAAE;QACrB,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;YACrC,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,OAAO;QAC5C,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC9C,CAAC,EACD,CAAC,UAAU,CAAC,CACb,CAAC;AACJ,CAAC"}
@@ -14,44 +14,86 @@ import type { MyListingsAddress } from "../model/tabAddress.js";
14
14
  * keeps the argument and the seam that came out of it.
15
15
  *
16
16
  * TWO reads, not one, and the second one is the point of this file's shape:
17
- * the three tabs are the SERVER's status groupings, and `blocked` — a
17
+ * the three counted tabs are the SERVER's status groupings, and `blocked` — a
18
18
  * moderation takedown — is in none of them, because `my/counters` counts it
19
19
  * in none of them. A dashboard that only ever asked for a tab's statuses
20
20
  * would hide exactly the listing whose owner most needs to know. So
21
21
  * `blockedRows` is fetched beside them, off the same route, narrowed to
22
22
  * whatever `MY_LISTINGS_UNTABBED_STATUSES` derives.
23
+ *
24
+ * That second read used to be the fourth tab's COUNT as well (D407):
25
+ * `my/counters` had three integers and no fourth, so the removed tab was
26
+ * counted from the rows it holds — honest, because that read is unpaged and
27
+ * runs whichever tab is open, and blind to exactly one thing: a page cap. A
28
+ * seller with more takedowns than one page of `my/listings` saw the page count
29
+ * and not the total, and there was no counter on the wire to check it against.
30
+ *
31
+ * **stapel-listings 0.22.4 answers it**: `MyCountersResponse.blocked`, required
32
+ * beside the other three, over the same owner scope and the same grouping. So
33
+ * the tab's number is the SERVER's now and the unpaged read is what it always
34
+ * was underneath — the removed tab's ROWS. The two consequences are both
35
+ * visible: the tab appears from the counter (a beat earlier, and without the
36
+ * seller's whole takedown page having to land first), and a seller with more
37
+ * takedowns than fit on a page is told how many there are rather than how many
38
+ * arrived. A deployment on a server older than 0.22.4 sends no `blocked` at
39
+ * all, and then the rows are the count again — degraded to the previous
40
+ * answer, never to a `0` (see `MyListingsBag.tabCounts`).
23
41
  */
24
42
  export interface MyListingsBag {
25
43
  readonly tab: MyListingsTab;
44
+ /**
45
+ * The tabs to DRAW, in order.
46
+ *
47
+ * The server's three always; the removed one only where there is something
48
+ * in it or the person asked for it by address. An empty "Taken down" tab is
49
+ * a scare, and the seller it would scare is the one it has nothing to tell.
50
+ *
51
+ * "Something in it" is `counters.blocked` (stapel-listings 0.22.4) and no
52
+ * longer the unpaged takedown page: the two reads settle independently, and
53
+ * the one that decides whether a tab strip has three tabs or four should be
54
+ * the one that answers in three integers rather than the one that answers in
55
+ * a page of listings.
56
+ */
26
57
  readonly tabs: readonly MyListingsTab[];
27
58
  setTab(tab: MyListingsTab): void;
28
- /** The three real counts, as the server reports them. */
59
+ /** The four real counts, as the server reports them. */
29
60
  readonly counters: LoadState<MyCounters>;
30
61
  /**
31
62
  * The number to DRAW on each tab — the server's counter, raised to what is
32
- * actually on screen.
63
+ * actually on screen, plus the fourth tab's own.
33
64
  *
34
- * D407: a moderator-rejected listing was on the Drafts tab under a badge
35
- * reading `0`. The two sets are grouped in two places — `my/counters`
36
- * aggregates server-side, `MY_LISTINGS_TAB_STATUSES` decides which statuses
37
- * a tab ASKS for — and any disagreement between them (a deployment running
38
- * an older counter, a status added upstream, a grouping changed on one side)
39
- * lands as a badge contradicting the rows underneath it.
65
+ * D407, twice over. The first half: a moderator-rejected listing was on the
66
+ * Drafts tab under a badge reading `0`. The two sets are grouped in two
67
+ * places — `my/counters` aggregates server-side, `MY_LISTINGS_TAB_STATUSES`
68
+ * decides which statuses a tab ASKS for — and any disagreement between them
69
+ * (a deployment running an older counter, a status added upstream, a
70
+ * grouping changed on one side) lands as a badge contradicting the rows
71
+ * underneath it. A count smaller than what a person can see is not a count,
72
+ * so the loaded rows are treated as evidence: for the OPEN tab the number is
73
+ * never below `rows.length`. It is a floor and not a replacement — the rows
74
+ * are one keyset page and the counter is the whole set, so the counter still
75
+ * wins whenever it is the larger of the two.
40
76
  *
41
- * A count smaller than what a person can see is not a count, so the loaded
42
- * rows are treated as evidence: for the OPEN tab the number is never below
43
- * `rows.length`. It is a floor and not a replacement — the rows are one
44
- * keyset page and the counter is the whole set, so the counter still wins
45
- * whenever it is the larger of the two.
77
+ * The second half: a takedown was in no tab and therefore in no number, so
78
+ * a cabinet holding one read "Active 0 · Drafts 0 · Archived 0" over it.
79
+ * `removed` was counted from `blockedRows`, because there was no server
80
+ * counter to read and the rows were the only evidence on the wire. There is
81
+ * one now `MyCountersResponse.blocked`, stapel-listings 0.22.4 and it is
82
+ * what the fourth tab draws, under the same floor as the other three: the
83
+ * open tab's number is never below the rows on screen. `blockedRows` stays
84
+ * the FALLBACK for a deployment whose server predates the field, which is a
85
+ * count that is right up to a page and never a `0` over a visible row.
46
86
  */
47
87
  readonly tabCounts: LoadState<Readonly<Record<MyListingsTab, number>>>;
48
- /** The rows for the current tab. */
88
+ /** The rows for the current tab — {@link MyListingsBag.blockedRows} while
89
+ * the removed tab is open, and the tab's own keyset page otherwise. */
49
90
  readonly rows: LoadState<readonly MyListingCard[]>;
50
91
  /**
51
- * The rows no tab folds in — a moderation takedown, today. Empty for
52
- * almost every seller; when it is not, it is the most important thing on
53
- * the screen. Never `failed` in a way that hides the tabs: this read is
54
- * independent of `rows` and a skin renders it beside them.
92
+ * The rows the server's own counter folds into no tab — a moderation
93
+ * takedown, today; the removed tab's whole contents and its count. Empty
94
+ * for almost every seller; when it is not, it is the most important thing
95
+ * on the screen. Never `failed` in a way that hides the tabs: this read is
96
+ * independent of the tab's own and a skin renders it beside them.
55
97
  */
56
98
  readonly blockedRows: LoadState<readonly MyListingCard[]>;
57
99
  readonly page: MyListingsParams;
@@ -1 +1 @@
1
- {"version":3,"file":"MyListings.d.ts","sourceRoot":"","sources":["../../src/headless/MyListings.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,UAAU,EACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAK/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAIhE;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACzC;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACvE,oCAAoC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IACnD;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,IAAI,IAAI,CAAC;IACf,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC;oFACgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED,wBAAgB,aAAa,CAC3B,OAAO,GAAE,oBAAyB,GACjC,aAAa,CA4Hf;AAED,oDAAoD;AACpD,wBAAgB,UAAU,CACxB,KAAK,EAAE,oBAAoB,GAAG;IAC5B,QAAQ,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,SAAS,CAAC;CAC7C,GACA,YAAY,CAGd"}
1
+ {"version":3,"file":"MyListings.d.ts","sourceRoot":"","sources":["../../src/headless/MyListings.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,UAAU,EACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAU/D,OAAO,KAAK,EAAwB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAIhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAC5B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACzC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACvE;2EACuE;IACvE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IACnD;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,IAAI,IAAI,CAAC;IACf,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC;oFACgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED,wBAAgB,aAAa,CAC3B,OAAO,GAAE,oBAAyB,GACjC,aAAa,CAwKf;AAED,oDAAoD;AACpD,wBAAgB,UAAU,CACxB,KAAK,EAAE,oBAAoB,GAAG;IAC5B,QAAQ,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,SAAS,CAAC;CAC7C,GACA,YAAY,CAGd"}
@@ -6,7 +6,7 @@ import { defaultMyListingsSource } from "../model/mineSource.js";
6
6
  import { useListingsApi } from "../model/context.js";
7
7
  import { useMyCounters } from "../model/queries.js";
8
8
  import { listingsQueryKeys, pageKey } from "../model/queryKeys.js";
9
- import { MY_LISTINGS_TABS, MY_LISTINGS_UNTABBED_STATUSES } from "../model/status.js";
9
+ import { MY_LISTINGS_COUNTED_TABS, MY_LISTINGS_REMOVED_TAB, MY_LISTINGS_TABS, MY_LISTINGS_UNTABBED_STATUSES, } from "../model/status.js";
10
10
  import { browserAddress, tabFromSearch } from "../model/tabAddress.js";
11
11
  import { LISTINGS_I18N_KEYS } from "../i18n/keys.js";
12
12
  import { useMandateGate } from "./useMandateGate.js";
@@ -25,10 +25,17 @@ export function useMyListings(options = {}) {
25
25
  const injected = options.source;
26
26
  const source = useMemo(() => injected ?? defaultMyListingsSource(api), [injected, api]);
27
27
  const ready = sessionReady && gate.available;
28
+ // The fourth tab is served by `blockedQuery` below, not by the host's
29
+ // source: `MyListingsSource` is typed for the three counted tabs and a host
30
+ // that implemented it before D407 has no answer for a fourth.
31
+ const removed = tab === MY_LISTINGS_REMOVED_TAB;
32
+ const countedTab = removed
33
+ ? MY_LISTINGS_COUNTED_TABS[0]
34
+ : tab;
28
35
  const rowsQuery = useQuery({
29
- queryKey: listingsQueryKeys.mine(tab, pageKey(page)),
30
- queryFn: ({ signal }) => source({ tab, page, signal }),
31
- enabled: ready,
36
+ queryKey: listingsQueryKeys.mine(countedTab, pageKey(page)),
37
+ queryFn: ({ signal }) => source({ tab: countedTab, page, signal }),
38
+ enabled: ready && !removed,
32
39
  retry: false,
33
40
  });
34
41
  // The takedowns, off the same route and deliberately NOT paged: a seller
@@ -40,13 +47,6 @@ export function useMyListings(options = {}) {
40
47
  enabled: ready && MY_LISTINGS_UNTABBED_STATUSES.length > 0,
41
48
  retry: false,
42
49
  });
43
- const rows = useMemo(() => {
44
- if (rowsQuery.status === "error")
45
- return loadFailed(rowsQuery.error);
46
- if (rowsQuery.data !== undefined)
47
- return loadReady(rowsQuery.data.items);
48
- return loadLoading();
49
- }, [rowsQuery.status, rowsQuery.error, rowsQuery.data]);
50
50
  const blockedRows = useMemo(() => {
51
51
  if (MY_LISTINGS_UNTABBED_STATUSES.length === 0)
52
52
  return loadReady([]);
@@ -56,8 +56,31 @@ export function useMyListings(options = {}) {
56
56
  return loadReady(blockedQuery.data.items);
57
57
  return loadLoading();
58
58
  }, [blockedQuery.status, blockedQuery.error, blockedQuery.data]);
59
- const envelope = rowsQuery.data;
60
- // D407, the floor: never a number smaller than the rows on screen. See
59
+ const tabRows = useMemo(() => {
60
+ if (rowsQuery.status === "error")
61
+ return loadFailed(rowsQuery.error);
62
+ if (rowsQuery.data !== undefined)
63
+ return loadReady(rowsQuery.data.items);
64
+ return loadLoading();
65
+ }, [rowsQuery.status, rowsQuery.error, rowsQuery.data]);
66
+ const rows = removed ? blockedRows : tabRows;
67
+ // The takedown count, when it is known. Not a `0` while the read is in
68
+ // flight: the tab strip is drawn off this number and a tab that appeared a
69
+ // beat after the page settled would move the three beside it.
70
+ //
71
+ // The SERVER's integer first (stapel-listings 0.22.4), the unpaged page's
72
+ // length only where a deployment's backend predates it. `counters.data` is
73
+ // typed with `blocked` required, so the runtime check is the honest one and
74
+ // not a type-driven one: an older server answers 200 with three keys, and a
75
+ // `?? 0` there would print "Taken down 0" over a row the seller can see.
76
+ const rowsBlockedCount = blockedRows.status === "ready" ? blockedRows.data.length : undefined;
77
+ const serverBlockedCount = typeof counters.data?.blocked === "number" ? counters.data.blocked : undefined;
78
+ const blockedCount = serverBlockedCount ?? rowsBlockedCount;
79
+ // Paging belongs to the tab's own keyset read. The takedowns are fetched
80
+ // unpaged on purpose, so the removed tab has nowhere to go and says so.
81
+ const envelope = removed ? undefined : rowsQuery.data;
82
+ // D407, the floor: never a number smaller than the rows on screen — and a
83
+ // number for the fourth tab, which the server counts nowhere. See
61
84
  // `MyListingsBag.tabCounts`.
62
85
  const tabCounts = useMemo(() => {
63
86
  if (counters.status === "error")
@@ -66,14 +89,30 @@ export function useMyListings(options = {}) {
66
89
  return loadLoading();
67
90
  const server = counters.data;
68
91
  const visible = rows.status === "ready" ? rows.data.length : 0;
69
- return loadReady(Object.fromEntries(MY_LISTINGS_TABS.map((one) => [
70
- one,
71
- one === tab ? Math.max(server[one], visible) : server[one],
72
- ])));
73
- }, [counters.status, counters.error, counters.data, rows, tab]);
92
+ return loadReady({
93
+ ...Object.fromEntries(MY_LISTINGS_COUNTED_TABS.map((one) => [
94
+ one,
95
+ one === tab ? Math.max(server[one], visible) : server[one],
96
+ ])),
97
+ // The fourth tab takes the same floor as the other three: the server's
98
+ // number, raised to what is on screen while this tab is the open one.
99
+ // The counter and the unpaged page are two reads of one set and either
100
+ // may be the staler — a badge under its own rows is not a count.
101
+ [MY_LISTINGS_REMOVED_TAB]: tab === MY_LISTINGS_REMOVED_TAB
102
+ ? Math.max(blockedCount ?? 0, visible)
103
+ : (blockedCount ?? 0),
104
+ });
105
+ }, [counters.status, counters.error, counters.data, rows, tab, blockedCount]);
106
+ // The removed tab is drawn where it has something to say — or where the
107
+ // address named it, so `?tab=removed` opens a real (if empty) tab rather
108
+ // than an activeKey pointing at nothing.
109
+ //
110
+ // "Something to say" is the COUNTER since 0.22.4, so the tab arrives with
111
+ // `my/counters` rather than waiting for a page of takedowns to come back.
112
+ const tabs = removed || (blockedCount ?? 0) > 0 ? MY_LISTINGS_TABS : MY_LISTINGS_COUNTED_TABS;
74
113
  return {
75
114
  tab,
76
- tabs: MY_LISTINGS_TABS,
115
+ tabs,
77
116
  setTab: (next) => {
78
117
  // A cursor belongs to ONE ordered candidate set. Carried across a tab
79
118
  // change it either bounces or honestly returns page four of a
@@ -1 +1 @@
1
- {"version":3,"file":"MyListings.js","sourceRoot":"","sources":["../../src/headless/MyListings.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MyListings.js","sourceRoot":"","sources":["../../src/headless/MyListings.tsx"],"names":[],"mappings":"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"}