@codrstudio/openclaude-chat 0.1.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.
- package/dist/components/Chat.d.ts +23 -0
- package/dist/components/Chat.js +12 -0
- package/dist/components/ErrorNote.d.ts +6 -0
- package/dist/components/ErrorNote.js +6 -0
- package/dist/components/LazyRender.d.ts +8 -0
- package/dist/components/LazyRender.js +22 -0
- package/dist/components/Markdown.d.ts +5 -0
- package/dist/components/Markdown.js +65 -0
- package/dist/components/MessageBubble.d.ts +9 -0
- package/dist/components/MessageBubble.js +45 -0
- package/dist/components/MessageInput.d.ts +19 -0
- package/dist/components/MessageInput.js +214 -0
- package/dist/components/MessageList.d.ts +13 -0
- package/dist/components/MessageList.js +72 -0
- package/dist/components/StreamingIndicator.d.ts +1 -0
- package/dist/components/StreamingIndicator.js +9 -0
- package/dist/display/AlertRenderer.d.ts +2 -0
- package/dist/display/AlertRenderer.js +13 -0
- package/dist/display/CarouselRenderer.d.ts +2 -0
- package/dist/display/CarouselRenderer.js +41 -0
- package/dist/display/ChartRenderer.d.ts +2 -0
- package/dist/display/ChartRenderer.js +76 -0
- package/dist/display/ChoiceButtonsRenderer.d.ts +6 -0
- package/dist/display/ChoiceButtonsRenderer.js +23 -0
- package/dist/display/CodeBlockRenderer.d.ts +2 -0
- package/dist/display/CodeBlockRenderer.js +17 -0
- package/dist/display/ComparisonTableRenderer.d.ts +2 -0
- package/dist/display/ComparisonTableRenderer.js +26 -0
- package/dist/display/DataTableRenderer.d.ts +2 -0
- package/dist/display/DataTableRenderer.js +74 -0
- package/dist/display/DisplayReactRenderer.d.ts +26 -0
- package/dist/display/DisplayReactRenderer.js +192 -0
- package/dist/display/FileCardRenderer.d.ts +2 -0
- package/dist/display/FileCardRenderer.js +31 -0
- package/dist/display/GalleryRenderer.d.ts +2 -0
- package/dist/display/GalleryRenderer.js +11 -0
- package/dist/display/ImageViewerRenderer.d.ts +2 -0
- package/dist/display/ImageViewerRenderer.js +15 -0
- package/dist/display/LinkPreviewRenderer.d.ts +2 -0
- package/dist/display/LinkPreviewRenderer.js +20 -0
- package/dist/display/MapViewRenderer.d.ts +2 -0
- package/dist/display/MapViewRenderer.js +20 -0
- package/dist/display/MetricCardRenderer.d.ts +2 -0
- package/dist/display/MetricCardRenderer.js +12 -0
- package/dist/display/PriceHighlightRenderer.d.ts +2 -0
- package/dist/display/PriceHighlightRenderer.js +30 -0
- package/dist/display/ProductCardRenderer.d.ts +2 -0
- package/dist/display/ProductCardRenderer.js +23 -0
- package/dist/display/ProgressStepsRenderer.d.ts +2 -0
- package/dist/display/ProgressStepsRenderer.js +14 -0
- package/dist/display/SourcesListRenderer.d.ts +2 -0
- package/dist/display/SourcesListRenderer.js +5 -0
- package/dist/display/SpreadsheetRenderer.d.ts +2 -0
- package/dist/display/SpreadsheetRenderer.js +32 -0
- package/dist/display/StepTimelineRenderer.d.ts +2 -0
- package/dist/display/StepTimelineRenderer.js +21 -0
- package/dist/display/index.d.ts +21 -0
- package/dist/display/index.js +20 -0
- package/dist/display/react-sandbox/bootstrap.d.ts +1 -0
- package/dist/display/react-sandbox/bootstrap.js +154 -0
- package/dist/display/registry.d.ts +5 -0
- package/dist/display/registry.js +52 -0
- package/dist/display/sdk-types.d.ts +187 -0
- package/dist/display/sdk-types.js +4 -0
- package/dist/hooks/ChatProvider.d.ts +9 -0
- package/dist/hooks/ChatProvider.js +14 -0
- package/dist/hooks/useIsMobile.d.ts +1 -0
- package/dist/hooks/useIsMobile.js +12 -0
- package/dist/hooks/useOpenClaudeChat.d.ts +36 -0
- package/dist/hooks/useOpenClaudeChat.js +361 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.js +42 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.js +5 -0
- package/dist/parts/PartErrorBoundary.d.ts +21 -0
- package/dist/parts/PartErrorBoundary.js +27 -0
- package/dist/parts/PartRenderer.d.ts +8 -0
- package/dist/parts/PartRenderer.js +99 -0
- package/dist/parts/ReasoningBlock.d.ts +6 -0
- package/dist/parts/ReasoningBlock.js +18 -0
- package/dist/parts/ToolActivity.d.ts +11 -0
- package/dist/parts/ToolActivity.js +52 -0
- package/dist/parts/ToolResult.d.ts +7 -0
- package/dist/parts/ToolResult.js +38 -0
- package/dist/styles.css +2 -0
- package/dist/types.d.ts +40 -0
- package/dist/types.js +4 -0
- package/dist/ui/alert.d.ts +12 -0
- package/dist/ui/alert.js +28 -0
- package/dist/ui/badge.d.ts +9 -0
- package/dist/ui/badge.js +20 -0
- package/dist/ui/button.d.ts +11 -0
- package/dist/ui/button.js +31 -0
- package/dist/ui/card.d.ts +8 -0
- package/dist/ui/card.js +21 -0
- package/dist/ui/collapsible.d.ts +1 -0
- package/dist/ui/collapsible.js +2 -0
- package/dist/ui/dialog.d.ts +19 -0
- package/dist/ui/dialog.js +23 -0
- package/dist/ui/dropdown-menu.d.ts +11 -0
- package/dist/ui/dropdown-menu.js +15 -0
- package/dist/ui/input.d.ts +3 -0
- package/dist/ui/input.js +6 -0
- package/dist/ui/progress.d.ts +7 -0
- package/dist/ui/progress.js +9 -0
- package/dist/ui/scroll-area.d.ts +5 -0
- package/dist/ui/scroll-area.js +12 -0
- package/dist/ui/separator.d.ts +4 -0
- package/dist/ui/separator.js +8 -0
- package/dist/ui/skeleton.d.ts +3 -0
- package/dist/ui/skeleton.js +6 -0
- package/dist/ui/table.d.ts +10 -0
- package/dist/ui/table.js +27 -0
- package/package.json +61 -0
- package/src/components/Chat.tsx +107 -0
- package/src/components/ErrorNote.tsx +35 -0
- package/src/components/LazyRender.tsx +42 -0
- package/src/components/Markdown.tsx +114 -0
- package/src/components/MessageBubble.tsx +107 -0
- package/src/components/MessageInput.tsx +421 -0
- package/src/components/MessageList.tsx +153 -0
- package/src/components/StreamingIndicator.tsx +19 -0
- package/src/display/AlertRenderer.tsx +23 -0
- package/src/display/CarouselRenderer.tsx +141 -0
- package/src/display/ChartRenderer.tsx +195 -0
- package/src/display/ChoiceButtonsRenderer.tsx +114 -0
- package/src/display/CodeBlockRenderer.tsx +49 -0
- package/src/display/ComparisonTableRenderer.tsx +132 -0
- package/src/display/DataTableRenderer.tsx +144 -0
- package/src/display/DisplayReactRenderer.tsx +269 -0
- package/src/display/FileCardRenderer.tsx +55 -0
- package/src/display/GalleryRenderer.tsx +65 -0
- package/src/display/ImageViewerRenderer.tsx +114 -0
- package/src/display/LinkPreviewRenderer.tsx +74 -0
- package/src/display/MapViewRenderer.tsx +75 -0
- package/src/display/MetricCardRenderer.tsx +29 -0
- package/src/display/PriceHighlightRenderer.tsx +62 -0
- package/src/display/ProductCardRenderer.tsx +112 -0
- package/src/display/ProgressStepsRenderer.tsx +59 -0
- package/src/display/SourcesListRenderer.tsx +47 -0
- package/src/display/SpreadsheetRenderer.tsx +86 -0
- package/src/display/StepTimelineRenderer.tsx +75 -0
- package/src/display/index.ts +21 -0
- package/src/display/react-sandbox/bootstrap.ts +155 -0
- package/src/display/registry.ts +84 -0
- package/src/display/sdk-types.ts +217 -0
- package/src/hooks/ChatProvider.tsx +21 -0
- package/src/hooks/useIsMobile.ts +15 -0
- package/src/hooks/useOpenClaudeChat.ts +476 -0
- package/src/index.ts +76 -0
- package/src/lib/utils.ts +6 -0
- package/src/parts/PartErrorBoundary.tsx +51 -0
- package/src/parts/PartRenderer.tsx +145 -0
- package/src/parts/ReasoningBlock.tsx +41 -0
- package/src/parts/ToolActivity.tsx +78 -0
- package/src/parts/ToolResult.tsx +79 -0
- package/src/styles.css +2 -0
- package/src/types.ts +41 -0
- package/src/ui/alert.tsx +77 -0
- package/src/ui/badge.tsx +36 -0
- package/src/ui/button.tsx +54 -0
- package/src/ui/card.tsx +68 -0
- package/src/ui/collapsible.tsx +7 -0
- package/src/ui/dialog.tsx +122 -0
- package/src/ui/dropdown-menu.tsx +76 -0
- package/src/ui/input.tsx +24 -0
- package/src/ui/progress.tsx +36 -0
- package/src/ui/scroll-area.tsx +48 -0
- package/src/ui/separator.tsx +31 -0
- package/src/ui/skeleton.tsx +9 -0
- package/src/ui/table.tsx +114 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// The bootstrap script runs INSIDE the sandboxed iframe.
|
|
2
|
+
// It is serialized to a string and embedded in the srcdoc HTML.
|
|
3
|
+
// Keep it dependency-free — only browser APIs + the 5 globals injected via <script> tags.
|
|
4
|
+
|
|
5
|
+
export const SANDBOX_BOOTSTRAP = `
|
|
6
|
+
(function() {
|
|
7
|
+
var WHITELIST = {
|
|
8
|
+
"react": "__React",
|
|
9
|
+
"react-dom": "__ReactDOM",
|
|
10
|
+
"react-dom/client": "__ReactDOM",
|
|
11
|
+
"framer-motion": "__FramerMotion",
|
|
12
|
+
"recharts": "__Recharts",
|
|
13
|
+
"lucide-react": "__LucideReact"
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
function getGlobal(name) {
|
|
17
|
+
return window[WHITELIST[name]];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function makeRequire() {
|
|
21
|
+
return function require(name) {
|
|
22
|
+
var g = getGlobal(name);
|
|
23
|
+
if (!g) throw new Error("sandbox: module not in whitelist: " + name);
|
|
24
|
+
return g;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function renderError(title, detail) {
|
|
29
|
+
var root = document.getElementById("root");
|
|
30
|
+
if (!root) return;
|
|
31
|
+
root.innerHTML = "";
|
|
32
|
+
var box = document.createElement("div");
|
|
33
|
+
box.style.cssText = "padding:12px 14px;border:1px solid #fca5a5;background:#fef2f2;color:#991b1b;border-radius:8px;font:12px/1.5 system-ui,sans-serif;";
|
|
34
|
+
var t = document.createElement("div");
|
|
35
|
+
t.style.cssText = "font-weight:600;margin-bottom:4px;";
|
|
36
|
+
t.textContent = title;
|
|
37
|
+
box.appendChild(t);
|
|
38
|
+
if (detail) {
|
|
39
|
+
var d = document.createElement("pre");
|
|
40
|
+
d.style.cssText = "margin:4px 0 0;white-space:pre-wrap;word-break:break-word;font:11px/1.4 ui-monospace,monospace;color:#7f1d1d;";
|
|
41
|
+
d.textContent = String(detail);
|
|
42
|
+
box.appendChild(d);
|
|
43
|
+
}
|
|
44
|
+
root.appendChild(box);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function applyTheme(theme) {
|
|
48
|
+
var dark = theme === "dark" || (theme === "auto" && window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches);
|
|
49
|
+
var root = document.documentElement;
|
|
50
|
+
if (dark) {
|
|
51
|
+
root.style.setProperty("--bg", "#0a0a0a");
|
|
52
|
+
root.style.setProperty("--fg", "#fafafa");
|
|
53
|
+
root.style.setProperty("--muted", "#a3a3a3");
|
|
54
|
+
root.style.setProperty("--border", "#262626");
|
|
55
|
+
root.style.setProperty("--accent", "#60a5fa");
|
|
56
|
+
document.body.style.background = "#0a0a0a";
|
|
57
|
+
document.body.style.color = "#fafafa";
|
|
58
|
+
} else {
|
|
59
|
+
root.style.setProperty("--bg", "#ffffff");
|
|
60
|
+
root.style.setProperty("--fg", "#0a0a0a");
|
|
61
|
+
root.style.setProperty("--muted", "#737373");
|
|
62
|
+
root.style.setProperty("--border", "#e5e5e5");
|
|
63
|
+
root.style.setProperty("--accent", "#2563eb");
|
|
64
|
+
document.body.style.background = "#ffffff";
|
|
65
|
+
document.body.style.color = "#0a0a0a";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function mount(payload, compiledCode) {
|
|
70
|
+
try {
|
|
71
|
+
var React = window.__React;
|
|
72
|
+
var ReactDOM = window.__ReactDOM;
|
|
73
|
+
var FramerMotion = window.__FramerMotion;
|
|
74
|
+
if (!React || !ReactDOM) {
|
|
75
|
+
renderError("Sandbox: React runtime missing", "__React/__ReactDOM not on window.");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
applyTheme(payload.theme || "auto");
|
|
80
|
+
|
|
81
|
+
// Evaluate compiled CJS module. sucrase's "imports" transform produces code
|
|
82
|
+
// that expects exports/module/require in scope.
|
|
83
|
+
var moduleObj = { exports: {} };
|
|
84
|
+
var exportsObj = moduleObj.exports;
|
|
85
|
+
var requireFn = makeRequire();
|
|
86
|
+
var fn;
|
|
87
|
+
try {
|
|
88
|
+
// eslint-disable-next-line no-new-func
|
|
89
|
+
fn = new Function("exports", "module", "require", "React", compiledCode);
|
|
90
|
+
} catch (e) {
|
|
91
|
+
renderError("Sandbox: compile error", e && e.message);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
fn(exportsObj, moduleObj, requireFn, React);
|
|
96
|
+
} catch (e) {
|
|
97
|
+
renderError("Sandbox: runtime error", e && (e.stack || e.message));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
var Component = moduleObj.exports && (moduleObj.exports.default || moduleObj.exports);
|
|
101
|
+
if (typeof Component !== "function") {
|
|
102
|
+
renderError("Sandbox: no default export", "Expected 'export default function ...' but got: " + typeof Component);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Minimal error boundary
|
|
107
|
+
var ErrorBoundary = (function() {
|
|
108
|
+
function EB(props) { React.Component.call(this, props); this.state = { err: null }; }
|
|
109
|
+
EB.prototype = Object.create(React.Component.prototype);
|
|
110
|
+
EB.prototype.constructor = EB;
|
|
111
|
+
EB.getDerivedStateFromError = function(err) { return { err: err }; };
|
|
112
|
+
EB.prototype.componentDidCatch = function(err) { renderError("Sandbox: render crash", err && (err.stack || err.message)); };
|
|
113
|
+
EB.prototype.render = function() {
|
|
114
|
+
if (this.state.err) return null;
|
|
115
|
+
return this.props.children;
|
|
116
|
+
};
|
|
117
|
+
return EB;
|
|
118
|
+
})();
|
|
119
|
+
|
|
120
|
+
var root = document.getElementById("root");
|
|
121
|
+
root.innerHTML = "";
|
|
122
|
+
var element = React.createElement(ErrorBoundary, null, React.createElement(Component, payload.initialProps || {}));
|
|
123
|
+
if (FramerMotion && FramerMotion.MotionConfig) {
|
|
124
|
+
element = React.createElement(FramerMotion.MotionConfig, { reducedMotion: "user" }, element);
|
|
125
|
+
}
|
|
126
|
+
var reactRoot = ReactDOM.createRoot(root);
|
|
127
|
+
reactRoot.render(element);
|
|
128
|
+
|
|
129
|
+
// ResizeObserver → notify parent of content height
|
|
130
|
+
if (typeof ResizeObserver !== "undefined") {
|
|
131
|
+
var ro = new ResizeObserver(function(entries) {
|
|
132
|
+
for (var i = 0; i < entries.length; i++) {
|
|
133
|
+
var h = Math.ceil(entries[i].contentRect.height);
|
|
134
|
+
window.parent.postMessage({ type: "sandbox-height", height: h }, "*");
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
ro.observe(root);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
window.parent.postMessage({ type: "sandbox-ready" }, "*");
|
|
141
|
+
} catch (e) {
|
|
142
|
+
renderError("Sandbox: unexpected error", e && (e.stack || e.message));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
window.addEventListener("message", function(ev) {
|
|
147
|
+
var data = ev.data;
|
|
148
|
+
if (!data || data.type !== "sandbox-render") return;
|
|
149
|
+
mount(data.payload, data.compiledCode);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
// Signal parent we are alive and waiting for code
|
|
153
|
+
window.parent.postMessage({ type: "sandbox-boot" }, "*");
|
|
154
|
+
})();
|
|
155
|
+
`
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { ComponentType } from "react";
|
|
2
|
+
|
|
3
|
+
import { AlertRenderer } from "./AlertRenderer.js";
|
|
4
|
+
import { MetricCardRenderer } from "./MetricCardRenderer.js";
|
|
5
|
+
import { PriceHighlightRenderer } from "./PriceHighlightRenderer.js";
|
|
6
|
+
import { FileCardRenderer } from "./FileCardRenderer.js";
|
|
7
|
+
import { CodeBlockRenderer } from "./CodeBlockRenderer.js";
|
|
8
|
+
import { SourcesListRenderer } from "./SourcesListRenderer.js";
|
|
9
|
+
import { StepTimelineRenderer } from "./StepTimelineRenderer.js";
|
|
10
|
+
import { ProgressStepsRenderer } from "./ProgressStepsRenderer.js";
|
|
11
|
+
import { ChartRenderer } from "./ChartRenderer.js";
|
|
12
|
+
import { CarouselRenderer } from "./CarouselRenderer.js";
|
|
13
|
+
import { ProductCardRenderer } from "./ProductCardRenderer.js";
|
|
14
|
+
import { ComparisonTableRenderer } from "./ComparisonTableRenderer.js";
|
|
15
|
+
import { DataTableRenderer } from "./DataTableRenderer.js";
|
|
16
|
+
import { SpreadsheetRenderer } from "./SpreadsheetRenderer.js";
|
|
17
|
+
import { GalleryRenderer } from "./GalleryRenderer.js";
|
|
18
|
+
import { ImageViewerRenderer } from "./ImageViewerRenderer.js";
|
|
19
|
+
import { LinkPreviewRenderer } from "./LinkPreviewRenderer.js";
|
|
20
|
+
import { MapViewRenderer } from "./MapViewRenderer.js";
|
|
21
|
+
import { ChoiceButtonsRenderer } from "./ChoiceButtonsRenderer.js";
|
|
22
|
+
import { DisplayReactRenderer } from "./DisplayReactRenderer.js";
|
|
23
|
+
|
|
24
|
+
export type DisplayActionName =
|
|
25
|
+
| "metric"
|
|
26
|
+
| "price"
|
|
27
|
+
| "alert"
|
|
28
|
+
| "choices"
|
|
29
|
+
| "table"
|
|
30
|
+
| "spreadsheet"
|
|
31
|
+
| "comparison"
|
|
32
|
+
| "carousel"
|
|
33
|
+
| "gallery"
|
|
34
|
+
| "sources"
|
|
35
|
+
| "product"
|
|
36
|
+
| "link"
|
|
37
|
+
| "file"
|
|
38
|
+
| "image"
|
|
39
|
+
| "chart"
|
|
40
|
+
| "map"
|
|
41
|
+
| "code"
|
|
42
|
+
| "progress"
|
|
43
|
+
| "steps"
|
|
44
|
+
| "react";
|
|
45
|
+
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
|
+
export type DisplayRendererMap = Partial<Record<string, ComponentType<any>>>;
|
|
48
|
+
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
50
|
+
export const defaultDisplayRenderers: Record<DisplayActionName, ComponentType<any>> = {
|
|
51
|
+
// highlight
|
|
52
|
+
metric: MetricCardRenderer,
|
|
53
|
+
price: PriceHighlightRenderer,
|
|
54
|
+
alert: AlertRenderer,
|
|
55
|
+
choices: ChoiceButtonsRenderer,
|
|
56
|
+
// collection
|
|
57
|
+
table: DataTableRenderer,
|
|
58
|
+
spreadsheet: SpreadsheetRenderer,
|
|
59
|
+
comparison: ComparisonTableRenderer,
|
|
60
|
+
carousel: CarouselRenderer,
|
|
61
|
+
gallery: GalleryRenderer,
|
|
62
|
+
sources: SourcesListRenderer,
|
|
63
|
+
// card
|
|
64
|
+
product: ProductCardRenderer,
|
|
65
|
+
link: LinkPreviewRenderer,
|
|
66
|
+
file: FileCardRenderer,
|
|
67
|
+
image: ImageViewerRenderer,
|
|
68
|
+
// visual
|
|
69
|
+
chart: ChartRenderer,
|
|
70
|
+
map: MapViewRenderer,
|
|
71
|
+
code: CodeBlockRenderer,
|
|
72
|
+
progress: ProgressStepsRenderer,
|
|
73
|
+
steps: StepTimelineRenderer,
|
|
74
|
+
react: DisplayReactRenderer,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export function resolveDisplayRenderer(
|
|
78
|
+
action: string,
|
|
79
|
+
overrides?: DisplayRendererMap,
|
|
80
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
81
|
+
): ComponentType<any> | null {
|
|
82
|
+
if (overrides?.[action]) return overrides[action]!;
|
|
83
|
+
return (defaultDisplayRenderers as Record<string, ComponentType<any>>)[action] ?? null;
|
|
84
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
// Tipos dos display widgets — espelham os schemas em
|
|
2
|
+
// D:\aw\context\workspaces\openclaude-sdk\repo\src\display\schemas.ts
|
|
3
|
+
// Mantemos local para nao ter dependencia dura em typings da SDK.
|
|
4
|
+
|
|
5
|
+
export type Money = {
|
|
6
|
+
value: number;
|
|
7
|
+
currency?: string;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type SourceRef = {
|
|
11
|
+
name: string;
|
|
12
|
+
url: string;
|
|
13
|
+
favicon?: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type DisplayBadge = {
|
|
17
|
+
label: string;
|
|
18
|
+
variant?: "default" | "success" | "warning" | "error" | "info";
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// 1. METRICAS E DADOS ────────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
export type DisplayMetric = {
|
|
24
|
+
label: string;
|
|
25
|
+
value: string | number;
|
|
26
|
+
unit?: string;
|
|
27
|
+
trend?: {
|
|
28
|
+
direction: "up" | "down" | "neutral";
|
|
29
|
+
value: string;
|
|
30
|
+
};
|
|
31
|
+
icon?: string;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export type DisplayChart = {
|
|
35
|
+
type: "bar" | "line" | "pie" | "area" | "donut";
|
|
36
|
+
title: string;
|
|
37
|
+
data: Array<{
|
|
38
|
+
label: string;
|
|
39
|
+
value: number;
|
|
40
|
+
color?: string;
|
|
41
|
+
}>;
|
|
42
|
+
format?: {
|
|
43
|
+
prefix?: string;
|
|
44
|
+
suffix?: string;
|
|
45
|
+
locale?: string;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export type DisplayTable = {
|
|
50
|
+
title?: string;
|
|
51
|
+
columns: Array<{
|
|
52
|
+
key: string;
|
|
53
|
+
label: string;
|
|
54
|
+
type?: "text" | "number" | "money" | "image" | "link" | "badge";
|
|
55
|
+
align?: "left" | "center" | "right";
|
|
56
|
+
}>;
|
|
57
|
+
rows: Array<Record<string, unknown>>;
|
|
58
|
+
sortable?: boolean;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export type DisplayProgress = {
|
|
62
|
+
title?: string;
|
|
63
|
+
steps: Array<{
|
|
64
|
+
label: string;
|
|
65
|
+
status: "completed" | "current" | "pending";
|
|
66
|
+
description?: string;
|
|
67
|
+
}>;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// 2. PRODUTOS E COMERCIO ─────────────────────────────────────────
|
|
71
|
+
|
|
72
|
+
export type DisplayProduct = {
|
|
73
|
+
title: string;
|
|
74
|
+
image?: string;
|
|
75
|
+
price?: Money;
|
|
76
|
+
originalPrice?: Money;
|
|
77
|
+
rating?: {
|
|
78
|
+
score: number;
|
|
79
|
+
count: number;
|
|
80
|
+
};
|
|
81
|
+
source?: SourceRef;
|
|
82
|
+
badges?: DisplayBadge[];
|
|
83
|
+
url?: string;
|
|
84
|
+
description?: string;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export type DisplayComparison = {
|
|
88
|
+
title?: string;
|
|
89
|
+
items: DisplayProduct[];
|
|
90
|
+
attributes?: Array<{ key: string; label: string }>;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export type DisplayPrice = {
|
|
94
|
+
value: Money;
|
|
95
|
+
label: string;
|
|
96
|
+
context?: string;
|
|
97
|
+
source?: SourceRef;
|
|
98
|
+
badge?: DisplayBadge;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// 3. MIDIA ───────────────────────────────────────────────────────
|
|
102
|
+
|
|
103
|
+
export type DisplayImage = {
|
|
104
|
+
url: string;
|
|
105
|
+
alt?: string;
|
|
106
|
+
caption?: string;
|
|
107
|
+
width?: number;
|
|
108
|
+
height?: number;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export type DisplayGallery = {
|
|
112
|
+
title?: string;
|
|
113
|
+
images: Array<{ url: string; alt?: string; caption?: string }>;
|
|
114
|
+
layout?: "grid" | "masonry";
|
|
115
|
+
columns?: number;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export type DisplayCarousel = {
|
|
119
|
+
title?: string;
|
|
120
|
+
items: Array<{
|
|
121
|
+
image?: string;
|
|
122
|
+
title: string;
|
|
123
|
+
subtitle?: string;
|
|
124
|
+
price?: Money;
|
|
125
|
+
url?: string;
|
|
126
|
+
badges?: DisplayBadge[];
|
|
127
|
+
}>;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// 4. REFERENCIAS E NAVEGACAO ─────────────────────────────────────
|
|
131
|
+
|
|
132
|
+
export type DisplaySources = {
|
|
133
|
+
label?: string;
|
|
134
|
+
sources: Array<{
|
|
135
|
+
title: string;
|
|
136
|
+
url: string;
|
|
137
|
+
favicon?: string;
|
|
138
|
+
snippet?: string;
|
|
139
|
+
}>;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
export type DisplayLink = {
|
|
143
|
+
url: string;
|
|
144
|
+
title: string;
|
|
145
|
+
description?: string;
|
|
146
|
+
image?: string;
|
|
147
|
+
favicon?: string;
|
|
148
|
+
domain?: string;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
export type DisplayMap = {
|
|
152
|
+
title?: string;
|
|
153
|
+
pins: Array<{
|
|
154
|
+
lat: number;
|
|
155
|
+
lng: number;
|
|
156
|
+
label?: string;
|
|
157
|
+
address?: string;
|
|
158
|
+
}>;
|
|
159
|
+
zoom?: number;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
// 5. DOCUMENTOS E ARQUIVOS ───────────────────────────────────────
|
|
163
|
+
|
|
164
|
+
export type DisplayFile = {
|
|
165
|
+
name: string;
|
|
166
|
+
type: string;
|
|
167
|
+
size?: number;
|
|
168
|
+
url?: string;
|
|
169
|
+
preview?: string;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
export type DisplayCode = {
|
|
173
|
+
language: string;
|
|
174
|
+
code: string;
|
|
175
|
+
title?: string;
|
|
176
|
+
lineNumbers?: boolean;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
export type DisplaySpreadsheet = {
|
|
180
|
+
title?: string;
|
|
181
|
+
headers: string[];
|
|
182
|
+
rows: Array<Array<string | number | null>>;
|
|
183
|
+
format?: {
|
|
184
|
+
moneyColumns?: number[];
|
|
185
|
+
percentColumns?: number[];
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
// 6. INTERATIVO ──────────────────────────────────────────────────
|
|
190
|
+
|
|
191
|
+
export type DisplaySteps = {
|
|
192
|
+
title?: string;
|
|
193
|
+
steps: Array<{
|
|
194
|
+
title: string;
|
|
195
|
+
description?: string;
|
|
196
|
+
status?: "completed" | "current" | "pending";
|
|
197
|
+
}>;
|
|
198
|
+
orientation?: "vertical" | "horizontal";
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
export type DisplayAlert = {
|
|
202
|
+
variant: "info" | "warning" | "error" | "success";
|
|
203
|
+
title?: string;
|
|
204
|
+
message: string;
|
|
205
|
+
icon?: string;
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
export type DisplayChoices = {
|
|
209
|
+
question?: string;
|
|
210
|
+
choices: Array<{
|
|
211
|
+
id: string;
|
|
212
|
+
label: string;
|
|
213
|
+
description?: string;
|
|
214
|
+
icon?: string;
|
|
215
|
+
}>;
|
|
216
|
+
layout?: "buttons" | "cards" | "list";
|
|
217
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React, { createContext, useContext } from "react";
|
|
2
|
+
import { useOpenClaudeChat, type UseOpenClaudeChatOptions } from "./useOpenClaudeChat.js";
|
|
3
|
+
|
|
4
|
+
type ChatContextValue = ReturnType<typeof useOpenClaudeChat>;
|
|
5
|
+
|
|
6
|
+
const ChatContext = createContext<ChatContextValue | null>(null);
|
|
7
|
+
|
|
8
|
+
export interface ChatProviderProps extends UseOpenClaudeChatOptions {
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function ChatProvider({ children, ...options }: ChatProviderProps) {
|
|
13
|
+
const chat = useOpenClaudeChat(options);
|
|
14
|
+
return <ChatContext.Provider value={chat}>{children}</ChatContext.Provider>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function useChatContext(): ChatContextValue {
|
|
18
|
+
const ctx = useContext(ChatContext);
|
|
19
|
+
if (!ctx) throw new Error("useChatContext must be used within ChatProvider");
|
|
20
|
+
return ctx;
|
|
21
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useState, useEffect } from "react";
|
|
2
|
+
|
|
3
|
+
export function useIsMobile(breakpoint = 768): boolean {
|
|
4
|
+
const [isMobile, setIsMobile] = useState(false);
|
|
5
|
+
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const mql = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);
|
|
8
|
+
const onChange = () => setIsMobile(mql.matches);
|
|
9
|
+
onChange();
|
|
10
|
+
mql.addEventListener("change", onChange);
|
|
11
|
+
return () => mql.removeEventListener("change", onChange);
|
|
12
|
+
}, [breakpoint]);
|
|
13
|
+
|
|
14
|
+
return isMobile;
|
|
15
|
+
}
|