@indxsearch/intrface 3.0.0-alpha.20260617 → 3.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.
package/CHANGELOG.md CHANGED
@@ -5,16 +5,40 @@ All notable changes to `@indxsearch/intrface` will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [3.0.0] - 2026-05-12
8
+ ## [3.0.1] - 2026-08-27
9
+
10
+ ### Fixed
11
+ - `authError` was missing from the published type declarations (`SearchContextType` and
12
+ `IndxAuthResult`) — the property existed at runtime in 3.0.0 but TypeScript consumers
13
+ could not access it without a compile error. Types only; no runtime change.
14
+
15
+ ---
16
+
17
+ ## [3.0.0] - 2026-08-25
18
+
19
+ First stable release of the v3 line, for IndxCloudApi v2 (IndxSearchLib v5).
20
+ (Supersedes `3.0.0-alpha.20260617`, previously published under the `next` tag.)
9
21
 
10
22
  ### Changed
11
- - **BREAKING**: Package renamed from `@indxsearch/intrface` to `@indxsearch/intrface`
12
- - Targets Indx v5 and IndxCloudApi v2
23
+ - **BREAKING**: All dataset operations use the team-scoped IndxCloudApi v2 routes
24
+ (`/api/teams/{team}/datasets/{dataset}/…`). `SearchProvider` takes a required
25
+ `team` prop alongside `dataset`.
26
+ - **BREAKING**: Authentication is token-only. The `email`/`password` props and the
27
+ login flow are removed — pass `preAuthenticatedToken` (create a token on the
28
+ IndxCloudApi API-Key page).
29
+ - Initialization now probes dataset **status before** opening the session, so a
30
+ mistyped dataset name fails with a clear "not found" error instead of silently
31
+ creating an empty dataset on the server.
32
+
33
+ ### Added
34
+ - `authError` on the search context — set when initialization fails (bad token,
35
+ unknown dataset, unreachable server). Previously such failures surfaced only as
36
+ an unhandled promise rejection in the console.
13
37
 
14
38
  ### Compatibility
15
39
  - Requires IndxCloudApi v2
16
- - React ^19.0.0
17
- - React DOM ^19.0.0
40
+ - `@indxsearch/indx-types` ^2.0.0 · `@indxsearch/systm` ^2.2.0
41
+ - React ^19.0.0 · React DOM ^19.0.0
18
42
 
19
43
  ---
20
44
 
package/README.md CHANGED
@@ -21,7 +21,7 @@ A powerful, flexible React search UI library for Indx Search with [IndxCloudApi]
21
21
  | **React DOM** | `^19.0.0` |
22
22
  | **Node.js** | `^20.19.0 \|\| >=22.12.0` |
23
23
 
24
- > **Note:** This library targets IndxCloudApi v2.0 (powered by IndxSearchLib v5 alpha). Different API versions may have incompatible changes.
24
+ > **Note:** This library targets IndxCloudApi v2.0 (powered by IndxSearchLib v5). Different API versions may have incompatible changes.
25
25
 
26
26
  ## Installation
27
27
 
@@ -403,7 +403,7 @@ const { state, setQuery } = useSearch();
403
403
 
404
404
  ### useVectorSearch
405
405
 
406
- Embedding-based vector search against the `VectorSearch` endpoint. You supply an `embeddingFn` that turns query text into a vector; the hook posts it and resolves the matching documents.
406
+ Embedding-based vector search against the `search/vector` endpoint. You supply an `embeddingFn` that turns query text into a vector; the hook posts it and resolves the matching documents.
407
407
 
408
408
  ```typescript
409
409
  import { useVectorSearch } from '@indxsearch/intrface';
@@ -421,7 +421,7 @@ await search('comfortable running shoes');
421
421
 
422
422
  ### useHybridSearch
423
423
 
424
- Combines full-text and vector scoring via the `HybridSearch` endpoint. Same shape as `useVectorSearch`, plus an `alpha` blend factor.
424
+ Combines full-text and vector scoring via the `search/hybrid` endpoint. Same shape as `useVectorSearch`, plus an `alpha` blend factor.
425
425
 
426
426
  ```typescript
427
427
  import { useHybridSearch } from '@indxsearch/intrface';
@@ -476,7 +476,7 @@ These components are also exported and can be used for custom layouts:
476
476
 
477
477
  **Solutions:**
478
478
  1. Verify dataset name is correct
479
- 2. Check if dataset is indexed (use GetStatus endpoint)
479
+ 2. Check if dataset is indexed (`GET /api/teams/{team}/datasets/{dataset}/status`)
480
480
  3. Ensure fields are configured as indexable/facetable
481
481
  4. Try `allowEmptySearch={true}` to see all results
482
482
 
