@stapel/search-react 0.3.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/CHANGELOG.md +180 -0
  2. package/MODULE.md +43 -4
  3. package/README.md +1 -1
  4. package/dist/api/generated/schema.d.ts +5 -1
  5. package/dist/api/generated/schema.d.ts.map +1 -1
  6. package/dist/default/DegradationNotice.d.ts +34 -0
  7. package/dist/default/DegradationNotice.d.ts.map +1 -1
  8. package/dist/default/DegradationNotice.js +28 -6
  9. package/dist/default/DegradationNotice.js.map +1 -1
  10. package/dist/default/FacetPanelPane.d.ts +54 -3
  11. package/dist/default/FacetPanelPane.d.ts.map +1 -1
  12. package/dist/default/FacetPanelPane.js +119 -19
  13. package/dist/default/FacetPanelPane.js.map +1 -1
  14. package/dist/default/LanguageSelect.d.ts +9 -0
  15. package/dist/default/LanguageSelect.d.ts.map +1 -0
  16. package/dist/default/LanguageSelect.js +72 -0
  17. package/dist/default/LanguageSelect.js.map +1 -0
  18. package/dist/default/PageSizeSelect.d.ts +29 -0
  19. package/dist/default/PageSizeSelect.d.ts.map +1 -0
  20. package/dist/default/PageSizeSelect.js +25 -0
  21. package/dist/default/PageSizeSelect.js.map +1 -0
  22. package/dist/default/RangeFilterRow.d.ts +12 -0
  23. package/dist/default/RangeFilterRow.d.ts.map +1 -0
  24. package/dist/default/RangeFilterRow.js +75 -0
  25. package/dist/default/RangeFilterRow.js.map +1 -0
  26. package/dist/default/RankingDisclosurePane.d.ts +5 -0
  27. package/dist/default/RankingDisclosurePane.d.ts.map +1 -1
  28. package/dist/default/RankingDisclosurePane.js +15 -15
  29. package/dist/default/RankingDisclosurePane.js.map +1 -1
  30. package/dist/default/SearchBox.d.ts +13 -0
  31. package/dist/default/SearchBox.d.ts.map +1 -0
  32. package/dist/default/SearchBox.js +67 -0
  33. package/dist/default/SearchBox.js.map +1 -0
  34. package/dist/default/SearchPage.d.ts +58 -16
  35. package/dist/default/SearchPage.d.ts.map +1 -1
  36. package/dist/default/SearchPage.js +155 -6
  37. package/dist/default/SearchPage.js.map +1 -1
  38. package/dist/default/SearchResultCard.d.ts +19 -18
  39. package/dist/default/SearchResultCard.d.ts.map +1 -1
  40. package/dist/default/SearchResultCard.js +178 -5
  41. package/dist/default/SearchResultCard.js.map +1 -1
  42. package/dist/default/SearchResultsPane.d.ts +54 -3
  43. package/dist/default/SearchResultsPane.d.ts.map +1 -1
  44. package/dist/default/SearchResultsPane.js +45 -25
  45. package/dist/default/SearchResultsPane.js.map +1 -1
  46. package/dist/default/SortSelect.d.ts +10 -2
  47. package/dist/default/SortSelect.d.ts.map +1 -1
  48. package/dist/default/SortSelect.js +27 -24
  49. package/dist/default/SortSelect.js.map +1 -1
  50. package/dist/default/UrlIssueNotice.d.ts.map +1 -1
  51. package/dist/default/UrlIssueNotice.js +19 -1
  52. package/dist/default/UrlIssueNotice.js.map +1 -1
  53. package/dist/default/index.d.ts +33 -16
  54. package/dist/default/index.d.ts.map +1 -1
  55. package/dist/default/index.js +26 -12
  56. package/dist/default/index.js.map +1 -1
  57. package/dist/default/sortLabels.d.ts +5 -0
  58. package/dist/default/sortLabels.d.ts.map +1 -0
  59. package/dist/default/sortLabels.js +32 -0
  60. package/dist/default/sortLabels.js.map +1 -0
  61. package/dist/headless/FacetPanel.d.ts +17 -0
  62. package/dist/headless/FacetPanel.d.ts.map +1 -1
  63. package/dist/headless/FacetPanel.js +23 -2
  64. package/dist/headless/FacetPanel.js.map +1 -1
  65. package/dist/headless/SearchResults.d.ts +20 -3
  66. package/dist/headless/SearchResults.d.ts.map +1 -1
  67. package/dist/headless/SearchResults.js +3 -1
  68. package/dist/headless/SearchResults.js.map +1 -1
  69. package/dist/headless/useAppliedCount.d.ts +8 -0
  70. package/dist/headless/useAppliedCount.d.ts.map +1 -0
  71. package/dist/headless/useAppliedCount.js +30 -0
  72. package/dist/headless/useAppliedCount.js.map +1 -0
  73. package/dist/headless/useScorerNames.d.ts +4 -0
  74. package/dist/headless/useScorerNames.d.ts.map +1 -0
  75. package/dist/headless/useScorerNames.js +34 -0
  76. package/dist/headless/useScorerNames.js.map +1 -0
  77. package/dist/headless/useSearchBox.d.ts +44 -0
  78. package/dist/headless/useSearchBox.d.ts.map +1 -0
  79. package/dist/headless/useSearchBox.js +116 -0
  80. package/dist/headless/useSearchBox.js.map +1 -0
  81. package/dist/i18n/es.d.ts.map +1 -1
  82. package/dist/i18n/es.js +32 -4
  83. package/dist/i18n/es.js.map +1 -1
  84. package/dist/i18n/keys.d.ts +46 -2
  85. package/dist/i18n/keys.d.ts.map +1 -1
  86. package/dist/i18n/keys.js +86 -6
  87. package/dist/i18n/keys.js.map +1 -1
  88. package/dist/i18n/ru.d.ts.map +1 -1
  89. package/dist/i18n/ru.js +38 -4
  90. package/dist/i18n/ru.js.map +1 -1
  91. package/dist/index.d.ts +9 -3
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +6 -3
  94. package/dist/index.js.map +1 -1
  95. package/dist/model/queries.d.ts +26 -2
  96. package/dist/model/queries.d.ts.map +1 -1
  97. package/dist/model/queries.js +38 -1
  98. package/dist/model/queries.js.map +1 -1
  99. package/dist/state/degradations.d.ts +41 -0
  100. package/dist/state/degradations.d.ts.map +1 -1
  101. package/dist/state/degradations.js +41 -0
  102. package/dist/state/degradations.js.map +1 -1
  103. package/dist/state/limits.d.ts +44 -0
  104. package/dist/state/limits.d.ts.map +1 -0
  105. package/dist/state/limits.js +44 -0
  106. package/dist/state/limits.js.map +1 -0
  107. package/dist/state/ranges.d.ts +52 -0
  108. package/dist/state/ranges.d.ts.map +1 -0
  109. package/dist/state/ranges.js +108 -0
  110. package/dist/state/ranges.js.map +1 -0
  111. package/llms.txt +16 -5
  112. package/manifest.json +245 -22
  113. package/nav-manifest.json +1 -1
  114. package/package.json +15 -10
  115. package/src/analytics/generated/events.json +1 -1
  116. package/src/api/generated/schema.ts +5 -1
  117. package/src/default/DegradationNotice.tsx +84 -14
  118. package/src/default/FacetPanelPane.tsx +343 -64
  119. package/src/default/LanguageSelect.tsx +93 -0
  120. package/src/default/PageSizeSelect.tsx +80 -0
  121. package/src/default/RangeFilterRow.tsx +148 -0
  122. package/src/default/RankingDisclosurePane.tsx +67 -35
  123. package/src/default/SearchBox.tsx +130 -0
  124. package/src/default/SearchPage.tsx +356 -41
  125. package/src/default/SearchResultCard.tsx +231 -24
  126. package/src/default/SearchResultsPane.tsx +147 -76
  127. package/src/default/SortSelect.tsx +50 -37
  128. package/src/default/UrlIssueNotice.tsx +21 -3
  129. package/src/default/index.ts +42 -16
  130. package/src/default/sortLabels.ts +34 -0
  131. package/src/headless/FacetPanel.tsx +30 -2
  132. package/src/headless/SearchResults.tsx +32 -4
  133. package/src/headless/useAppliedCount.ts +41 -0
  134. package/src/headless/useScorerNames.ts +36 -0
  135. package/src/headless/useSearchBox.ts +189 -0
  136. package/src/i18n/es.ts +39 -4
  137. package/src/i18n/keys.ts +97 -6
  138. package/src/i18n/ru.ts +45 -4
  139. package/src/index.ts +30 -3
  140. package/src/model/queries.ts +51 -1
  141. package/src/state/degradations.ts +60 -0
  142. package/src/state/limits.ts +50 -0
  143. package/src/state/ranges.ts +144 -0
  144. package/dist/default/ErrorAlert.d.ts +0 -9
  145. package/dist/default/ErrorAlert.d.ts.map +0 -1
  146. package/dist/default/ErrorAlert.js +0 -27
  147. package/dist/default/ErrorAlert.js.map +0 -1
  148. package/dist/default/theme.d.ts +0 -24
  149. package/dist/default/theme.d.ts.map +0 -1
  150. package/dist/default/theme.js +0 -39
  151. package/dist/default/theme.js.map +0 -1
  152. package/src/default/ErrorAlert.tsx +0 -46
  153. package/src/default/theme.tsx +0 -66
