@seekora-ai/ui-sdk-react 0.2.0 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/components/SearchResults.d.ts.map +1 -1
  2. package/dist/components/SearchResults.js +24 -58
  3. package/dist/docsearch/components/DocSearch.d.ts +4 -0
  4. package/dist/docsearch/components/DocSearch.d.ts.map +1 -0
  5. package/dist/docsearch/components/DocSearch.js +81 -0
  6. package/dist/docsearch/components/DocSearchButton.d.ts +4 -0
  7. package/dist/docsearch/components/DocSearchButton.d.ts.map +1 -0
  8. package/dist/docsearch/components/DocSearchButton.js +12 -0
  9. package/dist/docsearch/components/Footer.d.ts +8 -0
  10. package/dist/docsearch/components/Footer.d.ts.map +1 -0
  11. package/dist/docsearch/components/Footer.js +23 -0
  12. package/dist/docsearch/components/Highlight.d.ts +9 -0
  13. package/dist/docsearch/components/Highlight.d.ts.map +1 -0
  14. package/dist/docsearch/components/Highlight.js +48 -0
  15. package/dist/docsearch/components/Hit.d.ts +15 -0
  16. package/dist/docsearch/components/Hit.d.ts.map +1 -0
  17. package/dist/docsearch/components/Hit.js +96 -0
  18. package/dist/docsearch/components/Modal.d.ts +9 -0
  19. package/dist/docsearch/components/Modal.d.ts.map +1 -0
  20. package/dist/docsearch/components/Modal.js +54 -0
  21. package/dist/docsearch/components/Results.d.ts +21 -0
  22. package/dist/docsearch/components/Results.d.ts.map +1 -0
  23. package/dist/docsearch/components/Results.js +91 -0
  24. package/dist/docsearch/components/SearchBox.d.ts +12 -0
  25. package/dist/docsearch/components/SearchBox.d.ts.map +1 -0
  26. package/dist/docsearch/components/SearchBox.js +18 -0
  27. package/dist/docsearch/hooks/useDocSearch.d.ts +32 -0
  28. package/dist/docsearch/hooks/useDocSearch.d.ts.map +1 -0
  29. package/dist/docsearch/hooks/useDocSearch.js +208 -0
  30. package/dist/docsearch/hooks/useKeyboard.d.ts +17 -0
  31. package/dist/docsearch/hooks/useKeyboard.d.ts.map +1 -0
  32. package/dist/docsearch/hooks/useKeyboard.js +71 -0
  33. package/dist/docsearch/hooks/useSeekoraSearch.d.ts +27 -0
  34. package/dist/docsearch/hooks/useSeekoraSearch.d.ts.map +1 -0
  35. package/dist/docsearch/hooks/useSeekoraSearch.js +187 -0
  36. package/dist/docsearch/index.d.ts +13 -0
  37. package/dist/docsearch/index.d.ts.map +1 -0
  38. package/dist/docsearch/index.js +11 -0
  39. package/dist/docsearch/types.d.ts +170 -0
  40. package/dist/docsearch/types.d.ts.map +1 -0
  41. package/dist/docsearch/types.js +4 -0
  42. package/dist/docsearch.css +237 -0
  43. package/dist/hooks/useAnalytics.d.ts +8 -4
  44. package/dist/hooks/useAnalytics.d.ts.map +1 -1
  45. package/dist/hooks/useAnalytics.js +14 -9
  46. package/dist/hooks/useSuggestionsAnalytics.d.ts +3 -1
  47. package/dist/hooks/useSuggestionsAnalytics.d.ts.map +1 -1
  48. package/dist/hooks/useSuggestionsAnalytics.js +11 -9
  49. package/dist/index.d.ts +4 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +11 -0
  52. package/dist/index.umd.js +1 -1
  53. package/dist/src/index.d.ts +258 -7
  54. package/dist/src/index.esm.js +1611 -79
  55. package/dist/src/index.esm.js.map +1 -1
  56. package/dist/src/index.js +1618 -78
  57. package/dist/src/index.js.map +1 -1
  58. package/package.json +8 -6