@@ -49,6 +49,7 @@ export interface SearchState {
49
49
  export interface SearchContextType {
50
50
  state: SearchState;
51
51
  isFetchingInitial: boolean;
52
+ authError?: string;
52
53
  allowEmptySearch: boolean;
53
54
  url: string;
54
55
  team: string;
@@ -1,6 +1,8 @@
1
1
  export interface IndxAuthResult {
2
2
  token: string | null;
3
3
  isFetchingInitial: boolean;
4
+ /** Set when initialization failed (bad token, unknown dataset, unreachable server). */
5
+ authError: string | null;
4
6
  initialFacetStats: Record<string, {
5
7
  min: number;
6
8
  max: number;
package/dist/index.cjs.js CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));require("@indxsearch/systm/styles.css");let c=require("react");c=s(c);let l=require("@indxsearch/indx-types"),u=require("react/jsx-runtime"),d=require("@indxsearch/systm"),f=require("@indxsearch/pixl");function p({url:e,team:t,dataset:n,preAuthenticatedToken:r,enableDebugLogs:i=!1}){let[a,o]=(0,c.useState)(null),[s,u]=(0,c.useState)(!0),[d,f]=(0,c.useState)([]),[p,m]=(0,c.useState)([]),[h,g]=(0,c.useState)([]),[_,v]=(0,c.useState)({}),[y,b]=(0,c.useState)({}),[x,S]=(0,c.useState)(0);return(0,c.useEffect)(()=>{(async()=>{try{if(!r)throw console.error(`[Auth] ❌ Missing bearer token`),console.error(`[Auth] 💡 Pass preAuthenticatedToken to SearchProvider (create a token on the IndxCloudApi website)`),Error(`A bearer token is required. Check console for instructions.`);if(!e)throw console.error(`[Auth] ❌ Missing INDX server URL`),console.error(`[Auth] 💡 Pass a url to SearchProvider`),Error(`INDX server URL is required. Check console for instructions.`);if(!n)throw console.error(`[Auth] ❌ Missing dataset name`),console.error(`[Auth] 💡 Pass dataset="your-dataset-name" to SearchProvider`),Error(`Dataset name is required. Check console for instructions.`);i&&console.log(`[Auth] ✅ Using bearer token`);let a=r;i&&console.log(`[Auth] 🔓 Opening dataset session...`);let s=await fetch(`${e}/api/teams/${t}/datasets/${n}/CreateOrOpen/400`,{method:`PUT`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${a}`},body:`""`});if(!s.ok)throw console.error(`[Auth] ❌ CreateOrOpen failed:`,s.status,await s.text()),Error(`Failed to open dataset session.`);o(a),i&&console.log(`[Auth] ✅ Dataset session established`);let c=e=>fetch(e,{method:`GET`,headers:{accept:`text/plain`,Authorization:`Bearer ${a}`}});i&&console.log(`[Auth] 🔍 Checking dataset status...`);let u=await c(`${e}/api/teams/${t}/datasets/${n}/GetStatus`);if(!u.ok){if(u.status===401)throw console.error(`[Auth] ❌ Authentication failed (401 Unauthorized)`),console.error(`[Auth] 💡 Your token may be expired or invalid`),console.error(`[Auth] 💡 Create or refresh your token on the IndxCloudApi website`),Error(`Authentication failed (401). Token may be expired. Check console for instructions.`);if(u.status===404)throw console.error(`[Auth] ❌ Dataset "`+n+`" not found (404)`),console.error(`[Auth] 💡 Available datasets can be checked with: curl -X GET "`+e+`/api/me/datasets" -H "Authorization: Bearer YOUR_TOKEN"`),console.error(`[Auth] 💡 Make sure you spelled the dataset name correctly`),Error(`Dataset "`+n+`" not found. Check console for instructions.`);{let t=await u.text();throw console.error(`[Auth] ❌ Failed to get dataset status:`,u.status,t),console.error(`[Auth] 💡 Check if your INDX server is running at:`,e),Error(`Failed to connect to INDX server. Check console for details.`)}}let d=await u.json();i&&console.log(`[Auth] 📊 Dataset status:`,d),d.systemState!==void 0&&d.systemState!==l.SystemState.Ready&&(console.warn(`[Auth] ⚠️ Dataset is not ready yet. Current state:`,l.SystemState[d.systemState]),console.warn(`[Auth] 💡 Wait for indexing to complete before searching`));let p=d.documentCount??d.numberOfRecords??0;p===0?(console.warn(`[Auth] ⚠️ Dataset "`+n+`" is empty (0 records)`),console.warn(`[Auth] 💡 Add documents to your dataset before searching`),console.warn(`[Auth] 💡 Search will work but return no results`)):i&&console.log(`[Auth] ✅ Dataset has`,p,`records`);let[h,_,y]=await Promise.all([c(`${e}/api/teams/${t}/datasets/${n}/GetFilterableFields`),c(`${e}/api/teams/${t}/datasets/${n}/GetFacetableFields`),c(`${e}/api/teams/${t}/datasets/${n}/GetSortableFields`)]);if(!h.ok)throw console.error(`[Auth] ❌ GetFilterableFields failed:`,h.status,await h.text()),Error(`Failed to get filterable fields. Check console for details.`);if(!_.ok)throw console.error(`[Auth] ❌ GetFacetableFields failed:`,_.status,await _.text()),Error(`Failed to get facetable fields. Check console for details.`);if(!y.ok)throw console.error(`[Auth] ❌ GetSortableFields failed:`,y.status,await y.text()),Error(`Failed to get sortable fields. Check console for details.`);let[x,C,w]=await Promise.all([h.json().catch(e=>(console.error(`Failed to parse GetFilterableFields response:`,e),[])),_.json().catch(e=>(console.error(`Failed to parse GetFacetableFields response:`,e),[])),y.json().catch(e=>(console.error(`Failed to parse GetSortableFields response:`,e),[]))]);f(x||[]),m(C||[]),g(w||[]),S(p);let T={facets:{}};try{let r=await fetch(`${e}/api/teams/${t}/datasets/${n}/Search`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${a}`},body:JSON.stringify({text:``,maxNumberOfRecordsToReturn:0,enableFacets:!0})});r.ok?T=await r.json().catch(e=>(console.warn(`Failed to parse blank search response:`,e),{facets:{}})):(console.warn(`Blank search failed:`,r.status,r.statusText),console.warn(`Continuing without initial facet data - facets will be populated after first search`))}catch(e){console.warn(`Blank search error:`,e),console.warn(`Continuing without initial facet data - facets will be populated after first search`)}let E={};if(T.facets){for(let[e,t]of Object.entries(T.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(E[e]={min:Math.min(...n),max:Math.max(...n)})}}let D={};if(T.facets)for(let[e,t]of Object.entries(T.facets))Array.isArray(t)&&(D[e]=t.map(e=>e.key));v(E),b(D),i&&console.log(`[Auth] ✅ Initialization complete`)}catch(t){throw console.error(`[Auth] ❌ Initialization failed:`,t),(t instanceof Error||typeof t==`object`&&t&&`message`in t)&&console.error(`[Auth] 💡 Error:`,t.message),t instanceof TypeError&&t.message.includes(`fetch`)&&(console.error(`[Auth] ❌ Network error - cannot connect to INDX server`),console.error(`[Auth] 💡 Check if the server is running at:`,e),console.error(`[Auth] 💡 Check the url you passed to SearchProvider`),console.error(`[Auth] 💡 For local development, it should be: http://localhost:5001`)),t}finally{u(!1)}})()},[e,t,n]),{token:a,isFetchingInitial:s,initialFacetStats:_,initialFacetKeys:y,filterableFields:d,facetableFields:p,sortableFields:h,totalDocumentCount:x}}async function m(e,t,n,r,i){if(e.length===0)return null;if(e.length===1)return e[0];let a=e[0];for(let o=1;o<e.length;o++){let s=await i(`${t}/api/teams/${n}/datasets/${r}/CombineFilters`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({a,b:e[o],useAndOperation:!0})});if(!s.ok){let e=await s.json();throw console.error(`CombineFilters failed:`,e),Error(`CombineFilters failed`)}a=await s.json()}return a}async function h(e,t,n,r,i,a){let o=Object.entries(e??{}),s=Object.entries(t??{}),[c,l]=await Promise.all([Promise.all(o.map(([e,t])=>Promise.all(t.map(t=>a(`${n}/api/teams/${r}/datasets/${i}/CreateValueFilter`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({fieldName:e,value:t})}).then(e=>e.json()))))),Promise.all(s.map(([e,{min:t,max:o}])=>a(`${n}/api/teams/${r}/datasets/${i}/CreateRangeFilter`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({fieldName:e,lowerLimit:t,upperLimit:o})}).then(e=>e.json())))]);return m([...c.flat(),...l].filter(e=>e&&typeof e.hashString==`string`),n,r,i,a)}function g(e,t){let n,r=(...r)=>{clearTimeout(n),n=setTimeout(()=>e(...r),t)};return r.cancel=()=>clearTimeout(n),r}function _({state:e,setState:t,authenticatedFetch:n,auth:r,url:i,team:a,dataset:o,allowEmptySearch:s,facetsEnabled:l,enableDebugLogs:u,filtersChangedByUser:d,shouldFetchMore:f}){let p=(0,c.useRef)(0),m=(0,c.useRef)(void 0),_=(0,c.useRef)(!1),[v,y]=(0,c.useState)({}),[b,x]=(0,c.useState)(``),[S,C]=(0,c.useState)(``);(0,c.useEffect)(()=>{r.isFetchingInitial||t(e=>({...e,facetStats:r.initialFacetStats,rangeBounds:r.initialFacetStats,totalDocumentCount:r.totalDocumentCount,filterableFields:r.filterableFields,facetableFields:r.facetableFields,sortableFields:r.sortableFields}))},[r.isFetchingInitial,r.initialFacetStats,r.totalDocumentCount,r.filterableFields,r.facetableFields,r.sortableFields,t]);let w=e.searchSettings.maxNumberOfRecordsToReturn,T=e.searchSettings.enableCoverage,E=e.searchSettings.removeDuplicates,D=e.searchSettings.coverageDepth,O=e.searchSettings.minimumScore,k=e.searchSettings.coverageSetup,A=e.sortBy,j=e.sortAscending,M=(0,c.useCallback)(async({enableFacets:c})=>{if(!r.token)return;let l=++p.current;if(t(e=>({...e,isLoading:!0})),e.query.trim()===``){if(!s)return;c=!0}try{let d=await h(e.filters,e.rangeFilters,i,a,o,n),f=s||e.query.trim()!==``,m={text:e.query,maxNumberOfRecordsToReturn:f?w:0,enableFacets:c,...d?{filter:d}:{},...A?{sortBy:A}:{},...j===void 0?{}:{sortAscending:j},enableCoverage:T,removeDuplicates:E,coverageDepth:D,coverageSetup:k};u&&console.log(`[performSearch] request body:`,JSON.stringify(m,null,2));let g=await(await n(`${i}/api/teams/${a}/datasets/${o}/Search`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(m)})).json(),_=g.truncationIndex??-1,M=g.records||[],N=M.map(e=>e.documentKey),P=M.map(e=>e.score),F=[];f&&N.length>0&&(F=(await(await n(`${i}/api/teams/${a}/datasets/${o}/GetJson`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(N)})).json()).map((e,t)=>({document:e,documentKey:N[t],score:P[t]})));let I={};if(c&&g.facets){for(let[e,t]of Object.entries(g.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(I[e]={min:Math.min(...n),max:Math.max(...n)})}}let L=e.query!==b,R=e.query!==S,z=e.facetStats??{};if(L?(z={...r.initialFacetStats,...I},y(z),x(e.query)):z={...v,...I},R&&c){let n={...e.rangeBounds};for(let[e,t]of Object.entries(I))n[e]=t;t(e=>({...e,rangeBounds:n})),C(e.query)}let B=g.facets;if(c&&(!B||Object.keys(B).length===0)){B={};for(let[e,t]of Object.entries(r.initialFacetKeys))B[e]=t.map(e=>({key:e,value:null}))}if(l!==p.current)return;let V=F.filter(t=>{let n=e.query.trim();return n===``||n.length===1?!0:t.score>=O});t(e=>({...e,results:V,resultsSuppressed:!f,...c?{facets:B,facetStats:z}:{},isLoading:!1,truncationIndex:_}))}catch(e){if(console.error(`[Search] ❌ Search failed:`,e),e instanceof TypeError&&e.message.includes(`fetch`)?(console.error(`[Search] ❌ Network error - cannot reach INDX server`),console.error(`[Search] 💡 Check if server is running at:`,i)):e instanceof Error&&(e.message.includes(`401`)?(console.error(`[Search] ❌ Authentication failed`),console.error(`[Search] 💡 Your token may have expired. Create or refresh it on the IndxCloudApi website.`)):e.message.includes(`404`)?(console.error(`[Search] ❌ Dataset not found`),console.error(`[Search] 💡 Check that dataset "`+o+`" exists`)):console.error(`[Search] 💡 Error:`,e.message)),l!==p.current)return;t(t=>({...t,results:null,isLoading:!1,resultsSuppressed:!1,error:e instanceof Error?e.message:`Search failed`}))}},[e.query,e.filters,e.rangeFilters,e.facetStats,A,j,w,T,E,D,k,O,n,r.initialFacetStats,r.initialFacetKeys,r.token,v,b,S,e.rangeBounds,i,a,o,s,u,t]);(0,c.useEffect)(()=>{m.current=M},[M]);let N=(0,c.useRef)(null);(0,c.useEffect)(()=>(N.current?.cancel(),N.current=g(()=>{u&&console.log(`Debounced searchWithFacets fired`),m.current?.({enableFacets:!0})},e.facetDebounceDelayMillis??500),()=>{N.current?.cancel()}),[e.facetDebounceDelayMillis]),(0,c.useEffect)(()=>{!r.isFetchingInitial&&r.token&&!_.current&&(s&&m.current?.({enableFacets:l}),_.current=!0)},[r.isFetchingInitial,r.token,s,l]),(0,c.useEffect)(()=>{if(!r.token||!_.current)return;let n=e.query.trim(),i=n===``&&s;if(n===``&&!s){e.resultsSuppressed||t(e=>({...e,resultsSuppressed:!0}));return}return i?(N.current?.cancel(),m.current?.({enableFacets:l})):l?(u&&console.log(`Search fired`),m.current?.({enableFacets:!1}),N.current?.()):m.current?.({enableFacets:!1}),()=>{N.current?.cancel()}},[e.query,s,l]),(0,c.useEffect)(()=>{let t=d.current;if(d.current=!1,!_.current||!r.token||!t)return;let n=e.query.trim();l&&!(!s&&n===``)&&m.current?.({enableFacets:!0})},[e.filters,e.rangeFilters]),(0,c.useEffect)(()=>{if(!_.current||!r.token)return;let t=e.query.trim();l&&!(!s&&t===``)&&m.current?.({enableFacets:!0})},[A,j]),(0,c.useEffect)(()=>{!_.current||!r.token||f.current&&(f.current=!1,m.current?.({enableFacets:!1}))},[w,r.token])}var v=(0,c.createContext)(void 0),y=({children:e,url:t,team:n,dataset:r,allowEmptySearch:i=!1,maxResults:a=10,facetDebounceDelayMillis:o=500,enableFacets:s=!0,coverageDepth:l=500,removeDuplicates:d=!0,enableCoverage:f=!0,initialCoverageSetup:m={},enableDebugLogs:h=!1,preAuthenticatedToken:g})=>{let y=(0,c.useRef)(!1),b=(0,c.useRef)(!1),[x,S]=(0,c.useState)({query:``,results:null,isLoading:!1,resultsSuppressed:!i,facetDebounceDelayMillis:o,filterableFields:[],facetableFields:[],sortableFields:[],filters:{},rangeFilters:{},facetStats:{},rangeBounds:{},searchSettings:{maxNumberOfRecordsToReturn:a,coverageDepth:l,enableCoverage:f,removeDuplicates:d,minimumScore:0,showScore:!0,placeholderText:`Type to search`,coverageSetup:{coverWholeQuery:!0,coverWholeWords:!0,coverFuzzyWords:!0,coverJoinedWords:!0,coverPrefixSuffix:!0,truncate:!0,includePatternMatches:!0,minWordSize:2,levenshteinMaxWordSize:20,truncateWordHitLimit:1,truncateWordHitTolerance:0,truncationScore:65024,...m}}});(0,c.useEffect)(()=>{h&&console.log(`SearchContext mounted on client`)},[h]),(0,c.useEffect)(()=>{S(e=>({...e,facetDebounceDelayMillis:o}))},[o]);let[C]=(0,c.useState)(s),w=p({url:t,team:n,dataset:r,preAuthenticatedToken:g,enableDebugLogs:h}),T=(0,c.useCallback)((e,t={})=>{if(!w.token)throw Error(`No authentication token available`);return fetch(e,{...t,headers:{...t.headers,Authorization:`Bearer ${w.token}`}})},[w.token]);_({state:x,setState:S,authenticatedFetch:T,auth:w,url:t,team:n,dataset:r,allowEmptySearch:i,facetsEnabled:C,enableDebugLogs:h,filtersChangedByUser:y,shouldFetchMore:b});let E=(0,c.useCallback)(e=>{y.current=!1,S(t=>{let n=Object.keys(t.filters).length>0,r=Object.keys(t.rangeFilters).length>0;return{...t,query:e,filters:n?{}:t.filters,rangeFilters:r?{}:t.rangeFilters,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:a}}})},[a]),D=(0,c.useCallback)(e=>{S(t=>({...t,facetDebounceDelayMillis:e}))},[]),O=(0,c.useCallback)(e=>{S(t=>{let n={...t.searchSettings,...e};return e.coverageSetup?n.coverageSetup={...t.searchSettings.coverageSetup,...e.coverageSetup}:n.coverageSetup=t.searchSettings.coverageSetup,{...t,searchSettings:n}})},[]),k=(0,c.useCallback)(e=>{b.current=!0,S(t=>({...t,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:e}}))},[]),A=(0,c.useCallback)((e,t)=>{y.current=!0,S(n=>{let r={...n.filters},i=r[e]||[],a=i.includes(t)?i.filter(e=>e!==t):[...i,t];return a.length?r[e]=a:delete r[e],{...n,filters:r}})},[]),j=(0,c.useCallback)((e,t,n)=>{y.current=!0,S(r=>({...r,rangeFilters:{...r.rangeFilters,[e]:{min:t,max:n}}}))},[]),M=(0,c.useCallback)(()=>{y.current=!0,S(e=>({...e,filters:{},rangeFilters:{}}))},[]),N=(0,c.useCallback)((e,t,n=!0)=>{n&&(y.current=!0),S(n=>{let r={...n.filters},i=(r[e]||[]).filter(e=>e!==t);return i.length>0?r[e]=i:delete r[e],{...n,filters:r}})},[]),P=(0,c.useCallback)((e,t=!0)=>{t&&(y.current=!0),S(t=>{let n={...t.rangeFilters};return delete n[e],{...t,rangeFilters:n}})},[]),F=(0,c.useCallback)((e,t)=>{S(n=>({...n,sortBy:e||void 0,sortAscending:e?t:void 0}))},[]);return(0,u.jsx)(v.Provider,{value:{state:x,isFetchingInitial:w.isFetchingInitial,allowEmptySearch:i,url:t,team:n,dataset:r,authenticatedFetch:T,setQuery:E,toggleFilter:A,setRangeFilter:j,resetFilters:M,resetSingleFilter:N,resetRangeFilter:P,setSort:F,setDebounceDelay:D,setSearchSettings:O,fetchMoreResults:k},children:e})},b=()=>{let e=(0,c.useContext)(v);if(!e)throw Error(`useSearchContext must be used within a SearchProvider`);return e},x=({className:e=``,autoFocus:t=!1,inputSize:n=`default`,showClear:r=!0,showFocus:i=!1,...a})=>{let{state:{query:o,filters:s,rangeFilters:c,searchSettings:l},setQuery:f}=b();Object.keys(s).length>0||Object.keys(c).length;let p=o.length>0;return(0,u.jsx)(d.SearchField,{type:`text`,value:o,onChange:e=>f(e.target.value),placeholder:l.placeholderText,autoFocus:t,className:e,showSearchIcon:!0,inputSize:n,showFocusBorder:i,...a,children:r&&p&&(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>f(``),"aria-label":`Clear search`,children:`Clear`})})},S={placeholder:`_placeholder_ee9qi_1`,invalid:`_invalid_ee9qi_11`},C={row:`_row_1i201_1`,content:`_content_1i201_19`,indexNumber:`_indexNumber_1i201_31`,scoreNumber:`_scoreNumber_1i201_39`,skeletonBars:`_skeletonBars_1i201_53`,skeletonBarLg:`_skeletonBarLg_1i201_59`,fade:`_fade_1i201_1`,skeletonBarSm:`_skeletonBarSm_1i201_66`},w=({skeleton:e=!1,index:t,score:n,showScore:r=!1,children:i,skeletonDelay:a=0,skeletonWidths:o=[62,38]})=>(0,u.jsxs)(`div`,{className:C.row,children:[t!==void 0&&(0,u.jsx)(`div`,{className:C.indexNumber,children:t}),(0,u.jsx)(`div`,{className:C.content,children:e?(0,u.jsxs)(`div`,{className:C.skeletonBars,children:[(0,u.jsx)(`div`,{className:C.skeletonBarLg,style:{width:`${o[0]}%`,animationDelay:`${a}s`}}),(0,u.jsx)(`div`,{className:C.skeletonBarSm,style:{width:`${o[1]}%`,animationDelay:`${a+.05}s`}})]}):i}),r&&n!==void 0&&(0,u.jsx)(`div`,{className:C.scoreNumber,children:n})]}),T={wrapper:`_wrapper_81m3c_6`,skeletonAppear:`_skeletonAppear_81m3c_1`},E=[[62,38],[75,45],[58,33],[70,42],[65,50],[55,35],[72,40],[60,30]],D=({rows:e=6})=>(0,u.jsx)(`div`,{className:T.wrapper,children:Array.from({length:e}).map((e,t)=>(0,u.jsx)(w,{skeleton:!0,skeletonDelay:t*.1,skeletonWidths:E[t%E.length]},t))}),O=({fields:e,resultsPerPage:t,children:n})=>{let{state:{results:r,resultsSuppressed:i,searchSettings:a,truncationIndex:o,query:s},isFetchingInitial:l,allowEmptySearch:p,fetchMoreResults:m}=b(),h=t??30,[g,_]=(0,c.useState)(h),v=(0,c.useRef)(0),y=(0,c.useRef)(``);(0,c.useEffect)(()=>{let e=s!==y.current;(!r||r.length<v.current||e)&&_(h),v.current=r?.length??0,y.current=s},[r,h,s]);let x=r&&r.length>g;return l?p?(0,u.jsx)(D,{rows:h}):(0,u.jsx)(`div`,{className:S.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):i||r===null?(0,u.jsx)(`div`,{className:S.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):r.length===0?(0,u.jsx)(`div`,{className:S.invalid,children:(0,u.jsx)(`p`,{children:`No results found.`})}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{children:(r??[]).slice(0,g).map((t,r)=>{let i=t.document,o=t.score,s;try{s=typeof i==`string`?JSON.parse(i):i}catch{return(0,u.jsx)(`div`,{className:S.invalid,children:(0,u.jsx)(`p`,{children:`Invalid JSON`})},r)}let c;if(e&&e.length>0){c={};for(let t of e)t in s&&(c[t]=s[t])}else c={...s};for(let e in c){let t=c[e];if(typeof t==`string`&&t.startsWith(`[`)&&t.endsWith(`]`)){let n=t.replace(/^\[|\]$/g,``);c[e]=n.split(`,`).map(e=>e.trim().replace(/^'|'$/g,``)).filter(e=>e.length>0)}}return(0,u.jsx)(w,{index:r,score:o,showScore:a.showScore,children:n(c)},r)})}),x&&(0,u.jsx)(`div`,{style:{textAlign:`center`,marginTop:`20px`},children:(0,u.jsx)(d.Button,{variant:`secondary`,size:`micro`,onClick:()=>{let e=g+h;_(e),r&&e>=r.length&&(!o||o===-1||o>r.length)&&m(r.length+h)},children:s.trim()===``?`Load more`:o!==-1&&o!==void 0&&o>0?`Load results ${g+1}-${Math.min(g+h,r.length,o)} of ${o}`:`Load more`})})]})},k={row:`_row_ujwhc_1`,title:`_title_ujwhc_8`},A=({variant:e=`default`,children:t})=>(0,u.jsx)(`div`,{className:[k.row,e===`title`?k.title:``].filter(Boolean).join(` `),children:t}),j={bar:`_bar_145f5_12`,skeletonAppear:`_skeletonAppear_145f5_1`,fade:`_fade_145f5_1`,listRows:`_listRows_145f5_19`,sliderArea:`_sliderArea_145f5_25`,sliderTrack:`_sliderTrack_145f5_32`,inputRow:`_inputRow_145f5_40`,inputBar:`_inputBar_145f5_45`},M=[65,80,55,72,60,75,50,68],N=({title:e,rows:t=5,variant:n=`list`,collapsible:r=!0,startCollapsed:i=!1})=>(0,u.jsx)(d.FilterPanelBase,{title:e,collapsible:r,collapsed:i,children:n===`slider`?(0,u.jsxs)(`div`,{className:j.sliderArea,children:[(0,u.jsx)(`div`,{className:j.sliderTrack}),(0,u.jsxs)(`div`,{className:j.inputRow,children:[(0,u.jsx)(`div`,{className:j.inputBar,style:{animationDelay:`0.1s`}}),(0,u.jsx)(`div`,{className:j.inputBar,style:{animationDelay:`0.15s`}})]})]}):(0,u.jsx)(`div`,{className:j.listRows,children:Array.from({length:t}).map((e,t)=>(0,u.jsx)(`div`,{className:j.bar,style:{width:`${M[t%M.length]}%`,animationDelay:`${t*.05}s`}},t))})}),P={list:`_list_m82u6_2`,count:`_count_m82u6_7`,countValue:`_countValue_m82u6_17`,chip:`_chip_m82u6_22`,chipLabel:`_chipLabel_m82u6_32`,grid:`_grid_m82u6_40`},F=({field:e,label:t,preserveBlankFacetState:n=!1,preserveBlankFacetStateOrder:r=!1,sortFacetsBy:i=`histogram`,limit:a=10,collapsible:o=!0,startCollapsed:s=!1,displayType:l=`checkbox`,layout:f=`list`,showActivePanel:p=!1,showCount:m=!0,showNull:h=!1,displayIfEmptyQuery:g=!0,displayCondition:_=e=>!0})=>{let{state:{facets:v,filterableFields:y,facetableFields:x,filters:S,query:C},toggleFilter:w,isFetchingInitial:T,allowEmptySearch:E}=b(),D=(0,c.useRef)(null),[O,k]=(0,c.useState)(a);if((0,c.useEffect)(()=>{k(a)},[v?.[e],a]),!E&&!C)return null;if(T||!v)return l===`toggle`?(0,u.jsx)(N,{rows:1,collapsible:!1}):(0,u.jsx)(N,{title:t,rows:Math.min(a,6),collapsible:o,startCollapsed:s});if(!_({query:C??``,filters:S,facets:v})||!g&&!C&&Object.keys(S).length<1)return null;if(!y?.includes(e)||!x?.includes(e)){let t=[];return y?.includes(e)||t.push(`filterable`),x?.includes(e)||t.push(`facetable`),(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{style:{color:`red`,fontSize:`12px`},children:[`Cannot render filter for "`,e,`": missing `,t.join(` and `),`.`]})})}let A=v?.[e];if(!A||!Array.isArray(A))return null;let j=S?.[e]??[];n&&!D.current&&A.length>0&&(D.current=A.reduce((e,t)=>(e[t.key]=t.value,e),{}));let M=new Map;n&&D.current&&Object.keys(D.current).forEach(e=>{M.set(e,0)}),A.forEach(e=>{M.set(e.key,e.value)});let F=l===`toggle`&&M.size===2&&M.has(`true`)&&(M.has(`false`)||M.has(`null`));if(M.has(`null`)){let e=M.get(`null`)??0,t=M.get(`false`)??0;M.set(`false`,(t??0)+e),M.delete(`null`)}if(l===`toggle`&&!F)return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsx)(`div`,{className:P.count,children:(0,u.jsx)(d.ToggleSwitch,{label:t,checked:!1,onChange:()=>{},disabled:!0})})});if(F){let n=M.get(`true`),r=typeof n==`number`?n:null,i=j.includes(`true`),a=r===0,o=m&&(r??0)>0?`${r}`:``;return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.ToggleSwitch,{label:t,checked:i,onChange:()=>w(e,`true`),disabled:a}),` `,o]})})}let I=Array.from(M.entries());if(h||(I=I.filter(([e])=>e!==`null`)),I.length===0&&!n)return null;if(!r)if(i===`alphabetical`){let e=I.filter(([,e])=>typeof e==`number`&&e>0).sort(([e],[t])=>e.localeCompare(t)),t=I.filter(([,e])=>e===0||e===null).sort(([e],[t])=>e.localeCompare(t));I=[...e,...t]}else if(i===`numeric`){let e=(e,t)=>{let n=Number(e),r=Number(t);return!isNaN(n)&&!isNaN(r)?n-r:e.localeCompare(t)},t=I.filter(([,e])=>typeof e==`number`&&e>0).sort(([t],[n])=>e(t,n)),n=I.filter(([,e])=>e===0||e===null).sort(([t],[n])=>e(t,n));I=[...t,...n]}else{let e=I.filter(([,e])=>typeof e==`number`&&e>0),t=I.filter(([,e])=>e===0||e===null);I=[...e,...t]}let L=typeof a==`number`&&I.length>a,R=L?I.slice(0,O):I,z=(t,n)=>{let r=j.includes(t),i=n===0,a=m&&(n??0)>0?` (${n})`:``,o=m&&(n??0)>0?n:``;switch(l){case`button`:return f===`list`?(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>w(e,t),disabled:i,size:`micro`,className:P.chip,title:t,children:(0,u.jsx)(`span`,{className:P.chipLabel,children:t})}),(0,u.jsx)(`span`,{className:P.countValue,children:o})]}):(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>w(e,t),disabled:i,size:`micro`,className:P.chip,title:`${t}${a}`,children:(0,u.jsx)(`span`,{className:P.chipLabel,children:`${t}${a}`})});case`toggle`:return(0,u.jsx)(d.ToggleSwitch,{label:t,checked:r,onChange:()=>w(e,t),disabled:i});default:return f===`list`?(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.Checkbox,{label:t,score:``,checked:r,onChange:()=>w(e,t),disabled:i}),(0,u.jsx)(`span`,{children:o})]}):(0,u.jsx)(d.Checkbox,{label:t,score:a,checked:r,onChange:()=>w(e,t),disabled:i})}};return(0,u.jsx)(d.FilterPanelBase,{title:t,collapsible:o,collapsed:o?s:!1,children:(0,u.jsxs)(`ul`,{className:f===`grid`?P.grid:P.list,style:{listStyle:`none`,padding:0,margin:0},children:[R.map(([e,t])=>(0,u.jsx)(`li`,{children:z(e,t)},e)),L&&O<I.length&&(()=>{let e=I.length-O,t=Math.min(50,e);return(0,u.jsx)(`li`,{className:P.toggleItem,children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>k(e=>e+50),children:`Show ${t} more of ${I.length} total`})})})()]})})},I={disabledMessage:`_disabledMessage_uci6n_1`,histogram:`_histogram_uci6n_6`,histogramBar:`_histogramBar_uci6n_15`},L=({field:e,label:t,expectedMin:n=0,expectedMax:r=1e3,displayType:i=`input`,collapsible:a=!0,startCollapsed:o=!1,showHistogram:s=!1,resolution:l})=>{let{state:{rangeFilters:f,rangeBounds:p,facetStats:m,facets:h,facetableFields:g,query:_,facetDebounceDelayMillis:v},setRangeFilter:y,resetRangeFilter:x,allowEmptySearch:S,isFetchingInitial:C}=b(),w=p?.[e]!==void 0,T=p?.[e]??{min:n,max:r},E=T.min,D=T.max,O=m?.[e]??T,k=Math.max(E,Math.min(D,O.min)),A=Math.max(E,Math.min(D,O.max)),j=w&&E===D,M=j?n:E,P=j?r:D,F=f?.[e],L=F?F.min:E,R=F?F.max:D,z=F!==void 0,B=k!==E||A!==D,[V,H]=c.default.useState([L,R]),[U,W]=c.default.useState(!1),[G,K]=c.default.useState(!1),{finalMin:q,finalMax:J,isValidMin:Y,isValidMax:X}=c.default.useMemo(()=>{let[e,t]=V,n=Math.max(E,Math.min(D,e)),r=Math.max(E,Math.min(D,t)),i=Math.min(n,r),a=Math.max(n,r);return{finalMin:i,finalMax:a,isValidMin:i>=E&&i<a,isValidMax:a<=D&&a>i}},[V,E,D]);c.default.useEffect(()=>{if(j)return;if(V[0]===E&&V[1]===D){W(!1),K(!1);return}let t=v??500,n=setTimeout(()=>{W(!Y),K(!X)},300),r=setTimeout(()=>{Y&&X&&(q===E&&J===D?x(e,!1):y(e,q,J))},t);return()=>{clearTimeout(n),clearTimeout(r)}},[q,J,Y,X,E,D,e,x,y,v,j]),c.default.useEffect(()=>{H([L,R]),W(!1),K(!1)},[L,R,e]);let ee=c.default.useCallback(e=>{j||H([Math.max(E,Math.min(A,e[0])),Math.max(k,Math.min(D,e[1]))])},[j,E,D,k,A]),te=c.default.useCallback(t=>{if(j)return;let n=Math.max(E,Math.min(A,t[0])),r=Math.max(k,Math.min(D,t[1]));n===E&&r===D?(H([E,D]),x(e,!0)):H([n,r])},[j,E,D,k,A,e,x]),ne=c.default.useCallback(e=>{if(j)return;let t=Number(e.target.value);isNaN(t)||H([Math.max(E,Math.min(A,t)),V[1]])},[j,V,E,A]),re=c.default.useCallback(e=>{if(j)return;let t=Number(e.target.value);if(!isNaN(t)){let e=Math.max(k,Math.min(D,t));H([V[0],e])}},[j,V,k,D]),ie=c.default.useCallback(()=>{let e=V[0],t=Math.max(E,Math.min(A,e));t<V[1]?H([t,V[1]]):H([E,V[1]])},[V,E,A]),ae=c.default.useCallback(()=>{let e=V[1],t=Math.max(k,Math.min(D,e));t>V[0]?H([V[0],t]):H([V[0],D])},[V,k,D]),[Z,oe]=c.default.useState(null),Q=c.default.useRef(null);c.default.useEffect(()=>{if(!s)return;let t=`${E}:${D}`;if(t===Q.current&&Q.current!==null)return;let n=h?.[e];if(!Array.isArray(n)||n.length===0)return;let r=n.filter(e=>e.value!=null&&!isNaN(Number(e.key))).map(e=>({key:e.key,value:e.value}));r.length>0&&(Q.current=t,oe(r))},[E,D,h,e,s]);let $=c.default.useMemo(()=>{if(!s||!Z||Z.length===0)return[];let e=D-E;if(e<=0)return[];let t=l??(Math.ceil(e/20)||1),n=Math.ceil(e/t);return Array.from({length:n},(e,n)=>{let r=E+n*t,i=E+(n+1)*t;return{bucketStart:r,bucketEnd:i,count:Z.filter(e=>{let t=Number(e.key);return t>=r&&t<i}).reduce((e,t)=>e+t.value,0)}})},[s,Z,E,D,l]),se=c.default.useMemo(()=>Math.max(...$.map(e=>e.count),1),[$]);return s&&!C&&!g?.includes(e)&&console.warn(`RangeFilterPanel: showHistogram=true but field "${e}" is not facetable. Add .Facetable = true to this field.`),C?(0,u.jsx)(N,{title:t,variant:`slider`,collapsible:a,startCollapsed:o}):!S&&!_?null:i===`slider`?(0,u.jsxs)(d.FilterPanelBase,{title:t,collapsed:o,collapsible:a,children:[j&&(0,u.jsxs)(`div`,{className:I.disabledMessage,children:[`No adjustable range (all results have the same value: `,E,`).`]}),s&&$.length>0&&(0,u.jsx)(`div`,{className:I.histogram,children:(()=>{let e=typeof k==`number`&&typeof A==`number`&&A>k&&(k>E||A<D);return $.map((t,n)=>{let r=Math.max(1,Math.ceil(t.count/se*20)),i=e?t.bucketEnd>k&&t.bucketStart<A:t.bucketEnd>q&&t.bucketStart<J;return(0,u.jsx)(`div`,{className:I.histogramBar,"data-testid":`histogram-bar`,"data-active":i,style:{height:`${r}px`,background:i?`var(--lv5)`:`var(--lv3)`}},n)})})()}),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:M,max:P,value:j?[M,P]:[q,J],isRange:!0,onChange:e=>ee(e),onFinalChange:e=>te(e),disabled:j,activeMin:k,activeMax:A,isFaceted:B,highlightFaceted:z,"aria-label":t||`Filter by ${e}`})}),(0,u.jsxs)(`div`,{style:{display:`flex`,flex:`flex-grow`,gap:`10px`,alignItems:`flex-start`,justifyContent:`space-between`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:j?E:V[0],min:E,max:Math.min(A,V[1]-1),onChange:ne,onBlur:ie,disabled:j,isValid:j||!U}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:j?D:V[1],min:Math.max(k,V[0]+1),max:D,onChange:re,onBlur:ae,disabled:j,isValid:j||!G})]})]}):(0,u.jsxs)(d.FilterPanelBase,{title:t,children:[j&&(0,u.jsxs)(`div`,{className:I.disabledMessage,children:[`No adjustable range (all results have the same value: `,E,`).`]}),(0,u.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,alignItems:`flex-start`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:j?E:V[0],min:E,max:Math.min(A,V[1]-1),onChange:ne,onBlur:ie,disabled:j,isValid:j||!U}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:j?D:V[1],min:Math.max(k,V[0]+1),max:D,onChange:re,onBlur:ae,disabled:j,isValid:j||!G})]})]})},R={grid:`_grid_xm2uh_2`,chip:`_chip_xm2uh_17`,chipLabel:`_chipLabel_xm2uh_28`},z=(0,c.memo)(({field:e,value:t,onReset:n})=>(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:n,iconRight:(0,u.jsx)(f.X_or_error,{}),variant:`primary`,size:`micro`,className:R.chip,title:`${e}: ${t}`,children:(0,u.jsxs)(`span`,{className:R.chipLabel,children:[e,`: `,t]})})})),B=(0,c.memo)(({field:e,min:t,max:n,onReset:r})=>(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:r,iconRight:(0,u.jsx)(f.X_or_error,{}),variant:`primary`,size:`micro`,className:R.chip,title:`${e}: ${t} – ${n}`,children:(0,u.jsxs)(`span`,{className:R.chipLabel,children:[e,`: `,t,` – `,n]})})}));function V(){let{state:{filters:e,rangeFilters:t},resetFilters:n,resetSingleFilter:r,resetRangeFilter:i}=b(),a=(0,c.useMemo)(()=>Object.entries(e).map(([e,t])=>t.map(t=>({field:e,value:t}))).flat(),[e]),o=(0,c.useMemo)(()=>Object.entries(t).map(([e,{min:t,max:n}])=>({field:e,min:t,max:n})),[t]);return(0,c.useMemo)(()=>Object.keys(e).length>0||Object.keys(t).length>0,[e,t])?(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,title:`Active filters`,children:(0,u.jsxs)(`ul`,{className:R.grid,children:[a.map(({field:e,value:t})=>(0,u.jsx)(z,{field:e,value:t,onReset:()=>r(e,t)},`${e}-${t}`)),o.map(({field:e,min:t,max:n})=>(0,u.jsx)(B,{field:e,min:t,max:n,onReset:()=>i(e)},e)),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:n,size:`micro`,variant:`ghost`,children:`Reset`})})]})}):null}var H={select:`_select_nwf7i_1`,radioGroup:`_radioGroup_nwf7i_6`},U=({displayType:e=`dropdown`,collapsible:t=!0,startCollapsed:n=!1})=>{let{state:{sortableFields:r,sortBy:i,sortAscending:a},setSort:o,isFetchingInitial:s}=b();if(s)return(0,u.jsx)(N,{title:`Sort by`,rows:e===`radio`?3:1,collapsible:t,startCollapsed:n});if(!r||r.length===0)return null;let c=i?`${i}:${a?`asc`:`desc`}`:`none`,l=[{label:`None`,value:`none`},...r.flatMap(e=>[{label:`${e} (asc)`,value:`${e}:asc`},{label:`${e} (desc)`,value:`${e}:desc`}])],f=e=>{if(e===`none`||e===``)o(null,!0);else{let[t,n]=e.split(`:`);o(t,n===`asc`)}};return(0,u.jsx)(d.FilterPanelBase,{title:`Sort by`,collapsible:t,collapsed:t?n:!1,children:e===`dropdown`?(0,u.jsx)(d.Select,{value:c,onValueChange:f,options:l,placeholder:`Select sort...`,"aria-label":`Sort by`}):(0,u.jsx)(`div`,{className:H.radioGroup,children:l.map(e=>(0,u.jsx)(d.RadioButton,{id:`sort-${e.value}`,name:`sort-by`,value:e.value,label:e.label,checked:c===e.value,onChange:e=>f(e.target.value)},e.value))})})},W={list:`_list_1y4fk_1`};function G(){let{state:{searchSettings:e},setSearchSettings:t}=b(),[n,r]=(0,c.useState)(!1),i=(e,n)=>{let r=parseInt(n,10);isNaN(r)||t({[e]:r})},a=(e,n)=>{t({[e]:n})},o=(n,r)=>{let i=parseInt(r,10);isNaN(i)||t({coverageSetup:{...e.coverageSetup,[n]:i}})},s=(n,r)=>{t({coverageSetup:{...e.coverageSetup,[n]:r}})};return(0,u.jsx)(d.FilterPanelBase,{collapsed:!0,title:`Settings`,children:(0,u.jsxs)(`ul`,{className:W.list,children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Max Results`,type:`number`,value:e.maxNumberOfRecordsToReturn.toString(),onChange:e=>i(`maxNumberOfRecordsToReturn`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Coverage Depth`,type:`number`,value:e.coverageDepth.toString(),onChange:e=>i(`coverageDepth`,e.target.value)})}),(0,u.jsxs)(`li`,{children:[(0,u.jsx)(d.InputField,{label:`Minimum Score (16 bit)`,type:`number`,value:e.minimumScore.toString(),min:`0`,max:`65535`,onChange:e=>{let n=parseFloat(e.target.value);isNaN(n)||t({minimumScore:n})}}),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:0,max:65535,step:5e3,value:e.minimumScore,onChange:e=>{t({minimumScore:e})},"aria-label":`Minimum score`})})]}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Placeholder text`,type:`text`,value:e.placeholderText,onChange:e=>{t({placeholderText:e.target.value})}})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Show score`,checked:e.showScore,onChange:e=>a(`showScore`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Enable Coverage`,checked:e.enableCoverage,onChange:e=>a(`enableCoverage`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Remove Duplicates`,checked:e.removeDuplicates,onChange:e=>a(`removeDuplicates`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,iconRight:n?(0,u.jsx)(f.ArrowDown,{}):(0,u.jsx)(f.ArrowRight,{}),onClick:()=>r(e=>!e),children:n?`Hide Coverage Setup`:`Show Coverage Setup`})}),n&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Whole Query`,checked:e.coverageSetup.coverWholeQuery,onChange:e=>s(`coverWholeQuery`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Whole Words`,checked:e.coverageSetup.coverWholeWords,onChange:e=>s(`coverWholeWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Fuzzy Words`,checked:e.coverageSetup.coverFuzzyWords,onChange:e=>s(`coverFuzzyWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Joined Words`,checked:e.coverageSetup.coverJoinedWords,onChange:e=>s(`coverJoinedWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Prefix Suffix`,checked:e.coverageSetup.coverPrefixSuffix,onChange:e=>s(`coverPrefixSuffix`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Truncate`,checked:e.coverageSetup.truncate,onChange:e=>s(`truncate`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Include Pattern Matches`,checked:e.coverageSetup.includePatternMatches,onChange:e=>s(`includePatternMatches`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Levenshtein Max Word Size`,type:`number`,value:e.coverageSetup.levenshteinMaxWordSize.toString(),onChange:e=>o(`levenshteinMaxWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Min Word Size`,type:`number`,value:e.coverageSetup.minWordSize.toString(),onChange:e=>o(`minWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Truncate Word Hit Limit`,type:`number`,value:e.coverageSetup.truncateWordHitLimit.toString(),onChange:e=>o(`truncateWordHitLimit`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Truncate Word Hit Tolerance`,type:`number`,value:e.coverageSetup.truncateWordHitTolerance.toString(),onChange:e=>o(`truncateWordHitTolerance`,e.target.value)})})]})]})})}var K=class extends c.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error(`[SearchErrorBoundary] Caught error:`,e,t)}reset=()=>{this.setState({hasError:!1,error:null})};render(){return this.state.hasError&&this.state.error?this.props.fallback?this.props.fallback(this.state.error,this.reset):(0,u.jsxs)(`div`,{style:{padding:`2rem`,backgroundColor:`#fee`,border:`2px solid #c33`,borderRadius:`8px`,maxWidth:`600px`,margin:`2rem auto`},children:[(0,u.jsx)(`h2`,{style:{color:`#c33`,marginTop:0},children:`⚠️ Search Initialization Error`}),(0,u.jsxs)(`p`,{style:{marginBottom:`1rem`},children:[(0,u.jsx)(`strong`,{children:`Error:`}),` `,this.state.error.message]}),(0,u.jsxs)(`div`,{style:{backgroundColor:`#fff`,padding:`1rem`,borderRadius:`4px`,marginBottom:`1rem`,fontSize:`0.9rem`},children:[(0,u.jsx)(`strong`,{children:`💡 Common fixes:`}),(0,u.jsxs)(`ul`,{style:{marginBottom:0,paddingLeft:`1.5rem`},children:[(0,u.jsx)(`li`,{children:`Check browser console for detailed error messages`}),(0,u.jsx)(`li`,{children:`Verify the url passed to SearchProvider is correct`}),(0,u.jsx)(`li`,{children:`Verify your bearer token is valid (create or check it on the IndxCloudApi website)`}),(0,u.jsx)(`li`,{children:`Ensure INDX server is running`}),(0,u.jsx)(`li`,{children:`Check dataset name spelling`})]})]}),(0,u.jsx)(`button`,{onClick:this.reset,style:{padding:`0.5rem 1rem`,backgroundColor:`#c33`,color:`white`,border:`none`,borderRadius:`4px`,cursor:`pointer`,fontWeight:`bold`},children:`Try Again`})]}):this.props.children}};function q(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=b(),[o,s]=(0,c.useState)(null),[l,u]=(0,c.useState)(!1),[d,f]=(0,c.useState)(void 0);return{results:o,isLoading:l,error:d,search:(0,c.useCallback)(async o=>{u(!0),f(void 0);try{let c=await e(o),l={fieldName:t.fieldName,vector:c,maxResults:t.maxResults??10};t.filter&&(l.filter=t.filter);let u=await a(`${n}/api/teams/${r}/datasets/${i}/VectorSearch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)});if(!u.ok)throw Error(`VectorSearch failed: ${u.status}`);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),p=await a(`${n}/api/teams/${r}/datasets/${i}/GetJson`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!p.ok)throw Error(`GetJson failed: ${p.status}`);s((await p.json()).map((e,t)=>({document:e,documentKey:f[t],score:d[t].score})))}catch(e){f(e instanceof Error?e.message:`Vector search failed`),s(null)}finally{u(!1)}},[e,t.fieldName,t.maxResults,t.filter,n,r,i,a])}}function J(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=b(),[o,s]=(0,c.useState)(null),[l,u]=(0,c.useState)(!1),[d,f]=(0,c.useState)(void 0);return{results:o,isLoading:l,error:d,search:(0,c.useCallback)(async o=>{u(!0),f(void 0);try{let c=await e(o),l={text:o,embeddingField:t.fieldName,vector:c,maxNumberOfRecordsToReturn:t.maxResults??10,alpha:t.alpha??.5};t.filter&&(l.filter=t.filter),t.timeoutMs&&(l.timeOutLimitMilliseconds=t.timeoutMs);let u=await a(`${n}/api/teams/${r}/datasets/${i}/HybridSearch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)});if(!u.ok)throw Error(`HybridSearch failed: ${u.status}`);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),p=await a(`${n}/api/teams/${r}/datasets/${i}/GetJson`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!p.ok)throw Error(`GetJson failed: ${p.status}`);s((await p.json()).map((e,t)=>({document:e,documentKey:f[t],score:d[t].score})))}catch(e){f(e instanceof Error?e.message:`Hybrid search failed`),s(null)}finally{u(!1)}},[e,t.fieldName,t.alpha,t.maxResults,t.filter,t.timeoutMs,n,r,i,a])}}exports.ActiveFiltersPanel=V,exports.FilterPanelSkeleton=N,exports.RangeFilterPanel=L,exports.SearchContext=v,exports.SearchErrorBoundary=K,exports.SearchInput=x,exports.SearchProvider=y,exports.SearchResult=w,exports.SearchResultRow=A,exports.SearchResults=O,exports.SearchResultsSkeleton=D,exports.SearchSettingsPanel=G,exports.SortByPanel=U,exports.ValueFilterPanel=F,exports.useHybridSearch=J,exports.useSearch=b,exports.useSearchContext=b,exports.useVectorSearch=q;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));require("@indxsearch/systm/styles.css");let c=require("react");c=s(c);let l=require("@indxsearch/indx-types"),u=require("react/jsx-runtime"),d=require("@indxsearch/systm"),f=require("@indxsearch/pixl");function p({url:e,team:t,dataset:n,preAuthenticatedToken:r,enableDebugLogs:i=!1}){let[a,o]=(0,c.useState)(null),[s,u]=(0,c.useState)(!0),[d,f]=(0,c.useState)([]),[p,m]=(0,c.useState)([]),[h,g]=(0,c.useState)([]),[_,v]=(0,c.useState)({}),[y,b]=(0,c.useState)({}),[x,S]=(0,c.useState)(0),[C,w]=(0,c.useState)(null);return(0,c.useEffect)(()=>{(async()=>{w(null);try{if(!r)throw console.error(`[Auth] ❌ Missing bearer token`),console.error(`[Auth] 💡 Pass preAuthenticatedToken to SearchProvider (create a token on the IndxCloudApi website)`),Error(`A bearer token is required. Check console for instructions.`);if(!e)throw console.error(`[Auth] ❌ Missing INDX server URL`),console.error(`[Auth] 💡 Pass a url to SearchProvider`),Error(`INDX server URL is required. Check console for instructions.`);if(!n)throw console.error(`[Auth] ❌ Missing dataset name`),console.error(`[Auth] 💡 Pass dataset="your-dataset-name" to SearchProvider`),Error(`Dataset name is required. Check console for instructions.`);i&&console.log(`[Auth] ✅ Using bearer token`);let a=r,s=e=>fetch(e,{method:`GET`,headers:{accept:`text/plain`,Authorization:`Bearer ${a}`}});i&&console.log(`[Auth] 🔍 Checking dataset status...`);let c=await s(`${e}/api/teams/${t}/datasets/${n}/status`);if(!c.ok){if(c.status===401)throw console.error(`[Auth] ❌ Authentication failed (401 Unauthorized)`),console.error(`[Auth] 💡 Your token may be expired or invalid`),console.error(`[Auth] 💡 Create or refresh your token on the IndxCloudApi website`),Error(`Authentication failed (401). Token may be expired. Check console for instructions.`);if(c.status===404)throw console.error(`[Auth] ❌ Dataset "`+n+`" not found (404)`),console.error(`[Auth] 💡 Available datasets can be checked with: curl -X GET "`+e+`/api/me/datasets" -H "Authorization: Bearer YOUR_TOKEN"`),console.error(`[Auth] 💡 Make sure you spelled the dataset name correctly`),Error(`Dataset "`+n+`" not found. Check console for instructions.`);{let t=await c.text();throw console.error(`[Auth] ❌ Failed to get dataset status:`,c.status,t),console.error(`[Auth] 💡 Check if your INDX server is running at:`,e),Error(`Failed to connect to INDX server. Check console for details.`)}}let u=await c.json();i&&console.log(`[Auth] 📊 Dataset status:`,u),i&&console.log(`[Auth] 🔓 Opening dataset session...`);let d=await fetch(`${e}/api/teams/${t}/datasets/${n}?configuration=400`,{method:`PUT`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${a}`},body:`""`});if(!d.ok)throw console.error(`[Auth] ❌ CreateOrOpen failed:`,d.status,await d.text()),Error(`Failed to open dataset session.`);o(a),i&&console.log(`[Auth] ✅ Dataset session established`),u.systemState!==void 0&&u.systemState!==l.SystemState.Ready&&(console.warn(`[Auth] ⚠️ Dataset is not ready yet. Current state:`,l.SystemState[u.systemState]),console.warn(`[Auth] 💡 Wait for indexing to complete before searching`));let p=u.documentCount??u.numberOfRecords??0;p===0?(console.warn(`[Auth] ⚠️ Dataset "`+n+`" is empty (0 records)`),console.warn(`[Auth] 💡 Add documents to your dataset before searching`),console.warn(`[Auth] 💡 Search will work but return no results`)):i&&console.log(`[Auth] ✅ Dataset has`,p,`records`);let[h,_,y]=await Promise.all([s(`${e}/api/teams/${t}/datasets/${n}/fields/filterable`),s(`${e}/api/teams/${t}/datasets/${n}/fields/facetable`),s(`${e}/api/teams/${t}/datasets/${n}/fields/sortable`)]);if(!h.ok)throw console.error(`[Auth] ❌ GetFilterableFields failed:`,h.status,await h.text()),Error(`Failed to get filterable fields. Check console for details.`);if(!_.ok)throw console.error(`[Auth] ❌ GetFacetableFields failed:`,_.status,await _.text()),Error(`Failed to get facetable fields. Check console for details.`);if(!y.ok)throw console.error(`[Auth] ❌ GetSortableFields failed:`,y.status,await y.text()),Error(`Failed to get sortable fields. Check console for details.`);let[x,C,w]=await Promise.all([h.json().catch(e=>(console.error(`Failed to parse GetFilterableFields response:`,e),[])),_.json().catch(e=>(console.error(`Failed to parse GetFacetableFields response:`,e),[])),y.json().catch(e=>(console.error(`Failed to parse GetSortableFields response:`,e),[]))]);f(x||[]),m(C||[]),g(w||[]),S(p);let T={facets:{}};try{let r=await fetch(`${e}/api/teams/${t}/datasets/${n}/search`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${a}`},body:JSON.stringify({text:``,maxNumberOfRecordsToReturn:0,enableFacets:!0})});r.ok?T=await r.json().catch(e=>(console.warn(`Failed to parse blank search response:`,e),{facets:{}})):(console.warn(`Blank search failed:`,r.status,r.statusText),console.warn(`Continuing without initial facet data - facets will be populated after first search`))}catch(e){console.warn(`Blank search error:`,e),console.warn(`Continuing without initial facet data - facets will be populated after first search`)}let E={};if(T.facets){for(let[e,t]of Object.entries(T.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(E[e]={min:Math.min(...n),max:Math.max(...n)})}}let D={};if(T.facets)for(let[e,t]of Object.entries(T.facets))Array.isArray(t)&&(D[e]=t.map(e=>e.key));v(E),b(D),i&&console.log(`[Auth] ✅ Initialization complete`)}catch(t){console.error(`[Auth] ❌ Initialization failed:`,t),(t instanceof Error||typeof t==`object`&&t&&`message`in t)&&console.error(`[Auth] 💡 Error:`,t.message),t instanceof TypeError&&t.message.includes(`fetch`)&&(console.error(`[Auth] ❌ Network error - cannot connect to INDX server`),console.error(`[Auth] 💡 Check if the server is running at:`,e),console.error(`[Auth] 💡 Check the url you passed to SearchProvider`),console.error(`[Auth] 💡 For local development, it should be: http://localhost:5001`)),w(t instanceof Error?t.message:String(t))}finally{u(!1)}})()},[e,t,n]),{token:a,isFetchingInitial:s,authError:C,initialFacetStats:_,initialFacetKeys:y,filterableFields:d,facetableFields:p,sortableFields:h,totalDocumentCount:x}}async function m(e,t,n,r,i){if(e.length===0)return null;if(e.length===1)return e[0];let a=e[0];for(let o=1;o<e.length;o++){let s=await i(`${t}/api/teams/${n}/datasets/${r}/filters/combine`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({a,b:e[o],useAndOperation:!0})});if(!s.ok){let e=await s.json();throw console.error(`CombineFilters failed:`,e),Error(`CombineFilters failed`)}a=await s.json()}return a}async function h(e,t,n,r,i,a){let o=Object.entries(e??{}),s=Object.entries(t??{}),[c,l]=await Promise.all([Promise.all(o.map(([e,t])=>Promise.all(t.map(t=>a(`${n}/api/teams/${r}/datasets/${i}/filters/value`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({fieldName:e,value:t})}).then(e=>e.json()))))),Promise.all(s.map(([e,{min:t,max:o}])=>a(`${n}/api/teams/${r}/datasets/${i}/filters/range`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({fieldName:e,lowerLimit:t,upperLimit:o})}).then(e=>e.json())))]);return m([...c.flat(),...l].filter(e=>e&&typeof e.hashString==`string`),n,r,i,a)}function g(e,t){let n,r=(...r)=>{clearTimeout(n),n=setTimeout(()=>e(...r),t)};return r.cancel=()=>clearTimeout(n),r}function _({state:e,setState:t,authenticatedFetch:n,auth:r,url:i,team:a,dataset:o,allowEmptySearch:s,facetsEnabled:l,enableDebugLogs:u,filtersChangedByUser:d,shouldFetchMore:f}){let p=(0,c.useRef)(0),m=(0,c.useRef)(void 0),_=(0,c.useRef)(!1),[v,y]=(0,c.useState)({}),[b,x]=(0,c.useState)(``),[S,C]=(0,c.useState)(``);(0,c.useEffect)(()=>{r.isFetchingInitial||t(e=>({...e,facetStats:r.initialFacetStats,rangeBounds:r.initialFacetStats,totalDocumentCount:r.totalDocumentCount,filterableFields:r.filterableFields,facetableFields:r.facetableFields,sortableFields:r.sortableFields}))},[r.isFetchingInitial,r.initialFacetStats,r.totalDocumentCount,r.filterableFields,r.facetableFields,r.sortableFields,t]);let w=e.searchSettings.maxNumberOfRecordsToReturn,T=e.searchSettings.enableCoverage,E=e.searchSettings.removeDuplicates,D=e.searchSettings.coverageDepth,O=e.searchSettings.minimumScore,k=e.searchSettings.coverageSetup,A=e.sortBy,j=e.sortAscending,M=(0,c.useCallback)(async({enableFacets:c})=>{if(!r.token)return;let l=++p.current;if(t(e=>({...e,isLoading:!0})),e.query.trim()===``){if(!s)return;c=!0}try{let d=await h(e.filters,e.rangeFilters,i,a,o,n),f=s||e.query.trim()!==``,m={text:e.query,maxNumberOfRecordsToReturn:f?w:0,enableFacets:c,...d?{filter:d}:{},...A?{sortBy:A}:{},...j===void 0?{}:{sortAscending:j},enableCoverage:T,removeDuplicates:E,coverageDepth:D,coverageSetup:k};u&&console.log(`[performSearch] request body:`,JSON.stringify(m,null,2));let g=await(await n(`${i}/api/teams/${a}/datasets/${o}/search`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(m)})).json(),_=g.truncationIndex??-1,M=g.records||[],N=M.map(e=>e.documentKey),P=M.map(e=>e.score),F=[];f&&N.length>0&&(F=(await(await n(`${i}/api/teams/${a}/datasets/${o}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(N)})).json()).map((e,t)=>({document:e,documentKey:N[t],score:P[t]})));let I={};if(c&&g.facets){for(let[e,t]of Object.entries(g.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(I[e]={min:Math.min(...n),max:Math.max(...n)})}}let L=e.query!==b,R=e.query!==S,z=e.facetStats??{};if(L?(z={...r.initialFacetStats,...I},y(z),x(e.query)):z={...v,...I},R&&c){let n={...e.rangeBounds};for(let[e,t]of Object.entries(I))n[e]=t;t(e=>({...e,rangeBounds:n})),C(e.query)}let B=g.facets;if(c&&(!B||Object.keys(B).length===0)){B={};for(let[e,t]of Object.entries(r.initialFacetKeys))B[e]=t.map(e=>({key:e,value:null}))}if(l!==p.current)return;let V=F.filter(t=>{let n=e.query.trim();return n===``||n.length===1?!0:t.score>=O});t(e=>({...e,results:V,resultsSuppressed:!f,...c?{facets:B,facetStats:z}:{},isLoading:!1,truncationIndex:_}))}catch(e){if(console.error(`[Search] ❌ Search failed:`,e),e instanceof TypeError&&e.message.includes(`fetch`)?(console.error(`[Search] ❌ Network error - cannot reach INDX server`),console.error(`[Search] 💡 Check if server is running at:`,i)):e instanceof Error&&(e.message.includes(`401`)?(console.error(`[Search] ❌ Authentication failed`),console.error(`[Search] 💡 Your token may have expired. Create or refresh it on the IndxCloudApi website.`)):e.message.includes(`404`)?(console.error(`[Search] ❌ Dataset not found`),console.error(`[Search] 💡 Check that dataset "`+o+`" exists`)):console.error(`[Search] 💡 Error:`,e.message)),l!==p.current)return;t(t=>({...t,results:null,isLoading:!1,resultsSuppressed:!1,error:e instanceof Error?e.message:`Search failed`}))}},[e.query,e.filters,e.rangeFilters,e.facetStats,A,j,w,T,E,D,k,O,n,r.initialFacetStats,r.initialFacetKeys,r.token,v,b,S,e.rangeBounds,i,a,o,s,u,t]);(0,c.useEffect)(()=>{m.current=M},[M]);let N=(0,c.useRef)(null);(0,c.useEffect)(()=>(N.current?.cancel(),N.current=g(()=>{u&&console.log(`Debounced searchWithFacets fired`),m.current?.({enableFacets:!0})},e.facetDebounceDelayMillis??500),()=>{N.current?.cancel()}),[e.facetDebounceDelayMillis]),(0,c.useEffect)(()=>{!r.isFetchingInitial&&r.token&&!_.current&&(s&&m.current?.({enableFacets:l}),_.current=!0)},[r.isFetchingInitial,r.token,s,l]),(0,c.useEffect)(()=>{if(!r.token||!_.current)return;let n=e.query.trim(),i=n===``&&s;if(n===``&&!s){e.resultsSuppressed||t(e=>({...e,resultsSuppressed:!0}));return}return i?(N.current?.cancel(),m.current?.({enableFacets:l})):l?(u&&console.log(`Search fired`),m.current?.({enableFacets:!1}),N.current?.()):m.current?.({enableFacets:!1}),()=>{N.current?.cancel()}},[e.query,s,l]),(0,c.useEffect)(()=>{let t=d.current;if(d.current=!1,!_.current||!r.token||!t)return;let n=e.query.trim();l&&!(!s&&n===``)&&m.current?.({enableFacets:!0})},[e.filters,e.rangeFilters]),(0,c.useEffect)(()=>{if(!_.current||!r.token)return;let t=e.query.trim();l&&!(!s&&t===``)&&m.current?.({enableFacets:!0})},[A,j]),(0,c.useEffect)(()=>{!_.current||!r.token||f.current&&(f.current=!1,m.current?.({enableFacets:!1}))},[w,r.token])}var v=(0,c.createContext)(void 0),y=({children:e,url:t,team:n,dataset:r,allowEmptySearch:i=!1,maxResults:a=10,facetDebounceDelayMillis:o=500,enableFacets:s=!0,coverageDepth:l=500,removeDuplicates:d=!0,enableCoverage:f=!0,initialCoverageSetup:m={},enableDebugLogs:h=!1,preAuthenticatedToken:g})=>{let y=(0,c.useRef)(!1),b=(0,c.useRef)(!1),[x,S]=(0,c.useState)({query:``,results:null,isLoading:!1,resultsSuppressed:!i,facetDebounceDelayMillis:o,filterableFields:[],facetableFields:[],sortableFields:[],filters:{},rangeFilters:{},facetStats:{},rangeBounds:{},searchSettings:{maxNumberOfRecordsToReturn:a,coverageDepth:l,enableCoverage:f,removeDuplicates:d,minimumScore:0,showScore:!0,placeholderText:`Type to search`,coverageSetup:{coverWholeQuery:!0,coverWholeWords:!0,coverFuzzyWords:!0,coverJoinedWords:!0,coverPrefixSuffix:!0,truncate:!0,includePatternMatches:!0,minWordSize:2,levenshteinMaxWordSize:20,truncateWordHitLimit:1,truncateWordHitTolerance:0,truncationScore:65024,...m}}});(0,c.useEffect)(()=>{h&&console.log(`SearchContext mounted on client`)},[h]),(0,c.useEffect)(()=>{S(e=>({...e,facetDebounceDelayMillis:o}))},[o]);let[C]=(0,c.useState)(s),w=p({url:t,team:n,dataset:r,preAuthenticatedToken:g,enableDebugLogs:h}),T=(0,c.useCallback)((e,t={})=>{if(!w.token)throw Error(`No authentication token available`);return fetch(e,{...t,headers:{...t.headers,Authorization:`Bearer ${w.token}`}})},[w.token]);_({state:x,setState:S,authenticatedFetch:T,auth:w,url:t,team:n,dataset:r,allowEmptySearch:i,facetsEnabled:C,enableDebugLogs:h,filtersChangedByUser:y,shouldFetchMore:b});let E=(0,c.useCallback)(e=>{y.current=!1,S(t=>{let n=Object.keys(t.filters).length>0,r=Object.keys(t.rangeFilters).length>0;return{...t,query:e,filters:n?{}:t.filters,rangeFilters:r?{}:t.rangeFilters,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:a}}})},[a]),D=(0,c.useCallback)(e=>{S(t=>({...t,facetDebounceDelayMillis:e}))},[]),O=(0,c.useCallback)(e=>{S(t=>{let n={...t.searchSettings,...e};return e.coverageSetup?n.coverageSetup={...t.searchSettings.coverageSetup,...e.coverageSetup}:n.coverageSetup=t.searchSettings.coverageSetup,{...t,searchSettings:n}})},[]),k=(0,c.useCallback)(e=>{b.current=!0,S(t=>({...t,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:e}}))},[]),A=(0,c.useCallback)((e,t)=>{y.current=!0,S(n=>{let r={...n.filters},i=r[e]||[],a=i.includes(t)?i.filter(e=>e!==t):[...i,t];return a.length?r[e]=a:delete r[e],{...n,filters:r}})},[]),j=(0,c.useCallback)((e,t,n)=>{y.current=!0,S(r=>({...r,rangeFilters:{...r.rangeFilters,[e]:{min:t,max:n}}}))},[]),M=(0,c.useCallback)(()=>{y.current=!0,S(e=>({...e,filters:{},rangeFilters:{}}))},[]),N=(0,c.useCallback)((e,t,n=!0)=>{n&&(y.current=!0),S(n=>{let r={...n.filters},i=(r[e]||[]).filter(e=>e!==t);return i.length>0?r[e]=i:delete r[e],{...n,filters:r}})},[]),P=(0,c.useCallback)((e,t=!0)=>{t&&(y.current=!0),S(t=>{let n={...t.rangeFilters};return delete n[e],{...t,rangeFilters:n}})},[]),F=(0,c.useCallback)((e,t)=>{S(n=>({...n,sortBy:e||void 0,sortAscending:e?t:void 0}))},[]);return(0,u.jsx)(v.Provider,{value:{state:x,isFetchingInitial:w.isFetchingInitial,authError:w.authError??void 0,allowEmptySearch:i,url:t,team:n,dataset:r,authenticatedFetch:T,setQuery:E,toggleFilter:A,setRangeFilter:j,resetFilters:M,resetSingleFilter:N,resetRangeFilter:P,setSort:F,setDebounceDelay:D,setSearchSettings:O,fetchMoreResults:k},children:e})},b=()=>{let e=(0,c.useContext)(v);if(!e)throw Error(`useSearchContext must be used within a SearchProvider`);return e},x=({className:e=``,autoFocus:t=!1,inputSize:n=`default`,showClear:r=!0,showFocus:i=!1,...a})=>{let{state:{query:o,filters:s,rangeFilters:c,searchSettings:l},setQuery:f}=b();Object.keys(s).length>0||Object.keys(c).length;let p=o.length>0;return(0,u.jsx)(d.SearchField,{type:`text`,value:o,onChange:e=>f(e.target.value),placeholder:l.placeholderText,autoFocus:t,className:e,showSearchIcon:!0,inputSize:n,showFocusBorder:i,...a,children:r&&p&&(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>f(``),"aria-label":`Clear search`,children:`Clear`})})},S={placeholder:`_placeholder_ee9qi_1`,invalid:`_invalid_ee9qi_11`},C={row:`_row_1i201_1`,content:`_content_1i201_19`,indexNumber:`_indexNumber_1i201_31`,scoreNumber:`_scoreNumber_1i201_39`,skeletonBars:`_skeletonBars_1i201_53`,skeletonBarLg:`_skeletonBarLg_1i201_59`,fade:`_fade_1i201_1`,skeletonBarSm:`_skeletonBarSm_1i201_66`},w=({skeleton:e=!1,index:t,score:n,showScore:r=!1,children:i,skeletonDelay:a=0,skeletonWidths:o=[62,38]})=>(0,u.jsxs)(`div`,{className:C.row,children:[t!==void 0&&(0,u.jsx)(`div`,{className:C.indexNumber,children:t}),(0,u.jsx)(`div`,{className:C.content,children:e?(0,u.jsxs)(`div`,{className:C.skeletonBars,children:[(0,u.jsx)(`div`,{className:C.skeletonBarLg,style:{width:`${o[0]}%`,animationDelay:`${a}s`}}),(0,u.jsx)(`div`,{className:C.skeletonBarSm,style:{width:`${o[1]}%`,animationDelay:`${a+.05}s`}})]}):i}),r&&n!==void 0&&(0,u.jsx)(`div`,{className:C.scoreNumber,children:n})]}),T={wrapper:`_wrapper_81m3c_6`,skeletonAppear:`_skeletonAppear_81m3c_1`},E=[[62,38],[75,45],[58,33],[70,42],[65,50],[55,35],[72,40],[60,30]],D=({rows:e=6})=>(0,u.jsx)(`div`,{className:T.wrapper,children:Array.from({length:e}).map((e,t)=>(0,u.jsx)(w,{skeleton:!0,skeletonDelay:t*.1,skeletonWidths:E[t%E.length]},t))}),O=({fields:e,resultsPerPage:t,children:n})=>{let{state:{results:r,resultsSuppressed:i,searchSettings:a,truncationIndex:o,query:s},isFetchingInitial:l,allowEmptySearch:p,fetchMoreResults:m}=b(),h=t??30,[g,_]=(0,c.useState)(h),v=(0,c.useRef)(0),y=(0,c.useRef)(``);(0,c.useEffect)(()=>{let e=s!==y.current;(!r||r.length<v.current||e)&&_(h),v.current=r?.length??0,y.current=s},[r,h,s]);let x=r&&r.length>g;return l?p?(0,u.jsx)(D,{rows:h}):(0,u.jsx)(`div`,{className:S.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):i||r===null?(0,u.jsx)(`div`,{className:S.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):r.length===0?(0,u.jsx)(`div`,{className:S.invalid,children:(0,u.jsx)(`p`,{children:`No results found.`})}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{children:(r??[]).slice(0,g).map((t,r)=>{let i=t.document,o=t.score,s;try{s=typeof i==`string`?JSON.parse(i):i}catch{return(0,u.jsx)(`div`,{className:S.invalid,children:(0,u.jsx)(`p`,{children:`Invalid JSON`})},r)}let c;if(e&&e.length>0){c={};for(let t of e)t in s&&(c[t]=s[t])}else c={...s};for(let e in c){let t=c[e];if(typeof t==`string`&&t.startsWith(`[`)&&t.endsWith(`]`)){let n=t.replace(/^\[|\]$/g,``);c[e]=n.split(`,`).map(e=>e.trim().replace(/^'|'$/g,``)).filter(e=>e.length>0)}}return(0,u.jsx)(w,{index:r,score:o,showScore:a.showScore,children:n(c)},r)})}),x&&(0,u.jsx)(`div`,{style:{textAlign:`center`,marginTop:`20px`},children:(0,u.jsx)(d.Button,{variant:`secondary`,size:`micro`,onClick:()=>{let e=g+h;_(e),r&&e>=r.length&&(!o||o===-1||o>r.length)&&m(r.length+h)},children:s.trim()===``?`Load more`:o!==-1&&o!==void 0&&o>0?`Load results ${g+1}-${Math.min(g+h,r.length,o)} of ${o}`:`Load more`})})]})},k={row:`_row_ujwhc_1`,title:`_title_ujwhc_8`},A=({variant:e=`default`,children:t})=>(0,u.jsx)(`div`,{className:[k.row,e===`title`?k.title:``].filter(Boolean).join(` `),children:t}),j={bar:`_bar_145f5_12`,skeletonAppear:`_skeletonAppear_145f5_1`,fade:`_fade_145f5_1`,listRows:`_listRows_145f5_19`,sliderArea:`_sliderArea_145f5_25`,sliderTrack:`_sliderTrack_145f5_32`,inputRow:`_inputRow_145f5_40`,inputBar:`_inputBar_145f5_45`},M=[65,80,55,72,60,75,50,68],N=({title:e,rows:t=5,variant:n=`list`,collapsible:r=!0,startCollapsed:i=!1})=>(0,u.jsx)(d.FilterPanelBase,{title:e,collapsible:r,collapsed:i,children:n===`slider`?(0,u.jsxs)(`div`,{className:j.sliderArea,children:[(0,u.jsx)(`div`,{className:j.sliderTrack}),(0,u.jsxs)(`div`,{className:j.inputRow,children:[(0,u.jsx)(`div`,{className:j.inputBar,style:{animationDelay:`0.1s`}}),(0,u.jsx)(`div`,{className:j.inputBar,style:{animationDelay:`0.15s`}})]})]}):(0,u.jsx)(`div`,{className:j.listRows,children:Array.from({length:t}).map((e,t)=>(0,u.jsx)(`div`,{className:j.bar,style:{width:`${M[t%M.length]}%`,animationDelay:`${t*.05}s`}},t))})}),P={list:`_list_m82u6_2`,count:`_count_m82u6_7`,countValue:`_countValue_m82u6_17`,chip:`_chip_m82u6_22`,chipLabel:`_chipLabel_m82u6_32`,grid:`_grid_m82u6_40`},F=({field:e,label:t,preserveBlankFacetState:n=!1,preserveBlankFacetStateOrder:r=!1,sortFacetsBy:i=`histogram`,limit:a=10,collapsible:o=!0,startCollapsed:s=!1,displayType:l=`checkbox`,layout:f=`list`,showActivePanel:p=!1,showCount:m=!0,showNull:h=!1,displayIfEmptyQuery:g=!0,displayCondition:_=e=>!0})=>{let{state:{facets:v,filterableFields:y,facetableFields:x,filters:S,query:C},toggleFilter:w,isFetchingInitial:T,allowEmptySearch:E}=b(),D=(0,c.useRef)(null),[O,k]=(0,c.useState)(a);if((0,c.useEffect)(()=>{k(a)},[v?.[e],a]),!E&&!C)return null;if(T||!v)return l===`toggle`?(0,u.jsx)(N,{rows:1,collapsible:!1}):(0,u.jsx)(N,{title:t,rows:Math.min(a,6),collapsible:o,startCollapsed:s});if(!_({query:C??``,filters:S,facets:v})||!g&&!C&&Object.keys(S).length<1)return null;if(!y?.includes(e)||!x?.includes(e)){let t=[];return y?.includes(e)||t.push(`filterable`),x?.includes(e)||t.push(`facetable`),(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{style:{color:`red`,fontSize:`12px`},children:[`Cannot render filter for "`,e,`": missing `,t.join(` and `),`.`]})})}let A=v?.[e];if(!A||!Array.isArray(A))return null;let j=S?.[e]??[];n&&!D.current&&A.length>0&&(D.current=A.reduce((e,t)=>(e[t.key]=t.value,e),{}));let M=new Map;n&&D.current&&Object.keys(D.current).forEach(e=>{M.set(e,0)}),A.forEach(e=>{M.set(e.key,e.value)});let F=l===`toggle`&&M.size===2&&M.has(`true`)&&(M.has(`false`)||M.has(`null`));if(M.has(`null`)){let e=M.get(`null`)??0,t=M.get(`false`)??0;M.set(`false`,(t??0)+e),M.delete(`null`)}if(l===`toggle`&&!F)return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsx)(`div`,{className:P.count,children:(0,u.jsx)(d.ToggleSwitch,{label:t,checked:!1,onChange:()=>{},disabled:!0})})});if(F){let n=M.get(`true`),r=typeof n==`number`?n:null,i=j.includes(`true`),a=r===0,o=m&&(r??0)>0?`${r}`:``;return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.ToggleSwitch,{label:t,checked:i,onChange:()=>w(e,`true`),disabled:a}),` `,o]})})}let I=Array.from(M.entries());if(h||(I=I.filter(([e])=>e!==`null`)),I.length===0&&!n)return null;if(!r)if(i===`alphabetical`){let e=I.filter(([,e])=>typeof e==`number`&&e>0).sort(([e],[t])=>e.localeCompare(t)),t=I.filter(([,e])=>e===0||e===null).sort(([e],[t])=>e.localeCompare(t));I=[...e,...t]}else if(i===`numeric`){let e=(e,t)=>{let n=Number(e),r=Number(t);return!isNaN(n)&&!isNaN(r)?n-r:e.localeCompare(t)},t=I.filter(([,e])=>typeof e==`number`&&e>0).sort(([t],[n])=>e(t,n)),n=I.filter(([,e])=>e===0||e===null).sort(([t],[n])=>e(t,n));I=[...t,...n]}else{let e=I.filter(([,e])=>typeof e==`number`&&e>0),t=I.filter(([,e])=>e===0||e===null);I=[...e,...t]}let L=typeof a==`number`&&I.length>a,R=L?I.slice(0,O):I,z=(t,n)=>{let r=j.includes(t),i=n===0,a=m&&(n??0)>0?` (${n})`:``,o=m&&(n??0)>0?n:``;switch(l){case`button`:return f===`list`?(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>w(e,t),disabled:i,size:`micro`,className:P.chip,title:t,children:(0,u.jsx)(`span`,{className:P.chipLabel,children:t})}),(0,u.jsx)(`span`,{className:P.countValue,children:o})]}):(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>w(e,t),disabled:i,size:`micro`,className:P.chip,title:`${t}${a}`,children:(0,u.jsx)(`span`,{className:P.chipLabel,children:`${t}${a}`})});case`toggle`:return(0,u.jsx)(d.ToggleSwitch,{label:t,checked:r,onChange:()=>w(e,t),disabled:i});default:return f===`list`?(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.Checkbox,{label:t,score:``,checked:r,onChange:()=>w(e,t),disabled:i}),(0,u.jsx)(`span`,{children:o})]}):(0,u.jsx)(d.Checkbox,{label:t,score:a,checked:r,onChange:()=>w(e,t),disabled:i})}};return(0,u.jsx)(d.FilterPanelBase,{title:t,collapsible:o,collapsed:o?s:!1,children:(0,u.jsxs)(`ul`,{className:f===`grid`?P.grid:P.list,style:{listStyle:`none`,padding:0,margin:0},children:[R.map(([e,t])=>(0,u.jsx)(`li`,{children:z(e,t)},e)),L&&O<I.length&&(()=>{let e=I.length-O,t=Math.min(50,e);return(0,u.jsx)(`li`,{className:P.toggleItem,children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>k(e=>e+50),children:`Show ${t} more of ${I.length} total`})})})()]})})},I={disabledMessage:`_disabledMessage_uci6n_1`,histogram:`_histogram_uci6n_6`,histogramBar:`_histogramBar_uci6n_15`},L=({field:e,label:t,expectedMin:n=0,expectedMax:r=1e3,displayType:i=`input`,collapsible:a=!0,startCollapsed:o=!1,showHistogram:s=!1,resolution:l})=>{let{state:{rangeFilters:f,rangeBounds:p,facetStats:m,facets:h,facetableFields:g,query:_,facetDebounceDelayMillis:v},setRangeFilter:y,resetRangeFilter:x,allowEmptySearch:S,isFetchingInitial:C}=b(),w=p?.[e]!==void 0,T=p?.[e]??{min:n,max:r},E=T.min,D=T.max,O=m?.[e]??T,k=Math.max(E,Math.min(D,O.min)),A=Math.max(E,Math.min(D,O.max)),j=w&&E===D,M=j?n:E,P=j?r:D,F=f?.[e],L=F?F.min:E,R=F?F.max:D,z=F!==void 0,B=k!==E||A!==D,[V,H]=c.default.useState([L,R]),[U,W]=c.default.useState(!1),[G,K]=c.default.useState(!1),{finalMin:q,finalMax:J,isValidMin:Y,isValidMax:X}=c.default.useMemo(()=>{let[e,t]=V,n=Math.max(E,Math.min(D,e)),r=Math.max(E,Math.min(D,t)),i=Math.min(n,r),a=Math.max(n,r);return{finalMin:i,finalMax:a,isValidMin:i>=E&&i<a,isValidMax:a<=D&&a>i}},[V,E,D]);c.default.useEffect(()=>{if(j)return;if(V[0]===E&&V[1]===D){W(!1),K(!1);return}let t=v??500,n=setTimeout(()=>{W(!Y),K(!X)},300),r=setTimeout(()=>{Y&&X&&(q===E&&J===D?x(e,!1):y(e,q,J))},t);return()=>{clearTimeout(n),clearTimeout(r)}},[q,J,Y,X,E,D,e,x,y,v,j]),c.default.useEffect(()=>{H([L,R]),W(!1),K(!1)},[L,R,e]);let ee=c.default.useCallback(e=>{j||H([Math.max(E,Math.min(A,e[0])),Math.max(k,Math.min(D,e[1]))])},[j,E,D,k,A]),te=c.default.useCallback(t=>{if(j)return;let n=Math.max(E,Math.min(A,t[0])),r=Math.max(k,Math.min(D,t[1]));n===E&&r===D?(H([E,D]),x(e,!0)):H([n,r])},[j,E,D,k,A,e,x]),ne=c.default.useCallback(e=>{if(j)return;let t=Number(e.target.value);isNaN(t)||H([Math.max(E,Math.min(A,t)),V[1]])},[j,V,E,A]),re=c.default.useCallback(e=>{if(j)return;let t=Number(e.target.value);if(!isNaN(t)){let e=Math.max(k,Math.min(D,t));H([V[0],e])}},[j,V,k,D]),ie=c.default.useCallback(()=>{let e=V[0],t=Math.max(E,Math.min(A,e));t<V[1]?H([t,V[1]]):H([E,V[1]])},[V,E,A]),ae=c.default.useCallback(()=>{let e=V[1],t=Math.max(k,Math.min(D,e));t>V[0]?H([V[0],t]):H([V[0],D])},[V,k,D]),[Z,oe]=c.default.useState(null),Q=c.default.useRef(null);c.default.useEffect(()=>{if(!s)return;let t=`${E}:${D}`;if(t===Q.current&&Q.current!==null)return;let n=h?.[e];if(!Array.isArray(n)||n.length===0)return;let r=n.filter(e=>e.value!=null&&!isNaN(Number(e.key))).map(e=>({key:e.key,value:e.value}));r.length>0&&(Q.current=t,oe(r))},[E,D,h,e,s]);let $=c.default.useMemo(()=>{if(!s||!Z||Z.length===0)return[];let e=D-E;if(e<=0)return[];let t=l??(Math.ceil(e/20)||1),n=Math.ceil(e/t);return Array.from({length:n},(e,n)=>{let r=E+n*t,i=E+(n+1)*t;return{bucketStart:r,bucketEnd:i,count:Z.filter(e=>{let t=Number(e.key);return t>=r&&t<i}).reduce((e,t)=>e+t.value,0)}})},[s,Z,E,D,l]),se=c.default.useMemo(()=>Math.max(...$.map(e=>e.count),1),[$]);return s&&!C&&!g?.includes(e)&&console.warn(`RangeFilterPanel: showHistogram=true but field "${e}" is not facetable. Add .Facetable = true to this field.`),C?(0,u.jsx)(N,{title:t,variant:`slider`,collapsible:a,startCollapsed:o}):!S&&!_?null:i===`slider`?(0,u.jsxs)(d.FilterPanelBase,{title:t,collapsed:o,collapsible:a,children:[j&&(0,u.jsxs)(`div`,{className:I.disabledMessage,children:[`No adjustable range (all results have the same value: `,E,`).`]}),s&&$.length>0&&(0,u.jsx)(`div`,{className:I.histogram,children:(()=>{let e=typeof k==`number`&&typeof A==`number`&&A>k&&(k>E||A<D);return $.map((t,n)=>{let r=Math.max(1,Math.ceil(t.count/se*20)),i=e?t.bucketEnd>k&&t.bucketStart<A:t.bucketEnd>q&&t.bucketStart<J;return(0,u.jsx)(`div`,{className:I.histogramBar,"data-testid":`histogram-bar`,"data-active":i,style:{height:`${r}px`,background:i?`var(--lv5)`:`var(--lv3)`}},n)})})()}),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:M,max:P,value:j?[M,P]:[q,J],isRange:!0,onChange:e=>ee(e),onFinalChange:e=>te(e),disabled:j,activeMin:k,activeMax:A,isFaceted:B,highlightFaceted:z,"aria-label":t||`Filter by ${e}`})}),(0,u.jsxs)(`div`,{style:{display:`flex`,flex:`flex-grow`,gap:`10px`,alignItems:`flex-start`,justifyContent:`space-between`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:j?E:V[0],min:E,max:Math.min(A,V[1]-1),onChange:ne,onBlur:ie,disabled:j,isValid:j||!U}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:j?D:V[1],min:Math.max(k,V[0]+1),max:D,onChange:re,onBlur:ae,disabled:j,isValid:j||!G})]})]}):(0,u.jsxs)(d.FilterPanelBase,{title:t,children:[j&&(0,u.jsxs)(`div`,{className:I.disabledMessage,children:[`No adjustable range (all results have the same value: `,E,`).`]}),(0,u.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,alignItems:`flex-start`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:j?E:V[0],min:E,max:Math.min(A,V[1]-1),onChange:ne,onBlur:ie,disabled:j,isValid:j||!U}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:j?D:V[1],min:Math.max(k,V[0]+1),max:D,onChange:re,onBlur:ae,disabled:j,isValid:j||!G})]})]})},R={grid:`_grid_xm2uh_2`,chip:`_chip_xm2uh_17`,chipLabel:`_chipLabel_xm2uh_28`},z=(0,c.memo)(({field:e,value:t,onReset:n})=>(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:n,iconRight:(0,u.jsx)(f.X_or_error,{}),variant:`primary`,size:`micro`,className:R.chip,title:`${e}: ${t}`,children:(0,u.jsxs)(`span`,{className:R.chipLabel,children:[e,`: `,t]})})})),B=(0,c.memo)(({field:e,min:t,max:n,onReset:r})=>(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:r,iconRight:(0,u.jsx)(f.X_or_error,{}),variant:`primary`,size:`micro`,className:R.chip,title:`${e}: ${t} – ${n}`,children:(0,u.jsxs)(`span`,{className:R.chipLabel,children:[e,`: `,t,` – `,n]})})}));function V(){let{state:{filters:e,rangeFilters:t},resetFilters:n,resetSingleFilter:r,resetRangeFilter:i}=b(),a=(0,c.useMemo)(()=>Object.entries(e).map(([e,t])=>t.map(t=>({field:e,value:t}))).flat(),[e]),o=(0,c.useMemo)(()=>Object.entries(t).map(([e,{min:t,max:n}])=>({field:e,min:t,max:n})),[t]);return(0,c.useMemo)(()=>Object.keys(e).length>0||Object.keys(t).length>0,[e,t])?(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,title:`Active filters`,children:(0,u.jsxs)(`ul`,{className:R.grid,children:[a.map(({field:e,value:t})=>(0,u.jsx)(z,{field:e,value:t,onReset:()=>r(e,t)},`${e}-${t}`)),o.map(({field:e,min:t,max:n})=>(0,u.jsx)(B,{field:e,min:t,max:n,onReset:()=>i(e)},e)),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:n,size:`micro`,variant:`ghost`,children:`Reset`})})]})}):null}var H={select:`_select_nwf7i_1`,radioGroup:`_radioGroup_nwf7i_6`},U=({displayType:e=`dropdown`,collapsible:t=!0,startCollapsed:n=!1})=>{let{state:{sortableFields:r,sortBy:i,sortAscending:a},setSort:o,isFetchingInitial:s}=b();if(s)return(0,u.jsx)(N,{title:`Sort by`,rows:e===`radio`?3:1,collapsible:t,startCollapsed:n});if(!r||r.length===0)return null;let c=i?`${i}:${a?`asc`:`desc`}`:`none`,l=[{label:`None`,value:`none`},...r.flatMap(e=>[{label:`${e} (asc)`,value:`${e}:asc`},{label:`${e} (desc)`,value:`${e}:desc`}])],f=e=>{if(e===`none`||e===``)o(null,!0);else{let[t,n]=e.split(`:`);o(t,n===`asc`)}};return(0,u.jsx)(d.FilterPanelBase,{title:`Sort by`,collapsible:t,collapsed:t?n:!1,children:e===`dropdown`?(0,u.jsx)(d.Select,{value:c,onValueChange:f,options:l,placeholder:`Select sort...`,"aria-label":`Sort by`}):(0,u.jsx)(`div`,{className:H.radioGroup,children:l.map(e=>(0,u.jsx)(d.RadioButton,{id:`sort-${e.value}`,name:`sort-by`,value:e.value,label:e.label,checked:c===e.value,onChange:e=>f(e.target.value)},e.value))})})},W={list:`_list_1y4fk_1`};function G(){let{state:{searchSettings:e},setSearchSettings:t}=b(),[n,r]=(0,c.useState)(!1),i=(e,n)=>{let r=parseInt(n,10);isNaN(r)||t({[e]:r})},a=(e,n)=>{t({[e]:n})},o=(n,r)=>{let i=parseInt(r,10);isNaN(i)||t({coverageSetup:{...e.coverageSetup,[n]:i}})},s=(n,r)=>{t({coverageSetup:{...e.coverageSetup,[n]:r}})};return(0,u.jsx)(d.FilterPanelBase,{collapsed:!0,title:`Settings`,children:(0,u.jsxs)(`ul`,{className:W.list,children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Max Results`,type:`number`,value:e.maxNumberOfRecordsToReturn.toString(),onChange:e=>i(`maxNumberOfRecordsToReturn`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Coverage Depth`,type:`number`,value:e.coverageDepth.toString(),onChange:e=>i(`coverageDepth`,e.target.value)})}),(0,u.jsxs)(`li`,{children:[(0,u.jsx)(d.InputField,{label:`Minimum Score (16 bit)`,type:`number`,value:e.minimumScore.toString(),min:`0`,max:`65535`,onChange:e=>{let n=parseFloat(e.target.value);isNaN(n)||t({minimumScore:n})}}),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:0,max:65535,step:5e3,value:e.minimumScore,onChange:e=>{t({minimumScore:e})},"aria-label":`Minimum score`})})]}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Placeholder text`,type:`text`,value:e.placeholderText,onChange:e=>{t({placeholderText:e.target.value})}})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Show score`,checked:e.showScore,onChange:e=>a(`showScore`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Enable Coverage`,checked:e.enableCoverage,onChange:e=>a(`enableCoverage`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Remove Duplicates`,checked:e.removeDuplicates,onChange:e=>a(`removeDuplicates`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,iconRight:n?(0,u.jsx)(f.ArrowDown,{}):(0,u.jsx)(f.ArrowRight,{}),onClick:()=>r(e=>!e),children:n?`Hide Coverage Setup`:`Show Coverage Setup`})}),n&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Whole Query`,checked:e.coverageSetup.coverWholeQuery,onChange:e=>s(`coverWholeQuery`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Whole Words`,checked:e.coverageSetup.coverWholeWords,onChange:e=>s(`coverWholeWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Fuzzy Words`,checked:e.coverageSetup.coverFuzzyWords,onChange:e=>s(`coverFuzzyWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Joined Words`,checked:e.coverageSetup.coverJoinedWords,onChange:e=>s(`coverJoinedWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Prefix Suffix`,checked:e.coverageSetup.coverPrefixSuffix,onChange:e=>s(`coverPrefixSuffix`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Truncate`,checked:e.coverageSetup.truncate,onChange:e=>s(`truncate`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Include Pattern Matches`,checked:e.coverageSetup.includePatternMatches,onChange:e=>s(`includePatternMatches`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Levenshtein Max Word Size`,type:`number`,value:e.coverageSetup.levenshteinMaxWordSize.toString(),onChange:e=>o(`levenshteinMaxWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Min Word Size`,type:`number`,value:e.coverageSetup.minWordSize.toString(),onChange:e=>o(`minWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Truncate Word Hit Limit`,type:`number`,value:e.coverageSetup.truncateWordHitLimit.toString(),onChange:e=>o(`truncateWordHitLimit`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Truncate Word Hit Tolerance`,type:`number`,value:e.coverageSetup.truncateWordHitTolerance.toString(),onChange:e=>o(`truncateWordHitTolerance`,e.target.value)})})]})]})})}var K=class extends c.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error(`[SearchErrorBoundary] Caught error:`,e,t)}reset=()=>{this.setState({hasError:!1,error:null})};render(){return this.state.hasError&&this.state.error?this.props.fallback?this.props.fallback(this.state.error,this.reset):(0,u.jsxs)(`div`,{style:{padding:`2rem`,backgroundColor:`#fee`,border:`2px solid #c33`,borderRadius:`8px`,maxWidth:`600px`,margin:`2rem auto`},children:[(0,u.jsx)(`h2`,{style:{color:`#c33`,marginTop:0},children:`⚠️ Search Initialization Error`}),(0,u.jsxs)(`p`,{style:{marginBottom:`1rem`},children:[(0,u.jsx)(`strong`,{children:`Error:`}),` `,this.state.error.message]}),(0,u.jsxs)(`div`,{style:{backgroundColor:`#fff`,padding:`1rem`,borderRadius:`4px`,marginBottom:`1rem`,fontSize:`0.9rem`},children:[(0,u.jsx)(`strong`,{children:`💡 Common fixes:`}),(0,u.jsxs)(`ul`,{style:{marginBottom:0,paddingLeft:`1.5rem`},children:[(0,u.jsx)(`li`,{children:`Check browser console for detailed error messages`}),(0,u.jsx)(`li`,{children:`Verify the url passed to SearchProvider is correct`}),(0,u.jsx)(`li`,{children:`Verify your bearer token is valid (create or check it on the IndxCloudApi website)`}),(0,u.jsx)(`li`,{children:`Ensure INDX server is running`}),(0,u.jsx)(`li`,{children:`Check dataset name spelling`})]})]}),(0,u.jsx)(`button`,{onClick:this.reset,style:{padding:`0.5rem 1rem`,backgroundColor:`#c33`,color:`white`,border:`none`,borderRadius:`4px`,cursor:`pointer`,fontWeight:`bold`},children:`Try Again`})]}):this.props.children}};function q(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=b(),[o,s]=(0,c.useState)(null),[l,u]=(0,c.useState)(!1),[d,f]=(0,c.useState)(void 0);return{results:o,isLoading:l,error:d,search:(0,c.useCallback)(async o=>{u(!0),f(void 0);try{let c=await e(o),l={fieldName:t.fieldName,vector:c,maxResults:t.maxResults??10};t.filter&&(l.filter=t.filter);let u=await a(`${n}/api/teams/${r}/datasets/${i}/search/vector`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)});if(!u.ok)throw Error(`VectorSearch failed: ${u.status}`);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),p=await a(`${n}/api/teams/${r}/datasets/${i}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!p.ok)throw Error(`GetJson failed: ${p.status}`);s((await p.json()).map((e,t)=>({document:e,documentKey:f[t],score:d[t].score})))}catch(e){f(e instanceof Error?e.message:`Vector search failed`),s(null)}finally{u(!1)}},[e,t.fieldName,t.maxResults,t.filter,n,r,i,a])}}function J(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=b(),[o,s]=(0,c.useState)(null),[l,u]=(0,c.useState)(!1),[d,f]=(0,c.useState)(void 0);return{results:o,isLoading:l,error:d,search:(0,c.useCallback)(async o=>{u(!0),f(void 0);try{let c=await e(o),l={text:o,embeddingField:t.fieldName,vector:c,maxNumberOfRecordsToReturn:t.maxResults??10,alpha:t.alpha??.5};t.filter&&(l.filter=t.filter),t.timeoutMs&&(l.timeOutLimitMilliseconds=t.timeoutMs);let u=await a(`${n}/api/teams/${r}/datasets/${i}/search/hybrid`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)});if(!u.ok)throw Error(`HybridSearch failed: ${u.status}`);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),p=await a(`${n}/api/teams/${r}/datasets/${i}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!p.ok)throw Error(`GetJson failed: ${p.status}`);s((await p.json()).map((e,t)=>({document:e,documentKey:f[t],score:d[t].score})))}catch(e){f(e instanceof Error?e.message:`Hybrid search failed`),s(null)}finally{u(!1)}},[e,t.fieldName,t.alpha,t.maxResults,t.filter,t.timeoutMs,n,r,i,a])}}exports.ActiveFiltersPanel=V,exports.FilterPanelSkeleton=N,exports.RangeFilterPanel=L,exports.SearchContext=v,exports.SearchErrorBoundary=K,exports.SearchInput=x,exports.SearchProvider=y,exports.SearchResult=w,exports.SearchResultRow=A,exports.SearchResults=O,exports.SearchResultsSkeleton=D,exports.SearchSettingsPanel=G,exports.SortByPanel=U,exports.ValueFilterPanel=F,exports.useHybridSearch=J,exports.useSearch=b,exports.useSearchContext=b,exports.useVectorSearch=q;
package/dist/index.es.js CHANGED
@@ -6,27 +6,16 @@ import { Button as m, Checkbox as h, FilterPanelBase as g, InputField as _, Radi
6
6
  import { ArrowDown as C, ArrowRight as w, Indx as T, X_or_error as E } from "@indxsearch/pixl";
7
7
  //#region src/context/useIndxAuth.ts
8
8
  function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugLogs: i = !1 }) {
9
- let [a, s] = l(null), [c, d] = l(!0), [f, p] = l([]), [m, h] = l([]), [g, _] = l([]), [v, y] = l({}), [b, x] = l({}), [S, C] = l(0);
9
+ let [a, s] = l(null), [c, d] = l(!0), [f, p] = l([]), [m, h] = l([]), [g, _] = l([]), [v, y] = l({}), [b, x] = l({}), [S, C] = l(0), [w, T] = l(null);
10
10
  return o(() => {
11
11
  (async () => {
12
+ T(null);
12
13
  try {
13
14
  if (!r) throw console.error("[Auth] ❌ Missing bearer token"), console.error("[Auth] 💡 Pass preAuthenticatedToken to SearchProvider (create a token on the IndxCloudApi website)"), Error("A bearer token is required. Check console for instructions.");
14
15
  if (!e) throw console.error("[Auth] ❌ Missing INDX server URL"), console.error("[Auth] 💡 Pass a url to SearchProvider"), Error("INDX server URL is required. Check console for instructions.");
15
16
  if (!n) throw console.error("[Auth] ❌ Missing dataset name"), console.error("[Auth] 💡 Pass dataset=\"your-dataset-name\" to SearchProvider"), Error("Dataset name is required. Check console for instructions.");
16
17
  i && console.log("[Auth] ✅ Using bearer token");
17
- let a = r;
18
- i && console.log("[Auth] 🔓 Opening dataset session...");
19
- let o = await fetch(`${e}/api/teams/${t}/datasets/${n}/CreateOrOpen/400`, {
20
- method: "PUT",
21
- headers: {
22
- "Content-Type": "application/json",
23
- Authorization: `Bearer ${a}`
24
- },
25
- body: "\"\""
26
- });
27
- if (!o.ok) throw console.error("[Auth] ❌ CreateOrOpen failed:", o.status, await o.text()), Error("Failed to open dataset session.");
28
- s(a), i && console.log("[Auth] ✅ Dataset session established");
29
- let c = (e) => fetch(e, {
18
+ let a = r, o = (e) => fetch(e, {
30
19
  method: "GET",
31
20
  headers: {
32
21
  accept: "text/plain",
@@ -34,23 +23,33 @@ function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugL
34
23
  }
35
24
  });
36
25
  i && console.log("[Auth] 🔍 Checking dataset status...");
37
- let l = await c(`${e}/api/teams/${t}/datasets/${n}/GetStatus`);
38
- if (!l.ok) {
39
- if (l.status === 401) throw console.error("[Auth] ❌ Authentication failed (401 Unauthorized)"), console.error("[Auth] 💡 Your token may be expired or invalid"), console.error("[Auth] 💡 Create or refresh your token on the IndxCloudApi website"), Error("Authentication failed (401). Token may be expired. Check console for instructions.");
40
- if (l.status === 404) throw console.error("[Auth] ❌ Dataset \"" + n + "\" not found (404)"), console.error("[Auth] 💡 Available datasets can be checked with: curl -X GET \"" + e + "/api/me/datasets\" -H \"Authorization: Bearer YOUR_TOKEN\""), console.error("[Auth] 💡 Make sure you spelled the dataset name correctly"), Error("Dataset \"" + n + "\" not found. Check console for instructions.");
26
+ let c = await o(`${e}/api/teams/${t}/datasets/${n}/status`);
27
+ if (!c.ok) {
28
+ if (c.status === 401) throw console.error("[Auth] ❌ Authentication failed (401 Unauthorized)"), console.error("[Auth] 💡 Your token may be expired or invalid"), console.error("[Auth] 💡 Create or refresh your token on the IndxCloudApi website"), Error("Authentication failed (401). Token may be expired. Check console for instructions.");
29
+ if (c.status === 404) throw console.error("[Auth] ❌ Dataset \"" + n + "\" not found (404)"), console.error("[Auth] 💡 Available datasets can be checked with: curl -X GET \"" + e + "/api/me/datasets\" -H \"Authorization: Bearer YOUR_TOKEN\""), console.error("[Auth] 💡 Make sure you spelled the dataset name correctly"), Error("Dataset \"" + n + "\" not found. Check console for instructions.");
41
30
  {
42
- let t = await l.text();
43
- throw console.error("[Auth] ❌ Failed to get dataset status:", l.status, t), console.error("[Auth] 💡 Check if your INDX server is running at:", e), Error("Failed to connect to INDX server. Check console for details.");
31
+ let t = await c.text();
32
+ throw console.error("[Auth] ❌ Failed to get dataset status:", c.status, t), console.error("[Auth] 💡 Check if your INDX server is running at:", e), Error("Failed to connect to INDX server. Check console for details.");
44
33
  }
45
34
  }
46
- let d = await l.json();
47
- i && console.log("[Auth] 📊 Dataset status:", d), d.systemState !== void 0 && d.systemState !== u.Ready && (console.warn("[Auth] ⚠️ Dataset is not ready yet. Current state:", u[d.systemState]), console.warn("[Auth] 💡 Wait for indexing to complete before searching"));
48
- let f = d.documentCount ?? d.numberOfRecords ?? 0;
35
+ let l = await c.json();
36
+ i && console.log("[Auth] 📊 Dataset status:", l), i && console.log("[Auth] 🔓 Opening dataset session...");
37
+ let d = await fetch(`${e}/api/teams/${t}/datasets/${n}?configuration=400`, {
38
+ method: "PUT",
39
+ headers: {
40
+ "Content-Type": "application/json",
41
+ Authorization: `Bearer ${a}`
42
+ },
43
+ body: "\"\""
44
+ });
45
+ if (!d.ok) throw console.error("[Auth] ❌ CreateOrOpen failed:", d.status, await d.text()), Error("Failed to open dataset session.");
46
+ s(a), i && console.log("[Auth] ✅ Dataset session established"), l.systemState !== void 0 && l.systemState !== u.Ready && (console.warn("[Auth] ⚠️ Dataset is not ready yet. Current state:", u[l.systemState]), console.warn("[Auth] 💡 Wait for indexing to complete before searching"));
47
+ let f = l.documentCount ?? l.numberOfRecords ?? 0;
49
48
  f === 0 ? (console.warn("[Auth] ⚠️ Dataset \"" + n + "\" is empty (0 records)"), console.warn("[Auth] 💡 Add documents to your dataset before searching"), console.warn("[Auth] 💡 Search will work but return no results")) : i && console.log("[Auth] ✅ Dataset has", f, "records");
50
49
  let [m, g, v] = await Promise.all([
51
- c(`${e}/api/teams/${t}/datasets/${n}/GetFilterableFields`),
52
- c(`${e}/api/teams/${t}/datasets/${n}/GetFacetableFields`),
53
- c(`${e}/api/teams/${t}/datasets/${n}/GetSortableFields`)
50
+ o(`${e}/api/teams/${t}/datasets/${n}/fields/filterable`),
51
+ o(`${e}/api/teams/${t}/datasets/${n}/fields/facetable`),
52
+ o(`${e}/api/teams/${t}/datasets/${n}/fields/sortable`)
54
53
  ]);
55
54
  if (!m.ok) throw console.error("[Auth] ❌ GetFilterableFields failed:", m.status, await m.text()), Error("Failed to get filterable fields. Check console for details.");
56
55
  if (!g.ok) throw console.error("[Auth] ❌ GetFacetableFields failed:", g.status, await g.text()), Error("Failed to get facetable fields. Check console for details.");
@@ -63,7 +62,7 @@ function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugL
63
62
  p(b || []), h(S || []), _(w || []), C(f);
64
63
  let T = { facets: {} };
65
64
  try {
66
- let r = await fetch(`${e}/api/teams/${t}/datasets/${n}/Search`, {
65
+ let r = await fetch(`${e}/api/teams/${t}/datasets/${n}/search`, {
67
66
  method: "POST",
68
67
  headers: {
69
68
  "Content-Type": "application/json",
@@ -93,7 +92,7 @@ function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugL
93
92
  if (T.facets) for (let [e, t] of Object.entries(T.facets)) Array.isArray(t) && (D[e] = t.map((e) => e.key));
94
93
  y(E), x(D), i && console.log("[Auth] ✅ Initialization complete");
95
94
  } catch (t) {
96
- throw console.error("[Auth] ❌ Initialization failed:", t), (t instanceof Error || typeof t == "object" && t && "message" in t) && console.error("[Auth] 💡 Error:", t.message), t instanceof TypeError && t.message.includes("fetch") && (console.error("[Auth] ❌ Network error - cannot connect to INDX server"), console.error("[Auth] 💡 Check if the server is running at:", e), console.error("[Auth] 💡 Check the url you passed to SearchProvider"), console.error("[Auth] 💡 For local development, it should be: http://localhost:5001")), t;
95
+ console.error("[Auth] ❌ Initialization failed:", t), (t instanceof Error || typeof t == "object" && t && "message" in t) && console.error("[Auth] 💡 Error:", t.message), t instanceof TypeError && t.message.includes("fetch") && (console.error("[Auth] ❌ Network error - cannot connect to INDX server"), console.error("[Auth] 💡 Check if the server is running at:", e), console.error("[Auth] 💡 Check the url you passed to SearchProvider"), console.error("[Auth] 💡 For local development, it should be: http://localhost:5001")), T(t instanceof Error ? t.message : String(t));
97
96
  } finally {
98
97
  d(!1);
99
98
  }
@@ -105,6 +104,7 @@ function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugL
105
104
  ]), {
106
105
  token: a,
107
106
  isFetchingInitial: c,
107
+ authError: w,
108
108
  initialFacetStats: v,
109
109
  initialFacetKeys: b,
110
110
  filterableFields: f,
@@ -120,8 +120,8 @@ async function O(e, t, n, r, i) {
120
120
  if (e.length === 1) return e[0];
121
121
  let a = e[0];
122
122
  for (let o = 1; o < e.length; o++) {
123
- let s = await i(`${t}/api/teams/${n}/datasets/${r}/CombineFilters`, {
124
- method: "PUT",
123
+ let s = await i(`${t}/api/teams/${n}/datasets/${r}/filters/combine`, {
124
+ method: "POST",
125
125
  headers: { "Content-Type": "application/json" },
126
126
  body: JSON.stringify({
127
127
  a,
@@ -138,15 +138,15 @@ async function O(e, t, n, r, i) {
138
138
  return a;
139
139
  }
140
140
  async function k(e, t, n, r, i, a) {
141
- let o = Object.entries(e ?? {}), s = Object.entries(t ?? {}), [c, l] = await Promise.all([Promise.all(o.map(([e, t]) => Promise.all(t.map((t) => a(`${n}/api/teams/${r}/datasets/${i}/CreateValueFilter`, {
142
- method: "PUT",
141
+ let o = Object.entries(e ?? {}), s = Object.entries(t ?? {}), [c, l] = await Promise.all([Promise.all(o.map(([e, t]) => Promise.all(t.map((t) => a(`${n}/api/teams/${r}/datasets/${i}/filters/value`, {
142
+ method: "POST",
143
143
  headers: { "Content-Type": "application/json" },
144
144
  body: JSON.stringify({
145
145
  fieldName: e,
146
146
  value: t
147
147
  })
148
- }).then((e) => e.json()))))), Promise.all(s.map(([e, { min: t, max: o }]) => a(`${n}/api/teams/${r}/datasets/${i}/CreateRangeFilter`, {
149
- method: "PUT",
148
+ }).then((e) => e.json()))))), Promise.all(s.map(([e, { min: t, max: o }]) => a(`${n}/api/teams/${r}/datasets/${i}/filters/range`, {
149
+ method: "POST",
150
150
  headers: { "Content-Type": "application/json" },
151
151
  body: JSON.stringify({
152
152
  fieldName: e,
@@ -209,12 +209,12 @@ function j({ state: e, setState: t, authenticatedFetch: n, auth: r, url: a, team
209
209
  coverageSetup: M
210
210
  };
211
211
  p && console.log("[performSearch] request body:", JSON.stringify(f, null, 2));
212
- let m = await (await n(`${a}/api/teams/${s}/datasets/${u}/Search`, {
212
+ let m = await (await n(`${a}/api/teams/${s}/datasets/${u}/search`, {
213
213
  method: "POST",
214
214
  headers: { "Content-Type": "application/json" },
215
215
  body: JSON.stringify(f)
216
216
  })).json(), h = m.truncationIndex ?? -1, _ = m.records || [], v = _.map((e) => e.documentKey), A = _.map((e) => e.score), F = [];
217
- l && v.length > 0 && (F = (await (await n(`${a}/api/teams/${s}/datasets/${u}/GetJson`, {
217
+ l && v.length > 0 && (F = (await (await n(`${a}/api/teams/${s}/datasets/${u}/documents/lookup`, {
218
218
  method: "POST",
219
219
  headers: { "Content-Type": "application/json" },
220
220
  body: JSON.stringify(v)
@@ -527,6 +527,7 @@ var M = n(void 0), N = ({ children: e, url: t, team: n, dataset: r, allowEmptySe
527
527
  value: {
528
528
  state: x,
529
529
  isFetchingInitial: w.isFetchingInitial,
530
+ authError: w.authError ?? void 0,
530
531
  allowEmptySearch: a,
531
532
  url: t,
532
533
  team: n,
@@ -1599,7 +1600,7 @@ function se(e, t) {
1599
1600
  maxResults: t.maxResults ?? 10
1600
1601
  };
1601
1602
  t.filter && (l.filter = t.filter);
1602
- let u = await o(`${n}/api/teams/${r}/datasets/${a}/VectorSearch`, {
1603
+ let u = await o(`${n}/api/teams/${r}/datasets/${a}/search/vector`, {
1603
1604
  method: "POST",
1604
1605
  headers: { "Content-Type": "application/json" },
1605
1606
  body: JSON.stringify(l)
@@ -1610,7 +1611,7 @@ function se(e, t) {
1610
1611
  c([]);
1611
1612
  return;
1612
1613
  }
1613
- let f = d.map((e) => e.documentKey), p = await o(`${n}/api/teams/${r}/datasets/${a}/GetJson`, {
1614
+ let f = d.map((e) => e.documentKey), p = await o(`${n}/api/teams/${r}/datasets/${a}/documents/lookup`, {
1614
1615
  method: "POST",
1615
1616
  headers: { "Content-Type": "application/json" },
1616
1617
  body: JSON.stringify(f)
@@ -1657,7 +1658,7 @@ function ce(e, t) {
1657
1658
  alpha: t.alpha ?? .5
1658
1659
  };
1659
1660
  t.filter && (l.filter = t.filter), t.timeoutMs && (l.timeOutLimitMilliseconds = t.timeoutMs);
1660
- let u = await o(`${n}/api/teams/${r}/datasets/${a}/HybridSearch`, {
1661
+ let u = await o(`${n}/api/teams/${r}/datasets/${a}/search/hybrid`, {
1661
1662
  method: "POST",
1662
1663
  headers: { "Content-Type": "application/json" },
1663
1664
  body: JSON.stringify(l)
@@ -1668,7 +1669,7 @@ function ce(e, t) {
1668
1669
  c([]);
1669
1670
  return;
1670
1671
  }
1671
- let f = d.map((e) => e.documentKey), p = await o(`${n}/api/teams/${r}/datasets/${a}/GetJson`, {
1672
+ let f = d.map((e) => e.documentKey), p = await o(`${n}/api/teams/${r}/datasets/${a}/documents/lookup`, {
1672
1673
  method: "POST",
1673
1674
  headers: { "Content-Type": "application/json" },
1674
1675
  body: JSON.stringify(f)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indxsearch/intrface",
3
- "version": "3.0.0-alpha.20260617",
3
+ "version": "3.0.1",
4
4
  "description": "Indx Search interface components for React. Provides ready-to-use filter panels, search inputs, faceted navigation, and sorting components. Built on @indxsearch/systm.",
5
5
  "keywords": [
6
6
  "indx",
@@ -71,7 +71,7 @@
71
71
  "./styles.css": "./dist/intrface.css"
72
72
  },
73
73
  "dependencies": {
74
- "@indxsearch/indx-types": "2.0.0-alpha.20260617",
74
+ "@indxsearch/indx-types": "^2.0.0",
75
75
  "@indxsearch/pixl": "^1.4.0",
76
76
  "@indxsearch/systm": "^2.2.0",
77
77
  "react-range": "^1.10.0"