@cloro-dev/response-parser 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +149 -102
  2. package/dist/index.esm.js.map +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/providers/ai-mode.d.ts.map +1 -1
  5. package/package.json +4 -29
  6. package/dist/react/components/AiResponseRenderer.d.ts +0 -24
  7. package/dist/react/components/AiResponseRenderer.d.ts.map +0 -1
  8. package/dist/react/components/IframeRenderer.d.ts +0 -12
  9. package/dist/react/components/IframeRenderer.d.ts.map +0 -1
  10. package/dist/react/components/ResponseRenderer.d.ts +0 -24
  11. package/dist/react/components/ResponseRenderer.d.ts.map +0 -1
  12. package/dist/react/core/detector.d.ts +0 -17
  13. package/dist/react/core/detector.d.ts.map +0 -1
  14. package/dist/react/core/parser.d.ts +0 -40
  15. package/dist/react/core/parser.d.ts.map +0 -1
  16. package/dist/react/core/types.d.ts +0 -34
  17. package/dist/react/core/types.d.ts.map +0 -1
  18. package/dist/react/hooks/useAiResponse.d.ts +0 -19
  19. package/dist/react/hooks/useAiResponse.d.ts.map +0 -1
  20. package/dist/react/hooks/useResponse.d.ts +0 -19
  21. package/dist/react/hooks/useResponse.d.ts.map +0 -1
  22. package/dist/react/index.d.ts +0 -86
  23. package/dist/react/index.d.ts.map +0 -1
  24. package/dist/react/index.esm.js +0 -2
  25. package/dist/react/index.esm.js.map +0 -1
  26. package/dist/react/index.js +0 -2
  27. package/dist/react/index.js.map +0 -1
  28. package/dist/react/providers/ai-mode.d.ts +0 -21
  29. package/dist/react/providers/ai-mode.d.ts.map +0 -1
  30. package/dist/react/providers/ai-overview.d.ts +0 -21
  31. package/dist/react/providers/ai-overview.d.ts.map +0 -1
  32. package/dist/react/providers/base-provider.d.ts +0 -34
  33. package/dist/react/providers/base-provider.d.ts.map +0 -1
  34. package/dist/react/providers/chatgpt.d.ts +0 -22
  35. package/dist/react/providers/chatgpt.d.ts.map +0 -1
  36. package/dist/react/providers/copilot.d.ts +0 -25
  37. package/dist/react/providers/copilot.d.ts.map +0 -1
  38. package/dist/react/providers/gemini.d.ts +0 -21
  39. package/dist/react/providers/gemini.d.ts.map +0 -1
  40. package/dist/react/providers/grok.d.ts +0 -17
  41. package/dist/react/providers/grok.d.ts.map +0 -1
  42. package/dist/react/providers/perplexity.d.ts +0 -17
  43. package/dist/react/providers/perplexity.d.ts.map +0 -1
  44. package/dist/react/react/components/AiResponseRenderer.d.ts +0 -24
  45. package/dist/react/react/components/AiResponseRenderer.d.ts.map +0 -1
  46. package/dist/react/react/components/IframeRenderer.d.ts +0 -12
  47. package/dist/react/react/components/IframeRenderer.d.ts.map +0 -1
  48. package/dist/react/react/components/ResponseRenderer.d.ts +0 -24
  49. package/dist/react/react/components/ResponseRenderer.d.ts.map +0 -1
  50. package/dist/react/react/hooks/useAiResponse.d.ts +0 -19
  51. package/dist/react/react/hooks/useAiResponse.d.ts.map +0 -1
  52. package/dist/react/react/hooks/useResponse.d.ts +0 -19
  53. package/dist/react/react/hooks/useResponse.d.ts.map +0 -1
  54. package/dist/react/react/index.d.ts +0 -7
  55. package/dist/react/react/index.d.ts.map +0 -1
  56. package/dist/react/styles/index.d.ts +0 -1
  57. package/dist/react/styles/index.d.ts.map +0 -1
  58. package/dist/react/utils/helpers.d.ts +0 -28
  59. package/dist/react/utils/helpers.d.ts.map +0 -1
