@mastra/playground-ui 53.0.0-alpha.9 → 53.0.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/{code-DRGJVroV.js → code-D4Vw_fYq.js} +22 -16
- package/dist/code-D4Vw_fYq.js.map +1 -0
- package/dist/{code-BJMC6T9D.cjs → code-DhrdtZce.cjs} +22 -15
- package/dist/code-DhrdtZce.cjs.map +1 -0
- package/dist/{code-block-CBJhDEeB.js → code-block-DeksY23p.js} +2 -2
- package/dist/{code-block-CBJhDEeB.js.map → code-block-DeksY23p.js.map} +1 -1
- package/dist/{code-block-fmv8bHoT.cjs → code-block-DgHrBuR8.cjs} +2 -2
- package/dist/{code-block-fmv8bHoT.cjs.map → code-block-DgHrBuR8.cjs.map} +1 -1
- package/dist/{command-DWFd0d4c.js → command-Be-KrIAX.js} +2 -2
- package/dist/{command-DWFd0d4c.js.map → command-Be-KrIAX.js.map} +1 -1
- package/dist/{command-CUev1UxH.cjs → command-DsTBCmQq.cjs} +2 -2
- package/dist/{command-CUev1UxH.cjs.map → command-DsTBCmQq.cjs.map} +1 -1
- package/dist/components/ChatShell.cjs.js +20 -1
- package/dist/components/ChatShell.cjs.js.map +1 -1
- package/dist/components/ChatShell.es.js +20 -1
- package/dist/components/ChatShell.es.js.map +1 -1
- package/dist/components/Code.cjs.js +3 -1
- package/dist/components/Code.cjs.js.map +1 -1
- package/dist/components/Code.es.js +1 -1
- package/dist/components/CodeBlock.cjs.js +1 -1
- package/dist/components/CodeBlock.es.js +1 -1
- package/dist/components/CodeEditor.cjs.js +2 -1
- package/dist/components/CodeEditor.cjs.js.map +1 -1
- package/dist/components/CodeEditor.es.js +1 -1
- package/dist/components/Command.cjs.js +1 -1
- package/dist/components/Command.es.js +1 -1
- package/dist/components/CommandPalette.cjs.js +1 -1
- package/dist/components/CommandPalette.es.js +1 -1
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/Dialog.cjs.js +181 -2
- package/dist/components/Dialog.cjs.js.map +1 -1
- package/dist/components/Dialog.es.js +183 -1
- package/dist/components/Dialog.es.js.map +1 -1
- package/dist/components/HorizontalBars.cjs.js +1 -1
- package/dist/components/HorizontalBars.es.js +1 -1
- package/dist/components/IntegrationDialog.cjs.js +105 -0
- package/dist/components/IntegrationDialog.cjs.js.map +1 -0
- package/dist/components/IntegrationDialog.d.ts +2 -0
- package/dist/components/IntegrationDialog.es.js +101 -0
- package/dist/components/IntegrationDialog.es.js.map +1 -0
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/ThreadRail.cjs.js +19 -0
- package/dist/components/ThreadRail.cjs.js.map +1 -1
- package/dist/components/ThreadRail.es.js +19 -1
- package/dist/components/ThreadRail.es.js.map +1 -1
- package/dist/components/ai/plan.cjs.js +1 -1
- package/dist/components/ai/plan.es.js +1 -1
- package/dist/components/ai/tool-call.cjs.js +165 -0
- package/dist/components/ai/tool-call.cjs.js.map +1 -1
- package/dist/components/ai/tool-call.es.js +159 -3
- package/dist/components/ai/tool-call.es.js.map +1 -1
- package/dist/{data-code-section-D5I0m1cS.cjs → data-code-section-B_lg_J_0.cjs} +2 -2
- package/dist/{data-code-section-D5I0m1cS.cjs.map → data-code-section-B_lg_J_0.cjs.map} +1 -1
- package/dist/{data-code-section-d3NffL3V.js → data-code-section-Cm_W_XhO.js} +2 -2
- package/dist/{data-code-section-d3NffL3V.js.map → data-code-section-Cm_W_XhO.js.map} +1 -1
- package/dist/{data-panel-Bo2HCylZ.cjs → data-panel-Cv9j_IGQ.cjs} +2 -2
- package/dist/{data-panel-Bo2HCylZ.cjs.map → data-panel-Cv9j_IGQ.cjs.map} +1 -1
- package/dist/{data-panel-T3vp7wTD.js → data-panel-DXxeSnL1.js} +2 -2
- package/dist/{data-panel-T3vp7wTD.js.map → data-panel-DXxeSnL1.js.map} +1 -1
- package/dist/dialog-CZMPDVUj.js +259 -0
- package/dist/dialog-CZMPDVUj.js.map +1 -0
- package/dist/dialog-D-7Hkb3j.cjs +293 -0
- package/dist/dialog-D-7Hkb3j.cjs.map +1 -0
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.es.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +1 -1
- package/dist/domains/traces/hooks/use-branch.cjs.js +2 -6
- package/dist/domains/traces/hooks/use-branch.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-branch.es.js +2 -6
- package/dist/domains/traces/hooks/use-branch.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-download-trace-json.cjs.js +4 -1
- package/dist/domains/traces/hooks/use-download-trace-json.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-download-trace-json.es.js +4 -1
- package/dist/domains/traces/hooks/use-download-trace-json.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-spans.cjs.js +10 -7
- package/dist/domains/traces/hooks/use-trace-spans.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-spans.es.js +10 -7
- package/dist/domains/traces/hooks/use-trace-spans.es.js.map +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +1 -1
- package/dist/{highlight-CSJjjoqh.js → highlight-BmpoELR4.js} +6 -2
- package/dist/{highlight-CSJjjoqh.js.map → highlight-BmpoELR4.js.map} +1 -1
- package/dist/{highlight-CEt2vhD8.cjs → highlight-DK1dn-Fh.cjs} +6 -1
- package/dist/{highlight-CEt2vhD8.cjs.map → highlight-DK1dn-Fh.cjs.map} +1 -1
- package/dist/{horizontal-bars-DZ5J4TKv.js → horizontal-bars-CyP-B-BX.js} +37 -4
- package/dist/horizontal-bars-CyP-B-BX.js.map +1 -0
- package/dist/{horizontal-bars-CE1O-Y6G.cjs → horizontal-bars-Dgq3PYsg.cjs} +37 -4
- package/dist/horizontal-bars-Dgq3PYsg.cjs.map +1 -0
- package/dist/{markdown-renderer-DiJBbnYG.js → markdown-renderer-CaFpZTFS.js} +2 -2
- package/dist/{markdown-renderer-DiJBbnYG.js.map → markdown-renderer-CaFpZTFS.js.map} +1 -1
- package/dist/{markdown-renderer-DGIzNAQY.cjs → markdown-renderer-GVtZLunG.cjs} +2 -2
- package/dist/{markdown-renderer-DGIzNAQY.cjs.map → markdown-renderer-GVtZLunG.cjs.map} +1 -1
- package/dist/src/domains/traces/hooks/use-trace-spans.d.ts +3 -1
- package/dist/src/ds/components/ChatShell/chat-shell.d.ts +19 -2
- package/dist/src/ds/components/ChatShell/index.d.ts +3 -2
- package/dist/src/ds/components/Code/index.d.ts +1 -0
- package/dist/src/ds/components/Code/use-highlight.d.ts +10 -0
- package/dist/src/ds/components/CodeEditor/highlight.d.ts +1 -0
- package/dist/src/ds/components/CodeEditor/index.d.ts +1 -1
- package/dist/src/ds/components/Dialog/dialog-action.d.ts +9 -0
- package/dist/src/ds/components/Dialog/dialog-context.d.ts +16 -0
- package/dist/src/ds/components/Dialog/dialog-new-variant.stories.d.ts +64 -0
- package/dist/src/ds/components/Dialog/dialog.d.ts +15 -6
- package/dist/src/ds/components/Dialog/index.d.ts +2 -0
- package/dist/src/ds/components/HorizontalBars/horizontal-bars.stories.d.ts +2 -0
- package/dist/src/ds/components/IntegrationDialog/__fixtures__/integrations-catalog.d.ts +2 -0
- package/dist/src/ds/components/IntegrationDialog/index.d.ts +2 -0
- package/dist/src/ds/components/IntegrationDialog/integration-dialog.d.ts +28 -0
- package/dist/src/ds/components/IntegrationDialog/integration-dialog.stories.d.ts +24 -0
- package/dist/src/ds/components/ThreadRail/index.d.ts +1 -0
- package/dist/src/ds/components/ThreadRail/turn-groups.d.ts +19 -0
- package/dist/src/ds/components/ai/tool-call/ansi.d.ts +2 -0
- package/dist/src/ds/components/ai/tool-call/group-consecutive.d.ts +17 -0
- package/dist/src/ds/components/ai/tool-call/index.d.ts +4 -0
- package/dist/src/ds/components/ai/tool-call/tool-call-edit.d.ts +4 -0
- package/dist/src/ds/components/ai/tool-call/tool-call-group.d.ts +14 -0
- package/dist/src/ds/components/ai/tool-call/tool-call.d.ts +4 -0
- package/dist/src/ds/components/ai/tool-call/tool-presentation.d.ts +10 -0
- package/dist/style.css +138 -0
- package/package.json +8 -8
- package/dist/code-BJMC6T9D.cjs.map +0 -1
- package/dist/code-DRGJVroV.js.map +0 -1
- package/dist/dialog-CESxLg8S.js +0 -76
- package/dist/dialog-CESxLg8S.js.map +0 -1
- package/dist/dialog-K0q0KOOW.cjs +0 -107
- package/dist/dialog-K0q0KOOW.cjs.map +0 -1
- package/dist/horizontal-bars-CE1O-Y6G.cjs.map +0 -1
- package/dist/horizontal-bars-DZ5J4TKv.js.map +0 -1
|
@@ -1,2 +1,184 @@
|
|
|
1
|
-
|
|
1
|
+
import { u as useDialogContext, g as dialogActionSizeClasses, h as dialogActionLayoutClasses } from '../dialog-CZMPDVUj.js';
|
|
2
|
+
export { D as Dialog, e as DialogBody, i as DialogCancel, j as DialogClose, a as DialogContent, d as DialogDescription, f as DialogFooter, b as DialogHeader, k as DialogOverlay, l as DialogPortal, c as DialogTitle, m as DialogTrigger } from '../dialog-CZMPDVUj.js';
|
|
3
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
4
|
+
import { forwardRef, useState, useRef, useId, useEffect } from 'react';
|
|
5
|
+
import { B as Button } from '../Button-BsfLQEC6.js';
|
|
6
|
+
import { c as cn } from '../cn-B4oPhFx9.js';
|
|
7
|
+
|
|
8
|
+
const ARM_WINDOW_MS = 4e3;
|
|
9
|
+
const HoldAction = forwardRef(
|
|
10
|
+
({ onConfirm, children, disabled, holdSeconds = 1.5, ...props }, ref) => {
|
|
11
|
+
const { intent, pending } = useDialogContext();
|
|
12
|
+
const [holding, setHolding] = useState(false);
|
|
13
|
+
const [completed, setCompleted] = useState(false);
|
|
14
|
+
const [armed, setArmed] = useState(false);
|
|
15
|
+
const timer = useRef(void 0);
|
|
16
|
+
const armTimer = useRef(void 0);
|
|
17
|
+
const active = useRef(false);
|
|
18
|
+
const hintId = useId();
|
|
19
|
+
function cancel() {
|
|
20
|
+
clearTimeout(timer.current);
|
|
21
|
+
active.current = false;
|
|
22
|
+
setHolding(false);
|
|
23
|
+
}
|
|
24
|
+
function disarm() {
|
|
25
|
+
clearTimeout(armTimer.current);
|
|
26
|
+
setArmed(false);
|
|
27
|
+
}
|
|
28
|
+
function complete() {
|
|
29
|
+
setHolding(false);
|
|
30
|
+
setCompleted(true);
|
|
31
|
+
disarm();
|
|
32
|
+
onConfirm();
|
|
33
|
+
}
|
|
34
|
+
function start() {
|
|
35
|
+
if (disabled || active.current) return;
|
|
36
|
+
active.current = true;
|
|
37
|
+
setHolding(true);
|
|
38
|
+
timer.current = setTimeout(complete, holdSeconds * 1e3);
|
|
39
|
+
}
|
|
40
|
+
function onClick(event) {
|
|
41
|
+
event.preventDefault();
|
|
42
|
+
if (event.detail !== 0 || disabled) return;
|
|
43
|
+
if (armed) {
|
|
44
|
+
complete();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
setArmed(true);
|
|
48
|
+
armTimer.current = setTimeout(() => setArmed(false), ARM_WINDOW_MS);
|
|
49
|
+
}
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
function onVisibilityChange() {
|
|
52
|
+
if (document.hidden) cancel();
|
|
53
|
+
}
|
|
54
|
+
window.addEventListener("blur", cancel);
|
|
55
|
+
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
56
|
+
return () => {
|
|
57
|
+
clearTimeout(timer.current);
|
|
58
|
+
clearTimeout(armTimer.current);
|
|
59
|
+
window.removeEventListener("blur", cancel);
|
|
60
|
+
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
61
|
+
};
|
|
62
|
+
}, []);
|
|
63
|
+
function onPointerDown(event) {
|
|
64
|
+
props.onPointerDown?.(event);
|
|
65
|
+
if (event.defaultPrevented || event.button !== 0 || !event.isPrimary) return;
|
|
66
|
+
start();
|
|
67
|
+
}
|
|
68
|
+
function onKeyDown(event) {
|
|
69
|
+
props.onKeyDown?.(event);
|
|
70
|
+
if (event.defaultPrevented || event.key !== " " && event.key !== "Enter") return;
|
|
71
|
+
event.preventDefault();
|
|
72
|
+
if (!event.repeat) start();
|
|
73
|
+
}
|
|
74
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
75
|
+
/* @__PURE__ */ jsxs(
|
|
76
|
+
Button,
|
|
77
|
+
{
|
|
78
|
+
size: "md",
|
|
79
|
+
...props,
|
|
80
|
+
className: cn(
|
|
81
|
+
"group/hold relative isolate touch-none overflow-hidden select-none",
|
|
82
|
+
dialogActionLayoutClasses,
|
|
83
|
+
dialogActionSizeClasses[props.size ?? "md"],
|
|
84
|
+
props.className
|
|
85
|
+
),
|
|
86
|
+
ref,
|
|
87
|
+
type: "button",
|
|
88
|
+
variant: intent === "destructive" ? "destructive-ghost" : "ghost",
|
|
89
|
+
disabled,
|
|
90
|
+
"aria-describedby": [props["aria-describedby"], hintId].filter(Boolean).join(" "),
|
|
91
|
+
"data-holding": holding || void 0,
|
|
92
|
+
"data-completed": completed || pending || void 0,
|
|
93
|
+
onClick,
|
|
94
|
+
onPointerDown,
|
|
95
|
+
onPointerUp: (event) => {
|
|
96
|
+
cancel();
|
|
97
|
+
props.onPointerUp?.(event);
|
|
98
|
+
},
|
|
99
|
+
onPointerLeave: (event) => {
|
|
100
|
+
cancel();
|
|
101
|
+
props.onPointerLeave?.(event);
|
|
102
|
+
},
|
|
103
|
+
onPointerCancel: (event) => {
|
|
104
|
+
cancel();
|
|
105
|
+
props.onPointerCancel?.(event);
|
|
106
|
+
},
|
|
107
|
+
onKeyDown,
|
|
108
|
+
onKeyUp: (event) => {
|
|
109
|
+
if (event.key === " " || event.key === "Enter") {
|
|
110
|
+
event.preventDefault();
|
|
111
|
+
cancel();
|
|
112
|
+
}
|
|
113
|
+
props.onKeyUp?.(event);
|
|
114
|
+
},
|
|
115
|
+
onBlur: (event) => {
|
|
116
|
+
cancel();
|
|
117
|
+
props.onBlur?.(event);
|
|
118
|
+
},
|
|
119
|
+
children: [
|
|
120
|
+
/* @__PURE__ */ jsx("span", { children }),
|
|
121
|
+
/* @__PURE__ */ jsx(
|
|
122
|
+
"span",
|
|
123
|
+
{
|
|
124
|
+
"aria-hidden": "true",
|
|
125
|
+
className: cn(
|
|
126
|
+
"pointer-events-none absolute inset-0 flex items-center justify-center px-[inherit] [clip-path:inset(0_100%_0_0)]",
|
|
127
|
+
"transition-[clip-path] ease-linear motion-reduce:transition-none",
|
|
128
|
+
"group-data-[holding]/hold:[clip-path:inset(0)] motion-reduce:group-data-[holding]/hold:[clip-path:inset(0_50%_0_0)]",
|
|
129
|
+
"group-data-[completed]/hold:[clip-path:inset(0)]",
|
|
130
|
+
intent === "destructive" ? "bg-accent2 text-white" : "bg-neutral6 text-surface1"
|
|
131
|
+
),
|
|
132
|
+
style: { transitionDuration: holding ? `${holdSeconds}s` : "0s" },
|
|
133
|
+
children
|
|
134
|
+
}
|
|
135
|
+
)
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
),
|
|
139
|
+
/* @__PURE__ */ jsxs("span", { id: hintId, className: "sr-only", children: [
|
|
140
|
+
"Hold Space or Enter for ",
|
|
141
|
+
holdSeconds,
|
|
142
|
+
" seconds to confirm. Release to cancel. Screen reader users can activate twice."
|
|
143
|
+
] }),
|
|
144
|
+
/* @__PURE__ */ jsx("span", { role: "status", className: "sr-only", children: armed ? "Activate again to confirm." : "" })
|
|
145
|
+
] });
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
HoldAction.displayName = "DialogHoldAction";
|
|
149
|
+
const DialogAction = forwardRef(
|
|
150
|
+
({ confirmation = "click", holdSeconds = 1.5, onConfirm, disabled, ...props }, ref) => {
|
|
151
|
+
const { intent, pending } = useDialogContext();
|
|
152
|
+
const isDisabled = disabled || pending;
|
|
153
|
+
if (confirmation === "hold") {
|
|
154
|
+
return /* @__PURE__ */ jsx(
|
|
155
|
+
HoldAction,
|
|
156
|
+
{
|
|
157
|
+
holdSeconds,
|
|
158
|
+
...props,
|
|
159
|
+
ref,
|
|
160
|
+
disabled: isDisabled,
|
|
161
|
+
onConfirm
|
|
162
|
+
},
|
|
163
|
+
`${isDisabled}-${holdSeconds}`
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
return /* @__PURE__ */ jsx(
|
|
167
|
+
Button,
|
|
168
|
+
{
|
|
169
|
+
size: "md",
|
|
170
|
+
...props,
|
|
171
|
+
className: cn(dialogActionLayoutClasses, dialogActionSizeClasses[props.size ?? "md"], props.className),
|
|
172
|
+
ref,
|
|
173
|
+
type: "button",
|
|
174
|
+
variant: intent === "destructive" ? "destructive" : "primary",
|
|
175
|
+
disabled: isDisabled,
|
|
176
|
+
onClick: onConfirm
|
|
177
|
+
}
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
);
|
|
181
|
+
DialogAction.displayName = "DialogAction";
|
|
182
|
+
|
|
183
|
+
export { DialogAction };
|
|
2
184
|
//# sourceMappingURL=Dialog.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"Dialog.es.js","sources":["../../src/ds/components/Dialog/dialog-action.tsx"],"sourcesContent":["import { forwardRef, useEffect, useId, useRef, useState } from 'react';\nimport type { ComponentProps, KeyboardEvent, MouseEvent, PointerEvent } from 'react';\nimport { dialogActionLayoutClasses, dialogActionSizeClasses, useDialogContext } from './dialog-context';\nimport { Button } from '@/ds/components/Button';\nimport type { TextButtonSize } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport type DialogActionProps = Omit<ComponentProps<typeof Button>, 'onClick' | 'variant' | 'as' | 'type' | 'size'> & {\n size?: TextButtonSize;\n onConfirm: () => void;\n confirmation?: 'click' | 'hold';\n holdSeconds?: number;\n};\n\nconst ARM_WINDOW_MS = 4000;\n\nconst HoldAction = forwardRef<HTMLButtonElement, Omit<DialogActionProps, 'confirmation'>>(\n ({ onConfirm, children, disabled, holdSeconds = 1.5, ...props }, ref) => {\n const { intent, pending } = useDialogContext();\n const [holding, setHolding] = useState(false);\n const [completed, setCompleted] = useState(false);\n const [armed, setArmed] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const armTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const active = useRef(false);\n const hintId = useId();\n\n function cancel() {\n clearTimeout(timer.current);\n active.current = false;\n setHolding(false);\n }\n\n function disarm() {\n clearTimeout(armTimer.current);\n setArmed(false);\n }\n\n function complete() {\n setHolding(false);\n setCompleted(true);\n disarm();\n onConfirm();\n }\n\n function start() {\n if (disabled || active.current) return;\n active.current = true;\n setHolding(true);\n timer.current = setTimeout(complete, holdSeconds * 1000);\n }\n\n function onClick(event: MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n if (event.detail !== 0 || disabled) return;\n if (armed) {\n complete();\n return;\n }\n setArmed(true);\n armTimer.current = setTimeout(() => setArmed(false), ARM_WINDOW_MS);\n }\n\n useEffect(() => {\n function onVisibilityChange() {\n if (document.hidden) cancel();\n }\n window.addEventListener('blur', cancel);\n document.addEventListener('visibilitychange', onVisibilityChange);\n return () => {\n clearTimeout(timer.current);\n clearTimeout(armTimer.current);\n window.removeEventListener('blur', cancel);\n document.removeEventListener('visibilitychange', onVisibilityChange);\n };\n }, []);\n\n function onPointerDown(event: PointerEvent<HTMLButtonElement>) {\n props.onPointerDown?.(event);\n if (event.defaultPrevented || event.button !== 0 || !event.isPrimary) return;\n start();\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n props.onKeyDown?.(event);\n if (event.defaultPrevented || (event.key !== ' ' && event.key !== 'Enter')) return;\n event.preventDefault();\n if (!event.repeat) start();\n }\n\n return (\n <>\n <Button\n size=\"md\"\n {...props}\n className={cn(\n 'group/hold relative isolate touch-none overflow-hidden select-none',\n dialogActionLayoutClasses,\n dialogActionSizeClasses[props.size ?? 'md'],\n props.className,\n )}\n ref={ref}\n type=\"button\"\n variant={intent === 'destructive' ? 'destructive-ghost' : 'ghost'}\n disabled={disabled}\n aria-describedby={[props['aria-describedby'], hintId].filter(Boolean).join(' ')}\n data-holding={holding || undefined}\n data-completed={completed || pending || undefined}\n onClick={onClick}\n onPointerDown={onPointerDown}\n onPointerUp={event => {\n cancel();\n props.onPointerUp?.(event);\n }}\n onPointerLeave={event => {\n cancel();\n props.onPointerLeave?.(event);\n }}\n onPointerCancel={event => {\n cancel();\n props.onPointerCancel?.(event);\n }}\n onKeyDown={onKeyDown}\n onKeyUp={event => {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n cancel();\n }\n props.onKeyUp?.(event);\n }}\n onBlur={event => {\n cancel();\n props.onBlur?.(event);\n }}\n >\n <span>{children}</span>\n <span\n aria-hidden=\"true\"\n className={cn(\n 'pointer-events-none absolute inset-0 flex items-center justify-center px-[inherit] [clip-path:inset(0_100%_0_0)]',\n 'transition-[clip-path] ease-linear motion-reduce:transition-none',\n 'group-data-[holding]/hold:[clip-path:inset(0)] motion-reduce:group-data-[holding]/hold:[clip-path:inset(0_50%_0_0)]',\n 'group-data-[completed]/hold:[clip-path:inset(0)]',\n intent === 'destructive' ? 'bg-accent2 text-white' : 'bg-neutral6 text-surface1',\n )}\n style={{ transitionDuration: holding ? `${holdSeconds}s` : '0s' }}\n >\n {children}\n </span>\n </Button>\n <span id={hintId} className=\"sr-only\">\n Hold Space or Enter for {holdSeconds} seconds to confirm. Release to cancel. Screen reader users can activate\n twice.\n </span>\n <span role=\"status\" className=\"sr-only\">\n {armed ? 'Activate again to confirm.' : ''}\n </span>\n </>\n );\n },\n);\nHoldAction.displayName = 'DialogHoldAction';\n\nexport const DialogAction = forwardRef<HTMLButtonElement, DialogActionProps>(\n ({ confirmation = 'click', holdSeconds = 1.5, onConfirm, disabled, ...props }, ref) => {\n const { intent, pending } = useDialogContext();\n const isDisabled = disabled || pending;\n if (confirmation === 'hold') {\n return (\n <HoldAction\n key={`${isDisabled}-${holdSeconds}`}\n holdSeconds={holdSeconds}\n {...props}\n ref={ref}\n disabled={isDisabled}\n onConfirm={onConfirm}\n />\n );\n }\n return (\n <Button\n size=\"md\"\n {...props}\n className={cn(dialogActionLayoutClasses, dialogActionSizeClasses[props.size ?? 'md'], props.className)}\n ref={ref}\n type=\"button\"\n variant={intent === 'destructive' ? 'destructive' : 'primary'}\n disabled={isDisabled}\n onClick={onConfirm}\n />\n );\n },\n);\nDialogAction.displayName = 'DialogAction';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { H as HorizontalBars } from '../horizontal-bars-
|
|
1
|
+
export { H as HorizontalBars } from '../horizontal-bars-CyP-B-BX.js';
|
|
2
2
|
//# sourceMappingURL=HorizontalBars.es.js.map
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
|
|
5
|
+
const jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
const lucideReact = require('lucide-react');
|
|
7
|
+
const React = require('react');
|
|
8
|
+
const Badge = require('../Badge-uc0ydYdy.cjs');
|
|
9
|
+
const dialog = require('../dialog-D-7Hkb3j.cjs');
|
|
10
|
+
const searchFieldBlock = require('../search-field-block-CiinIsub.cjs');
|
|
11
|
+
const primitives_formElement = require('../primitives/form-element.cjs.js');
|
|
12
|
+
const utils_cn = require('../cn-DCPcv4xv.cjs');
|
|
13
|
+
|
|
14
|
+
function matches(item, query) {
|
|
15
|
+
return `${item.name} ${item.id} ${item.badge ?? ""}`.toLowerCase().includes(query);
|
|
16
|
+
}
|
|
17
|
+
function IntegrationDialog({
|
|
18
|
+
title,
|
|
19
|
+
description,
|
|
20
|
+
items,
|
|
21
|
+
onSelect,
|
|
22
|
+
searchPlaceholder = "Search integrations",
|
|
23
|
+
searchLabel = "Search integrations",
|
|
24
|
+
emptyMessage,
|
|
25
|
+
children,
|
|
26
|
+
className,
|
|
27
|
+
...props
|
|
28
|
+
}) {
|
|
29
|
+
const searchRef = React.useRef(null);
|
|
30
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(dialog.Dialog, { variant: "new", ...props, children: [
|
|
31
|
+
children,
|
|
32
|
+
/* @__PURE__ */ jsxRuntime.jsx(dialog.DialogContent, { className: utils_cn.cn("max-w-lg", className), initialFocus: searchRef, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
33
|
+
IntegrationDialogContent,
|
|
34
|
+
{
|
|
35
|
+
searchRef,
|
|
36
|
+
title,
|
|
37
|
+
description,
|
|
38
|
+
items,
|
|
39
|
+
onSelect,
|
|
40
|
+
searchPlaceholder,
|
|
41
|
+
searchLabel,
|
|
42
|
+
emptyMessage
|
|
43
|
+
}
|
|
44
|
+
) })
|
|
45
|
+
] });
|
|
46
|
+
}
|
|
47
|
+
function IntegrationDialogContent({
|
|
48
|
+
title,
|
|
49
|
+
description,
|
|
50
|
+
items,
|
|
51
|
+
onSelect,
|
|
52
|
+
searchPlaceholder,
|
|
53
|
+
searchLabel,
|
|
54
|
+
emptyMessage,
|
|
55
|
+
searchRef
|
|
56
|
+
}) {
|
|
57
|
+
const [query, setQuery] = React.useState("");
|
|
58
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
59
|
+
const visibleItems = normalizedQuery ? items.filter((item) => matches(item, normalizedQuery)) : items;
|
|
60
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
61
|
+
/* @__PURE__ */ jsxRuntime.jsxs(dialog.DialogHeader, { children: [
|
|
62
|
+
/* @__PURE__ */ jsxRuntime.jsx(dialog.DialogTitle, { children: title }),
|
|
63
|
+
description ? /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogDescription, { children: description }) : null
|
|
64
|
+
] }),
|
|
65
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 px-5 py-2", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
66
|
+
searchFieldBlock.SearchFieldBlock,
|
|
67
|
+
{
|
|
68
|
+
inputRef: searchRef,
|
|
69
|
+
name: "integration-search",
|
|
70
|
+
label: searchLabel,
|
|
71
|
+
labelIsHidden: true,
|
|
72
|
+
placeholder: searchPlaceholder,
|
|
73
|
+
value: query,
|
|
74
|
+
onChange: (event) => setQuery(event.target.value),
|
|
75
|
+
onReset: () => setQuery(""),
|
|
76
|
+
variant: "outline",
|
|
77
|
+
size: "md"
|
|
78
|
+
}
|
|
79
|
+
) }),
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsx(dialog.DialogBody, { className: "pt-2 pb-5", children: visibleItems.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-2", children: visibleItems.map((item) => {
|
|
81
|
+
return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
82
|
+
"button",
|
|
83
|
+
{
|
|
84
|
+
type: "button",
|
|
85
|
+
disabled: item.disabled,
|
|
86
|
+
onClick: () => onSelect(item),
|
|
87
|
+
className: utils_cn.cn(
|
|
88
|
+
"flex w-full cursor-pointer items-center gap-3 rounded-2xl border border-border1 px-4 py-3 text-left transition-colors duration-normal ease-out-custom hover:bg-surface3 disabled:pointer-events-none disabled:opacity-50",
|
|
89
|
+
primitives_formElement.controlFocusBorderVisible
|
|
90
|
+
),
|
|
91
|
+
children: [
|
|
92
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-neutral4 grid size-8 shrink-0 place-items-center [&>img]:size-full [&>img]:object-contain [&>svg]:size-4", children: item.logo ?? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BlocksIcon, {}) }),
|
|
93
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-ui-md leading-ui-md text-neutral6 min-w-0 truncate font-medium", children: item.name }),
|
|
94
|
+
item.badge ? /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { size: "sm", children: item.badge }) : null,
|
|
95
|
+
item.meta ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-ui-sm leading-ui-sm text-neutral3 ml-auto shrink-0", children: item.meta }) : null
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
) }, item.id);
|
|
99
|
+
}) }) : /* @__PURE__ */ jsxRuntime.jsx("p", { role: "status", className: "text-ui-sm text-neutral3 py-8 text-center", children: emptyMessage ?? (normalizedQuery ? `No integrations match “${query}”.` : "No integrations are available.") }) })
|
|
100
|
+
] });
|
|
101
|
+
}
|
|
102
|
+
IntegrationDialog.Trigger = dialog.DialogTrigger;
|
|
103
|
+
|
|
104
|
+
exports.IntegrationDialog = IntegrationDialog;
|
|
105
|
+
//# sourceMappingURL=IntegrationDialog.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntegrationDialog.cjs.js","sources":["../../src/ds/components/IntegrationDialog/integration-dialog.tsx"],"sourcesContent":["import { BlocksIcon } from 'lucide-react';\nimport { useRef, useState } from 'react';\nimport type { ReactNode, RefObject } from 'react';\nimport { Badge } from '@/ds/components/Badge';\nimport {\n Dialog,\n DialogBody,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@/ds/components/Dialog';\nimport type { DialogProps } from '@/ds/components/Dialog';\nimport { SearchFieldBlock } from '@/ds/components/FormFieldBlocks/fields/search-field-block';\nimport { controlFocusBorderVisible } from '@/ds/primitives/form-element';\nimport { cn } from '@/lib/utils';\n\nexport type IntegrationDialogItem = {\n id: string;\n name: string;\n logo?: ReactNode;\n badge?: string;\n meta?: string;\n disabled?: boolean;\n};\n\nexport type IntegrationDialogProps = Omit<DialogProps, 'variant' | 'intent' | 'children'> & {\n title: ReactNode;\n description?: ReactNode;\n items: IntegrationDialogItem[];\n onSelect: (item: IntegrationDialogItem) => void;\n searchPlaceholder?: string;\n searchLabel?: string;\n emptyMessage?: ReactNode;\n children?: ReactNode;\n className?: string;\n};\n\nfunction matches(item: IntegrationDialogItem, query: string) {\n return `${item.name} ${item.id} ${item.badge ?? ''}`.toLowerCase().includes(query);\n}\n\nfunction IntegrationDialog({\n title,\n description,\n items,\n onSelect,\n searchPlaceholder = 'Search integrations',\n searchLabel = 'Search integrations',\n emptyMessage,\n children,\n className,\n ...props\n}: IntegrationDialogProps) {\n const searchRef = useRef<HTMLInputElement>(null);\n return (\n <Dialog variant=\"new\" {...props}>\n {children}\n <DialogContent className={cn('max-w-lg', className)} initialFocus={searchRef}>\n <IntegrationDialogContent\n searchRef={searchRef}\n title={title}\n description={description}\n items={items}\n onSelect={onSelect}\n searchPlaceholder={searchPlaceholder}\n searchLabel={searchLabel}\n emptyMessage={emptyMessage}\n />\n </DialogContent>\n </Dialog>\n );\n}\n\ntype IntegrationDialogContentProps = Pick<\n IntegrationDialogProps,\n 'title' | 'description' | 'items' | 'onSelect' | 'emptyMessage'\n> &\n Required<Pick<IntegrationDialogProps, 'searchPlaceholder' | 'searchLabel'>> & {\n searchRef: RefObject<HTMLInputElement | null>;\n };\n\nfunction IntegrationDialogContent({\n title,\n description,\n items,\n onSelect,\n searchPlaceholder,\n searchLabel,\n emptyMessage,\n searchRef,\n}: IntegrationDialogContentProps) {\n const [query, setQuery] = useState('');\n const normalizedQuery = query.trim().toLowerCase();\n const visibleItems = normalizedQuery ? items.filter(item => matches(item, normalizedQuery)) : items;\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description ? <DialogDescription>{description}</DialogDescription> : null}\n </DialogHeader>\n <div className=\"shrink-0 px-5 py-2\">\n <SearchFieldBlock\n inputRef={searchRef}\n name=\"integration-search\"\n label={searchLabel}\n labelIsHidden\n placeholder={searchPlaceholder}\n value={query}\n onChange={event => setQuery(event.target.value)}\n onReset={() => setQuery('')}\n variant=\"outline\"\n size=\"md\"\n />\n </div>\n <DialogBody className=\"pt-2 pb-5\">\n {visibleItems.length > 0 ? (\n <ul className=\"flex flex-col gap-2\">\n {visibleItems.map(item => {\n return (\n <li key={item.id}>\n <button\n type=\"button\"\n disabled={item.disabled}\n onClick={() => onSelect(item)}\n className={cn(\n 'flex w-full cursor-pointer items-center gap-3 rounded-2xl border border-border1 px-4 py-3 text-left transition-colors duration-normal ease-out-custom hover:bg-surface3 disabled:pointer-events-none disabled:opacity-50',\n controlFocusBorderVisible,\n )}\n >\n <span className=\"text-neutral4 grid size-8 shrink-0 place-items-center [&>img]:size-full [&>img]:object-contain [&>svg]:size-4\">\n {item.logo ?? <BlocksIcon />}\n </span>\n <span className=\"text-ui-md leading-ui-md text-neutral6 min-w-0 truncate font-medium\">\n {item.name}\n </span>\n {item.badge ? <Badge size=\"sm\">{item.badge}</Badge> : null}\n {item.meta ? (\n <span className=\"text-ui-sm leading-ui-sm text-neutral3 ml-auto shrink-0\">{item.meta}</span>\n ) : null}\n </button>\n </li>\n );\n })}\n </ul>\n ) : (\n <p role=\"status\" className=\"text-ui-sm text-neutral3 py-8 text-center\">\n {emptyMessage ?? (normalizedQuery ? `No integrations match “${query}”.` : 'No integrations are available.')}\n </p>\n )}\n </DialogBody>\n </>\n );\n}\n\nIntegrationDialog.Trigger = DialogTrigger;\n\nexport { IntegrationDialog };\n"],"names":["useRef","jsxs","Dialog","jsx","DialogContent","cn","useState","Fragment","DialogHeader","DialogTitle","DialogDescription","SearchFieldBlock","DialogBody","controlFocusBorderVisible","BlocksIcon","Badge","DialogTrigger"],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { BlocksIcon } from 'lucide-react';
|
|
3
|
+
import { useRef, useState } from 'react';
|
|
4
|
+
import { B as Badge } from '../Badge-CvgvWjuP.js';
|
|
5
|
+
import { D as Dialog, a as DialogContent, b as DialogHeader, c as DialogTitle, d as DialogDescription, e as DialogBody, m as DialogTrigger } from '../dialog-CZMPDVUj.js';
|
|
6
|
+
import { S as SearchFieldBlock } from '../search-field-block-D51aN1d9.js';
|
|
7
|
+
import { controlFocusBorderVisible } from '../primitives/form-element.es.js';
|
|
8
|
+
import { c as cn } from '../cn-B4oPhFx9.js';
|
|
9
|
+
|
|
10
|
+
function matches(item, query) {
|
|
11
|
+
return `${item.name} ${item.id} ${item.badge ?? ""}`.toLowerCase().includes(query);
|
|
12
|
+
}
|
|
13
|
+
function IntegrationDialog({
|
|
14
|
+
title,
|
|
15
|
+
description,
|
|
16
|
+
items,
|
|
17
|
+
onSelect,
|
|
18
|
+
searchPlaceholder = "Search integrations",
|
|
19
|
+
searchLabel = "Search integrations",
|
|
20
|
+
emptyMessage,
|
|
21
|
+
children,
|
|
22
|
+
className,
|
|
23
|
+
...props
|
|
24
|
+
}) {
|
|
25
|
+
const searchRef = useRef(null);
|
|
26
|
+
return /* @__PURE__ */ jsxs(Dialog, { variant: "new", ...props, children: [
|
|
27
|
+
children,
|
|
28
|
+
/* @__PURE__ */ jsx(DialogContent, { className: cn("max-w-lg", className), initialFocus: searchRef, children: /* @__PURE__ */ jsx(
|
|
29
|
+
IntegrationDialogContent,
|
|
30
|
+
{
|
|
31
|
+
searchRef,
|
|
32
|
+
title,
|
|
33
|
+
description,
|
|
34
|
+
items,
|
|
35
|
+
onSelect,
|
|
36
|
+
searchPlaceholder,
|
|
37
|
+
searchLabel,
|
|
38
|
+
emptyMessage
|
|
39
|
+
}
|
|
40
|
+
) })
|
|
41
|
+
] });
|
|
42
|
+
}
|
|
43
|
+
function IntegrationDialogContent({
|
|
44
|
+
title,
|
|
45
|
+
description,
|
|
46
|
+
items,
|
|
47
|
+
onSelect,
|
|
48
|
+
searchPlaceholder,
|
|
49
|
+
searchLabel,
|
|
50
|
+
emptyMessage,
|
|
51
|
+
searchRef
|
|
52
|
+
}) {
|
|
53
|
+
const [query, setQuery] = useState("");
|
|
54
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
55
|
+
const visibleItems = normalizedQuery ? items.filter((item) => matches(item, normalizedQuery)) : items;
|
|
56
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
57
|
+
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
58
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: title }),
|
|
59
|
+
description ? /* @__PURE__ */ jsx(DialogDescription, { children: description }) : null
|
|
60
|
+
] }),
|
|
61
|
+
/* @__PURE__ */ jsx("div", { className: "shrink-0 px-5 py-2", children: /* @__PURE__ */ jsx(
|
|
62
|
+
SearchFieldBlock,
|
|
63
|
+
{
|
|
64
|
+
inputRef: searchRef,
|
|
65
|
+
name: "integration-search",
|
|
66
|
+
label: searchLabel,
|
|
67
|
+
labelIsHidden: true,
|
|
68
|
+
placeholder: searchPlaceholder,
|
|
69
|
+
value: query,
|
|
70
|
+
onChange: (event) => setQuery(event.target.value),
|
|
71
|
+
onReset: () => setQuery(""),
|
|
72
|
+
variant: "outline",
|
|
73
|
+
size: "md"
|
|
74
|
+
}
|
|
75
|
+
) }),
|
|
76
|
+
/* @__PURE__ */ jsx(DialogBody, { className: "pt-2 pb-5", children: visibleItems.length > 0 ? /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2", children: visibleItems.map((item) => {
|
|
77
|
+
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
78
|
+
"button",
|
|
79
|
+
{
|
|
80
|
+
type: "button",
|
|
81
|
+
disabled: item.disabled,
|
|
82
|
+
onClick: () => onSelect(item),
|
|
83
|
+
className: cn(
|
|
84
|
+
"flex w-full cursor-pointer items-center gap-3 rounded-2xl border border-border1 px-4 py-3 text-left transition-colors duration-normal ease-out-custom hover:bg-surface3 disabled:pointer-events-none disabled:opacity-50",
|
|
85
|
+
controlFocusBorderVisible
|
|
86
|
+
),
|
|
87
|
+
children: [
|
|
88
|
+
/* @__PURE__ */ jsx("span", { className: "text-neutral4 grid size-8 shrink-0 place-items-center [&>img]:size-full [&>img]:object-contain [&>svg]:size-4", children: item.logo ?? /* @__PURE__ */ jsx(BlocksIcon, {}) }),
|
|
89
|
+
/* @__PURE__ */ jsx("span", { className: "text-ui-md leading-ui-md text-neutral6 min-w-0 truncate font-medium", children: item.name }),
|
|
90
|
+
item.badge ? /* @__PURE__ */ jsx(Badge, { size: "sm", children: item.badge }) : null,
|
|
91
|
+
item.meta ? /* @__PURE__ */ jsx("span", { className: "text-ui-sm leading-ui-sm text-neutral3 ml-auto shrink-0", children: item.meta }) : null
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
) }, item.id);
|
|
95
|
+
}) }) : /* @__PURE__ */ jsx("p", { role: "status", className: "text-ui-sm text-neutral3 py-8 text-center", children: emptyMessage ?? (normalizedQuery ? `No integrations match “${query}”.` : "No integrations are available.") }) })
|
|
96
|
+
] });
|
|
97
|
+
}
|
|
98
|
+
IntegrationDialog.Trigger = DialogTrigger;
|
|
99
|
+
|
|
100
|
+
export { IntegrationDialog };
|
|
101
|
+
//# sourceMappingURL=IntegrationDialog.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntegrationDialog.es.js","sources":["../../src/ds/components/IntegrationDialog/integration-dialog.tsx"],"sourcesContent":["import { BlocksIcon } from 'lucide-react';\nimport { useRef, useState } from 'react';\nimport type { ReactNode, RefObject } from 'react';\nimport { Badge } from '@/ds/components/Badge';\nimport {\n Dialog,\n DialogBody,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@/ds/components/Dialog';\nimport type { DialogProps } from '@/ds/components/Dialog';\nimport { SearchFieldBlock } from '@/ds/components/FormFieldBlocks/fields/search-field-block';\nimport { controlFocusBorderVisible } from '@/ds/primitives/form-element';\nimport { cn } from '@/lib/utils';\n\nexport type IntegrationDialogItem = {\n id: string;\n name: string;\n logo?: ReactNode;\n badge?: string;\n meta?: string;\n disabled?: boolean;\n};\n\nexport type IntegrationDialogProps = Omit<DialogProps, 'variant' | 'intent' | 'children'> & {\n title: ReactNode;\n description?: ReactNode;\n items: IntegrationDialogItem[];\n onSelect: (item: IntegrationDialogItem) => void;\n searchPlaceholder?: string;\n searchLabel?: string;\n emptyMessage?: ReactNode;\n children?: ReactNode;\n className?: string;\n};\n\nfunction matches(item: IntegrationDialogItem, query: string) {\n return `${item.name} ${item.id} ${item.badge ?? ''}`.toLowerCase().includes(query);\n}\n\nfunction IntegrationDialog({\n title,\n description,\n items,\n onSelect,\n searchPlaceholder = 'Search integrations',\n searchLabel = 'Search integrations',\n emptyMessage,\n children,\n className,\n ...props\n}: IntegrationDialogProps) {\n const searchRef = useRef<HTMLInputElement>(null);\n return (\n <Dialog variant=\"new\" {...props}>\n {children}\n <DialogContent className={cn('max-w-lg', className)} initialFocus={searchRef}>\n <IntegrationDialogContent\n searchRef={searchRef}\n title={title}\n description={description}\n items={items}\n onSelect={onSelect}\n searchPlaceholder={searchPlaceholder}\n searchLabel={searchLabel}\n emptyMessage={emptyMessage}\n />\n </DialogContent>\n </Dialog>\n );\n}\n\ntype IntegrationDialogContentProps = Pick<\n IntegrationDialogProps,\n 'title' | 'description' | 'items' | 'onSelect' | 'emptyMessage'\n> &\n Required<Pick<IntegrationDialogProps, 'searchPlaceholder' | 'searchLabel'>> & {\n searchRef: RefObject<HTMLInputElement | null>;\n };\n\nfunction IntegrationDialogContent({\n title,\n description,\n items,\n onSelect,\n searchPlaceholder,\n searchLabel,\n emptyMessage,\n searchRef,\n}: IntegrationDialogContentProps) {\n const [query, setQuery] = useState('');\n const normalizedQuery = query.trim().toLowerCase();\n const visibleItems = normalizedQuery ? items.filter(item => matches(item, normalizedQuery)) : items;\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description ? <DialogDescription>{description}</DialogDescription> : null}\n </DialogHeader>\n <div className=\"shrink-0 px-5 py-2\">\n <SearchFieldBlock\n inputRef={searchRef}\n name=\"integration-search\"\n label={searchLabel}\n labelIsHidden\n placeholder={searchPlaceholder}\n value={query}\n onChange={event => setQuery(event.target.value)}\n onReset={() => setQuery('')}\n variant=\"outline\"\n size=\"md\"\n />\n </div>\n <DialogBody className=\"pt-2 pb-5\">\n {visibleItems.length > 0 ? (\n <ul className=\"flex flex-col gap-2\">\n {visibleItems.map(item => {\n return (\n <li key={item.id}>\n <button\n type=\"button\"\n disabled={item.disabled}\n onClick={() => onSelect(item)}\n className={cn(\n 'flex w-full cursor-pointer items-center gap-3 rounded-2xl border border-border1 px-4 py-3 text-left transition-colors duration-normal ease-out-custom hover:bg-surface3 disabled:pointer-events-none disabled:opacity-50',\n controlFocusBorderVisible,\n )}\n >\n <span className=\"text-neutral4 grid size-8 shrink-0 place-items-center [&>img]:size-full [&>img]:object-contain [&>svg]:size-4\">\n {item.logo ?? <BlocksIcon />}\n </span>\n <span className=\"text-ui-md leading-ui-md text-neutral6 min-w-0 truncate font-medium\">\n {item.name}\n </span>\n {item.badge ? <Badge size=\"sm\">{item.badge}</Badge> : null}\n {item.meta ? (\n <span className=\"text-ui-sm leading-ui-sm text-neutral3 ml-auto shrink-0\">{item.meta}</span>\n ) : null}\n </button>\n </li>\n );\n })}\n </ul>\n ) : (\n <p role=\"status\" className=\"text-ui-sm text-neutral3 py-8 text-center\">\n {emptyMessage ?? (normalizedQuery ? `No integrations match “${query}”.` : 'No integrations are available.')}\n </p>\n )}\n </DialogBody>\n </>\n );\n}\n\nIntegrationDialog.Trigger = DialogTrigger;\n\nexport { IntegrationDialog };\n"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
|
-
const markdownRenderer = require('../markdown-renderer-
|
|
5
|
+
const markdownRenderer = require('../markdown-renderer-GVtZLunG.cjs');
|
|
6
6
|
const useReveal = require('../use-reveal-Sa456jZb.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
@@ -426,8 +426,27 @@ const buildThreadRailTurns = (messages) => messages.flatMap((message, index) =>
|
|
|
426
426
|
];
|
|
427
427
|
});
|
|
428
428
|
|
|
429
|
+
const introducesNothing = () => false;
|
|
430
|
+
function groupTurns(entries, { key, opensTurn, introduces = introducesNothing }) {
|
|
431
|
+
const groups = [];
|
|
432
|
+
for (const entry of entries) {
|
|
433
|
+
const opens = opensTurn(entry);
|
|
434
|
+
const previous = groups.at(-1);
|
|
435
|
+
if (!opens && previous) {
|
|
436
|
+
previous.entries.push(entry);
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
const last = previous?.entries.at(-1);
|
|
440
|
+
const introduction = previous && last !== void 0 && introduces(last) ? previous.entries.splice(-1) : [];
|
|
441
|
+
if (previous?.entries.length === 0) groups.pop();
|
|
442
|
+
groups.push({ key: key(entry), entries: [...introduction, entry], opensTurn: opens });
|
|
443
|
+
}
|
|
444
|
+
return groups;
|
|
445
|
+
}
|
|
446
|
+
|
|
429
447
|
exports.ThreadRail = ThreadRail;
|
|
430
448
|
exports.buildThreadRailTurns = buildThreadRailTurns;
|
|
431
449
|
exports.getClientMessageKey = getClientMessageKey;
|
|
450
|
+
exports.groupTurns = groupTurns;
|
|
432
451
|
exports.startsUserTurn = startsUserTurn;
|
|
433
452
|
//# sourceMappingURL=ThreadRail.cjs.js.map
|