@stapel/listings-react 0.4.0 → 0.8.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 (133) hide show
  1. package/CHANGELOG.md +180 -0
  2. package/dist/api/generated/schema.d.ts +94 -4
  3. package/dist/api/generated/schema.d.ts.map +1 -1
  4. package/dist/default/FavoritesPane.d.ts +40 -3
  5. package/dist/default/FavoritesPane.d.ts.map +1 -1
  6. package/dist/default/FavoritesPane.js +30 -18
  7. package/dist/default/FavoritesPane.js.map +1 -1
  8. package/dist/default/ListingCard.d.ts +81 -4
  9. package/dist/default/ListingCard.d.ts.map +1 -1
  10. package/dist/default/ListingCard.js +97 -27
  11. package/dist/default/ListingCard.js.map +1 -1
  12. package/dist/default/ListingComposerPage.d.ts +163 -23
  13. package/dist/default/ListingComposerPage.d.ts.map +1 -1
  14. package/dist/default/ListingComposerPage.js +85 -43
  15. package/dist/default/ListingComposerPage.js.map +1 -1
  16. package/dist/default/ListingDetailPane.d.ts +41 -4
  17. package/dist/default/ListingDetailPane.d.ts.map +1 -1
  18. package/dist/default/ListingDetailPane.js +38 -25
  19. package/dist/default/ListingDetailPane.js.map +1 -1
  20. package/dist/default/ListingPhoto.d.ts +13 -1
  21. package/dist/default/ListingPhoto.d.ts.map +1 -1
  22. package/dist/default/ListingPhoto.js +47 -9
  23. package/dist/default/ListingPhoto.js.map +1 -1
  24. package/dist/default/ListingPrice.d.ts +13 -0
  25. package/dist/default/ListingPrice.d.ts.map +1 -0
  26. package/dist/default/ListingPrice.js +60 -0
  27. package/dist/default/ListingPrice.js.map +1 -0
  28. package/dist/default/MyListingsPane.d.ts +7 -28
  29. package/dist/default/MyListingsPane.d.ts.map +1 -1
  30. package/dist/default/MyListingsPane.js +136 -67
  31. package/dist/default/MyListingsPane.js.map +1 -1
  32. package/dist/default/SignInLink.js +8 -7
  33. package/dist/default/SignInLink.js.map +1 -1
  34. package/dist/default/StatusTags.d.ts +16 -5
  35. package/dist/default/StatusTags.d.ts.map +1 -1
  36. package/dist/default/StatusTags.js +19 -13
  37. package/dist/default/StatusTags.js.map +1 -1
  38. package/dist/default/index.d.ts +15 -9
  39. package/dist/default/index.d.ts.map +1 -1
  40. package/dist/default/index.js +13 -6
  41. package/dist/default/index.js.map +1 -1
  42. package/dist/headless/Favorites.d.ts +6 -0
  43. package/dist/headless/Favorites.d.ts.map +1 -1
  44. package/dist/headless/Favorites.js +23 -7
  45. package/dist/headless/Favorites.js.map +1 -1
  46. package/dist/headless/ListingActions.d.ts +12 -0
  47. package/dist/headless/ListingActions.d.ts.map +1 -1
  48. package/dist/headless/ListingActions.js +3 -0
  49. package/dist/headless/ListingActions.js.map +1 -1
  50. package/dist/headless/ListingComposer.d.ts +23 -0
  51. package/dist/headless/ListingComposer.d.ts.map +1 -1
  52. package/dist/headless/ListingComposer.js +33 -7
  53. package/dist/headless/ListingComposer.js.map +1 -1
  54. package/dist/headless/ListingDetail.d.ts.map +1 -1
  55. package/dist/headless/ListingDetail.js +7 -5
  56. package/dist/headless/ListingDetail.js.map +1 -1
  57. package/dist/headless/useMandateGate.d.ts +33 -2
  58. package/dist/headless/useMandateGate.d.ts.map +1 -1
  59. package/dist/headless/useMandateGate.js +42 -4
  60. package/dist/headless/useMandateGate.js.map +1 -1
  61. package/dist/i18n/es.d.ts +6 -1
  62. package/dist/i18n/es.d.ts.map +1 -1
  63. package/dist/i18n/es.js +23 -5
  64. package/dist/i18n/es.js.map +1 -1
  65. package/dist/i18n/generated/errors.es.gen.d.ts +1 -1
  66. package/dist/i18n/generated/errors.es.gen.js +1 -1
  67. package/dist/i18n/generated/errors.gen.d.ts +6 -0
  68. package/dist/i18n/generated/errors.gen.d.ts.map +1 -1
  69. package/dist/i18n/generated/errors.gen.js +3 -0
  70. package/dist/i18n/generated/errors.gen.js.map +1 -1
  71. package/dist/i18n/generated/errors.ru.gen.d.ts +1 -1
  72. package/dist/i18n/generated/errors.ru.gen.js +1 -1
  73. package/dist/i18n/keys.d.ts +30 -3
  74. package/dist/i18n/keys.d.ts.map +1 -1
  75. package/dist/i18n/keys.js +47 -7
  76. package/dist/i18n/keys.js.map +1 -1
  77. package/dist/i18n/ru.d.ts +16 -1
  78. package/dist/i18n/ru.d.ts.map +1 -1
  79. package/dist/i18n/ru.js +35 -5
  80. package/dist/i18n/ru.js.map +1 -1
  81. package/dist/index.d.ts +1 -1
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +1 -1
  84. package/dist/index.js.map +1 -1
  85. package/dist/model/draft.d.ts +9 -6
  86. package/dist/model/draft.d.ts.map +1 -1
  87. package/dist/model/draft.js +3 -1
  88. package/dist/model/draft.js.map +1 -1
  89. package/dist/model/features.d.ts +21 -7
  90. package/dist/model/features.d.ts.map +1 -1
  91. package/dist/model/features.js +26 -0
  92. package/dist/model/features.js.map +1 -1
  93. package/llms.txt +9 -8
  94. package/manifest.json +82 -31
  95. package/nav-manifest.json +1 -1
  96. package/package.json +19 -14
  97. package/src/analytics/generated/events.json +1 -1
  98. package/src/api/generated/schema.ts +94 -4
  99. package/src/default/FavoritesPane.tsx +156 -82
  100. package/src/default/ListingCard.tsx +283 -116
  101. package/src/default/ListingComposerPage.tsx +403 -187
  102. package/src/default/ListingDetailPane.tsx +200 -98
  103. package/src/default/ListingPhoto.tsx +89 -16
  104. package/src/default/ListingPrice.tsx +77 -0
  105. package/src/default/MyListingsPane.tsx +286 -228
  106. package/src/default/SignInLink.tsx +4 -4
  107. package/src/default/StatusTags.tsx +36 -18
  108. package/src/default/index.ts +18 -7
  109. package/src/headless/Favorites.tsx +36 -7
  110. package/src/headless/ListingActions.tsx +19 -0
  111. package/src/headless/ListingComposer.tsx +56 -5
  112. package/src/headless/ListingDetail.tsx +12 -5
  113. package/src/headless/useMandateGate.ts +49 -5
  114. package/src/i18n/es.ts +29 -5
  115. package/src/i18n/generated/errors.es.gen.ts +1 -1
  116. package/src/i18n/generated/errors.gen.ts +3 -0
  117. package/src/i18n/generated/errors.json +7 -0
  118. package/src/i18n/generated/errors.ru.gen.ts +1 -1
  119. package/src/i18n/keys.ts +54 -7
  120. package/src/i18n/ru.ts +41 -5
  121. package/src/index.ts +5 -1
  122. package/src/model/draft.ts +12 -7
  123. package/src/model/features.ts +48 -7
  124. package/dist/default/ErrorAlert.d.ts +0 -9
  125. package/dist/default/ErrorAlert.d.ts.map +0 -1
  126. package/dist/default/ErrorAlert.js +0 -27
  127. package/dist/default/ErrorAlert.js.map +0 -1
  128. package/dist/default/theme.d.ts +0 -25
  129. package/dist/default/theme.d.ts.map +0 -1
  130. package/dist/default/theme.js +0 -40
  131. package/dist/default/theme.js.map +0 -1
  132. package/src/default/ErrorAlert.tsx +0 -46
  133. package/src/default/theme.tsx +0 -67
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.4.0",
4
+ "version": "0.8.0",
5
5
  "backend": {
6
6
  "module": "stapel-listings",
7
- "contract": ">=0.7 <0.8"
7
+ "contract": ">=0.9 <0.10"
8
8
  },
