instantsearch-ui-components 0.14.0 → 0.15.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.
@@ -10,6 +10,7 @@ function createAutocompleteRecentSearchComponent(_ref) {
10
10
  var createElement = _ref.createElement;
11
11
  return function AutocompleteRecentSearch(_ref2) {
12
12
  var item = _ref2.item,
13
+ children = _ref2.children,
13
14
  onSelect = _ref2.onSelect,
14
15
  onRemoveRecentSearch = _ref2.onRemoveRecentSearch,
15
16
  _ref2$classNames = _ref2.classNames,
@@ -25,7 +26,7 @@ function createAutocompleteRecentSearchComponent(_ref) {
25
26
  createElement: createElement
26
27
  })), createElement("div", {
27
28
  className: (0, _lib.cx)('ais-AutocompleteItemContentBody', 'ais-AutocompleteRecentSearchItemContentBody', classNames.content)
28
- }, item.query)), createElement("div", {
29
+ }, children)), createElement("div", {
29
30
  className: (0, _lib.cx)('ais-AutocompleteItemActions', 'ais-AutocompleteRecentSearchItemActions', classNames.actions)
30
31
  }, createElement("button", {
31
32
  className: (0, _lib.cx)('ais-AutocompleteItemActionButton', 'ais-AutocompleteRecentSearchItemDeleteButton', classNames.deleteButton),
@@ -14,6 +14,7 @@ function createAutocompleteSearchComponent(_ref) {
14
14
  onClear = _ref2.onClear,
15
15
  query = _ref2.query,
16
16
  isSearchStalled = _ref2.isSearchStalled;
17
+ var inputRef = inputProps.ref;
17
18
  return createElement("form", {
18
19
  className: "ais-AutocompleteForm",
19
20
  action: "",
@@ -21,6 +22,10 @@ function createAutocompleteSearchComponent(_ref) {
21
22
  role: "search",
22
23
  onSubmit: function onSubmit(e) {
23
24
  return e.preventDefault();
25
+ },
26
+ onReset: function onReset() {
27
+ var _inputRef$current;
28
+ return (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
24
29
  }
25
30
  }, createElement("div", {
26
31
  className: "ais-AutocompleteInputWrapperPrefix"
@@ -9,7 +9,7 @@ var _icons = require("./icons");
9
9
  function createAutocompleteSuggestionComponent(_ref) {
10
10
  var createElement = _ref.createElement;
11
11
  return function AutocompleteSuggestion(_ref2) {
12
- var item = _ref2.item,
12
+ var children = _ref2.children,
13
13
  onSelect = _ref2.onSelect,
14
14
  _ref2$classNames = _ref2.classNames,
15
15
  classNames = _ref2$classNames === void 0 ? {} : _ref2$classNames;
@@ -24,6 +24,6 @@ function createAutocompleteSuggestionComponent(_ref) {
24
24
  createElement: createElement
25
25
  })), createElement("div", {
26
26
  className: (0, _lib.cx)('ais-AutocompleteItemContentBody', 'ais-AutocompleteSuggestionItemContentBody', classNames.content)
27
- }, item.query)));
27
+ }, children)));
28
28
  };
29
29
  }
@@ -19,6 +19,7 @@ function createAutocompletePropGetters(_ref) {
19
19
  onRefine = _ref2.onRefine,
20
20
  globalOnSelect = _ref2.onSelect;
21
21
  var getElementId = createGetElementId(useId());
22
+ var inputRef = useRef(null);
22
23
  var rootRef = useRef(null);
23
24
  var _useState = useState(false),
24
25
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -50,7 +51,7 @@ function createAutocompletePropGetters(_ref) {
50
51
  document.body.removeEventListener('click', onBodyClick);
51
52
  };
52
53
  }, [rootRef]);
