@stapel/search-react 0.4.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/CHANGELOG.md +191 -0
  2. package/README.md +1 -1
  3. package/dist/default/DegradationNotice.d.ts +7 -0
  4. package/dist/default/DegradationNotice.d.ts.map +1 -1
  5. package/dist/default/DegradationNotice.js +17 -6
  6. package/dist/default/DegradationNotice.js.map +1 -1
  7. package/dist/default/FacetGroupControl.d.ts +40 -0
  8. package/dist/default/FacetGroupControl.d.ts.map +1 -0
  9. package/dist/default/FacetGroupControl.js +176 -0
  10. package/dist/default/FacetGroupControl.js.map +1 -0
  11. package/dist/default/FacetPanelPane.d.ts +54 -3
  12. package/dist/default/FacetPanelPane.d.ts.map +1 -1
  13. package/dist/default/FacetPanelPane.js +116 -22
  14. package/dist/default/FacetPanelPane.js.map +1 -1
  15. package/dist/default/FilterChips.d.ts +28 -0
  16. package/dist/default/FilterChips.d.ts.map +1 -0
  17. package/dist/default/FilterChips.js +204 -0
  18. package/dist/default/FilterChips.js.map +1 -0
  19. package/dist/default/LanguageSelect.d.ts +9 -0
  20. package/dist/default/LanguageSelect.d.ts.map +1 -0
  21. package/dist/default/LanguageSelect.js +72 -0
  22. package/dist/default/LanguageSelect.js.map +1 -0
  23. package/dist/default/PageSizeSelect.d.ts +29 -0
  24. package/dist/default/PageSizeSelect.d.ts.map +1 -0
  25. package/dist/default/PageSizeSelect.js +25 -0
  26. package/dist/default/PageSizeSelect.js.map +1 -0
  27. package/dist/default/RangeFilterRow.d.ts +12 -0
  28. package/dist/default/RangeFilterRow.d.ts.map +1 -0
  29. package/dist/default/RangeFilterRow.js +75 -0
  30. package/dist/default/RangeFilterRow.js.map +1 -0
  31. package/dist/default/RankingDisclosurePane.d.ts +5 -0
  32. package/dist/default/RankingDisclosurePane.d.ts.map +1 -1
  33. package/dist/default/RankingDisclosurePane.js +15 -15
  34. package/dist/default/RankingDisclosurePane.js.map +1 -1
  35. package/dist/default/SearchBox.d.ts +13 -0
  36. package/dist/default/SearchBox.d.ts.map +1 -0
  37. package/dist/default/SearchBox.js +67 -0
  38. package/dist/default/SearchBox.js.map +1 -0
  39. package/dist/default/SearchPage.d.ts +94 -16
  40. package/dist/default/SearchPage.d.ts.map +1 -1
  41. package/dist/default/SearchPage.js +191 -8
  42. package/dist/default/SearchPage.js.map +1 -1
  43. package/dist/default/SearchResultCard.d.ts +19 -18
  44. package/dist/default/SearchResultCard.d.ts.map +1 -1
  45. package/dist/default/SearchResultCard.js +178 -5
  46. package/dist/default/SearchResultCard.js.map +1 -1
  47. package/dist/default/SearchResultsPane.d.ts +61 -3
  48. package/dist/default/SearchResultsPane.d.ts.map +1 -1
  49. package/dist/default/SearchResultsPane.js +51 -21
  50. package/dist/default/SearchResultsPane.js.map +1 -1
  51. package/dist/default/SortSelect.d.ts +10 -2
  52. package/dist/default/SortSelect.d.ts.map +1 -1
  53. package/dist/default/SortSelect.js +27 -24
  54. package/dist/default/SortSelect.js.map +1 -1
  55. package/dist/default/UrlIssueNotice.d.ts.map +1 -1
  56. package/dist/default/UrlIssueNotice.js +19 -1
  57. package/dist/default/UrlIssueNotice.js.map +1 -1
  58. package/dist/default/ViewSwitch.d.ts +66 -0
  59. package/dist/default/ViewSwitch.d.ts.map +1 -0
  60. package/dist/default/ViewSwitch.js +49 -0
  61. package/dist/default/ViewSwitch.js.map +1 -0
  62. package/dist/default/index.d.ts +38 -15
  63. package/dist/default/index.d.ts.map +1 -1
  64. package/dist/default/index.js +29 -12
  65. package/dist/default/index.js.map +1 -1
  66. package/dist/default/sortLabels.d.ts +5 -0
  67. package/dist/default/sortLabels.d.ts.map +1 -0
  68. package/dist/default/sortLabels.js +32 -0
  69. package/dist/default/sortLabels.js.map +1 -0
  70. package/dist/headless/FacetPanel.d.ts +17 -0
  71. package/dist/headless/FacetPanel.d.ts.map +1 -1
  72. package/dist/headless/FacetPanel.js +23 -2
  73. package/dist/headless/FacetPanel.js.map +1 -1
  74. package/dist/headless/useAppliedCount.d.ts +8 -0
  75. package/dist/headless/useAppliedCount.d.ts.map +1 -0
  76. package/dist/headless/useAppliedCount.js +30 -0
  77. package/dist/headless/useAppliedCount.js.map +1 -0
  78. package/dist/headless/useScorerNames.d.ts +4 -0
  79. package/dist/headless/useScorerNames.d.ts.map +1 -0
  80. package/dist/headless/useScorerNames.js +34 -0
  81. package/dist/headless/useScorerNames.js.map +1 -0
  82. package/dist/headless/useSearchBox.d.ts +44 -0
  83. package/dist/headless/useSearchBox.d.ts.map +1 -0
  84. package/dist/headless/useSearchBox.js +116 -0
  85. package/dist/headless/useSearchBox.js.map +1 -0
  86. package/dist/i18n/es.d.ts.map +1 -1
  87. package/dist/i18n/es.js +38 -4
  88. package/dist/i18n/es.js.map +1 -1
  89. package/dist/i18n/keys.d.ts +55 -0
  90. package/dist/i18n/keys.d.ts.map +1 -1
  91. package/dist/i18n/keys.js +101 -4
  92. package/dist/i18n/keys.js.map +1 -1
  93. package/dist/i18n/ru.d.ts.map +1 -1
  94. package/dist/i18n/ru.js +42 -4
  95. package/dist/i18n/ru.js.map +1 -1
  96. package/dist/index.d.ts +7 -2
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +5 -2
  99. package/dist/index.js.map +1 -1
  100. package/dist/model/queries.d.ts +26 -2
  101. package/dist/model/queries.d.ts.map +1 -1
  102. package/dist/model/queries.js +38 -1
  103. package/dist/model/queries.js.map +1 -1
  104. package/dist/state/limits.d.ts +44 -0
  105. package/dist/state/limits.d.ts.map +1 -0
  106. package/dist/state/limits.js +44 -0
  107. package/dist/state/limits.js.map +1 -0
  108. package/dist/state/ranges.d.ts +52 -0
  109. package/dist/state/ranges.d.ts.map +1 -0
  110. package/dist/state/ranges.js +108 -0
  111. package/dist/state/ranges.js.map +1 -0
  112. package/llms.txt +16 -4
  113. package/manifest.json +268 -22
  114. package/nav-manifest.json +1 -1
  115. package/package.json +15 -10
  116. package/src/analytics/generated/events.json +1 -1
  117. package/src/default/DegradationNotice.tsx +34 -12
  118. package/src/default/FacetGroupControl.tsx +312 -0
  119. package/src/default/FacetPanelPane.tsx +320 -87
  120. package/src/default/FilterChips.tsx +415 -0
  121. package/src/default/LanguageSelect.tsx +93 -0
  122. package/src/default/PageSizeSelect.tsx +80 -0
  123. package/src/default/RangeFilterRow.tsx +148 -0
  124. package/src/default/RankingDisclosurePane.tsx +67 -35
  125. package/src/default/SearchBox.tsx +130 -0
  126. package/src/default/SearchPage.tsx +454 -44
  127. package/src/default/SearchResultCard.tsx +231 -24
  128. package/src/default/SearchResultsPane.tsx +158 -71
  129. package/src/default/SortSelect.tsx +50 -37
  130. package/src/default/UrlIssueNotice.tsx +21 -3
  131. package/src/default/ViewSwitch.tsx +147 -0
  132. package/src/default/index.ts +55 -15
  133. package/src/default/sortLabels.ts +34 -0
  134. package/src/headless/FacetPanel.tsx +30 -2
  135. package/src/headless/useAppliedCount.ts +41 -0
  136. package/src/headless/useScorerNames.ts +36 -0
  137. package/src/headless/useSearchBox.ts +189 -0
  138. package/src/i18n/es.ts +46 -4
  139. package/src/i18n/keys.ts +114 -4
  140. package/src/i18n/ru.ts +50 -4
  141. package/src/index.ts +22 -2
  142. package/src/model/queries.ts +51 -1
  143. package/src/state/limits.ts +50 -0
  144. package/src/state/ranges.ts +144 -0
  145. package/dist/default/ErrorAlert.d.ts +0 -9
  146. package/dist/default/ErrorAlert.d.ts.map +0 -1
  147. package/dist/default/ErrorAlert.js +0 -27
  148. package/dist/default/ErrorAlert.js.map +0 -1
  149. package/dist/default/theme.d.ts +0 -24
  150. package/dist/default/theme.d.ts.map +0 -1
  151. package/dist/default/theme.js +0 -39
  152. package/dist/default/theme.js.map +0 -1
  153. package/src/default/ErrorAlert.tsx +0 -46
  154. package/src/default/theme.tsx +0 -66
