@stapel/search-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 (195) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/MODULE.md +203 -0
  3. package/README.md +175 -0
  4. package/dist/api/generated/schema.d.ts +375 -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/searchApi.d.ts +77 -0
  9. package/dist/api/searchApi.d.ts.map +1 -0
  10. package/dist/api/searchApi.js +79 -0
  11. package/dist/api/searchApi.js.map +1 -0
  12. package/dist/api/types.d.ts +131 -0
  13. package/dist/api/types.d.ts.map +1 -0
  14. package/dist/api/types.js +20 -0
  15. package/dist/api/types.js.map +1 -0
  16. package/dist/default/DegradationNotice.d.ts +19 -0
  17. package/dist/default/DegradationNotice.d.ts.map +1 -0
  18. package/dist/default/DegradationNotice.js +14 -0
  19. package/dist/default/DegradationNotice.js.map +1 -0
  20. package/dist/default/ErrorAlert.d.ts +9 -0
  21. package/dist/default/ErrorAlert.d.ts.map +1 -0
  22. package/dist/default/ErrorAlert.js +27 -0
  23. package/dist/default/ErrorAlert.js.map +1 -0
  24. package/dist/default/FacetPanelPane.d.ts +26 -0
  25. package/dist/default/FacetPanelPane.d.ts.map +1 -0
  26. package/dist/default/FacetPanelPane.js +32 -0
  27. package/dist/default/FacetPanelPane.js.map +1 -0
  28. package/dist/default/RankingDisclosurePane.d.ts +17 -0
  29. package/dist/default/RankingDisclosurePane.d.ts.map +1 -0
  30. package/dist/default/RankingDisclosurePane.js +23 -0
  31. package/dist/default/RankingDisclosurePane.js.map +1 -0
  32. package/dist/default/SearchPage.d.ts +34 -0
  33. package/dist/default/SearchPage.d.ts.map +1 -0
  34. package/dist/default/SearchPage.js +16 -0
  35. package/dist/default/SearchPage.js.map +1 -0
  36. package/dist/default/SearchResultCard.d.ts +34 -0
  37. package/dist/default/SearchResultCard.d.ts.map +1 -0
  38. package/dist/default/SearchResultCard.js +38 -0
  39. package/dist/default/SearchResultCard.js.map +1 -0
  40. package/dist/default/SearchResultsPane.d.ts +32 -0
  41. package/dist/default/SearchResultsPane.d.ts.map +1 -0
  42. package/dist/default/SearchResultsPane.js +46 -0
  43. package/dist/default/SearchResultsPane.js.map +1 -0
  44. package/dist/default/SortSelect.d.ts +22 -0
  45. package/dist/default/SortSelect.d.ts.map +1 -0
  46. package/dist/default/SortSelect.js +39 -0
  47. package/dist/default/SortSelect.js.map +1 -0
  48. package/dist/default/UrlIssueNotice.d.ts +12 -0
  49. package/dist/default/UrlIssueNotice.d.ts.map +1 -0
  50. package/dist/default/UrlIssueNotice.js +13 -0
  51. package/dist/default/UrlIssueNotice.js.map +1 -0
  52. package/dist/default/index.d.ts +40 -0
  53. package/dist/default/index.d.ts.map +1 -0
  54. package/dist/default/index.js +34 -0
  55. package/dist/default/index.js.map +1 -0
  56. package/dist/default/theme.d.ts +24 -0
  57. package/dist/default/theme.d.ts.map +1 -0
  58. package/dist/default/theme.js +39 -0
  59. package/dist/default/theme.js.map +1 -0
  60. package/dist/default/types.d.ts +12 -0
  61. package/dist/default/types.d.ts.map +1 -0
  62. package/dist/default/types.js +2 -0
  63. package/dist/default/types.js.map +1 -0
  64. package/dist/headless/FacetPanel.d.ts +61 -0
  65. package/dist/headless/FacetPanel.d.ts.map +1 -0
  66. package/dist/headless/FacetPanel.js +57 -0
  67. package/dist/headless/FacetPanel.js.map +1 -0
  68. package/dist/headless/RankingDisclosure.d.ts +39 -0
  69. package/dist/headless/RankingDisclosure.d.ts.map +1 -0
  70. package/dist/headless/RankingDisclosure.js +28 -0
  71. package/dist/headless/RankingDisclosure.js.map +1 -0
  72. package/dist/headless/SearchProvider.d.ts +19 -0
  73. package/dist/headless/SearchProvider.d.ts.map +1 -0
  74. package/dist/headless/SearchProvider.js +15 -0
  75. package/dist/headless/SearchProvider.js.map +1 -0
  76. package/dist/headless/SearchResults.d.ts +68 -0
  77. package/dist/headless/SearchResults.d.ts.map +1 -0
  78. package/dist/headless/SearchResults.js +70 -0
  79. package/dist/headless/SearchResults.js.map +1 -0
  80. package/dist/headless/SearchStateProvider.d.ts +69 -0
  81. package/dist/headless/SearchStateProvider.d.ts.map +1 -0
  82. package/dist/headless/SearchStateProvider.js +71 -0
  83. package/dist/headless/SearchStateProvider.js.map +1 -0
  84. package/dist/i18n/errorsMap.d.ts +27 -0
  85. package/dist/i18n/errorsMap.d.ts.map +1 -0
  86. package/dist/i18n/errorsMap.js +37 -0
  87. package/dist/i18n/errorsMap.js.map +1 -0
  88. package/dist/i18n/es.d.ts +13 -0
  89. package/dist/i18n/es.d.ts.map +1 -0
  90. package/dist/i18n/es.js +85 -0
  91. package/dist/i18n/es.js.map +1 -0
  92. package/dist/i18n/generated/errors.es.gen.d.ts +9 -0
  93. package/dist/i18n/generated/errors.es.gen.d.ts.map +1 -0
  94. package/dist/i18n/generated/errors.es.gen.js +63 -0
  95. package/dist/i18n/generated/errors.es.gen.js.map +1 -0
  96. package/dist/i18n/generated/errors.gen.d.ts +359 -0
  97. package/dist/i18n/generated/errors.gen.d.ts.map +1 -0
  98. package/dist/i18n/generated/errors.gen.js +183 -0
  99. package/dist/i18n/generated/errors.gen.js.map +1 -0
  100. package/dist/i18n/generated/errors.ru.gen.d.ts +9 -0
  101. package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -0
  102. package/dist/i18n/generated/errors.ru.gen.js +63 -0
  103. package/dist/i18n/generated/errors.ru.gen.js.map +1 -0
  104. package/dist/i18n/keys.d.ts +107 -0
  105. package/dist/i18n/keys.d.ts.map +1 -0
  106. package/dist/i18n/keys.js +185 -0
  107. package/dist/i18n/keys.js.map +1 -0
  108. package/dist/i18n/ru.d.ts +29 -0
  109. package/dist/i18n/ru.d.ts.map +1 -0
  110. package/dist/i18n/ru.js +101 -0
  111. package/dist/i18n/ru.js.map +1 -0
  112. package/dist/index.d.ts +72 -0
  113. package/dist/index.d.ts.map +1 -0
  114. package/dist/index.js +66 -0
  115. package/dist/index.js.map +1 -0
  116. package/dist/model/context.d.ts +11 -0
  117. package/dist/model/context.d.ts.map +1 -0
  118. package/dist/model/context.js +16 -0
  119. package/dist/model/context.js.map +1 -0
  120. package/dist/model/queries.d.ts +48 -0
  121. package/dist/model/queries.d.ts.map +1 -0
  122. package/dist/model/queries.js +65 -0
  123. package/dist/model/queries.js.map +1 -0
  124. package/dist/model/queryKeys.d.ts +25 -0
  125. package/dist/model/queryKeys.d.ts.map +1 -0
  126. package/dist/model/queryKeys.js +22 -0
  127. package/dist/model/queryKeys.js.map +1 -0
  128. package/dist/model/runtime.d.ts +25 -0
  129. package/dist/model/runtime.d.ts.map +1 -0
  130. package/dist/model/runtime.js +6 -0
  131. package/dist/model/runtime.js.map +1 -0
  132. package/dist/nav/manifest.d.ts +21 -0
  133. package/dist/nav/manifest.d.ts.map +1 -0
  134. package/dist/nav/manifest.js +34 -0
  135. package/dist/nav/manifest.js.map +1 -0
  136. package/dist/router/index.d.ts +10 -0
  137. package/dist/router/index.d.ts.map +1 -0
  138. package/dist/router/index.js +34 -0
  139. package/dist/router/index.js.map +1 -0
  140. package/dist/state/degradations.d.ts +30 -0
  141. package/dist/state/degradations.d.ts.map +1 -0
  142. package/dist/state/degradations.js +52 -0
  143. package/dist/state/degradations.js.map +1 -0
  144. package/dist/state/facets.d.ts +68 -0
  145. package/dist/state/facets.d.ts.map +1 -0
  146. package/dist/state/facets.js +171 -0
  147. package/dist/state/facets.js.map +1 -0
  148. package/dist/state/urlState.d.ts +143 -0
  149. package/dist/state/urlState.d.ts.map +1 -0
  150. package/dist/state/urlState.js +319 -0
  151. package/dist/state/urlState.js.map +1 -0
  152. package/llms.txt +87 -0
  153. package/manifest.json +652 -0
  154. package/nav-manifest.json +44 -0
  155. package/package.json +133 -0
  156. package/src/analytics/generated/events.json +7 -0
  157. package/src/api/generated/schema.ts +377 -0
  158. package/src/api/searchApi.ts +169 -0
  159. package/src/api/types.ts +160 -0
  160. package/src/default/DegradationNotice.tsx +50 -0
  161. package/src/default/ErrorAlert.tsx +46 -0
  162. package/src/default/FacetPanelPane.tsx +174 -0
  163. package/src/default/RankingDisclosurePane.tsx +116 -0
  164. package/src/default/SearchPage.tsx +87 -0
  165. package/src/default/SearchResultCard.tsx +96 -0
  166. package/src/default/SearchResultsPane.tsx +173 -0
  167. package/src/default/SortSelect.tsx +77 -0
  168. package/src/default/UrlIssueNotice.tsx +37 -0
  169. package/src/default/index.ts +48 -0
  170. package/src/default/theme.tsx +66 -0
  171. package/src/default/types.ts +12 -0
  172. package/src/headless/FacetPanel.tsx +113 -0
  173. package/src/headless/RankingDisclosure.tsx +58 -0
  174. package/src/headless/SearchProvider.tsx +20 -0
  175. package/src/headless/SearchResults.tsx +149 -0
  176. package/src/headless/SearchStateProvider.tsx +175 -0
  177. package/src/i18n/errorsMap.ts +50 -0
  178. package/src/i18n/es.ts +110 -0
  179. package/src/i18n/generated/errors.es.gen.ts +69 -0
  180. package/src/i18n/generated/errors.gen.ts +214 -0
  181. package/src/i18n/generated/errors.json +423 -0
  182. package/src/i18n/generated/errors.ru.gen.ts +69 -0
  183. package/src/i18n/keys.ts +220 -0
  184. package/src/i18n/ru.ts +126 -0
  185. package/src/index.ts +154 -0
  186. package/src/model/context.tsx +28 -0
  187. package/src/model/queries.ts +79 -0
  188. package/src/model/queryKeys.ts +48 -0
  189. package/src/model/runtime.ts +33 -0
  190. package/src/nav/manifest.ts +53 -0
  191. package/src/router/index.ts +38 -0
  192. package/src/state/degradations.ts +75 -0
  193. package/src/state/facets.ts +219 -0
  194. package/src/state/urlState.ts +458 -0
  195. package/tsconfig.json +26 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.ru.gen.js","sourceRoot":"","sources":["../../../src/i18n/generated/errors.ru.gen.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAoC;IAClE,uBAAuB,EAAE,qBAAqB;IAC9C,2BAA2B,EAAE,6DAA6D;IAC1F,4BAA4B,EAAE,wBAAwB;IACtD,yBAAyB,EAAE,2BAA2B;IACtD,uBAAuB,EAAE,qCAAqC;IAC9D,gCAAgC,EAAE,yBAAyB;IAC3D,yBAAyB,EAAE,+CAA+C;IAC1E,gCAAgC,EAAE,yCAAyC;IAC3E,4BAA4B,EAAE,gEAAgE;IAC9F,2BAA2B,EAAE,2DAA2D;IACxF,4BAA4B,EAAE,gEAAgE;IAC9F,2BAA2B,EAAE,2DAA2D;IACxF,sBAAsB,EAAE,mCAAmC;IAC3D,0BAA0B,EAAE,4BAA4B;IACxD,wBAAwB,EAAE,gDAAgD;IAC1E,yBAAyB,EAAE,uCAAuC;IAClE,6BAA6B,EAAE,4CAA4C;IAC3E,0BAA0B,EAAE,8CAA8C;IAC1E,4BAA4B,EAAE,0CAA0C;IACxE,iCAAiC,EAAE,kCAAkC;IACrE,oCAAoC,EAAE,wDAAwD;IAC9F,kCAAkC,EAAE,iDAAiD;IACrF,kCAAkC,EAAE,qDAAqD;IACzF,mCAAmC,EAAE,qCAAqC;IAC1E,+BAA+B,EAAE,iCAAiC;IAClE,kCAAkC,EAAE,6GAA6G;IACjJ,4BAA4B,EAAE,kBAAkB;IAChD,+BAA+B,EAAE,sBAAsB;IACvD,uCAAuC,EAAE,sCAAsC;IAC/E,wBAAwB,EAAE,0BAA0B;IACpD,4BAA4B,EAAE,kBAAkB;IAChD,qBAAqB,EAAE,8CAA8C;IACrE,2BAA2B,EAAE,oCAAoC;IACjE,4BAA4B,EAAE,6CAA6C;IAC3E,4CAA4C,EAAE,8CAA8C;IAC5F,iCAAiC,EAAE,mCAAmC;IACtE,wBAAwB,EAAE,uBAAuB;IACjD,qBAAqB,EAAE,8BAA8B;IACrD,4CAA4C,EAAE,6CAA6C;IAC3F,8BAA8B,EAAE,mBAAmB;IACnD,0BAA0B,EAAE,4BAA4B;IACxD,2BAA2B,EAAE,gCAAgC;IAC7D,oBAAoB,EAAE,uBAAuB;IAC7C,gBAAgB,EAAE,gCAAgC;IAClD,6BAA6B,EAAE,8BAA8B;IAC7D,kCAAkC,EAAE,6BAA6B;IACjE,gCAAgC,EAAE,sCAAsC;IACxE,kBAAkB,EAAE,qBAAqB;IACzC,+BAA+B,EAAE,+DAA+D;IAChG,sBAAsB,EAAE,2EAA2E;IACnG,6BAA6B,EAAE,8DAA8D;IAC7F,oBAAoB,EAAE,qBAAqB;IAC3C,+BAA+B,EAAE,qDAAqD;IACtF,sCAAsC,EAAE,6BAA6B;CACtE,CAAC"}
