instantsearch.js 4.44.1 → 4.46.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 (105) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/cjs/components/Hits/Hits.js +3 -1
  3. package/cjs/components/InfiniteHits/InfiniteHits.js +3 -1
  4. package/cjs/components/Template/Template.js +13 -3
  5. package/cjs/connectors/hits-per-page/connectHitsPerPage.js +3 -1
  6. package/cjs/connectors/numeric-menu/connectNumericMenu.js +27 -2
  7. package/cjs/connectors/rating-menu/connectRatingMenu.js +10 -4
  8. package/cjs/connectors/sort-by/connectSortBy.js +3 -1
  9. package/cjs/lib/createHelpers.js +3 -1
  10. package/cjs/lib/formatNumber.js +10 -0
  11. package/cjs/lib/utils/cx.js +10 -0
  12. package/cjs/lib/utils/index.js +10 -1
  13. package/cjs/lib/utils/renderTemplate.js +17 -2
  14. package/cjs/lib/version.js +1 -1
  15. package/cjs/widgets/answers/defaultTemplates.js +6 -2
  16. package/cjs/widgets/breadcrumb/defaultTemplates.js +6 -2
  17. package/cjs/widgets/clear-refinements/clear-refinements.js +2 -2
  18. package/cjs/widgets/clear-refinements/defaultTemplates.js +3 -1
  19. package/cjs/widgets/geo-search/createHTMLMarker.js +10 -4
  20. package/cjs/widgets/geo-search/defaultTemplates.js +18 -4
  21. package/cjs/widgets/hierarchical-menu/defaultTemplates.js +26 -2
  22. package/cjs/widgets/hits/defaultTemplates.js +3 -1
  23. package/cjs/widgets/infinite-hits/defaultTemplates.js +9 -3
  24. package/cjs/widgets/menu/defaultTemplates.js +26 -2
  25. package/cjs/widgets/menu-select/defaultTemplates.js +11 -2
  26. package/cjs/widgets/numeric-menu/defaultTemplates.js +20 -1
  27. package/cjs/widgets/range-input/range-input.js +6 -2
  28. package/cjs/widgets/rating-menu/defaultTemplates.js +57 -1
  29. package/cjs/widgets/refinement-list/defaultTemplates.js +38 -3
  30. package/cjs/widgets/relevant-sort/defaultTemplates.js +3 -1
  31. package/cjs/widgets/search-box/defaultTemplates.js +62 -3
  32. package/cjs/widgets/stats/stats.js +70 -22
  33. package/cjs/widgets/toggle-refinement/defaultTemplates.js +4 -1
  34. package/cjs/widgets/voice-search/defaultTemplates.js +81 -9
  35. package/dist/instantsearch.development.d.ts +171 -29
  36. package/dist/instantsearch.development.js +1430 -671
  37. package/dist/instantsearch.development.js.map +1 -1
  38. package/dist/instantsearch.production.d.ts +171 -29
  39. package/dist/instantsearch.production.min.d.ts +171 -29
  40. package/dist/instantsearch.production.min.js +2 -2
  41. package/dist/instantsearch.production.min.js.map +1 -1
  42. package/es/components/Answers/Answers.d.ts +2 -2
  43. package/es/components/Hits/Hits.d.ts +3 -3
  44. package/es/components/Hits/Hits.js +3 -1
  45. package/es/components/InfiniteHits/InfiniteHits.d.ts +3 -3
  46. package/es/components/InfiniteHits/InfiniteHits.js +3 -1
  47. package/es/components/Template/Template.d.ts +4 -2
  48. package/es/components/Template/Template.js +14 -4
  49. package/es/connectors/answers/connectAnswers.d.ts +2 -2
  50. package/es/connectors/autocomplete/connectAutocomplete.d.ts +2 -2
  51. package/es/connectors/hits-per-page/connectHitsPerPage.d.ts +5 -0
  52. package/es/connectors/hits-per-page/connectHitsPerPage.js +3 -1
  53. package/es/connectors/numeric-menu/connectNumericMenu.d.ts +8 -0
  54. package/es/connectors/numeric-menu/connectNumericMenu.js +27 -2
  55. package/es/connectors/rating-menu/connectRatingMenu.d.ts +2 -0
  56. package/es/connectors/rating-menu/connectRatingMenu.js +10 -4
  57. package/es/connectors/sort-by/connectSortBy.d.ts +5 -0
  58. package/es/connectors/sort-by/connectSortBy.js +3 -1
  59. package/es/lib/createHelpers.js +2 -1
  60. package/es/lib/formatNumber.d.ts +1 -0
  61. package/es/lib/formatNumber.js +3 -0
  62. package/es/lib/insights/client.d.ts +2 -2
  63. package/es/lib/utils/createSendEventForHits.d.ts +3 -3
  64. package/es/lib/utils/cx.d.ts +1 -0
  65. package/es/lib/utils/cx.js +3 -0
  66. package/es/lib/utils/index.d.ts +1 -0
  67. package/es/lib/utils/index.js +2 -1
  68. package/es/lib/utils/renderTemplate.d.ts +4 -3
  69. package/es/lib/utils/renderTemplate.js +15 -2
  70. package/es/lib/version.d.ts +1 -1
  71. package/es/lib/version.js +1 -1
  72. package/es/types/connector.d.ts +2 -2
  73. package/es/types/templates.d.ts +16 -3
  74. package/es/widgets/answers/defaultTemplates.js +6 -2
  75. package/es/widgets/breadcrumb/defaultTemplates.js +6 -2
  76. package/es/widgets/clear-refinements/clear-refinements.d.ts +3 -1
  77. package/es/widgets/clear-refinements/clear-refinements.js +2 -2
  78. package/es/widgets/clear-refinements/defaultTemplates.js +3 -1
  79. package/es/widgets/geo-search/createHTMLMarker.d.ts +2 -1
  80. package/es/widgets/geo-search/createHTMLMarker.js +8 -1
  81. package/es/widgets/geo-search/defaultTemplates.d.ts +1 -0
  82. package/es/widgets/geo-search/defaultTemplates.js +17 -4
  83. package/es/widgets/hierarchical-menu/defaultTemplates.js +22 -2
  84. package/es/widgets/hierarchical-menu/hierarchical-menu.d.ts +2 -0
  85. package/es/widgets/hits/defaultTemplates.js +3 -1
  86. package/es/widgets/hits/hits.d.ts +2 -1
  87. package/es/widgets/infinite-hits/defaultTemplates.js +9 -3
  88. package/es/widgets/infinite-hits/infinite-hits.d.ts +1 -3
  89. package/es/widgets/menu/defaultTemplates.js +22 -2
  90. package/es/widgets/menu-select/defaultTemplates.js +9 -2
  91. package/es/widgets/numeric-menu/defaultTemplates.js +18 -1
  92. package/es/widgets/range-input/range-input.js +6 -2
  93. package/es/widgets/rating-menu/defaultTemplates.js +54 -1
  94. package/es/widgets/rating-menu/rating-menu.d.ts +6 -0
  95. package/es/widgets/refinement-list/defaultTemplates.js +34 -3
  96. package/es/widgets/refinement-list/refinement-list.d.ts +7 -1
  97. package/es/widgets/relevant-sort/defaultTemplates.js +3 -1
  98. package/es/widgets/search-box/defaultTemplates.js +61 -3
  99. package/es/widgets/search-box/search-box.d.ts +10 -3
  100. package/es/widgets/stats/stats.d.ts +10 -6
  101. package/es/widgets/stats/stats.js +69 -22
  102. package/es/widgets/toggle-refinement/defaultTemplates.js +4 -1
  103. package/es/widgets/toggle-refinement/toggle-refinement.d.ts +3 -1
  104. package/es/widgets/voice-search/defaultTemplates.js +81 -9
  105. package/package.json +7 -5
