@stapel/reviews-react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/MODULE.md +151 -0
  3. package/README.md +207 -0
  4. package/dist/api/generated/schema.d.ts +360 -0
  5. package/dist/api/generated/schema.d.ts.map +1 -0
  6. package/dist/api/generated/schema.js +2 -0
  7. package/dist/api/generated/schema.js.map +1 -0
  8. package/dist/api/reviewsApi.d.ts +89 -0
  9. package/dist/api/reviewsApi.d.ts.map +1 -0
  10. package/dist/api/reviewsApi.js +51 -0
  11. package/dist/api/reviewsApi.js.map +1 -0
  12. package/dist/api/types.d.ts +127 -0
  13. package/dist/api/types.d.ts.map +1 -0
  14. package/dist/api/types.js +2 -0
  15. package/dist/api/types.js.map +1 -0
  16. package/dist/default/ErrorAlert.d.ts +9 -0
  17. package/dist/default/ErrorAlert.d.ts.map +1 -0
  18. package/dist/default/ErrorAlert.js +27 -0
  19. package/dist/default/ErrorAlert.js.map +1 -0
  20. package/dist/default/RatingBadge.d.ts +17 -0
  21. package/dist/default/RatingBadge.d.ts.map +1 -0
  22. package/dist/default/RatingBadge.js +23 -0
  23. package/dist/default/RatingBadge.js.map +1 -0
  24. package/dist/default/ReviewFormCard.d.ts +25 -0
  25. package/dist/default/ReviewFormCard.d.ts.map +1 -0
  26. package/dist/default/ReviewFormCard.js +42 -0
  27. package/dist/default/ReviewFormCard.js.map +1 -0
  28. package/dist/default/ReviewListPanel.d.ts +29 -0
  29. package/dist/default/ReviewListPanel.d.ts.map +1 -0
  30. package/dist/default/ReviewListPanel.js +47 -0
  31. package/dist/default/ReviewListPanel.js.map +1 -0
  32. package/dist/default/ReviewsPanel.d.ts +33 -0
  33. package/dist/default/ReviewsPanel.d.ts.map +1 -0
  34. package/dist/default/ReviewsPanel.js +17 -0
  35. package/dist/default/ReviewsPanel.js.map +1 -0
  36. package/dist/default/index.d.ts +31 -0
  37. package/dist/default/index.d.ts.map +1 -0
  38. package/dist/default/index.js +25 -0
  39. package/dist/default/index.js.map +1 -0
  40. package/dist/default/theme.d.ts +24 -0
  41. package/dist/default/theme.d.ts.map +1 -0
  42. package/dist/default/theme.js +39 -0
  43. package/dist/default/theme.js.map +1 -0
  44. package/dist/default/types.d.ts +12 -0
  45. package/dist/default/types.d.ts.map +1 -0
  46. package/dist/default/types.js +2 -0
  47. package/dist/default/types.js.map +1 -0
  48. package/dist/headless/ReviewAggregate.d.ts +63 -0
  49. package/dist/headless/ReviewAggregate.d.ts.map +1 -0
  50. package/dist/headless/ReviewAggregate.js +55 -0
  51. package/dist/headless/ReviewAggregate.js.map +1 -0
  52. package/dist/headless/ReviewForm.d.ts +83 -0
  53. package/dist/headless/ReviewForm.d.ts.map +1 -0
  54. package/dist/headless/ReviewForm.js +75 -0
  55. package/dist/headless/ReviewForm.js.map +1 -0
  56. package/dist/headless/ReviewList.d.ts +47 -0
  57. package/dist/headless/ReviewList.d.ts.map +1 -0
  58. package/dist/headless/ReviewList.js +51 -0
  59. package/dist/headless/ReviewList.js.map +1 -0
  60. package/dist/headless/ReviewsProvider.d.ts +19 -0
  61. package/dist/headless/ReviewsProvider.d.ts.map +1 -0
  62. package/dist/headless/ReviewsProvider.js +15 -0
  63. package/dist/headless/ReviewsProvider.js.map +1 -0
  64. package/dist/i18n/errorsMap.d.ts +12 -0
  65. package/dist/i18n/errorsMap.d.ts.map +1 -0
  66. package/dist/i18n/errorsMap.js +22 -0
  67. package/dist/i18n/errorsMap.js.map +1 -0
  68. package/dist/i18n/es.d.ts +19 -0
  69. package/dist/i18n/es.d.ts.map +1 -0
  70. package/dist/i18n/es.js +66 -0
  71. package/dist/i18n/es.js.map +1 -0
  72. package/dist/i18n/generated/errors.es.gen.d.ts +16 -0
  73. package/dist/i18n/generated/errors.es.gen.d.ts.map +1 -0
  74. package/dist/i18n/generated/errors.es.gen.js +58 -0
  75. package/dist/i18n/generated/errors.es.gen.js.map +1 -0
  76. package/dist/i18n/generated/errors.gen.d.ts +341 -0
  77. package/dist/i18n/generated/errors.gen.d.ts.map +1 -0
  78. package/dist/i18n/generated/errors.gen.js +174 -0
  79. package/dist/i18n/generated/errors.gen.js.map +1 -0
  80. package/dist/i18n/generated/errors.ru.gen.d.ts +16 -0
  81. package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -0
  82. package/dist/i18n/generated/errors.ru.gen.js +58 -0
  83. package/dist/i18n/generated/errors.ru.gen.js.map +1 -0
  84. package/dist/i18n/keys.d.ts +59 -0
  85. package/dist/i18n/keys.d.ts.map +1 -0
  86. package/dist/i18n/keys.js +115 -0
  87. package/dist/i18n/keys.js.map +1 -0
  88. package/dist/i18n/ru.d.ts +22 -0
  89. package/dist/i18n/ru.d.ts.map +1 -0
  90. package/dist/i18n/ru.js +70 -0
  91. package/dist/i18n/ru.js.map +1 -0
  92. package/dist/index.d.ts +98 -0
  93. package/dist/index.d.ts.map +1 -0
  94. package/dist/index.js +92 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/model/context.d.ts +11 -0
  97. package/dist/model/context.d.ts.map +1 -0
  98. package/dist/model/context.js +16 -0
  99. package/dist/model/context.js.map +1 -0
  100. package/dist/model/list.d.ts +52 -0
  101. package/dist/model/list.d.ts.map +1 -0
  102. package/dist/model/list.js +60 -0
  103. package/dist/model/list.js.map +1 -0
  104. package/dist/model/mutations.d.ts +32 -0
  105. package/dist/model/mutations.d.ts.map +1 -0
  106. package/dist/model/mutations.js +44 -0
  107. package/dist/model/mutations.js.map +1 -0
  108. package/dist/model/queries.d.ts +65 -0
  109. package/dist/model/queries.d.ts.map +1 -0
  110. package/dist/model/queries.js +80 -0
  111. package/dist/model/queries.js.map +1 -0
  112. package/dist/model/queryKeys.d.ts +27 -0
  113. package/dist/model/queryKeys.d.ts.map +1 -0
  114. package/dist/model/queryKeys.js +14 -0
  115. package/dist/model/queryKeys.js.map +1 -0
  116. package/dist/model/rating.d.ts +57 -0
  117. package/dist/model/rating.d.ts.map +1 -0
  118. package/dist/model/rating.js +47 -0
  119. package/dist/model/rating.js.map +1 -0
  120. package/dist/model/refusals.d.ts +51 -0
  121. package/dist/model/refusals.d.ts.map +1 -0
  122. package/dist/model/refusals.js +103 -0
  123. package/dist/model/refusals.js.map +1 -0
  124. package/dist/model/runtime.d.ts +44 -0
  125. package/dist/model/runtime.d.ts.map +1 -0
  126. package/dist/model/runtime.js +15 -0
  127. package/dist/model/runtime.js.map +1 -0
  128. package/llms.txt +80 -0
  129. package/manifest.json +577 -0
  130. package/package.json +115 -0
  131. package/src/analytics/generated/events.json +7 -0
  132. package/src/api/generated/schema.ts +362 -0
  133. package/src/api/reviewsApi.ts +170 -0
  134. package/src/api/types.ts +140 -0
  135. package/src/default/ErrorAlert.tsx +46 -0
  136. package/src/default/RatingBadge.tsx +81 -0
  137. package/src/default/ReviewFormCard.tsx +139 -0
  138. package/src/default/ReviewListPanel.tsx +204 -0
  139. package/src/default/ReviewsPanel.tsx +74 -0
  140. package/src/default/index.ts +30 -0
  141. package/src/default/theme.tsx +66 -0
  142. package/src/default/types.ts +12 -0
  143. package/src/headless/ReviewAggregate.tsx +94 -0
  144. package/src/headless/ReviewForm.tsx +163 -0
  145. package/src/headless/ReviewList.tsx +99 -0
  146. package/src/headless/ReviewsProvider.tsx +20 -0
  147. package/src/i18n/errorsMap.ts +33 -0
  148. package/src/i18n/es.ts +81 -0
  149. package/src/i18n/generated/errors.es.gen.ts +64 -0
  150. package/src/i18n/generated/errors.gen.ts +205 -0
  151. package/src/i18n/generated/errors.json +387 -0
  152. package/src/i18n/generated/errors.ru.gen.ts +64 -0
  153. package/src/i18n/keys.ts +133 -0
  154. package/src/i18n/ru.ts +85 -0
  155. package/src/index.ts +161 -0
  156. package/src/model/context.tsx +28 -0
  157. package/src/model/list.ts +74 -0
  158. package/src/model/mutations.ts +62 -0
  159. package/src/model/queries.ts +122 -0
  160. package/src/model/queryKeys.ts +45 -0
  161. package/src/model/rating.ts +101 -0
  162. package/src/model/refusals.ts +114 -0
  163. package/src/model/runtime.ts +61 -0
  164. package/tsconfig.json +26 -0