9
9
  "layers": [
10
10
  "api",
@@ -19,119 +19,119 @@
19
19
  "listings_api_v1_listings_archive_create": {
20
20
  "method": "POST",
21
21
  "path": "/listings/api/v1/listings/{id}/archive/",
22
- "tag": "Listings",
22
+ "tag": "listings",
23
23
  "request": null,
24
24
  "response": "ListingActionResponse"
25
25
  },
26
26
  "listings_api_v1_listings_complete_create": {
27
27
  "method": "POST",
28
28
  "path": "/listings/api/v1/listings/{id}/complete/",
29
- "tag": "Listings",
29
+ "tag": "listings",
30
30
  "request": null,
31
31
  "response": "ListingActionResponse"
32
32
  },
33
33
  "listings_api_v1_listings_create": {
34
34
  "method": "POST",
35
35
  "path": "/listings/api/v1/listings/",
36
- "tag": "Listings",
36
+ "tag": "listings",
37
37
  "request": "ListingDraft",
38
38
  "response": "ListingDraft"
39
39
  },
40
40
  "listings_api_v1_listings_destroy": {
41
41
  "method": "DELETE",
42
42
  "path": "/listings/api/v1/listings/{id}/",
43
- "tag": "Listings",
43
+ "tag": "listings",
44
44
  "request": null,
45
45
  "response": "DeleteResponse"
46
46
  },
47
47
  "listings_api_v1_listings_favorite_create": {
48
48
  "method": "POST",
49
49
  "path": "/listings/api/v1/listings/{id}/favorite/",
50
- "tag": "Listings",
50
+ "tag": "listings",
51
51
  "request": null,
52
52
  "response": "FavoriteToggleResponse"
53
53
  },
54
54
  "listings_api_v1_listings_list": {
55
55
  "method": "GET",
56
56
  "path": "/listings/api/v1/listings/",
57
- "tag": "Listings",
57
+ "tag": "listings",
58
58
  "request": null,
59
59
  "response": "PaginatedListingCardList"
60
60
  },
61
61
  "listings_api_v1_listings_my_counters_retrieve": {
62
62
  "method": "GET",
63
63
  "path": "/listings/api/v1/listings/my/counters/",
64
- "tag": "Listings",
64
+ "tag": "listings",
65
65
  "request": null,
66
66
  "response": "MyCountersResponse"
67
67
  },
68
68
  "listings_api_v1_listings_my_favorites_list": {
69
69
  "method": "GET",
70
70
  "path": "/listings/api/v1/listings/my/favorites/",
71
- "tag": "Listings",
71
+ "tag": "listings",
72
72
  "request": null,
73
73
  "response": "PaginatedListingCardList"
74
74
  },
75
75
  "listings_api_v1_listings_my_listings_list": {
76
76
  "method": "GET",
77
77
  "path": "/listings/api/v1/listings/my/listings/",
78
- "tag": "Listings",
78
+ "tag": "listings",
79
79
  "request": null,
80
80
  "response": "PaginatedMyListingCardList"
81
81
  },
82
82
  "listings_api_v1_listings_partial_update": {
83
83
  "method": "PATCH",
84
84
  "path": "/listings/api/v1/listings/{id}/",
85
- "tag": "Listings",
85
+ "tag": "listings",
86
86
  "request": "PatchedListingDraft",
87
87
  "response": "ListingDraft"
88
88
  },
89
89
  "listings_api_v1_listings_publish_create": {
90
90
  "method": "POST",
91
91
  "path": "/listings/api/v1/listings/{id}/publish/",
92
- "tag": "Listings",
92
+ "tag": "listings",
93
93
  "request": null,
94
94
  "response": "PublishResponse"
95
95
  },
96
96
  "listings_api_v1_listings_retrieve": {
97
97
  "method": "GET",
98
98
  "path": "/listings/api/v1/listings/{id}/",
99
- "tag": "Listings",
99
+ "tag": "listings",
100
100
  "request": null,
101
101
  "response": "ListingDetail"
102
102
  },
103
103
  "listings_api_v1_listings_save_draft_create": {
104
104
  "method": "POST",
105
105
  "path": "/listings/api/v1/listings/{id}/save-draft/",
106
- "tag": "Listings",
106
+ "tag": "listings",
107
107
  "request": null,
108
108
  "response": "ListingDraft"
109
109
  },
110
110
  "listings_api_v1_listings_status_retrieve": {
111
111
  "method": "GET",
112
112
  "path": "/listings/api/v1/listings/{id}/status/",
113
- "tag": "Listings",
113
+ "tag": "listings",
114
114
  "request": null,
115
115
  "response": "ListingStatus"
116
116
  },
117
117
  "listings_api_v1_listings_unfavorite_create": {
118
118
  "method": "POST",
119
119
  "path": "/listings/api/v1/listings/{id}/unfavorite/",
120
- "tag": "Listings",
120
+ "tag": "listings",
121
121
  "request": null,
122
122
  "response": "FavoriteToggleResponse"
123
123
  },
124
124
  "listings_api_v1_listings_update": {
125
125
  "method": "PUT",
126
126
  "path": "/listings/api/v1/listings/{id}/",
127
- "tag": "Listings",
127
+ "tag": "listings",
128
128
  "request": "ListingDraft",
129
129
  "response": "ListingDraft"
130
130
  },
131
131
  "listings_api_v1_listings_validate_draft_retrieve": {
132
132
  "method": "GET",
133
133
  "path": "/listings/api/v1/listings/{id}/validate-draft/",
134
- "tag": "Listings",
134
+ "tag": "listings",
135
135
  "request": null,
136
136
  "response": "ValidationBatchResult"
137
137
  }
@@ -507,6 +507,11 @@
507
507
  "params": [],
508
508
  "remediation": "retry"
509
509
  },
