@surf-kit/agent 0.1.1 → 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 (74) hide show
  1. package/README.md +19 -1
  2. package/dist/agent-BNSmiexZ.d.cts +44 -0
  3. package/dist/agent-BNSmiexZ.d.ts +44 -0
  4. package/dist/agent-identity/index.cjs +157 -0
  5. package/dist/agent-identity/index.cjs.map +1 -0
  6. package/dist/agent-identity/index.d.cts +35 -0
  7. package/dist/agent-identity/index.d.ts +35 -0
  8. package/dist/agent-identity/index.js +127 -0
  9. package/dist/agent-identity/index.js.map +1 -0
  10. package/dist/chat/index.cjs +1281 -0
  11. package/dist/chat/index.cjs.map +1 -0
  12. package/dist/chat/index.d.cts +72 -0
  13. package/dist/chat/index.d.ts +72 -0
  14. package/dist/chat/index.js +1239 -0
  15. package/dist/chat/index.js.map +1 -0
  16. package/dist/chat--OifhIRe.d.ts +24 -0
  17. package/dist/chat-ChYl2XjV.d.cts +24 -0
  18. package/dist/confidence/index.cjs +253 -0
  19. package/dist/confidence/index.cjs.map +1 -0
  20. package/dist/confidence/index.d.cts +40 -0
  21. package/dist/confidence/index.d.ts +40 -0
  22. package/dist/confidence/index.js +222 -0
  23. package/dist/confidence/index.js.map +1 -0
  24. package/dist/feedback/index.cjs +186 -0
  25. package/dist/feedback/index.cjs.map +1 -0
  26. package/dist/feedback/index.d.cts +27 -0
  27. package/dist/feedback/index.d.ts +27 -0
  28. package/dist/feedback/index.js +157 -0
  29. package/dist/feedback/index.js.map +1 -0
  30. package/dist/{hooks-B8CSeOsn.d.cts → hooks-BGs8-4GK.d.ts} +4 -99
  31. package/dist/{hooks-B8CSeOsn.d.ts → hooks-DLfF18IU.d.cts} +4 -99
  32. package/dist/hooks.d.cts +4 -1
  33. package/dist/hooks.d.ts +4 -1
  34. package/dist/index-BazLnae1.d.cts +67 -0
  35. package/dist/index-BazLnae1.d.ts +67 -0
  36. package/dist/index.cjs +889 -144
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.cts +15 -321
  39. package/dist/index.d.ts +15 -321
  40. package/dist/index.js +879 -142
  41. package/dist/index.js.map +1 -1
  42. package/dist/layouts/index.cjs +1588 -0
  43. package/dist/layouts/index.cjs.map +1 -0
  44. package/dist/layouts/index.d.cts +46 -0
  45. package/dist/layouts/index.d.ts +46 -0
  46. package/dist/layouts/index.js +1548 -0
  47. package/dist/layouts/index.js.map +1 -0
  48. package/dist/mcp/index.cjs +522 -0
  49. package/dist/mcp/index.cjs.map +1 -0
  50. package/dist/mcp/index.d.cts +2 -0
  51. package/dist/mcp/index.d.ts +2 -0
  52. package/dist/mcp/index.js +492 -0
  53. package/dist/mcp/index.js.map +1 -0
  54. package/dist/response/index.cjs +519 -0
  55. package/dist/response/index.cjs.map +1 -0
  56. package/dist/response/index.d.cts +44 -0
  57. package/dist/response/index.d.ts +44 -0
  58. package/dist/response/index.js +478 -0
  59. package/dist/response/index.js.map +1 -0
  60. package/dist/sources/index.cjs +243 -0
  61. package/dist/sources/index.cjs.map +1 -0
  62. package/dist/sources/index.d.cts +44 -0
  63. package/dist/sources/index.d.ts +44 -0
  64. package/dist/sources/index.js +212 -0
  65. package/dist/sources/index.js.map +1 -0
  66. package/dist/streaming/index.cjs +531 -0
  67. package/dist/streaming/index.cjs.map +1 -0
  68. package/dist/streaming/index.d.cts +81 -0
  69. package/dist/streaming/index.d.ts +81 -0
  70. package/dist/streaming/index.js +495 -0
  71. package/dist/streaming/index.js.map +1 -0
  72. package/dist/streaming-DbQxScpi.d.ts +39 -0
  73. package/dist/streaming-DfT22A0z.d.cts +39 -0
  74. package/package.json +62 -17