@@ -1,32 +1,132 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Alert, Button, Checkbox, Empty, Flex, Spin, Tag, Typography } from "antd";
3
- import { matchList, toFlowError, useDescribeFlowError, useT } from "@stapel/core";
2
+ import { Alert, Button, Checkbox, Divider, Flex, InputNumber, Typography, } from "antd";
3
+ import { SlotPlaceholder, isDevBuild, useT } from "@stapel/core";
4
+ import { EmptyState, ErrorAlert, LoadList, SkinTheme, } from "@stapel/tokens-antd/skin";
5
+ import { spacing } from "@stapel/tokens";
6
+ import { featureName } from "@stapel/attributes-react";
4
7
  import { FacetPanel } from "../headless/FacetPanel.js";
8
+ import { useSearchState } from "../headless/SearchStateProvider.js";
9
+ import { buildRangeGroups } from "../state/ranges.js";
5
10
  import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
6
- import { ErrorAlert } from "./ErrorAlert.js";
7
- import { SearchSkinTheme } from "./theme.js";
11
+ import { LanguageSelect } from "./LanguageSelect.js";
12
+ import { RangeFilterRow } from "./RangeFilterRow.js";
8
13
  function OptionRow(props) {
9
14
  const t = useT();
10
15
  const { option, group } = props;
11
- return (_jsxs(Flex, { justify: "space-between", align: "center", gap: 8, children: [_jsx(Checkbox, { checked: option.selected, "data-testid": `facet-option-${group.slug}-${option.value}`, "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", onChange: () => {
16
+ return (_jsxs(Flex, { justify: "space-between", align: "center", gap: spacing[2], children: [_jsx(Checkbox, { checked: option.selected, "data-testid": `facet-option-${group.slug}-${option.value}`, "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", onChange: () => {
12
17
  props.onToggle(group.slug, option.value);
13
- }, children: option.label }), option.count === null ? (_jsx(Tag, { "data-testid": `facet-count-${group.slug}-${option.value}`, children: t(SEARCH_I18N_KEYS.facetsNotCounted) })) : (_jsx(Typography.Text, { type: "secondary", "data-testid": `facet-count-${group.slug}-${option.value}`, children: option.count }))] }));
18
+ }, children: option.label }), option.count === null ? (_jsx(Typography.Text, { type: "secondary", "data-testid": `facet-count-${group.slug}-${option.value}`, children: t(SEARCH_I18N_KEYS.facetsNotCounted) })) : (_jsx(Typography.Text, { type: "secondary", "data-testid": `facet-count-${group.slug}-${option.value}`, children: option.count }))] }));
19
+ }
20
+ /** The category constraint: the host's control, or the door out of it. */
21
+ function CategoryFilter(props) {
22
+ const t = useT();
23
+ const { state, setCategory } = useSearchState();
24
+ const value = state.category;
25
+ if (props.render !== undefined) {
26
+ return (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": "search-category", children: [_jsx(Typography.Text, { strong: true, children: t(SEARCH_I18N_KEYS.categoryTitle) }), props.render({
27
+ value,
28
+ onChange: (path) => {
29
+ setCategory(path);
30
+ },
31
+ })] }));
32
+ }
33
+ if (value === undefined) {
34
+ return _jsx(SlotPlaceholder, { name: "renderCategoryFilter", "data-testid": "search-category-slot" });
35
+ }
36
+ return (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": "search-category", children: [_jsx(Typography.Text, { strong: true, children: t(SEARCH_I18N_KEYS.categoryTitle) }), _jsx(Typography.Text, { type: "secondary", children: t(SEARCH_I18N_KEYS.categoryCurrent, { path: value }) }), _jsx(Button, { style: { alignSelf: "flex-start" }, "data-testid": "search-category-clear", "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", onClick: () => {
37
+ setCategory(null);
38
+ }, children: t(SEARCH_I18N_KEYS.categoryClear) })] }));
39
+ }
40
+ /**
41
+ * The location constraint.
42
+ *
43
+ * SETTING a centre needs a geocoder, which is the deployment's and
44
+ * `geo-react`'s. ADJUSTING one that already exists does not: the radius is a
45
+ * number in the URL, and a link shared with `lat/lon/radius_km` is a link this
46
+ * panel can widen, tighten and clear without knowing what a map is. That is the
47
+ * difference between a slot and a hole.
48
+ */
49
+ function GeoFilter(props) {
50
+ const t = useT();
51
+ const { state, setGeo } = useSearchState();
52
+ const geo = state.geo;
53
+ const slot = props.render !== undefined
54
+ ? props.render({
55
+ value: geo,
56
+ onChange: (next) => {
57
+ setGeo(next);
58
+ },
59
+ })
60
+ : geo === undefined
61
+ ? _jsx(SlotPlaceholder, { name: "renderGeoFilter", "data-testid": "search-geo-slot" })
62
+ : null;
63
+ if (geo === undefined) {
64
+ // An unfilled slot is a NAMED hole in development and nothing at all in a
65
+ // production build — so the heading has to follow the placeholder rather
66
+ // than outlive it. It did not, and the live desktop panel printed
67
+ // "Location" over empty space with no location control under it
68
+ // (class NC-ORPHANFIELD): a label is a promise that a control follows.
69
+ if (props.render === undefined && !isDevBuild())
70
+ return null;
71
+ return slot === null ? null : (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": "search-geo", children: [_jsx(Typography.Text, { strong: true, children: t(SEARCH_I18N_KEYS.geoTitle) }), slot] }));
72
+ }
73
+ return (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": "search-geo", children: [_jsx(Typography.Text, { strong: true, children: t(SEARCH_I18N_KEYS.geoTitle) }), slot, _jsx(Typography.Text, { type: "secondary", "data-testid": "search-geo-summary", children: geo.kind === "bbox"
74
+ ? t(SEARCH_I18N_KEYS.geoBox)
75
+ : t(SEARCH_I18N_KEYS.geoCenter, {
76
+ lat: geo.lat.toFixed(3),
77
+ lon: geo.lon.toFixed(3),
78
+ }) }), geo.kind === "center" && (_jsxs(Flex, { gap: spacing[2], align: "center", wrap: true, children: [_jsx(Typography.Text, { type: "secondary", "aria-hidden": "true", children: t(SEARCH_I18N_KEYS.geoRadiusLabel) }), _jsx(InputNumber, { min: 1, value: geo.radiusKm ?? null, "aria-label": t(SEARCH_I18N_KEYS.geoRadiusLabel), "data-testid": "search-geo-radius", onChange: (value) => {
79
+ setGeo({
80
+ kind: "center",
81
+ lat: geo.lat,
82
+ lon: geo.lon,
83
+ ...(typeof value === "number" ? { radiusKm: value } : {}),
84
+ });
85
+ } })] })), _jsx(Button, { style: { alignSelf: "flex-start" }, "data-testid": "search-geo-clear", "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", onClick: () => {
86
+ setGeo(null);
87
+ }, children: t(SEARCH_I18N_KEYS.geoClear) })] }));
88
+ }
89
+ /**
90
+ * The slugs the server skipped, named the way the panel names everything else.
91
+ *
92
+ * `facet_meta.skipped` is a list of index slugs (`power_w`); the sentence that
93
+ * reports them was printing exactly that, so a shopper read "These filters
94
+ * were not counted for this search: power_w". The category schema is already
95
+ * in this component for the option labels — it names these too. A slug the
96
+ * schema does not know stays as it is, because a made-up name would be worse
97
+ * than an honest identifier.
98
+ */
99
+ function skippedNames(slugs, features, t) {
100
+ return slugs
101
+ .map((slug) => {
102
+ const feature = features?.find((candidate) => candidate.slug === slug);
103
+ if (feature === undefined)
104
+ return slug;
105
+ const name = t(featureName(feature));
106
+ return name.length > 0 ? name : slug;
107
+ })
108
+ .join(", ");
14
109
  }