@@ -0,0 +1,187 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { SeekoraClient } from '@seekora-ai/search-sdk';
3
+ function transformResults(results) {
4
+ return results.map((result) => {
5
+ const url = result.url || result.route || result.link || '';
6
+ const title = result.title || result.name || '';
7
+ const content = result.content || result.description || result.snippet || '';
8
+ const description = result.description || result.content?.substring?.(0, 150) || '';
9
+ const hierarchy = {};
10
+ if (result.hierarchy) {
11
+ hierarchy.lvl0 = result.hierarchy.lvl0;
12
+ hierarchy.lvl1 = result.hierarchy.lvl1;
13
+ hierarchy.lvl2 = result.hierarchy.lvl2;
14
+ }
15
+ else {
16
+ if (result.category)
17
+ hierarchy.lvl0 = result.category;
18
+ if (result.parent_title || result.parentTitle)
19
+ hierarchy.lvl1 = result.parent_title || result.parentTitle;
20
+ }
21
+ return {
22
+ url,
23
+ title: title?.replace?.(/<\/?mark>/g, '') || title,
24
+ content: content?.replace?.(/<\/?mark>/g, '')?.substring?.(0, 200) || content,
25
+ description: description?.replace?.(/<\/?mark>/g, '') || description,
26
+ category: result.category || hierarchy.lvl0 || '',
27
+ hierarchy,
28
+ route: result.route,
29
+ parentTitle: result.parent_title || result.parentTitle,
30
+ type: result.type || '',
31
+ anchor: result.anchor || '',
32
+ _source: 'seekora',
33
+ };
34
+ });
35
+ }
36
+ export function useSeekoraSearch(options) {
37
+ const { storeId, storeSecret, apiEndpoint, maxResults = 20, debounceMs = 200, analyticsTags = ['docsearch'], groupField, groupSize, } = options;
38
+ const [query, setQueryState] = useState('');
39
+ const [suggestions, setSuggestions] = useState([]);
40
+ const [isLoading, setIsLoading] = useState(false);
41
+ const [error, setError] = useState(null);
42
+ const [selectedIndex, setSelectedIndex] = useState(0);
43
+ const clientRef = useRef(null);
44
+ const lastSearchContextRef = useRef(null);
45
+ const debounceTimerRef = useRef(null);
46
+ const abortControllerRef = useRef(null);
47
+ useEffect(() => {
48
+ if (!storeId)
49
+ return;
50
+ const config = {
51
+ storeId,
52
+ readSecret: storeSecret,
53
+ logLevel: 'warn',
54
+ enableContextCollection: true,
55
+ };
56
+ if (apiEndpoint) {
57
+ if (['local', 'stage', 'production'].includes(apiEndpoint)) {
58
+ config.environment = apiEndpoint;
59
+ }
60
+ else {
61
+ config.baseUrl = apiEndpoint;
62
+ }
63
+ }
64
+ try {
65
+ clientRef.current = new SeekoraClient(config);
66
+ }
67
+ catch (err) {
68
+ console.error('Failed to initialize SeekoraClient:', err);
69
+ setError('Failed to initialize search client');
70
+ }
71
+ return () => {
72
+ clientRef.current = null;
73
+ };
74
+ }, [storeId, storeSecret, apiEndpoint]);
75
+ const performSearch = useCallback(async (searchQuery) => {
76
+ if (!clientRef.current) {
77
+ setError('Search client not initialized');
78
+ return;
79
+ }
80
+ if (!searchQuery.trim()) {
81
+ setSuggestions([]);
82
+ return;
83
+ }
84
+ if (abortControllerRef.current)
85
+ abortControllerRef.current.abort();
86
+ abortControllerRef.current = new AbortController();
87
+ setIsLoading(true);
88
+ setError(null);
89
+ try {
90
+ const response = await clientRef.current.search(searchQuery, {
91
+ per_page: maxResults,
92
+ analytics_tags: analyticsTags,
93
+ return_fields: [
94
+ 'hierarchy.lvl0', 'hierarchy.lvl1', 'hierarchy.lvl2', 'hierarchy.lvl3',
95
+ 'hierarchy.lvl4', 'hierarchy.lvl5', 'hierarchy.lvl6',
96
+ 'content', 'type', 'url', 'title', 'anchor'
97
+ ],
98
+ snippet_fields: [
99
+ 'hierarchy.lvl1', 'hierarchy.lvl2', 'hierarchy.lvl3',
100
+ 'hierarchy.lvl4', 'hierarchy.lvl5', 'hierarchy.lvl6', 'content'
101
+ ],
102
+ snippet_prefix: '<mark>',
103
+ snippet_suffix: '</mark>',
104
+ include_snippets: true,
105
+ group_field: groupField,
106
+ group_size: groupSize,
107
+ });
108
+ if (abortControllerRef.current?.signal.aborted)
109
+ return;
110
+ if (response?.context)
111
+ lastSearchContextRef.current = response.context;
112
+ setSuggestions(transformResults(response.results || []));
113
+ setSelectedIndex(0);
114
+ }
115
+ catch (err) {
116
+ if (err instanceof Error && err.name === 'AbortError')
117
+ return;
118
+ console.error('Search failed:', err);
119
+ setError(err instanceof Error ? err.message : 'Search failed');
120
+ setSuggestions([]);
121
+ }
122
+ finally {
123
+ setIsLoading(false);
124
+ }
125
+ }, [maxResults, analyticsTags, groupField, groupSize]);
126
+ const setQuery = useCallback((newQuery) => {
127
+ setQueryState(newQuery);
128
+ setSelectedIndex(0);
129
+ if (debounceTimerRef.current)
130
+ clearTimeout(debounceTimerRef.current);
131
+ debounceTimerRef.current = setTimeout(() => performSearch(newQuery), debounceMs);
132
+ }, [performSearch, debounceMs]);
133
+ const selectNext = useCallback(() => {
134
+ setSelectedIndex((prev) => (prev >= suggestions.length - 1 ? 0 : prev + 1));
135
+ }, [suggestions.length]);
136
+ const selectPrev = useCallback(() => {
137
+ setSelectedIndex((prev) => (prev <= 0 ? suggestions.length - 1 : prev - 1));
138
+ }, [suggestions.length]);
139
+ const reset = useCallback(() => {
140
+ if (abortControllerRef.current)
141
+ abortControllerRef.current.abort();
142
+ if (debounceTimerRef.current)
143
+ clearTimeout(debounceTimerRef.current);
144
+ setQueryState('');
145
+ setSuggestions([]);
146
+ setIsLoading(false);
147
+ setError(null);
148
+ setSelectedIndex(0);
149
+ }, []);
150
+ const getSelectedItem = useCallback(() => {
151
+ return suggestions[selectedIndex] || null;
152
+ }, [suggestions, selectedIndex]);
153
+ const trackDocClick = useCallback((hit, position) => {
154
+ const client = clientRef.current;
155
+ if (!client?.trackEvent)
156
+ return;
157
+ const context = lastSearchContextRef.current ?? undefined;
158
+ const itemId = hit.url || hit.id || hit.title || String(position);
159
+ client.trackEvent({
160
+ event_name: 'doc_click',
161
+ clicked_item_id: itemId,
162
+ metadata: { position, result: hit, source: 'docsearch' },
163
+ }, context);
164
+ }, []);
165
+ useEffect(() => {
166
+ return () => {
167
+ if (abortControllerRef.current)
168
+ abortControllerRef.current.abort();
169
+ if (debounceTimerRef.current)
170
+ clearTimeout(debounceTimerRef.current);
171
+ };
172
+ }, []);
173
+ return {
174
+ query,
175
+ suggestions,
176
+ isLoading,
177
+ error,
178
+ selectedIndex,
179
+ setQuery,
180
+ selectNext,
181
+ selectPrev,
182
+ setSelectedIndex,
183
+ reset,
184
+ getSelectedItem,
185
+ trackDocClick,
186
+ };
187
+ }
@@ -0,0 +1,13 @@
1
+ export { DocSearch } from './components/DocSearch';
2
+ export { DocSearchButton } from './components/DocSearchButton';
3
+ export { Modal } from './components/Modal';
4
+ export { SearchBox } from './components/SearchBox';
5
+ export { Results } from './components/Results';
6
+ export { Hit } from './components/Hit';
7
+ export { Highlight, truncateAroundMatch } from './components/Highlight';
8
+ export { Footer } from './components/Footer';
9
+ export { useDocSearch } from './hooks/useDocSearch';
10
+ export { useSeekoraSearch, type UseSeekoraSearchOptions, type UseSeekoraSearchResult } from './hooks/useSeekoraSearch';
11
+ export { useKeyboard, getShortcutText } from './hooks/useKeyboard';
12
+ export type { DocSearchProps, DocSearchButtonProps, DocSearchHit, DocSearchSuggestion, DocSearchResponse, DocSearchSuggestionsResponse, DocSearchTranslations, DocSearchState, DocSearchAction, SearchSource, } from './types';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/docsearch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,KAAK,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEnE,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,4BAA4B,EAC5B,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,YAAY,GACb,MAAM,SAAS,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { DocSearch } from './components/DocSearch';
2
+ export { DocSearchButton } from './components/DocSearchButton';
3
+ export { Modal } from './components/Modal';
4
+ export { SearchBox } from './components/SearchBox';
5
+ export { Results } from './components/Results';
6
+ export { Hit } from './components/Hit';
7
+ export { Highlight, truncateAroundMatch } from './components/Highlight';
8
+ export { Footer } from './components/Footer';
9
+ export { useDocSearch } from './hooks/useDocSearch';
10
+ export { useSeekoraSearch } from './hooks/useSeekoraSearch';
11
+ export { useKeyboard, getShortcutText } from './hooks/useKeyboard';
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Seekora DocSearch Types
3
+ */
4
+ import type React from 'react';
5
+ export interface DocSearchHit {
6
+ objectID: string;
7
+ url: string;
8
+ anchor?: string;
9
+ title: string;
10
+ content: string;
11
+ section_level: number;
12
+ hierarchy: {
13
+ lvl0?: string;
14
+ lvl1?: string;
15
+ lvl2?: string;
16
+ lvl3?: string;
17
+ lvl4?: string;
18
+ lvl5?: string;
19
+ };
20
+ _highlightResult?: {
21
+ title?: {
22
+ value: string;
23
+ matchLevel: string;
24
+ };
25
+ content?: {
26
+ value: string;
27
+ matchLevel: string;
28
+ };
29
+ hierarchy?: {
30
+ lvl0?: {
31
+ value: string;
32
+ matchLevel: string;
33
+ };
34
+ lvl1?: {
35
+ value: string;
36
+ matchLevel: string;
37
+ };
38
+ lvl2?: {
39
+ value: string;
40
+ matchLevel: string;
41
+ };
42
+ lvl3?: {
43
+ value: string;
44
+ matchLevel: string;
45
+ };
46
+ };
47
+ };
48
+ _source?: string;
49
+ }
50
+ export interface DocSearchSuggestion {
51
+ url: string;
52
+ title: string;
53
+ content?: string;
54
+ description?: string;
55
+ category?: string;
56
+ hierarchy?: {
57
+ lvl0?: string;
58
+ lvl1?: string;
59
+ lvl2?: string;
60
+ lvl3?: string;
61
+ lvl4?: string;
62
+ lvl5?: string;
63
+ };
64
+ highlight?: {
65
+ title?: string;
66
+ content?: string;
67
+ };
68
+ _source?: string;
69
+ route?: string;
70
+ parentTitle?: string;
71
+ type?: string;
72
+ anchor?: string;
73
+ }
74
+ export interface SearchSource {
75
+ id: string;
76
+ name: string;
77
+ endpoint: string;
78
+ apiKey?: string;
79
+ storeId?: string;
80
+ storeSecret?: string;
81
+ maxResults?: number;
82
+ minQueryLength?: number;
83
+ transformResults?: (data: any) => DocSearchSuggestion[];
84
+ openInNewTab?: boolean;
85
+ icon?: string;
86
+ }
87
+ export interface DocSearchResponse {
88
+ hits: DocSearchHit[];
89
+ query: string;
90
+ total?: number;
91
+ page?: number;
92
+ nbPages?: number;
93
+ }
94
+ export interface DocSearchSuggestionsResponse {
95
+ suggestions: DocSearchSuggestion[];
96
+ query: string;
97
+ }
98
+ export interface DocSearchProps {
99
+ storeId?: string;
100
+ storeSecret?: string;
101
+ seekoraApiEndpoint?: string;
102
+ apiEndpoint?: string;
103
+ apiKey?: string;
104
+ sources?: SearchSource[];
105
+ indexName?: string;
106
+ placeholder?: string;
107
+ maxResults?: number;
108
+ debounceMs?: number;
109
+ onSelect?: (hit: DocSearchHit | DocSearchSuggestion) => void;
110
+ onClose?: () => void;
111
+ translations?: DocSearchTranslations;
112
+ renderButton?: boolean;
113
+ buttonComponent?: React.ComponentType<DocSearchButtonProps>;
114
+ initialOpen?: boolean;
115
+ disableShortcut?: boolean;
116
+ shortcutKey?: string;
117
+ }
118
+ export interface DocSearchButtonProps {
119
+ onClick: () => void;
120
+ placeholder?: string;
121
+ }
122
+ export interface DocSearchTranslations {
123
+ buttonText?: string;
124
+ buttonAriaLabel?: string;
125
+ searchPlaceholder?: string;
126
+ noResultsText?: string;
127
+ loadingText?: string;
128
+ errorText?: string;
129
+ footerText?: string;
130
+ closeText?: string;
131
+ searchByText?: string;
132
+ }
133
+ export interface DocSearchState {
134
+ query: string;
135
+ results: DocSearchHit[];
136
+ suggestions: DocSearchSuggestion[];
137
+ isLoading: boolean;
138
+ error: string | null;
139
+ selectedIndex: number;
140
+ mode: 'suggestions' | 'results';
141
+ }
142
+ export type DocSearchAction = {
143
+ type: 'SET_QUERY';
144
+ payload: string;
145
+ } | {
146
+ type: 'SET_RESULTS';
147
+ payload: DocSearchHit[];
148
+ } | {
149
+ type: 'SET_SUGGESTIONS';
150
+ payload: DocSearchSuggestion[];
151
+ } | {
152
+ type: 'SET_LOADING';
153
+ payload: boolean;
154
+ } | {
155
+ type: 'SET_ERROR';
156
+ payload: string | null;
157
+ } | {
158
+ type: 'SET_SELECTED_INDEX';
159
+ payload: number;
160
+ } | {
161
+ type: 'SELECT_NEXT';
162
+ } | {
163
+ type: 'SELECT_PREV';
164
+ } | {
165
+ type: 'SET_MODE';
166
+ payload: 'suggestions' | 'results';
167
+ } | {
168
+ type: 'RESET';
169
+ };
170
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/docsearch/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Seekora DocSearch Types
3
+ */
4
+ export {};
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Seekora DocSearch CSS - bundled with @seekora/ui-sdk-react
3
+ * Override CSS variables to customize. Dark mode: [data-theme="dark"] or prefers-color-scheme.
4
+ */
5
+
6
+ :root {
7
+ --seekora-docsearch-primary: #5468ff;
8
+ --seekora-docsearch-primary-hover: #4458e8;
9
+ --seekora-docsearch-text: #1a1a1a;
10
+ --seekora-docsearch-text-muted: #6b7280;
11
+ --seekora-docsearch-text-secondary: #9ca3af;
12
+ --seekora-docsearch-background: #ffffff;
13
+ --seekora-docsearch-background-secondary: #f9fafb;
14
+ --seekora-docsearch-border: #e5e7eb;
15
+ --seekora-docsearch-border-light: #f3f4f6;
16
+ --seekora-docsearch-shadow: rgba(0, 0, 0, 0.1);
17
+ --seekora-docsearch-shadow-strong: rgba(0, 0, 0, 0.2);
18
+ --seekora-docsearch-overlay: rgba(0, 0, 0, 0.4);
19
+ --seekora-docsearch-highlight-bg: rgba(84, 104, 255, 0.1);
20
+ --seekora-docsearch-highlight-text: #5468ff;
21
+ --seekora-docsearch-hit-bg: transparent;
22
+ --seekora-docsearch-hit-bg-hover: #f3f4f6;
23
+ --seekora-docsearch-hit-bg-selected: #eef2ff;
24
+ --seekora-docsearch-icon: #9ca3af;
25
+ --seekora-docsearch-icon-active: #5468ff;
26
+ --seekora-docsearch-key-bg: #f3f4f6;
27
+ --seekora-docsearch-key-border: #d1d5db;
28
+ --seekora-docsearch-key-text: #6b7280;
29
+ --seekora-docsearch-spacing-xs: 4px;
30
+ --seekora-docsearch-spacing-sm: 8px;
31
+ --seekora-docsearch-spacing-md: 12px;
32
+ --seekora-docsearch-spacing-lg: 16px;
33
+ --seekora-docsearch-spacing-xl: 24px;
34
+ --seekora-docsearch-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
35
+ --seekora-docsearch-font-size-xs: 11px;
36
+ --seekora-docsearch-font-size-sm: 13px;
37
+ --seekora-docsearch-font-size-md: 14px;
38
+ --seekora-docsearch-font-size-lg: 16px;
39
+ --seekora-docsearch-font-weight-normal: 400;
40
+ --seekora-docsearch-font-weight-medium: 500;
41
+ --seekora-docsearch-font-weight-semibold: 600;
42
+ --seekora-docsearch-line-height: 1.5;
43
+ --seekora-docsearch-radius-sm: 4px;
44
+ --seekora-docsearch-radius-md: 8px;
45
+ --seekora-docsearch-radius-lg: 12px;
46
+ --seekora-docsearch-radius-xl: 16px;
47
+ --seekora-docsearch-transition-fast: 100ms;
48
+ --seekora-docsearch-transition-normal: 150ms;
49
+ --seekora-docsearch-transition-slow: 200ms;
50
+ --seekora-docsearch-modal-width: 560px;
51
+ --seekora-docsearch-modal-max-height: 80vh;
52
+ --seekora-docsearch-modal-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
53
+ --seekora-docsearch-z-index: 99999;
54
+ }
55
+
56
+ [data-theme="dark"], .dark {
57
+ --seekora-docsearch-primary: #7c8aff;
58
+ --seekora-docsearch-primary-hover: #6e7dff;
59
+ --seekora-docsearch-text: #f9fafb;
60
+ --seekora-docsearch-text-muted: #9ca3af;
61
+ --seekora-docsearch-text-secondary: #6b7280;
62
+ --seekora-docsearch-background: #1f2937;
63
+ --seekora-docsearch-background-secondary: #111827;
64
+ --seekora-docsearch-border: #374151;
65
+ --seekora-docsearch-border-light: #374151;
66
+ --seekora-docsearch-shadow: rgba(0, 0, 0, 0.3);
67
+ --seekora-docsearch-shadow-strong: rgba(0, 0, 0, 0.5);
68
+ --seekora-docsearch-overlay: rgba(0, 0, 0, 0.6);
69
+ --seekora-docsearch-highlight-bg: rgba(124, 138, 255, 0.15);
70
+ --seekora-docsearch-highlight-text: #a5b4fc;
71
+ --seekora-docsearch-hit-bg: transparent;
72
+ --seekora-docsearch-hit-bg-hover: #374151;
73
+ --seekora-docsearch-hit-bg-selected: #312e81;
74
+ --seekora-docsearch-icon: #6b7280;
75
+ --seekora-docsearch-icon-active: #7c8aff;
76
+ --seekora-docsearch-key-bg: #374151;
77
+ --seekora-docsearch-key-border: #4b5563;
78
+ --seekora-docsearch-key-text: #9ca3af;
79
+ }
80
+
81
+ @media (prefers-color-scheme: dark) {
82
+ :root:not([data-theme="light"]):not(.light) {
83
+ --seekora-docsearch-primary: #7c8aff;
84
+ --seekora-docsearch-primary-hover: #6e7dff;
85
+ --seekora-docsearch-text: #f9fafb;
86
+ --seekora-docsearch-text-muted: #9ca3af;
87
+ --seekora-docsearch-text-secondary: #6b7280;
88
+ --seekora-docsearch-background: #1f2937;
89
+ --seekora-docsearch-background-secondary: #111827;
90
+ --seekora-docsearch-border: #374151;
91
+ --seekora-docsearch-border-light: #374151;
92
+ --seekora-docsearch-shadow: rgba(0, 0, 0, 0.3);
93
+ --seekora-docsearch-shadow-strong: rgba(0, 0, 0, 0.5);
94
+ --seekora-docsearch-overlay: rgba(0, 0, 0, 0.6);
95
+ --seekora-docsearch-highlight-bg: rgba(124, 138, 255, 0.15);
96
+ --seekora-docsearch-highlight-text: #a5b4fc;
97
+ --seekora-docsearch-hit-bg: transparent;
98
+ --seekora-docsearch-hit-bg-hover: #374151;
99
+ --seekora-docsearch-hit-bg-selected: #312e81;
100
+ --seekora-docsearch-icon: #6b7280;
101
+ --seekora-docsearch-icon-active: #7c8aff;
102
+ --seekora-docsearch-key-bg: #374151;
103
+ --seekora-docsearch-key-border: #4b5563;
104
+ --seekora-docsearch-key-text: #9ca3af;
105
+ }
106
+ }
107
+
108
+ .seekora-docsearch-button {
109
+ display: flex;
110
+ align-items: center;
111
+ gap: var(--seekora-docsearch-spacing-sm);
112
+ padding: var(--seekora-docsearch-spacing-sm) var(--seekora-docsearch-spacing-md);
113
+ min-width: 200px;
114
+ height: 40px;
115
+ background: var(--seekora-docsearch-background);
116
+ border: 1px solid var(--seekora-docsearch-border);
117
+ border-radius: var(--seekora-docsearch-radius-md);
118
+ color: var(--seekora-docsearch-text-muted);
119
+ font-family: var(--seekora-docsearch-font-family);
120
+ font-size: var(--seekora-docsearch-font-size-md);
121
+ cursor: pointer;
122
+ transition: all var(--seekora-docsearch-transition-normal) ease;
123
+ box-shadow: 0 1px 2px var(--seekora-docsearch-shadow);
124
+ }
125
+ .seekora-docsearch-button:hover { border-color: var(--seekora-docsearch-primary); box-shadow: 0 2px 4px var(--seekora-docsearch-shadow); }
126
+ .seekora-docsearch-button:focus { outline: none; border-color: var(--seekora-docsearch-primary); box-shadow: 0 0 0 3px var(--seekora-docsearch-highlight-bg); }
127
+ .seekora-docsearch-button-icon { display: flex; align-items: center; justify-content: center; color: var(--seekora-docsearch-icon); flex-shrink: 0; }
128
+ .seekora-docsearch-button-placeholder { flex: 1; text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
129
+ .seekora-docsearch-button-keys { display: flex; align-items: center; gap: var(--seekora-docsearch-spacing-xs); flex-shrink: 0; }
130
+ .seekora-docsearch-button-key {
131
+ display: inline-flex; align-items: center; justify-content: center; padding: 2px 6px; min-width: 20px; height: 20px;
132
+ background: var(--seekora-docsearch-key-bg); border: 1px solid var(--seekora-docsearch-key-border);
133
+ border-radius: var(--seekora-docsearch-radius-sm); color: var(--seekora-docsearch-key-text);
134
+ font-family: var(--seekora-docsearch-font-family); font-size: var(--seekora-docsearch-font-size-xs);
135
+ font-weight: var(--seekora-docsearch-font-weight-medium); box-shadow: inset 0 -1px 0 var(--seekora-docsearch-key-border);
136
+ }
137
+ @media (max-width: 640px) {
138
+ .seekora-docsearch-button { min-width: auto; padding: var(--seekora-docsearch-spacing-sm); }
139
+ .seekora-docsearch-button-placeholder { display: none; }
140
+ .seekora-docsearch-button-keys { display: none; }
141
+ }
142
+
143
+ .seekora-docsearch-overlay {
144
+ position: fixed; inset: 0; z-index: var(--seekora-docsearch-z-index);
145
+ display: flex; align-items: flex-start; justify-content: center;
146
+ padding: 10vh var(--seekora-docsearch-spacing-lg);
147
+ background: var(--seekora-docsearch-overlay); backdrop-filter: blur(4px);
148
+ animation: seekora-docsearch-fade-in var(--seekora-docsearch-transition-normal) ease;
149
+ }
150
+ @keyframes seekora-docsearch-fade-in { from { opacity: 0; } to { opacity: 1; } }
151
+ .seekora-docsearch-container { width: 100%; max-width: var(--seekora-docsearch-modal-width); animation: seekora-docsearch-slide-in var(--seekora-docsearch-transition-slow) ease; }
152
+ @keyframes seekora-docsearch-slide-in { from { opacity: 0; transform: translateY(-20px) scale(0.98); } to { opacity: 1; transform: translateY(0) scale(1); } }
153
+ .seekora-docsearch-modal {
154
+ display: flex; flex-direction: column; max-height: var(--seekora-docsearch-modal-max-height);
155
+ background: var(--seekora-docsearch-background); border: 1px solid var(--seekora-docsearch-border);
156
+ border-radius: var(--seekora-docsearch-radius-xl); box-shadow: var(--seekora-docsearch-modal-shadow); overflow: hidden;
157
+ }
158
+ .seekora-docsearch-header { display: flex; align-items: center; gap: var(--seekora-docsearch-spacing-sm); padding: var(--seekora-docsearch-spacing-md); border-bottom: 1px solid var(--seekora-docsearch-border-light); }
159
+ .seekora-docsearch-close {
160
+ display: flex; align-items: center; justify-content: center;
161
+ padding: var(--seekora-docsearch-spacing-xs) var(--seekora-docsearch-spacing-sm);
162
+ background: var(--seekora-docsearch-key-bg); border: 1px solid var(--seekora-docsearch-key-border);
163
+ border-radius: var(--seekora-docsearch-radius-sm); color: var(--seekora-docsearch-key-text);
164
+ font-family: var(--seekora-docsearch-font-family); font-size: var(--seekora-docsearch-font-size-xs);
165
+ font-weight: var(--seekora-docsearch-font-weight-medium); cursor: pointer; transition: all var(--seekora-docsearch-transition-fast) ease; flex-shrink: 0;
166
+ }
167
+ .seekora-docsearch-close:hover { background: var(--seekora-docsearch-hit-bg-hover); border-color: var(--seekora-docsearch-border); }
168
+ .seekora-docsearch-close-text { text-transform: uppercase; letter-spacing: 0.05em; }
169
+ .seekora-docsearch-body { flex: 1; overflow-y: auto; min-height: 0; overscroll-behavior: contain; }
170
+ .seekora-docsearch-body::-webkit-scrollbar { width: 8px; }
171
+ .seekora-docsearch-body::-webkit-scrollbar-track { background: transparent; }
172
+ .seekora-docsearch-body::-webkit-scrollbar-thumb { background: var(--seekora-docsearch-border); border-radius: 4px; }
173
+ .seekora-docsearch-body::-webkit-scrollbar-thumb:hover { background: var(--seekora-docsearch-text-muted); }
174
+ @media (max-width: 640px) {
175
+ .seekora-docsearch-overlay { padding: var(--seekora-docsearch-spacing-md); }
176
+ .seekora-docsearch-modal { max-height: calc(100vh - 32px); border-radius: var(--seekora-docsearch-radius-lg); }
177
+ }
178
+
179
+ .seekora-docsearch-searchbox {
180
+ display: flex; align-items: center; gap: var(--seekora-docsearch-spacing-sm); flex: 1;
181
+ padding: 0 var(--seekora-docsearch-spacing-sm); background: var(--seekora-docsearch-background-secondary);
182
+ border: 1px solid transparent; border-radius: var(--seekora-docsearch-radius-md); transition: all var(--seekora-docsearch-transition-fast) ease;
183
+ }
184
+ .seekora-docsearch-searchbox:focus-within { background: var(--seekora-docsearch-background); border-color: var(--seekora-docsearch-primary); box-shadow: 0 0 0 3px var(--seekora-docsearch-highlight-bg); }
185
+ .seekora-docsearch-searchbox-icon { display: flex; align-items: center; justify-content: center; color: var(--seekora-docsearch-icon); flex-shrink: 0; cursor: default; }
186
+ .seekora-docsearch-searchbox:focus-within .seekora-docsearch-searchbox-icon { color: var(--seekora-docsearch-icon-active); }
187
+ .seekora-docsearch-input {
188
+ flex: 1; padding: var(--seekora-docsearch-spacing-md) var(--seekora-docsearch-spacing-sm);
189
+ background: transparent; border: none; color: var(--seekora-docsearch-text);
190
+ font-family: var(--seekora-docsearch-font-family); font-size: var(--seekora-docsearch-font-size-lg);
191
+ line-height: var(--seekora-docsearch-line-height); outline: none; min-width: 0;
192
+ }
193
+ .seekora-docsearch-input::placeholder { color: var(--seekora-docsearch-text-secondary); }
194
+ .seekora-docsearch-clear { display: flex; align-items: center; justify-content: center; padding: var(--seekora-docsearch-spacing-xs); background: transparent; border: none; border-radius: var(--seekora-docsearch-radius-sm); color: var(--seekora-docsearch-text-muted); cursor: pointer; transition: all var(--seekora-docsearch-transition-fast) ease; flex-shrink: 0; }
195
+ .seekora-docsearch-clear:hover { background: var(--seekora-docsearch-hit-bg-hover); color: var(--seekora-docsearch-text); }
196
+ .seekora-docsearch-spinner { display: flex; align-items: center; justify-content: center; color: var(--seekora-docsearch-primary); animation: seekora-docsearch-spin 0.8s linear infinite; }
197
+ @keyframes seekora-docsearch-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
198
+
199
+ .seekora-docsearch-results { padding: var(--seekora-docsearch-spacing-sm) 0; }
200
+ .seekora-docsearch-results-list { list-style: none; margin: 0; padding: 0; }
201
+ .seekora-docsearch-results-group { margin-bottom: var(--seekora-docsearch-spacing-sm); }
202
+ .seekora-docsearch-results-group:last-child { margin-bottom: 0; }
203
+ .seekora-docsearch-results-group-header { padding: var(--seekora-docsearch-spacing-sm) var(--seekora-docsearch-spacing-lg); color: var(--seekora-docsearch-text-muted); font-size: var(--seekora-docsearch-font-size-sm); font-weight: var(--seekora-docsearch-font-weight-semibold); text-transform: uppercase; letter-spacing: 0.05em; }
204
+ .seekora-docsearch-results-group-items { list-style: none; margin: 0; padding: 0; }
205
+ .seekora-docsearch-hit { display: flex; align-items: center; gap: var(--seekora-docsearch-spacing-md); padding: var(--seekora-docsearch-spacing-md) var(--seekora-docsearch-spacing-lg); background: var(--seekora-docsearch-hit-bg); color: var(--seekora-docsearch-text); text-decoration: none; cursor: pointer; transition: background var(--seekora-docsearch-transition-fast) ease; }
206
+ .seekora-docsearch-hit:hover { background: var(--seekora-docsearch-hit-bg-hover); }
207
+ .seekora-docsearch-hit--selected { background: var(--seekora-docsearch-hit-bg-selected); }
208
+ .seekora-docsearch-hit--selected:hover { background: var(--seekora-docsearch-hit-bg-selected); }
209
+ .seekora-docsearch-hit-icon { display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; background: var(--seekora-docsearch-background-secondary); border-radius: var(--seekora-docsearch-radius-md); color: var(--seekora-docsearch-icon); flex-shrink: 0; }
210
+ .seekora-docsearch-hit--selected .seekora-docsearch-hit-icon { background: var(--seekora-docsearch-primary); color: white; }
211
+ .seekora-docsearch-hit-content { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--seekora-docsearch-spacing-xs); }
212
+ .seekora-docsearch-hit-breadcrumb { color: var(--seekora-docsearch-text-secondary); font-size: var(--seekora-docsearch-font-size-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
213
+ .seekora-docsearch-hit-title { color: var(--seekora-docsearch-text); font-size: var(--seekora-docsearch-font-size-md); font-weight: var(--seekora-docsearch-font-weight-medium); line-height: var(--seekora-docsearch-line-height); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
214
+ .seekora-docsearch-hit-description { color: var(--seekora-docsearch-text-muted); font-size: var(--seekora-docsearch-font-size-sm); line-height: var(--seekora-docsearch-line-height); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
215
+ .seekora-docsearch-hit-action { display: flex; align-items: center; justify-content: center; color: var(--seekora-docsearch-text-secondary); flex-shrink: 0; opacity: 0; transition: opacity var(--seekora-docsearch-transition-fast) ease; }
216
+ .seekora-docsearch-hit:hover .seekora-docsearch-hit-action, .seekora-docsearch-hit--selected .seekora-docsearch-hit-action { opacity: 1; }
217
+ .seekora-docsearch-highlight mark { background: var(--seekora-docsearch-highlight-bg); color: var(--seekora-docsearch-highlight-text); font-weight: var(--seekora-docsearch-font-weight-semibold); padding: 0 2px; border-radius: 2px; }
218
+ .seekora-docsearch-empty, .seekora-docsearch-loading, .seekora-docsearch-no-results, .seekora-docsearch-error { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: var(--seekora-docsearch-spacing-xl); text-align: center; }
219
+ .seekora-docsearch-empty-text, .seekora-docsearch-loading-text, .seekora-docsearch-no-results-text, .seekora-docsearch-error-text { color: var(--seekora-docsearch-text-muted); font-size: var(--seekora-docsearch-font-size-md); margin: 0; }
220
+ .seekora-docsearch-loading-spinner { color: var(--seekora-docsearch-primary); margin-bottom: var(--seekora-docsearch-spacing-md); animation: seekora-docsearch-spin 0.8s linear infinite; }
221
+ .seekora-docsearch-error-text { color: #ef4444; }
222
+ .seekora-docsearch-hit--child { padding-left: var(--seekora-docsearch-spacing-md); }
223
+ .seekora-docsearch-hit--child .seekora-docsearch-hit-icon { width: 32px; height: 32px; }
224
+ .seekora-docsearch-hit-tree { display: flex; align-items: center; justify-content: center; flex-shrink: 0; color: var(--seekora-docsearch-border); }
225
+ .seekora-docsearch-hit-tree-icon { width: 16px; height: 20px; color: var(--seekora-docsearch-border); }
226
+
227
+ .seekora-docsearch-footer { display: flex; align-items: center; justify-content: space-between; padding: var(--seekora-docsearch-spacing-md) var(--seekora-docsearch-spacing-lg); background: var(--seekora-docsearch-background-secondary); border-top: 1px solid var(--seekora-docsearch-border-light); }
228
+ .seekora-docsearch-footer-commands { display: flex; align-items: center; }
229
+ .seekora-docsearch-footer-commands-list { display: flex; align-items: center; gap: var(--seekora-docsearch-spacing-lg); list-style: none; margin: 0; padding: 0; }
230
+ .seekora-docsearch-footer-command { display: flex; align-items: center; gap: var(--seekora-docsearch-spacing-xs); color: var(--seekora-docsearch-text-muted); font-size: var(--seekora-docsearch-font-size-xs); }
231
+ .seekora-docsearch-key { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 4px; background: var(--seekora-docsearch-key-bg); border: 1px solid var(--seekora-docsearch-key-border); border-radius: var(--seekora-docsearch-radius-sm); color: var(--seekora-docsearch-key-text); font-family: var(--seekora-docsearch-font-family); font-size: var(--seekora-docsearch-font-size-xs); font-weight: var(--seekora-docsearch-font-weight-medium); box-shadow: inset 0 -1px 0 var(--seekora-docsearch-key-border); }
232
+ .seekora-docsearch-footer-logo { display: flex; align-items: center; gap: var(--seekora-docsearch-spacing-sm); }
233
+ .seekora-docsearch-footer-logo-text { color: var(--seekora-docsearch-text-secondary); font-size: var(--seekora-docsearch-font-size-xs); }
234
+ .seekora-docsearch-footer-logo-link { display: flex; align-items: center; color: var(--seekora-docsearch-text); text-decoration: none; transition: color var(--seekora-docsearch-transition-fast) ease; }
235
+ .seekora-docsearch-footer-logo-link:hover { color: var(--seekora-docsearch-primary); }
236
+ .seekora-docsearch-logo { height: 16px; width: auto; }
237
+ @media (max-width: 640px) { .seekora-docsearch-footer { justify-content: center; } .seekora-docsearch-footer-commands { display: none; } }