@samline/autocomplete 1.0.0 → 2.0.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 (46) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/LICENSE.md +1 -1
  3. package/README.md +208 -32
  4. package/dist/browser/global.global.js +505 -274
  5. package/dist/browser/global.global.js.map +1 -1
  6. package/dist/browser/index.cjs +663 -0
  7. package/dist/browser/index.cjs.map +1 -0
  8. package/dist/browser/index.d.cts +31 -0
  9. package/dist/browser/index.d.ts +31 -0
  10. package/dist/browser/index.js +24 -0
  11. package/dist/browser/index.js.map +1 -0
  12. package/dist/chunk-4IPBCQDZ.js +218 -0
  13. package/dist/chunk-4IPBCQDZ.js.map +1 -0
  14. package/dist/chunk-5UZVFHB4.js +70 -0
  15. package/dist/chunk-5UZVFHB4.js.map +1 -0
  16. package/dist/chunk-AD7T42HJ.js +1 -0
  17. package/dist/chunk-AD7T42HJ.js.map +1 -0
  18. package/dist/chunk-PPDQPLPE.js +1 -0
  19. package/dist/chunk-PPDQPLPE.js.map +1 -0
  20. package/dist/chunk-U5JYDGKW.js +403 -0
  21. package/dist/chunk-U5JYDGKW.js.map +1 -0
  22. package/dist/core/index.cjs +181 -0
  23. package/dist/core/index.cjs.map +1 -0
  24. package/dist/core/index.d.cts +31 -0
  25. package/dist/core/index.d.ts +31 -0
  26. package/dist/core/index.js +22 -0
  27. package/dist/core/index.js.map +1 -0
  28. package/dist/index.cjs +527 -274
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.d.cts +20 -69
  31. package/dist/index.d.ts +20 -69
  32. package/dist/index.js +54 -405
  33. package/dist/index.js.map +1 -1
  34. package/dist/render-B38UXYCT.d.ts +7 -0
  35. package/dist/render-WD69VMUs.d.cts +7 -0
  36. package/dist/styles.css +19 -9
  37. package/dist/types-CPvjhqjb.d.cts +118 -0
  38. package/dist/types-CPvjhqjb.d.ts +118 -0
  39. package/dist/vanilla/index.cjs +598 -0
  40. package/dist/vanilla/index.cjs.map +1 -0
  41. package/dist/vanilla/index.d.cts +11 -0
  42. package/dist/vanilla/index.d.ts +11 -0
  43. package/dist/vanilla/index.js +13 -0
  44. package/dist/vanilla/index.js.map +1 -0
  45. package/package.json +19 -4
  46. package/dist/browser/global.d.ts +0 -61