@@ -0,0 +1,107 @@
1
+ import type { I18nEngine } from "@stapel/core";
2
+ /**
3
+ * search-react's own translation KEYS (frontend-standard §4.2): headless
4
+ * components never render literal strings — hosts resolve these via core's
5
+ * i18n engine (`useT`). Backend error codes flow through the SAME contour: a
6
+ * `StapelApiError.code` is already a key, so the default bundle below ships
7
+ * English fallbacks for the 54 backend error codes (generated) plus the
8
+ * pair's own UI keys. All UI keys live under the `search.` namespace.
9
+ *
10
+ * ── What is NOT an i18n key here ───────────────────────────────────────────
11
+ *
12
+ * A FACET VALUE is not one. `facets.py` returns `{value: count}` — index
13
+ * terms, not keys. Their captions come from the category's feature schema
14
+ * (`config.options[].label`, which IS a key when `translatable_options` is
15
+ * on) and are resolved by `facetOptionLabel` through
16
+ * `@stapel/attributes-react`, i.e. through the same formatter the card and
17
+ * the spec table use. Nothing in this file names a catalogue value, because
18
+ * a catalogue is a deployment's content, not a library's chrome.
19
+ */
20
+ export declare const SEARCH_I18N_KEYS: {
21
+ readonly unknownError: "search.error.unknown";
22
+ readonly resultsTitle: "search.results.title";
23
+ readonly resultsLoading: "search.results.loading";
24
+ readonly resultsLoadFailed: "search.results.load_failed";
25
+ readonly resultsEmpty: "search.results.empty";
26
+ readonly resultsRetry: "search.results.retry";
27
+ /** "About N results" — the sentence for an ESTIMATED count. */
28
+ readonly resultsCountApproximate: "search.results.count_approximate";
29
+ /** "N results" — only when `exact_total` is true. */
30
+ readonly resultsCountExact: "search.results.count_exact";
31
+ readonly resultsTookMs: "search.results.took_ms";
32
+ readonly resultsNext: "search.results.next";
33
+ readonly resultsPrev: "search.results.prev";
34
+ readonly resultsBlockedAtEnd: "search.results.blocked.at_end";
35
+ readonly resultsBlockedAtStart: "search.results.blocked.at_start";
36
+ /** The refusal that must NOT read as "nothing found". */
37
+ readonly resultsWindowExceeded: "search.results.window_exceeded";
38
+ readonly resultsPromoted: "search.results.promoted";
39
+ readonly resultsPromotedHint: "search.results.promoted_hint";
40
+ readonly resultsDistanceKm: "search.results.distance_km";
41
+ readonly resultsUntitled: "search.results.untitled";
42
+ readonly resultsOpen: "search.results.open";
43
+ readonly sortLabel: "search.sort.label";
44
+ readonly sortRelevance: "search.sort.relevance";
45
+ readonly sortNewest: "search.sort.newest";
46
+ readonly sortPriceAsc: "search.sort.price_asc";
47
+ readonly sortPriceDesc: "search.sort.price_desc";
48
+ readonly sortDistance: "search.sort.distance";
49
+ readonly sortServerChose: "search.sort.server_chose";
50
+ readonly facetsTitle: "search.facets.title";
51
+ readonly facetsLoading: "search.facets.loading";
52
+ readonly facetsLoadFailed: "search.facets.load_failed";
53
+ readonly facetsEmpty: "search.facets.empty";
54
+ readonly facetsClear: "search.facets.clear";
55
+ readonly facetsClearAll: "search.facets.clear_all";
56
+ readonly facetsApproximate: "search.facets.approximate";
57
+ readonly facetsSkipped: "search.facets.skipped";
58
+ /** Shown INSTEAD of a count for a slug the server did not count. */
59
+ readonly facetsNotCounted: "search.facets.not_counted";
60
+ readonly facetsDrillDownHint: "search.facets.drill_down_hint";
61
+ readonly facetsRangeFrom: "search.facets.range_from";
62
+ readonly facetsRangeTo: "search.facets.range_to";
63
+ readonly facetsRangeApply: "search.facets.range_apply";
64
+ readonly geoTitle: "search.geo.title";
65
+ readonly geoRadiusKm: "search.geo.radius_km";
66
+ readonly geoClear: "search.geo.clear";
67
+ readonly geoBox: "search.geo.box";
68
+ readonly geoCenter: "search.geo.center";
69
+ readonly urlIssuesTitle: "search.url.issues_title";
70
+ readonly urlIssueNotANumber: "search.url.issue.not_a_number";
71
+ readonly urlIssueGeoIncomplete: "search.url.issue.geo_incomplete";
72
+ readonly urlIssueBboxMalformed: "search.url.issue.bbox_malformed";
73
+ readonly urlIssueRangeMalformed: "search.url.issue.range_malformed";
74
+ readonly degradedTitle: "search.degraded.title";
75
+ readonly degradedTypoTolerance: "search.degraded.typo_tolerance";
76
+ readonly degradedPhraseSynonyms: "search.degraded.phrase_synonyms";
77
+ readonly degradedExactTotal: "search.degraded.exact_total";
78
+ readonly degradedExactFacetCounts: "search.degraded.exact_facet_counts";
79
+ readonly degradedCategoryRollup: "search.degraded.category_rollup";
80
+ readonly degradedScorer: "search.degraded.scorer";
81
+ readonly degradedUnknown: "search.degraded.unknown";
82
+ readonly rankingTitle: "search.ranking.title";
83
+ readonly rankingIntro: "search.ranking.intro";
84
+ readonly rankingLoading: "search.ranking.loading";
85
+ readonly rankingLoadFailed: "search.ranking.load_failed";
86
+ readonly rankingEmpty: "search.ranking.empty";
87
+ readonly rankingParameter: "search.ranking.parameter";
88
+ readonly rankingWeight: "search.ranking.weight";
89
+ readonly rankingAppliesTo: "search.ranking.applies_to";
90
+ readonly rankingInactive: "search.ranking.inactive";
91
+ readonly rankingNotes: "search.ranking.notes";
92
+ readonly rankingLink: "search.ranking.link";
93
+ };
94
+ export type SearchI18nKey = (typeof SEARCH_I18N_KEYS)[keyof typeof SEARCH_I18N_KEYS];
95
+ /**
96
+ * English fallback bundle for search-react UI keys + backend error codes.
97
+ * The generated backend texts are spread FIRST so coverage of the error
98
+ * registry is by construction; the pair's own copy follows.
99
+ */
100
+ export declare const searchI18nBundleEn: Record<string, string>;
101
+ /**
102
+ * Register the English bundle into a core i18n engine. Locale bundles ship as
103
+ * opt-in subpaths (`@stapel/search-react/i18n/ru`, `…/es`) so a host that
104
+ * needs only English never carries them.
105
+ */
106
+ export declare function registerSearchI18n(i18n: I18nEngine): void;
107
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/i18n/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/D;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,gBAAgB;;;;;;;IAS3B,+DAA+D;;IAE/D,qDAAqD;;;;;;;IAOrD,yDAAyD;;;;;;;;;;;;;;;;;;;;;;IA0BzD,oEAAoE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2C5D,CAAC;AAEX,MAAM,MAAM,aAAa,GACvB,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA4FrD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAEzD"}
@@ -0,0 +1,185 @@
1
+ import { searchErrorBundleEn } from "./generated/errors.gen.js";
2
+ /**
3
+ * search-react's own translation KEYS (frontend-standard §4.2): headless
4
+ * components never render literal strings — hosts resolve these via core's
5
+ * i18n engine (`useT`). Backend error codes flow through the SAME contour: a
6
+ * `StapelApiError.code` is already a key, so the default bundle below ships
7
+ * English fallbacks for the 54 backend error codes (generated) plus the
8
+ * pair's own UI keys. All UI keys live under the `search.` namespace.
9
+ *
10
+ * ── What is NOT an i18n key here ───────────────────────────────────────────
11
+ *
12
+ * A FACET VALUE is not one. `facets.py` returns `{value: count}` — index
13
+ * terms, not keys. Their captions come from the category's feature schema
14
+ * (`config.options[].label`, which IS a key when `translatable_options` is
15
+ * on) and are resolved by `facetOptionLabel` through
16
+ * `@stapel/attributes-react`, i.e. through the same formatter the card and
17
+ * the spec table use. Nothing in this file names a catalogue value, because
18
+ * a catalogue is a deployment's content, not a library's chrome.
19
+ */
20
+ export const SEARCH_I18N_KEYS = {
21
+ unknownError: "search.error.unknown",
22
+ // ── results ──────────────────────────────────────────────────────────────
23
+ resultsTitle: "search.results.title",
24
+ resultsLoading: "search.results.loading",
25
+ resultsLoadFailed: "search.results.load_failed",
26
+ resultsEmpty: "search.results.empty",
27
+ resultsRetry: "search.results.retry",
28
+ /** "About N results" — the sentence for an ESTIMATED count. */
29
+ resultsCountApproximate: "search.results.count_approximate",
30
+ /** "N results" — only when `exact_total` is true. */
31
+ resultsCountExact: "search.results.count_exact",
32
+ resultsTookMs: "search.results.took_ms",
33
+ resultsNext: "search.results.next",
34
+ resultsPrev: "search.results.prev",
35
+ resultsBlockedAtEnd: "search.results.blocked.at_end",
36
+ resultsBlockedAtStart: "search.results.blocked.at_start",
37
+ /** The refusal that must NOT read as "nothing found". */
38
+ resultsWindowExceeded: "search.results.window_exceeded",
39
+ resultsPromoted: "search.results.promoted",
40
+ resultsPromotedHint: "search.results.promoted_hint",
41
+ resultsDistanceKm: "search.results.distance_km",
42
+ resultsUntitled: "search.results.untitled",
43
+ resultsOpen: "search.results.open",
44
+ // ── sort ─────────────────────────────────────────────────────────────────
45
+ sortLabel: "search.sort.label",
46
+ sortRelevance: "search.sort.relevance",
47
+ sortNewest: "search.sort.newest",
48
+ sortPriceAsc: "search.sort.price_asc",
49
+ sortPriceDesc: "search.sort.price_desc",
50
+ sortDistance: "search.sort.distance",
51
+ sortServerChose: "search.sort.server_chose",
52
+ // ── facets ───────────────────────────────────────────────────────────────
53
+ facetsTitle: "search.facets.title",
54
+ facetsLoading: "search.facets.loading",
55
+ facetsLoadFailed: "search.facets.load_failed",
56
+ facetsEmpty: "search.facets.empty",
57
+ facetsClear: "search.facets.clear",
58
+ facetsClearAll: "search.facets.clear_all",
59
+ facetsApproximate: "search.facets.approximate",
60
+ facetsSkipped: "search.facets.skipped",
61
+ /** Shown INSTEAD of a count for a slug the server did not count. */
62
+ facetsNotCounted: "search.facets.not_counted",
63
+ facetsDrillDownHint: "search.facets.drill_down_hint",
64
+ facetsRangeFrom: "search.facets.range_from",
65
+ facetsRangeTo: "search.facets.range_to",
66
+ facetsRangeApply: "search.facets.range_apply",
67
+ // ── geo ──────────────────────────────────────────────────────────────────
68
+ geoTitle: "search.geo.title",
69
+ geoRadiusKm: "search.geo.radius_km",
70
+ geoClear: "search.geo.clear",
71
+ geoBox: "search.geo.box",
72
+ geoCenter: "search.geo.center",
73
+ // ── the URL that could not be read ───────────────────────────────────────
74
+ urlIssuesTitle: "search.url.issues_title",
75
+ urlIssueNotANumber: "search.url.issue.not_a_number",
76
+ urlIssueGeoIncomplete: "search.url.issue.geo_incomplete",
77
+ urlIssueBboxMalformed: "search.url.issue.bbox_malformed",
78
+ urlIssueRangeMalformed: "search.url.issue.range_malformed",
79
+ // ── degradations (the envelope's `degraded[]`) ───────────────────────────
80
+ degradedTitle: "search.degraded.title",
81
+ degradedTypoTolerance: "search.degraded.typo_tolerance",
82
+ degradedPhraseSynonyms: "search.degraded.phrase_synonyms",
83
+ degradedExactTotal: "search.degraded.exact_total",
84
+ degradedExactFacetCounts: "search.degraded.exact_facet_counts",
85
+ degradedCategoryRollup: "search.degraded.category_rollup",
86
+ degradedScorer: "search.degraded.scorer",
87
+ degradedUnknown: "search.degraded.unknown",
88
+ // ── ranking disclosure (P2B Art. 5) ──────────────────────────────────────
89
+ rankingTitle: "search.ranking.title",
90
+ rankingIntro: "search.ranking.intro",
91
+ rankingLoading: "search.ranking.loading",
92
+ rankingLoadFailed: "search.ranking.load_failed",
93
+ rankingEmpty: "search.ranking.empty",
94
+ rankingParameter: "search.ranking.parameter",
95
+ rankingWeight: "search.ranking.weight",
96
+ rankingAppliesTo: "search.ranking.applies_to",
97
+ rankingInactive: "search.ranking.inactive",
98
+ rankingNotes: "search.ranking.notes",
99
+ rankingLink: "search.ranking.link",
100
+ };
101
+ /**
102
+ * English fallback bundle for search-react UI keys + backend error codes.
103
+ * The generated backend texts are spread FIRST so coverage of the error
104
+ * registry is by construction; the pair's own copy follows.
105
+ */
106
+ export const searchI18nBundleEn = {
107
+ ...searchErrorBundleEn,
108
+ "search.error.unknown": "Something went wrong with the search",
109
+ "search.results.title": "Results",
110
+ "search.results.loading": "Searching…",
111
+ "search.results.load_failed": "We could not run this search",
112
+ "search.results.empty": "Nothing matches this search",
113
+ "search.results.retry": "Try again",
114
+ "search.results.count_approximate": "About {count} results",
115
+ "search.results.count_exact": "{count} results",
116
+ "search.results.took_ms": "{ms} ms",
117
+ "search.results.next": "Next page",
118
+ "search.results.prev": "Previous page",
119
+ "search.results.blocked.at_end": "This is the last page",
120
+ "search.results.blocked.at_start": "This is the first page",
121
+ "search.results.window_exceeded": "This page is deeper than the search can go. Narrow the search instead of paging further.",
122
+ "search.results.promoted": "Promoted",
123
+ "search.results.promoted_hint": "This placement is paid for. It is marked because the law requires it, and it does not change what the other results are.",
124
+ "search.results.distance_km": "{km} km away",
125
+ "search.results.untitled": "Untitled",
126
+ "search.results.open": "Open",
127
+ "search.sort.label": "Sort",
128
+ "search.sort.relevance": "Most relevant",
129
+ "search.sort.newest": "Newest first",
130
+ "search.sort.price_asc": "Price: low to high",
131
+ "search.sort.price_desc": "Price: high to low",
132
+ "search.sort.distance": "Nearest first",
133
+ "search.sort.server_chose": "Sorted by {sort}",
134
+ "search.facets.title": "Filters",
135
+ "search.facets.loading": "Loading filters…",
136
+ "search.facets.load_failed": "We could not load the filters",
137
+ "search.facets.empty": "This search offers no filters",
138
+ "search.facets.clear": "Clear",
139
+ "search.facets.clear_all": "Clear all filters ({count})",
140
+ "search.facets.approximate": "Counts are approximate — there were too many candidates to count them all.",
141
+ "search.facets.skipped": "These filters were not counted for this search: {slugs}",
142
+ "search.facets.not_counted": "not counted",
143
+ "search.facets.drill_down_hint": "Each count is what you would get by choosing that value instead of the one you have.",
144
+ "search.facets.range_from": "From",
145
+ "search.facets.range_to": "To",
146
+ "search.facets.range_apply": "Apply",
147
+ "search.geo.title": "Location",
148
+ "search.geo.radius_km": "Within {km} km",
149
+ "search.geo.clear": "Anywhere",
150
+ "search.geo.box": "Inside the shown area",
151
+ "search.geo.center": "Around {lat}, {lon}",
152
+ "search.url.issues_title": "Part of this link could not be read",
153
+ "search.url.issue.not_a_number": "{param} is not a number and was ignored",
154
+ "search.url.issue.geo_incomplete": "the location needs both lat and lon, so it was ignored",
155
+ "search.url.issue.bbox_malformed": "the area needs four numbers (minLat,minLon,maxLat,maxLon) and was ignored",
156
+ "search.url.issue.range_malformed": "{param} is not a from..to range and was ignored",
157
+ "search.degraded.title": "What this search could not do",
158
+ "search.degraded.typo_tolerance": "Typos were not corrected — the search engine in use cannot do it.",
159
+ "search.degraded.phrase_synonyms": "Synonyms were not expanded — the search engine in use cannot do it.",
160
+ "search.degraded.exact_total": "The number of results is an estimate.",
161
+ "search.degraded.exact_facet_counts": "The filter counts are approximate.",
162
+ "search.degraded.category_rollup": "Subcategories may be missing from these results — the category service did not answer.",
163
+ "search.degraded.scorer": "The ranking parameter “{scorer}” was not applied — the search engine in use cannot evaluate it.",
164
+ "search.degraded.unknown": "The search engine reported a limitation this page has no wording for: {raw}",
165
+ "search.ranking.title": "How these results are ordered",
166
+ "search.ranking.intro": "These are the parameters that determine the order of the results, with their relative weight.",
167
+ "search.ranking.loading": "Loading the ranking disclosure…",
168
+ "search.ranking.load_failed": "We could not load the ranking disclosure",
169
+ "search.ranking.empty": "This deployment declares no ranking parameters",
170
+ "search.ranking.parameter": "Parameter",
171
+ "search.ranking.weight": "Weight",
172
+ "search.ranking.applies_to": "Applies to",
173
+ "search.ranking.inactive": "Not applied: {reason}",
174
+ "search.ranking.notes": "Notes",
175
+ "search.ranking.link": "How these results are ordered",
176
+ };
177
+ /**
178
+ * Register the English bundle into a core i18n engine. Locale bundles ship as
179
+ * opt-in subpaths (`@stapel/search-react/i18n/ru`, `…/es`) so a host that
180
+ * needs only English never carries them.
181
+ */
182
+ export function registerSearchI18n(i18n) {
183
+ i18n.registerBundle("en", searchI18nBundleEn);
184
+ }
185
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/i18n/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { I18nDictionary, I18nEngine } from "@stapel/core";
2
+ export { searchErrorBundleRu } from "./generated/errors.ru.gen.js";
3
+ /**
4
+ * Russian bundle for search-react — the pair's `ru` locale, shipped as the
5
+ * `@stapel/search-react/i18n/ru` subpath (i18n-shipping.md §2) so the locale
6
+ * is opt-in: hosts that don't register it never carry these strings (the main
7
+ * entry does not import this module — gated by size-limit + the bundle-purity
8
+ * test).
9
+ *
10
+ * This is the storefront's DEFAULT language (darom-storefront verdict F1:
11
+ * ru-first), which is why it is the fullest of the three bundles and why the
12
+ * wording is checked against what a marketplace visitor is actually being
13
+ * told — "counts are approximate" has to sound like an explanation, not an
14
+ * apology.
15
+ *
16
+ * Composition mirrors `searchI18nBundleEn`: the GENERATED backend error texts
17
+ * (stapel-search's `translations/errors.ru.json` merged under stapel-core's
18
+ * cross-cutting catalogue — `pnpm gen:errors`) are spread first for coverage
19
+ * by construction; the ru UI copy follows.
20
+ *
21
+ * PROVENANCE, stated rather than implied: the backend catalogues ship
22
+ * `origin=seed:authored` and are UNREVIEWED; the pair-authored strings below
23
+ * are the same grade. Neither is a claim of review.
24
+ */
25
+ export declare const searchI18nBundleRu: I18nDictionary;
26
+ /** Register the ru bundle. Call AFTER `registerSearchI18n` so it layers over
27
+ * the en floor (merge priority = registration order). */
28
+ export declare function registerSearchI18nRu(engine: I18nEngine): void;
29
+ //# sourceMappingURL=ru.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ru.d.ts","sourceRoot":"","sources":["../../src/i18n/ru.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,kBAAkB,EAAE,cA4FhC,CAAC;AAEF;yDACyD;AACzD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAE7D"}
@@ -0,0 +1,101 @@
1
+ import { searchErrorBundleRu } from "./generated/errors.ru.gen.js";
2
+ export { searchErrorBundleRu } from "./generated/errors.ru.gen.js";
3
+ /**
4
+ * Russian bundle for search-react — the pair's `ru` locale, shipped as the
5
+ * `@stapel/search-react/i18n/ru` subpath (i18n-shipping.md §2) so the locale
6
+ * is opt-in: hosts that don't register it never carry these strings (the main
7
+ * entry does not import this module — gated by size-limit + the bundle-purity
8
+ * test).
9
+ *
10
+ * This is the storefront's DEFAULT language (darom-storefront verdict F1:
11
+ * ru-first), which is why it is the fullest of the three bundles and why the
12
+ * wording is checked against what a marketplace visitor is actually being
13
+ * told — "counts are approximate" has to sound like an explanation, not an
14
+ * apology.
15
+ *
16
+ * Composition mirrors `searchI18nBundleEn`: the GENERATED backend error texts
17
+ * (stapel-search's `translations/errors.ru.json` merged under stapel-core's
18
+ * cross-cutting catalogue — `pnpm gen:errors`) are spread first for coverage
19
+ * by construction; the ru UI copy follows.
20
+ *
21
+ * PROVENANCE, stated rather than implied: the backend catalogues ship
22
+ * `origin=seed:authored` and are UNREVIEWED; the pair-authored strings below
23
+ * are the same grade. Neither is a claim of review.
24
+ */
25
+ export const searchI18nBundleRu = {
26
+ ...searchErrorBundleRu,
27
+ "search.error.unknown": "Что-то пошло не так при поиске.",
28
+ "search.results.title": "Результаты",
29
+ "search.results.loading": "Ищем…",
30
+ "search.results.load_failed": "Не удалось выполнить поиск.",
31
+ "search.results.empty": "По этому запросу ничего не нашлось.",
32
+ "search.results.retry": "Повторить",
33
+ "search.results.count_approximate": "Примерно {count} объявлений",
34
+ "search.results.count_exact": "{count} объявлений",
35
+ "search.results.took_ms": "{ms} мс",
36
+ "search.results.next": "Следующая страница",
37
+ "search.results.prev": "Предыдущая страница",
38
+ "search.results.blocked.at_end": "Это последняя страница",
39
+ "search.results.blocked.at_start": "Это первая страница",
40
+ "search.results.window_exceeded": "Эта страница глубже, чем поиск умеет выдавать. Уточните запрос вместо перелистывания.",
41
+ "search.results.promoted": "Продвигается",
42
+ "search.results.promoted_hint": "Это платное размещение. Мы помечаем его, потому что так требует закон; на остальные результаты это не влияет.",
43
+ "search.results.distance_km": "{km} км от вас",
44
+ "search.results.untitled": "Без названия",
45
+ "search.results.open": "Открыть",
46
+ "search.sort.label": "Сортировка",
47
+ "search.sort.relevance": "По релевантности",
48
+ "search.sort.newest": "Сначала новые",
49
+ "search.sort.price_asc": "Сначала дешевле",
50
+ "search.sort.price_desc": "Сначала дороже",
51
+ "search.sort.distance": "Сначала ближние",
52
+ "search.sort.server_chose": "Отсортировано: {sort}",
53
+ "search.facets.title": "Фильтры",
54
+ "search.facets.loading": "Загружаем фильтры…",
55
+ "search.facets.load_failed": "Не удалось загрузить фильтры.",
56
+ "search.facets.empty": "Для этого поиска фильтров нет.",
57
+ "search.facets.clear": "Сбросить",
58
+ "search.facets.clear_all": "Сбросить все фильтры ({count})",
59
+ "search.facets.approximate": "Счётчики приблизительные — подходящих объявлений слишком много, чтобы пересчитать все.",
60
+ "search.facets.skipped": "Эти фильтры для текущего поиска не посчитаны: {slugs}",
61
+ "search.facets.not_counted": "не посчитано",
62
+ "search.facets.drill_down_hint": "Рядом с каждым значением — сколько будет, если выбрать его вместо текущего.",
63
+ "search.facets.range_from": "От",
64
+ "search.facets.range_to": "До",
65
+ "search.facets.range_apply": "Применить",
66
+ "search.geo.title": "Где искать",
67
+ "search.geo.radius_km": "В радиусе {km} км",
68
+ "search.geo.clear": "Везде",
69
+ "search.geo.box": "В показанной области",
70
+ "search.geo.center": "Рядом с {lat}, {lon}",
71
+ "search.url.issues_title": "Часть этой ссылки прочитать не удалось",
72
+ "search.url.issue.not_a_number": "{param} — не число, параметр пропущен",
73
+ "search.url.issue.geo_incomplete": "для точки нужны и lat, и lon — параметр пропущен",
74
+ "search.url.issue.bbox_malformed": "для области нужны четыре числа (minLat,minLon,maxLat,maxLon) — параметр пропущен",
75
+ "search.url.issue.range_malformed": "{param} — не диапазон вида from..to, параметр пропущен",
76
+ "search.degraded.title": "Что этот поиск не смог сделать",
77
+ "search.degraded.typo_tolerance": "Опечатки не исправлялись — используемый поисковый движок этого не умеет.",
78
+ "search.degraded.phrase_synonyms": "Синонимы не подставлялись — используемый поисковый движок этого не умеет.",
79
+ "search.degraded.exact_total": "Число результатов — оценка, а не точный счёт.",
80
+ "search.degraded.exact_facet_counts": "Счётчики фильтров приблизительные.",
81
+ "search.degraded.category_rollup": "В выдаче могут отсутствовать подкатегории — сервис категорий не ответил.",
82
+ "search.degraded.scorer": "Параметр ранжирования «{scorer}» не применялся — используемый движок не умеет его считать.",
83
+ "search.degraded.unknown": "Поиск сообщил об ограничении, для которого у этой страницы нет формулировки: {raw}",
84
+ "search.ranking.title": "Как упорядочены результаты",
85
+ "search.ranking.intro": "Ниже — параметры, которые определяют порядок выдачи, и их относительный вес.",
86
+ "search.ranking.loading": "Загружаем раскрытие ранжирования…",
87
+ "search.ranking.load_failed": "Не удалось загрузить раскрытие ранжирования.",
88
+ "search.ranking.empty": "В этой установке параметры ранжирования не объявлены.",
89
+ "search.ranking.parameter": "Параметр",
90
+ "search.ranking.weight": "Вес",
91
+ "search.ranking.applies_to": "Применяется к",
92
+ "search.ranking.inactive": "Не применяется: {reason}",
93
+ "search.ranking.notes": "Примечания",
94
+ "search.ranking.link": "Как упорядочены результаты",
95
+ };
96
+ /** Register the ru bundle. Call AFTER `registerSearchI18n` so it layers over
97
+ * the en floor (merge priority = registration order). */
98
+ export function registerSearchI18nRu(engine) {
99
+ engine.registerBundle("ru", searchI18nBundleRu);
100
+ }
101
+ //# sourceMappingURL=ru.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ru.js","sourceRoot":"","sources":["../../src/i18n/ru.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,GAAG,mBAAmB;IAEtB,sBAAsB,EAAE,iCAAiC;IAEzD,sBAAsB,EAAE,YAAY;IACpC,wBAAwB,EAAE,OAAO;IACjC,4BAA4B,EAAE,6BAA6B;IAC3D,sBAAsB,EAAE,qCAAqC;IAC7D,sBAAsB,EAAE,WAAW;IACnC,kCAAkC,EAAE,6BAA6B;IACjE,4BAA4B,EAAE,oBAAoB;IAClD,wBAAwB,EAAE,SAAS;IACnC,qBAAqB,EAAE,oBAAoB;IAC3C,qBAAqB,EAAE,qBAAqB;IAC5C,+BAA+B,EAAE,wBAAwB;IACzD,iCAAiC,EAAE,qBAAqB;IACxD,gCAAgC,EAC9B,uFAAuF;IACzF,yBAAyB,EAAE,cAAc;IACzC,8BAA8B,EAC5B,+GAA+G;IACjH,4BAA4B,EAAE,gBAAgB;IAC9C,yBAAyB,EAAE,cAAc;IACzC,qBAAqB,EAAE,SAAS;IAEhC,mBAAmB,EAAE,YAAY;IACjC,uBAAuB,EAAE,kBAAkB;IAC3C,oBAAoB,EAAE,eAAe;IACrC,uBAAuB,EAAE,iBAAiB;IAC1C,wBAAwB,EAAE,gBAAgB;IAC1C,sBAAsB,EAAE,iBAAiB;IACzC,0BAA0B,EAAE,uBAAuB;IAEnD,qBAAqB,EAAE,SAAS;IAChC,uBAAuB,EAAE,oBAAoB;IAC7C,2BAA2B,EAAE,+BAA+B;IAC5D,qBAAqB,EAAE,gCAAgC;IACvD,qBAAqB,EAAE,UAAU;IACjC,yBAAyB,EAAE,gCAAgC;IAC3D,2BAA2B,EACzB,wFAAwF;IAC1F,uBAAuB,EACrB,uDAAuD;IACzD,2BAA2B,EAAE,cAAc;IAC3C,+BAA+B,EAC7B,6EAA6E;IAC/E,0BAA0B,EAAE,IAAI;IAChC,wBAAwB,EAAE,IAAI;IAC9B,2BAA2B,EAAE,WAAW;IAExC,kBAAkB,EAAE,YAAY;IAChC,sBAAsB,EAAE,mBAAmB;IAC3C,kBAAkB,EAAE,OAAO;IAC3B,gBAAgB,EAAE,sBAAsB;IACxC,mBAAmB,EAAE,sBAAsB;IAE3C,yBAAyB,EAAE,wCAAwC;IACnE,+BAA+B,EAAE,uCAAuC;IACxE,iCAAiC,EAC/B,kDAAkD;IACpD,iCAAiC,EAC/B,kFAAkF;IACpF,kCAAkC,EAChC,wDAAwD;IAE1D,uBAAuB,EAAE,gCAAgC;IACzD,gCAAgC,EAC9B,0EAA0E;IAC5E,iCAAiC,EAC/B,2EAA2E;IAC7E,6BAA6B,EAAE,+CAA+C;IAC9E,oCAAoC,EAAE,oCAAoC;IAC1E,iCAAiC,EAC/B,0EAA0E;IAC5E,wBAAwB,EACtB,4FAA4F;IAC9F,yBAAyB,EACvB,oFAAoF;IAEtF,sBAAsB,EAAE,4BAA4B;IACpD,sBAAsB,EACpB,8EAA8E;IAChF,wBAAwB,EAAE,mCAAmC;IAC7D,4BAA4B,EAAE,8CAA8C;IAC5E,sBAAsB,EAAE,uDAAuD;IAC/E,0BAA0B,EAAE,UAAU;IACtC,uBAAuB,EAAE,KAAK;IAC9B,2BAA2B,EAAE,eAAe;IAC5C,yBAAyB,EAAE,0BAA0B;IACrD,sBAAsB,EAAE,YAAY;IACpC,qBAAqB,EAAE,4BAA4B;CACpD,CAAC;AAEF;yDACyD;AACzD,MAAM,UAAU,oBAAoB,CAAC,MAAkB;IACrD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * `@stapel/search-react` — the headless React pair for stapel-search
3
+ * (frontend-standard §2). Business + state only, zero visual opinion; the
4
+ * antd skin lives behind the `./default` subpath and the react-router binding
5
+ * behind `./router`, so a host that renders its own visuals carries neither.
6
+ *
7
+ * ── The one-liner ──────────────────────────────────────────────────────────
8
+ *
9
+ * ```tsx
10
+ * const runtime = createSearchRuntime({ baseUrl: "/search/api/v1/" });
11
+ * <SearchProvider runtime={runtime}>
12
+ * <SearchPage adapter={useRouterSearchParams()} defaultType="listing" />
13
+ * </SearchProvider>
14
+ * ```
15
+ *
16
+ * No session, no workspace id, no auth client: every endpoint this pair calls
17
+ * is `AllowAny`, so a storefront's catalogue renders for a visitor who will
18
+ * never sign in.
19
+ *
20
+ * ── The three properties this pair exists to guarantee ─────────────────────
21
+ *
22
+ * 1. **The URL is the state.** Text, category, facet filters, ranges, geo,
23
+ * sort, page size and the keyset cursor all live in the query string,
24
+ * under the BACKEND's own parameter names, and no component keeps a second
25
+ * copy. Copying the address into another tab reproduces the page; Back
26
+ * removes the last filter; a reload loses nothing. See `state/urlState.ts`.
27
+ * 2. **The server's honesty survives to the screen.** `facet_meta.approximate`,
28
+ * `facet_meta.skipped`, `exact_total` and `degraded[]` are parsed and
29
+ * surfaced, never swallowed. A skipped facet's options carry `count: null`,
30
+ * not `0` — "we did not count this" and "there are none" are different
31
+ * sentences.
32
+ * 3. **`promoted` is carried, not optional.** DSA Art. 26 marking rides every
33
+ * item under every sort; the card slot receives the whole item and the
34
+ * default card renders the tag. The P2B Art. 5 ranking disclosure ships as
35
+ * a headless bag and a page.
36
+ *
37
+ * Layers: api → model → state → headless → i18n. Generated surfaces (the
38
+ * typed schema, the error map, the manifest, the nav manifest, llms.txt) are
39
+ * produced by the monorepo `gen:*` drivers from stapel-search's own `docs/`
40
+ * artifacts and stand under drift gates.
41
+ */
42
+ export { createSearchApi, searchQueryParams } from "./api/searchApi.js";
43
+ export type { SearchApi } from "./api/searchApi.js";
44
+ export type { Schemas } from "./api/types.js";
45
+ export { SEARCH_SORTS } from "./api/types.js";
46
+ export type { FacetMeta, FacetSelection, RankingResponse, Scorer, SearchDegradation, SearchDegradationKind, SearchGeo, SearchGeoBox, SearchGeoCenter, SearchItem, SearchQueryState, SearchRange, SearchResponse, SuggestParams, SuggestResponse, } from "./api/types.js";
47
+ export { FILTER_PREFIX, RANGE_PREFIX, SEARCH_PARAM, activeFilterCount, clearFilters, ownsParam, parseSearchState, patchSearchState, setFilterValues, setRangeValue, toggleFilterValue, writeSearchState, } from "./state/urlState.js";
48
+ export type { ParseSearchStateOptions, ParsedSearchState, SearchStateIssue, SearchStateIssueCode, SearchStatePatch, } from "./state/urlState.js";
49
+ export { countIsEstimate, degradationMessageKey, parseDegradations } from "./state/degradations.js";
50
+ export { buildFacetGroups, facetOptionLabel } from "./state/facets.js";
51
+ export type { BuildFacetGroupsInput, FacetGroup, FacetOption, } from "./state/facets.js";
52
+ export { createSearchRuntime } from "./model/runtime.js";
53
+ export type { SearchRuntime, CreateSearchRuntimeOptions, } from "./model/runtime.js";
54
+ export { SearchRuntimeContext, useSearchRuntime, useSearchApi, useSearchAnalytics, } from "./model/context.js";
55
+ export { searchQueryKeys } from "./model/queryKeys.js";
56
+ export type { SearchQueryKeyParams } from "./model/queryKeys.js";
57
+ export { useRankingDisclosure, useSearchQuery } from "./model/queries.js";
58
+ export { SearchProvider } from "./headless/SearchProvider.js";
59
+ export { SearchStateProvider, useSearchState } from "./headless/SearchStateProvider.js";
60
+ export type { SearchParamsAdapter, SearchStateBag, SearchStateProviderProps, } from "./headless/SearchStateProvider.js";
61
+ export { SearchResults } from "./headless/SearchResults.js";
62
+ export type { SearchPageInfo, SearchResultsBag } from "./headless/SearchResults.js";
63
+ export { FacetPanel } from "./headless/FacetPanel.js";
64
+ export type { FacetPanelBag } from "./headless/FacetPanel.js";
65
+ export { RankingDisclosure } from "./headless/RankingDisclosure.js";
66
+ export type { RankingDisclosureBag } from "./headless/RankingDisclosure.js";
67
+ export { navEntries } from "./nav/manifest.js";
68
+ export { SEARCH_I18N_KEYS, searchI18nBundleEn, registerSearchI18n, } from "./i18n/keys.js";
69
+ export type { SearchI18nKey } from "./i18n/keys.js";
70
+ export { SEARCH_ERRORS, SEARCH_ERROR_CODES, SEARCH_BACKEND_UNAVAILABLE, SEARCH_WINDOW_EXCEEDED, searchErrorBundleEn, explainSearchError, } from "./i18n/errorsMap.js";
71
+ export type { SearchErrorCode, SearchErrorSpec, Remediation, } from "./i18n/errorsMap.js";
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAGH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACxE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,YAAY,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,MAAM,EACN,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EACT,YAAY,EACZ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,aAAa,EACb,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEpG,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,YAAY,EACV,qBAAqB,EACrB,UAAU,EACV,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EACV,aAAa,EACb,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAG1E,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxF,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,wBAAwB,GACzB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAG5E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,eAAe,EACf,eAAe,EACf,WAAW,GACZ,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,66 @@
1
+ /**
2
+ * `@stapel/search-react` — the headless React pair for stapel-search
3
+ * (frontend-standard §2). Business + state only, zero visual opinion; the
4
+ * antd skin lives behind the `./default` subpath and the react-router binding
5
+ * behind `./router`, so a host that renders its own visuals carries neither.
6
+ *
7
+ * ── The one-liner ──────────────────────────────────────────────────────────
8
+ *
9
+ * ```tsx
10
+ * const runtime = createSearchRuntime({ baseUrl: "/search/api/v1/" });
11
+ * <SearchProvider runtime={runtime}>
12
+ * <SearchPage adapter={useRouterSearchParams()} defaultType="listing" />
13
+ * </SearchProvider>
14
+ * ```
15
+ *
16
+ * No session, no workspace id, no auth client: every endpoint this pair calls
17
+ * is `AllowAny`, so a storefront's catalogue renders for a visitor who will
18
+ * never sign in.
19
+ *
20
+ * ── The three properties this pair exists to guarantee ─────────────────────
21
+ *
22
+ * 1. **The URL is the state.** Text, category, facet filters, ranges, geo,
23
+ * sort, page size and the keyset cursor all live in the query string,
24
+ * under the BACKEND's own parameter names, and no component keeps a second
25
+ * copy. Copying the address into another tab reproduces the page; Back
26
+ * removes the last filter; a reload loses nothing. See `state/urlState.ts`.
27
+ * 2. **The server's honesty survives to the screen.** `facet_meta.approximate`,
28
+ * `facet_meta.skipped`, `exact_total` and `degraded[]` are parsed and
29
+ * surfaced, never swallowed. A skipped facet's options carry `count: null`,
30
+ * not `0` — "we did not count this" and "there are none" are different
31
+ * sentences.
32
+ * 3. **`promoted` is carried, not optional.** DSA Art. 26 marking rides every
33
+ * item under every sort; the card slot receives the whole item and the
34
+ * default card renders the tag. The P2B Art. 5 ranking disclosure ships as
35
+ * a headless bag and a page.
36
+ *
37
+ * Layers: api → model → state → headless → i18n. Generated surfaces (the
38
+ * typed schema, the error map, the manifest, the nav manifest, llms.txt) are
39
+ * produced by the monorepo `gen:*` drivers from stapel-search's own `docs/`
40
+ * artifacts and stand under drift gates.
41
+ */
42
+ // ── api ──────────────────────────────────────────────────────────────────────
43
+ export { createSearchApi, searchQueryParams } from "./api/searchApi.js";
44
+ export { SEARCH_SORTS } from "./api/types.js";
45
+ // ── state (pure: no React, no router) ────────────────────────────────────────
46
+ export { FILTER_PREFIX, RANGE_PREFIX, SEARCH_PARAM, activeFilterCount, clearFilters, ownsParam, parseSearchState, patchSearchState, setFilterValues, setRangeValue, toggleFilterValue, writeSearchState, } from "./state/urlState.js";
47
+ export { countIsEstimate, degradationMessageKey, parseDegradations } from "./state/degradations.js";
48
+ export { buildFacetGroups, facetOptionLabel } from "./state/facets.js";
49
+ // ── model (runtime wiring, query keys, context, hooks) ───────────────────────
50
+ export { createSearchRuntime } from "./model/runtime.js";
51
+ export { SearchRuntimeContext, useSearchRuntime, useSearchApi, useSearchAnalytics, } from "./model/context.js";
52
+ export { searchQueryKeys } from "./model/queryKeys.js";
53
+ export { useRankingDisclosure, useSearchQuery } from "./model/queries.js";
54
+ // ── headless (renderless components) ─────────────────────────────────────────
55
+ export { SearchProvider } from "./headless/SearchProvider.js";
56
+ export { SearchStateProvider, useSearchState } from "./headless/SearchStateProvider.js";
57
+ export { SearchResults } from "./headless/SearchResults.js";
58
+ export { FacetPanel } from "./headless/FacetPanel.js";
59
+ export { RankingDisclosure } from "./headless/RankingDisclosure.js";
60
+ // ── nav manifest (the pair's public surface declaration) ─────────────────────
61
+ export { navEntries } from "./nav/manifest.js";
62
+ // ── i18n ─────────────────────────────────────────────────────────────────────
63
+ export { SEARCH_I18N_KEYS, searchI18nBundleEn, registerSearchI18n, } from "./i18n/keys.js";
64
+ // ── errors map (code → status/params/remediation/en; generated) ──────────────
65
+ export { SEARCH_ERRORS, SEARCH_ERROR_CODES, SEARCH_BACKEND_UNAVAILABLE, SEARCH_WINDOW_EXCEEDED, searchErrorBundleEn, explainSearchError, } from "./i18n/errorsMap.js";
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,gFAAgF;AAChF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGxE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAmB9C,gFAAgF;AAChF,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEpG,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAOvE,gFAAgF;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAKzD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE1E,gFAAgF;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAMxF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGpE,gFAAgF;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,gFAAgF;AAChF,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAGxB,gFAAgF;AAChF,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Context } from "react";
2
+ import type { Analytics, ModuleContextKit } from "@stapel/core";
3
+ import type { SearchApi } from "../api/searchApi.js";
4
+ import type { SearchRuntime } from "./runtime.js";
5
+ export declare const SearchRuntimeContext: Context<SearchRuntime | null>;
6
+ export declare const useSearchRuntime: () => SearchRuntime;
7
+ export declare const useSearchApi: () => SearchApi;
8
+ export declare const useSearchAnalytics: () => Analytics | null;
9
+ /** @internal Re-exported as `<SearchProvider>` from `headless/`. */
10
+ export declare const ModuleProvider: ModuleContextKit<SearchRuntime>["Provider"];
11
+ //# sourceMappingURL=context.d.ts.map