53
- var getNextActiveDescendent = function getNextActiveDescendent(key) {
54
+ var getNextActiveDescendant = function getNextActiveDescendant(key) {
54
55
  switch (key) {
55
56
  case 'ArrowLeft':
56
57
  case 'ArrowUp':
@@ -69,11 +70,21 @@ function createAutocompletePropGetters(_ref) {
69
70
  }
70
71
  };
71
72
  var submit = function submit() {
72
- var actualActiveDescendant = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : activeDescendant;
73
- setIsOpen(false);
74
- if (actualActiveDescendant && items.has(actualActiveDescendant)) {
73
+ var _override$activeDesce;
74
+ var override = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
75
+ if (isOpen) {
76
+ setIsOpen(false);
77
+ } else {
78
+ var _inputRef$current;
79
+ (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.blur();
80
+ }
81
+ var actualDescendant = (_override$activeDesce = override.activeDescendant) !== null && _override$activeDesce !== void 0 ? _override$activeDesce : activeDescendant;
82
+ if (!actualDescendant && override.query) {
83
+ onRefine(override.query);
84
+ }
85
+ if (actualDescendant && items.has(actualDescendant)) {
75
86
  var _getQuery;
76
- var _ref3 = items.get(actualActiveDescendant),
87
+ var _ref3 = items.get(actualDescendant),
77
88
  _item = _ref3.item,
78
89
  _ref3$config = _ref3.config,
79
90
  indexOnSelect = _ref3$config.onSelect,
@@ -95,6 +106,7 @@ function createAutocompletePropGetters(_ref) {
95
106
  getInputProps: function getInputProps() {
96
107
  return {
97
108
  id: getElementId('input'),
109
+ ref: inputRef,
98
110
  role: 'combobox',
99
111
  'aria-autocomplete': 'list',
100
112
  'aria-expanded': isOpen,
@@ -105,33 +117,42 @@ function createAutocompletePropGetters(_ref) {
105
117
  return setIsOpen(true);
106
118
  },
107
119
  onKeyDown: function onKeyDown(event) {
108
- if (event.key === 'Escape') {
109
- setActiveDescendant(undefined);
110
- setIsOpen(false);
111
- return;
112
- }
113
120
  switch (event.key) {
121
+ case 'Escape':
122
+ {
123
+ if (isOpen) {
124
+ setIsOpen(false);
125
+ event.preventDefault();
126
+ } else {
127
+ setActiveDescendant(undefined);
128
+ }
129
+ break;
130
+ }
114
131
  case 'ArrowLeft':
115
132
  case 'ArrowUp':
116
133
  case 'ArrowRight':
117
134
  case 'ArrowDown':
118
135
  {
119
136
  var _document$getElementB;
120
- var nextActiveDescendent = getNextActiveDescendent(event.key);
121
- setActiveDescendant(nextActiveDescendent);
122
- (_document$getElementB = document.getElementById(nextActiveDescendent)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.scrollIntoView(false);
137
+ setIsOpen(true);
138
+ var nextActiveDescendant = getNextActiveDescendant(event.key);
139
+ setActiveDescendant(nextActiveDescendant);
140
+ (_document$getElementB = document.getElementById(nextActiveDescendant)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.scrollIntoView(false);
123
141
  event.preventDefault();
124
142
  break;
125
143
  }
126
144
  case 'Enter':
127
145
  {
128
- submit();
146
+ submit({
147
+ query: event.target.value
148
+ });
129
149
  break;
130
150
  }
131
151
  case 'Tab':
132
152
  setIsOpen(false);
133
153
  break;
134
154
  default:
155
+ setIsOpen(true);
135
156
  return;
136
157
  }
137
158
  },
@@ -159,7 +180,9 @@ function createAutocompletePropGetters(_ref) {
159
180
  role: 'row',
160
181
  'aria-selected': id === activeDescendant,
161
182
  onSelect: function onSelect() {
162
- return submit(id);
183
+ return submit({
184
+ activeDescendant: id
185
+ });
163
186
  }
164
187
  };
165
188
  },
@@ -52,7 +52,13 @@ function createAutocompleteStorage(_ref) {
52
52
  return {
53
53
  objectID: value,
54
54
  query: value,
55
- __indexName: 'recent-searches'
55
+ __indexName: 'recent-searches',
56
+ _highlightResult: getHighlightedAttribute({
57
+ item: {
58
+ query: value
59
+ },
60
+ query: query || ''
61
+ })
56
62
  };
57
63
  });
58
64
  var indicesForPropGetters = (0, _toConsumableArray2.default)(indices);
@@ -88,6 +94,24 @@ function isLocalStorageSupported() {
88
94
  return false;
89
95
  }
90
96
  }
97
+ function getHighlightedAttribute(_ref3) {
98
+ var item = _ref3.item,
99
+ query = _ref3.query;
100
+ if (!query.trim().length) {
101
+ return {
102
+ query: {
103
+ matchLevel: 'none'
104
+ }
105
+ };
106
+ }
107
+ return {
108
+ query: {
109
+ value: item.query.replace(new RegExp(query.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'), 'gi'), function (match) {
110
+ return "<mark>".concat(match, "</mark>");
111
+ })
112
+ }
113
+ };
114
+ }
91
115
  function getLocalStorage() {
92
116
  var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : LOCAL_STORAGE_KEY;
93
117
  if (!isLocalStorageSupported()) {
@@ -112,10 +136,10 @@ function getLocalStorage() {
112
136
  }
113
137
  };
114
138
  }
115
- function createStorage(_ref3) {
116
- var _ref3$limit = _ref3.limit,
117
- limit = _ref3$limit === void 0 ? 5 : _ref3$limit,
118
- storageKey = _ref3.storageKey;
139
+ function createStorage(_ref4) {
140
+ var _ref4$limit = _ref4.limit,
141
+ limit = _ref4$limit === void 0 ? 5 : _ref4$limit,
142
+ storageKey = _ref4.storageKey;
119
143
  var storage = getLocalStorage(storageKey);
120
144
  var updateListener = null;
121
145
  return {
@@ -4,4 +4,4 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = exports.default = '0.14.0';
7
+ var _default = exports.default = '0.15.0';
@@ -1,9 +1,10 @@
1
1
  /** @jsx createElement */
2
- import type { Renderer } from '../../types';
2
+ import type { ComponentChildren, Renderer } from '../../types';
3
3
  export type AutocompleteRecentSearchProps<T = {
4
4
  query: string;
5
5
  } & Record<string, unknown>> = {
6
6
  item: T;
7
+ children?: ComponentChildren;
7
8
  onSelect: () => void;
8
9
  onRemoveRecentSearch: () => void;
9
10
  classNames?: Partial<AutocompleteRecentSearchClassNames>;
@@ -34,4 +35,4 @@ export type AutocompleteRecentSearchClassNames = {
34
35
  **/
35
36
  deleteButton: string | string[];
36
37
  };
37
- export declare function createAutocompleteRecentSearchComponent({ createElement, }: Renderer): ({ item, onSelect, onRemoveRecentSearch, classNames, }: AutocompleteRecentSearchProps) => JSX.Element;
38
+ export declare function createAutocompleteRecentSearchComponent({ createElement, }: Renderer): ({ item, children, onSelect, onRemoveRecentSearch, classNames, }: AutocompleteRecentSearchProps) => JSX.Element;
@@ -4,6 +4,7 @@ export function createAutocompleteRecentSearchComponent(_ref) {
4
4
  var createElement = _ref.createElement;
5
5
  return function AutocompleteRecentSearch(_ref2) {
6
6
  var item = _ref2.item,
7
+ children = _ref2.children,
7
8
  onSelect = _ref2.onSelect,
8
9
  onRemoveRecentSearch = _ref2.onRemoveRecentSearch,
9
10
  _ref2$classNames = _ref2.classNames,
@@ -19,7 +20,7 @@ export function createAutocompleteRecentSearchComponent(_ref) {
19
20
  createElement: createElement
20
21
  })), createElement("div", {
21
22
  className: cx('ais-AutocompleteItemContentBody', 'ais-AutocompleteRecentSearchItemContentBody', classNames.content)
22
- }, item.query)), createElement("div", {
23
+ }, children)), createElement("div", {
23
24
  className: cx('ais-AutocompleteItemActions', 'ais-AutocompleteRecentSearchItemActions', classNames.actions)
24
25
  }, createElement("button", {
25
26
  className: cx('ais-AutocompleteItemActionButton', 'ais-AutocompleteRecentSearchItemDeleteButton', classNames.deleteButton),
@@ -7,6 +7,7 @@ export function createAutocompleteSearchComponent(_ref) {
7
7
  onClear = _ref2.onClear,
8
8
  query = _ref2.query,
9
9
  isSearchStalled = _ref2.isSearchStalled;
10
+ var inputRef = inputProps.ref;
10
11
  return createElement("form", {
11
12
  className: "ais-AutocompleteForm",
12
13
  action: "",
@@ -14,6 +15,10 @@ export function createAutocompleteSearchComponent(_ref) {
14
15
  role: "search",
15
16
  onSubmit: function onSubmit(e) {
16
17
  return e.preventDefault();
18
+ },
19
+ onReset: function onReset() {
20
+ var _inputRef$current;
21
+ return (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
17
22
  }
18
23
  }, createElement("div", {
19
24
  className: "ais-AutocompleteInputWrapperPrefix"
@@ -1,10 +1,11 @@
1
1
  /** @jsx createElement */
2
- import type { Renderer } from '../../types';
2
+ import type { ComponentChildren, Renderer } from '../../types';
3
3
  export type AutocompleteSuggestionProps<T = {
4
4
  query: string;
5
5
  } & Record<string, unknown>> = {
6
6
  item: T;
7
7
  onSelect: () => void;
8
+ children: ComponentChildren;
8
9
  classNames?: Partial<AutocompleteSuggestionClassNames>;
9
10
  };
10
11
  export type AutocompleteSuggestionClassNames = {
@@ -21,4 +22,4 @@ export type AutocompleteSuggestionClassNames = {
21
22
  /** Class names to apply to the body element **/
22
23
  body: string | string[];
23
24
  };
24
- export declare function createAutocompleteSuggestionComponent({ createElement, }: Renderer): ({ item, onSelect, classNames, }: AutocompleteSuggestionProps) => JSX.Element;
25
+ export declare function createAutocompleteSuggestionComponent({ createElement, }: Renderer): ({ children, onSelect, classNames, }: AutocompleteSuggestionProps) => JSX.Element;
@@ -3,7 +3,7 @@ import { AutocompleteSubmitIcon } from "./icons.js";
3
3
  export function createAutocompleteSuggestionComponent(_ref) {
4
4
  var createElement = _ref.createElement;
5
5
  return function AutocompleteSuggestion(_ref2) {
6
- var item = _ref2.item,
6
+ var children = _ref2.children,
7
7
  onSelect = _ref2.onSelect,
8
8
  _ref2$classNames = _ref2.classNames,
9
9
  classNames = _ref2$classNames === void 0 ? {} : _ref2$classNames;
@@ -18,6 +18,6 @@ export function createAutocompleteSuggestionComponent(_ref) {
18
18
  createElement: createElement
19
19
  })), createElement("div", {
20
20
  className: cx('ais-AutocompleteItemContentBody', 'ais-AutocompleteSuggestionItemContentBody', classNames.content)
21
- }, item.query)));
21
+ }, children)));
22
22
  };
23
23
  }
@@ -12,6 +12,7 @@ export function createAutocompletePropGetters(_ref) {
12
12
  onRefine = _ref2.onRefine,
13
13
  globalOnSelect = _ref2.onSelect;
14
14
  var getElementId = createGetElementId(useId());
15
+ var inputRef = useRef(null);
15
16
  var rootRef = useRef(null);
16
17
  var _useState = useState(false),
17
18
  _useState2 = _slicedToArray(_useState, 2),
@@ -43,7 +44,7 @@ export function createAutocompletePropGetters(_ref) {
43
44
  document.body.removeEventListener('click', onBodyClick);
44
45
  };
45
46
  }, [rootRef]);
46
- var getNextActiveDescendent = function getNextActiveDescendent(key) {
47
+ var getNextActiveDescendant = function getNextActiveDescendant(key) {
47
48
  switch (key) {
48
49
  case 'ArrowLeft':
49
50
  case 'ArrowUp':
@@ -62,11 +63,21 @@ export function createAutocompletePropGetters(_ref) {
62
63
  }
63
64
  };
64
65
  var submit = function submit() {
65
- var actualActiveDescendant = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : activeDescendant;
66
- setIsOpen(false);
67
- if (actualActiveDescendant && items.has(actualActiveDescendant)) {
66
+ var _override$activeDesce;
67
+ var override = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
68
+ if (isOpen) {
69
+ setIsOpen(false);
70
+ } else {
71
+ var _inputRef$current;
72
+ (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.blur();
73
+ }
74
+ var actualDescendant = (_override$activeDesce = override.activeDescendant) !== null && _override$activeDesce !== void 0 ? _override$activeDesce : activeDescendant;
75
+ if (!actualDescendant && override.query) {
76
+ onRefine(override.query);
77
+ }
78
+ if (actualDescendant && items.has(actualDescendant)) {
68
79
  var _getQuery;
69
- var _ref3 = items.get(actualActiveDescendant),
80
+ var _ref3 = items.get(actualDescendant),
70
81
  _item = _ref3.item,
71
82
  _ref3$config = _ref3.config,
72
83
  indexOnSelect = _ref3$config.onSelect,
@@ -88,6 +99,7 @@ export function createAutocompletePropGetters(_ref) {
88
99
  getInputProps: function getInputProps() {
89
100
  return {
90
101
  id: getElementId('input'),
102
+ ref: inputRef,
91
103
  role: 'combobox',
92
104
  'aria-autocomplete': 'list',
93
105
  'aria-expanded': isOpen,
@@ -98,33 +110,42 @@ export function createAutocompletePropGetters(_ref) {
98
110
  return setIsOpen(true);
99
111
  },
100
112
  onKeyDown: function onKeyDown(event) {
101
- if (event.key === 'Escape') {
102
- setActiveDescendant(undefined);
103
- setIsOpen(false);
104
- return;
105
- }
106
113
  switch (event.key) {
114
+ case 'Escape':
115
+ {
116
+ if (isOpen) {
117
+ setIsOpen(false);
118
+ event.preventDefault();
119
+ } else {
120
+ setActiveDescendant(undefined);
121
+ }
122
+ break;
123
+ }
107
124
  case 'ArrowLeft':
108
125
  case 'ArrowUp':
109
126
  case 'ArrowRight':
110
127
  case 'ArrowDown':
111
128
  {
112
129
  var _document$getElementB;
113
- var nextActiveDescendent = getNextActiveDescendent(event.key);
114
- setActiveDescendant(nextActiveDescendent);
115
- (_document$getElementB = document.getElementById(nextActiveDescendent)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.scrollIntoView(false);
130
+ setIsOpen(true);
131
+ var nextActiveDescendant = getNextActiveDescendant(event.key);
132
+ setActiveDescendant(nextActiveDescendant);
133
+ (_document$getElementB = document.getElementById(nextActiveDescendant)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.scrollIntoView(false);
116
134
  event.preventDefault();
117
135
  break;
118
136
  }
119
137
  case 'Enter':
120
138
  {
121
- submit();
139
+ submit({
140
+ query: event.target.value
141
+ });
122
142
  break;
123
143
  }
124
144
  case 'Tab':
125
145
  setIsOpen(false);
126
146
  break;
127
147
  default:
148
+ setIsOpen(true);
128
149
  return;
129
150
  }
130
151
  },
@@ -152,7 +173,9 @@ export function createAutocompletePropGetters(_ref) {
152
173
  role: 'row',
153
174
  'aria-selected': id === activeDescendant,
154
175
  onSelect: function onSelect() {
155
- return submit(id);
176
+ return submit({
177
+ activeDescendant: id
178
+ });
156
179
  }
157
180
  };
158
181
  },
@@ -38,6 +38,17 @@ export declare function createAutocompleteStorage({ useEffect, useMemo, useState
38
38
  objectID: string;
39
39
  query: string;
40
40
  __indexName: string;
41
+ _highlightResult: {
42
+ query: {
43
+ matchLevel: string;
44
+ value?: undefined;
45
+ };
46
+ } | {
47
+ query: {
48
+ value: string;
49
+ matchLevel?: undefined;
50
+ };
51
+ };
41
52
  }[];
42
53
  indicesForPropGetters: {
43
54
  indexName: string;
@@ -44,7 +44,13 @@ export function createAutocompleteStorage(_ref) {
44
44
  return {
45
45
  objectID: value,
46
46
  query: value,
47
- __indexName: 'recent-searches'
47
+ __indexName: 'recent-searches',
48
+ _highlightResult: getHighlightedAttribute({
49
+ item: {
50
+ query: value
51
+ },
52
+ query: query || ''
53
+ })
48
54
  };
49
55
  });
50
56
  var indicesForPropGetters = _toConsumableArray(indices);
@@ -80,6 +86,24 @@ function isLocalStorageSupported() {
80
86
  return false;
81
87
  }
82
88
  }
89
+ function getHighlightedAttribute(_ref3) {
90
+ var item = _ref3.item,
91
+ query = _ref3.query;
92
+ if (!query.trim().length) {
93
+ return {
94
+ query: {
95
+ matchLevel: 'none'
96
+ }
97
+ };
98
+ }
99
+ return {
100
+ query: {
101
+ value: item.query.replace(new RegExp(query.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'), 'gi'), function (match) {
102
+ return "<mark>".concat(match, "</mark>");
103
+ })
104
+ }
105
+ };
106
+ }
83
107
  function getLocalStorage() {
84
108
  var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : LOCAL_STORAGE_KEY;
85
109
  if (!isLocalStorageSupported()) {
@@ -104,10 +128,10 @@ function getLocalStorage() {
104
128
  }
105
129
  };
106
130
  }
107
- export function createStorage(_ref3) {
108
- var _ref3$limit = _ref3.limit,
109
- limit = _ref3$limit === void 0 ? 5 : _ref3$limit,
110
- storageKey = _ref3.storageKey;
131
+ export function createStorage(_ref4) {
132
+ var _ref4$limit = _ref4.limit,
133
+ limit = _ref4$limit === void 0 ? 5 : _ref4$limit,
134
+ storageKey = _ref4.storageKey;
111
135
  var storage = getLocalStorage(storageKey);
112
136
  var updateListener = null;
113
137
  return {
@@ -1,2 +1,2 @@
1
- declare const _default: "0.14.0";
1
+ declare const _default: "0.15.0";
2
2
  export default _default;
@@ -1 +1 @@
1
- export default '0.14.0';
1
+ export default '0.15.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instantsearch-ui-components",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "Common UI components for InstantSearch.",
5
5
  "types": "dist/es/index.d.ts",
6
6
  "main": "dist/cjs/index.js",
@@ -53,5 +53,5 @@
53
53
  "zod": "^3.25.76 || ^4",
54
54
  "zod-to-json-schema": "3.24.6"
55
55
  },
56
- "gitHead": "6e4bcd74b92f96761f514bee14824537ba36adf2"
56
+ "gitHead": "b4cb69c8cfaa9dc22dfe8fe695568cf5200f3893"
57
57
  }