package/manifest.json ADDED
@@ -0,0 +1,577 @@
1
+ {
2
+ "$generated": "by scripts/gen-manifest.mjs — do not edit; drift-gated (pnpm gen:manifest:check)",
3
+ "package": "@stapel/reviews-react",
4
+ "version": "0.1.0",
5
+ "backend": {
6
+ "module": "stapel-reviews",
7
+ "contract": ">=0.3 <0.4"
8
+ },
9
+ "layers": [
10
+ "api",
11
+ "model",
12
+ "flows",
13
+ "headless",
14
+ "i18n"
15
+ ],
16
+ "flows": {},
17
+ "machines": [],
18
+ "operations": {
19
+ "reviews_api_v1_reviews_aggregate_retrieve": {
20
+ "method": "GET",
21
+ "path": "/reviews/api/v1/reviews/aggregate",
22
+ "tag": "Reviews",
23
+ "request": null,
24
+ "response": "AggregateResponse"
25
+ },
26
+ "reviews_api_v1_reviews_create": {
27
+ "method": "POST",
28
+ "path": "/reviews/api/v1/reviews",
29
+ "tag": "Reviews",
30
+ "request": "ReviewCreateRequest",
31
+ "response": "ReviewResponse"
32
+ },
33
+ "reviews_api_v1_reviews_moderate_create": {
34
+ "method": "POST",
35
+ "path": "/reviews/api/v1/reviews/{review_id}/moderate",
36
+ "tag": "Reviews",
37
+ "request": "ModerateRequest",
38
+ "response": "ReviewResponse"
39
+ },
40
+ "reviews_api_v1_reviews_response_create": {
41
+ "method": "POST",
42
+ "path": "/reviews/api/v1/reviews/{review_id}/response",
43
+ "tag": "Reviews",
44
+ "request": "RespondRequest",
45
+ "response": "ReviewResponse"
46
+ },
47
+ "reviews_api_v1_reviews_retrieve": {
48
+ "method": "GET",
49
+ "path": "/reviews/api/v1/reviews",
50
+ "tag": "Reviews",
51
+ "request": null,
52
+ "response": "ReviewPage"
53
+ }
54
+ },
55
+ "hooks": {
56
+ "useReviewAggregate": {
57
+ "kind": "query",
58
+ "operation": "aggregate",
59
+ "queryKey": [
60
+ "reviews",
61
+ "{…}",
62
+ "{…}",
63
+ "aggregate"
64
+ ]
65
+ },
66
+ "useSubmitReview": {
67
+ "kind": "mutation",
68
+ "operation": "createReview",
69
+ "invalidates": [
70
+ [
71
+ "reviews",
72
+ "{…}",
73
+ "{…}"
74
+ ]
75
+ ]
76
+ }
77
+ },
78
+ "errors": {
79
+ "error.400.bad_request": {
80
+ "status": 400,
81
+ "params": [],
82
+ "remediation": "fix_input"
83
+ },
84
+ "error.400.captcha_invalid": {
85
+ "status": 400,
86
+ "params": [],
87
+ "remediation": "retry"
88
+ },
89
+ "error.400.captcha_required": {
90
+ "status": 400,
91
+ "params": [],
92
+ "remediation": "retry"
93
+ },
94
+ "error.400.expected_list": {
95
+ "status": 400,
96
+ "params": [],
97
+ "remediation": "fix_input"
98
+ },
99
+ "error.400.field.blank": {
100
+ "status": 400,
101
+ "params": [
102
+ "field"
103
+ ],
104
+ "remediation": "fix_input"
105
+ },
106
+ "error.400.field.does_not_exist": {
107
+ "status": 400,
108
+ "params": [
109
+ "field"
110
+ ],
111
+ "remediation": "fix_input"
112
+ },
113
+ "error.400.field.invalid": {
114
+ "status": 400,
115
+ "params": [
116
+ "field"
117
+ ],
118
+ "remediation": "fix_input"
119
+ },
120
+ "error.400.field.invalid_choice": {
121
+ "status": 400,
122
+ "params": [
123
+ "field"
124
+ ],
125
+ "remediation": "fix_input"
126
+ },
127
+ "error.400.field.max_length": {
128
+ "status": 400,
129
+ "params": [
130
+ "field",
131
+ "max_length"
132
+ ],
133
+ "remediation": "fix_input"
134
+ },
135
+ "error.400.field.max_value": {
136
+ "status": 400,
137
+ "params": [
138
+ "field",
139
+ "max_value"
140
+ ],
141
+ "remediation": "fix_input"
142
+ },
143
+ "error.400.field.min_length": {
144
+ "status": 400,
145
+ "params": [
146
+ "field",
147
+ "min_length"
148
+ ],
149
+ "remediation": "fix_input"
150
+ },
151
+ "error.400.field.min_value": {
152
+ "status": 400,
153
+ "params": [
154
+ "field",
155
+ "min_value"
156
+ ],
157
+ "remediation": "fix_input"
158
+ },
159
+ "error.400.field.null": {
160
+ "status": 400,
161
+ "params": [
162
+ "field"
163
+ ],
164
+ "remediation": "fix_input"
165
+ },
166
+ "error.400.field.required": {
167
+ "status": 400,
168
+ "params": [
169
+ "field"
170
+ ],
171
+ "remediation": "fix_input"
172
+ },
173
+ "error.400.field.unique": {
174
+ "status": 400,
175
+ "params": [
176
+ "field"
177
+ ],
178
+ "remediation": "fix_input"
179
+ },
180
+ "error.400.invalid_ad_id": {
181
+ "status": 400,
182
+ "params": [],
183
+ "remediation": "fix_input"
184
+ },
185
+ "error.400.reviews_duplicate_review": {
186
+ "status": 400,
187
+ "params": [],
188
+ "remediation": "fix_input"
189
+ },
190
+ "error.400.reviews_invalid_moderation_action": {
191
+ "status": 400,
192
+ "params": [],
193
+ "remediation": "fix_input"
194
+ },
195
+ "error.400.reviews_invalid_rating": {
196
+ "status": 400,
197
+ "params": [],
198
+ "remediation": "fix_input"
199
+ },
200
+ "error.400.reviews_response_not_allowed": {
201
+ "status": 400,
202
+ "params": [],
203
+ "remediation": "fix_input"
204
+ },
205
+ "error.400.reviews_unknown_target_type": {
206
+ "status": 400,
207
+ "params": [],
208
+ "remediation": "fix_input"
209
+ },
210
+ "error.400.validation_error": {
211
+ "status": 400,
212
+ "params": [],
213
+ "remediation": "fix_input"
214
+ },
215
+ "error.400.verification_failed": {
216
+ "status": 400,
217
+ "params": [],
218
+ "remediation": "verify"
219
+ },
220
+ "error.400.verification_invalid_factor": {
221
+ "status": 400,
222
+ "params": [],
223
+ "remediation": "verify"
224
+ },
225
+ "error.401.unauthorized": {
226
+ "status": 401,
227
+ "params": [],
228
+ "remediation": "reauthenticate"
229
+ },
230
+ "error.402.payment_required": {
231
+ "status": 402,
232
+ "params": [],
233
+ "remediation": "retry"
234
+ },
235
+ "error.403.forbidden": {
236
+ "status": 403,
237
+ "params": [],
238
+ "remediation": "retry"
239
+ },
240
+ "error.403.network_blocked": {
241
+ "status": 403,
242
+ "params": [],
243
+ "remediation": "contact_support"
244
+ },
245
+ "error.403.reviews_cannot_moderate": {
246
+ "status": 403,
247
+ "params": [],
248
+ "remediation": "retry"
249
+ },
250
+ "error.403.reviews_cannot_review": {
251
+ "status": 403,
252
+ "params": [],
253
+ "remediation": "retry"
254
+ },
255
+ "error.403.verification_enrollment_required": {
256
+ "status": 403,
257
+ "params": [],
258
+ "remediation": "verify"
259
+ },
260
+ "error.403.verification_required": {
261
+ "status": 403,
262
+ "params": [],
263
+ "remediation": "verify"
264
+ },
265
+ "error.404.ad_not_found": {
266
+ "status": 404,
267
+ "params": [],
268
+ "remediation": "retry"
269
+ },
270
+ "error.404.not_found": {
271
+ "status": 404,
272
+ "params": [],
273
+ "remediation": "retry"
274
+ },
275
+ "error.404.reviews_review_not_found": {
276
+ "status": 404,
277
+ "params": [],
278
+ "remediation": "retry"
279
+ },
280
+ "error.404.verification_challenge_not_found": {
281
+ "status": 404,
282
+ "params": [],
283
+ "remediation": "verify"
284
+ },
285
+ "error.405.method_not_allowed": {
286
+ "status": 405,
287
+ "params": [],
288
+ "remediation": "retry"
289
+ },
290
+ "error.406.not_acceptable": {
291
+ "status": 406,
292
+ "params": [],
293
+ "remediation": "retry"
294
+ },
295
+ "error.408.request_timeout": {
296
+ "status": 408,
297
+ "params": [],
298
+ "remediation": "retry"
299
+ },
300
+ "error.409.conflict": {
301
+ "status": 409,
302
+ "params": [],
303
+ "remediation": "fix_input"
304
+ },
305
+ "error.409.reviews_already_responded": {
306
+ "status": 409,
307
+ "params": [],
308
+ "remediation": "fix_input"
309
+ },
310
+ "error.410.gone": {
311
+ "status": 410,
312
+ "params": [],
313
+ "remediation": "retry"
314
+ },
315
+ "error.413.payload_too_large": {
316
+ "status": 413,
317
+ "params": [],
318
+ "remediation": "retry"
319
+ },
320
+ "error.415.unsupported_media_type": {
321
+ "status": 415,
322
+ "params": [],
323
+ "remediation": "retry"
324
+ },
325
+ "error.422.unprocessable_entity": {
326
+ "status": 422,
327
+ "params": [],
328
+ "remediation": "wait_and_retry"
329
+ },
330
+ "error.423.locked": {
331
+ "status": 423,
332
+ "params": [],
333
+ "remediation": "wait_and_retry"
334
+ },
335
+ "error.423.verification_locked": {
336
+ "status": 423,
337
+ "params": [],
338
+ "remediation": "wait_and_retry"
339
+ },
340
+ "error.429.rate_limit": {
341
+ "status": 429,
342
+ "params": [
343
+ "retry_after_minutes"
344
+ ],
345
+ "remediation": "wait_and_retry"
346
+ },
347
+ "error.429.too_many_requests": {
348
+ "status": 429,
349
+ "params": [],
350
+ "remediation": "wait_and_retry"
351
+ },
352
+ "error.500.internal": {
353
+ "status": 500,
354
+ "params": [],
355
+ "remediation": "contact_support"
356
+ },
357
+ "error.503.mandate_unavailable": {
358
+ "status": 503,
359
+ "params": [],
360
+ "remediation": "retry"
361
+ }
362
+ },
363
+ "events": {
364
+ "defined": [],
365
+ "flows": []
366
+ },
367
+ "demos": [
368
+ {
369
+ "id": "reviews.aggregate",
370
+ "title": "Rating aggregate",
371
+ "description": "avg is 0.0 when count is 0 — the module says so in its own schema — so a naive renderer draws the worst possible score over a target nobody has rated. ratingSummary() answers rated:false there and the skin has nothing to draw a star row from. The third variant is the seller roll-up: stapel-reviews aggregates ONE (target_type, target_key) per call and cannot roll a seller's listings up, so the composite's projection computes {avg, count} — the same two field names, deliberately — and this component renders them without a request.",
372
+ "component": "ReviewAggregate",
373
+ "tokens": [
374
+ "surface-raised"
375
+ ],
376
+ "variants": [
377
+ "rated",
378
+ "never rated",
379
+ "seller roll-up (supplied)"
380
+ ],
381
+ "source": "demo/ReviewAggregate.demo.tsx"
382
+ },
383
+ {
384
+ "id": "reviews.form",
385
+ "title": "Write a review",
386
+ "description": "The duplicate refusal is read by CODE: `error.400.reviews_duplicate_review` arrives with status 400, while the module's only 409 says the owner's reply already exists — a form branching on the number would miss the first and mishandle the second. And a submitted review is not necessarily a visible one: under pre-moderation the created row comes back `pending`, so the author is told it will appear once checked instead of being left to hunt for it.",
387
+ "component": "ReviewForm",
388
+ "tokens": [
389
+ "surface-raised"
390
+ ],
391
+ "variants": [
392
+ "post-moderation (published)",
393
+ "pre-moderation (pending)",
394
+ "already rated (400)"
395
+ ],
396
+ "source": "demo/ReviewForm.demo.tsx"
397
+ },
398
+ {
399
+ "id": "reviews.list",
400
+ "title": "Review list",
401
+ "description": "GET /reviews answers core's AnchorPagination envelope — declared as components/ReviewPage since stapel-reviews 0.3.0, so the pair reads a generated shape instead of the copy it used to maintain. The published scope is what everyone reads, guests included (IsAuthenticatedOrReadOnly since the same release), so an empty list is a reachable state that means what it says. include=all is honoured only for a moderator of the target and narrowed silently for anyone else, which is why every non-published row names its state.",
402
+ "component": "ReviewList",
403
+ "covers": [
404
+ "ReviewsProvider"
405
+ ],
406
+ "tokens": [
407
+ "surface-raised"
408
+ ],
409
+ "variants": [
410
+ "published",
411
+ "moderator (include=all)",
412
+ "empty (reachable by a guest)"
413
+ ],
414
+ "source": "demo/ReviewList.demo.tsx"
415
+ }
416
+ ],
417
+ "i18nKeys": [
418
+ "error.400.bad_request",
419
+ "error.400.captcha_invalid",
420
+ "error.400.captcha_required",
421
+ "error.400.expected_list",
422
+ "error.400.field.blank",
423
+ "error.400.field.does_not_exist",
424
+ "error.400.field.invalid",
425
+ "error.400.field.invalid_choice",
426
+ "error.400.field.max_length",
427
+ "error.400.field.max_value",
428
+ "error.400.field.min_length",
429
+ "error.400.field.min_value",
430
+ "error.400.field.null",
431
+ "error.400.field.required",
432
+ "error.400.field.unique",
433
+ "error.400.invalid_ad_id",
434
+ "error.400.reviews_duplicate_review",
435
+ "error.400.reviews_invalid_moderation_action",
436
+ "error.400.reviews_invalid_rating",
437
+ "error.400.reviews_response_not_allowed",
438
+ "error.400.reviews_unknown_target_type",
439
+ "error.400.validation_error",
440
+ "error.400.verification_failed",
441
+ "error.400.verification_invalid_factor",
442
+ "error.401.unauthorized",
443
+ "error.402.payment_required",
444
+ "error.403.forbidden",
445
+ "error.403.network_blocked",
446
+ "error.403.reviews_cannot_moderate",
447
+ "error.403.reviews_cannot_review",
448
+ "error.403.verification_enrollment_required",
449
+ "error.403.verification_required",
450
+ "error.404.ad_not_found",
451
+ "error.404.not_found",
452
+ "error.404.reviews_review_not_found",
453
+ "error.404.verification_challenge_not_found",
454
+ "error.405.method_not_allowed",
455
+ "error.406.not_acceptable",
456
+ "error.408.request_timeout",
457
+ "error.409.conflict",
458
+ "error.409.reviews_already_responded",
459
+ "error.410.gone",
460
+ "error.413.payload_too_large",
461
+ "error.415.unsupported_media_type",
462
+ "error.422.unprocessable_entity",
463
+ "error.423.locked",
464
+ "error.423.verification_locked",
465
+ "error.429.rate_limit",
466
+ "error.429.too_many_requests",
467
+ "error.500.internal",
468
+ "error.503.mandate_unavailable",
469
+ "reviews.error.unknown",
470
+ "reviews.form.body_label",
471
+ "reviews.form.body_placeholder",
472
+ "reviews.form.heading",
473
+ "reviews.form.rating_label",
474
+ "reviews.form.sent.hidden",
475
+ "reviews.form.sent.pending",
476
+ "reviews.form.sent.published",
477
+ "reviews.form.sent.unknown",
478
+ "reviews.form.sign_in_required",
479
+ "reviews.form.submit",
480
+ "reviews.list.empty",
481
+ "reviews.list.heading",
482
+ "reviews.list.load_more",
483
+ "reviews.list.more.blocked.end",
484
+ "reviews.list.more.blocked.pending",
485
+ "reviews.list.refresh",
486
+ "reviews.rating.count",
487
+ "reviews.rating.none",
488
+ "reviews.rating.star_label",
489
+ "reviews.rating.value",
490
+ "reviews.review.author_fallback",
491
+ "reviews.review.response_heading",
492
+ "reviews.status.hidden",
493
+ "reviews.status.pending",
494
+ "reviews.status.unknown",
495
+ "reviews.submit.blocked.duplicate",
496
+ "reviews.submit.blocked.forbidden",
497
+ "reviews.submit.blocked.no_rating",
498
+ "reviews.submit.blocked.pending",
499
+ "reviews.submit.blocked.submitted"
500
+ ],
501
+ "exports": {
502
+ "runtime": [
503
+ "DEFAULT_RATING_BOUNDS",
504
+ "REVIEWS_ERRORS",
505
+ "REVIEWS_ERROR_ALREADY_RESPONDED",
506
+ "REVIEWS_ERROR_CANNOT_MODERATE",
507
+ "REVIEWS_ERROR_CANNOT_REVIEW",
508
+ "REVIEWS_ERROR_CODES",
509
+ "REVIEWS_ERROR_DUPLICATE",
510
+ "REVIEWS_ERROR_INVALID_RATING",
511
+ "REVIEWS_ERROR_NOT_FOUND",
512
+ "REVIEWS_ERROR_RESPONSE_NOT_ALLOWED",
513
+ "REVIEWS_ERROR_UNKNOWN_TARGET_TYPE",
514
+ "REVIEWS_I18N_KEYS",
515
+ "REVIEWS_PAGE",
516
+ "ReviewAggregate",
517
+ "ReviewForm",
518
+ "ReviewList",
519
+ "ReviewsProvider",
520
+ "ReviewsRuntimeContext",
521
+ "createReviewsApi",
522
+ "createReviewsRuntime",
523
+ "explainReviewsError",
524
+ "findOwnReview",
525
+ "isDuplicateReview",
526
+ "isModeratedOut",
527
+ "isReviewingForbidden",
528
+ "isSignInRequired",
529
+ "isUnknownTargetType",
530
+ "ratingSummary",
531
+ "registerReviewsI18n",
532
+ "reviewVisibility",
533
+ "reviewsErrorBundleEn",
534
+ "reviewsFromPages",
535
+ "reviewsI18nBundleEn",
536
+ "reviewsQueryKeys",
537
+ "starBreakdown",
538
+ "toReviewsError",
539
+ "useReviewAggregate",
540
+ "useReviewList",
541
+ "useReviewsAnalytics",
542
+ "useReviewsApi",
543
+ "useReviewsRuntime",
544
+ "useSubmitReview"
545
+ ],
546
+ "types": [
547
+ "CreateReviewsRuntimeOptions",
548
+ "RatingAggregate",
549
+ "RatingSummary",
550
+ "Remediation",
551
+ "Review",
552
+ "ReviewAggregateBag",
553
+ "ReviewAggregateProps",
554
+ "ReviewAggregateResponse",
555
+ "ReviewAnchorDirection",
556
+ "ReviewCreateRequest",
557
+ "ReviewFormBag",
558
+ "ReviewFormProps",
559
+ "ReviewListBag",
560
+ "ReviewListParams",
561
+ "ReviewListProps",
562
+ "ReviewOwnerResponse",
563
+ "ReviewPage",
564
+ "ReviewRatingBounds",
565
+ "ReviewStatus",
566
+ "ReviewTarget",
567
+ "ReviewsApi",
568
+ "ReviewsErrorCode",
569
+ "ReviewsErrorSpec",
570
+ "ReviewsRuntime",
571
+ "Schemas",
572
+ "StarBreakdown",
573
+ "SubmitReviewVariables",
574
+ "UseReviewListOptions"
575
+ ]
576
+ }
577
+ }
package/package.json ADDED
@@ -0,0 +1,115 @@
1
+ {
2
+ "name": "@stapel/reviews-react",
3
+ "version": "0.1.0",
4
+ "description": "Headless React pair for stapel-reviews: ratings and reviews addressed the way the module addresses them — by an opaque (target_type, target_key) pair, never by a foreign key. An anchor-paginated list a guest can read, an aggregate that renders `no reviews yet` instead of a zero-star rating when count is 0, a submit form that reads the duplicate refusal by CODE (the module answers 400, not 409) and asks for a sign-in only where the write actually needs one, and moderation states shown as they are rather than hidden. The seller-level rating is a display over the composite's projection, because reviews itself cannot roll one up. Zero visual opinion in the main entry; an opt-in /default subpath ships the antd skin.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/usestapel/stapel-react.git",
9
+ "directory": "packages/reviews-react"
10
+ },
11
+ "type": "module",
12
+ "sideEffects": false,
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "default": "./dist/index.js"
19
+ },
20
+ "./default": {
21
+ "types": "./dist/default/index.d.ts",
22
+ "default": "./dist/default/index.js"
23
+ },
24
+ "./i18n/ru": {
25
+ "types": "./dist/i18n/ru.d.ts",
26
+ "default": "./dist/i18n/ru.js"
27
+ },
28
+ "./i18n/es": {
29
+ "types": "./dist/i18n/es.d.ts",
30
+ "default": "./dist/i18n/es.js"
31
+ },
32
+ "./manifest": "./manifest.json",
33
+ "./manifest.json": "./manifest.json",
34
+ "./llms.txt": "./llms.txt",
35
+ "./package.json": "./package.json"
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "src",
40
+ "tsconfig.json",
41
+ "README.md",
42
+ "MODULE.md",
43
+ "CHANGELOG.md",
44
+ "manifest.json",
45
+ "llms.txt"
46
+ ],
47
+ "scripts": {
48
+ "build": "tsc -p tsconfig.json",
49
+ "test": "tsc -p tsconfig.test.json && vitest run --exclude test/prodBundlePurity.test.ts",
50
+ "test:pack": "vitest run test/prodBundlePurity.test.ts",
51
+ "lint": "eslint .",
52
+ "size": "size-limit"
53
+ },
54
+ "size-limit": [
55
+ {
56
+ "name": "index — the headless pair (client + list window + aggregate + submit): no antd",
57
+ "path": "dist/index.js",
58
+ "limit": "6 KB"
59
+ },
60
+ {
61
+ "name": "default — the antd skin (list, stars, form) must stay out of the main bundle",
62
+ "path": "dist/default/index.js",
63
+ "limit": "7 KB"
64
+ },
65
+ {
66
+ "name": "i18n/ru — the Russian bundle is opt-in, not carried by the main entry",
67
+ "path": "dist/i18n/ru.js",
68
+ "limit": "3 KB"
69
+ },
70
+ {
71
+ "name": "i18n/es — the Spanish bundle is opt-in, not carried by the main entry",
72
+ "path": "dist/i18n/es.js",
73
+ "limit": "2.5 KB"
74
+ }
75
+ ],
76
+ "peerDependencies": {
77
+ "@stapel/core": ">=0.15.0 <1.0.0",
78
+ "@stapel/tokens-antd": ">=0.5.0",
79
+ "@tanstack/react-query": "^5.0.0",
80
+ "antd": ">=5.20.0 <7",
81
+ "react": ">=19"
82
+ },
83
+ "peerDependenciesMeta": {
84
+ "@stapel/tokens-antd": {
85
+ "optional": true
86
+ },
87
+ "antd": {
88
+ "optional": true
89
+ }
90
+ },
91
+ "devDependencies": {
92
+ "@size-limit/preset-small-lib": "^11.2.0",
93
+ "@stapel/core": "workspace:^",
94
+ "@stapel/showcase": "workspace:^",
95
+ "@stapel/tokens": "workspace:^",
96
+ "@stapel/tokens-antd": "workspace:^",
97
+ "@tanstack/react-query": "^5.81.0",
98
+ "@testing-library/react": "^16.3.0",
99
+ "@types/react": "^19.1.0",
100
+ "@types/react-dom": "^19.1.0",
101
+ "antd": "^6.5.0",
102
+ "jsdom": "^26.1.0",
103
+ "react": "^19.1.0",
104
+ "react-dom": "^19.1.0",
105
+ "size-limit": "^11.2.0",
106
+ "typescript": "^5.8.3",
107
+ "vitest": "^3.2.4"
108
+ },
109
+ "engines": {
110
+ "node": ">=22"
111
+ },
112
+ "publishConfig": {
113
+ "access": "public"
114
+ }
115
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "$generated": "by scripts/gen-events.mjs — do not edit; drift-gated (pnpm gen:events:check)",
3
+ "package": "@stapel/reviews-react",
4
+ "version": "0.1.0",
5
+ "defined": [],
6
+ "flows": []
7
+ }