@@ -0,0 +1,118 @@
1
+ type AutocompleteTarget = string | HTMLInputElement;
2
+ type AutocompleteEndpoint = string | URL | ((query: string, input: HTMLInputElement) => string | URL);
3
+ type AutocompleteRequestInit = RequestInit | ((query: string, input: HTMLInputElement) => RequestInit);
4
+ type AutocompleteParser = (response: Response, query: string) => Promise<unknown>;
5
+ type AutocompleteResponseMapper<T> = (payload: unknown, response: Response, query: string) => readonly T[] | Promise<readonly T[]>;
6
+ interface AutocompleteSourceContext {
7
+ /** Aborted when a newer search starts, the list is dismissed or the instance is destroyed. */
8
+ readonly signal: AbortSignal;
9
+ readonly input: HTMLInputElement;
10
+ }
11
+ type AutocompleteSourceFunction<T> = (query: string, context: AutocompleteSourceContext) => readonly T[] | Promise<readonly T[]>;
12
+ /** Static suggestions filtered in the browser, or a function that resolves them. */
13
+ type AutocompleteSource<T> = readonly T[] | AutocompleteSourceFunction<T>;
14
+ interface AutocompleteEndpointOptions<T> {
15
+ endpoint: AutocompleteEndpoint;
16
+ /** Query string parameter; `null` leaves the URL untouched. Defaults to `q`. */
17
+ queryParam?: string | null;
18
+ requestInit?: AutocompleteRequestInit;
19
+ parseResponse?: AutocompleteParser;
20
+ mapResponse?: AutocompleteResponseMapper<T>;
21
+ }
22
+ interface AutocompleteCacheOptions {
23
+ /** Cached queries kept; the least recently used is evicted. Defaults to 50. */
24
+ max?: number;
25
+ /** Milliseconds a cached query stays fresh. Defaults to 300000. */
26
+ ttl?: number;
27
+ }
28
+ interface AutocompleteMessageContext {
29
+ query: string;
30
+ count: number;
31
+ }
32
+ type AutocompleteMessage = string | ((context: AutocompleteMessageContext) => string);
33
+ interface AutocompleteMessages {
34
+ loading: AutocompleteMessage;
35
+ empty: AutocompleteMessage;
36
+ error: AutocompleteMessage;
37
+ /** Announced to screen readers when suggestions load. */
38
+ results: AutocompleteMessage;
39
+ }
40
+ interface AutocompleteHighlightPart {
41
+ text: string;
42
+ match: boolean;
43
+ }
44
+ interface AutocompleteRenderContext {
45
+ query: string;
46
+ index: number;
47
+ label: string;
48
+ /** The label split into matching and non-matching parts. */
49
+ highlight: readonly AutocompleteHighlightPart[];
50
+ }
51
+ interface AutocompleteOptions<T = unknown> {
52
+ /** Suggestions as an array or a function. Use either `source` or `endpoint`. */
53
+ source?: AutocompleteSource<T>;
54
+ endpoint?: AutocompleteEndpoint;
55
+ queryParam?: string | null;
56
+ requestInit?: AutocompleteRequestInit;
57
+ parseResponse?: AutocompleteParser;
58
+ mapResponse?: AutocompleteResponseMapper<T>;
59
+ /** Local filter for array sources. Defaults to an accent- and case-insensitive label match. */
60
+ filter?: (suggestion: T, query: string) => boolean;
61
+ /** Text normalization used by the default filter and highlighting. */
62
+ normalize?: (value: string) => string;
63
+ /** Remember results per query. Defaults to `true` for function and endpoint sources. */
64
+ cache?: boolean | AutocompleteCacheOptions;
65
+ /** Wrap the matching parts of each label in `<mark>`. Defaults to `true`. */
66
+ highlight?: boolean;
67
+ getId?: (suggestion: T, index: number) => string | number;
68
+ getLabel?: (suggestion: T) => string;
69
+ getValue?: (suggestion: T) => string;
70
+ renderOption?: (element: HTMLElement, suggestion: T, context: AutocompleteRenderContext) => void;
71
+ minLength?: number;
72
+ debounce?: number;
73
+ maxResults?: number;
74
+ searchOnFocus?: boolean;
75
+ messages?: Partial<AutocompleteMessages>;
76
+ onSelect?: (suggestion: T, input: HTMLInputElement) => void;
77
+ onError?: (error: unknown, input: HTMLInputElement) => void;
78
+ }
79
+ interface AutocompleteController<T = unknown> {
80
+ readonly element: HTMLInputElement;
81
+ /** Positioned container holding the listbox and the visible status. */
82
+ readonly popupElement: HTMLDivElement;
83
+ readonly listElement: HTMLDivElement;
84
+ readonly statusElement: HTMLDivElement;
85
+ /** Visually hidden polite live region. */
86
+ readonly liveElement: HTMLDivElement;
87
+ readonly options: Readonly<AutocompleteOptions<T>>;
88
+ search: (query?: string) => Promise<void>;
89
+ close: () => void;
90
+ clear: () => void;
91
+ cancel: () => void;
92
+ clearCache: () => void;
93
+ getSelected: () => T | null;
94
+ destroy: () => void;
95
+ }
96
+ interface AutocompleteSelectDetail<T = unknown> {
97
+ suggestion: T;
98
+ label: string;
99
+ value: string;
100
+ }
101
+ interface AutocompleteLoadDetail<T = unknown> {
102
+ query: string;
103
+ suggestions: readonly T[];
104
+ /** True when the results came from the cache without calling the source. */
105
+ cached: boolean;
106
+ }
107
+ interface AutocompleteErrorDetail {
108
+ query: string;
109
+ error: unknown;
110
+ }
111
+ interface AutocompleteCache<T> {
112
+ get: (key: string) => readonly T[] | undefined;
113
+ set: (key: string, value: readonly T[]) => void;
114
+ clear: () => void;
115
+ readonly size: number;
116
+ }
117
+
118
+ export type { AutocompleteCache as A, AutocompleteCacheOptions as a, AutocompleteController as b, AutocompleteEndpoint as c, AutocompleteEndpointOptions as d, AutocompleteErrorDetail as e, AutocompleteHighlightPart as f, AutocompleteLoadDetail as g, AutocompleteMessage as h, AutocompleteMessageContext as i, AutocompleteMessages as j, AutocompleteOptions as k, AutocompleteParser as l, AutocompleteRenderContext as m, AutocompleteRequestInit as n, AutocompleteResponseMapper as o, AutocompleteSelectDetail as p, AutocompleteSource as q, AutocompleteSourceContext as r, AutocompleteSourceFunction as s, AutocompleteTarget as t };
@@ -0,0 +1,118 @@
1
+ type AutocompleteTarget = string | HTMLInputElement;
2
+ type AutocompleteEndpoint = string | URL | ((query: string, input: HTMLInputElement) => string | URL);
3
+ type AutocompleteRequestInit = RequestInit | ((query: string, input: HTMLInputElement) => RequestInit);
4
+ type AutocompleteParser = (response: Response, query: string) => Promise<unknown>;
5
+ type AutocompleteResponseMapper<T> = (payload: unknown, response: Response, query: string) => readonly T[] | Promise<readonly T[]>;
6
+ interface AutocompleteSourceContext {
7
+ /** Aborted when a newer search starts, the list is dismissed or the instance is destroyed. */
8
+ readonly signal: AbortSignal;
9
+ readonly input: HTMLInputElement;
10
+ }
11
+ type AutocompleteSourceFunction<T> = (query: string, context: AutocompleteSourceContext) => readonly T[] | Promise<readonly T[]>;
12
+ /** Static suggestions filtered in the browser, or a function that resolves them. */
13
+ type AutocompleteSource<T> = readonly T[] | AutocompleteSourceFunction<T>;
14
+ interface AutocompleteEndpointOptions<T> {
15
+ endpoint: AutocompleteEndpoint;
16
+ /** Query string parameter; `null` leaves the URL untouched. Defaults to `q`. */
17
+ queryParam?: string | null;
18
+ requestInit?: AutocompleteRequestInit;
19
+ parseResponse?: AutocompleteParser;
20
+ mapResponse?: AutocompleteResponseMapper<T>;
21
+ }
22
+ interface AutocompleteCacheOptions {
23
+ /** Cached queries kept; the least recently used is evicted. Defaults to 50. */
24
+ max?: number;
25
+ /** Milliseconds a cached query stays fresh. Defaults to 300000. */
26
+ ttl?: number;
27
+ }
28
+ interface AutocompleteMessageContext {
29
+ query: string;
30
+ count: number;
31
+ }
32
+ type AutocompleteMessage = string | ((context: AutocompleteMessageContext) => string);
33
+ interface AutocompleteMessages {
34
+ loading: AutocompleteMessage;
35
+ empty: AutocompleteMessage;
36
+ error: AutocompleteMessage;
37
+ /** Announced to screen readers when suggestions load. */
38
+ results: AutocompleteMessage;
39
+ }
40
+ interface AutocompleteHighlightPart {
41
+ text: string;
42
+ match: boolean;
43
+ }
44
+ interface AutocompleteRenderContext {
45
+ query: string;
46
+ index: number;
47
+ label: string;
48
+ /** The label split into matching and non-matching parts. */
49
+ highlight: readonly AutocompleteHighlightPart[];
50
+ }
51
+ interface AutocompleteOptions<T = unknown> {
52
+ /** Suggestions as an array or a function. Use either `source` or `endpoint`. */
53
+ source?: AutocompleteSource<T>;
54
+ endpoint?: AutocompleteEndpoint;
55
+ queryParam?: string | null;
56
+ requestInit?: AutocompleteRequestInit;
57
+ parseResponse?: AutocompleteParser;
58
+ mapResponse?: AutocompleteResponseMapper<T>;
59
+ /** Local filter for array sources. Defaults to an accent- and case-insensitive label match. */
60
+ filter?: (suggestion: T, query: string) => boolean;
61
+ /** Text normalization used by the default filter and highlighting. */
62
+ normalize?: (value: string) => string;
63
+ /** Remember results per query. Defaults to `true` for function and endpoint sources. */
64
+ cache?: boolean | AutocompleteCacheOptions;
65
+ /** Wrap the matching parts of each label in `<mark>`. Defaults to `true`. */
66
+ highlight?: boolean;
67
+ getId?: (suggestion: T, index: number) => string | number;
68
+ getLabel?: (suggestion: T) => string;
69
+ getValue?: (suggestion: T) => string;
70
+ renderOption?: (element: HTMLElement, suggestion: T, context: AutocompleteRenderContext) => void;
71
+ minLength?: number;
72
+ debounce?: number;
73
+ maxResults?: number;
74
+ searchOnFocus?: boolean;
75
+ messages?: Partial<AutocompleteMessages>;
76
+ onSelect?: (suggestion: T, input: HTMLInputElement) => void;
77
+ onError?: (error: unknown, input: HTMLInputElement) => void;
78
+ }
79
+ interface AutocompleteController<T = unknown> {
80
+ readonly element: HTMLInputElement;
81
+ /** Positioned container holding the listbox and the visible status. */
82
+ readonly popupElement: HTMLDivElement;
83
+ readonly listElement: HTMLDivElement;
84
+ readonly statusElement: HTMLDivElement;
85
+ /** Visually hidden polite live region. */
86
+ readonly liveElement: HTMLDivElement;
87
+ readonly options: Readonly<AutocompleteOptions<T>>;
88
+ search: (query?: string) => Promise<void>;
89
+ close: () => void;
90
+ clear: () => void;
91
+ cancel: () => void;
92
+ clearCache: () => void;
93
+ getSelected: () => T | null;
94
+ destroy: () => void;
95
+ }
96
+ interface AutocompleteSelectDetail<T = unknown> {
97
+ suggestion: T;
98
+ label: string;
99
+ value: string;
100
+ }
101
+ interface AutocompleteLoadDetail<T = unknown> {
102
+ query: string;
103
+ suggestions: readonly T[];
104
+ /** True when the results came from the cache without calling the source. */
105
+ cached: boolean;
106
+ }
107
+ interface AutocompleteErrorDetail {
108
+ query: string;
109
+ error: unknown;
110
+ }
111
+ interface AutocompleteCache<T> {
112
+ get: (key: string) => readonly T[] | undefined;
113
+ set: (key: string, value: readonly T[]) => void;
114
+ clear: () => void;
115
+ readonly size: number;
116
+ }
117
+
118
+ export type { AutocompleteCache as A, AutocompleteCacheOptions as a, AutocompleteController as b, AutocompleteEndpoint as c, AutocompleteEndpointOptions as d, AutocompleteErrorDetail as e, AutocompleteHighlightPart as f, AutocompleteLoadDetail as g, AutocompleteMessage as h, AutocompleteMessageContext as i, AutocompleteMessages as j, AutocompleteOptions as k, AutocompleteParser as l, AutocompleteRenderContext as m, AutocompleteRequestInit as n, AutocompleteResponseMapper as o, AutocompleteSelectDetail as p, AutocompleteSource as q, AutocompleteSourceContext as r, AutocompleteSourceFunction as s, AutocompleteTarget as t };