@@ -0,0 +1,222 @@
1
+ // src/confidence/ConfidenceBadge/ConfidenceBadge.tsx
2
+ import { Badge } from "@surf-kit/core";
3
+ import { jsx } from "react/jsx-runtime";
4
+ var intentMap = {
5
+ high: "success",
6
+ medium: "warning",
7
+ low: "error"
8
+ };
9
+ var labelMap = {
10
+ high: "High confidence",
11
+ medium: "Medium confidence",
12
+ low: "Low confidence"
13
+ };
14
+ function ConfidenceBadge({ confidence, className }) {
15
+ const level = confidence.overall;
16
+ return /* @__PURE__ */ jsx(
17
+ Badge,
18
+ {
19
+ intent: intentMap[level],
20
+ size: "sm",
21
+ role: "status",
22
+ "aria-label": labelMap[level],
23
+ className,
24
+ children: level.charAt(0).toUpperCase() + level.slice(1)
25
+ }
26
+ );
27
+ }
28
+
29
+ // src/confidence/ConfidenceBreakdown/ConfidenceBreakdown.tsx
30
+ import { useState } from "react";
31
+
32
+ // src/confidence/ConfidenceMeter/ConfidenceMeter.tsx
33
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
34
+ function getBarColor(value) {
35
+ if (value >= 0.8) return "bg-green-500";
36
+ if (value >= 0.5) return "bg-yellow-500";
37
+ return "bg-red-500";
38
+ }
39
+ function ConfidenceMeter({ value, label, className }) {
40
+ const clamped = Math.max(0, Math.min(1, value));
41
+ const pct = Math.round(clamped * 100);
42
+ return /* @__PURE__ */ jsxs("div", { className, "data-testid": "confidence-meter", children: [
43
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-1", children: [
44
+ /* @__PURE__ */ jsx2("span", { className: "text-xs font-medium text-text-secondary", children: label }),
45
+ /* @__PURE__ */ jsxs("span", { className: "text-xs text-text-secondary", children: [
46
+ pct,
47
+ "%"
48
+ ] })
49
+ ] }),
50
+ /* @__PURE__ */ jsx2(
51
+ "div",
52
+ {
53
+ className: "h-2 w-full rounded-full bg-surface-secondary overflow-hidden",
54
+ role: "progressbar",
55
+ "aria-valuenow": pct,
56
+ "aria-valuemin": 0,
57
+ "aria-valuemax": 100,
58
+ "aria-label": `${label}: ${pct}%`,
59
+ children: /* @__PURE__ */ jsx2(
60
+ "div",
61
+ {
62
+ className: `h-full rounded-full transition-all duration-300 ${getBarColor(clamped)}`,
63
+ style: { width: `${pct}%` }
64
+ }
65
+ )
66
+ }
67
+ )
68
+ ] });
69
+ }
70
+
71
+ // src/confidence/ConfidenceBreakdown/ConfidenceBreakdown.tsx
72
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
73
+ var dimensions = [
74
+ { key: "retrieval_quality", label: "Retrieval Quality" },
75
+ { key: "source_authority", label: "Source Authority" },
76
+ { key: "answer_groundedness", label: "Answer Groundedness" },
77
+ { key: "recency", label: "Recency" }
78
+ ];
79
+ function ConfidenceBreakdown({
80
+ confidence,
81
+ expandable = true,
82
+ defaultExpanded = false,
83
+ className
84
+ }) {
85
+ const [expanded, setExpanded] = useState(defaultExpanded);
86
+ const isExpanded = expandable ? expanded : true;
87
+ return /* @__PURE__ */ jsxs2("div", { className: `rounded-xl border border-border bg-surface ${className ?? ""}`, "data-testid": "confidence-breakdown", children: [
88
+ /* @__PURE__ */ jsxs2(
89
+ "button",
90
+ {
91
+ type: "button",
92
+ className: "flex w-full items-center justify-between px-4 py-3 text-left",
93
+ onClick: () => expandable && setExpanded((prev) => !prev),
94
+ "aria-expanded": isExpanded,
95
+ disabled: !expandable,
96
+ children: [
97
+ /* @__PURE__ */ jsx3("span", { className: "text-sm font-medium text-text-primary", children: "Confidence" }),
98
+ /* @__PURE__ */ jsx3(ConfidenceBadge, { confidence })
99
+ ]
100
+ }
101
+ ),
102
+ isExpanded && /* @__PURE__ */ jsxs2(
103
+ "div",
104
+ {
105
+ className: "border-t border-border px-4 py-3 space-y-3 animate-in fade-in slide-in-from-top-1 duration-200",
106
+ "data-testid": "confidence-breakdown-details",
107
+ children: [
108
+ dimensions.map((dim) => /* @__PURE__ */ jsx3(
109
+ ConfidenceMeter,
110
+ {
111
+ value: confidence[dim.key],
112
+ label: dim.label
113
+ },
114
+ dim.key
115
+ )),
116
+ confidence.reasoning && /* @__PURE__ */ jsx3("p", { className: "text-xs text-text-secondary mt-2", children: confidence.reasoning })
117
+ ]
118
+ }
119
+ )
120
+ ] });
121
+ }
122
+
123
+ // src/confidence/VerificationBadge/VerificationBadge.tsx
124
+ import { Badge as Badge2 } from "@surf-kit/core";
125
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
126
+ var config = {
127
+ passed: {
128
+ intent: "success",
129
+ label: "Verified",
130
+ icon: "\u2713",
131
+ ariaLabel: "Verification passed"
132
+ },
133
+ flagged: {
134
+ intent: "warning",
135
+ label: "Flagged",
136
+ icon: "\u26A0",
137
+ ariaLabel: "Verification flagged"
138
+ },
139
+ failed: {
140
+ intent: "error",
141
+ label: "Failed",
142
+ icon: "\u2717",
143
+ ariaLabel: "Verification failed"
144
+ }
145
+ };
146
+ function VerificationBadge({ verification, className }) {
147
+ const { intent, label, icon, ariaLabel } = config[verification.status];
148
+ return /* @__PURE__ */ jsxs3(
149
+ Badge2,
150
+ {
151
+ intent,
152
+ size: "sm",
153
+ role: "status",
154
+ "aria-label": ariaLabel,
155
+ className,
156
+ children: [
157
+ /* @__PURE__ */ jsx4("span", { "aria-hidden": "true", className: "mr-1", children: icon }),
158
+ label
159
+ ]
160
+ }
161
+ );
162
+ }
163
+
164
+ // src/confidence/VerificationDetail/VerificationDetail.tsx
165
+ import { useState as useState2 } from "react";
166
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
167
+ function VerificationDetail({
168
+ verification,
169
+ expandable = true,
170
+ defaultExpanded = false,
171
+ className
172
+ }) {
173
+ const [expanded, setExpanded] = useState2(defaultExpanded);
174
+ const isExpanded = expandable ? expanded : true;
175
+ return /* @__PURE__ */ jsxs4("div", { className: `rounded-xl border border-border bg-surface ${className ?? ""}`, "data-testid": "verification-detail", children: [
176
+ /* @__PURE__ */ jsxs4(
177
+ "button",
178
+ {
179
+ type: "button",
180
+ className: "flex w-full items-center justify-between px-4 py-3 text-left",
181
+ onClick: () => expandable && setExpanded((prev) => !prev),
182
+ "aria-expanded": isExpanded,
183
+ disabled: !expandable,
184
+ children: [
185
+ /* @__PURE__ */ jsx5("span", { className: "text-sm font-medium text-text-primary", children: "Verification" }),
186
+ /* @__PURE__ */ jsx5(VerificationBadge, { verification })
187
+ ]
188
+ }
189
+ ),
190
+ isExpanded && /* @__PURE__ */ jsxs4(
191
+ "div",
192
+ {
193
+ className: "border-t border-border px-4 py-3 space-y-2 animate-in fade-in slide-in-from-top-1 duration-200",
194
+ "data-testid": "verification-detail-content",
195
+ children: [
196
+ /* @__PURE__ */ jsxs4("div", { className: "flex gap-4 text-xs text-text-secondary", children: [
197
+ /* @__PURE__ */ jsxs4("span", { "data-testid": "claims-checked", children: [
198
+ "Claims checked: ",
199
+ /* @__PURE__ */ jsx5("strong", { className: "text-text-primary", children: verification.claims_checked })
200
+ ] }),
201
+ /* @__PURE__ */ jsxs4("span", { "data-testid": "claims-verified", children: [
202
+ "Claims verified: ",
203
+ /* @__PURE__ */ jsx5("strong", { className: "text-text-primary", children: verification.claims_verified })
204
+ ] })
205
+ ] }),
206
+ verification.flags.length > 0 && /* @__PURE__ */ jsx5("ul", { className: "mt-2 space-y-1", "data-testid": "verification-flags", children: verification.flags.map((flag, i) => /* @__PURE__ */ jsxs4("li", { className: "flex items-start gap-2 text-xs text-text-secondary", children: [
207
+ /* @__PURE__ */ jsx5("span", { className: "text-yellow-500 shrink-0", "aria-hidden": "true", children: "\u26A0" }),
208
+ flag
209
+ ] }, i)) })
210
+ ]
211
+ }
212
+ )
213
+ ] });
214
+ }
215
+ export {
216
+ ConfidenceBadge,
217
+ ConfidenceBreakdown,
218
+ ConfidenceMeter,
219
+ VerificationBadge,
220
+ VerificationDetail
221
+ };
222
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/confidence/ConfidenceBadge/ConfidenceBadge.tsx","../../src/confidence/ConfidenceBreakdown/ConfidenceBreakdown.tsx","../../src/confidence/ConfidenceMeter/ConfidenceMeter.tsx","../../src/confidence/VerificationBadge/VerificationBadge.tsx","../../src/confidence/VerificationDetail/VerificationDetail.tsx"],"sourcesContent":["import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport type { ConfidenceBreakdown } from '../../types/agent'\n\nexport type ConfidenceBadgeProps = {\n confidence: ConfidenceBreakdown\n className?: string\n}\n\nconst intentMap = {\n high: 'success',\n medium: 'warning',\n low: 'error',\n} as const\n\nconst labelMap = {\n high: 'High confidence',\n medium: 'Medium confidence',\n low: 'Low confidence',\n} as const\n\nfunction ConfidenceBadge({ confidence, className }: ConfidenceBadgeProps) {\n const level = confidence.overall\n\n return (\n <Badge\n intent={intentMap[level]}\n size=\"sm\"\n role=\"status\"\n aria-label={labelMap[level]}\n className={className}\n >\n {level.charAt(0).toUpperCase() + level.slice(1)}\n </Badge>\n )\n}\n\nexport { ConfidenceBadge }\n","import React, { useState } from 'react'\nimport type { ConfidenceBreakdown as ConfidenceBreakdownType } from '../../types/agent'\nimport { ConfidenceBadge } from '../ConfidenceBadge'\nimport { ConfidenceMeter } from '../ConfidenceMeter'\n\nexport type ConfidenceBreakdownProps = {\n confidence: ConfidenceBreakdownType\n expandable?: boolean\n defaultExpanded?: boolean\n className?: string\n}\n\nconst dimensions: { key: keyof Pick<ConfidenceBreakdownType, 'retrieval_quality' | 'source_authority' | 'answer_groundedness' | 'recency'>; label: string }[] = [\n { key: 'retrieval_quality', label: 'Retrieval Quality' },\n { key: 'source_authority', label: 'Source Authority' },\n { key: 'answer_groundedness', label: 'Answer Groundedness' },\n { key: 'recency', label: 'Recency' },\n]\n\nfunction ConfidenceBreakdown({\n confidence,\n expandable = true,\n defaultExpanded = false,\n className,\n}: ConfidenceBreakdownProps) {\n const [expanded, setExpanded] = useState(defaultExpanded)\n\n const isExpanded = expandable ? expanded : true\n\n return (\n <div className={`rounded-xl border border-border bg-surface ${className ?? ''}`} data-testid=\"confidence-breakdown\">\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between px-4 py-3 text-left\"\n onClick={() => expandable && setExpanded((prev) => !prev)}\n aria-expanded={isExpanded}\n disabled={!expandable}\n >\n <span className=\"text-sm font-medium text-text-primary\">Confidence</span>\n <ConfidenceBadge confidence={confidence} />\n </button>\n\n {isExpanded && (\n <div\n className=\"border-t border-border px-4 py-3 space-y-3 animate-in fade-in slide-in-from-top-1 duration-200\"\n data-testid=\"confidence-breakdown-details\"\n >\n {dimensions.map((dim) => (\n <ConfidenceMeter\n key={dim.key}\n value={confidence[dim.key]}\n label={dim.label}\n />\n ))}\n {confidence.reasoning && (\n <p className=\"text-xs text-text-secondary mt-2\">{confidence.reasoning}</p>\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport { ConfidenceBreakdown }\n","import React from 'react'\n\nexport type ConfidenceMeterProps = {\n value: number // 0-1\n label: string\n className?: string\n}\n\nfunction getBarColor(value: number): string {\n if (value >= 0.8) return 'bg-green-500'\n if (value >= 0.5) return 'bg-yellow-500'\n return 'bg-red-500'\n}\n\nfunction ConfidenceMeter({ value, label, className }: ConfidenceMeterProps) {\n const clamped = Math.max(0, Math.min(1, value))\n const pct = Math.round(clamped * 100)\n\n return (\n <div className={className} data-testid=\"confidence-meter\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs font-medium text-text-secondary\">{label}</span>\n <span className=\"text-xs text-text-secondary\">{pct}%</span>\n </div>\n <div\n className=\"h-2 w-full rounded-full bg-surface-secondary overflow-hidden\"\n role=\"progressbar\"\n aria-valuenow={pct}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${label}: ${pct}%`}\n >\n <div\n className={`h-full rounded-full transition-all duration-300 ${getBarColor(clamped)}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n )\n}\n\nexport { ConfidenceMeter }\n","import React from 'react'\nimport { Badge } from '@surf-kit/core'\nimport type { VerificationResult } from '../../types/agent'\n\nexport type VerificationBadgeProps = {\n verification: VerificationResult\n className?: string\n}\n\nconst config = {\n passed: {\n intent: 'success' as const,\n label: 'Verified',\n icon: '\\u2713',\n ariaLabel: 'Verification passed',\n },\n flagged: {\n intent: 'warning' as const,\n label: 'Flagged',\n icon: '\\u26A0',\n ariaLabel: 'Verification flagged',\n },\n failed: {\n intent: 'error' as const,\n label: 'Failed',\n icon: '\\u2717',\n ariaLabel: 'Verification failed',\n },\n} as const\n\nfunction VerificationBadge({ verification, className }: VerificationBadgeProps) {\n const { intent, label, icon, ariaLabel } = config[verification.status]\n\n return (\n <Badge\n intent={intent}\n size=\"sm\"\n role=\"status\"\n aria-label={ariaLabel}\n className={className}\n >\n <span aria-hidden=\"true\" className=\"mr-1\">{icon}</span>\n {label}\n </Badge>\n )\n}\n\nexport { VerificationBadge }\n","import React, { useState } from 'react'\nimport type { VerificationResult } from '../../types/agent'\nimport { VerificationBadge } from '../VerificationBadge'\n\nexport type VerificationDetailProps = {\n verification: VerificationResult\n expandable?: boolean\n defaultExpanded?: boolean\n className?: string\n}\n\nfunction VerificationDetail({\n verification,\n expandable = true,\n defaultExpanded = false,\n className,\n}: VerificationDetailProps) {\n const [expanded, setExpanded] = useState(defaultExpanded)\n\n const isExpanded = expandable ? expanded : true\n\n return (\n <div className={`rounded-xl border border-border bg-surface ${className ?? ''}`} data-testid=\"verification-detail\">\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between px-4 py-3 text-left\"\n onClick={() => expandable && setExpanded((prev) => !prev)}\n aria-expanded={isExpanded}\n disabled={!expandable}\n >\n <span className=\"text-sm font-medium text-text-primary\">Verification</span>\n <VerificationBadge verification={verification} />\n </button>\n\n {isExpanded && (\n <div\n className=\"border-t border-border px-4 py-3 space-y-2 animate-in fade-in slide-in-from-top-1 duration-200\"\n data-testid=\"verification-detail-content\"\n >\n <div className=\"flex gap-4 text-xs text-text-secondary\">\n <span data-testid=\"claims-checked\">\n Claims checked: <strong className=\"text-text-primary\">{verification.claims_checked}</strong>\n </span>\n <span data-testid=\"claims-verified\">\n Claims verified: <strong className=\"text-text-primary\">{verification.claims_verified}</strong>\n </span>\n </div>\n\n {verification.flags.length > 0 && (\n <ul className=\"mt-2 space-y-1\" data-testid=\"verification-flags\">\n {verification.flags.map((flag, i) => (\n <li key={i} className=\"flex items-start gap-2 text-xs text-text-secondary\">\n <span className=\"text-yellow-500 shrink-0\" aria-hidden=\"true\">{'\\u26A0'}</span>\n {flag}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport { VerificationDetail }\n"],"mappings":"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","names":["jsx","jsx","jsxs","Badge","jsx","jsxs","useState","jsx","jsxs","useState"]}
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/feedback/index.ts
21
+ var feedback_exports = {};
22
+ __export(feedback_exports, {
23
+ FeedbackConfirmation: () => FeedbackConfirmation,
24
+ FeedbackDialog: () => FeedbackDialog,
25
+ ThumbsFeedback: () => ThumbsFeedback
26
+ });
27
+ module.exports = __toCommonJS(feedback_exports);
28
+
29
+ // src/feedback/ThumbsFeedback/ThumbsFeedback.tsx
30
+ var import_react = require("react");
31
+ var import_jsx_runtime = require("react/jsx-runtime");
32
+ function ThumbsFeedback({
33
+ messageId,
34
+ onFeedback,
35
+ state = null,
36
+ onNegative,
37
+ className
38
+ }) {
39
+ const [selected, setSelected] = (0, import_react.useState)(state);
40
+ const handleClick = (rating) => {
41
+ setSelected(rating);
42
+ onFeedback(messageId, rating);
43
+ if (rating === "negative" && onNegative) {
44
+ onNegative();
45
+ }
46
+ };
47
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
48
+ "div",
49
+ {
50
+ className: `inline-flex items-center gap-0.5 ${className ?? ""}`,
51
+ role: "group",
52
+ "aria-label": "Rate this response",
53
+ "data-testid": "thumbs-feedback",
54
+ children: [
55
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
56
+ "button",
57
+ {
58
+ type: "button",
59
+ onClick: () => handleClick("positive"),
60
+ "aria-label": "Thumbs up",
61
+ "aria-pressed": selected === "positive",
62
+ className: `p-1.5 rounded-md transition-colors duration-200 ${selected === "positive" ? "text-brand-cyan bg-brand-cyan/15" : "text-brand-cream/30 hover:text-brand-cyan hover:bg-brand-cyan/10"}`,
63
+ "data-testid": "thumbs-up",
64
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
65
+ "svg",
66
+ {
67
+ width: "16",
68
+ height: "16",
69
+ viewBox: "0 0 24 24",
70
+ fill: "none",
71
+ stroke: "currentColor",
72
+ strokeWidth: "2",
73
+ strokeLinecap: "round",
74
+ strokeLinejoin: "round",
75
+ "aria-hidden": "true",
76
+ children: [
77
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M7 10v12" }),
78
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2h0a3.13 3.13 0 0 1 3 3.88Z" })
79
+ ]
80
+ }
81
+ )
82
+ }
83
+ ),
84
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
85
+ "button",
86
+ {
87
+ type: "button",
88
+ onClick: () => handleClick("negative"),
89
+ "aria-label": "Thumbs down",
90
+ "aria-pressed": selected === "negative",
91
+ className: `p-1.5 rounded-md transition-colors duration-200 ${selected === "negative" ? "text-brand-watermelon bg-brand-watermelon/15" : "text-brand-cream/30 hover:text-brand-watermelon hover:bg-brand-watermelon/10"}`,
92
+ "data-testid": "thumbs-down",
93
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
94
+ "svg",
95
+ {
96
+ width: "16",
97
+ height: "16",
98
+ viewBox: "0 0 24 24",
99
+ fill: "none",
100
+ stroke: "currentColor",
101
+ strokeWidth: "2",
102
+ strokeLinecap: "round",
103
+ strokeLinejoin: "round",
104
+ "aria-hidden": "true",
105
+ children: [
106
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M17 14V2" }),
107
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22h0a3.13 3.13 0 0 1-3-3.88Z" })
108
+ ]
109
+ }
110
+ )
111
+ }
112
+ )
113
+ ]
114
+ }
115
+ );
116
+ }
117
+
118
+ // src/feedback/FeedbackDialog/FeedbackDialog.tsx
119
+ var import_react2 = require("react");
120
+ var import_core = require("@surf-kit/core");
121
+ var import_jsx_runtime2 = require("react/jsx-runtime");
122
+ function FeedbackDialog({ isOpen, onClose, onSubmit, className }) {
123
+ const [comment, setComment] = (0, import_react2.useState)("");
124
+ const handleSubmit = () => {
125
+ onSubmit(comment);
126
+ setComment("");
127
+ onClose();
128
+ };
129
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
130
+ import_core.Dialog,
131
+ {
132
+ isOpen,
133
+ onClose,
134
+ title: "Share your feedback",
135
+ size: "sm",
136
+ className,
137
+ footer: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
138
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_core.Button, { intent: "ghost", onPress: onClose, children: "Cancel" }),
139
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_core.Button, { intent: "primary", onPress: handleSubmit, isDisabled: comment.trim().length === 0, children: "Submit" })
140
+ ] }),
141
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
142
+ import_core.TextArea,
143
+ {
144
+ label: "What could be improved?",
145
+ value: comment,
146
+ onChange: setComment,
147
+ placeholder: "Tell us what went wrong or how this response could be better...",
148
+ rows: 4,
149
+ "data-testid": "feedback-textarea"
150
+ }
151
+ )
152
+ }
153
+ );
154
+ }
155
+
156
+ // src/feedback/FeedbackConfirmation/FeedbackConfirmation.tsx
157
+ var import_jsx_runtime3 = require("react/jsx-runtime");
158
+ function FeedbackConfirmation({ variant = "inline", className }) {
159
+ if (variant === "toast") {
160
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
161
+ "div",
162
+ {
163
+ role: "status",
164
+ className: `fixed bottom-4 right-4 bg-surface border border-border rounded-lg px-4 py-3 shadow-lg text-sm text-text-primary ${className ?? ""}`,
165
+ "data-testid": "feedback-confirmation",
166
+ children: "Thanks for your feedback"
167
+ }
168
+ );
169
+ }
170
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
171
+ "span",
172
+ {
173
+ role: "status",
174
+ className: `text-sm text-text-secondary ${className ?? ""}`,
175
+ "data-testid": "feedback-confirmation",
176
+ children: "Thanks for your feedback"
177
+ }
178
+ );
179
+ }
180
+ // Annotate the CommonJS export names for ESM import in node:
181
+ 0 && (module.exports = {
182
+ FeedbackConfirmation,
183
+ FeedbackDialog,
184
+ ThumbsFeedback
185
+ });
186
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/feedback/index.ts","../../src/feedback/ThumbsFeedback/ThumbsFeedback.tsx","../../src/feedback/FeedbackDialog/FeedbackDialog.tsx","../../src/feedback/FeedbackConfirmation/FeedbackConfirmation.tsx"],"sourcesContent":["export { ThumbsFeedback } from './ThumbsFeedback'\nexport type { ThumbsFeedbackProps, FeedbackRating } from './ThumbsFeedback'\n\nexport { FeedbackDialog } from './FeedbackDialog'\nexport type { FeedbackDialogProps } from './FeedbackDialog'\n\nexport { FeedbackConfirmation } from './FeedbackConfirmation'\nexport type { FeedbackConfirmationProps } from './FeedbackConfirmation'\n","import React, { useState } from 'react'\n\ntype FeedbackRating = 'positive' | 'negative'\n\ntype ThumbsFeedbackProps = {\n messageId: string\n onFeedback: (messageId: string, rating: FeedbackRating, comment?: string) => void\n state?: FeedbackRating | null\n onNegative?: () => void\n className?: string\n}\n\nfunction ThumbsFeedback({\n messageId,\n onFeedback,\n state = null,\n onNegative,\n className,\n}: ThumbsFeedbackProps) {\n const [selected, setSelected] = useState<FeedbackRating | null>(state)\n\n const handleClick = (rating: FeedbackRating) => {\n setSelected(rating)\n onFeedback(messageId, rating)\n if (rating === 'negative' && onNegative) {\n onNegative()\n }\n }\n\n return (\n <div\n className={`inline-flex items-center gap-0.5 ${className ?? ''}`}\n role=\"group\"\n aria-label=\"Rate this response\"\n data-testid=\"thumbs-feedback\"\n >\n <button\n type=\"button\"\n onClick={() => handleClick('positive')}\n aria-label=\"Thumbs up\"\n aria-pressed={selected === 'positive'}\n className={`p-1.5 rounded-md transition-colors duration-200 ${\n selected === 'positive'\n ? 'text-brand-cyan bg-brand-cyan/15'\n : 'text-brand-cream/30 hover:text-brand-cyan hover:bg-brand-cyan/10'\n }`}\n data-testid=\"thumbs-up\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M7 10v12\" />\n <path d=\"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2h0a3.13 3.13 0 0 1 3 3.88Z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleClick('negative')}\n aria-label=\"Thumbs down\"\n aria-pressed={selected === 'negative'}\n className={`p-1.5 rounded-md transition-colors duration-200 ${\n selected === 'negative'\n ? 'text-brand-watermelon bg-brand-watermelon/15'\n : 'text-brand-cream/30 hover:text-brand-watermelon hover:bg-brand-watermelon/10'\n }`}\n data-testid=\"thumbs-down\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M17 14V2\" />\n <path d=\"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22h0a3.13 3.13 0 0 1-3-3.88Z\" />\n </svg>\n </button>\n </div>\n )\n}\n\nexport { ThumbsFeedback }\nexport type { ThumbsFeedbackProps, FeedbackRating }\n","import React, { useState } from 'react'\nimport { Dialog, Button, TextArea } from '@surf-kit/core'\n\ntype FeedbackDialogProps = {\n isOpen: boolean\n onClose: () => void\n onSubmit: (comment: string) => void\n className?: string\n}\n\nfunction FeedbackDialog({ isOpen, onClose, onSubmit, className }: FeedbackDialogProps) {\n const [comment, setComment] = useState('')\n\n const handleSubmit = () => {\n onSubmit(comment)\n setComment('')\n onClose()\n }\n\n return (\n <Dialog\n isOpen={isOpen}\n onClose={onClose}\n title=\"Share your feedback\"\n size=\"sm\"\n className={className}\n footer={\n <>\n <Button intent=\"ghost\" onPress={onClose}>\n Cancel\n </Button>\n <Button intent=\"primary\" onPress={handleSubmit} isDisabled={comment.trim().length === 0}>\n Submit\n </Button>\n </>\n }\n >\n <TextArea\n label=\"What could be improved?\"\n value={comment}\n onChange={setComment}\n placeholder=\"Tell us what went wrong or how this response could be better...\"\n rows={4}\n data-testid=\"feedback-textarea\"\n />\n </Dialog>\n )\n}\n\nexport { FeedbackDialog }\nexport type { FeedbackDialogProps }\n","import React from 'react'\n\ntype FeedbackConfirmationProps = {\n variant?: 'inline' | 'toast'\n className?: string\n}\n\nfunction FeedbackConfirmation({ variant = 'inline', className }: FeedbackConfirmationProps) {\n if (variant === 'toast') {\n return (\n <div\n role=\"status\"\n className={`fixed bottom-4 right-4 bg-surface border border-border rounded-lg px-4 py-3 shadow-lg text-sm text-text-primary ${className ?? ''}`}\n data-testid=\"feedback-confirmation\"\n >\n Thanks for your feedback\n </div>\n )\n }\n\n return (\n <span\n role=\"status\"\n className={`text-sm text-text-secondary ${className ?? ''}`}\n data-testid=\"feedback-confirmation\"\n >\n Thanks for your feedback\n </span>\n )\n}\n\nexport { FeedbackConfirmation }\nexport type { FeedbackConfirmationProps }\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_jsx_runtime"]}
@@ -0,0 +1,27 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type FeedbackRating = 'positive' | 'negative';
4
+ type ThumbsFeedbackProps = {
5
+ messageId: string;
6
+ onFeedback: (messageId: string, rating: FeedbackRating, comment?: string) => void;
7
+ state?: FeedbackRating | null;
8
+ onNegative?: () => void;
9
+ className?: string;
10
+ };
11
+ declare function ThumbsFeedback({ messageId, onFeedback, state, onNegative, className, }: ThumbsFeedbackProps): react_jsx_runtime.JSX.Element;
12
+
13
+ type FeedbackDialogProps = {
14
+ isOpen: boolean;
15
+ onClose: () => void;
16
+ onSubmit: (comment: string) => void;
17
+ className?: string;
18
+ };
19
+ declare function FeedbackDialog({ isOpen, onClose, onSubmit, className }: FeedbackDialogProps): react_jsx_runtime.JSX.Element;
20
+
21
+ type FeedbackConfirmationProps = {
22
+ variant?: 'inline' | 'toast';
23
+ className?: string;
24
+ };
25
+ declare function FeedbackConfirmation({ variant, className }: FeedbackConfirmationProps): react_jsx_runtime.JSX.Element;
26
+
27
+ export { FeedbackConfirmation, type FeedbackConfirmationProps, FeedbackDialog, type FeedbackDialogProps, type FeedbackRating, ThumbsFeedback, type ThumbsFeedbackProps };
@@ -0,0 +1,27 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type FeedbackRating = 'positive' | 'negative';
4
+ type ThumbsFeedbackProps = {
5
+ messageId: string;
6
+ onFeedback: (messageId: string, rating: FeedbackRating, comment?: string) => void;
7
+ state?: FeedbackRating | null;
8
+ onNegative?: () => void;
9
+ className?: string;
10
+ };
11
+ declare function ThumbsFeedback({ messageId, onFeedback, state, onNegative, className, }: ThumbsFeedbackProps): react_jsx_runtime.JSX.Element;
12
+
13
+ type FeedbackDialogProps = {
14
+ isOpen: boolean;
15
+ onClose: () => void;
16
+ onSubmit: (comment: string) => void;
17
+ className?: string;
18
+ };
19
+ declare function FeedbackDialog({ isOpen, onClose, onSubmit, className }: FeedbackDialogProps): react_jsx_runtime.JSX.Element;
20
+
21
+ type FeedbackConfirmationProps = {
22
+ variant?: 'inline' | 'toast';
23
+ className?: string;
24
+ };
25
+ declare function FeedbackConfirmation({ variant, className }: FeedbackConfirmationProps): react_jsx_runtime.JSX.Element;
26
+
27
+ export { FeedbackConfirmation, type FeedbackConfirmationProps, FeedbackDialog, type FeedbackDialogProps, type FeedbackRating, ThumbsFeedback, type ThumbsFeedbackProps };
@@ -0,0 +1,157 @@
1
+ // src/feedback/ThumbsFeedback/ThumbsFeedback.tsx
2
+ import { useState } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ function ThumbsFeedback({
5
+ messageId,
6
+ onFeedback,
7
+ state = null,
8
+ onNegative,
9
+ className
10
+ }) {
11
+ const [selected, setSelected] = useState(state);
12
+ const handleClick = (rating) => {
13
+ setSelected(rating);
14
+ onFeedback(messageId, rating);
15
+ if (rating === "negative" && onNegative) {
16
+ onNegative();
17
+ }
18
+ };
19
+ return /* @__PURE__ */ jsxs(
20
+ "div",
21
+ {
22
+ className: `inline-flex items-center gap-0.5 ${className ?? ""}`,
23
+ role: "group",
24
+ "aria-label": "Rate this response",
25
+ "data-testid": "thumbs-feedback",
26
+ children: [
27
+ /* @__PURE__ */ jsx(
28
+ "button",
29
+ {
30
+ type: "button",
31
+ onClick: () => handleClick("positive"),
32
+ "aria-label": "Thumbs up",
33
+ "aria-pressed": selected === "positive",
34
+ className: `p-1.5 rounded-md transition-colors duration-200 ${selected === "positive" ? "text-brand-cyan bg-brand-cyan/15" : "text-brand-cream/30 hover:text-brand-cyan hover:bg-brand-cyan/10"}`,
35
+ "data-testid": "thumbs-up",
36
+ children: /* @__PURE__ */ jsxs(
37
+ "svg",
38
+ {
39
+ width: "16",
40
+ height: "16",
41
+ viewBox: "0 0 24 24",
42
+ fill: "none",
43
+ stroke: "currentColor",
44
+ strokeWidth: "2",
45
+ strokeLinecap: "round",
46
+ strokeLinejoin: "round",
47
+ "aria-hidden": "true",
48
+ children: [
49
+ /* @__PURE__ */ jsx("path", { d: "M7 10v12" }),
50
+ /* @__PURE__ */ jsx("path", { d: "M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2h0a3.13 3.13 0 0 1 3 3.88Z" })
51
+ ]
52
+ }
53
+ )
54
+ }
55
+ ),
56
+ /* @__PURE__ */ jsx(
57
+ "button",
58
+ {
59
+ type: "button",
60
+ onClick: () => handleClick("negative"),
61
+ "aria-label": "Thumbs down",
62
+ "aria-pressed": selected === "negative",
63
+ className: `p-1.5 rounded-md transition-colors duration-200 ${selected === "negative" ? "text-brand-watermelon bg-brand-watermelon/15" : "text-brand-cream/30 hover:text-brand-watermelon hover:bg-brand-watermelon/10"}`,
64
+ "data-testid": "thumbs-down",
65
+ children: /* @__PURE__ */ jsxs(
66
+ "svg",
67
+ {
68
+ width: "16",
69
+ height: "16",
70
+ viewBox: "0 0 24 24",
71
+ fill: "none",
72
+ stroke: "currentColor",
73
+ strokeWidth: "2",
74
+ strokeLinecap: "round",
75
+ strokeLinejoin: "round",
76
+ "aria-hidden": "true",
77
+ children: [
78
+ /* @__PURE__ */ jsx("path", { d: "M17 14V2" }),
79
+ /* @__PURE__ */ jsx("path", { d: "M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22h0a3.13 3.13 0 0 1-3-3.88Z" })
80
+ ]
81
+ }
82
+ )
83
+ }
84
+ )
85
+ ]
86
+ }
87
+ );
88
+ }
89
+
90
+ // src/feedback/FeedbackDialog/FeedbackDialog.tsx
91
+ import { useState as useState2 } from "react";
92
+ import { Dialog, Button, TextArea } from "@surf-kit/core";
93
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
94
+ function FeedbackDialog({ isOpen, onClose, onSubmit, className }) {
95
+ const [comment, setComment] = useState2("");
96
+ const handleSubmit = () => {
97
+ onSubmit(comment);
98
+ setComment("");
99
+ onClose();
100
+ };
101
+ return /* @__PURE__ */ jsx2(
102
+ Dialog,
103
+ {
104
+ isOpen,
105
+ onClose,
106
+ title: "Share your feedback",
107
+ size: "sm",
108
+ className,
109
+ footer: /* @__PURE__ */ jsxs2(Fragment, { children: [
110
+ /* @__PURE__ */ jsx2(Button, { intent: "ghost", onPress: onClose, children: "Cancel" }),
111
+ /* @__PURE__ */ jsx2(Button, { intent: "primary", onPress: handleSubmit, isDisabled: comment.trim().length === 0, children: "Submit" })
112
+ ] }),
113
+ children: /* @__PURE__ */ jsx2(
114
+ TextArea,
115
+ {
116
+ label: "What could be improved?",
117
+ value: comment,
118
+ onChange: setComment,
119
+ placeholder: "Tell us what went wrong or how this response could be better...",
120
+ rows: 4,
121
+ "data-testid": "feedback-textarea"
122
+ }
123
+ )
124
+ }
125
+ );
126
+ }
127
+
128
+ // src/feedback/FeedbackConfirmation/FeedbackConfirmation.tsx
129
+ import { jsx as jsx3 } from "react/jsx-runtime";
130
+ function FeedbackConfirmation({ variant = "inline", className }) {
131
+ if (variant === "toast") {
132
+ return /* @__PURE__ */ jsx3(
133
+ "div",
134
+ {
135
+ role: "status",
136
+ className: `fixed bottom-4 right-4 bg-surface border border-border rounded-lg px-4 py-3 shadow-lg text-sm text-text-primary ${className ?? ""}`,
137
+ "data-testid": "feedback-confirmation",
138
+ children: "Thanks for your feedback"
139
+ }
140
+ );
141
+ }
142
+ return /* @__PURE__ */ jsx3(
143
+ "span",
144
+ {
145
+ role: "status",
146
+ className: `text-sm text-text-secondary ${className ?? ""}`,
147
+ "data-testid": "feedback-confirmation",
148
+ children: "Thanks for your feedback"
149
+ }
150
+ );
151
+ }
152
+ export {
153
+ FeedbackConfirmation,
154
+ FeedbackDialog,
155
+ ThumbsFeedback
156
+ };
157
+ //# sourceMappingURL=index.js.map