@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.
- package/README.md +19 -1
- package/dist/agent-BNSmiexZ.d.cts +44 -0
- package/dist/agent-BNSmiexZ.d.ts +44 -0
- package/dist/agent-identity/index.cjs +157 -0
- package/dist/agent-identity/index.cjs.map +1 -0
- package/dist/agent-identity/index.d.cts +35 -0
- package/dist/agent-identity/index.d.ts +35 -0
- package/dist/agent-identity/index.js +127 -0
- package/dist/agent-identity/index.js.map +1 -0
- package/dist/chat/index.cjs +1281 -0
- package/dist/chat/index.cjs.map +1 -0
- package/dist/chat/index.d.cts +72 -0
- package/dist/chat/index.d.ts +72 -0
- package/dist/chat/index.js +1239 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat--OifhIRe.d.ts +24 -0
- package/dist/chat-ChYl2XjV.d.cts +24 -0
- package/dist/confidence/index.cjs +253 -0
- package/dist/confidence/index.cjs.map +1 -0
- package/dist/confidence/index.d.cts +40 -0
- package/dist/confidence/index.d.ts +40 -0
- package/dist/confidence/index.js +222 -0
- package/dist/confidence/index.js.map +1 -0
- package/dist/feedback/index.cjs +186 -0
- package/dist/feedback/index.cjs.map +1 -0
- package/dist/feedback/index.d.cts +27 -0
- package/dist/feedback/index.d.ts +27 -0
- package/dist/feedback/index.js +157 -0
- package/dist/feedback/index.js.map +1 -0
- package/dist/{hooks-B8CSeOsn.d.cts → hooks-BGs8-4GK.d.ts} +4 -99
- package/dist/{hooks-B8CSeOsn.d.ts → hooks-DLfF18IU.d.cts} +4 -99
- package/dist/hooks.d.cts +4 -1
- package/dist/hooks.d.ts +4 -1
- package/dist/index-BazLnae1.d.cts +67 -0
- package/dist/index-BazLnae1.d.ts +67 -0
- package/dist/index.cjs +889 -144
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -321
- package/dist/index.d.ts +15 -321
- package/dist/index.js +879 -142
- package/dist/index.js.map +1 -1
- package/dist/layouts/index.cjs +1588 -0
- package/dist/layouts/index.cjs.map +1 -0
- package/dist/layouts/index.d.cts +46 -0
- package/dist/layouts/index.d.ts +46 -0
- package/dist/layouts/index.js +1548 -0
- package/dist/layouts/index.js.map +1 -0
- package/dist/mcp/index.cjs +522 -0
- package/dist/mcp/index.cjs.map +1 -0
- package/dist/mcp/index.d.cts +2 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +492 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/response/index.cjs +519 -0
- package/dist/response/index.cjs.map +1 -0
- package/dist/response/index.d.cts +44 -0
- package/dist/response/index.d.ts +44 -0
- package/dist/response/index.js +478 -0
- package/dist/response/index.js.map +1 -0
- package/dist/sources/index.cjs +243 -0
- package/dist/sources/index.cjs.map +1 -0
- package/dist/sources/index.d.cts +44 -0
- package/dist/sources/index.d.ts +44 -0
- package/dist/sources/index.js +212 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/streaming/index.cjs +531 -0
- package/dist/streaming/index.cjs.map +1 -0
- package/dist/streaming/index.d.cts +81 -0
- package/dist/streaming/index.d.ts +81 -0
- package/dist/streaming/index.js +495 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/streaming-DbQxScpi.d.ts +39 -0
- package/dist/streaming-DfT22A0z.d.cts +39 -0
- 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
|