@@ -1 +1 @@
1
- {"version":3,"file":"SearchResultsPane.d.ts","sourceRoot":"","sources":["../../src/default/SearchResultsPane.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMlD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAClC,KAAK,EAAE,SAAS,UAAU,EAAE,KACzB,SAAS,CAAC;AAiBf,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAAC;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B;;;;;;;;;OASG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IACtD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAuDD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,YAAY,CA6F7E"}
1
+ {"version":3,"file":"SearchResultsPane.d.ts","sourceRoot":"","sources":["../../src/default/SearchResultsPane.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAWpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAOlD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAClC,KAAK,EAAE,SAAS,UAAU,EAAE,KACzB,SAAS,CAAC;AAEf;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AA+BtC,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAAC;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B;;;;;;;;;OASG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IACtD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;2CACuC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IACtC;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC3C;AA8DD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,YAAY,CAoG7E"}
@@ -1,13 +1,24 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Button, Empty, Flex, Spin, Typography } from "antd";
3
- import { errorCode, matchList, toFlowError, useDescribeFlowError, useT, useTPlural, } from "@stapel/core";
2
+ import { Flex, Typography } from "antd";
3
+ import { errorCode, useT, useTPlural } from "@stapel/core";
4
+ import { EmptyState, ErrorAlert, GatedButton, LoadList, SkinTheme, } from "@stapel/tokens-antd/skin";
5
+ import { spacing } from "@stapel/tokens";
4
6
  import { SearchResults } from "../headless/SearchResults.js";
7
+ import { useScorerNames } from "../headless/useScorerNames.js";
5
8
  import { SEARCH_WINDOW_EXCEEDED } from "../i18n/errorsMap.js";
6
9
  import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
7
10
  import { DegradationNotice } from "./DegradationNotice.js";
8
- import { ErrorAlert } from "./ErrorAlert.js";
9
11
  import { SearchResultCard } from "./SearchResultCard.js";
10
- import { SearchSkinTheme } from "./theme.js";
12
+ /**
13
+ * The widest a column of results is allowed to get.
14
+ *
15
+ * Off the spacing scale and named for it: it is a MEASURE, the reading-width
16
+ * decision every long page has to take. Without it the pane spread the full
17
+ * width of whatever it was dropped into — the visual pass measured a 2560px
18
+ * pane with four cards floating at the top of it and a status row 1350px from
19
+ * the buttons that act on it (class C-NOMAXW).
20
+ */
21
+ export const RESULTS_MAX_WIDTH = 1120;
11
22
  /**
12
23
  * The results grid. `auto-fill` + `minmax(280px, 1fr)`: as many columns as fit,
13
24
  * each at least a readable card and never wider than its share — a catalogue
@@ -19,9 +30,22 @@ import { SearchSkinTheme } from "./theme.js";
19
30
  const RESULTS_GRID = {
20
31
  display: "grid",
21
32
  gridTemplateColumns: "repeat(auto-fill, minmax(280px, 1fr))",
22
- gap: 12,
33
+ gap: spacing[3],
23
34
  alignItems: "stretch",
24
35
  };
36
+ /**
37
+ * The LIST arrangement: one wide row per result.
38
+ *
39
+ * The same grid with one track, deliberately — not a second layout mechanism.
40
+ * A list is a grid whose column count is one, and expressing it that way is
41
+ * what keeps the card slot, the gap and the stretch identical between the two
42
+ * arrangements, so switching views cannot change anything except the number of
43
+ * columns.
44
+ */
45
+ const RESULTS_LIST = {
46
+ ...RESULTS_GRID,
47
+ gridTemplateColumns: "1fr",
48
+ };
25
49
  function Count(props) {
26
50
  // A COUNTED sentence: `tPlural` asks Intl.PluralRules for the locale's
27
51
  // category, so Russian gets three different endings for 1, 3 and 17 instead
@@ -39,30 +63,36 @@ function Count(props) {
39
63
  ? tPlural(SEARCH_I18N_KEYS.resultsCountAtLeast, { count: page.count })
40
64
  : tPlural(SEARCH_I18N_KEYS.resultsCountExact, { count: page.count }) }));