15
110
  export function FacetPanelPane(props) {
16
111
  const t = useT();
17
- const describe = useDescribeFlowError();
18
- return (_jsx(SearchSkinTheme, { ...(props.mode !== undefined ? { mode: props.mode } : {}), children: _jsx(FacetPanel, { ...(props.categoryFeatures !== undefined
112
+ const { state } = useSearchState();
113
+ const ranges = buildRangeGroups({
114
+ state,
115
+ ...(props.categoryFeatures !== undefined
116
+ ? { categoryFeatures: props.categoryFeatures }
117
+ : {}),
118
+ t,
119
+ });
120
+ return (_jsx(SkinTheme, { ...(props.mode !== undefined ? { mode: props.mode } : {}), children: _jsx(FacetPanel, { ...(props.categoryFeatures !== undefined
19
121
  ? { categoryFeatures: props.categoryFeatures }
20
- : {}), ...(props.locale !== undefined ? { locale: props.locale } : {}), ...(props.enabled !== undefined ? { enabled: props.enabled } : {}), children: (bag) => (_jsxs(Flex, { vertical: true, gap: 12, "data-testid": "search-facets", children: [_jsxs(Flex, { justify: "space-between", align: "center", gap: 8, children: [_jsx(Typography.Title, { level: 5, style: { margin: 0 }, children: t(SEARCH_I18N_KEYS.facetsTitle) }), bag.activeFilters > 0 && (_jsx(Button, { size: "small", onClick: bag.clearAll, "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", "data-testid": "facets-clear-all", children: t(SEARCH_I18N_KEYS.facetsClearAll, { count: bag.activeFilters }) }))] }), bag.approximate && (_jsx(Alert, { type: "info", showIcon: true, "data-testid": "facets-approximate", message: t(SEARCH_I18N_KEYS.facetsApproximate) })), bag.skipped.length > 0 && (_jsx(Alert, { type: "warning", showIcon: true, "data-testid": "facets-skipped", message: t(SEARCH_I18N_KEYS.facetsSkipped, {
21
- slugs: bag.skipped.join(", "),
22
- }) })), matchList(bag.state, {
23
- loading: () => (_jsx(Flex, { justify: "center", style: { padding: 16 }, children: _jsx(Spin, { "data-testid": "facets-loading" }) })),
24
- failed: (error) => (_jsx(ErrorAlert, { testId: "facets-failed", error: {
25
- ...describe(toFlowError(error)),
26
- message: t(SEARCH_I18N_KEYS.facetsLoadFailed),
27
- } })),
28
- empty: () => (_jsx(Empty, { "data-testid": "facets-empty", description: t(SEARCH_I18N_KEYS.facetsEmpty) })),
29
- ready: (groups) => (_jsxs(Flex, { vertical: true, gap: 16, children: [groups.map((group) => (_jsxs(Flex, { vertical: true, gap: 4, "data-testid": `facet-group-${group.slug}`, "data-counted": group.counted ? "true" : "false", children: [_jsx(Typography.Text, { strong: true, children: group.label }), group.options.map((option) => (_jsx(OptionRow, { group: group, option: option, onToggle: bag.toggle }, option.value)))] }, group.slug))), _jsx(Typography.Text, { type: "secondary", style: { fontSize: 12 }, children: t(SEARCH_I18N_KEYS.facetsDrillDownHint) })] })),
30
- })] })) }) }));
122
+ : {}), ...(props.locale !== undefined ? { locale: props.locale } : {}), ...(props.enabled !== undefined ? { enabled: props.enabled } : {}), children: (bag) => (_jsxs(Flex, { vertical: true, gap: spacing[3], "data-testid": "search-facets", children: [_jsxs(Flex, { justify: "space-between", align: "center", gap: spacing[2], children: [props.heading === null ? (_jsx("span", {})) : (_jsx(Typography.Title, { level: 5, style: { margin: 0 }, children: props.heading ?? t(SEARCH_I18N_KEYS.facetsTitle) })), bag.activeFilters > 0 && (_jsx(Button, { onClick: bag.clearAll, "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", "data-testid": "facets-clear-all", children: t(SEARCH_I18N_KEYS.facetsClearAll, { count: bag.activeFilters }) }))] }), _jsx(CategoryFilter, { ...(props.renderCategoryFilter !== undefined
123
+ ? { render: props.renderCategoryFilter }
124
+ : {}) }), _jsx(LanguageSelect, { ...(props.languages !== undefined ? { languages: props.languages } : {}) }), _jsx(GeoFilter, { ...(props.renderGeoFilter !== undefined
125
+ ? { render: props.renderGeoFilter }
126
+ : {}) }), bag.approximate && (_jsx(Alert, { type: "info", showIcon: true, "data-testid": "facets-approximate", title: t(SEARCH_I18N_KEYS.facetsApproximate) })), bag.skipped.length > 0 && (_jsx(Alert, { type: "warning", showIcon: true, "data-testid": "facets-skipped", title: t(SEARCH_I18N_KEYS.facetsSkipped, {
127
+ slugs: skippedNames(bag.skipped, props.categoryFeatures, t),
128
+ }) })), ranges.length > 0 && (_jsx(Flex, { vertical: true, gap: spacing[3], "data-testid": "search-ranges", children: ranges.map((group) => (_jsx(RangeFilterRow, { group: group, onApply: bag.setRange }, group.slug))) })), ranges.length > 0 && _jsx(Divider, { style: { margin: 0 } }), _jsx(LoadList, { state: bag.state, testId: "facets", skeletonRows: 4, empty: _jsx(EmptyState, { compact: true, title: t(SEARCH_I18N_KEYS.facetsEmpty), testId: "facets-empty" }), failed: (error) => (_jsx(ErrorAlert, { testId: "facets-failed", thrown: error, message: t(SEARCH_I18N_KEYS.facetsLoadFailed) })), children: (groups) => (_jsxs(Flex, { vertical: true, gap: spacing[4], children: [groups
129
+ .filter((group) => group.options.length > 0)
130
+ .map((group) => (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": `facet-group-${group.slug}`, "data-counted": group.counted ? "true" : "false", children: [_jsx(Typography.Text, { strong: true, children: group.label }), group.options.map((option) => (_jsx(OptionRow, { group: group, option: option, onToggle: bag.toggle }, option.value)))] }, group.slug))), _jsx(Typography.Text, { type: "secondary", children: t(SEARCH_I18N_KEYS.facetsDrillDownHint) })] })) })] })) }) }));
31
131
  }
32
132
  //# sourceMappingURL=FacetPanelPane.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FacetPanelPane.js","sourceRoot":"","sources":["../../src/default/FacetPanelPane.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FacetPanelPane.js","sourceRoot":"","sources":["../../src/default/FacetPanelPane.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ReactElement } from "react";
2
+ /** Width of the language select — a language name plus room for a long one. */
3
+ export declare const LANGUAGE_SELECT_MIN_WIDTH = 176;
4
+ export interface LanguageSelectProps {
5
+ /** BCP-47 tags the deployment indexes (e.g. `["ru", "en"]`). */
6
+ readonly languages?: readonly string[];
7
+ }
8
+ export declare function LanguageSelect(props: LanguageSelectProps): ReactElement | null;
9
+ //# sourceMappingURL=LanguageSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanguageSelect.d.ts","sourceRoot":"","sources":["../../src/default/LanguageSelect.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAO1C,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAgBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,GAAG,IAAI,CAwC9E"}
@@ -0,0 +1,72 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * The query's LANGUAGE — `lang`, and the reason it is a filter rather than a
4
+ * display preference.
5
+ *
6
+ * `lang` does two things server-side (`query.py`): it picks the ANALYZER (so a
7
+ * Russian word stems as Russian rather than as an unknown token) and it
8
+ * NARROWS the corpus to documents indexed in that language. Getting it wrong therefore changes
9
+ * which results exist, not how they are written — which is why the control
10
+ * lives in the filter panel beside the facets and not in a settings menu.
11
+ *
12
+ * ── Which languages a deployment has is not this pair's fact ───────────────
13
+ *
14
+ * The index's languages come from what has been indexed; there is no endpoint
15
+ * that lists them. So the host names them (`languages`), and the labels come
16
+ * from `Intl.DisplayNames` in the reader's own locale — each language named
17
+ * the way THIS reader would name it — rather than from a translation table this
18
+ * pair would have to carry for every language a deployment might index.
19
+ *
20
+ * With no `languages` prop the control renders only when the URL already
21
+ * carries one, and then only to REMOVE it: a constraint that arrived in a
22
+ * shared link must always have a control that widens it again.
23
+ */
24
+ import { useMemo } from "react";
25
+ import { Flex, Select, Typography } from "antd";
26
+ import { useOptionalI18n, useT } from "@stapel/core";
27
+ import { spacing } from "@stapel/tokens";
28
+ import { useSearchState } from "../headless/SearchStateProvider.js";
29
+ import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
30
+ /** Width of the language select — a language name plus room for a long one. */
31
+ export const LANGUAGE_SELECT_MIN_WIDTH = 176;
32
+ /**
33
+ * A language tag as a person reads it, in THEIR locale. Falls back to the tag
34
+ * itself where the runtime has no name for it — a tag is at least honest,
35
+ * where a blank option is unclickable.
36
+ */
37
+ function languageName(tag, locale) {
38
+ try {
39
+ const names = new Intl.DisplayNames([locale], { type: "language" });
40
+ return names.of(tag) ?? tag;
41
+ }
42
+ catch {
43
+ return tag;
44
+ }
45
+ }
46
+ export function LanguageSelect(props) {
47
+ const t = useT();
48
+ // The reader's locale names the languages. Optional on purpose: every other
49
+ // control in this skin renders outside a provider (English floor) rather
50
+ // than throwing, and a language list is not the place to break that.
51
+ const locale = useOptionalI18n()?.locale ?? "en";
52
+ const { state, setLanguage } = useSearchState();
53
+ const active = state.lang;
54
+ const languages = props.languages;
55
+ const options = useMemo(() => {
56
+ const tags = [...(languages ?? [])];
57
+ if (active !== undefined && !tags.includes(active))
58
+ tags.push(active);
59
+ return [
60
+ { value: "", label: t(SEARCH_I18N_KEYS.languageAny) },
61
+ ...tags.map((tag) => ({ value: tag, label: languageName(tag, locale) })),
62
+ ];
63
+ }, [languages, active, locale, t]);
64
+ // Nothing offered and nothing applied: a select with one option ("any") is a
65
+ // control that cannot do anything, which §83 calls a dead control.
66
+ if ((languages ?? []).length === 0 && active === undefined)
67
+ return null;
68
+ return (_jsxs(Flex, { gap: spacing[2], align: "center", wrap: true, children: [_jsx(Typography.Text, { type: "secondary", "aria-hidden": "true", children: t(SEARCH_I18N_KEYS.languageLabel) }), _jsx(Select, { "data-testid": "search-language", "aria-label": t(SEARCH_I18N_KEYS.languageLabel), style: { minWidth: LANGUAGE_SELECT_MIN_WIDTH }, value: active ?? "", onChange: (next) => {
69
+ setLanguage(next === "" ? null : next);
70
+ }, options: options })] }));
71
+ }
72
+ //# sourceMappingURL=LanguageSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanguageSelect.js","sourceRoot":"","sources":["../../src/default/LanguageSelect.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * How many results a page carries — `limit`, the fifth of the nine state
3
+ * setters that had no control.
4
+ *
5
+ * The offered sizes are the pair's, not the schema's: `docs/schema.json`
6
+ * declares `limit` as a bare integer, and the backend clamps it to
7
+ * `1..MAX_PAGE_SIZE` (100) with `DEFAULT_PAGE_SIZE` 24 when it is absent. So
8
+ * the select offers a short ladder around that default and never sends
9
+ * something the server would have to clamp — a person who lands on a link
10
+ * carrying `limit=37` keeps it (it is offered as its own option) rather than
11
+ * being silently moved to 24, which would change what a shared link shows.
12
+ *
13
+ * A page size is a PREFERENCE, not a step through the results: `setLimit`
14
+ * replaces the history entry rather than pushing one, so Back still undoes the
15
+ * last filter and not the last time somebody widened the page.
16
+ */
17
+ import type { ReactElement } from "react";
18
+ /** The shipped ladder, around stapel-search's own `DEFAULT_PAGE_SIZE` (24). */
19
+ export declare const SEARCH_PAGE_SIZES: readonly number[];
20
+ /** Width of the size select — the widest option plus its caption. */
21
+ export declare const PAGE_SIZE_SELECT_MIN_WIDTH = 148;
22
+ export interface PageSizeSelectProps {
23
+ /** Override the offered ladder (a deployment with its own `MAX_PAGE_SIZE`). */
24
+ readonly sizes?: readonly number[];
25
+ /** What the server uses when the URL names none. Default 24. */
26
+ readonly defaultSize?: number;
27
+ }
28
+ export declare function PageSizeSelect(props: PageSizeSelectProps): ReactElement;
29
+ //# sourceMappingURL=PageSizeSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageSizeSelect.d.ts","sourceRoot":"","sources":["../../src/default/PageSizeSelect.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAO1C,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAAqB,CAAC;AAErE,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,gEAAgE;IAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,CA2CvE"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Flex, Select, Typography } from "antd";
3
+ import { useT } from "@stapel/core";
4
+ import { fontSize, spacing } from "@stapel/tokens";
5
+ import { useSearchState } from "../headless/SearchStateProvider.js";
6
+ import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
7
+ /** The shipped ladder, around stapel-search's own `DEFAULT_PAGE_SIZE` (24). */
8
+ export const SEARCH_PAGE_SIZES = [12, 24, 48, 96];
9
+ /** Width of the size select — the widest option plus its caption. */
10
+ export const PAGE_SIZE_SELECT_MIN_WIDTH = 148;
11
+ export function PageSizeSelect(props) {
12
+ const t = useT();
13
+ const { state, setLimit } = useSearchState();
14
+ const ladder = props.sizes ?? SEARCH_PAGE_SIZES;
15
+ const active = state.limit ?? props.defaultSize ?? 24;
16
+ const offLadder = !ladder.includes(active);
17
+ const values = offLadder ? [...ladder, active].sort((a, b) => a - b) : ladder;
18
+ return (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-off-ladder": offLadder ? "true" : "false", children: [_jsxs(Flex, { gap: spacing[2], align: "center", children: [_jsx(Typography.Text, { type: "secondary", "aria-hidden": "true", children: t(SEARCH_I18N_KEYS.limitLabel) }), _jsx(Select, { "data-testid": "search-limit", "aria-label": t(SEARCH_I18N_KEYS.limitLabel), style: { minWidth: PAGE_SIZE_SELECT_MIN_WIDTH }, value: active, onChange: (next) => {
19
+ setLimit(next);
20
+ }, options: values.map((size) => ({
21
+ value: size,
22
+ label: t(SEARCH_I18N_KEYS.limitOption, { count: size }),
23
+ })) })] }), offLadder && (_jsx(Typography.Text, { type: "secondary", style: { fontSize: fontSize.xs.fontSize }, "data-testid": "search-limit-from-link", children: t(SEARCH_I18N_KEYS.limitFromLink) }))] }));
24
+ }
25
+ //# sourceMappingURL=PageSizeSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageSizeSelect.js","sourceRoot":"","sources":["../../src/default/PageSizeSelect.tsx"],"names":[],"mappings":";AAiBA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,iBAAiB,GAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAErE,qEAAqE;AACrE,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAS9C,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,iBAAiB,CAAC;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;IACtD,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE9E,OAAO,CACL,MAAC,IAAI,IAAC,QAAQ,QAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAmB,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,aAC3E,MAAC,IAAI,IAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAC,QAAQ,aACnC,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,WAAW,iBAAa,MAAM,YACjD,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,GACf,EAClB,KAAC,MAAM,mBACO,cAAc,gBACd,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAC1C,KAAK,EAAE,EAAE,QAAQ,EAAE,0BAA0B,EAAE,EAC/C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;4BACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;wBACjB,CAAC,EACD,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;4BAC7B,KAAK,EAAE,IAAI;4BACX,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;yBACxD,CAAC,CAAC,GACH,IACG,EAKN,SAAS,IAAI,CACZ,KAAC,UAAU,CAAC,IAAI,IACd,IAAI,EAAC,WAAW,EAChB,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAC7B,wBAAwB,YAEnC,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,GAClB,CACnB,IACI,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ReactElement } from "react";
2
+ import type { SearchRange } from "../api/types.js";
3
+ import type { RangeGroup } from "../state/ranges.js";
4
+ /** Floor width of one bound field, so two of them fit a 390px phone row. */
5
+ export declare const RANGE_FIELD_MIN_WIDTH = 96;
6
+ export interface RangeFilterRowProps {
7
+ readonly group: RangeGroup;
8
+ /** `null` clears the slug's range entirely. */
9
+ readonly onApply: (slug: string, range: SearchRange | null) => void;
10
+ }
11
+ export declare function RangeFilterRow(props: RangeFilterRowProps): ReactElement;
12
+ //# sourceMappingURL=RangeFilterRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RangeFilterRow.d.ts","sourceRoot":"","sources":["../../src/default/RangeFilterRow.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;CACrE;AAMD,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,CAyGvE"}
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * One numeric range row — "Price: from ___ to ___".
4
+ *
5
+ * The pair could encode `r.price=100..500`, round-trip it through the URL and
6
+ * send it, and had no control that produced one. A marketplace without a price
7
+ * range filter is not a marketplace (audit S-2), and this is the row that fixes
8
+ * it; `state/ranges.ts` decides which rows exist.
9
+ *
10
+ * ── Why it is applied by a button and not by typing ───────────────────────
11
+ *
12
+ * A facet checkbox commits on click because a click is a finished thought. A
13
+ * range is TWO fields, and committing each keystroke would run a search for
14
+ * `1`, `10`, `100` on the way to `1000` — three wrong result pages, three
15
+ * history entries' worth of churn, and a facet panel that reshuffles under the
16
+ * hand still typing. So the row holds a draft and commits on Apply (or Enter),
17
+ * which is also what makes "from > to" refusable instead of merely empty.
18
+ */
19
+ import { useRef, useState } from "react";
20
+ import { Button, Flex, InputNumber, Typography } from "antd";
21
+ import { actionAvailable, actionBlocked, useT } from "@stapel/core";
22
+ import { GatedButton } from "@stapel/tokens-antd/skin";
23
+ import { spacing } from "@stapel/tokens";
24
+ import { isRangeUsable } from "../state/ranges.js";
25
+ import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
26
+ /** Floor width of one bound field, so two of them fit a 390px phone row. */
27
+ export const RANGE_FIELD_MIN_WIDTH = 96;
28
+ function toDraft(value) {
29
+ return value ?? "";
30
+ }
31
+ export function RangeFilterRow(props) {
32
+ const t = useT();
33
+ const { group } = props;
34
+ const [from, setFrom] = useState(toDraft(group.from));
35
+ const [to, setTo] = useState(toDraft(group.to));
36
+ // The URL is still the state: when it moves on its own — Back, a shared
37
+ // link, "clear all" — the draft follows it rather than keeping a number the
38
+ // results are no longer about.
39
+ const applied = useRef(`${toDraft(group.from)}..${toDraft(group.to)}`);
40
+ const current = `${toDraft(group.from)}..${toDraft(group.to)}`;
41
+ if (applied.current !== current) {
42
+ applied.current = current;
43
+ if (from !== toDraft(group.from))
44
+ setFrom(toDraft(group.from));
45
+ if (to !== toDraft(group.to))
46
+ setTo(toDraft(group.to));
47
+ }
48
+ const draft = {
49
+ ...(from !== "" ? { from } : {}),
50
+ ...(to !== "" ? { to } : {}),
51
+ };
52
+ const usable = isRangeUsable(draft);
53
+ const empty = from === "" && to === "";
54
+ const apply = usable
55
+ ? actionAvailable()
56
+ : actionBlocked(SEARCH_I18N_KEYS.facetsRangeInvalid);
57
+ const commit = () => {
58
+ if (!usable)
59
+ return;
60
+ props.onApply(group.slug, empty ? null : draft);
61
+ };
62
+ const unit = group.unit === undefined ? "" : ` ${group.unit}`;
63
+ return (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": `facet-range-${group.slug}`, "data-active": group.active ? "true" : "false", children: [_jsx(Typography.Text, { strong: true, children: group.label }), _jsxs(Flex, { gap: spacing[2], align: "center", wrap: true, children: [_jsx(InputNumber, { value: from === "" ? null : Number(from), placeholder: t(SEARCH_I18N_KEYS.facetsRangeFrom), "aria-label": `${t(SEARCH_I18N_KEYS.facetsRangeFromAria, {
64
+ feature: group.label,
65
+ })}${unit}`, "data-testid": `facet-range-${group.slug}-from`, style: { minWidth: RANGE_FIELD_MIN_WIDTH }, ...(group.min !== undefined ? { min: group.min } : {}), ...(group.max !== undefined ? { max: group.max } : {}), ...(group.step !== undefined ? { step: group.step } : {}), onChange: (value) => {
66
+ setFrom(value === null || value === undefined ? "" : String(value));
67
+ }, onPressEnter: commit }), _jsx(InputNumber, { value: to === "" ? null : Number(to), placeholder: t(SEARCH_I18N_KEYS.facetsRangeTo), "aria-label": `${t(SEARCH_I18N_KEYS.facetsRangeToAria, {
68
+ feature: group.label,
69
+ })}${unit}`, "data-testid": `facet-range-${group.slug}-to`, style: { minWidth: RANGE_FIELD_MIN_WIDTH }, ...(group.min !== undefined ? { min: group.min } : {}), ...(group.max !== undefined ? { max: group.max } : {}), ...(group.step !== undefined ? { step: group.step } : {}), onChange: (value) => {
70
+ setTo(value === null || value === undefined ? "" : String(value));
71
+ }, onPressEnter: commit }), _jsx(GatedButton, { gate: apply, type: usable && !empty ? "primary" : "default", testId: `facet-range-${group.slug}-apply`, "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", onClick: commit, children: t(SEARCH_I18N_KEYS.facetsRangeApply) }), group.active && (_jsx(Button, { "data-testid": `facet-range-${group.slug}-clear`, "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", onClick: () => {
72
+ props.onApply(group.slug, null);
73
+ }, children: t(SEARCH_I18N_KEYS.facetsRangeClear) }))] })] }));
74
+ }
75
+ //# sourceMappingURL=RangeFilterRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RangeFilterRow.js","sourceRoot":"","sources":["../../src/default/RangeFilterRow.tsx"],"names":[],"mappings":"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"}
@@ -13,5 +13,10 @@ export interface RankingDisclosurePaneProps extends ThemeModeProp {
13
13
  /** Doc type to disclose; omitted asks for the deployment's default. */
14
14
  readonly type?: string;
15
15
  }
16
+ /**
17
+ * The widest a disclosure column may grow. A statutory text is a READING
18
+ * surface: past this it stops being a paragraph and becomes a banner.
19
+ */
20
+ export declare const RANKING_MAX_WIDTH = 720;
16
21
  export declare function RankingDisclosurePane(props: RankingDisclosurePaneProps): ReactElement;
17
22
  //# sourceMappingURL=RankingDisclosurePane.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RankingDisclosurePane.d.ts","sourceRoot":"","sources":["../../src/default/RankingDisclosurePane.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAQ1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,0BAA2B,SAAQ,aAAa;IAC/D,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,YAAY,CAyFd"}
1
+ {"version":3,"file":"RankingDisclosurePane.d.ts","sourceRoot":"","sources":["../../src/default/RankingDisclosurePane.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAc1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,0BAA2B,SAAQ,aAAa;IAC/D,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,YAAY,CA6Gd"}
@@ -1,23 +1,23 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Empty, Flex, List, Spin, Tag, Typography } from "antd";
3
- import { matchList, toFlowError, useDescribeFlowError, useT } from "@stapel/core";
2
+ import { Flex, List, Tag, Typography } from "antd";
3
+ import { useFormat, useT } from "@stapel/core";
4
+ import { EmptyState, ErrorAlert, LoadList, SkinTheme, } from "@stapel/tokens-antd/skin";
5
+ import { fontSize, spacing } from "@stapel/tokens";
4
6
  import { RankingDisclosure } from "../headless/RankingDisclosure.js";
5
7
  import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
6
- import { ErrorAlert } from "./ErrorAlert.js";
7
- import { SearchSkinTheme } from "./theme.js";
8
+ import { sortLabel } from "./sortLabels.js";
9
+ /**
10
+ * The widest a disclosure column may grow. A statutory text is a READING
11
+ * surface: past this it stops being a paragraph and becomes a banner.
12
+ */
13
+ export const RANKING_MAX_WIDTH = 720;
8
14
  export function RankingDisclosurePane(props) {
9
15
  const t = useT();
10
- const describe = useDescribeFlowError();
11
- return (_jsx(SearchSkinTheme, { ...(props.mode !== undefined ? { mode: props.mode } : {}), children: _jsx(RankingDisclosure, { ...(props.type !== undefined ? { type: props.type } : {}), children: (bag) => (_jsxs(Flex, { vertical: true, gap: 12, "data-testid": "search-ranking", children: [_jsx(Typography.Title, { level: 4, style: { margin: 0 }, children: t(SEARCH_I18N_KEYS.rankingTitle) }), _jsx(Typography.Paragraph, { type: "secondary", style: { margin: 0 }, children: t(SEARCH_I18N_KEYS.rankingIntro) }), matchList(bag.state, {
12
- loading: () => (_jsx(Flex, { justify: "center", style: { padding: 16 }, children: _jsx(Spin, { "data-testid": "ranking-loading" }) })),
13
- failed: (error) => (_jsx(ErrorAlert, { testId: "ranking-failed", error: {
14
- ...describe(toFlowError(error)),
15
- message: t(SEARCH_I18N_KEYS.rankingLoadFailed),
16
- } })),
17
- empty: () => (_jsx(Empty, { "data-testid": "ranking-empty", description: t(SEARCH_I18N_KEYS.rankingEmpty) })),
18
- ready: (scorers) => (_jsx(List, { "data-testid": "ranking-list", dataSource: [...scorers], renderItem: (scorer) => (_jsx(List.Item, { "data-scorer": scorer.slug, children: _jsxs(Flex, { vertical: true, gap: 2, style: { width: "100%" }, children: [_jsxs(Flex, { justify: "space-between", align: "center", gap: 8, children: [_jsx(Typography.Text, { strong: true, children: t(scorer.description_key) }), _jsx(Tag, { children: scorer.weight })] }), _jsx(Typography.Text, { type: "secondary", children: scorer.description }), _jsxs(Typography.Text, { type: "secondary", style: { fontSize: 12 }, children: [t(SEARCH_I18N_KEYS.rankingAppliesTo), ": ", scorer.applies_to_sorts.join(", ")] }), !scorer.active && (_jsx(Typography.Text, { type: "warning", "data-testid": "ranking-inactive", children: t(SEARCH_I18N_KEYS.rankingInactive, {
16
+ const format = useFormat();
17
+ return (_jsx(SkinTheme, { surface: "base", ...(props.mode !== undefined ? { mode: props.mode } : {}), style: { width: "100%", maxWidth: RANKING_MAX_WIDTH }, children: _jsx(RankingDisclosure, { ...(props.type !== undefined ? { type: props.type } : {}), children: (bag) => (_jsxs(Flex, { vertical: true, gap: spacing[3], "data-testid": "search-ranking", children: [_jsx(Typography.Title, { level: 4, style: { margin: 0 }, children: t(SEARCH_I18N_KEYS.rankingTitle) }), _jsx(Typography.Paragraph, { type: "secondary", style: { margin: 0 }, children: t(SEARCH_I18N_KEYS.rankingIntro) }), _jsx(LoadList, { state: bag.state, testId: "ranking", skeletonRows: 4, onRetry: bag.refetch, empty: _jsx(EmptyState, { compact: true, title: t(SEARCH_I18N_KEYS.rankingEmpty), testId: "ranking-empty" }), failed: (error) => (_jsx(ErrorAlert, { testId: "ranking-failed", thrown: error, message: t(SEARCH_I18N_KEYS.rankingLoadFailed), onRetry: bag.refetch })), children: (scorers) => (_jsx(List, { "data-testid": "ranking-list", dataSource: [...scorers], renderItem: (scorer) => (_jsx(List.Item, { "data-scorer": scorer.slug, children: _jsxs(Flex, { vertical: true, gap: spacing[1], style: { width: "100%" }, children: [_jsxs(Flex, { justify: "space-between", align: "center", gap: spacing[2], children: [_jsx(Typography.Text, { strong: true, children: t(scorer.description_key) }), _jsxs(Tag, { children: [t(SEARCH_I18N_KEYS.rankingWeight), " ", format.number(scorer.weight) ?? scorer.weight] })] }), _jsx(Typography.Text, { type: "secondary", children: scorer.description }), _jsxs(Typography.Text, { type: "secondary", style: { fontSize: fontSize.xs.fontSize }, children: [t(SEARCH_I18N_KEYS.rankingAppliesTo), ": ", scorer.applies_to_sorts
18
+ .map((sort) => sortLabel(t, sort))
19
+ .join(", ")] }), !scorer.active && (_jsx(Typography.Text, { type: "warning", "data-testid": "ranking-inactive", children: t(SEARCH_I18N_KEYS.rankingInactive, {
19
20
  reason: scorer.inactive_reason,
20
- }) }))] }) }, scorer.slug)) })),
21
- }), bag.notes.length > 0 && (_jsxs(Flex, { vertical: true, gap: 2, children: [_jsx(Typography.Text, { strong: true, children: t(SEARCH_I18N_KEYS.rankingNotes) }), bag.notes.map((note) => (_jsx(Typography.Text, { type: "secondary", children: note }, note)))] }))] })) }) }));
21
+ }) }))] }) }, scorer.slug)) })) }), bag.notes.length > 0 && (_jsxs(Flex, { vertical: true, gap: spacing[1], children: [_jsx(Typography.Text, { strong: true, children: t(SEARCH_I18N_KEYS.rankingNotes) }), bag.notes.map((note) => (_jsx(Typography.Text, { type: "secondary", children: note }, note)))] }))] })) }) }));
22
22
  }
23
23
  //# sourceMappingURL=RankingDisclosurePane.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RankingDisclosurePane.js","sourceRoot":"","sources":["../../src/default/RankingDisclosurePane.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RankingDisclosurePane.js","sourceRoot":"","sources":["../../src/default/RankingDisclosurePane.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ReactElement } from "react";
2
+ import type { UseSearchBoxOptions } from "../headless/useSearchBox.js";
3
+ import type { ThemeModeProp } from "./types.js";
4
+ export interface SearchBoxProps extends ThemeModeProp, UseSearchBoxOptions {
5
+ /** Override the placeholder — a category page says what it searches. */
6
+ readonly placeholder?: string;
7
+ /** Render the submit button beside the field. Default `true`: on a phone
8
+ * keyboard "search" is not always offered, and a visible button is. */
9
+ readonly submitButton?: boolean;
10
+ readonly autoFocus?: boolean;
11
+ }
12
+ export declare function SearchBox(props: SearchBoxProps): ReactElement;
13
+ //# sourceMappingURL=SearchBox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchBox.d.ts","sourceRoot":"","sources":["../../src/default/SearchBox.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,cAAe,SAAQ,aAAa,EAAE,mBAAmB;IACxE,wEAAwE;IACxE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;2EACuE;IACvE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAgF7D"}