@aicontextgateway/search-react 0.0.1

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.
@@ -0,0 +1,2 @@
1
+ .pa-search{width:100%;font-family:var(--pa-search-font,system-ui, -apple-system, Segoe UI, Roboto, sans-serif);color:var(--pa-search-fg,#0f172a);position:relative}.pa-search-input{box-sizing:border-box;width:100%;color:inherit;background:var(--pa-search-input-bg,#fff);border:1px solid var(--pa-search-border,#cbd5e1);border-radius:var(--pa-search-radius,.6rem);outline:none;padding:.6rem .85rem;font-size:.95rem}.pa-search-input:focus{border-color:var(--pa-search-accent,#7c3aed);box-shadow:0 0 0 3px var(--pa-search-accent-soft,#7c3aed2e)}.pa-search-panel{z-index:50;background:var(--pa-search-panel-bg,#fff);border:1px solid var(--pa-search-border,#cbd5e1);border-radius:var(--pa-search-radius,.6rem);max-height:26rem;box-shadow:var(--pa-search-shadow,0 12px 32px #0f172a29);padding:.4rem;position:absolute;top:calc(100% + .35rem);left:0;right:0;overflow-y:auto}.pa-search-facets{flex-wrap:wrap;gap:.35rem;padding:.25rem .35rem .5rem;display:flex}.pa-search-facet{cursor:pointer;color:inherit;background:var(--pa-search-facet-bg,#f1f5f9);border:1px solid #0000;border-radius:999px;padding:.2rem .55rem;font-size:.78rem}.pa-search-facet.is-active{background:var(--pa-search-accent-soft,#7c3aed2e);border-color:var(--pa-search-accent,#7c3aed)}.pa-search-facet-count{opacity:.6}.pa-search-results{margin:0;padding:0;list-style:none}.pa-search-result{cursor:pointer;border-radius:.45rem;flex-direction:column;gap:.15rem;padding:.5rem .6rem;display:flex}.pa-search-result.is-active{background:var(--pa-search-hover-bg,#f1f5f9)}.pa-search-title{font-size:.92rem}.pa-search-subtitle{opacity:.65;font-size:.78rem}.pa-search-mark{background:var(--pa-search-mark-bg,#fde68a);color:inherit;border-radius:.2rem}.pa-search-empty,.pa-search-more{opacity:.7;padding:.55rem .6rem;font-size:.82rem}.pa-search-ai{border-top:1px solid var(--pa-search-border,#cbd5e1);margin-top:.35rem;padding:.5rem .6rem}.pa-search-ai-ask{cursor:pointer;color:var(--pa-search-accent,#7c3aed);background:0 0;border:none;padding:0;font-size:.82rem}.pa-search-ai-ask:disabled{opacity:.6;cursor:default}.pa-search-ai-answer{white-space:pre-wrap;margin-top:.4rem;font-size:.85rem;line-height:1.4}@media (prefers-color-scheme:dark){.pa-search{color:var(--pa-search-fg,#e2e8f0)}.pa-search-input{background:var(--pa-search-input-bg,#0f172a);border-color:var(--pa-search-border,#334155)}.pa-search-panel{background:var(--pa-search-panel-bg,#0f172a);border-color:var(--pa-search-border,#334155)}.pa-search-facet{background:var(--pa-search-facet-bg,#1e293b)}.pa-search-result.is-active{background:var(--pa-search-hover-bg,#1e293b)}.pa-search-mark{background:var(--pa-search-mark-bg,#b45309);color:#fff}}
2
+ /*$vite$:1*/
@@ -0,0 +1,561 @@
1
+ import { useEffect as e, useMemo as t, useRef as n, useState as r } from "react";
2
+ //#region \0rolldown/runtime.js
3
+ var i = (e, t) => () => (t || (e((t = { exports: {} }).exports, t), e = null), t.exports), a = /* @__PURE__ */ ((e) => typeof require < "u" ? require : typeof Proxy < "u" ? new Proxy(e, { get: (e, t) => (typeof require < "u" ? require : e)[t] }) : e)(function(e) {
4
+ if (typeof require < "u") return require.apply(this, arguments);
5
+ throw Error("Calling `require` for \"" + e + "\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.");
6
+ }), o = class extends Error {
7
+ constructor(e, t, n) {
8
+ super(n || t || `Chat request failed (${e})`), this.name = "ChatRequestError", this.status = e, this.code = t || "request_failed";
9
+ }
10
+ };
11
+ async function s({ endpoint: e, message: t, session: n = null, signal: r, onEvent: i }) {
12
+ let a = await fetch(e, {
13
+ method: "POST",
14
+ headers: {
15
+ "Content-Type": "application/json",
16
+ Accept: "text/event-stream"
17
+ },
18
+ body: JSON.stringify({
19
+ message: t,
20
+ session: n,
21
+ stream: !0
22
+ }),
23
+ signal: r
24
+ });
25
+ if (!a.ok) throw await l(a);
26
+ let o = a.body.getReader(), s = new TextDecoder(), u = "";
27
+ for (;;) {
28
+ let { done: e, value: t } = await o.read();
29
+ if (e) break;
30
+ u = (u + s.decode(t, { stream: !0 })).replace(/\r\n/g, "\n");
31
+ let n;
32
+ for (; (n = u.indexOf("\n\n")) !== -1;) {
33
+ let e = u.slice(0, n);
34
+ u = u.slice(n + 2), c(e, i);
35
+ }
36
+ }
37
+ u.trim() !== "" && c(u, i);
38
+ }
39
+ function c(e, t) {
40
+ let n = "message", r = [];
41
+ for (let t of e.split("\n")) t.startsWith("event:") ? n = t.slice(6).trim() : t.startsWith("data:") && r.push(t.slice(5).trim());
42
+ if (r.length === 0) return;
43
+ let i;
44
+ try {
45
+ i = JSON.parse(r.join("\n"));
46
+ } catch {
47
+ return;
48
+ }
49
+ t(n, i);
50
+ }
51
+ async function l(e) {
52
+ let t = null;
53
+ try {
54
+ t = await e.json();
55
+ } catch {}
56
+ return new o(e.status, t?.error?.code ?? null, t?.error?.message ?? t?.message ?? null);
57
+ }
58
+ //#endregion
59
+ //#region src/searchCore.js
60
+ function u(e) {
61
+ return e == null ? [] : String(e).toLowerCase().split(/[^a-z0-9]+/i).filter(Boolean);
62
+ }
63
+ function d(e, t, n) {
64
+ if (e === t) return 0;
65
+ let r = e.length, i = t.length;
66
+ if (Math.abs(r - i) > n) return n + 1;
67
+ let a = null, o = Array(i + 1);
68
+ for (let e = 0; e <= i; e++) o[e] = e;
69
+ for (let s = 1; s <= r; s++) {
70
+ let r = Array(i + 1);
71
+ r[0] = s;
72
+ let c = r[0];
73
+ for (let n = 1; n <= i; n++) {
74
+ let i = e[s - 1] === t[n - 1] ? 0 : 1, l = Math.min(o[n] + 1, r[n - 1] + 1, o[n - 1] + i);
75
+ s > 1 && n > 1 && e[s - 1] === t[n - 2] && e[s - 2] === t[n - 1] && (l = Math.min(l, a[n - 2] + 1)), r[n] = l, l < c && (c = l);
76
+ }
77
+ if (c > n) return n + 1;
78
+ a = o, o = r;
79
+ }
80
+ return o[i];
81
+ }
82
+ function f(e, t) {
83
+ return t === !1 ? 0 : typeof t == "number" ? Math.max(0, t) : e.length >= 8 ? 2 : +(e.length >= 4);
84
+ }
85
+ function p(e) {
86
+ let t = /* @__PURE__ */ new Map();
87
+ if (!e) return t;
88
+ for (let [n, r] of Object.entries(e)) {
89
+ let e = new Set([n.toLowerCase(), ...(r || []).map((e) => String(e).toLowerCase())]);
90
+ for (let n of e) {
91
+ let r = t.get(n) || /* @__PURE__ */ new Set();
92
+ for (let t of e) r.add(t);
93
+ t.set(n, r);
94
+ }
95
+ }
96
+ return t;
97
+ }
98
+ function m(e, t) {
99
+ let n = t.get(e);
100
+ return n ? Array.from(n) : [e];
101
+ }
102
+ function h(e, t) {
103
+ let n = t && t.length ? t : Object.keys(e || {}), r = [];
104
+ for (let t of n) {
105
+ let n = e ? e[t] : void 0;
106
+ if (n != null) if (Array.isArray(n)) for (let e of n) r.push(...u(e).map((e) => ({
107
+ field: t,
108
+ token: e
109
+ })));
110
+ else if (typeof n == "object") continue;
111
+ else r.push(...u(n).map((e) => ({
112
+ field: t,
113
+ token: e
114
+ })));
115
+ }
116
+ return r;
117
+ }
118
+ function g(e, t, n, r) {
119
+ let i = 0;
120
+ for (let a of e) {
121
+ let e = f(a, r);
122
+ for (let { field: r, token: o } of t) {
123
+ let t = n[r] ?? 1, s = 0;
124
+ o === a ? s = 3 : a.length >= 2 && o.startsWith(a) ? s = 2 : e > 0 && d(a, o, e) <= e && (s = 1);
125
+ let c = s * t;
126
+ c > i && (i = c);
127
+ }
128
+ }
129
+ return i;
130
+ }
131
+ function _(e, t, n = {}) {
132
+ let r = Array.isArray(e) ? e : [], { fields: i, fieldWeights: a = {}, synonyms: o, fuzzy: s = !0, facetKeys: c = [], activeFacets: l = {}, limit: d = 20 } = n, f = p(o), _ = u(t), v;
133
+ if (_.length === 0) v = r.map((e, t) => ({
134
+ item: e,
135
+ index: t,
136
+ score: 0,
137
+ matched: []
138
+ }));
139
+ else {
140
+ let e = _.map((e) => m(e, f));
141
+ v = [], r.forEach((t, n) => {
142
+ let r = h(t, i), o = 0, c = [];
143
+ _.forEach((t, n) => {
144
+ let i = g(e[n], r, a, s);
145
+ i > 0 && (o += i, c.push(t));
146
+ }), c.length !== 0 && (o += c.length, c.length === _.length && (o += 5), v.push({
147
+ item: t,
148
+ index: n,
149
+ score: o,
150
+ matched: c
151
+ }));
152
+ });
153
+ }
154
+ let y = {};
155
+ for (let e of c) {
156
+ let t = /* @__PURE__ */ new Map();
157
+ for (let { item: n } of v) {
158
+ let r = n ? n[e] : void 0, i = Array.isArray(r) ? r : r == null ? [] : [r];
159
+ for (let e of i) t.set(e, (t.get(e) || 0) + 1);
160
+ }
161
+ y[e] = Array.from(t, ([e, t]) => ({
162
+ value: e,
163
+ count: t
164
+ })).sort((e, t) => t.count - e.count || String(e.value).localeCompare(String(t.value)));
165
+ }
166
+ let b = v;
167
+ for (let [e, t] of Object.entries(l)) t == null || t === "" || (b = b.filter(({ item: n }) => {
168
+ let r = n ? n[e] : void 0;
169
+ return Array.isArray(r) ? r.includes(t) : r === t;
170
+ }));
171
+ b.sort((e, t) => t.score - e.score || e.index - t.index);
172
+ let x = b.length;
173
+ return {
174
+ results: b.slice(0, d).map(({ item: e, score: t, matched: n }) => ({
175
+ item: e,
176
+ score: t,
177
+ matched: n
178
+ })),
179
+ facets: y,
180
+ total: x
181
+ };
182
+ }
183
+ function v(e, t, n = {}) {
184
+ let r = e == null ? "" : String(e), i = p(n.synonyms), a = /* @__PURE__ */ new Set();
185
+ for (let e of u(t)) for (let t of m(e, i)) a.add(t);
186
+ if (a.size === 0 || r === "") return [{
187
+ text: r,
188
+ match: !1
189
+ }];
190
+ let o = Array.from(a), s = (e) => {
191
+ let t = e.toLowerCase();
192
+ return o.some((e) => {
193
+ let r = f(e, n.fuzzy ?? !0);
194
+ return t === e || e.length >= 2 && t.startsWith(e) || r > 0 && d(e, t, r) <= r;
195
+ });
196
+ }, c = [], l = r.split(/(\s+)/);
197
+ for (let e of l) {
198
+ if (e === "") continue;
199
+ let t = /\s/.test(e) ? !1 : s(e.replace(/[^a-z0-9]/gi, "")), n = c[c.length - 1];
200
+ n && n.match === t ? n.text += e : c.push({
201
+ text: e,
202
+ match: t
203
+ });
204
+ }
205
+ return c;
206
+ }
207
+ //#endregion
208
+ //#region ../../node_modules/react/cjs/react-jsx-runtime.production.js
209
+ var y = /* @__PURE__ */ i(((e) => {
210
+ var t = Symbol.for("react.transitional.element"), n = Symbol.for("react.fragment");
211
+ function r(e, n, r) {
212
+ var i = null;
213
+ if (r !== void 0 && (i = "" + r), n.key !== void 0 && (i = "" + n.key), "key" in n) for (var a in r = {}, n) a !== "key" && (r[a] = n[a]);
214
+ else r = n;
215
+ return n = r.ref, {
216
+ $$typeof: t,
217
+ type: e,
218
+ key: i,
219
+ ref: n === void 0 ? null : n,
220
+ props: r
221
+ };
222
+ }
223
+ e.Fragment = n, e.jsx = r, e.jsxs = r;
224
+ })), b = /* @__PURE__ */ i(((e) => {
225
+ process.env.NODE_ENV !== "production" && (function() {
226
+ function t(e) {
227
+ if (e == null) return null;
228
+ if (typeof e == "function") return e.$$typeof === k ? null : e.displayName || e.name || null;
229
+ if (typeof e == "string") return e;
230
+ switch (e) {
231
+ case v: return "Fragment";
232
+ case b: return "Profiler";
233
+ case y: return "StrictMode";
234
+ case w: return "Suspense";
235
+ case T: return "SuspenseList";
236
+ case O: return "Activity";
237
+ }
238
+ if (typeof e == "object") switch (typeof e.tag == "number" && console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."), e.$$typeof) {
239
+ case _: return "Portal";
240
+ case S: return e.displayName || "Context";
241
+ case x: return (e._context.displayName || "Context") + ".Consumer";
242
+ case C:
243
+ var n = e.render;
244
+ return e = e.displayName, e ||= (e = n.displayName || n.name || "", e === "" ? "ForwardRef" : "ForwardRef(" + e + ")"), e;
245
+ case E: return n = e.displayName || null, n === null ? t(e.type) || "Memo" : n;
246
+ case D:
247
+ n = e._payload, e = e._init;
248
+ try {
249
+ return t(e(n));
250
+ } catch {}
251
+ }
252
+ return null;
253
+ }
254
+ function n(e) {
255
+ return "" + e;
256
+ }
257
+ function r(e) {
258
+ try {
259
+ n(e);
260
+ var t = !1;
261
+ } catch {
262
+ t = !0;
263
+ }
264
+ if (t) {
265
+ t = console;
266
+ var r = t.error, i = typeof Symbol == "function" && Symbol.toStringTag && e[Symbol.toStringTag] || e.constructor.name || "Object";
267
+ return r.call(t, "The provided key is an unsupported type %s. This value must be coerced to a string before using it here.", i), n(e);
268
+ }
269
+ }
270
+ function i(e) {
271
+ if (e === v) return "<>";
272
+ if (typeof e == "object" && e && e.$$typeof === D) return "<...>";
273
+ try {
274
+ var n = t(e);
275
+ return n ? "<" + n + ">" : "<...>";
276
+ } catch {
277
+ return "<...>";
278
+ }
279
+ }
280
+ function o() {
281
+ var e = A.A;
282
+ return e === null ? null : e.getOwner();
283
+ }
284
+ function s() {
285
+ return Error("react-stack-top-frame");
286
+ }
287
+ function c(e) {
288
+ if (j.call(e, "key")) {
289
+ var t = Object.getOwnPropertyDescriptor(e, "key").get;
290
+ if (t && t.isReactWarning) return !1;
291
+ }
292
+ return e.key !== void 0;
293
+ }
294
+ function l(e, t) {
295
+ function n() {
296
+ P || (P = !0, console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)", t));
297
+ }
298
+ n.isReactWarning = !0, Object.defineProperty(e, "key", {
299
+ get: n,
300
+ configurable: !0
301
+ });
302
+ }
303
+ function u() {
304
+ var e = t(this.type);
305
+ return F[e] || (F[e] = !0, console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")), e = this.props.ref, e === void 0 ? null : e;
306
+ }
307
+ function d(e, t, n, r, i, a) {
308
+ var o = n.ref;
309
+ return e = {
310
+ $$typeof: g,
311
+ type: e,
312
+ key: t,
313
+ props: n,
314
+ _owner: r
315
+ }, (o === void 0 ? null : o) === null ? Object.defineProperty(e, "ref", {
316
+ enumerable: !1,
317
+ value: null
318
+ }) : Object.defineProperty(e, "ref", {
319
+ enumerable: !1,
320
+ get: u
321
+ }), e._store = {}, Object.defineProperty(e._store, "validated", {
322
+ configurable: !1,
323
+ enumerable: !1,
324
+ writable: !0,
325
+ value: 0
326
+ }), Object.defineProperty(e, "_debugInfo", {
327
+ configurable: !1,
328
+ enumerable: !1,
329
+ writable: !0,
330
+ value: null
331
+ }), Object.defineProperty(e, "_debugStack", {
332
+ configurable: !1,
333
+ enumerable: !1,
334
+ writable: !0,
335
+ value: i
336
+ }), Object.defineProperty(e, "_debugTask", {
337
+ configurable: !1,
338
+ enumerable: !1,
339
+ writable: !0,
340
+ value: a
341
+ }), Object.freeze && (Object.freeze(e.props), Object.freeze(e)), e;
342
+ }
343
+ function f(e, n, i, a, s, u) {
344
+ var f = n.children;
345
+ if (f !== void 0) if (a) if (M(f)) {
346
+ for (a = 0; a < f.length; a++) p(f[a]);
347
+ Object.freeze && Object.freeze(f);
348
+ } else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");
349
+ else p(f);
350
+ if (j.call(n, "key")) {
351
+ f = t(e);
352
+ var m = Object.keys(n).filter(function(e) {
353
+ return e !== "key";
354
+ });
355
+ a = 0 < m.length ? "{key: someKey, " + m.join(": ..., ") + ": ...}" : "{key: someKey}", R[f + a] || (m = 0 < m.length ? "{" + m.join(": ..., ") + ": ...}" : "{}", console.error("A props object containing a \"key\" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />", a, f, m, f), R[f + a] = !0);
356
+ }
357
+ if (f = null, i !== void 0 && (r(i), f = "" + i), c(n) && (r(n.key), f = "" + n.key), "key" in n) for (var h in i = {}, n) h !== "key" && (i[h] = n[h]);
358
+ else i = n;
359
+ return f && l(i, typeof e == "function" ? e.displayName || e.name || "Unknown" : e), d(e, f, i, o(), s, u);
360
+ }
361
+ function p(e) {
362
+ m(e) ? e._store && (e._store.validated = 1) : typeof e == "object" && e && e.$$typeof === D && (e._payload.status === "fulfilled" ? m(e._payload.value) && e._payload.value._store && (e._payload.value._store.validated = 1) : e._store && (e._store.validated = 1));
363
+ }
364
+ function m(e) {
365
+ return typeof e == "object" && !!e && e.$$typeof === g;
366
+ }
367
+ var h = a("react"), g = Symbol.for("react.transitional.element"), _ = Symbol.for("react.portal"), v = Symbol.for("react.fragment"), y = Symbol.for("react.strict_mode"), b = Symbol.for("react.profiler"), x = Symbol.for("react.consumer"), S = Symbol.for("react.context"), C = Symbol.for("react.forward_ref"), w = Symbol.for("react.suspense"), T = Symbol.for("react.suspense_list"), E = Symbol.for("react.memo"), D = Symbol.for("react.lazy"), O = Symbol.for("react.activity"), k = Symbol.for("react.client.reference"), A = h.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, j = Object.prototype.hasOwnProperty, M = Array.isArray, N = console.createTask ? console.createTask : function() {
368
+ return null;
369
+ };
370
+ h = { react_stack_bottom_frame: function(e) {
371
+ return e();
372
+ } };
373
+ var P, F = {}, I = h.react_stack_bottom_frame.bind(h, s)(), L = N(i(s)), R = {};
374
+ e.Fragment = v, e.jsx = function(e, t, n) {
375
+ var r = 1e4 > A.recentlyCreatedOwnerStacks++;
376
+ return f(e, t, n, !1, r ? Error("react-stack-top-frame") : I, r ? N(i(e)) : L);
377
+ }, e.jsxs = function(e, t, n) {
378
+ var r = 1e4 > A.recentlyCreatedOwnerStacks++;
379
+ return f(e, t, n, !0, r ? Error("react-stack-top-frame") : I, r ? N(i(e)) : L);
380
+ };
381
+ })();
382
+ })), x = (/* @__PURE__ */ i(((e, t) => {
383
+ process.env.NODE_ENV === "production" ? t.exports = y() : t.exports = b();
384
+ })))();
385
+ function S({ items: i = null, fetchUrl: a = null, fields: o = void 0, fieldWeights: c = void 0, synonyms: l = void 0, facets: u = [], fuzzy: d = !0, limit: f = 8, placeholder: p = "Search…", titleField: m = "title", subtitleField: h = null, onSelect: g = null, aiMode: y = !1, token: b = "", baseUrl: S = "" }) {
386
+ let [C, w] = r(null), [T, E] = r(""), [D, O] = r(!1), [k, A] = r(0), [j, M] = r({}), [N, P] = r({
387
+ open: !1,
388
+ streaming: !1,
389
+ answer: "",
390
+ error: null
391
+ }), F = n(null), I = n(null), L = Array.isArray(u) ? u : [], R = i ?? (C || []), z = !!(y && b);
392
+ e(() => {
393
+ if (i != null || !a) return;
394
+ let e = !0;
395
+ return fetch(a, { headers: { Accept: "application/json" } }).then((e) => e.ok ? e.json() : []).then((t) => e && w(Array.isArray(t) ? t : t?.items || [])).catch(() => e && w([])), () => {
396
+ e = !1;
397
+ };
398
+ }, [i, a]), e(() => {
399
+ let e = (e) => {
400
+ I.current && !I.current.contains(e.target) && O(!1);
401
+ };
402
+ return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
403
+ }, []);
404
+ let { results: B, facets: V, total: H } = t(() => _(R, T, {
405
+ fields: o,
406
+ fieldWeights: c,
407
+ synonyms: l,
408
+ fuzzy: d,
409
+ facetKeys: L,
410
+ activeFacets: j,
411
+ limit: f
412
+ }), [
413
+ R,
414
+ T,
415
+ o,
416
+ c,
417
+ l,
418
+ d,
419
+ L.join(","),
420
+ JSON.stringify(j),
421
+ f
422
+ ]);
423
+ e(() => A(0), [T, j]);
424
+ let U = (e) => {
425
+ O(!1), g && g(e);
426
+ }, W = (e, t) => {
427
+ M((n) => n[e] === t ? {
428
+ ...n,
429
+ [e]: void 0
430
+ } : {
431
+ ...n,
432
+ [e]: t
433
+ });
434
+ }, G = (e) => {
435
+ D && (e.key === "ArrowDown" ? (e.preventDefault(), A((e) => Math.min(e + 1, B.length - 1))) : e.key === "ArrowUp" ? (e.preventDefault(), A((e) => Math.max(e - 1, 0))) : e.key === "Enter" ? B[k] && U(B[k].item) : e.key === "Escape" && O(!1));
436
+ }, K = () => {
437
+ if (!z || !T.trim()) return;
438
+ F.current?.abort();
439
+ let e = new AbortController();
440
+ F.current = e, P({
441
+ open: !0,
442
+ streaming: !0,
443
+ answer: "",
444
+ error: null
445
+ }), s({
446
+ endpoint: `${S.replace(/\/$/, "")}/api/chat/${b}`,
447
+ message: T,
448
+ signal: e.signal,
449
+ onEvent: (e, t) => {
450
+ if (e === "delta") {
451
+ let e = t?.delta ?? t?.text ?? t?.content ?? "";
452
+ P((t) => ({
453
+ ...t,
454
+ answer: t.answer + e
455
+ }));
456
+ } else e === "done" ? P((e) => ({
457
+ ...e,
458
+ streaming: !1
459
+ })) : e === "error" && P((e) => ({
460
+ ...e,
461
+ streaming: !1,
462
+ error: t?.message || "Assistant error"
463
+ }));
464
+ }
465
+ }).catch((e) => P((t) => ({
466
+ ...t,
467
+ streaming: !1,
468
+ error: e?.message || "Assistant unavailable"
469
+ })));
470
+ }, q = (e) => v(String(e?.[m] ?? ""), T, {
471
+ synonyms: l,
472
+ fuzzy: d
473
+ }).map((e, t) => e.match ? /* @__PURE__ */ (0, x.jsx)("mark", {
474
+ className: "pa-search-mark",
475
+ children: e.text
476
+ }, t) : /* @__PURE__ */ (0, x.jsx)("span", { children: e.text }, t));
477
+ return /* @__PURE__ */ (0, x.jsxs)("div", {
478
+ className: "pa-search",
479
+ ref: I,
480
+ children: [/* @__PURE__ */ (0, x.jsx)("input", {
481
+ type: "text",
482
+ className: "pa-search-input",
483
+ role: "combobox",
484
+ "aria-expanded": D,
485
+ "aria-autocomplete": "list",
486
+ placeholder: p,
487
+ value: T,
488
+ onChange: (e) => {
489
+ E(e.target.value), O(!0);
490
+ },
491
+ onFocus: () => O(!0),
492
+ onKeyDown: G
493
+ }), D && T.trim() !== "" && /* @__PURE__ */ (0, x.jsxs)("div", {
494
+ className: "pa-search-panel",
495
+ role: "listbox",
496
+ children: [
497
+ L.map((e) => (V[e] || []).length > 0 ? /* @__PURE__ */ (0, x.jsx)("div", {
498
+ className: "pa-search-facets",
499
+ children: V[e].slice(0, 6).map((t) => /* @__PURE__ */ (0, x.jsxs)("button", {
500
+ type: "button",
501
+ className: `pa-search-facet${j[e] === t.value ? " is-active" : ""}`,
502
+ onClick: () => W(e, t.value),
503
+ children: [
504
+ String(t.value),
505
+ " ",
506
+ /* @__PURE__ */ (0, x.jsx)("span", {
507
+ className: "pa-search-facet-count",
508
+ children: t.count
509
+ })
510
+ ]
511
+ }, String(t.value)))
512
+ }, e) : null),
513
+ B.length === 0 ? /* @__PURE__ */ (0, x.jsxs)("div", {
514
+ className: "pa-search-empty",
515
+ children: [
516
+ "No matches for “",
517
+ T,
518
+ "”."
519
+ ]
520
+ }) : /* @__PURE__ */ (0, x.jsx)("ul", {
521
+ className: "pa-search-results",
522
+ children: B.map((e, t) => /* @__PURE__ */ (0, x.jsxs)("li", {
523
+ role: "option",
524
+ "aria-selected": t === k,
525
+ className: `pa-search-result${t === k ? " is-active" : ""}`,
526
+ onMouseEnter: () => A(t),
527
+ onMouseDown: (t) => {
528
+ t.preventDefault(), U(e.item);
529
+ },
530
+ children: [/* @__PURE__ */ (0, x.jsx)("span", {
531
+ className: "pa-search-title",
532
+ children: q(e.item)
533
+ }), h && e.item?.[h] != null && /* @__PURE__ */ (0, x.jsx)("span", {
534
+ className: "pa-search-subtitle",
535
+ children: String(e.item[h])
536
+ })]
537
+ }, e.item?.id ?? t))
538
+ }),
539
+ H > B.length && /* @__PURE__ */ (0, x.jsxs)("div", {
540
+ className: "pa-search-more",
541
+ children: [H - B.length, " more…"]
542
+ }),
543
+ z && /* @__PURE__ */ (0, x.jsxs)("div", {
544
+ className: "pa-search-ai",
545
+ children: [/* @__PURE__ */ (0, x.jsx)("button", {
546
+ type: "button",
547
+ className: "pa-search-ai-ask",
548
+ onClick: K,
549
+ disabled: N.streaming,
550
+ children: N.streaming ? "Asking…" : `Ask AI about “${T}”`
551
+ }), N.open && (N.answer || N.error) && /* @__PURE__ */ (0, x.jsx)("div", {
552
+ className: "pa-search-ai-answer",
553
+ children: N.error ? N.error : N.answer
554
+ })]
555
+ })
556
+ ]
557
+ })]
558
+ });
559
+ }
560
+ //#endregion
561
+ export { S as AiContextGatewaySearch, S as default, p as buildSynonyms, d as editDistance, v as highlightSegments, _ as search, u as tokenize };
@@ -0,0 +1,11 @@
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("react")):typeof define==`function`&&define.amd?define([`exports`,`react`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.AiContextGatewaySearchReact={},e.React))})(this,function(e,t){Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});var n=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),r=class extends Error{constructor(e,t,n){super(n||t||`Chat request failed (${e})`),this.name=`ChatRequestError`,this.status=e,this.code=t||`request_failed`}};async function i({endpoint:e,message:t,session:n=null,signal:r,onEvent:i}){let s=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify({message:t,session:n,stream:!0}),signal:r});if(!s.ok)throw await o(s);let c=s.body.getReader(),l=new TextDecoder,u=``;for(;;){let{done:e,value:t}=await c.read();if(e)break;u=(u+l.decode(t,{stream:!0})).replace(/\r\n/g,`
2
+ `);let n;for(;(n=u.indexOf(`
3
+
4
+ `))!==-1;){let e=u.slice(0,n);u=u.slice(n+2),a(e,i)}}u.trim()!==``&&a(u,i)}function a(e,t){let n=`message`,r=[];for(let t of e.split(`
5
+ `))t.startsWith(`event:`)?n=t.slice(6).trim():t.startsWith(`data:`)&&r.push(t.slice(5).trim());if(r.length===0)return;let i;try{i=JSON.parse(r.join(`
6
+ `))}catch{return}t(n,i)}async function o(e){let t=null;try{t=await e.json()}catch{}return new r(e.status,t?.error?.code??null,t?.error?.message??t?.message??null)}function s(e){return e==null?[]:String(e).toLowerCase().split(/[^a-z0-9]+/i).filter(Boolean)}function c(e,t,n){if(e===t)return 0;let r=e.length,i=t.length;if(Math.abs(r-i)>n)return n+1;let a=null,o=Array(i+1);for(let e=0;e<=i;e++)o[e]=e;for(let s=1;s<=r;s++){let r=Array(i+1);r[0]=s;let c=r[0];for(let n=1;n<=i;n++){let i=e[s-1]===t[n-1]?0:1,l=Math.min(o[n]+1,r[n-1]+1,o[n-1]+i);s>1&&n>1&&e[s-1]===t[n-2]&&e[s-2]===t[n-1]&&(l=Math.min(l,a[n-2]+1)),r[n]=l,l<c&&(c=l)}if(c>n)return n+1;a=o,o=r}return o[i]}function l(e,t){return t===!1?0:typeof t==`number`?Math.max(0,t):e.length>=8?2:+(e.length>=4)}function u(e){let t=new Map;if(!e)return t;for(let[n,r]of Object.entries(e)){let e=new Set([n.toLowerCase(),...(r||[]).map(e=>String(e).toLowerCase())]);for(let n of e){let r=t.get(n)||new Set;for(let t of e)r.add(t);t.set(n,r)}}return t}function d(e,t){let n=t.get(e);return n?Array.from(n):[e]}function f(e,t){let n=t&&t.length?t:Object.keys(e||{}),r=[];for(let t of n){let n=e?e[t]:void 0;if(n!=null)if(Array.isArray(n))for(let e of n)r.push(...s(e).map(e=>({field:t,token:e})));else if(typeof n==`object`)continue;else r.push(...s(n).map(e=>({field:t,token:e})))}return r}function p(e,t,n,r){let i=0;for(let a of e){let e=l(a,r);for(let{field:r,token:o}of t){let t=n[r]??1,s=0;o===a?s=3:a.length>=2&&o.startsWith(a)?s=2:e>0&&c(a,o,e)<=e&&(s=1);let l=s*t;l>i&&(i=l)}}return i}function m(e,t,n={}){let r=Array.isArray(e)?e:[],{fields:i,fieldWeights:a={},synonyms:o,fuzzy:c=!0,facetKeys:l=[],activeFacets:m={},limit:h=20}=n,g=u(o),_=s(t),v;if(_.length===0)v=r.map((e,t)=>({item:e,index:t,score:0,matched:[]}));else{let e=_.map(e=>d(e,g));v=[],r.forEach((t,n)=>{let r=f(t,i),o=0,s=[];_.forEach((t,n)=>{let i=p(e[n],r,a,c);i>0&&(o+=i,s.push(t))}),s.length!==0&&(o+=s.length,s.length===_.length&&(o+=5),v.push({item:t,index:n,score:o,matched:s}))})}let y={};for(let e of l){let t=new Map;for(let{item:n}of v){let r=n?n[e]:void 0,i=Array.isArray(r)?r:r==null?[]:[r];for(let e of i)t.set(e,(t.get(e)||0)+1)}y[e]=Array.from(t,([e,t])=>({value:e,count:t})).sort((e,t)=>t.count-e.count||String(e.value).localeCompare(String(t.value)))}let b=v;for(let[e,t]of Object.entries(m))t==null||t===``||(b=b.filter(({item:n})=>{let r=n?n[e]:void 0;return Array.isArray(r)?r.includes(t):r===t}));b.sort((e,t)=>t.score-e.score||e.index-t.index);let x=b.length;return{results:b.slice(0,h).map(({item:e,score:t,matched:n})=>({item:e,score:t,matched:n})),facets:y,total:x}}function h(e,t,n={}){let r=e==null?``:String(e),i=u(n.synonyms),a=new Set;for(let e of s(t))for(let t of d(e,i))a.add(t);if(a.size===0||r===``)return[{text:r,match:!1}];let o=Array.from(a),f=e=>{let t=e.toLowerCase();return o.some(e=>{let r=l(e,n.fuzzy??!0);return t===e||e.length>=2&&t.startsWith(e)||r>0&&c(e,t,r)<=r})},p=[],m=r.split(/(\s+)/);for(let e of m){if(e===``)continue;let t=/\s/.test(e)?!1:f(e.replace(/[^a-z0-9]/gi,``)),n=p[p.length-1];n&&n.match===t?n.text+=e:p.push({text:e,match:t})}return p}var g=n((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),_=n((e=>{process.env.NODE_ENV!==`production`&&(function(){function t(e){if(e==null)return null;if(typeof e==`function`)return e.$$typeof===O?null:e.displayName||e.name||null;if(typeof e==`string`)return e;switch(e){case _:return`Fragment`;case y:return`Profiler`;case v:return`StrictMode`;case C:return`Suspense`;case w:return`SuspenseList`;case D:return`Activity`}if(typeof e==`object`)switch(typeof e.tag==`number`&&console.error(`Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.`),e.$$typeof){case g:return`Portal`;case x:return e.displayName||`Context`;case b:return(e._context.displayName||`Context`)+`.Consumer`;case S:var n=e.render;return e=e.displayName,e||=(e=n.displayName||n.name||``,e===``?`ForwardRef`:`ForwardRef(`+e+`)`),e;case T:return n=e.displayName||null,n===null?t(e.type)||`Memo`:n;case E:n=e._payload,e=e._init;try{return t(e(n))}catch{}}return null}function n(e){return``+e}function r(e){try{n(e);var t=!1}catch{t=!0}if(t){t=console;var r=t.error,i=typeof Symbol==`function`&&Symbol.toStringTag&&e[Symbol.toStringTag]||e.constructor.name||`Object`;return r.call(t,`The provided key is an unsupported type %s. This value must be coerced to a string before using it here.`,i),n(e)}}function i(e){if(e===_)return`<>`;if(typeof e==`object`&&e&&e.$$typeof===E)return`<...>`;try{var n=t(e);return n?`<`+n+`>`:`<...>`}catch{return`<...>`}}function a(){var e=k.A;return e===null?null:e.getOwner()}function o(){return Error(`react-stack-top-frame`)}function s(e){if(A.call(e,`key`)){var t=Object.getOwnPropertyDescriptor(e,`key`).get;if(t&&t.isReactWarning)return!1}return e.key!==void 0}function c(e,t){function n(){N||(N=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",t))}n.isReactWarning=!0,Object.defineProperty(e,"key",{get:n,configurable:!0})}function l(){var e=t(this.type);return P[e]||(P[e]=!0,console.error(`Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.`)),e=this.props.ref,e===void 0?null:e}function u(e,t,n,r,i,a){var o=n.ref;return e={$$typeof:h,type:e,key:t,props:n,_owner:r},(o===void 0?null:o)===null?Object.defineProperty(e,"ref",{enumerable:!1,value:null}):Object.defineProperty(e,"ref",{enumerable:!1,get:l}),e._store={},Object.defineProperty(e._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(e,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(e,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:i}),Object.defineProperty(e,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:a}),Object.freeze&&(Object.freeze(e.props),Object.freeze(e)),e}function d(e,n,i,o,l,d){var p=n.children;if(p!==void 0)if(o)if(j(p)){for(o=0;o<p.length;o++)f(p[o]);Object.freeze&&Object.freeze(p)}else console.error(`React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.`);else f(p);if(A.call(n,`key`)){p=t(e);var m=Object.keys(n).filter(function(e){return e!==`key`});o=0<m.length?`{key: someKey, `+m.join(`: ..., `)+`: ...}`:`{key: someKey}`,L[p+o]||(m=0<m.length?`{`+m.join(`: ..., `)+`: ...}`:`{}`,console.error(`A props object containing a "key" prop is being spread into JSX:
7
+ let props = %s;
8
+ <%s {...props} />
9
+ React keys must be passed directly to JSX without using spread:
10
+ let props = %s;
11
+ <%s key={someKey} {...props} />`,o,p,m,p),L[p+o]=!0)}if(p=null,i!==void 0&&(r(i),p=``+i),s(n)&&(r(n.key),p=``+n.key),`key`in n)for(var h in i={},n)h!==`key`&&(i[h]=n[h]);else i=n;return p&&c(i,typeof e==`function`?e.displayName||e.name||`Unknown`:e),u(e,p,i,a(),l,d)}function f(e){p(e)?e._store&&(e._store.validated=1):typeof e==`object`&&e&&e.$$typeof===E&&(e._payload.status===`fulfilled`?p(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function p(e){return typeof e==`object`&&!!e&&e.$$typeof===h}var m=require("react"),h=Symbol.for(`react.transitional.element`),g=Symbol.for(`react.portal`),_=Symbol.for(`react.fragment`),v=Symbol.for(`react.strict_mode`),y=Symbol.for(`react.profiler`),b=Symbol.for(`react.consumer`),x=Symbol.for(`react.context`),S=Symbol.for(`react.forward_ref`),C=Symbol.for(`react.suspense`),w=Symbol.for(`react.suspense_list`),T=Symbol.for(`react.memo`),E=Symbol.for(`react.lazy`),D=Symbol.for(`react.activity`),O=Symbol.for(`react.client.reference`),k=m.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,A=Object.prototype.hasOwnProperty,j=Array.isArray,M=console.createTask?console.createTask:function(){return null};m={react_stack_bottom_frame:function(e){return e()}};var N,P={},F=m.react_stack_bottom_frame.bind(m,o)(),I=M(i(o)),L={};e.Fragment=_,e.jsx=function(e,t,n){var r=1e4>k.recentlyCreatedOwnerStacks++;return d(e,t,n,!1,r?Error(`react-stack-top-frame`):F,r?M(i(e)):I)},e.jsxs=function(e,t,n){var r=1e4>k.recentlyCreatedOwnerStacks++;return d(e,t,n,!0,r?Error(`react-stack-top-frame`):F,r?M(i(e)):I)}})()})),v=n(((e,t)=>{process.env.NODE_ENV===`production`?t.exports=g():t.exports=_()}))();function y({items:e=null,fetchUrl:n=null,fields:r=void 0,fieldWeights:a=void 0,synonyms:o=void 0,facets:s=[],fuzzy:c=!0,limit:l=8,placeholder:u=`Search…`,titleField:d=`title`,subtitleField:f=null,onSelect:p=null,aiMode:g=!1,token:_=``,baseUrl:y=``}){let[b,x]=(0,t.useState)(null),[S,C]=(0,t.useState)(``),[w,T]=(0,t.useState)(!1),[E,D]=(0,t.useState)(0),[O,k]=(0,t.useState)({}),[A,j]=(0,t.useState)({open:!1,streaming:!1,answer:``,error:null}),M=(0,t.useRef)(null),N=(0,t.useRef)(null),P=Array.isArray(s)?s:[],F=e??(b||[]),I=!!(g&&_);(0,t.useEffect)(()=>{if(e!=null||!n)return;let t=!0;return fetch(n,{headers:{Accept:`application/json`}}).then(e=>e.ok?e.json():[]).then(e=>t&&x(Array.isArray(e)?e:e?.items||[])).catch(()=>t&&x([])),()=>{t=!1}},[e,n]),(0,t.useEffect)(()=>{let e=e=>{N.current&&!N.current.contains(e.target)&&T(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[]);let{results:L,facets:R,total:z}=(0,t.useMemo)(()=>m(F,S,{fields:r,fieldWeights:a,synonyms:o,fuzzy:c,facetKeys:P,activeFacets:O,limit:l}),[F,S,r,a,o,c,P.join(`,`),JSON.stringify(O),l]);(0,t.useEffect)(()=>D(0),[S,O]);let B=e=>{T(!1),p&&p(e)},V=(e,t)=>{k(n=>n[e]===t?{...n,[e]:void 0}:{...n,[e]:t})},H=e=>{w&&(e.key===`ArrowDown`?(e.preventDefault(),D(e=>Math.min(e+1,L.length-1))):e.key===`ArrowUp`?(e.preventDefault(),D(e=>Math.max(e-1,0))):e.key===`Enter`?L[E]&&B(L[E].item):e.key===`Escape`&&T(!1))},U=()=>{if(!I||!S.trim())return;M.current?.abort();let e=new AbortController;M.current=e,j({open:!0,streaming:!0,answer:``,error:null}),i({endpoint:`${y.replace(/\/$/,``)}/api/chat/${_}`,message:S,signal:e.signal,onEvent:(e,t)=>{if(e===`delta`){let e=t?.delta??t?.text??t?.content??``;j(t=>({...t,answer:t.answer+e}))}else e===`done`?j(e=>({...e,streaming:!1})):e===`error`&&j(e=>({...e,streaming:!1,error:t?.message||`Assistant error`}))}}).catch(e=>j(t=>({...t,streaming:!1,error:e?.message||`Assistant unavailable`})))},W=e=>h(String(e?.[d]??``),S,{synonyms:o,fuzzy:c}).map((e,t)=>e.match?(0,v.jsx)(`mark`,{className:`pa-search-mark`,children:e.text},t):(0,v.jsx)(`span`,{children:e.text},t));return(0,v.jsxs)(`div`,{className:`pa-search`,ref:N,children:[(0,v.jsx)(`input`,{type:`text`,className:`pa-search-input`,role:`combobox`,"aria-expanded":w,"aria-autocomplete":`list`,placeholder:u,value:S,onChange:e=>{C(e.target.value),T(!0)},onFocus:()=>T(!0),onKeyDown:H}),w&&S.trim()!==``&&(0,v.jsxs)(`div`,{className:`pa-search-panel`,role:`listbox`,children:[P.map(e=>(R[e]||[]).length>0?(0,v.jsx)(`div`,{className:`pa-search-facets`,children:R[e].slice(0,6).map(t=>(0,v.jsxs)(`button`,{type:`button`,className:`pa-search-facet${O[e]===t.value?` is-active`:``}`,onClick:()=>V(e,t.value),children:[String(t.value),` `,(0,v.jsx)(`span`,{className:`pa-search-facet-count`,children:t.count})]},String(t.value)))},e):null),L.length===0?(0,v.jsxs)(`div`,{className:`pa-search-empty`,children:[`No matches for “`,S,`”.`]}):(0,v.jsx)(`ul`,{className:`pa-search-results`,children:L.map((e,t)=>(0,v.jsxs)(`li`,{role:`option`,"aria-selected":t===E,className:`pa-search-result${t===E?` is-active`:``}`,onMouseEnter:()=>D(t),onMouseDown:t=>{t.preventDefault(),B(e.item)},children:[(0,v.jsx)(`span`,{className:`pa-search-title`,children:W(e.item)}),f&&e.item?.[f]!=null&&(0,v.jsx)(`span`,{className:`pa-search-subtitle`,children:String(e.item[f])})]},e.item?.id??t))}),z>L.length&&(0,v.jsxs)(`div`,{className:`pa-search-more`,children:[z-L.length,` more…`]}),I&&(0,v.jsxs)(`div`,{className:`pa-search-ai`,children:[(0,v.jsx)(`button`,{type:`button`,className:`pa-search-ai-ask`,onClick:U,disabled:A.streaming,children:A.streaming?`Asking…`:`Ask AI about “${S}”`}),A.open&&(A.answer||A.error)&&(0,v.jsx)(`div`,{className:`pa-search-ai-answer`,children:A.error?A.error:A.answer})]})]})]})}e.AiContextGatewaySearch=y,e.default=y,e.buildSynonyms=u,e.editDistance=c,e.highlightSegments=h,e.search=m,e.tokenize=s});
@@ -0,0 +1,58 @@
1
+ /**
2
+ * One-line AiContextGateway smart-search loader.
3
+ *
4
+ * <script src="https://YOUR-CDN/loader.js" data-fetch-url="/api/catalog.json"
5
+ * data-placeholder="Search…" data-facets="category,brand" defer></script>
6
+ *
7
+ * Loads aicontextgateway-search.iife.js from the same directory and drops a
8
+ * configured <aicontextgateway-search> element where the script tag sits. Hosts
9
+ * that only want the element registered can omit data-fetch-url and place the
10
+ * <aicontextgateway-search> markup themselves.
11
+ */
12
+ (function () {
13
+ var current = document.currentScript;
14
+
15
+ if (!current) {
16
+ return;
17
+ }
18
+
19
+ var base = current.src.replace(/[^/]*$/, '');
20
+ var bundle = document.createElement('script');
21
+ bundle.src = base + 'aicontextgateway-search.iife.js';
22
+ bundle.defer = true;
23
+
24
+ var attrMap = {
25
+ 'data-fetch-url': 'fetch-url',
26
+ 'data-placeholder': 'placeholder',
27
+ 'data-facets': 'facets',
28
+ 'data-title-field': 'title-field',
29
+ 'data-subtitle-field': 'subtitle-field',
30
+ 'data-token': 'token',
31
+ 'data-base-url': 'base-url',
32
+ };
33
+
34
+ var hasConfig = Object.keys(attrMap).some(function (k) {
35
+ return current.getAttribute(k) != null;
36
+ });
37
+
38
+ if (hasConfig || current.hasAttribute('data-ai-mode')) {
39
+ bundle.addEventListener('load', function () {
40
+ var el = document.createElement('aicontextgateway-search');
41
+
42
+ Object.keys(attrMap).forEach(function (dataKey) {
43
+ var value = current.getAttribute(dataKey);
44
+ if (value != null) {
45
+ el.setAttribute(attrMap[dataKey], value);
46
+ }
47
+ });
48
+
49
+ if (current.hasAttribute('data-ai-mode')) {
50
+ el.setAttribute('ai-mode', '');
51
+ }
52
+
53
+ current.parentNode.insertBefore(el, current.nextSibling);
54
+ });
55
+ }
56
+
57
+ document.head.appendChild(bundle);
58
+ })();