41
65
  }
66
+ /**
67
+ * The keyset controls — rendered only when there IS another page.
68
+ *
69
+ * Keyset paging has no page numbers to jump to: there is a next, a previous,
70
+ * and a server-side depth cap. When neither direction exists the pager is not
71
+ * "disabled", it is absent — a control that can never do anything is not a
72
+ * control that needs explaining.
73
+ */
42
74
  function Pager(props) {
43
75
  const t = useT();
44
- const { prev, next, goPrev, goNext } = props.bag;
45
- return (_jsxs(Flex, { gap: 8, justify: "center", "data-testid": "search-pager", children: [_jsx(Button, { disabled: !prev.available, title: prev.available ? undefined : t(prev.block.code, prev.block.params), onClick: goPrev, "data-analytics": "none", "data-analytics-reason": "keyset paging is a read, not a flow step", "data-testid": "search-prev", children: t(SEARCH_I18N_KEYS.resultsPrev) }), _jsx(Button, { disabled: !next.available, title: next.available ? undefined : t(next.block.code, next.block.params), onClick: goNext, "data-analytics": "none", "data-analytics-reason": "keyset paging is a read, not a flow step", "data-testid": "search-next", children: t(SEARCH_I18N_KEYS.resultsNext) })] }));
76
+ const { page, prev, next, goPrev, goNext } = props.bag;
77
+ if (page === null || (!page.hasNext && !page.hasPrev))
78
+ return null;
79
+ return (_jsxs(Flex, { gap: spacing[2], justify: "center", wrap: true, "data-testid": "search-pager", children: [_jsx(GatedButton, { gate: prev, onClick: goPrev, testId: "search-prev", "data-analytics": "none", "data-analytics-reason": "keyset paging is a read, not a flow step", children: t(SEARCH_I18N_KEYS.resultsPrev) }), _jsx(GatedButton, { gate: next, onClick: goNext, testId: "search-next", "data-analytics": "none", "data-analytics-reason": "keyset paging is a read, not a flow step", children: t(SEARCH_I18N_KEYS.resultsNext) })] }));
46
80
  }
47
81
  export function SearchResultsPane(props) {
48
82
  const t = useT();
49
- const describe = useDescribeFlowError();
50
83
  const { renderCard, renderResults } = props;
51
- return (_jsx(SearchSkinTheme, { ...(props.mode !== undefined ? { mode: props.mode } : {}), children: _jsx(SearchResults, { ...(props.enabled !== undefined ? { enabled: props.enabled } : {}), children: (bag) => (_jsxs(Flex, { vertical: true, gap: 16, children: [_jsxs(Flex, { justify: "space-between", align: "center", wrap: true, gap: 8, children: [_jsx(Typography.Title, { level: 4, style: { margin: 0 }, children: t(SEARCH_I18N_KEYS.resultsTitle) }), _jsxs(Flex, { align: "center", wrap: true, gap: 12, children: [_jsx(Count, { bag: bag }), props.toolbar] })] }), _jsx(DegradationNotice, { degradations: bag.degradations, variant: props.degradationNotice ?? "banner" }), matchList(bag.state, {
52
- loading: () => (_jsx(Flex, { justify: "center", style: { padding: 24 }, children: _jsx(Spin, { "data-testid": "search-loading" }) })),
53
- failed: (error) => {
84
+ const scorerName = useScorerNames();
85
+ const maxWidth = props.maxWidth === undefined ? RESULTS_MAX_WIDTH : props.maxWidth;
86
+ return (_jsx(SkinTheme, { surface: "base", ...(props.mode !== undefined ? { mode: props.mode } : {}), style: {
87
+ width: "100%",
88
+ ...(maxWidth !== null ? { maxWidth } : {}),
89
+ }, children: _jsx(SearchResults, { ...(props.enabled !== undefined ? { enabled: props.enabled } : {}), children: (bag) => (_jsxs(Flex, { vertical: true, gap: spacing[4], children: [_jsxs(Flex, { justify: "space-between", align: "center", wrap: true, gap: spacing[2], children: [_jsx(Typography.Title, { level: props.headingLevel ?? 4, style: { margin: 0 }, "data-testid": "search-results-heading", children: props.heading ?? t(SEARCH_I18N_KEYS.resultsTitle) }), _jsxs(Flex, { align: "center", wrap: true, gap: spacing[3], children: [_jsx(Count, { bag: bag }), props.toolbar] })] }), _jsx(DegradationNotice, { degradations: bag.degradations, variant: props.degradationNotice ?? "banner", scorerName: scorerName }), _jsx(LoadList, { state: bag.state, testId: "search", skeletonRows: 6, onRetry: bag.refetch, empty: _jsx(EmptyState, { title: t(SEARCH_I18N_KEYS.resultsEmpty), testId: "search-empty" }), failed: (error) => {
54
90
  // The window refusal is a DIFFERENT sentence from a failed
55
91
  // search, and both are different from "nothing found".
56
92
  const isWindow = errorCode(error) === SEARCH_WINDOW_EXCEEDED;
57
- return (_jsx(ErrorAlert, { testId: isWindow ? "search-window-exceeded" : "search-failed", error: {
58
- ...describe(toFlowError(error)),
59
- message: t(isWindow
60
- ? SEARCH_I18N_KEYS.resultsWindowExceeded
61
- : SEARCH_I18N_KEYS.resultsLoadFailed),
62
- }, action: _jsx(Button, { size: "small", onClick: bag.refetch, "data-analytics": "none", "data-analytics-reason": "retry of a failed read; no flow to step", children: t(SEARCH_I18N_KEYS.resultsRetry) }) }));
63
- },
64
- empty: () => (_jsx(Empty, { "data-testid": "search-empty", description: t(SEARCH_I18N_KEYS.resultsEmpty) })),
65
- ready: (items) => (_jsx("div", { "data-testid": "search-results", children: renderResults !== undefined ? (renderResults(items)) : (_jsx("div", { style: RESULTS_GRID, "data-testid": "search-results-grid", children: items.map((item) => (_jsx("div", { children: renderCard !== undefined ? (renderCard(item)) : (_jsx(SearchResultCard, { item: item })) }, item.key))) })) })),
66
- }), _jsx(Pager, { bag: bag }), props.footer] })) }) }));
93
+ return (_jsx(ErrorAlert, { testId: isWindow ? "search-window-exceeded" : "search-failed", thrown: error, message: t(isWindow
94
+ ? SEARCH_I18N_KEYS.resultsWindowExceeded
95
+ : SEARCH_I18N_KEYS.resultsLoadFailed), retryLabel: t(SEARCH_I18N_KEYS.resultsRetry), onRetry: bag.refetch }));
96
+ }, children: (items) => (_jsx("div", { "data-testid": "search-results", children: renderResults !== undefined ? (renderResults(items)) : (_jsx("div", { style: props.layout === "list" ? RESULTS_LIST : RESULTS_GRID, "data-testid": "search-results-grid", "data-layout": props.layout ?? "grid", children: items.map((item) => (_jsx("div", { children: renderCard !== undefined ? (renderCard(item)) : (_jsx(SearchResultCard, { item: item })) }, item.key))) })) })) }), _jsx(Pager, { bag: bag }), props.footer] })) }) }));
67
97
  }