510
+ "error.403.listing_anonymous_not_allowed": {
511
+ "status": 403,
512
+ "params": [],
513
+ "remediation": "retry"
514
+ },
510
515
  "error.403.listing_not_owner": {
511
516
  "status": 403,
512
517
  "params": [],
@@ -645,7 +650,7 @@
645
650
  {
646
651
  "id": "listings.card",
647
652
  "title": "Listing card",
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, with the reason, and the container attaches the sign-in CTA.",
653
+ "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.",
649
654
  "component": "ListingCard",
650
655
  "covers": [
651
656
  "ListingsProvider"
@@ -655,14 +660,16 @@
655
660
  ],
656
661
  "variants": [
657
662
  "default",
658
- "visitor"
663
+ "saved",
664
+ "visitor",
665
+ "no-photo"
659
666
  ],
660
667
  "source": "demo/ListingCard.demo.tsx"
661
668
  },
662
669
  {
663
670
  "id": "listings.composer",
664
671
  "title": "Listing composer",
665
- "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.",
672
+ "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.",
666
673
  "component": "ListingComposerPage",
667
674
  "covers": [
668
675
  "ListingComposer"
@@ -672,6 +679,7 @@
672
679
  ],
673
680
  "variants": [
674
681
  "default",
682
+ "unwired",
675
683
  "photos-in-flight",
676
684
  "unsupported-type"
677
685
  ],
@@ -680,7 +688,7 @@
680
688
  {
681
689
  "id": "listings.detail",
682
690
  "title": "Listing detail",
683
- "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.",
691
+ "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.",
684
692
  "component": "ListingDetailPane",
685
693
  "covers": [
686
694
  "ListingDetail"
@@ -690,23 +698,27 @@
690
698
  ],
691
699
  "variants": [
692
700
  "default",
693
- "owner"
701
+ "contact-unwired",
702
+ "owner",
703
+ "not-found"
694
704
  ],
695
705
  "source": "demo/ListingDetail.demo.tsx"
696
706
  },
697
707
  {
698
708
  "id": "listings.favorites",
699
709
  "title": "Favourites",
700
- "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.",
710
+ "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.",
701
711
  "component": "FavoritesPane",
702
712
  "covers": [
703
- "Favorites"
713
+ "Favorites",
714
+ "LISTINGS_ELEVATION_ACTIONS"
704
715
  ],
705
716
  "tokens": [
706
717
  "surface-raised"
707
718
  ],
708
719
  "variants": [
709
720
  "default",
721
+ "paged",
710
722
  "empty",
711
723
  "failed",
712
724
  "visitor"
@@ -716,7 +728,7 @@
716
728
  {
717
729
  "id": "listings.mine",
718
730
  "title": "My listings",
719
- "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. Three 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 row still in draft renders off title_draft, because the published title is empty until a publish, and is marked as such; and a moderation takedown, which my/counters counts in no tab at all, sits ABOVE the tabs where it cannot be missed.",
731
+ "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.",
720
732
  "component": "MyListingsPane",
721
733
  "covers": [
722
734
  "MyListings"
@@ -726,9 +738,35 @@
726
738
  ],
727
739
  "variants": [
728
740
  "default",
729
- "taken-down"
741
+ "no-editor",
742
+ "taken-down",
743
+ "visitor",
744
+ "failed"
730
745
  ],
731
746
  "source": "demo/MyListings.demo.tsx"
747
+ },
748
+ {
749
+ "id": "listings.parts",
750
+ "title": "Listing parts",
751
+ "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.",
752
+ "component": "ListingStatusBlock",
753
+ "covers": [
754
+ "LifecycleTag",
755
+ "ModerationNote",
756
+ "ListingPhoto",
757
+ "SignInLink"
758
+ ],
759
+ "tokens": [
760
+ "surface-raised"
761
+ ],
762
+ "variants": [
763
+ "default",
764
+ "tags",
765
+ "notes",
766
+ "media",
767
+ "door"
768
+ ],
769
+ "source": "demo/ListingParts.demo.tsx"
732
770
  }
733
771
  ],
734
772
  "i18nKeys": [
@@ -771,6 +809,7 @@
771
809
  "error.401.unauthorized",
772
810
  "error.402.payment_required",
773
811
  "error.403.forbidden",
812
+ "error.403.listing_anonymous_not_allowed",
774
813
  "error.403.listing_not_owner",
775
814
  "error.403.network_blocked",
776
815
  "error.403.verification_enrollment_required",
@@ -800,18 +839,20 @@
800
839
  "listings.blocked.guest",
801
840
  "listings.blocked.in_flight",
802
841
  "listings.blocked.mandate_unknown",
842
+ "listings.blocked.no_editor",
803
843
  "listings.blocked.sign_in",
804
844
  "listings.blocked.transition",
805
845
  "listings.card.favorite_add",
806
846
  "listings.card.favorite_remove",
807
847
  "listings.card.no_photo",
808
- "listings.card.open",
809
848
  "listings.card.photo_unavailable",
810
849
  "listings.card.price_absent",
811
850
  "listings.card.sign_in",
851
+ "listings.card.untitled",
812
852
  "listings.compose.auto_republish",
813
853
  "listings.compose.blocked.busy",
814
854
  "listings.compose.blocked.details_unavailable",
855
+ "listings.compose.blocked.incomplete",
815
856
  "listings.compose.blocked.mirror",
816
857
  "listings.compose.blocked.no_category",
817
858
  "listings.compose.blocked.no_draft",
@@ -831,9 +872,8 @@
831
872
  "listings.compose.edit_title",
832
873
  "listings.compose.geo_incomplete",
833
874
  "listings.compose.invalid_summary",
834
- "listings.compose.lat_label",
875
+ "listings.compose.location_help",
835
876
  "listings.compose.location_label",
836
- "listings.compose.lon_label",
837
877
  "listings.compose.new_title",
838
878
  "listings.compose.photos",
839
879
  "listings.compose.price_invalid",
@@ -851,6 +891,7 @@
851
891
  "listings.compose.title_too_long",
852
892
  "listings.compose.too_many_images",
853
893
  "listings.detail.description",
894
+ "listings.detail.edit",
854
895
  "listings.detail.expires_at",
855
896
  "listings.detail.load_failed",
856
897
  "listings.detail.loading",
@@ -865,18 +906,25 @@
865
906
  "listings.detail.retry",
866
907
  "listings.detail.specs",
867
908
  "listings.detail.stock",
909
+ "listings.detail.take_down",
868
910
  "listings.detail.unreadable_features",
869
911
  "listings.error.unknown",
870
912
  "listings.favorites.empty",
913
+ "listings.favorites.empty_hint",
871
914
  "listings.favorites.load_failed",
872
915
  "listings.favorites.loading",
916
+ "listings.favorites.sign_in_hint",
873
917
  "listings.favorites.title",
874
918
  "listings.mine.archive",
875
919
  "listings.mine.blocked.load_failed",
876
920
  "listings.mine.blocked.title",
921
+ "listings.mine.blocked.title.one",
922
+ "listings.mine.blocked.title.other",
877
923
  "listings.mine.complete",
878
924
  "listings.mine.counters_failed",
879
925
  "listings.mine.delete",
926
+ "listings.mine.delete_confirm_body",
927
+ "listings.mine.delete_confirm_title",
880
928
  "listings.mine.edit",
881
929
  "listings.mine.empty",
882
930
  "listings.mine.empty.active",
@@ -901,6 +949,7 @@
901
949
  "listings.nav.detail",
902
950
  "listings.nav.favorites",
903
951
  "listings.nav.mine",
952
+ "listings.page.indicator",
904
953
  "listings.page.next",
905
954
  "listings.page.prev",
906
955
  "listings.status.archived",
@@ -923,6 +972,7 @@
923
972
  "EMPTY_LOCATION",
924
973
  "Favorites",
925
974
  "IMAGES_FIELD",
975
+ "LISTINGS_ELEVATION_ACTIONS",
926
976
  "LISTINGS_ERRORS",
927
977
  "LISTINGS_ERROR_CODES",
928
978
  "LISTINGS_FLOWS",
@@ -988,6 +1038,7 @@
988
1038
  "useCompleteListing",
989
1039
  "useCreateDraft",
990
1040
  "useDeleteListing",
1041
+ "useElevatableMandateGate",
991
1042
  "useFavoriteListing",
992
1043
  "useFavoriteToggle",
993
1044
  "useFavorites",
package/nav-manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@stapel/listings-react",
3
- "version": "0.4.0",
3
+ "version": "0.8.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.4.0",
3
+ "version": "0.8.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": {
@@ -48,19 +48,19 @@
48
48
  ],
49
49
  "size-limit": [
50
50
  {
51
- "name": "index — the headless pair (client + status axes + draft model + hooks): no antd",
51
+ "name": "index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 11.5 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry",
52
52
  "path": "dist/index.js",
53
- "limit": "11 KB"
53
+ "limit": "11.5 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.19.0 <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.19.0",
107
+ "@stapel/currencies-react": "^0.2.0",
108
+ "@stapel/image": "^0.4.2",
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.4.0",
4
+ "version": "0.8.0",
5
5
  "defined": [],
6
6
  "flows": []
7
7
  }