@@ -1,9 +1,10 @@
1
1
  /// <reference types="google.maps" />
2
+ import type { renderTemplate } from '../../lib/utils';
2
3
  export declare type HTMLMarkerArguments = {
3
4
  __id: string;
4
5
  position: google.maps.LatLngLiteral;
5
6
  map: google.maps.Map;
6
- template: string;
7
+ template: ReturnType<typeof renderTemplate>;
7
8
  title?: string;
8
9
  className: string;
9
10
  anchor?: {
@@ -23,6 +23,8 @@ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.g
23
23
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
24
24
 
25
25
  /* global google EventListener */
26
+ import { render } from 'preact';
27
+
26
28
  var createHTMLMarker = function createHTMLMarker(googleReference) {
27
29
  var HTMLMarker = /*#__PURE__*/function (_googleReference$maps) {
28
30
  _inherits(HTMLMarker, _googleReference$maps);
@@ -66,7 +68,12 @@ var createHTMLMarker = function createHTMLMarker(googleReference) {
66
68
  _this.element = document.createElement('div');
67
69
  _this.element.className = className;
68
70
  _this.element.style.position = 'absolute';
69
- _this.element.innerHTML = template;
71
+
72
+ if (_typeof(template) === 'object') {
73
+ render(template, _this.element);
74
+ } else {
75
+ _this.element.innerHTML = template;
76
+ }
70
77
 
71
78
  _this.setMap(map);
72
79
 
@@ -1,3 +1,4 @@
1
+ /** @jsx h */
1
2
  import type { GeoSearchComponentTemplates } from './geo-search';
2
3
  declare const defaultTemplates: GeoSearchComponentTemplates;
3
4
  export default defaultTemplates;
@@ -1,7 +1,20 @@
1
+ /** @jsx h */
2
+ import { h } from 'preact';
3
+
4
+ var _ref = h("p", null, "Your custom HTML Marker");
5
+
1
6
  var defaultTemplates = {
2
- HTMLMarker: '<p>Your custom HTML Marker</p>',
3
- reset: 'Clear the map refinement',
4
- toggle: 'Search as I move the map',
5
- redo: 'Redo search here'
7
+ HTMLMarker: function HTMLMarker() {
8
+ return _ref;
9
+ },
10
+ reset: function reset() {
11
+ return 'Clear the map refinement';
12
+ },
13
+ toggle: function toggle() {
14
+ return 'Search as I move the map';
15
+ },
16
+ redo: function redo() {
17
+ return 'Redo search here';
18
+ }
6
19
  };
7
20
  export default defaultTemplates;
@@ -1,5 +1,25 @@
1
+ /** @jsx h */
2
+ import { h } from 'preact';
3
+ import { formatNumber } from "../../lib/formatNumber.js";
4
+ import { cx } from "../../lib/utils/index.js";
1
5
  var defaultTemplates = {
2
- item: '<a class="{{cssClasses.link}}" href="{{url}}">' + '<span class="{{cssClasses.label}}">{{label}}</span>' + '<span class="{{cssClasses.count}}">{{#helpers.formatNumber}}{{count}}{{/helpers.formatNumber}}</span>' + '</a>',
3
- showMoreText: "\n {{#isShowingMore}}\n Show less\n {{/isShowingMore}}\n {{^isShowingMore}}\n Show more\n {{/isShowingMore}}\n "
6
+ item: function item(_ref) {
7
+ var url = _ref.url,
8
+ label = _ref.label,
9
+ count = _ref.count,
10
+ cssClasses = _ref.cssClasses;
11
+ return h("a", {
12
+ className: cx(cssClasses.link),
13
+ href: url
14
+ }, h("span", {
15
+ className: cx(cssClasses.label)
16
+ }, label), h("span", {
17
+ className: cx(cssClasses.count)
18
+ }, formatNumber(count)));
19
+ },
20
+ showMoreText: function showMoreText(_ref2) {
21
+ var isShowingMore = _ref2.isShowingMore;
22
+ return isShowingMore ? 'Show less' : 'Show more';
23
+ }
4
24
  };
5
25
  export default defaultTemplates;
@@ -10,6 +10,8 @@ declare type HierarchicalMenuTemplates = Partial<{
10
10
  count: number;
11
11
  isRefined: boolean;
12
12
  url: string;
13
+ label: string;
14
+ cssClasses: HierarchicalMenuCSSClasses;
13
15
  }>;
14
16
  /**
15
17
  * Template used for the show more text, provided with `isShowingMore` data property.
@@ -1,5 +1,7 @@
1
1
  var defaultTemplates = {
2
- empty: 'No results',
2
+ empty: function empty() {
3
+ return 'No results';
4
+ },
3
5
  item: function item(data) {
4
6
  return JSON.stringify(data, null, 2);
5
7
  }
@@ -1,6 +1,7 @@
1
1
  /** @jsx h */
2
2
  import type { HitsConnectorParams, HitsWidgetDescription } from '../../connectors/hits/connectHits';
3
3
  import type { Template, TemplateWithBindEvent, Hit, WidgetFactory } from '../../types';
4
+ import type { SearchResults } from 'algoliasearch-helper';
4
5
  export declare type HitsCSSClasses = Partial<{
5
6
  /**
6
7
  * CSS class to add to the wrapping element.
@@ -25,7 +26,7 @@ export declare type HitsTemplates = Partial<{
25
26
  *
26
27
  * @default 'No Results'
27
28
  */
28
- empty: Template;
29
+ empty: Template<SearchResults>;
29
30
  /**
30
31
  * Template to use for each result. This template will receive an object containing a single record.
31
32
  *
@@ -1,7 +1,13 @@
1
1
  var defaultTemplates = {
2
- empty: 'No results',
3
- showPreviousText: 'Show previous results',
4
- showMoreText: 'Show more results',
2
+ empty: function empty() {
3
+ return 'No results';
4
+ },
5
+ showPreviousText: function showPreviousText() {
6
+ return 'Show previous results';
7
+ },
8
+ showMoreText: function showMoreText() {
9
+ return 'Show more results';
10
+ },
5
11
  item: function item(data) {
6
12
  return JSON.stringify(data, null, 2);
7
13
  }
@@ -40,9 +40,7 @@ export declare type InfiniteHitsTemplates = Partial<{
40
40
  /**
41
41
  * The template to use when there are no results.
42
42
  */
43
- empty: Template<{
44
- results: SearchResults;
45
- }>;
43
+ empty: Template<SearchResults>;
46
44
  /**
47
45
  * The template to use for the “Show previous” label.
48
46
  */
@@ -1,5 +1,25 @@
1
+ /** @jsx h */
2
+ import { h } from 'preact';
3
+ import { formatNumber } from "../../lib/formatNumber.js";
4
+ import { cx } from "../../lib/utils/index.js";
1
5
  var defaultTemplates = {
2
- item: '<a class="{{cssClasses.link}}" href="{{url}}">' + '<span class="{{cssClasses.label}}">{{label}}</span>' + '<span class="{{cssClasses.count}}">{{#helpers.formatNumber}}{{count}}{{/helpers.formatNumber}}</span>' + '</a>',
3
- showMoreText: "\n {{#isShowingMore}}\n Show less\n {{/isShowingMore}}\n {{^isShowingMore}}\n Show more\n {{/isShowingMore}}\n "
6
+ item: function item(_ref) {
7
+ var cssClasses = _ref.cssClasses,
8
+ url = _ref.url,
9
+ label = _ref.label,
10
+ count = _ref.count;
11
+ return h("a", {
12
+ className: cx(cssClasses.link),
13
+ href: url
14
+ }, h("span", {
15
+ className: cx(cssClasses.label)
16
+ }, label), h("span", {
17
+ className: cx(cssClasses.count)
18
+ }, formatNumber(count)));
19
+ },
20
+ showMoreText: function showMoreText(_ref2) {
21
+ var isShowingMore = _ref2.isShowingMore;
22
+ return isShowingMore ? 'Show less' : 'Show more';
23
+ }
4
24
  };
5
25
  export default defaultTemplates;
@@ -1,5 +1,12 @@
1
+ import { formatNumber } from "../../lib/formatNumber.js";
1
2
  var defaultTemplates = {
2
- item: '{{label}} ({{#helpers.formatNumber}}{{count}}{{/helpers.formatNumber}})',
3
- defaultOption: 'See all'
3
+ item: function item(_ref) {
4
+ var label = _ref.label,
5
+ count = _ref.count;
6
+ return "".concat(label, " (").concat(formatNumber(count), ")");
7
+ },
8
+ defaultOption: function defaultOption() {
9
+ return 'See all';
10
+ }
4
11
  };
5
12
  export default defaultTemplates;
@@ -1,4 +1,21 @@
1
+ /** @jsx h */
2
+ import { h } from 'preact';
1
3
  var defaultTemplates = {
2
- item: "<label class=\"{{cssClasses.label}}\">\n <input type=\"radio\" class=\"{{cssClasses.radio}}\" name=\"{{attribute}}\"{{#isRefined}} checked{{/isRefined}} />\n <span class=\"{{cssClasses.labelText}}\">{{label}}</span>\n</label>"
4
+ item: function item(_ref) {
5
+ var cssClasses = _ref.cssClasses,
6
+ attribute = _ref.attribute,
7
+ label = _ref.label,
8
+ isRefined = _ref.isRefined;
9
+ return h("label", {
10
+ className: cssClasses.label
11
+ }, h("input", {
12
+ type: "radio",
13
+ className: cssClasses.radio,
14
+ name: attribute,
15
+ defaultChecked: isRefined
16
+ }), h("span", {
17
+ className: cssClasses.labelText
18
+ }, label));
19
+ }
3
20
  };
4
21
  export default defaultTemplates;
@@ -28,8 +28,12 @@ var withUsage = createDocumentationMessageGenerator({
28
28
  });
29
29
  var suit = component('RangeInput');
30
30
  var defaultTemplates = {
31
- separatorText: 'to',
32
- submitText: 'Go'
31
+ separatorText: function separatorText() {
32
+ return 'to';
33
+ },
34
+ submitText: function submitText() {
35
+ return 'Go';
36
+ }
33
37
  };
34
38
 
35
39
  var renderer = function renderer(_ref) {
@@ -1,4 +1,57 @@
1
+ /** @jsx h */
2
+ import { h } from 'preact';
3
+ import { formatNumber } from "../../lib/formatNumber.js";
4
+ import { cx } from "../../lib/utils/index.js";
5
+
6
+ function ItemWrapper(_ref) {
7
+ var children = _ref.children,
8
+ count = _ref.count,
9
+ value = _ref.value,
10
+ url = _ref.url,
11
+ cssClasses = _ref.cssClasses;
12
+
13
+ if (count) {
14
+ return h("a", {
15
+ className: cx(cssClasses.link),
16
+ "aria-label": "".concat(value, " & up"),
17
+ href: url
18
+ }, children);
19
+ }
20
+
21
+ return h("div", {
22
+ className: cx(cssClasses.link),
23
+ "aria-label": "".concat(value, " & up"),
24
+ disabled: true
25
+ }, children);
26
+ }
27
+
1
28
  var defaultTemplates = {
2
- item: "{{#count}}<a class=\"{{cssClasses.link}}\" aria-label=\"{{value}} & up\" href=\"{{url}}\">{{/count}}{{^count}}<div class=\"{{cssClasses.link}}\" aria-label=\"{{value}} & up\" disabled>{{/count}}\n {{#stars}}<svg class=\"{{cssClasses.starIcon}} {{#.}}{{cssClasses.fullStarIcon}}{{/.}}{{^.}}{{cssClasses.emptyStarIcon}}{{/.}}\" aria-hidden=\"true\" width=\"24\" height=\"24\">\n {{#.}}<use xlink:href=\"#ais-RatingMenu-starSymbol\"></use>{{/.}}{{^.}}<use xlink:href=\"#ais-RatingMenu-starEmptySymbol\"></use>{{/.}}\n </svg>{{/stars}}\n <span class=\"{{cssClasses.label}}\">& Up</span>\n {{#count}}<span class=\"{{cssClasses.count}}\">{{#helpers.formatNumber}}{{count}}{{/helpers.formatNumber}}</span>{{/count}}\n{{#count}}</a>{{/count}}{{^count}}</div>{{/count}}"
29
+ item: function item(_ref2) {
30
+ var count = _ref2.count,
31
+ value = _ref2.value,
32
+ url = _ref2.url,
33
+ stars = _ref2.stars,
34
+ cssClasses = _ref2.cssClasses;
35
+ return h(ItemWrapper, {
36
+ count: count,
37
+ value: value,
38
+ url: url,
39
+ cssClasses: cssClasses
40
+ }, stars.map(function (isFull, index) {
41
+ return h("svg", {
42
+ key: index,
43
+ className: cx([cx(cssClasses.starIcon), cx(isFull ? cssClasses.fullStarIcon : cssClasses.emptyStarIcon)]),
44
+ "aria-hidden": "true",
45
+ width: "24",
46
+ height: "24"
47
+ }, h("use", {
48
+ xlinkHref: isFull ? '#ais-RatingMenu-starSymbol' : '#ais-RatingMenu-starEmptySymbol'
49
+ }));
50
+ }), h("span", {
51
+ className: cx(cssClasses.label)
52
+ }, "& Up"), count && h("span", {
53
+ className: cx(cssClasses.count)
54
+ }, formatNumber(count)));
55
+ }
3
56
  };
4
57
  export default defaultTemplates;
@@ -7,9 +7,15 @@ export declare type RatingMenuTemplates = Partial<{
7
7
  */
8
8
  item: Template<{
9
9
  name: string;
10
+ label: string;
11
+ value: string;
10
12
  count: number;
11
13
  isRefined: boolean;
12
14
  url: string;
15
+ stars: [boolean, boolean, boolean, boolean, boolean];
16
+ cssClasses: RatingMenuCSSClasses;
17
+ attribute?: string;
18
+ isFromSearch?: boolean;
13
19
  }>;
14
20
  }>;
15
21
  export declare type RatingMenuCSSClasses = Partial<{
@@ -1,6 +1,37 @@
1
+ /** @jsx h */
2
+ import { h } from 'preact';
3
+ import { formatNumber } from "../../lib/formatNumber.js";
4
+ import { cx } from "../../lib/utils/index.js";
1
5
  var defaultTemplates = {
2
- item: "<label class=\"{{cssClasses.label}}\">\n <input type=\"checkbox\"\n class=\"{{cssClasses.checkbox}}\"\n value=\"{{value}}\"\n {{#isRefined}}checked{{/isRefined}} />\n <span class=\"{{cssClasses.labelText}}\">{{#isFromSearch}}{{{highlighted}}}{{/isFromSearch}}{{^isFromSearch}}{{highlighted}}{{/isFromSearch}}</span>\n <span class=\"{{cssClasses.count}}\">{{#helpers.formatNumber}}{{count}}{{/helpers.formatNumber}}</span>\n</label>",
3
- showMoreText: "\n {{#isShowingMore}}\n Show less\n {{/isShowingMore}}\n {{^isShowingMore}}\n Show more\n {{/isShowingMore}}\n ",
4
- searchableNoResults: 'No results'
6
+ item: function item(_ref) {
7
+ var cssClasses = _ref.cssClasses,
8
+ count = _ref.count,
9
+ value = _ref.value,
10
+ highlighted = _ref.highlighted,
11
+ isRefined = _ref.isRefined,
12
+ isFromSearch = _ref.isFromSearch;
13
+ return h("label", {
14
+ className: cx(cssClasses.label)
15
+ }, h("input", {
16
+ type: "checkbox",
17
+ className: cx(cssClasses.checkbox),
18
+ value: value,
19
+ defaultChecked: isRefined
20
+ }), h("span", {
21
+ className: cx(cssClasses.labelText),
22
+ dangerouslySetInnerHTML: isFromSearch ? {
23
+ __html: highlighted
24
+ } : undefined
25
+ }, !isFromSearch && highlighted), h("span", {
26
+ className: cx(cssClasses.count)
27
+ }, formatNumber(count)));
28
+ },
29
+ showMoreText: function showMoreText(_ref2) {
30
+ var isShowingMore = _ref2.isShowingMore;
31
+ return isShowingMore ? 'Show less' : 'Show more';
32
+ },
33
+ searchableNoResults: function searchableNoResults() {
34
+ return 'No results';
35
+ }
5
36
  };
6
37
  export default defaultTemplates;
@@ -97,6 +97,10 @@ export declare type RefinementListItemData = {
97
97
  * Object containing all the classes computed for the item.
98
98
  */
99
99
  cssClasses: RefinementListCSSClasses;
100
+ /**
101
+ * Whether the `items` prop contains facet values from the global search or from the search inside the items.
102
+ */
103
+ isFromSearch: boolean;
100
104
  };
101
105
  export declare type RefinementListOwnTemplates = Partial<{
102
106
  /**
@@ -106,7 +110,9 @@ export declare type RefinementListOwnTemplates = Partial<{
106
110
  /**
107
111
  * Template used for the show more text, provided with `isShowingMore` data property.
108
112
  */
109
- showMoreText: Template;
113
+ showMoreText: Template<{
114
+ isShowingMore: boolean;
115
+ }>;
110
116
  /**
111
117
  * Templates to use for search for facet values when there are no results.
112
118
  */
@@ -1,5 +1,7 @@
1
1
  var defaultTemplates = {
2
- text: '',
2
+ text: function text() {
3
+ return '';
4
+ },
3
5
  button: function button(_ref) {
4
6
  var isRelevantSorted = _ref.isRelevantSorted;
5
7
  return isRelevantSorted ? 'See all results' : 'See relevant results';
@@ -1,6 +1,64 @@
1
+ /** @jsx h */
2
+ import { h } from 'preact';
3
+
4
+ var _ref2 = h("path", {
5
+ d: "M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z"
6
+ });
7
+
8
+ var _ref4 = h("path", {
9
+ d: "M26.804 29.01c-2.832 2.34-6.465 3.746-10.426 3.746C7.333 32.756 0 25.424 0 16.378 0 7.333 7.333 0 16.378 0c9.046 0 16.378 7.333 16.378 16.378 0 3.96-1.406 7.594-3.746 10.426l10.534 10.534c.607.607.61 1.59-.004 2.202-.61.61-1.597.61-2.202.004L26.804 29.01zm-10.426.627c7.323 0 13.26-5.936 13.26-13.26 0-7.32-5.937-13.257-13.26-13.257C9.056 3.12 3.12 9.056 3.12 16.378c0 7.323 5.936 13.26 13.258 13.26z"
10
+ });
11
+
12
+ var _ref6 = h("g", {
13
+ fill: "none",
14
+ fillRule: "evenodd"
15
+ }, h("g", {
16
+ transform: "translate(1 1)",
17
+ strokeWidth: "2"
18
+ }, h("circle", {
19
+ strokeOpacity: ".5",
20
+ cx: "18",
21
+ cy: "18",
22
+ r: "18"
23
+ }), h("path", {
24
+ d: "M36 18c0-9.94-8.06-18-18-18"
25
+ }, h("animateTransform", {
26
+ attributeName: "transform",
27
+ type: "rotate",
28
+ from: "0 18 18",
29
+ to: "360 18 18",
30
+ dur: "1s",
31
+ repeatCount: "indefinite"
32
+ }))));
33
+
1
34
  var defaultTemplate = {
2
- reset: "\n<svg class=\"{{cssClasses.resetIcon}}\" viewBox=\"0 0 20 20\" width=\"10\" height=\"10\">\n <path d=\"M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z\"></path>\n</svg>\n ",
3
- submit: "\n<svg class=\"{{cssClasses.submitIcon}}\" width=\"10\" height=\"10\" viewBox=\"0 0 40 40\">\n <path d=\"M26.804 29.01c-2.832 2.34-6.465 3.746-10.426 3.746C7.333 32.756 0 25.424 0 16.378 0 7.333 7.333 0 16.378 0c9.046 0 16.378 7.333 16.378 16.378 0 3.96-1.406 7.594-3.746 10.426l10.534 10.534c.607.607.61 1.59-.004 2.202-.61.61-1.597.61-2.202.004L26.804 29.01zm-10.426.627c7.323 0 13.26-5.936 13.26-13.26 0-7.32-5.937-13.257-13.26-13.257C9.056 3.12 3.12 9.056 3.12 16.378c0 7.323 5.936 13.26 13.258 13.26z\"></path>\n</svg>\n ",
4
- loadingIndicator: "\n<svg class=\"{{cssClasses.loadingIcon}}\" width=\"16\" height=\"16\" viewBox=\"0 0 38 38\" stroke=\"#444\">\n <g fill=\"none\" fillRule=\"evenodd\">\n <g transform=\"translate(1 1)\" strokeWidth=\"2\">\n <circle strokeOpacity=\".5\" cx=\"18\" cy=\"18\" r=\"18\" />\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 18 18\"\n to=\"360 18 18\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </g>\n</svg>\n "
35
+ reset: function reset(_ref) {
36
+ var cssClasses = _ref.cssClasses;
37
+ return h("svg", {
38
+ className: cssClasses.resetIcon,
39
+ viewBox: "0 0 20 20",
40
+ width: "10",
41
+ height: "10"
42
+ }, _ref2);
43
+ },
44
+ submit: function submit(_ref3) {
45
+ var cssClasses = _ref3.cssClasses;
46
+ return h("svg", {
47
+ className: cssClasses.submitIcon,
48
+ width: "10",
49
+ height: "10",
50
+ viewBox: "0 0 40 40"
51
+ }, _ref4);
52
+ },
53
+ loadingIndicator: function loadingIndicator(_ref5) {
54
+ var cssClasses = _ref5.cssClasses;
55
+ return h("svg", {
56
+ className: cssClasses.loadingIcon,
57
+ width: "16",
58
+ height: "16",
59
+ viewBox: "0 0 38 38",
60
+ stroke: "#444"
61
+ }, _ref6);
62
+ }
5
63
  };
6
64
  export default defaultTemplate;
@@ -1,19 +1,26 @@
1
1
  /** @jsx h */
2
2
  import type { WidgetFactory, Template } from '../../types';
3
3
  import type { SearchBoxConnectorParams, SearchBoxWidgetDescription } from '../../connectors/search-box/connectSearchBox';
4
+ import type { SearchBoxComponentCSSClasses } from '../../components/SearchBox/SearchBox';
4
5
  export declare type SearchBoxTemplates = Partial<{
5
6
  /**
6
7
  * Template used for displaying the submit button. Can accept a function or a Hogan string.
7
8
  */
8
- submit: Template;
9
+ submit: Template<{
10
+ cssClasses: SearchBoxComponentCSSClasses;
11
+ }>;
9
12
  /**
10
13
  * Template used for displaying the reset button. Can accept a function or a Hogan string.
11
14
  */
12
- reset: Template;
15
+ reset: Template<{
16
+ cssClasses: SearchBoxComponentCSSClasses;
17
+ }>;
13
18
  /**
14
19
  * Template used for displaying the loading indicator. Can accept a function or a Hogan string.
15
20
  */
16
- loadingIndicator: Template;
21
+ loadingIndicator: Template<{
22
+ cssClasses: SearchBoxComponentCSSClasses;
23
+ }>;
17
24
  }>;
18
25
  export declare type SearchBoxCSSClasses = Partial<{
19
26
  /**
@@ -2,6 +2,14 @@
2
2
  import type { StatsComponentTemplates } from '../../components/Stats/Stats';
3
3
  import type { StatsConnectorParams, StatsRenderState, StatsWidgetDescription } from '../../connectors/stats/connectStats';
4
4
  import type { Template, WidgetFactory } from '../../types';
5
+ declare type TextTemplateProps = {
6
+ hasManyResults: boolean;
7
+ hasNoResults: boolean;
8
+ hasOneResult: boolean;
9
+ hasNoSortedResults: boolean;
10
+ hasOneSortedResults: boolean;
11
+ hasManySortedResults: boolean;
12
+ };
5
13
  export declare type StatsCSSClasses = Partial<{
6
14
  /**
7
15
  * CSS class to add to the root element.
@@ -14,13 +22,9 @@ export declare type StatsCSSClasses = Partial<{
14
22
  }>;
15
23
  export declare type StatsTemplates = Partial<{
16
24
  /**
17
- * Text template, provided with `hasManyResults`, `hasNoResults`, `hasOneResult`, `hitsPerPage`, `nbHits`, `nbSortedHits`, `nbPages`, `areHitsSorted`, `page`, `processingTimeMS`, `query`.
25
+ * Text template, provided with `hasManyResults`, `hasNoResults`, `hasOneResult`, `hasNoSortedResults`, `hasOneSortedResults`, `hasManySortedResults`, `hitsPerPage`, `nbHits`, `nbSortedHits`, `nbPages`, `areHitsSorted`, `page`, `processingTimeMS`, `query`.
18
26
  */
19
- text: Template<{
20
- hasManyResults: boolean;
21
- hasNoResults: boolean;
22
- hasOneResult: boolean;
23
- } & StatsRenderState>;
27
+ text: Template<TextTemplateProps & StatsRenderState>;
24
28
  }>;
25
29
  export declare type StatsWidgetParams = {
26
30
  /**
@@ -11,29 +11,76 @@ import Stats from "../../components/Stats/Stats.js";
11
11
  import connectStats from "../../connectors/stats/connectStats.js";
12
12
  import { prepareTemplateProps, getContainerNode, createDocumentationMessageGenerator } from "../../lib/utils/index.js";
13
13
  import { component } from "../../lib/suit.js";
14
+ import { formatNumber } from "../../lib/formatNumber.js";
14
15
  var withUsage = createDocumentationMessageGenerator({
15
16
  name: 'stats'
16
17
  });
17
18
  var suit = component('Stats');
18
19
  export var defaultTemplates = {
19
- text: "\n {{#areHitsSorted}}\n {{#hasNoSortedResults}}No relevant results{{/hasNoSortedResults}}\n {{#hasOneSortedResults}}1 relevant result{{/hasOneSortedResults}}\n {{#hasManySortedResults}}{{#helpers.formatNumber}}{{nbSortedHits}}{{/helpers.formatNumber}} relevant results{{/hasManySortedResults}}\n sorted out of {{#helpers.formatNumber}}{{nbHits}}{{/helpers.formatNumber}}\n {{/areHitsSorted}}\n {{^areHitsSorted}}\n {{#hasNoResults}}No results{{/hasNoResults}}\n {{#hasOneResult}}1 result{{/hasOneResult}}\n {{#hasManyResults}}{{#helpers.formatNumber}}{{nbHits}}{{/helpers.formatNumber}} results{{/hasManyResults}}\n {{/areHitsSorted}}\n found in {{processingTimeMS}}ms"
20
+ text: function text(props) {
21
+ return "".concat(props.areHitsSorted ? getSortedResultsSentence(props) : getResultsSentence(props), " found in ").concat(props.processingTimeMS, "ms");
22
+ }
20
23
  };
21
24
 
22
- var renderer = function renderer(_ref) {
23
- var renderState = _ref.renderState,
24
- cssClasses = _ref.cssClasses,
25
- containerNode = _ref.containerNode,
26
- templates = _ref.templates;
27
- return function (_ref2, isFirstRendering) {
28
- var hitsPerPage = _ref2.hitsPerPage,
29
- nbHits = _ref2.nbHits,
30
- nbSortedHits = _ref2.nbSortedHits,
31
- areHitsSorted = _ref2.areHitsSorted,
32
- nbPages = _ref2.nbPages,
33
- page = _ref2.page,
34
- processingTimeMS = _ref2.processingTimeMS,
35
- query = _ref2.query,
36
- instantSearchInstance = _ref2.instantSearchInstance;
25
+ function getSortedResultsSentence(_ref) {
26
+ var nbHits = _ref.nbHits,
27
+ hasNoSortedResults = _ref.hasNoSortedResults,
28
+ hasOneSortedResults = _ref.hasOneSortedResults,
29
+ hasManySortedResults = _ref.hasManySortedResults,
30
+ nbSortedHits = _ref.nbSortedHits;
31
+ var suffix = "sorted out of ".concat(formatNumber(nbHits));
32
+
33
+ if (hasNoSortedResults) {
34
+ return "No relevant results ".concat(suffix);
35
+ }
36
+
37
+ if (hasOneSortedResults) {
38
+ return "1 relevant result ".concat(suffix);
39
+ }
40
+
41
+ if (hasManySortedResults) {
42
+ return "".concat(formatNumber(nbSortedHits || 0), " relevant results ").concat(suffix);
43
+ }
44
+
45
+ return '';
46
+ }
47
+
48
+ function getResultsSentence(_ref2) {
49
+ var nbHits = _ref2.nbHits,
50
+ hasNoResults = _ref2.hasNoResults,
51
+ hasOneResult = _ref2.hasOneResult,
52
+ hasManyResults = _ref2.hasManyResults;
53
+
54
+ if (hasNoResults) {
55
+ return 'No results';
56
+ }
57
+
58
+ if (hasOneResult) {
59
+ return '1 result';
60
+ }
61
+
62
+ if (hasManyResults) {
63
+ return "".concat(formatNumber(nbHits), " results");
64
+ }
65
+
66
+ return '';
67
+ }
68
+
69
+ var renderer = function renderer(_ref3) {
70
+ var renderState = _ref3.renderState,
71
+ cssClasses = _ref3.cssClasses,
72
+ containerNode = _ref3.containerNode,
73
+ templates = _ref3.templates;
74
+ return function (_ref4, isFirstRendering) {
75
+ var hitsPerPage = _ref4.hitsPerPage,
76
+ nbHits = _ref4.nbHits,
77
+ nbSortedHits = _ref4.nbSortedHits,
78
+ areHitsSorted = _ref4.areHitsSorted,
79
+ nbPages = _ref4.nbPages,
80
+ page = _ref4.page,
81
+ processingTimeMS = _ref4.processingTimeMS,
82
+ query = _ref4.query,
83
+ instantSearchInstance = _ref4.instantSearchInstance;
37
84
 
38
85
  if (isFirstRendering) {
39
86
  renderState.templateProps = prepareTemplateProps({
@@ -67,12 +114,12 @@ var renderer = function renderer(_ref) {
67
114
 
68
115
 
69
116
  var stats = function stats(widgetParams) {
70
- var _ref3 = widgetParams || {},
71
- container = _ref3.container,
72
- _ref3$cssClasses = _ref3.cssClasses,
73
- userCssClasses = _ref3$cssClasses === void 0 ? {} : _ref3$cssClasses,
74
- _ref3$templates = _ref3.templates,
75
- templates = _ref3$templates === void 0 ? {} : _ref3$templates;
117
+ var _ref5 = widgetParams || {},
118
+ container = _ref5.container,
119
+ _ref5$cssClasses = _ref5.cssClasses,
120
+ userCssClasses = _ref5$cssClasses === void 0 ? {} : _ref5$cssClasses,
121
+ _ref5$templates = _ref5.templates,
122
+ templates = _ref5$templates === void 0 ? {} : _ref5$templates;
76
123
 
77
124
  if (!container) {
78
125
  throw new Error(withUsage('The `container` option is required.'));
@@ -1,4 +1,7 @@
1
1
  var defaultTemplates = {
2
- labelText: '{{name}}'
2
+ labelText: function labelText(_ref) {
3
+ var name = _ref.name;
4
+ return name;
5
+ }
3
6
  };
4
7
  export default defaultTemplates;