@@ -1,24 +0,0 @@
1
- import React from 'react';
2
- import { UseResponseOptions } from '../hooks/useResponse';
3
- import { IframeRendererProps } from './IframeRenderer';
4
- export interface ResponseRendererProps extends Omit<UseResponseOptions, 'onError'> {
5
- response: any;
6
- className?: string;
7
- style?: React.CSSProperties;
8
- iframeProps?: Partial<IframeRendererProps>;
9
- loadingComponent?: React.ComponentType<{
10
- isLoading: boolean;
11
- }>;
12
- errorComponent?: React.ComponentType<{
13
- error: Error | null;
14
- retry: () => void;
15
- }>;
16
- fallbackComponent?: React.ComponentType<{
17
- provider: string | null;
18
- }>;
19
- onRenderComplete?: (html: string) => void;
20
- }
21
- export declare const ResponseRenderer: React.FC<ResponseRendererProps>;
22
- export { IframeRenderer } from './IframeRenderer';
23
- export { useResponse } from '../hooks/useResponse';
24
- //# sourceMappingURL=ResponseRenderer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ResponseRenderer.d.ts","sourceRoot":"","sources":["../../../src/react/components/ResponseRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAe,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAkB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC;IAChF,QAAQ,EAAE,GAAG,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC3C,gBAAgB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC/D,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAAC;IACjF,iBAAiB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACrE,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA+G5D,CAAC;AAMF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,17 +0,0 @@
1
- import { AIProvider, DetectedProvider } from './types';
2
- export declare class ProviderDetector {
3
- private static readonly PROVIDER_PATTERNS;
4
- /**
5
- * Detect the AI provider from the response
6
- */
7
- static detect(response: any): DetectedProvider | null;
8
- /**
9
- * Get all possible providers with their confidence scores
10
- */
11
- static getAllProviders(response: any): DetectedProvider[];
12
- /**
13
- * Validate if a detected provider is likely correct
14
- */
15
- static validate(response: any, provider: AIProvider): boolean;
16
- }
17
- //# sourceMappingURL=detector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEvD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAiEvC;IAEF;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,GAAG,gBAAgB,GAAG,IAAI;IA4CrD;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,GAAG,gBAAgB,EAAE;IA2BzD;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO;CAI9D"}
@@ -1,40 +0,0 @@
1
- import { AIProvider, ParsedResponse, ParseOptions } from './types';
2
- export declare class AIResponseParser {
3
- private providers;
4
- constructor();
5
- /**
6
- * Parse an AI response with auto-detected provider
7
- */
8
- parse(response: any, options?: ParseOptions): ParsedResponse | null;
9
- /**
10
- * Parse with explicit provider specification
11
- */
12
- parseWithProvider(response: any, provider: AIProvider, options?: ParseOptions): ParsedResponse | null;
13
- /**
14
- * Detect the provider from a response
15
- */
16
- detectProvider(response: any): AIProvider | null;
17
- /**
18
- * Get all possible providers with confidence scores
19
- */
20
- detectAllProviders(response: any): Array<{
21
- provider: AIProvider;
22
- confidence: number;
23
- }>;
24
- /**
25
- * Parse as generic HTML when no specific provider is detected
26
- */
27
- private parseGeneric;
28
- /**
29
- * Get list of supported providers
30
- */
31
- getSupportedProviders(): AIProvider[];
32
- /**
33
- * Register a custom provider
34
- */
35
- registerProvider(provider: AIProvider, instance: any): void;
36
- }
37
- export declare const parser: AIResponseParser;
38
- export declare const parseAiResponse: (response: any, options?: ParseOptions) => ParsedResponse | null;
39
- export declare const detectProvider: (response: any) => AIProvider | null;
40
- //# sourceMappingURL=parser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAUnE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAmC;;IAYpD;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,cAAc,GAAG,IAAI;IA4BnE;;OAEG;IACH,iBAAiB,CACf,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,UAAU,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,cAAc,GAAG,IAAI;IAcxB;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,GAAG,GAAG,UAAU,GAAG,IAAI;IAKhD;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,GAAG,GAAG,KAAK,CAAC;QAAE,QAAQ,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAItF;;OAEG;IACH,OAAO,CAAC,YAAY;IAuDpB;;OAEG;IACH,qBAAqB,IAAI,UAAU,EAAE;IAIrC;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI;CAG5D;AAGD,eAAO,MAAM,MAAM,kBAAyB,CAAC;AAG7C,eAAO,MAAM,eAAe,GAAI,UAAU,GAAG,EAAE,UAAU,YAAY,0BACpC,CAAC;AAElC,eAAO,MAAM,cAAc,GAAI,UAAU,GAAG,sBACX,CAAC"}
@@ -1,34 +0,0 @@
1
- export type AIProvider = 'CHATGPT' | 'GEMINI' | 'PERPLEXITY' | 'COPILOT' | 'AIOVERVIEW' | 'AIMODE' | 'GROK';
2
- export interface ParsedResponse {
3
- provider: AIProvider;
4
- html: string;
5
- text?: string;
6
- sources?: any[];
7
- metadata?: Record<string, any>;
8
- }
9
- export interface ParseOptions {
10
- removeLinks?: boolean;
11
- invertColors?: boolean;
12
- removeHeader?: boolean;
13
- removeFooter?: boolean;
14
- removeSidebar?: boolean;
15
- }
16
- export interface ProviderConfig {
17
- name: AIProvider;
18
- baseUrl: string;
19
- }
20
- export interface DetectedProvider {
21
- provider: AIProvider;
22
- confidence: number;
23
- }
24
- export interface StyleOptions {
25
- customCSS?: string;
26
- hideUI?: boolean;
27
- baseUrl?: string;
28
- }
29
- export type ContentExtraction = {
30
- html?: string;
31
- text?: string;
32
- sources?: any[];
33
- };
34
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,QAAQ,GACR,YAAY,GACZ,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,UAAU,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;CACjB,CAAC"}
@@ -1,19 +0,0 @@
1
- import { ParsedResponse, ParseOptions, AIProvider } from '../../index';
2
- export interface UseAiResponseOptions extends ParseOptions {
3
- autoDetect?: boolean;
4
- provider?: AIProvider;
5
- onProviderDetected?: (provider: AIProvider | null) => void;
6
- onError?: (error: Error) => void;
7
- }
8
- export interface UseAiResponseReturn {
9
- parsed: ParsedResponse | null;
10
- provider: AIProvider | null;
11
- isLoading: boolean;
12
- error: Error | null;
13
- html: string | null;
14
- text: string | null;
15
- sources: any[] | null;
16
- reparse: (options?: Partial<UseAiResponseOptions>) => void;
17
- }
18
- export declare function useAiResponse(response: any, options?: UseAiResponseOptions): UseAiResponseReturn;
19
- //# sourceMappingURL=useAiResponse.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAiResponse.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useAiResponse.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAExG,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;CAC5D;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,GAAG,EACb,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAkFrB"}
@@ -1,19 +0,0 @@
1
- import { ParsedResponse, ParseOptions, AIProvider } from '../../index';
2
- export interface UseResponseOptions extends ParseOptions {
3
- autoDetect?: boolean;
4
- provider?: AIProvider;
5
- onProviderDetected?: (provider: AIProvider | null) => void;
6
- onError?: (error: Error) => void;
7
- }
8
- export interface UseResponseReturn {
9
- parsed: ParsedResponse | null;
10
- provider: AIProvider | null;
11
- isLoading: boolean;
12
- error: Error | null;
13
- html: string | null;
14
- text: string | null;
15
- sources: any[] | null;
16
- reparse: (options?: Partial<UseResponseOptions>) => void;
17
- }
18
- export declare function useResponse(response: any, options?: UseResponseOptions): UseResponseReturn;
19
- //# sourceMappingURL=useResponse.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useResponse.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useResponse.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAExG,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAC;CAC1D;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,GAAG,EACb,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CA+EnB"}
@@ -1,86 +0,0 @@
1
- import React from 'react';
2
-
3
- type AIProvider = 'CHATGPT' | 'GEMINI' | 'PERPLEXITY' | 'COPILOT' | 'AIOVERVIEW' | 'AIMODE' | 'GROK';
4
- interface ParsedResponse {
5
- provider: AIProvider;
6
- html: string;
7
- text?: string;
8
- sources?: any[];
9
- metadata?: Record<string, any>;
10
- }
11
- interface ParseOptions {
12
- removeLinks?: boolean;
13
- invertColors?: boolean;
14
- removeHeader?: boolean;
15
- removeFooter?: boolean;
16
- removeSidebar?: boolean;
17
- }
18
- interface ProviderConfig {
19
- name: AIProvider;
20
- baseUrl: string;
21
- }
22
- interface DetectedProvider {
23
- provider: AIProvider;
24
- confidence: number;
25
- }
26
- interface StyleOptions {
27
- customCSS?: string;
28
- hideUI?: boolean;
29
- baseUrl?: string;
30
- }
31
- type ContentExtraction = {
32
- html?: string;
33
- text?: string;
34
- sources?: any[];
35
- };
36
-
37
- interface UseResponseOptions extends ParseOptions {
38
- autoDetect?: boolean;
39
- provider?: AIProvider;
40
- onProviderDetected?: (provider: AIProvider | null) => void;
41
- onError?: (error: Error) => void;
42
- }
43
- interface UseResponseReturn {
44
- parsed: ParsedResponse | null;
45
- provider: AIProvider | null;
46
- isLoading: boolean;
47
- error: Error | null;
48
- html: string | null;
49
- text: string | null;
50
- sources: any[] | null;
51
- reparse: (options?: Partial<UseResponseOptions>) => void;
52
- }
53
- declare function useResponse(response: any, options?: UseResponseOptions): UseResponseReturn;
54
-
55
- interface IframeRendererProps {
56
- html: string;
57
- className?: string;
58
- style?: React.CSSProperties;
59
- sandbox?: string;
60
- title?: string;
61
- onLoad?: () => void;
62
- onError?: () => void;
63
- }
64
- declare const IframeRenderer: React.ForwardRefExoticComponent<IframeRendererProps & React.RefAttributes<HTMLIFrameElement>>;
65
-
66
- interface ResponseRendererProps extends Omit<UseResponseOptions, 'onError'> {
67
- response: any;
68
- className?: string;
69
- style?: React.CSSProperties;
70
- iframeProps?: Partial<IframeRendererProps>;
71
- loadingComponent?: React.ComponentType<{
72
- isLoading: boolean;
73
- }>;
74
- errorComponent?: React.ComponentType<{
75
- error: Error | null;
76
- retry: () => void;
77
- }>;
78
- fallbackComponent?: React.ComponentType<{
79
- provider: string | null;
80
- }>;
81
- onRenderComplete?: (html: string) => void;
82
- }
83
- declare const ResponseRenderer: React.FC<ResponseRendererProps>;
84
-
85
- export { IframeRenderer, ResponseRenderer, useResponse };
86
- export type { AIProvider, ContentExtraction, DetectedProvider, IframeRendererProps, ParseOptions, ParsedResponse, ProviderConfig, ResponseRendererProps, StyleOptions, UseResponseOptions, UseResponseReturn };
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,YAAY,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,2 +0,0 @@
1
- import{jsx as e,jsxs as r}from"react/jsx-runtime";import t,{useState as n,useMemo as o,useEffect as a,forwardRef as i}from"react";class s{static detect(e){const r={CHATGPT:0,GEMINI:0,PERPLEXITY:0,COPILOT:0,AIOVERVIEW:0,AIMODE:0,GROK:0};for(const[t,n]of Object.entries(this.PROVIDER_PATTERNS))for(const o of n)try{o(e)&&r[t]++}catch(e){}let t=0,n=null;for(const[e,o]of Object.entries(r))o>t&&(t=o,n=e);return 0===t?null:{provider:n,confidence:t/Object.values(r).reduce((e,r)=>Math.max(e,r),1)}}static getAllProviders(e){const r=[];for(const[t,n]of Object.entries(this.PROVIDER_PATTERNS)){let o=0;for(const r of n)try{r(e)&&o++}catch(e){}o>0&&r.push({provider:t,confidence:o/n.length})}return r.sort((e,r)=>r.confidence-e.confidence)}static validate(e,r){const t=this.detect(e);return(null==t?void 0:t.provider)===r&&t.confidence>.5}}s.PROVIDER_PATTERNS={CHATGPT:[e=>{var r;const t=(null===(r=null==e?void 0:e.result)||void 0===r?void 0:r.html)||(null==e?void 0:e.html)||"";return t.includes("bg-token-bg-primary")||t.includes("text-token-text-secondary")},e=>{var r;const t=(null===(r=null==e?void 0:e.result)||void 0===r?void 0:r.html)||(null==e?void 0:e.html)||"";return t.includes("chatgpt.com")||t.includes("openai.com")}],GEMINI:[e=>{var r;const t=(null===(r=null==e?void 0:e.result)||void 0===r?void 0:r.html)||(null==e?void 0:e.html)||"";return t.includes("bard-sidenav")||t.includes("mat-sidenav")},e=>{var r;const t=(null===(r=null==e?void 0:e.result)||void 0===r?void 0:r.html)||(null==e?void 0:e.html)||"";return t.includes("gemini.google.com")||t.includes("gem-sys-color")}],PERPLEXITY:[e=>{var r;const t=(null===(r=null==e?void 0:e.result)||void 0===r?void 0:r.html)||(null==e?void 0:e.html)||"";return t.includes("perplexity.ai")||t.includes("prose")}],COPILOT:[e=>{var r;const t=(null===(r=null==e?void 0:e.result)||void 0===r?void 0:r.html)||(null==e?void 0:e.html)||"";return t.includes("copilot.microsoft.com")||t.includes('data-testid="sidebar-container"')}],AIOVERVIEW:[e=>{var r,t,n,o;if(null===(t=null===(r=null==e?void 0:e.result)||void 0===r?void 0:r.aioverview)||void 0===t?void 0:t.text)return!0;if(null===(n=null==e?void 0:e.aioverview)||void 0===n?void 0:n.text)return!0;const a=(null===(o=null==e?void 0:e.result)||void 0===o?void 0:o.html)||(null==e?void 0:e.html)||"";return a.includes("WIZ_global_data")||a.includes("DnVkpd")}],AIMODE:[e=>{var r;const t=(null===(r=null==e?void 0:e.result)||void 0===r?void 0:r.html)||(null==e?void 0:e.html)||"";return t.includes("DZ13He")||t.includes("wYq63b")||t.includes("AI Mode")}],GROK:[e=>{var r;const t=(null===(r=null==e?void 0:e.result)||void 0===r?void 0:r.html)||(null==e?void 0:e.html)||"";return t.includes("grok.com")||t.includes("x.ai")}]};class l{injectStyles(e,r){let t=e;(null==r?void 0:r.baseUrl)&&!e.includes("<base ")&&(t=t.includes("<head>")?t.replace("<head>",`<head><base href="${r.baseUrl}">`):t.replace(/(<html[^>]*>)/i,`$1<head><base href="${r.baseUrl}"></head>`));const n=(null==r?void 0:r.customCSS)||"";return n&&t.includes("<head>")?t=t.replace("<head>",`<head><style>${n}</style>`):n&&(t=t.replace(/(<html[^>]*>)/i,`$1<head><style>${n}</style></head>`)),t}sanitizeHtml(e){let r=e.replace(/<script\b[^>]*>[\s\S]*?<\/script>/gim,"");return r=r.replace(/<noscript[\s\S]*?<\/noscript>/gi,""),r}isFullDocument(e){return/^\s*(<html|<!DOCTYPE)/i.test(e)}removeLinks(e){return e.replace(/<a\b[^>]*>([\s\S]*?)<\/a>/gim,"$1")}wrapFragment(e){return`<!DOCTYPE html>\n<html>\n<head>\n <meta charset="utf-8">\n <meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'none'; style-src 'unsafe-inline';">\n <style>\n body {\n margin: 0;\n padding: 16px;\n font-family: system-ui, -apple-system, sans-serif;\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n img { max-width: 100%; height: auto; }\n body {\n pointer-events: none;\n user-select: none;\n }\n </style>\n</head>\n<body>\n ${e}\n</body>\n</html>`}}class d extends l{constructor(){super(...arguments),this.name="CHATGPT",this.baseUrl="https://chatgpt.com"}extractContent(e){let r="",t="",n=e;return e.result&&(n=e.result),"string"==typeof n?n.trim().startsWith("<")&&n.includes(">")?r=n:t=n:"object"==typeof n&&null!==n&&(n.html?r=n.html:n.content?n.content.trim().startsWith("<")?r=n.content:t=n.content:n.text&&(t=n.text)),{html:r,text:t}}removeLinks(e){return e.replace(/<a\b([^>]*)>/gi,(e,r)=>{const t=r.replace(/\s+href\s*=\s*["'][^"']*["']/gi,"").replace(/\s+alt\s*=\s*["'][^"']*["']/gi,"").replace(/\s+rel\s*=\s*["'][^"']*["']/gi,"").replace(/\s+target\s*=\s*["'][^"']*["']/gi,"").trim();return`<span${t?" "+t:""}>`}).replace(/<\/a>/gi,"</span>")}removeSidebar(e){let r=e;return r=r.replace(/<nav[^>]*>.*?<\/nav>/gis,""),r=r.replace(/<div[^>]*class="[^"]*sidebar[^"]*"[^>]*>.*?<\/div>/gis,""),r}removeFooter(e){let r=e;return r=r.replace(/<div[^>]*id="thread-bottom-container"[^>]*>.*?<\/div><\/div><\/div>/gis,""),r=r.replace(/<div[^>]*id="thread-bottom"[^>]*>.*?<\/div><\/div><\/div><\/div><\/div>/gis,""),r=r.replace(/<div[^>]*class="[^"]*\[grid-area:leading\][^"]*"[^>]*>.*?<\/div><\/div><\/div>/gis,""),r=r.replace(/<div[^>]*class="[^"]*\[grid-area:footer\][^"]*"[^>]*>.*?<\/div><\/div><\/div><\/div><\/div>/gis,""),r=r.replace(/<div[^>]*class="[^"]*\[grid-area:trailing\][^"]*"[^>]*>.*?<\/div><\/div><\/div>/gis,""),r=r.replace(/<div[^>]*\[view-transition-name:var\(--vt-disclaimer\)\][^>]*>.*?<\/div><\/div>/gis,""),r}parse(e,r){var t;const{html:n,text:o}=this.extractContent(e);if(!n)throw new Error("No HTML content found in ChatGPT response");let a=n;const i=null!==(t=null==r?void 0:r.removeFooter)&&void 0!==t&&t;a=this.sanitizeHtml(a),(null==r?void 0:r.removeSidebar)&&(a=this.removeSidebar(a)),i&&(a=this.removeFooter(a)),(null==r?void 0:r.removeLinks)&&(a=this.removeLinks(a));const s=(null==r?void 0:r.invertColors)?'\n /* Force Light Theme (invert from default dark) - only main background */\n html, body, main {\n background-color: #ffffff !important;\n }\n /* Force all text to dark grey (not pure black for better readability) */\n html, body, main, article, div, span, p, h1, h2, h3, h4, h5, h6, li, a, button, strong, label, textarea {\n color: #1A1A1A !important;\n }\n /* Apply light grey background to user message pills */\n .user-message-bubble-color {\n background-color: #F4F4F4 !important;\n }\n /* Apply light grey background to citation pills - highly specific selector */\n a.flex.rounded-xl.px-2.text-\\[9px\\],\n a[class*="rounded-xl"][class*="px-2"][class*="text-\\[9px\\]"],\n span[class*="webpage-citation-pill"] a {\n background-color: #F4F4F4 !important;\n }\n /* Invert scroll button colors */\n button.rounded-full.w-8.h-8.bg-token-main-surface-primary,\n button[class*="rounded-full"][class*="w-8"][class*="h-8"] {\n background-color: #ffffff !important;\n border-color: #E5E5E5 !important;\n }\n /* Invert composer box */\n div[data-composer-surface="true"],\n div.bg-token-bg-primary.dark\\:bg-\\[\\#303030\\] {\n background-color: #ffffff !important;\n border: 1px solid #E5E5E5 !important;\n }\n /* Invert composer pills */\n button.__composer-pill,\n [class*="__composer-pill"] {\n background-color: #F4F4F4 !important;\n border: 1px solid #E5E5E5 !important;\n }\n ':"";return a=this.injectStyles(a,{baseUrl:this.baseUrl,customCSS:s}),{provider:this.name,html:a,text:o,metadata:{isFullDocument:this.isFullDocument(a),sidebarRemoved:(null==r?void 0:r.removeSidebar)||!1,footerRemoved:i,linksRemoved:(null==r?void 0:r.removeLinks)||!1,colorsInverted:(null==r?void 0:r.invertColors)||!1}}}}class c extends l{constructor(){super(...arguments),this.name="GEMINI",this.baseUrl="https://gemini.google.com"}extractContent(e){let r="",t="",n=[],o=e;return e.result&&(o=e.result),"string"==typeof o?o.trim().startsWith("<")&&o.includes(">")?r=o:t=o:"object"==typeof o&&null!==o&&(o.html?r=o.html:o.content?o.content.trim().startsWith("<")?r=o.content:t=o.content:o.text&&(t=o.text),o.aioverview&&(o.aioverview.text&&(t=o.aioverview.text),o.aioverview.sources&&(n=o.aioverview.sources))),{html:r,text:t,sources:n}}removeHeader(e){let r=e;return r=r.replace(/<div[^>]*class="[^"]*boqOnegoogleliteOgbOneGoogleBar[^"]*"[^>]*>.*?<\/div><\/div><\/div><\/div>/gis,""),r=r.replace(/<div[^>]*class="[^"]*side-nav-menu-button[^"]*"[^>]*>.*?<\/div>/gis,""),r=r.replace(/<top-bar-actions[^>]*>.*?<\/top-bar-actions>/gis,""),r=r.replace(/<div[^>]*class="[^"]*desktop-ogb-buffer[^"]*"[^>]*><\/div>/gis,""),r}removeFooter(e){return e.replace(/<input-container[^>]*>.*?<\/input-container>/gis,"")}removeSidebar(e){return e.replace(/<bard-sidenav[^>]*>.*?<\/bard-sidenav>/gis,"")}parse(e,r){var t,n;const{html:o,text:a,sources:i}=this.extractContent(e);if(!o)throw new Error("No HTML content found in Gemini response");let s=o;const l=null!==(t=null==r?void 0:r.removeHeader)&&void 0!==t&&t,d=null!==(n=null==r?void 0:r.removeFooter)&&void 0!==n&&n;s=this.sanitizeHtml(s),l&&(s=this.removeHeader(s)),d&&(s=this.removeFooter(s)),(null==r?void 0:r.removeSidebar)&&(s=this.removeSidebar(s)),(null==r?void 0:r.removeLinks)&&(s=this.removeLinks(s));const c=(null==r?void 0:r.invertColors)?'\n html {\n color-scheme: light !important;\n }\n /* Force Light Theme (invert from default dark) - only main background */\n html, body, main {\n background-color: #ffffff !important;\n }\n /* Force all text to dark grey (not pure black for better readability) */\n html, body, main, article, div, span, p, h1, h2, h3, h4, h5, h6, li, a, button, strong, label, textarea {\n color: #1A1A1A !important;\n }\n /* User message bubbles - Gemini specific classes */\n .user-query-bubble-with-background,\n .user-query-container,\n .query-text,\n .query-text-line {\n background-color: #F4F4F4 !important;\n color: #1A1A1A !important;\n }\n /* AI response bubbles - Gemini specific classes */\n .model-response-text,\n .response-container,\n .response-container-content,\n .response-content {\n background-color: #ffffff !important;\n color: #1A1A1A !important;\n }\n /* Input/composer area - Gemini specific classes */\n input-area-v2,\n .input-area,\n .input-area-container,\n .text-input-field,\n .text-input-field_textarea-wrapper,\n .text-input-field-main-area,\n .text-input-field_textarea-inner,\n .text-input-field_textarea,\n .ql-editor,\n .textarea,\n .input-buttons-wrapper-bottom {\n background-color: #ffffff !important;\n color: #1A1A1A !important;\n border-color: #E5E5E5 !important;\n }\n /* Input gradient - remove the dark gradient overlay */\n input-container,\n .input-gradient {\n background: transparent !important;\n }\n input-container::before,\n .input-gradient::before {\n background: linear-gradient(transparent, #ffffff) !important;\n content: none !important;\n }\n /* Input placeholder text */\n .ql-editor::before,\n .textarea::placeholder {\n color: #666666 !important;\n }\n /* Buttons */\n button, [role="button"] {\n background-color: #F4F4F4 !important;\n color: #1A1A1A !important;\n border-color: #E5E5E5 !important;\n }\n /* Links */\n a {\n color: #1a73e8 !important;\n }\n /* Code blocks */\n pre, code, [class*="code"] {\n background-color: #f5f5f5 !important;\n color: #1A1A1A !important;\n border-color: #E5E5E5 !important;\n }\n /* Tables */\n table, td, th {\n background-color: #ffffff !important;\n border-color: #E5E5E5 !important;\n color: #1A1A1A !important;\n }\n /* Force borders to be visible */\n [class*="border"], hr {\n border-color: #E5E5E5 !important;\n }\n /* Cards and containers */\n [class*="card"], [class*="container"] {\n background-color: #ffffff !important;\n border-color: #E5E5E5 !important;\n }\n ':"";return s=this.injectStyles(s,{baseUrl:this.baseUrl,customCSS:c}),{provider:this.name,html:s,text:a,sources:i,metadata:{isFullDocument:this.isFullDocument(s),headerRemoved:l,footerRemoved:d,sidebarRemoved:(null==r?void 0:r.removeSidebar)||!1,linksRemoved:(null==r?void 0:r.removeLinks)||!1,colorsInverted:(null==r?void 0:r.invertColors)||!1}}}}class m extends l{constructor(){super(...arguments),this.name="PERPLEXITY",this.baseUrl="https://www.perplexity.ai"}extractContent(e){let r="",t="",n=e;return e.result&&(n=e.result),"string"==typeof n?n.trim().startsWith("<")&&n.includes(">")?r=n:t=n:"object"==typeof n&&null!==n&&(n.html?r=n.html:n.content?n.content.trim().startsWith("<")?r=n.content:t=n.content:n.text&&(t=n.text)),{html:r,text:t}}removeHeader(e){return e.replace(/<div[^>]*class="[^"]*@container\/header[^"]*"[^>]*>.*?<div[^>]*class="[^"]*absolute bottom-0 inset-x-0 border-b[^"]*"[^>]*><\/div>/gis,"")}removeFooter(e){let r=e;return r=r.replace(/<div[^>]*class="[^"]*erp-sidecar:fixed erp-sidecar:w-full bottom-safeAreaInsetBottom p-md pointer-events-none z-10 absolute border-subtlest ring-subtlest divide-subtlest bg-transparent[^"]*"[^>]*>[\s\S]*?(?=<div[^>]*class="[^"]*fixed inset-y-0 right-0[^"]*")/gis,""),r}parse(e,r){var t,n;const{html:o,text:a}=this.extractContent(e);if(!o)throw new Error("No HTML content found in Perplexity response");let i=o;const s=null!==(t=null==r?void 0:r.removeHeader)&&void 0!==t&&t,l=null!==(n=null==r?void 0:r.removeFooter)&&void 0!==n&&n;i=this.sanitizeHtml(i),s&&(i=this.removeHeader(i)),l&&(i=this.removeFooter(i)),(null==r?void 0:r.removeLinks)&&(i=this.removeLinks(i));const d=(null==r?void 0:r.invertColors)?"\n html {\n filter: invert(1) hue-rotate(180deg);\n background-color: white !important;\n }\n ":"";return i=this.injectStyles(i,{baseUrl:this.baseUrl,customCSS:d}),{provider:this.name,html:i,text:a,metadata:{isFullDocument:this.isFullDocument(i),linksRemoved:(null==r?void 0:r.removeLinks)||!1,colorsInverted:(null==r?void 0:r.invertColors)||!1,headerRemoved:s,footerRemoved:l}}}}class u extends l{constructor(){super(...arguments),this.name="COPILOT",this.baseUrl="https://copilot.microsoft.com"}extractContent(e){let r="",t="",n=e;return e.result&&(n=e.result),"string"==typeof n?n.trim().startsWith("<")&&n.includes(">")?r=n:t=n:"object"==typeof n&&null!==n&&(n.html?r=n.html:n.content?n.content.trim().startsWith("<")?r=n.content:t=n.content:n.text&&(t=n.text)),{html:r,text:t}}removeHeader(e){let r=e;return r=r.replace(/<div[^>]*class="[^"]*relative shrink-0 min-h-14[^"]*"[^>]*data-testid="backstage-chats"[^>]*>.*?<\/div>/gis,""),r=r.replace(/<div[^>]*class="[^"]*flex items-center px-6 mx-auto w-full max-w-chat[^"]*"[^>]*>.*?<span[^>]*data-testid="date-divider"[^>]*>.*?<\/span>.*?<div[^>]*class="[^"]*border-t-\[1px\][^"]*"[^>]*>.*?<\/div>.*?<\/div>/gis,""),r=r.replace(/<div[^>]*class="[^"]*absolute flex end-6 origin-top-right flex-col items-end[^"]*"[^>]*data-testid="settings-wrapper"[^>]*>.*?<\/div><\/div>/gis,""),r}removeFooter(e){let r=e;return r=r.replace(/<div[^>]*class="[^"]*absolute bottom-0 w-full[^"]*"[^>]*>.*?<\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div>/gis,""),r=r.replace(/<div[^>]*class="[^"]*mt-\[var\(--composer-container-height\)\][^"]*"[^>]*><\/div>/gis,""),r=r.replace(/<div[^>]*class="[^"]*pointer-events-none absolute flex justify-center z-20 inset-x-0 bottom-\[calc\(var\(--composer-container-height\)\+1rem\)\][^"]*"[^>]*>.*?<button[^>]*data-testid="scroll-to-bottom-button"[^>]*>.*?<\/button><\/div>/gis,""),r}removeCookieBanner(e){let r=e;return r=r.replace(/<div[^>]*id="cookie-banner"[^>]*>.*?<\/div>.*?<\/div>.*?<\/div>.*?<\/div>/gis,""),r=r.replace(/<div[^>]*class="[^"]*max-w-cookie-banner[^"]*"[^>]*>.*?<\/div>.*?<\/div>.*?<\/div>.*?<\/div>/gis,""),r}removeSidebar(e){let r=e;return r=r.replace(/<div[^>]*class="[^"]*absolute h-full w-0 will-change-auto max-md:bg-sidebar-light[^"]*"[^>]*style="[^"]*"[^>]*>.*?<main/gis,"<main"),r}parse(e,r){var t,n;const{html:o,text:a}=this.extractContent(e);if(!o)throw new Error("No HTML content found in Copilot response");let i=o;const s=null!==(t=null==r?void 0:r.removeHeader)&&void 0!==t&&t,l=null!==(n=null==r?void 0:r.removeFooter)&&void 0!==n&&n;i=this.sanitizeHtml(i),i=this.removeCookieBanner(i),s&&(i=this.removeHeader(i)),l&&(i=this.removeFooter(i)),(null==r?void 0:r.removeSidebar)&&(i=this.removeSidebar(i)),(null==r?void 0:r.removeLinks)&&(i=this.removeLinks(i));const d=(null==r?void 0:r.invertColors)?'\n html {\n color-scheme: light !important;\n }\n /* Force Light Theme (invert from default dark) - only main background */\n html, body, main {\n background-color: #ffffff !important;\n }\n /* Force all text to dark grey (not pure black for better readability) */\n html, body, main, article, div, span, p, h1, h2, h3, h4, h5, h6, li, a, button, strong, label, textarea {\n color: #1A1A1A !important;\n }\n /* User message bubbles - Copilot uses bg-accent-250/60 */\n .bg-accent-250\\/60,\n [class*="bg-accent-250"] {\n background-color: #F4F4F4 !important;\n color: #1A1A1A !important;\n }\n /* Override dark mode user message background */\n .dark\\:bg-accent-200,\n [class*="dark:bg-accent"] {\n background-color: #F4F4F4 !important;\n }\n /* AI response bubbles */\n [class*="ai-message"] {\n background-color: #ffffff !important;\n color: #1A1A1A !important;\n }\n /* Sidebar */\n .bg-sidebar-dark, [class*="bg-sidebar-dark"] {\n background-color: #ffffff !important;\n }\n /* Composer/input area */\n [class*="composer"], [class*="bottom-0"] {\n background-color: #ffffff !important;\n border-color: #E5E5E5 !important;\n }\n /* Input textarea */\n textarea {\n background-color: #F4F4F4 !important;\n color: #1A1A1A !important;\n }\n textarea::placeholder {\n color: #666666 !important;\n }\n /* Buttons - only override dark mode backgrounds, let transparent buttons stay transparent */\n [class*="dark:bg-background-350\\/60"],\n [class*="dark:bg-black"],\n [class*="dark:bg-muted"] {\n background-color: #F4F4F4 !important;\n }\n /* Don\'t override bg-transparent buttons */\n .bg-transparent {\n background-color: transparent !important;\n }\n /* Override button dark mode backgrounds */\n .dark\\:bg-background-350\\/60,\n [class*="dark:bg-background"] {\n background-color: #F4F4F4 !important;\n }\n /* Override dark mode borders (before:border-black/8) */\n .dark\\:border-black\\/8,\n [class*="dark:border-black"] {\n border-color: #E5E5E5 !important;\n }\n /* Keep transparent borders */\n .after\\:border-transparent,\n [class*="border-transparent"] {\n border-color: transparent !important;\n }\n /* Override dark mode fill colors */\n .dark\\:fill-white,\n [class*="dark:fill"] {\n fill: #1A1A1A !important;\n }\n /* Links */\n a {\n color: #1a73e8 !important;\n }\n /* Override dark mode accent colors */\n .dark\\:text-accent-600,\n [class*="dark:text-accent"] {\n color: #1a73e8 !important;\n }\n /* Code blocks */\n pre, code, [class*="code"] {\n background-color: #f5f5f5 !important;\n color: #1A1A1A !important;\n border-color: #E5E5E5 !important;\n }\n /* Tables - override dark mode background */\n .dark\\:bg-black\\/25,\n [class*="dark:bg-black"] {\n background-color: #ffffff !important;\n }\n table, td, th {\n background-color: #ffffff !important;\n border-color: #E5E5E5 !important;\n color: #1A1A1A !important;\n }\n /* Override dark mode table borders */\n .dark\\:border-stroke-450,\n [class*="dark:border-stroke"] {\n border-color: #E5E5E5 !important;\n }\n /* Force borders to be visible */\n [class*="border"], hr {\n border-color: #E5E5E5 !important;\n }\n /* Foreground colors */\n .text-foreground-800, [class*="text-foreground"] {\n color: #1A1A1A !important;\n }\n /* Override dark mode foreground text */\n .dark\\:fill-white,\n [class*="dark:text-foreground"] {\n color: #1A1A1A !important;\n }\n /* Override dark mode background opacity classes */\n [class*="dark:bg-background-100"],\n [class*="dark:bg-background-150"],\n [class*="dark:bg-background-200"],\n [class*="dark:bg-background-250"],\n [class*="dark:bg-background-350"],\n [class*="dark:bg-background-800"],\n [class*="dark:bg-background-850"],\n [class*="dark:bg-muted-200"],\n [class*="dark:bg-muted-400"],\n [class*="dark:bg-muted-450"] {\n background-color: #F4F4F4 !important;\n }\n /* Override light mode background classes to pure white/gray */\n .bg-background-100,\n .bg-background-150,\n .bg-background-200,\n .bg-background-250,\n [class*="bg-background-1"],\n [class*="bg-background-2"] {\n background-color: #ffffff !important;\n }\n .bg-background-350,\n .bg-background-800,\n .bg-background-850,\n .bg-accent-100,\n .bg-accent-250,\n [class*="bg-accent-1"],\n [class*="bg-accent-2"] {\n background-color: #F4F4F4 !important;\n }\n /* Citation pills - override dark mode */\n .dark\\:bg-white\\/5,\n [class*="dark:bg-white/5"],\n [class*="hover\\:dark\\:bg-accent-250"],\n [class*="focus\\:dark\\:bg-accent-250"] {\n background-color: #F4F4F4 !important;\n }\n /* Citation pills text color */\n .text-foreground-750,\n [class*="text-foreground-750"],\n [class*="dark\\:text-foreground-750"] {\n color: #1A1A1A !important;\n }\n /* Override bg-white/X with dark:bg-background-X pattern */\n .bg-white\\/40,\n .bg-white\\/25,\n .bg-white\\/50,\n .bg-white\\/70,\n .bg-white\\/90,\n [class*="bg-white\\/"] {\n background-color: #ffffff !important;\n }\n /* Pseudo-element overrides - before: gradients */\n [class*="before:from-sidebar-dark"],\n [class*="before:to-sidebar-dark"],\n [class*="dark\\:before:from-sidebar"],\n [class*="dark\\:before:to-sidebar"] {\n background: linear-gradient(transparent, #ffffff) !important;\n }\n /* Override all before: opacity and gradient classes */\n [class*="before:opacity"],\n [class*="before:bg-gradient"],\n [class*="before:from-transparent"],\n [class*="before:to-"] {\n background: linear-gradient(transparent, rgba(255, 255, 255, 0.9)) !important;\n }\n /* Force all before: pseudo-elements to have white/light gradients */\n .before\\:opacity-90\\:before,\n [class*="before:opacity-90"]::before {\n background: linear-gradient(to bottom, transparent, rgba(255, 255, 255, 0.9)) !important;\n }\n /* Pseudo-element overrides - before: borders */\n [class*="before:border-black"],\n [class*="dark\\:before:border-black"] {\n border-color: #E5E5E5 !important;\n }\n /* Pseudo-element overrides - after: borders */\n [class*="after:border-white"],\n [class*="dark\\:after:border-white"] {\n border-color: #E5E5E5 !important;\n }\n /* Pseudo-element overrides - hover states */\n [class*="dark\\:safe-hover:bg-white"],\n [class*="dark\\:active:bg-white"],\n [class*="dark\\:safe-hover\\:before:bg-white"] {\n background-color: #F4F4F4 !important;\n }\n /* Pseudo-element overrides - after:hover */\n [class*="dark\\:after\\:hover:bg-white"],\n [class*="max-md\\:dark\\:after\\:hover"] {\n background-color: rgba(244, 244, 244, 0.5) !important;\n }\n /* Override dark mode marker colors */\n [class*="dark\\:marker:text-foreground"] {\n color: #1A1A1A !important;\n }\n /* Force all before/after pseudo-elements to light colors */\n ::before,\n ::after {\n background-color: transparent !important;\n border-color: #E5E5E5 !important;\n }\n /* Scroll-to-bottom button outer container - force transparent */\n [class*="inset-x-0"][class*="bottom-["],\n .pointer-events-none.absolute.flex.justify-center {\n background-color: transparent !important;\n background: transparent !important;\n }\n [data-testid="scroll-to-bottom-button"] {\n background-color: transparent !important;\n }\n ':"\n /* No color inversion - keep default dark theme */\n ";return i=this.injectStyles(i,{baseUrl:this.baseUrl,customCSS:d}),{provider:this.name,html:i,text:a,metadata:{isFullDocument:this.isFullDocument(i),cookieBannerRemoved:!0,headerRemoved:s,footerRemoved:l,sidebarRemoved:(null==r?void 0:r.removeSidebar)||!1,linksRemoved:(null==r?void 0:r.removeLinks)||!1,colorsInverted:(null==r?void 0:r.invertColors)||!1}}}}class v extends l{constructor(){super(...arguments),this.name="AIOVERVIEW",this.baseUrl="https://www.google.com"}extractContent(e){let r="",t=[],n=e;return e.result&&(n=e.result),n.aioverview&&n.aioverview.sources&&(t=n.aioverview.sources),"string"==typeof n?n.trim().startsWith("<")&&n.includes(">")&&(r=n):"object"==typeof n&&null!==n&&(n.html?r=n.html:n.content&&n.content.trim().startsWith("<")&&(r=n.content)),{html:r,sources:t}}removeHeader(e){return e}removeFooter(e){return e}removeSidebar(e){return e}parse(e,r){var t,n;const{html:o,sources:a}=this.extractContent(e);if(!o)throw new Error("No HTML content found in AI Overview response");let i=o;const s=null===(t=null==r?void 0:r.removeHeader)||void 0===t||t,l=null===(n=null==r?void 0:r.removeFooter)||void 0===n||n;i=this.sanitizeHtml(i),s&&(i=this.removeHeader(i)),l&&(i=this.removeFooter(i)),(null==r?void 0:r.removeSidebar)&&(i=this.removeSidebar(i)),(null==r?void 0:r.removeLinks)&&(i=this.removeLinks(i));let d="";return(null==r?void 0:r.invertColors)?d+="\n /* Dark theme */\n html, body, main, article, footer, form {\n background-color: #131314 !important;\n color: #e3e3e3 !important;\n }\n ":d+='\n /* Light theme - force all backgrounds to white */\n *, div, span, p, a, li, td, th, section, article, main, aside, nav, header, footer {\n background-color: #ffffff !important;\n }\n\n html, body, main, article, footer, form {\n background-color: #ffffff !important;\n }\n\n /* Force dark text color on all text elements */\n *, p, span, div, h1, h2, h3, h4, h5, h6, li, td, th, strong, b, em, i, a {\n color: #1a1a1a !important;\n }\n\n /* Force borders and dividers to be visible */\n hr, [class*="border"], [class*="divider"], [class*="separator"],\n [class*="border-t"], [class*="border-b"], [class*="border-l"], [class*="border-r"],\n table, tr, td, th {\n border-color: #d4d4d4 !important;\n }\n ',s&&(d+='\n /* Header hiding */\n header, #header, #searchform, .sfbg, #appbar,\n div[role="navigation"], #leftnav, #sidetogether,\n [role="banner"], .Fgvgjc, #hdtb, .hdtb-msb,\n .DZ13He, .wYq63b, .eT9Cje, .bNg8Rb, .S6VXfe, .Lu57id {\n display: none !important;\n }\n '),(null==r?void 0:r.removeSidebar)&&(d+="\n /* Sidebar hiding */\n #leftnav, #sidetogether {\n display: none !important;\n }\n "),l&&(d+='\n /* Footer hiding */\n footer, #footer, .fbar,\n .pdp-nav, [aria-label="Main menu"], .gb_Td, .gb_L {\n display: none !important;\n }\n '),i=this.injectStyles(i,{baseUrl:this.baseUrl,customCSS:d}),{provider:this.name,html:i,sources:a,metadata:{isFullDocument:this.isFullDocument(i),headerRemoved:s,footerRemoved:l,sidebarRemoved:(null==r?void 0:r.removeSidebar)||!1,linksRemoved:(null==r?void 0:r.removeLinks)||!1,colorsInverted:(null==r?void 0:r.invertColors)||!1}}}}class b extends l{constructor(){super(...arguments),this.name="AIMODE",this.baseUrl="https://www.google.com"}extractContent(e){let r="",t="",n=e;return e.result&&(n=e.result),"string"==typeof n?n.trim().startsWith("<")&&n.includes(">")?r=n:t=n:"object"==typeof n&&null!==n&&(n.html?r=n.html:n.content?n.content.trim().startsWith("<")?r=n.content:t=n.content:n.text&&(t=n.text)),{html:r,text:t}}removeHeader(e){let r=e;return r=r.replace(/<div[^>]*jsname="oEQ3x"[^>]*class="[^"]*DZ13He[^"]*"[^>]*>.*?<hr class="e9c7U">.*?<\/div><\/div><\/div><\/div><\/div>/gis,""),r}removeFooter(e){let r=e;return r=r.replace(/<div[^>]*data-xid="aim-mars-input-plate"[^>]*>[\s\S]*?<\/div><\/div><\/div><\/div><\/div>/gis,""),r=r.replace(/<div[^>]*jscontroller="P5gZDb"[^>]*>[\s\S]*?<\/div><\/div><\/div>/gis,""),r=r.replace(/<div[^>]*class="[^"]*t0ITR hh3ttd[^"]*"[^>]*>[\s\S]*?<\/div><\/div>/gis,""),r=r.replace(/<div[^>]*class="[^"]*y4VEUd vve6Ce[^"]*"[^>]*>[\s\S]*?<\/div><\/div>/gis,""),r}removeSidebar(e){let r=e;return r=r.replace(/<div[^>]*class="[^"]*ho072b[^"]*"[^>]*aria-label="AI Mode history"[^>]*>[\s\S]*?<\/div><\/div><\/div><\/div><\/div><\/div>/gis,""),r=r.replace(/<div[^>]*jsname="NlVIob"[^>]*class="[^"]*qEn1od[^"]*"[^>]*>[\s\S]*?<\/div><\/div><\/div>/gis,""),r=r.replace(/<div[^>]*class="[^"]*OEwhSe[^"]*"[^>]*>[\s\S]*?<\/div><\/div>/gis,""),r=r.replace(/<button[^>]*aria-label="Start new search"[^>]*>[\s\S]*?<\/button>/gis,""),r=r.replace(/<button[^>]*aria-label="AI Mode history"[^>]*>[\s\S]*?<\/button>/gis,""),r}parse(e,r){var t,n;const{html:o,text:a}=this.extractContent(e);if(!o)throw new Error("No HTML content found in AI Mode response");let i=o;const s=null===(t=null==r?void 0:r.removeHeader)||void 0===t||t,l=null===(n=null==r?void 0:r.removeFooter)||void 0===n||n;i=this.sanitizeHtml(i),s&&(i=this.removeHeader(i)),l&&(i=this.removeFooter(i)),(null==r?void 0:r.removeSidebar)&&(i=this.removeSidebar(i)),(null==r?void 0:r.removeLinks)&&(i=this.removeLinks(i));let d="";return d+="\n .KxvlWc, #CXQnmb {\n display: none !important;\n }\n ",(null==r?void 0:r.invertColors)?d+="\n /* Dark theme */\n html, body, main, article, footer, form {\n background-color: #131314 !important;\n color: #e3e3e3 !important;\n }\n ":d+='\n /* Light theme - force all backgrounds to white */\n *, div, span, p, a, li, td, th, section, article, main, aside, nav, header, footer {\n background-color: #ffffff !important;\n }\n\n html, body, main, article, footer, form {\n background-color: #ffffff !important;\n }\n\n /* Force dark text color on all text elements */\n *, p, span, div, h1, h2, h3, h4, h5, h6, li, td, th, strong, b, em, i, a {\n color: #1a1a1a !important;\n }\n\n /* Force borders and dividers to be visible */\n hr, [class*="border"], [class*="divider"], [class*="separator"],\n [class*="border-t"], [class*="border-b"], [class*="border-l"], [class*="border-r"],\n table, tr, td, th {\n border-color: #d4d4d4 !important;\n }\n ',s&&(d+='\n /* Header hiding */\n header, #header, #searchform, .sfbg, #appbar,\n div[role="navigation"], #leftnav, #sidetogether,\n [role="banner"], .Fgvgjc, #hdtb, .hdtb-msb,\n .DZ13He, .wYq63b, .eT9Cje, .bNg8Rb, .S6VXfe, .Lu57id {\n display: none !important;\n }\n '),(null==r?void 0:r.removeSidebar)&&(d+="\n /* Sidebar hiding */\n #leftnav, #sidetogether {\n display: none !important;\n }\n "),l&&(d+='\n /* Footer hiding */\n footer, #footer, .fbar,\n .pdp-nav, [aria-label="Main menu"], .gb_Td, .gb_L {\n display: none !important;\n }\n '),i=this.injectStyles(i,{baseUrl:this.baseUrl,customCSS:d}),{provider:this.name,html:i,text:a,metadata:{isFullDocument:this.isFullDocument(i),headerRemoved:s,footerRemoved:l,sidebarRemoved:(null==r?void 0:r.removeSidebar)||!1,linksRemoved:(null==r?void 0:r.removeLinks)||!1,colorsInverted:(null==r?void 0:r.invertColors)||!1}}}}class p extends l{constructor(){super(...arguments),this.name="GROK",this.baseUrl="https://grok.com"}extractContent(e){let r="",t="",n=e;return e.result&&(n=e.result),"string"==typeof n?n.trim().startsWith("<")&&n.includes(">")?r=n:t=n:"object"==typeof n&&null!==n&&(n.html?r=n.html:n.content?n.content.trim().startsWith("<")?r=n.content:t=n.content:n.text&&(t=n.text)),{html:r,text:t}}removeHeader(e){let r=e;const t=r.match(/<div[^>]*class="[^"]*h-16\s+top-0\s+@\[80rem\]\/nav:h-0[^"]*"[^>]*>/gi);if(!t)return r;const n=r.indexOf(t[0]);if(-1===n)return r;const o=r.substring(n+t[0].length);let a=1,i=0,s=!1;for(;i<o.length&&!s;){const e=o.indexOf("<div",i),r=o.indexOf("</div>",i);if(-1===e&&-1===r)break;if(-1!==r&&(-1===e||r<e))a--,i=r+6,0===a&&(s=!0);else if(-1!==e){a++;const r=o.indexOf(">",e);if(-1===r)break;i=r+1}}if(s){const e=n+t[0].length+i;r=r.substring(0,n)+r.substring(e)}return r}removeFooter(e){let r=e;const t=r.match(/<div[^>]*class="[^"]*absolute\s+inset-x-0\s+bottom-0\s+mx-auto\s+max-w-breakout\s+z-40\s+print:hidden[^"]*"[^>]*>/gi);if(!t)return r;const n=r.indexOf(t[0]);if(-1===n)return r;const o=r.substring(n),a=o.match(/<\/main>/gi);if(!a)return r;const i=n+o.indexOf(a[0]);return r=r.substring(0,n)+r.substring(i),r}parse(e,r){const{html:t,text:n}=this.extractContent(e);if(!t)throw new Error("No HTML content found in Grok response");let o=t;o=this.sanitizeHtml(o),(null==r?void 0:r.removeHeader)&&(o=this.removeHeader(o)),(null==r?void 0:r.removeFooter)&&(o=this.removeFooter(o)),(null==r?void 0:r.invertColors)&&(o=o.replace(/\s*class\s*=\s*"[^"]*dark[^"]*"/gi,e=>e.replace(/\bdark\b/g,"").replace(/\s+/g," ").replace('class=""','class="light"').replace(/^class=""/,'class="light"').replace(/class="\s+/,'class="').replace(/\s+"/,'"')),o=o.replace(/color-scheme:\s*dark/gi,"color-scheme: light")),(null==r?void 0:r.removeLinks)&&(o=this.removeLinks(o));const a=(null==r?void 0:r.invertColors)?'\n html {\n color-scheme: light !important;\n }\n /* Force light background and dark text for all elements */\n html, body {\n background-color: #ffffff !important;\n color: #1a1a1a !important;\n }\n /* Override Tailwind dark mode classes */\n .dark, [class*="dark"] {\n color-scheme: light !important;\n }\n /* Override common Grok CSS variables and classes */\n [class*="bg-"], [class*="background"] {\n background-color: #ffffff !important;\n }\n [class*="text-"], [class*="fg-"] {\n color: #1a1a1a !important;\n }\n /* Override surface and foreground colors */\n .bg-surface-base, .bg-surface, .surface {\n background-color: #f9f9f9 !important;\n }\n .text-fg-primary, .text-fg, .fg-primary {\n color: #1a1a1a !important;\n }\n /* Force borders to be visible */\n [class*="border"], hr, table, td, th {\n border-color: #d4d4d4 !important;\n }\n /* Code blocks */\n pre, code, [class*="code"] {\n background-color: #f5f5f5 !important;\n color: #1a1a1a !important;\n border-color: #d4d4d4 !important;\n }\n ':"\n /* Force light mode styling for Grok */\n html, body {\n background-color: #ffffff !important;\n color: #1a1a1a !important;\n }\n .bg-surface-base, .bg-surface {\n background-color: #f9f9f9 !important;\n }\n .text-fg-primary, .text-fg {\n color: #1a1a1a !important;\n }\n ";return o=this.injectStyles(o,{baseUrl:this.baseUrl,customCSS:a}),{provider:this.name,html:o,text:n,metadata:{isFullDocument:this.isFullDocument(o),linksRemoved:(null==r?void 0:r.removeLinks)||!1,colorsInverted:(null==r?void 0:r.invertColors)||!1,headerRemoved:(null==r?void 0:r.removeHeader)||!1,footerRemoved:(null==r?void 0:r.removeFooter)||!1}}}}const h=new class{constructor(){this.providers=new Map,this.providers.set("CHATGPT",new d),this.providers.set("GEMINI",new c),this.providers.set("PERPLEXITY",new m),this.providers.set("COPILOT",new u),this.providers.set("AIOVERVIEW",new v),this.providers.set("AIMODE",new b),this.providers.set("GROK",new p)}parse(e,r){const t=s.detect(e);if(!t)return this.parseGeneric(e);const n=this.providers.get(t.provider);if(!n)return null;try{const o=n.parse(e,r);return{...o,metadata:{...o.metadata,detectionConfidence:t.confidence}}}catch(e){return console.error(`Failed to parse response with ${t.provider}:`,e),null}}parseWithProvider(e,r,t){const n=this.providers.get(r);if(!n)throw new Error(`Unknown provider: ${r}`);try{return n.parse(e,t)}catch(e){return console.error(`Failed to parse response with ${r}:`,e),null}}detectProvider(e){const r=s.detect(e);return(null==r?void 0:r.provider)||null}detectAllProviders(e){return s.getAllProviders(e)}parseGeneric(e){let r="",t="";let n=e;var o;return e.result&&(n=e.result),"string"==typeof(o=n)?o.trim().startsWith("<")&&o.includes(">")?r=o:t=o:"object"==typeof o&&null!==o&&(o.html?r=o.html:o.content?o.content.trim().startsWith("<")?r=o.content:t=o.content:o.text&&(t=o.text)),r||t?(r&&(r=r.replace(/<script\b[^>]*>[\s\S]*?<\/script>/gim,""),r=r.replace(/<noscript[\s\S]*?<\/noscript>/gi,"")),{provider:"CHATGPT",html:r,text:t,metadata:{isGeneric:!0}}):null}getSupportedProviders(){return Array.from(this.providers.keys())}registerProvider(e,r){this.providers.set(e,r)}},f=(e,r)=>h.parse(e,r);function g(e,r={}){const{autoDetect:t=!0,provider:i,removeLinks:s=!1,invertColors:l=!1,removeHeader:d=!1,removeFooter:c=!1,removeSidebar:m=!1,onProviderDetected:u,onError:v}=r,[b,p]=n(!1),[g,k]=n(null),[x,y]=n(null),[w,F]=n(0),E=o(()=>i||(t&&e?(e=>h.detectProvider(e))(e):null),[e,i,t]);a(()=>{null==u||u(E)},[E,u]),a(()=>{if(!e)return y(null),void k(null);p(!0),k(null);try{const r={removeLinks:s,invertColors:l,removeHeader:d,removeFooter:c,removeSidebar:m};let t;t=f(e,r),y(t)}catch(e){const r=e instanceof Error?e:new Error("Failed to parse AI response");k(r),null==v||v(r)}finally{p(!1)}},[e,s,l,d,c,m,i,w,v]);return{parsed:x,provider:(null==x?void 0:x.provider)||E,isLoading:b,error:g,html:(null==x?void 0:x.html)||null,text:(null==x?void 0:x.text)||null,sources:(null==x?void 0:x.sources)||null,reparse:()=>{F(e=>e+1)}}}const k=i(({html:r,className:t="",style:n,sandbox:o="allow-popups allow-same-origin",title:a="AI Response",onLoad:i,onError:s},l)=>{const d=()=>{null==i||i()},c=()=>{null==s||s()};return r.trim().startsWith("http")?e("iframe",{ref:l,src:r,className:t,style:n,sandbox:o,title:a,onLoad:d,onError:c}):e("iframe",{ref:l,srcDoc:r,className:t,style:n,sandbox:o,title:a,onLoad:d,onError:c})});k.displayName="IframeRenderer";const x=({response:n,className:o="",style:a,iframeProps:i={},loadingComponent:s,errorComponent:l,fallbackComponent:d,onRenderComplete:c,...m})=>{const{parsed:u,provider:v,isLoading:b,error:p,html:h,text:f,reparse:x}=g(n,m);return t.useEffect(()=>{!h||b||p||null==c||c(h)},[h,b,p,c]),b?s?e(s,{isLoading:!0}):e("div",{className:`ai-response-loading ${o}`,style:a,children:r("div",{className:"animate-pulse",children:[e("div",{className:"h-4 bg-gray-300 rounded w-3/4 mb-2"}),e("div",{className:"h-4 bg-gray-300 rounded w-1/2 mb-2"}),e("div",{className:"h-4 bg-gray-300 rounded w-5/6"})]})}):p?l?e(l,{error:p,retry:x}):e("div",{className:`ai-response-error ${o}`,style:a,children:r("div",{className:"text-red-500",children:[e("p",{children:"Failed to render AI response:"}),e("p",{className:"text-sm",children:p.message}),e("button",{onClick:()=>x(),className:"mt-2 px-3 py-1 bg-red-100 text-red-700 rounded hover:bg-red-200",children:"Retry"})]})}):u||h||f?!h&&f?e("div",{className:`ai-response-text ${o}`,style:{...a,whiteSpace:"pre-wrap",wordWrap:"break-word"},children:f}):h?e("div",{className:`ai-response-container ${o}`,style:a,children:e(k,{html:h,className:"w-full h-full border-0 rounded-md",title:`${v||"AI"} Response`,...i})}):null:d?e(d,{provider:v}):e("div",{className:`ai-response-empty ${o}`,style:a,children:r("div",{className:"text-gray-500 text-center",children:[e("p",{children:"No content available"}),v&&r("p",{className:"text-sm",children:["Detected provider: ",v]})]})})};x.displayName="ResponseRenderer";export{k as IframeRenderer,x as ResponseRenderer,g as useResponse};
2
- //# sourceMappingURL=index.esm.js.map