@algolia/autocomplete-js 1.5.5 → 1.6.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.
@@ -6,6 +6,7 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
6
6
 
7
7
  import { createAutocomplete } from '@algolia/autocomplete-core';
8
8
  import { createRef, debounce, getItemsCount } from '@algolia/autocomplete-shared';
9
+ import htm from 'htm';
9
10
  import { createAutocompleteDom } from './createAutocompleteDom';
10
11
  import { createEffectWrapper } from './createEffectWrapper';
11
12
  import { createReactiveWrapper } from './createReactiveWrapper';
@@ -94,6 +95,9 @@ export function autocomplete(options) {
94
95
  setContext: autocomplete.value.setContext,
95
96
  refresh: autocomplete.value.refresh
96
97
  };
98
+ var html = reactive(function () {
99
+ return htm.bind(props.value.renderer.renderer.createElement);
100
+ });
97
101
  var dom = reactive(function () {
98
102
  return createAutocompleteDom({
99
103
  autocomplete: autocomplete.value,
@@ -128,12 +132,12 @@ export function autocomplete(options) {
128
132
  classNames: props.value.renderer.classNames,
129
133
  components: props.value.renderer.components,
130
134
  container: props.value.renderer.container,
131
- createElement: props.value.renderer.renderer.createElement,
135
+ html: html.value,
132
136
  dom: dom.value,
133
- Fragment: props.value.renderer.renderer.Fragment,
134
137
  panelContainer: isDetached.value ? dom.value.detachedContainer : props.value.renderer.panelContainer,
135
138
  propGetters: propGetters,
136
- state: lastStateRef.current
139
+ state: lastStateRef.current,
140
+ renderer: props.value.renderer.renderer
137
141
  };
138
142
  var render = !getItemsCount(state) && !hasNoResultsSourceTemplateRef.current && props.value.renderer.renderNoResults || props.value.renderer.render;
139
143
  renderSearchBox(renderProps);
@@ -142,8 +142,12 @@ export function createAutocompleteDom(_ref) {
142
142
  type: 'button',
143
143
  class: classNames.detachedCancelButton,
144
144
  textContent: translations.detachedCancelButtonText,
145
- onClick: function onClick(event) {
145
+ // Prevent `onTouchStart` from closing the panel
146
+ // since it should be initiated by `onClick` only
147
+ onTouchStart: function onTouchStart(event) {
146
148
  event.stopPropagation();
149
+ },
150
+ onClick: function onClick() {
147
151
  autocomplete.setIsOpen(false);
148
152
  setIsModalOpen(false);
149
153
  }
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { BaseItem } from '@algolia/autocomplete-core';
3
- import { AutocompleteClassNames, AutocompleteOptions, AutocompleteRender, AutocompleteRenderer } from './types';
3
+ import { AutocompleteClassNames, AutocompleteOptions, AutocompleteRender } from './types';
4
4
  export declare function getDefaultOptions<TItem extends BaseItem>(options: AutocompleteOptions<TItem>): {
5
5
  renderer: {
6
6
  classNames: AutocompleteClassNames;
@@ -156,7 +156,11 @@ export declare function getDefaultOptions<TItem extends BaseItem>(options: Autoc
156
156
  panelPlacement: "start" | "end" | "full-width" | "input-wrapper-width";
157
157
  render: AutocompleteRender<any> | AutocompleteRender<TItem>;
158
158
  renderNoResults: AutocompleteRender<TItem> | undefined;
159
- renderer: AutocompleteRenderer;
159
+ renderer: {
160
+ createElement: import("./types").Pragma;
161
+ Fragment: any;
162
+ render?: import("./types").Render | undefined;
163
+ };
160
164
  detachedMediaQuery: string;
161
165
  components: {
162
166
  [x: string]: (props: any) => JSX.Element;
@@ -10,7 +10,7 @@ function _objectWithoutProperties(source, excluded) { if (source == null) return
10
10
 
11
11
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
12
12
 
13
- import { generateAutocompleteId, invariant } from '@algolia/autocomplete-shared';
13
+ import { generateAutocompleteId, invariant, warn } from '@algolia/autocomplete-shared';
14
14
  import { createElement as preactCreateElement, Fragment as PreactFragment, render } from 'preact';
15
15
  import { createHighlightComponent, createReverseHighlightComponent, createReverseSnippetComponent, createSnippetComponent } from './components';
16
16
  import { getHTMLElement, mergeClassNames } from './utils';
@@ -49,7 +49,8 @@ var defaultRender = function defaultRender(_ref, root) {
49
49
 
50
50
  var defaultRenderer = {
51
51
  createElement: preactCreateElement,
52
- Fragment: PreactFragment
52
+ Fragment: PreactFragment,
53
+ render: render
53
54
  };
54
55
  export function getDefaultOptions(options) {
55
56
  var _core$id;
@@ -81,7 +82,11 @@ export function getDefaultOptions(options) {
81
82
 
82
83
  var containerElement = getHTMLElement(environment, container);
83
84
  invariant(containerElement.tagName !== 'INPUT', 'The `container` option does not support `input` elements. You need to change the container to a `div`.');
84
- var defaultedRenderer = renderer !== null && renderer !== void 0 ? renderer : defaultRenderer;
85
+ process.env.NODE_ENV !== 'production' ? warn(Boolean(!render || (renderer === null || renderer === void 0 ? void 0 : renderer.render)), "You provided the `render` option but did not provide a `renderer.render`. Since v1.6.0, you can provide a `render` function directly in `renderer`." + "\nTo get rid of this warning, do any of the following depending on your use case." + "\n- If you are using the `render` option only to override Autocomplete's default `render` function, pass the `render` function into `renderer` and remove the `render` option." + '\n- If you are using the `render` option to customize the layout, pass your `render` function into `renderer` and use it from the provided parameters of the `render` option.' + '\nSee https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-js/autocomplete/#param-render') : void 0;
86
+ process.env.NODE_ENV !== 'production' ? warn(!renderer || render || renderer.Fragment && renderer.createElement && renderer.render, "You provided an incomplete `renderer` (missing: ".concat([!(renderer !== null && renderer !== void 0 && renderer.createElement) && '`renderer.createElement`', !(renderer !== null && renderer !== void 0 && renderer.Fragment) && '`renderer.Fragment`', !(renderer !== null && renderer !== void 0 && renderer.render) && '`renderer.render`'].filter(Boolean).join(', '), "). This can cause rendering issues.") + '\nSee https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-js/autocomplete/#param-renderer') : void 0;
87
+
88
+ var defaultedRenderer = _objectSpread(_objectSpread({}, defaultRenderer), renderer);
89
+
85
90
  var defaultComponents = {
86
91
  Highlight: createHighlightComponent(defaultedRenderer),
87
92
  ReverseHighlight: createReverseHighlightComponent(defaultedRenderer),
@@ -1,19 +1,18 @@
1
- /** @jsx createElement */
2
- import { AutocompleteApi as AutocompleteCoreApi, AutocompleteScopeApi } from '@algolia/autocomplete-core';
3
- import { BaseItem } from '@algolia/autocomplete-core/src';
4
- import { AutocompleteClassNames, AutocompleteComponents, AutocompleteDom, AutocompletePropGetters, AutocompleteRender, AutocompleteState, Pragma, PragmaFrag } from './types';
1
+ /** @jsx renderer.createElement */
2
+ import { AutocompleteApi as AutocompleteCoreApi, AutocompleteScopeApi, BaseItem } from '@algolia/autocomplete-core';
3
+ import { AutocompleteClassNames, AutocompleteComponents, AutocompleteDom, AutocompletePropGetters, AutocompleteRender, AutocompleteRenderer, AutocompleteState, HTMLTemplate } from './types';
5
4
  declare type RenderProps<TItem extends BaseItem> = {
6
5
  autocomplete: AutocompleteCoreApi<TItem>;
7
6
  autocompleteScopeApi: AutocompleteScopeApi<TItem>;
8
7
  classNames: AutocompleteClassNames;
9
8
  components: AutocompleteComponents;
10
- createElement: Pragma;
9
+ html: HTMLTemplate;
11
10
  dom: AutocompleteDom;
12
- Fragment: PragmaFrag;
13
11
  panelContainer: HTMLElement;
14
12
  propGetters: AutocompletePropGetters<TItem>;
15
13
  state: AutocompleteState<TItem>;
14
+ renderer: AutocompleteRenderer;
16
15
  };
17
16
  export declare function renderSearchBox<TItem extends BaseItem>({ autocomplete, autocompleteScopeApi, dom, propGetters, state, }: RenderProps<TItem>): void;
18
- export declare function renderPanel<TItem extends BaseItem>(render: AutocompleteRender<TItem>, { autocomplete, autocompleteScopeApi, classNames, createElement, dom, Fragment, panelContainer, propGetters, state, components, }: RenderProps<TItem>): void;
17
+ export declare function renderPanel<TItem extends BaseItem>(render: AutocompleteRender<TItem>, { autocomplete, autocompleteScopeApi, classNames, html, dom, panelContainer, propGetters, state, components, renderer, }: RenderProps<TItem>): void;
19
18
  export {};
@@ -6,7 +6,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
6
6
 
7
7
  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; }
8
8
 
9
- /** @jsx createElement */
9
+ /** @jsx renderer.createElement */
10
10
  import { setProperties, setPropertiesWithoutEvents } from './utils';
11
11
  export function renderSearchBox(_ref) {
12
12
  var autocomplete = _ref.autocomplete,
@@ -39,13 +39,13 @@ export function renderPanel(render, _ref2) {
39
39
  var autocomplete = _ref2.autocomplete,
40
40
  autocompleteScopeApi = _ref2.autocompleteScopeApi,
41
41
  classNames = _ref2.classNames,
42
- createElement = _ref2.createElement,
42
+ html = _ref2.html,
43
43
  dom = _ref2.dom,
44
- Fragment = _ref2.Fragment,
45
44
  panelContainer = _ref2.panelContainer,
46
45
  propGetters = _ref2.propGetters,
47
46
  state = _ref2.state,
48
- components = _ref2.components;
47
+ components = _ref2.components,
48
+ renderer = _ref2.renderer;
49
49
 
50
50
  if (!state.isOpen) {
51
51
  if (panelContainer.contains(dom.panel)) {
@@ -69,28 +69,30 @@ export function renderPanel(render, _ref2) {
69
69
  }).map(function (_ref4, sourceIndex) {
70
70
  var source = _ref4.source,
71
71
  items = _ref4.items;
72
- return createElement("section", {
72
+ return renderer.createElement("section", {
73
73
  key: sourceIndex,
74
74
  className: classNames.source,
75
75
  "data-autocomplete-source-id": source.sourceId
76
- }, source.templates.header && createElement("div", {
76
+ }, source.templates.header && renderer.createElement("div", {
77
77
  className: classNames.sourceHeader
78
78
  }, source.templates.header({
79
79
  components: components,
80
- createElement: createElement,
81
- Fragment: Fragment,
80
+ createElement: renderer.createElement,
81
+ Fragment: renderer.Fragment,
82
82
  items: items,
83
83
  source: source,
84
- state: state
85
- })), source.templates.noResults && items.length === 0 ? createElement("div", {
84
+ state: state,
85
+ html: html
86
+ })), source.templates.noResults && items.length === 0 ? renderer.createElement("div", {
86
87
  className: classNames.sourceNoResults
87
88
  }, source.templates.noResults({
88
89
  components: components,
89
- createElement: createElement,
90
- Fragment: Fragment,
90
+ createElement: renderer.createElement,
91
+ Fragment: renderer.Fragment,
91
92
  source: source,
92
- state: state
93
- })) : createElement("ul", _extends({
93
+ state: state,
94
+ html: html
95
+ })) : renderer.createElement("ul", _extends({
94
96
  className: classNames.list
95
97
  }, propGetters.getListProps(_objectSpread({
96
98
  state: state,
@@ -100,7 +102,7 @@ export function renderPanel(render, _ref2) {
100
102
  item: item,
101
103
  source: source
102
104
  });
103
- return createElement("li", _extends({
105
+ return renderer.createElement("li", _extends({
104
106
  key: itemProps.id,
105
107
  className: classNames.item
106
108
  }, propGetters.getItemProps(_objectSpread({
@@ -108,38 +110,40 @@ export function renderPanel(render, _ref2) {
108
110
  props: itemProps
109
111
  }, autocompleteScopeApi))), source.templates.item({
110
112
  components: components,
111
- createElement: createElement,
112
- Fragment: Fragment,
113
+ createElement: renderer.createElement,
114
+ Fragment: renderer.Fragment,
113
115
  item: item,
114
- state: state
116
+ state: state,
117
+ html: html
115
118
  }));
116
- })), source.templates.footer && createElement("div", {
119
+ })), source.templates.footer && renderer.createElement("div", {
117
120
  className: classNames.sourceFooter
118
121
  }, source.templates.footer({
119
122
  components: components,
120
- createElement: createElement,
121
- Fragment: Fragment,
123
+ createElement: renderer.createElement,
124
+ Fragment: renderer.Fragment,
122
125
  items: items,
123
126
  source: source,
124
- state: state
127
+ state: state,
128
+ html: html
125
129
  })));
126
130
  });
127
- var children = createElement(Fragment, null, createElement("div", {
131
+ var children = renderer.createElement(renderer.Fragment, null, renderer.createElement("div", {
128
132
  className: classNames.panelLayout
129
- }, sections), createElement("div", {
133
+ }, sections), renderer.createElement("div", {
130
134
  className: "aa-GradientBottom"
131
135
  }));
132
136
  var elements = sections.reduce(function (acc, current) {
133
137
  acc[current.props['data-autocomplete-source-id']] = current;
134
138
  return acc;
135
139
  }, {});
136
- render(_objectSpread({
140
+ render(_objectSpread(_objectSpread({
137
141
  children: children,
138
142
  state: state,
139
143
  sections: sections,
140
- elements: elements,
141
- createElement: createElement,
142
- Fragment: Fragment,
143
- components: components
144
+ elements: elements
145
+ }, renderer), {}, {
146
+ components: components,
147
+ html: html
144
148
  }, autocompleteScopeApi), dom.panel);
145
149
  }
@@ -1,6 +1,6 @@
1
1
  import { AutocompleteScopeApi, BaseItem } from '@algolia/autocomplete-core';
2
2
  import { AutocompleteComponents } from './AutocompleteComponents';
3
- import { Pragma, PragmaFrag, VNode } from './AutocompleteRenderer';
3
+ import { HTMLTemplate, Pragma, PragmaFrag, Render, VNode } from './AutocompleteRenderer';
4
4
  import { AutocompleteState } from './AutocompleteState';
5
5
  export declare type AutocompleteRender<TItem extends BaseItem> = (params: AutocompleteScopeApi<TItem> & {
6
6
  children: VNode;
@@ -10,4 +10,6 @@ export declare type AutocompleteRender<TItem extends BaseItem> = (params: Autoco
10
10
  components: AutocompleteComponents;
11
11
  createElement: Pragma;
12
12
  Fragment: PragmaFrag;
13
+ html: HTMLTemplate;
14
+ render?: Render;
13
15
  }, root: HTMLElement) => void;
@@ -10,6 +10,7 @@ export declare type VNode<TProps = any> = {
10
10
  key?: any;
11
11
  };
12
12
  };
13
+ export declare type Render = (vnode: ComponentChild, parent: Element | Document | ShadowRoot | DocumentFragment, replaceNode?: Element | Text | undefined) => void;
13
14
  export declare type AutocompleteRenderer = {
14
15
  /**
15
16
  * The function to create virtual nodes.
@@ -23,5 +24,10 @@ export declare type AutocompleteRenderer = {
23
24
  * @default preact.Fragment
24
25
  */
25
26
  Fragment: PragmaFrag;
27
+ /**
28
+ * The function to render children to an element.
29
+ */
30
+ render?: Render;
26
31
  };
32
+ export declare type HTMLTemplate = (strings: TemplateStringsArray, ...values: any[]) => VNode | VNode[];
27
33
  export {};
@@ -1,10 +1,11 @@
1
1
  import { AutocompleteSource as AutocompleteCoreSource, InternalAutocompleteSource as InternalAutocompleteCoreSource, BaseItem } from '@algolia/autocomplete-core';
2
2
  import { AutocompleteComponents } from './AutocompleteComponents';
3
- import { AutocompleteRenderer, VNode } from './AutocompleteRenderer';
3
+ import { AutocompleteRenderer, HTMLTemplate, VNode } from './AutocompleteRenderer';
4
4
  import { AutocompleteState } from './AutocompleteState';
5
5
  declare type Template<TParams> = (params: TParams & AutocompleteRenderer & {
6
6
  components: AutocompleteComponents;
7
- }) => VNode | string;
7
+ html: HTMLTemplate;
8
+ }) => VNode | VNode[] | string;
8
9
  /**
9
10
  * Templates to display in the autocomplete panel.
10
11
  *
@@ -1,10 +1,17 @@
1
1
  /* eslint-disable */
2
2
 
3
+ /**
4
+ * Touch-specific event aliases
5
+ *
6
+ * See https://w3c.github.io/touch-events/#extensions-to-the-globaleventhandlers-mixin
7
+ */
8
+ var TOUCH_EVENTS_ALIASES = ['ontouchstart', 'ontouchend', 'ontouchmove', 'ontouchcancel'];
3
9
  /*
4
10
  * Taken from Preact
5
11
  *
6
12
  * See https://github.com/preactjs/preact/blob/6ab49d9020740127577bf4af66bf63f4af7f9fee/src/diff/props.js#L58-L151
7
13
  */
14
+
8
15
  function setStyle(style, key, value) {
9
16
  if (value === null) {
10
17
  style[key] = '';
@@ -50,7 +57,7 @@ export function setProperty(dom, name, value) {
50
57
  else if (name[0] === 'o' && name[1] === 'n') {
51
58
  useCapture = name !== (name = name.replace(/Capture$/, ''));
52
59
  nameLower = name.toLowerCase();
53
- if (nameLower in dom) name = nameLower;
60
+ if (nameLower in dom || TOUCH_EVENTS_ALIASES.includes(nameLower)) name = nameLower;
54
61
  name = name.slice(2);
55
62
  if (!dom._listeners) dom._listeners = {};
56
63
  dom._listeners[name] = value;
@@ -1,4 +1,4 @@
1
- /*! @algolia/autocomplete-js 1.5.5 | MIT License | © Algolia, Inc. and contributors | https://github.com/algolia/autocomplete */
1
+ /*! @algolia/autocomplete-js 1.6.0 | MIT License | © Algolia, Inc. and contributors | https://github.com/algolia/autocomplete */
2
2
  (function (global, factory) {
3
3
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
4
4
  typeof define === 'function' && define.amd ? define(['exports'], factory) :
@@ -311,7 +311,7 @@
311
311
 
312
312
  var noop = function noop() {};
313
313
 
314
- var version = '1.5.5';
314
+ var version = '1.6.0';
315
315
 
316
316
  var userAgents$1 = [{
317
317
  segment: 'autocomplete-core',
@@ -584,14 +584,6 @@
584
584
  });
585
585
  }
586
586
 
587
- var chromeRegex = /(crmo|crios|chrome)/i;
588
- var edgeRegex = /edg(e|ios|a)?/i;
589
- var samsungBrowserRegex = /samsungbrowser/i;
590
- var chromiumRegex = /chromium/i;
591
- function isChrome(userAgent) {
592
- return Boolean(userAgent && userAgent.match(chromeRegex) && !userAgent.match(edgeRegex) && !userAgent.match(samsungBrowserRegex) && !userAgent.match(chromiumRegex));
593
- }
594
-
595
587
  // We don't have access to the autocomplete source when we call `onKeyDown`
596
588
  // or `onClick` because those are native browser events.
597
589
  // However, we can get the source from the suggestion index.
@@ -2032,7 +2024,7 @@
2032
2024
 
2033
2025
  var activeItem = getActiveItem(store.getState());
2034
2026
  var userAgent = (_props$environment$na = props.environment.navigator) === null || _props$environment$na === void 0 ? void 0 : _props$environment$na.userAgent;
2035
- var shouldFallbackKeyHint = isSamsung(userAgent) && isChrome(userAgent);
2027
+ var shouldFallbackKeyHint = isSamsung(userAgent);
2036
2028
  var enterKeyHint = activeItem !== null && activeItem !== void 0 && activeItem.itemUrl && !shouldFallbackKeyHint ? 'go' : 'search';
2037
2029
  return _objectSpread$6({
2038
2030
  'aria-autocomplete': 'both',
@@ -2605,6 +2597,8 @@
2605
2597
  }, propGetters), setters);
2606
2598
  }
2607
2599
 
2600
+ var n$1=function(t,s,r,e){var u;s[0]=0;for(var h=1;h<s.length;h++){var p=s[h++],a=s[h]?(s[0]|=p?1:2,r[s[h++]]):s[++h];3===p?e[0]=a:4===p?e[1]=Object.assign(e[1]||{},a):5===p?(e[1]=e[1]||{})[s[++h]]=a:6===p?e[1][s[++h]]+=a+"":p?(u=t.apply(a,n$1(t,a,r,["",null])),e.push(u),a[0]?s[0]|=2:(s[h-2]=0,s[h]=u)):e.push(a);}return e},t$1=new Map;function htm(s){var r=t$1.get(this);return r||(r=new Map,t$1.set(this,r)),(r=n$1(this,r.get(s)||(r.set(s,r=function(n){for(var t,s,r=1,e="",u="",h=[0],p=function(n){1===r&&(n||(e=e.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?h.push(0,n,e):3===r&&(n||e)?(h.push(3,n,e),r=2):2===r&&"..."===e&&n?h.push(4,n,0):2===r&&e&&!n?h.push(5,0,!0,e):r>=5&&((e||!n&&5===r)&&(h.push(r,0,e,s),r=6),n&&(h.push(r,n,0,s),r=6)),e="";},a=0;a<n.length;a++){a&&(1===r&&p(),p(a));for(var l=0;l<n[a].length;l++)t=n[a][l],1===r?"<"===t?(p(),h=[h],r=3):e+=t:4===r?"--"===e&&">"===t?(r=1,e=""):e=t+e[0]:u?t===u?u="":e+=t:'"'===t||"'"===t?u=t:">"===t?(p(),r=1):r&&("="===t?(r=5,s=e,e=""):"/"===t&&(r<5||">"===n[a][l+1])?(p(),3===r&&(h=h[0]),r=h,(h=h[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(p(),r=2):e+=t),3===r&&"!--"===e&&(r=4,h=h[0]);}return p(),h}(s)),r),arguments,[])).length>1?r:r[0]}
2601
+
2608
2602
  var ClearIcon = function ClearIcon(_ref) {
2609
2603
  var environment = _ref.environment;
2610
2604
  var element = environment.document.createElementNS('http://www.w3.org/2000/svg', 'svg');
@@ -2675,11 +2669,18 @@
2675
2669
 
2676
2670
  /* eslint-disable */
2677
2671
 
2672
+ /**
2673
+ * Touch-specific event aliases
2674
+ *
2675
+ * See https://w3c.github.io/touch-events/#extensions-to-the-globaleventhandlers-mixin
2676
+ */
2677
+ var TOUCH_EVENTS_ALIASES = ['ontouchstart', 'ontouchend', 'ontouchmove', 'ontouchcancel'];
2678
2678
  /*
2679
2679
  * Taken from Preact
2680
2680
  *
2681
2681
  * See https://github.com/preactjs/preact/blob/6ab49d9020740127577bf4af66bf63f4af7f9fee/src/diff/props.js#L58-L151
2682
2682
  */
2683
+
2683
2684
  function setStyle(style, key, value) {
2684
2685
  if (value === null) {
2685
2686
  style[key] = '';
@@ -2725,7 +2726,7 @@
2725
2726
  else if (name[0] === 'o' && name[1] === 'n') {
2726
2727
  useCapture = name !== (name = name.replace(/Capture$/, ''));
2727
2728
  nameLower = name.toLowerCase();
2728
- if (nameLower in dom) name = nameLower;
2729
+ if (nameLower in dom || TOUCH_EVENTS_ALIASES.includes(nameLower)) name = nameLower;
2729
2730
  name = name.slice(2);
2730
2731
  if (!dom._listeners) dom._listeners = {};
2731
2732
  dom._listeners[name] = value;
@@ -2985,8 +2986,12 @@
2985
2986
  type: 'button',
2986
2987
  class: classNames.detachedCancelButton,
2987
2988
  textContent: translations.detachedCancelButtonText,
2988
- onClick: function onClick(event) {
2989
+ // Prevent `onTouchStart` from closing the panel
2990
+ // since it should be initiated by `onClick` only
2991
+ onTouchStart: function onTouchStart(event) {
2989
2992
  event.stopPropagation();
2993
+ },
2994
+ onClick: function onClick() {
2990
2995
  autocomplete.setIsOpen(false);
2991
2996
  setIsModalOpen(false);
2992
2997
  }
@@ -3659,7 +3664,8 @@
3659
3664
 
3660
3665
  var defaultRenderer = {
3661
3666
  createElement: v,
3662
- Fragment: d
3667
+ Fragment: d,
3668
+ render: S
3663
3669
  };
3664
3670
  function getDefaultOptions(options) {
3665
3671
  var _core$id;
@@ -3691,7 +3697,11 @@
3691
3697
 
3692
3698
  var containerElement = getHTMLElement(environment, container);
3693
3699
  invariant(containerElement.tagName !== 'INPUT', 'The `container` option does not support `input` elements. You need to change the container to a `div`.');
3694
- var defaultedRenderer = renderer !== null && renderer !== void 0 ? renderer : defaultRenderer;
3700
+ "development" !== 'production' ? warn(Boolean(!render || (renderer === null || renderer === void 0 ? void 0 : renderer.render)), "You provided the `render` option but did not provide a `renderer.render`. Since v1.6.0, you can provide a `render` function directly in `renderer`." + "\nTo get rid of this warning, do any of the following depending on your use case." + "\n- If you are using the `render` option only to override Autocomplete's default `render` function, pass the `render` function into `renderer` and remove the `render` option." + '\n- If you are using the `render` option to customize the layout, pass your `render` function into `renderer` and use it from the provided parameters of the `render` option.' + '\nSee https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-js/autocomplete/#param-render') : void 0;
3701
+ "development" !== 'production' ? warn(!renderer || render || renderer.Fragment && renderer.createElement && renderer.render, "You provided an incomplete `renderer` (missing: ".concat([!(renderer !== null && renderer !== void 0 && renderer.createElement) && '`renderer.createElement`', !(renderer !== null && renderer !== void 0 && renderer.Fragment) && '`renderer.Fragment`', !(renderer !== null && renderer !== void 0 && renderer.render) && '`renderer.render`'].filter(Boolean).join(', '), "). This can cause rendering issues.") + '\nSee https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-js/autocomplete/#param-renderer') : void 0;
3702
+
3703
+ var defaultedRenderer = _objectSpread2(_objectSpread2({}, defaultRenderer), renderer);
3704
+
3695
3705
  var defaultComponents = {
3696
3706
  Highlight: createHighlightComponent(defaultedRenderer),
3697
3707
  ReverseHighlight: createReverseHighlightComponent(defaultedRenderer),
@@ -3844,13 +3854,13 @@
3844
3854
  var autocomplete = _ref2.autocomplete,
3845
3855
  autocompleteScopeApi = _ref2.autocompleteScopeApi,
3846
3856
  classNames = _ref2.classNames,
3847
- createElement = _ref2.createElement,
3857
+ html = _ref2.html,
3848
3858
  dom = _ref2.dom,
3849
- Fragment = _ref2.Fragment,
3850
3859
  panelContainer = _ref2.panelContainer,
3851
3860
  propGetters = _ref2.propGetters,
3852
3861
  state = _ref2.state,
3853
- components = _ref2.components;
3862
+ components = _ref2.components,
3863
+ renderer = _ref2.renderer;
3854
3864
 
3855
3865
  if (!state.isOpen) {
3856
3866
  if (panelContainer.contains(dom.panel)) {
@@ -3874,28 +3884,30 @@
3874
3884
  }).map(function (_ref4, sourceIndex) {
3875
3885
  var source = _ref4.source,
3876
3886
  items = _ref4.items;
3877
- return createElement("section", {
3887
+ return renderer.createElement("section", {
3878
3888
  key: sourceIndex,
3879
3889
  className: classNames.source,
3880
3890
  "data-autocomplete-source-id": source.sourceId
3881
- }, source.templates.header && createElement("div", {
3891
+ }, source.templates.header && renderer.createElement("div", {
3882
3892
  className: classNames.sourceHeader
3883
3893
  }, source.templates.header({
3884
3894
  components: components,
3885
- createElement: createElement,
3886
- Fragment: Fragment,
3895
+ createElement: renderer.createElement,
3896
+ Fragment: renderer.Fragment,
3887
3897
  items: items,
3888
3898
  source: source,
3889
- state: state
3890
- })), source.templates.noResults && items.length === 0 ? createElement("div", {
3899
+ state: state,
3900
+ html: html
3901
+ })), source.templates.noResults && items.length === 0 ? renderer.createElement("div", {
3891
3902
  className: classNames.sourceNoResults
3892
3903
  }, source.templates.noResults({
3893
3904
  components: components,
3894
- createElement: createElement,
3895
- Fragment: Fragment,
3905
+ createElement: renderer.createElement,
3906
+ Fragment: renderer.Fragment,
3896
3907
  source: source,
3897
- state: state
3898
- })) : createElement("ul", _extends({
3908
+ state: state,
3909
+ html: html
3910
+ })) : renderer.createElement("ul", _extends({
3899
3911
  className: classNames.list
3900
3912
  }, propGetters.getListProps(_objectSpread2({
3901
3913
  state: state,
@@ -3905,7 +3917,7 @@
3905
3917
  item: item,
3906
3918
  source: source
3907
3919
  });
3908
- return createElement("li", _extends({
3920
+ return renderer.createElement("li", _extends({
3909
3921
  key: itemProps.id,
3910
3922
  className: classNames.item
3911
3923
  }, propGetters.getItemProps(_objectSpread2({
@@ -3913,39 +3925,41 @@
3913
3925
  props: itemProps
3914
3926
  }, autocompleteScopeApi))), source.templates.item({
3915
3927
  components: components,
3916
- createElement: createElement,
3917
- Fragment: Fragment,
3928
+ createElement: renderer.createElement,
3929
+ Fragment: renderer.Fragment,
3918
3930
  item: item,
3919
- state: state
3931
+ state: state,
3932
+ html: html
3920
3933
  }));
3921
- })), source.templates.footer && createElement("div", {
3934
+ })), source.templates.footer && renderer.createElement("div", {
3922
3935
  className: classNames.sourceFooter
3923
3936
  }, source.templates.footer({
3924
3937
  components: components,
3925
- createElement: createElement,
3926
- Fragment: Fragment,
3938
+ createElement: renderer.createElement,
3939
+ Fragment: renderer.Fragment,
3927
3940
  items: items,
3928
3941
  source: source,
3929
- state: state
3942
+ state: state,
3943
+ html: html
3930
3944
  })));
3931
3945
  });
3932
- var children = createElement(Fragment, null, createElement("div", {
3946
+ var children = renderer.createElement(renderer.Fragment, null, renderer.createElement("div", {
3933
3947
  className: classNames.panelLayout
3934
- }, sections), createElement("div", {
3948
+ }, sections), renderer.createElement("div", {
3935
3949
  className: "aa-GradientBottom"
3936
3950
  }));
3937
3951
  var elements = sections.reduce(function (acc, current) {
3938
3952
  acc[current.props['data-autocomplete-source-id']] = current;
3939
3953
  return acc;
3940
3954
  }, {});
3941
- render(_objectSpread2({
3955
+ render(_objectSpread2(_objectSpread2({
3942
3956
  children: children,
3943
3957
  state: state,
3944
3958
  sections: sections,
3945
- elements: elements,
3946
- createElement: createElement,
3947
- Fragment: Fragment,
3948
- components: components
3959
+ elements: elements
3960
+ }, renderer), {}, {
3961
+ components: components,
3962
+ html: html
3949
3963
  }, autocompleteScopeApi), dom.panel);
3950
3964
  }
3951
3965
 
@@ -4034,6 +4048,9 @@
4034
4048
  setContext: autocomplete.value.setContext,
4035
4049
  refresh: autocomplete.value.refresh
4036
4050
  };
4051
+ var html = reactive(function () {
4052
+ return htm.bind(props.value.renderer.renderer.createElement);
4053
+ });
4037
4054
  var dom = reactive(function () {
4038
4055
  return createAutocompleteDom({
4039
4056
  autocomplete: autocomplete.value,
@@ -4068,12 +4085,12 @@
4068
4085
  classNames: props.value.renderer.classNames,
4069
4086
  components: props.value.renderer.components,
4070
4087
  container: props.value.renderer.container,
4071
- createElement: props.value.renderer.renderer.createElement,
4088
+ html: html.value,
4072
4089
  dom: dom.value,
4073
- Fragment: props.value.renderer.renderer.Fragment,
4074
4090
  panelContainer: isDetached.value ? dom.value.detachedContainer : props.value.renderer.panelContainer,
4075
4091
  propGetters: propGetters,
4076
- state: lastStateRef.current
4092
+ state: lastStateRef.current,
4093
+ renderer: props.value.renderer.renderer
4077
4094
  };
4078
4095
  var render = !getItemsCount(state) && !hasNoResultsSourceTemplateRef.current && props.value.renderer.renderNoResults || props.value.renderer.render;
4079
4096
  renderSearchBox(renderProps);