68
98
  //# sourceMappingURL=SearchResultsPane.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchResultsPane.js","sourceRoot":"","sources":["../../src/default/SearchResultsPane.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SearchResultsPane.js","sourceRoot":"","sources":["../../src/default/SearchResultsPane.tsx"],"names":[],"mappings":"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"}
@@ -10,10 +10,18 @@
10
10
  *
11
11
  * `sort=distance` needs a centre — the server answers
12
12
  * `error.400.search_sort_needs_center` without one. The option is therefore
13
- * DISABLED with the reason named when no geo centre is set, rather than
14
- * offered and then refused.
13
+ * DISABLED when no geo centre is set, and the REASON is rendered beside the
14
+ * control through `GatedControl`, not in a `title=` a phone can never surface.
15
+ * That is the whole defect this file used to carry: the one sort a person
16
+ * would most want on a phone was greyed out with its explanation in a hover.
15
17
  */
16
18
  import type { ReactElement } from "react";
19
+ /**
20
+ * The select's floor width. Off the spacing scale on purpose and named for it:
21
+ * it is the width of the longest shipped sort label ("Price: low to high") at
22
+ * the default type step, so the control does not resize as the choice changes.
23
+ */
24
+ export declare const SORT_SELECT_MIN_WIDTH = 200;
17
25
  export interface SortSelectProps {
18
26
  /** The sort the SERVER applied, shown when the URL names none. Omitted, it
19
27
  * is read from the page already in cache — see {@link useAppliedSort}. */
@@ -1 +1 @@
1
- {"version":3,"file":"SortSelect.d.ts","sourceRoot":"","sources":["../../src/default/SortSelect.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAgB1C,MAAM,WAAW,eAAe;IAC9B;8EAC0E;IAC1E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CAgD/D"}
1
+ {"version":3,"file":"SortSelect.d.ts","sourceRoot":"","sources":["../../src/default/SortSelect.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAY1C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,MAAM,WAAW,eAAe;IAC9B;8EAC0E;IAC1E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CAwD/D"}
@@ -1,17 +1,19 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Flex, Select, Typography } from "antd";
3
- import { useT } from "@stapel/core";
3
+ import { actionAvailable, actionBlocked, useT } from "@stapel/core";
4
+ import { GatedControl } from "@stapel/tokens-antd/skin";
5
+ import { spacing } from "@stapel/tokens";
4
6
  import { SEARCH_SORTS } from "../api/types.js";
5
7
  import { useAppliedSort } from "../headless/useAppliedSort.js";
6
8
  import { useSearchState } from "../headless/SearchStateProvider.js";
7
9
  import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
8
- const SORT_LABEL_KEY = {
9
- relevance: SEARCH_I18N_KEYS.sortRelevance,
10
- newest: SEARCH_I18N_KEYS.sortNewest,
11
- price_asc: SEARCH_I18N_KEYS.sortPriceAsc,
12
- price_desc: SEARCH_I18N_KEYS.sortPriceDesc,
13
- distance: SEARCH_I18N_KEYS.sortDistance,
14
- };
10
+ import { sortLabelKey } from "./sortLabels.js";
11
+ /**
12
+ * The select's floor width. Off the spacing scale on purpose and named for it:
13
+ * it is the width of the longest shipped sort label ("Price: low to high") at
14
+ * the default type step, so the control does not resize as the choice changes.
15
+ */
16
+ export const SORT_SELECT_MIN_WIDTH = 200;
15
17
  export function SortSelect(props) {
16
18
  const t = useT();
17
19
  const { state, setSort } = useSearchState();
@@ -28,21 +30,22 @@ export function SortSelect(props) {
28
30
  const values = active !== undefined && !known.has(active)
29
31
  ? [...SEARCH_SORTS, active]
30
32
  : SEARCH_SORTS;
31
- return (_jsxs(Flex, { gap: 8, align: "center", children: [_jsx(Typography.Text, { type: "secondary", children: t(SEARCH_I18N_KEYS.sortLabel) }), _jsx(Select, { "data-testid": "search-sort", style: { minWidth: 180 }, value: active ?? null, onChange: (next) => {
32
- setSort(next);
33
- }, options: values.map((value) => {
34
- const key = SORT_LABEL_KEY[value];
35
- const needsCentre = value === "distance" && !hasCentre;
36
- return {
37
- value,
38
- label: key !== undefined ? t(key) : value,
39
- disabled: needsCentre,
40
- // A disabled control states its reason (the ActionAvailability
41
- // canon), even inside a select.
42
- ...(needsCentre
43
- ? { title: t("error.400.search_sort_needs_center") }
44
- : {}),
45
- };
46
- }) })] }));
33
+ // The gate is about ONE option, not the whole control so the binding's
34
+ // `aria-describedby` is spread onto the select (a screen reader hears the
35
+ // reason with the control) and its `disabled` deliberately is not: the other
36
+ // four sorts work perfectly well without a location.
37
+ const distance = hasCentre
38
+ ? actionAvailable()
39
+ : actionBlocked("error.400.search_sort_needs_center");
40
+ return (_jsx(GatedControl, { gate: distance, testId: "search-sort-gate", children: (bind) => (_jsxs(Flex, { gap: spacing[2], align: "center", children: [_jsx(Typography.Text, { type: "secondary", "aria-hidden": "true", children: t(SEARCH_I18N_KEYS.sortLabel) }), _jsx(Select, { "data-testid": "search-sort", "aria-label": t(SEARCH_I18N_KEYS.sortLabel), "aria-describedby": bind["aria-describedby"], style: { minWidth: SORT_SELECT_MIN_WIDTH }, value: active ?? null, onChange: (next) => {
41
+ setSort(next);
42
+ }, options: values.map((value) => {
43
+ const key = sortLabelKey(value);
44
+ return {
45
+ value,
46
+ label: key !== undefined ? t(key) : value,
47
+ disabled: value === "distance" && !hasCentre,
48
+ };
49
+ }) })] })) }));
47
50
  }
48
51
  //# sourceMappingURL=SortSelect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SortSelect.js","sourceRoot":"","sources":["../../src/default/SortSelect.tsx"],"names":[],"mappings":";AAgBA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,cAAc,GAAqC;IACvD,SAAS,EAAE,gBAAgB,CAAC,aAAa;IACzC,MAAM,EAAE,gBAAgB,CAAC,UAAU;IACnC,SAAS,EAAE,gBAAgB,CAAC,YAAY;IACxC,UAAU,EAAE,gBAAgB,CAAC,aAAa;IAC1C,QAAQ,EAAE,gBAAgB,CAAC,YAAY;CACxC,CAAC;AAQF,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC5C,yEAAyE;IACzE,2EAA2E;IAC3E,wEAAwE;IACxE,2BAA2B;IAC3B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IAEjC,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC;IAC1D,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IACpC,MAAM,MAAM,GACV,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QACxC,CAAC,CAAC,CAAC,GAAG,YAAY,EAAE,MAAM,CAAC;QAC3B,CAAC,CAAC,YAAY,CAAC;IAEnB,OAAO,CACL,MAAC,IAAI,IAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAC,QAAQ,aAC1B,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,WAAW,YAC9B,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,GACd,EAClB,KAAC,MAAM,mBACO,aAAa,EACzB,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EACxB,KAAK,EAAE,MAAM,IAAI,IAAI,EACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;oBACjB,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC,EACD,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC5B,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;oBAClC,MAAM,WAAW,GAAG,KAAK,KAAK,UAAU,IAAI,CAAC,SAAS,CAAC;oBACvD,OAAO;wBACL,KAAK;wBACL,KAAK,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK;wBACzC,QAAQ,EAAE,WAAW;wBACrB,+DAA+D;wBAC/D,gCAAgC;wBAChC,GAAG,CAAC,WAAW;4BACb,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,oCAAoC,CAAC,EAAE;4BACpD,CAAC,CAAC,EAAE,CAAC;qBACR,CAAC;gBACJ,CAAC,CAAC,GACF,IACG,CACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"SortSelect.js","sourceRoot":"","sources":["../../src/default/SortSelect.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"UrlIssueNotice.d.ts","sourceRoot":"","sources":["../../src/default/UrlIssueNotice.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,wBAAgB,cAAc,IAAI,YAAY,GAAG,IAAI,CAqBpD"}
1
+ {"version":3,"file":"UrlIssueNotice.d.ts","sourceRoot":"","sources":["../../src/default/UrlIssueNotice.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAwB1C,wBAAgB,cAAc,IAAI,YAAY,GAAG,IAAI,CAqBpD"}
@@ -1,13 +1,31 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Alert } from "antd";
3
+ import { spacing } from "@stapel/tokens";
3
4
  import { useT } from "@stapel/core";
5
+ import { FILTER_PREFIX, RANGE_PREFIX } from "../state/urlState.js";
4
6
  import { useSearchState } from "../headless/SearchStateProvider.js";
5
7
  import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
8
+ /**
9
+ * The parameter as a person can recognise it.
10
+ *
11
+ * The codec reports the WIRE name, which for a facet or a range carries the
12
+ * prefix that tells the backend which family it belongs to (`r.price`,
13
+ * `f.brand`). That prefix is a protocol detail: the sentence is read by
14
+ * somebody who followed a link, and "price" is the part of `r.price` they
15
+ * have any chance of recognising.
16
+ */
17
+ function readableParam(param) {
18
+ for (const prefix of [RANGE_PREFIX, FILTER_PREFIX]) {
19
+ if (param.startsWith(prefix))
20
+ return param.slice(prefix.length);
21
+ }
22
+ return param;
23
+ }
6
24
  export function UrlIssueNotice() {
7
25
  const t = useT();
8
26
  const { issues } = useSearchState();
9
27
  if (issues.length === 0)
10
28
  return null;
11
- return (_jsx(Alert, { type: "warning", showIcon: true, "data-testid": "search-url-issues", message: t(SEARCH_I18N_KEYS.urlIssuesTitle), description: _jsx("ul", { style: { margin: 0, paddingInlineStart: 20 }, children: issues.map((issue) => (_jsx("li", { children: t(issue.messageKey, { param: issue.param }) }, `${issue.param}:${issue.code}`))) }) }));
29
+ return (_jsx(Alert, { type: "warning", showIcon: true, "data-testid": "search-url-issues", title: t(SEARCH_I18N_KEYS.urlIssuesTitle), description: _jsx("ul", { style: { margin: 0, paddingInlineStart: spacing[5] }, children: issues.map((issue) => (_jsx("li", { children: t(issue.messageKey, { param: readableParam(issue.param) }) }, `${issue.param}:${issue.code}`))) }) }));
12
30
  }
13
31
  //# sourceMappingURL=UrlIssueNotice.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UrlIssueNotice.js","sourceRoot":"","sources":["../../src/default/UrlIssueNotice.tsx"],"names":[],"mappings":";AAUA,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,CACL,KAAC,KAAK,IACJ,IAAI,EAAC,SAAS,EACd,QAAQ,uBACI,mBAAmB,EAC/B,OAAO,EAAE,CAAC,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAC3C,WAAW,EACT,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,EAAE,EAAE,EAAE,YAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,uBACG,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,IADrC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAElC,CACN,CAAC,GACC,GAEP,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"UrlIssueNotice.js","sourceRoot":"","sources":["../../src/default/UrlIssueNotice.tsx"],"names":[],"mappings":";AAUA,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;;;;;;GAQG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,KAAK,MAAM,MAAM,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,CACL,KAAC,KAAK,IACJ,IAAI,EAAC,SAAS,EACd,QAAQ,uBACI,mBAAmB,EAC/B,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,cAAc,CAAC,EACzC,WAAW,EACT,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,YACrD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,uBACG,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,IADpD,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAElC,CACN,CAAC,GACC,GAEP,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * `<ViewSwitch>` — how the results are ARRANGED: a list, a grid, or something
3
+ * the deployment brought with it.
4
+ *
5
+ * ## Why two of the three views ship and the third is a slot
6
+ *
7
+ * A list and a grid are the SAME data in two arrangements: one column of wide
8
+ * rows, or as many card columns as fit. That is a layout decision and a search
9
+ * pair can take it. A MAP is not — it needs a tile source, a projection, a
10
+ * marker layer and a geocoder, all of which live in `geo-react` and none of
11
+ * which a search package may depend on. So the third view arrives as a
12
+ * {@link SearchView} the host declares, with its own `render`, and this
13
+ * component treats it exactly like the two it ships. A pair that hardcoded a
14
+ * "map" button and then had nothing to draw would be offering a control that
15
+ * cannot work — the defect class the fleet calls a silent slot.
16
+ *
17
+ * ## The view is not URL state, and that is deliberate
18
+ *
19
+ * `sort`, `page size`, every filter and the cursor are in the query string,
20
+ * because they change WHAT the answer is and a shared link has to carry them.
21
+ * The view changes only how the same answer is drawn. Putting it in the URL
22
+ * would make every arrangement flip a new history entry and would rewrite the
23
+ * meaning of a link somebody sent. The page holds it in component state and
24
+ * offers `defaultView`/`onViewChange` so a host that wants it remembered can
25
+ * persist it wherever it keeps preferences.
26
+ */
27
+ import type { ReactElement, ReactNode } from "react";
28
+ import type { SearchResultsRenderer } from "./SearchResultsPane.js";
29
+ /** How the pane's own arrangements lay a page of results out. */
30
+ export type SearchResultsLayout = "grid" | "list";
31
+ /** One arrangement offered by the switch. */
32
+ export interface SearchView {
33
+ /** Stable id — what `defaultView`/`onViewChange` speak in. */
34
+ readonly id: string;
35
+ /** i18n KEY for the view's name (never a literal: the switch is chrome). */
36
+ readonly labelKey: string;
37
+ /** The glyph beside the name. Omitted, the name stands alone. */
38
+ readonly icon?: ReactNode;
39
+ /**
40
+ * One of the pane's own arrangements. Ignored when {@link SearchView.render}
41
+ * is present, which replaces the arrangement entirely.
42
+ */
43
+ readonly layout?: SearchResultsLayout;
44
+ /**
45
+ * The whole result surface, for a view the pair cannot draw — a map, a
46
+ * comparison table. It receives the loaded rows; the pane keeps its four
47
+ * load arms around it, so "nothing found" and "we could not run this search"
48
+ * stay the pane's sentences rather than the slot's problem.
49
+ */
50
+ readonly render?: SearchResultsRenderer;
51
+ }
52
+ /** The two arrangements the pair itself can draw. */
53
+ export declare const SEARCH_BUILTIN_VIEWS: readonly SearchView[];
54
+ /** The view `id` currently in force, or the first offered one. */
55
+ export declare function resolveView(views: readonly SearchView[], id: string | undefined): SearchView | undefined;
56
+ export interface ViewSwitchProps {
57
+ readonly views: readonly SearchView[];
58
+ readonly value: string;
59
+ readonly onChange: (id: string) => void;
60
+ }
61
+ /**
62
+ * The switch itself. Renders nothing for a single view: a control offering one
63
+ * choice is not a control, it is a label that can be clicked.
64
+ */
65
+ export declare function ViewSwitch(props: ViewSwitchProps): ReactElement | null;
66
+ //# sourceMappingURL=ViewSwitch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewSwitch.d.ts","sourceRoot":"","sources":["../../src/default/ViewSwitch.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,iEAAiE;AACjE,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,CAAC;AAElD,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;CACzC;AAyCD,qDAAqD;AACrD,eAAO,MAAM,oBAAoB,EAAE,SAAS,UAAU,EAarD,CAAC;AAEF,kEAAkE;AAClE,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,EAAE,EAAE,MAAM,GAAG,SAAS,GACrB,UAAU,GAAG,SAAS,CAExB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,CAgBtE"}
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Segmented } from "antd";
3
+ import { useT } from "@stapel/core";
4
+ import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
5
+ /** Rows — one wide row per result, the arrangement a scan reads fastest. */
6
+ function ListGlyph() {
7
+ return (_jsx(ViewGlyph, { children: _jsx("path", { d: "M4 6.5h16M4 12h16M4 17.5h16" }) }));
8
+ }
9
+ /** Cards — as many columns as fit. */
10
+ function GridGlyph() {
11
+ return (_jsxs(ViewGlyph, { children: [_jsx("rect", { x: "4", y: "4", width: "7", height: "7", rx: "1.5" }), _jsx("rect", { x: "13", y: "4", width: "7", height: "7", rx: "1.5" }), _jsx("rect", { x: "4", y: "13", width: "7", height: "7", rx: "1.5" }), _jsx("rect", { x: "13", y: "13", width: "7", height: "7", rx: "1.5" })] }));
12
+ }
13
+ function ViewGlyph(props) {
14
+ return (_jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", strokeLinecap: "round", role: "img", "aria-hidden": "true", children: props.children }));
15
+ }
16
+ /** The two arrangements the pair itself can draw. */
17
+ export const SEARCH_BUILTIN_VIEWS = [
18
+ {
19
+ id: "list",
20
+ labelKey: SEARCH_I18N_KEYS.viewList,
21
+ icon: _jsx(ListGlyph, {}),
22
+ layout: "list",
23
+ },
24
+ {
25
+ id: "grid",
26
+ labelKey: SEARCH_I18N_KEYS.viewGrid,
27
+ icon: _jsx(GridGlyph, {}),
28
+ layout: "grid",
29
+ },
30
+ ];
31
+ /** The view `id` currently in force, or the first offered one. */
32
+ export function resolveView(views, id) {
33
+ return views.find((view) => view.id === id) ?? views[0];
34
+ }
35
+ /**
36
+ * The switch itself. Renders nothing for a single view: a control offering one
37
+ * choice is not a control, it is a label that can be clicked.
38
+ */
39
+ export function ViewSwitch(props) {
40
+ const t = useT();
41
+ if (props.views.length < 2)
42
+ return null;
43
+ return (_jsx(Segmented, { "aria-label": t(SEARCH_I18N_KEYS.viewLabel), value: props.value, "data-testid": "search-view-switch", onChange: props.onChange, options: props.views.map((view) => ({
44
+ value: view.id,
45
+ label: t(view.labelKey),
46
+ ...(view.icon !== undefined ? { icon: view.icon } : {}),
47
+ })) }));
48
+ }
49
+ //# sourceMappingURL=ViewSwitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewSwitch.js","sourceRoot":"","sources":["../../src/default/ViewSwitch.tsx"],"names":[],"mappings":"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"}
@@ -6,37 +6,60 @@
6
6
  * never pays for this bundle (enforced by size-limit and the bundle-purity
7
7
  * test).
8
8
  *
9
- * Three override levers, none of which requires forking anything:
9
+ * Five override levers, none of which requires forking anything:
10
10
  *
11
11
  * 1. **`renderCard`** — the card slot. A storefront passes
12
12
  * `<ListingCard>` from `@stapel/listings-react/default`; the generic card
13
13
  * here is the documented default, not the intended end state (spec §3.7).
14
14
  * `renderResults` is the level above it: the whole layout, for a container
15
15
  * whose arrangement is not "cards in a grid".
16
- * 2. **`categoryFeatures`** — the facet-label slot. The server sends
17
- * `{value: count}` and no labels; the schema that names them lives in
18
- * categories, and the container hands it in (spec §6.2 item 2).
19
- * 3. **retheming through the §68 token JSON** — every surface wraps itself
20
- * in `<SearchSkinTheme>`, so a host's regenerated `--stapel-*` custom
16
+ * 2. **`categoryFeatures`** — the facet-label slot, and the source of which
17
+ * slugs get a numeric range row. The server sends `{value: count}` and no
18
+ * labels; the schema that names them lives in categories, and the
19
+ * container hands it in (spec §6.2 item 2).
20
+ * 3. **`renderCategoryFilter`** the catalogue picker. `categories-react`
21
+ * owns walking the tree; this pair owns the `category` parameter.
22
+ * 4. **`renderGeoFilter`** — the location control. `geo-react` owns the map
23
+ * and the geocoder; this pair owns `lat`/`lon`/`radius_km`/`bbox`, and
24
+ * keeps the controls that WIDEN a location a link already carries.
25
+ * 5. **retheming through the §68 token JSON** — every surface wraps itself
26
+ * in the shared `SkinTheme`, so a host's regenerated `--stapel-*` custom
21
27
  * properties reach this skin with zero code.
28
+ *
29
+ * The pair's own `theme.tsx` and `ErrorAlert.tsx` are GONE as of 0.6.0: both
30
+ * were copies of a decision now stated once in `@stapel/tokens-antd/skin`
31
+ * (`SkinTheme`, `ErrorAlert`). A host that imported `SearchSkinTheme` imports
32
+ * `SkinTheme` from the substrate instead — same props, one implementation, and
33
+ * a runtime `data-theme` flip actually repaints it.
22
34
  */
23
35
  export { SearchPage } from "./SearchPage.js";
24
- export type { SearchPageProps } from "./SearchPage.js";
25
- export { SearchResultsPane } from "./SearchResultsPane.js";
36
+ export type { SearchPageProps, SearchFiltersLayout } from "./SearchPage.js";
37
+ export { SearchResultsPane, RESULTS_MAX_WIDTH } from "./SearchResultsPane.js";
26
38
  export type { SearchResultsPaneProps, SearchResultsRenderer, } from "./SearchResultsPane.js";
39
+ export { FilterChips, CHIP_ROW_CLASS, CHIP_ROW_STYLE_HREF, chipRowCss } from "./FilterChips.js";
40
+ export type { FilterChipsProps } from "./FilterChips.js";
41
+ export { FacetGroupControl, facetGroupShape, facetOptionNodes, FACET_VISIBLE_OPTIONS, } from "./FacetGroupControl.js";
42
+ export type { FacetGroupControlProps, FacetGroupShape, FacetOptionNode, } from "./FacetGroupControl.js";
27
43
  export { FacetPanelPane } from "./FacetPanelPane.js";
28
- export type { FacetPanelPaneProps } from "./FacetPanelPane.js";
29
- export { RankingDisclosurePane } from "./RankingDisclosurePane.js";
44
+ export type { FacetPanelPaneProps, CategoryFilterSlotProps, GeoFilterSlotProps, } from "./FacetPanelPane.js";
45
+ export { RankingDisclosurePane, RANKING_MAX_WIDTH } from "./RankingDisclosurePane.js";
30
46
  export type { RankingDisclosurePaneProps } from "./RankingDisclosurePane.js";
47
+ export { SearchBox } from "./SearchBox.js";
48
+ export type { SearchBoxProps } from "./SearchBox.js";
49
+ export { SortSelect, SORT_SELECT_MIN_WIDTH } from "./SortSelect.js";
50
+ export type { SortSelectProps } from "./SortSelect.js";
51
+ export { ViewSwitch, SEARCH_BUILTIN_VIEWS, resolveView } from "./ViewSwitch.js";
52
+ export type { ViewSwitchProps, SearchView, SearchResultsLayout } from "./ViewSwitch.js";
53
+ export { PageSizeSelect, SEARCH_PAGE_SIZES } from "./PageSizeSelect.js";
54
+ export type { PageSizeSelectProps } from "./PageSizeSelect.js";
55
+ export { LanguageSelect } from "./LanguageSelect.js";
56
+ export type { LanguageSelectProps } from "./LanguageSelect.js";
31
57
  export { SearchResultCard, GENERIC_CARD_FIELDS } from "./SearchResultCard.js";
32
58
  export type { SearchCardProps, SearchCardRenderer } from "./SearchResultCard.js";
33
59
  export { DegradationNotice } from "./DegradationNotice.js";
34
60
  export type { DegradationNoticeProps, DegradationNoticeVariant, } from "./DegradationNotice.js";
35
61
  export { UrlIssueNotice } from "./UrlIssueNotice.js";
36
- export { SortSelect } from "./SortSelect.js";
37
- export type { SortSelectProps } from "./SortSelect.js";
38
- export { ErrorAlert } from "./ErrorAlert.js";
39
- export { SearchSkinTheme } from "./theme.js";
40
- export type { SearchSkinThemeProps } from "./theme.js";
62
+ export { RangeFilterRow } from "./RangeFilterRow.js";
63
+ export type { RangeFilterRowProps } from "./RangeFilterRow.js";
41
64
  export type { ThemeModeProp } from "./types.js";
42
65
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/default/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAG7E,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EACV,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/default/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE5E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC9E,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChG,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,sBAAsB,EACtB,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EACV,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACtF,YAAY,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAG7E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACpE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAChF,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxE,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EACV,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -6,31 +6,48 @@
6
6
  * never pays for this bundle (enforced by size-limit and the bundle-purity
7
7
  * test).
8
8
  *
9
- * Three override levers, none of which requires forking anything:
9
+ * Five override levers, none of which requires forking anything:
10
10
  *
11
11
  * 1. **`renderCard`** — the card slot. A storefront passes
12
12
  * `<ListingCard>` from `@stapel/listings-react/default`; the generic card
13
13
  * here is the documented default, not the intended end state (spec §3.7).
14
14
  * `renderResults` is the level above it: the whole layout, for a container
15
15
  * whose arrangement is not "cards in a grid".
16
- * 2. **`categoryFeatures`** — the facet-label slot. The server sends
17
- * `{value: count}` and no labels; the schema that names them lives in
18
- * categories, and the container hands it in (spec §6.2 item 2).
19
- * 3. **retheming through the §68 token JSON** — every surface wraps itself
20
- * in `<SearchSkinTheme>`, so a host's regenerated `--stapel-*` custom
16
+ * 2. **`categoryFeatures`** — the facet-label slot, and the source of which
17
+ * slugs get a numeric range row. The server sends `{value: count}` and no
18
+ * labels; the schema that names them lives in categories, and the
19
+ * container hands it in (spec §6.2 item 2).
20
+ * 3. **`renderCategoryFilter`** the catalogue picker. `categories-react`
21
+ * owns walking the tree; this pair owns the `category` parameter.
22
+ * 4. **`renderGeoFilter`** — the location control. `geo-react` owns the map
23
+ * and the geocoder; this pair owns `lat`/`lon`/`radius_km`/`bbox`, and
24
+ * keeps the controls that WIDEN a location a link already carries.
25
+ * 5. **retheming through the §68 token JSON** — every surface wraps itself
26
+ * in the shared `SkinTheme`, so a host's regenerated `--stapel-*` custom
21
27
  * properties reach this skin with zero code.
28
+ *
29
+ * The pair's own `theme.tsx` and `ErrorAlert.tsx` are GONE as of 0.6.0: both
30
+ * were copies of a decision now stated once in `@stapel/tokens-antd/skin`
31
+ * (`SkinTheme`, `ErrorAlert`). A host that imported `SearchSkinTheme` imports
32
+ * `SkinTheme` from the substrate instead — same props, one implementation, and
33
+ * a runtime `data-theme` flip actually repaints it.
22
34
  */
23
35
  // ── surfaces ────────────────────────────────────────────────────────────────
24
36
  export { SearchPage } from "./SearchPage.js";
25
- export { SearchResultsPane } from "./SearchResultsPane.js";
37
+ export { SearchResultsPane, RESULTS_MAX_WIDTH } from "./SearchResultsPane.js";
38
+ export { FilterChips, CHIP_ROW_CLASS, CHIP_ROW_STYLE_HREF, chipRowCss } from "./FilterChips.js";
39
+ export { FacetGroupControl, facetGroupShape, facetOptionNodes, FACET_VISIBLE_OPTIONS, } from "./FacetGroupControl.js";
26
40
  export { FacetPanelPane } from "./FacetPanelPane.js";
27
- export { RankingDisclosurePane } from "./RankingDisclosurePane.js";
41
+ export { RankingDisclosurePane, RANKING_MAX_WIDTH } from "./RankingDisclosurePane.js";
42
+ // ── controls, exported so a host can compose its own layout ─────────────────
43
+ export { SearchBox } from "./SearchBox.js";
44
+ export { SortSelect, SORT_SELECT_MIN_WIDTH } from "./SortSelect.js";
45
+ export { ViewSwitch, SEARCH_BUILTIN_VIEWS, resolveView } from "./ViewSwitch.js";
46
+ export { PageSizeSelect, SEARCH_PAGE_SIZES } from "./PageSizeSelect.js";
47
+ export { LanguageSelect } from "./LanguageSelect.js";
28
48
  // ── parts, exported so a host can compose or wrap one ───────────────────────
29
49
  export { SearchResultCard, GENERIC_CARD_FIELDS } from "./SearchResultCard.js";
30
50
  export { DegradationNotice } from "./DegradationNotice.js";
31
51
  export { UrlIssueNotice } from "./UrlIssueNotice.js";
32
- export { SortSelect } from "./SortSelect.js";
33
- export { ErrorAlert } from "./ErrorAlert.js";
34
- // ── theming ─────────────────────────────────────────────────────────────────
35
- export { SearchSkinTheme } from "./theme.js";
52
+ export { RangeFilterRow } from "./RangeFilterRow.js";
36
53
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/default/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,+EAA+E;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAM3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,+EAA+E;AAC/E,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,+EAA+E;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/default/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,+EAA+E;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAM9E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGhG,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOrD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGtF,+EAA+E;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEhF,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,+EAA+E;AAC/E,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}