@arbidocs/blocks 0.4.145 → 0.4.147
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/agents/index.cjs +266 -266
- package/dist/agents/index.js +9 -9
- package/dist/chat/index.cjs +1 -1
- package/dist/chat/index.js +1 -1
- package/dist/{chunk-ULPFRK3J.cjs → chunk-AINU3EJ6.cjs} +8 -8
- package/dist/{chunk-ULPFRK3J.cjs.map → chunk-AINU3EJ6.cjs.map} +1 -1
- package/dist/{chunk-KPO67GBR.cjs → chunk-AO7SK6WP.cjs} +32 -32
- package/dist/{chunk-KPO67GBR.cjs.map → chunk-AO7SK6WP.cjs.map} +1 -1
- package/dist/{chunk-NGDXDHLG.js → chunk-DAHCRVPM.js} +3 -3
- package/dist/{chunk-NGDXDHLG.js.map → chunk-DAHCRVPM.js.map} +1 -1
- package/dist/{chunk-FUTMU4FR.js → chunk-DGV7HQA7.js} +6 -179
- package/dist/chunk-DGV7HQA7.js.map +1 -0
- package/dist/chunk-EV7W64B6.js +134 -0
- package/dist/chunk-EV7W64B6.js.map +1 -0
- package/dist/{chunk-O6IEZDRC.cjs → chunk-GRGS5M6O.cjs} +181 -3
- package/dist/chunk-GRGS5M6O.cjs.map +1 -0
- package/dist/{chunk-J4M37SXY.js → chunk-H74HEPKT.js} +190 -7
- package/dist/chunk-H74HEPKT.js.map +1 -0
- package/dist/{chunk-NSNHRZBH.cjs → chunk-IL3WB3YX.cjs} +3 -3
- package/dist/{chunk-NSNHRZBH.cjs.map → chunk-IL3WB3YX.cjs.map} +1 -1
- package/dist/{chunk-34GDGE77.cjs → chunk-LTU35TQN.cjs} +192 -6
- package/dist/chunk-LTU35TQN.cjs.map +1 -0
- package/dist/{chunk-VVZ34A2P.js → chunk-LZRMXJIE.js} +3 -3
- package/dist/{chunk-VVZ34A2P.js.map → chunk-LZRMXJIE.js.map} +1 -1
- package/dist/{chunk-OPTBQSCV.cjs → chunk-MFY2ZNP6.cjs} +2 -181
- package/dist/{chunk-FUTMU4FR.js.map → chunk-MFY2ZNP6.cjs.map} +1 -1
- package/dist/{chunk-6HCJ3ZEU.js → chunk-R6VCPDPF.js} +178 -6
- package/dist/chunk-R6VCPDPF.js.map +1 -0
- package/dist/chunk-RXK3XP62.cjs +144 -0
- package/dist/chunk-RXK3XP62.cjs.map +1 -0
- package/dist/{chunk-KTSF4HFC.js → chunk-SUUPR735.js} +6 -6
- package/dist/{chunk-KTSF4HFC.js.map → chunk-SUUPR735.js.map} +1 -1
- package/dist/{chunk-WO7QAVTL.cjs → chunk-T5I4NRFP.cjs} +9 -9
- package/dist/{chunk-WO7QAVTL.cjs.map → chunk-T5I4NRFP.cjs.map} +1 -1
- package/dist/chunk-U37AYUPI.cjs +5371 -0
- package/dist/chunk-U37AYUPI.cjs.map +1 -0
- package/dist/{chunk-QOL3M4FJ.js → chunk-VUR63NMQ.js} +8 -8
- package/dist/{chunk-QOL3M4FJ.js.map → chunk-VUR63NMQ.js.map} +1 -1
- package/dist/chunk-WIZ7Z7FN.js +5179 -0
- package/dist/chunk-WIZ7Z7FN.js.map +1 -0
- package/dist/collaboration/index.cjs +81 -81
- package/dist/collaboration/index.js +3 -3
- package/dist/connect/docx.cjs +9 -9
- package/dist/connect/docx.js +6 -6
- package/dist/connect/index.cjs +1395 -132
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +2 -0
- package/dist/connect/index.js +1278 -24
- package/dist/connect/index.js.map +1 -1
- package/dist/connection/ConnectedNotificationRelevance.d.ts +4 -1
- package/dist/connection/connectors/ConnectedAppsSettings.d.ts +24 -0
- package/dist/connection/connectors/ConnectedDriveSyncDialog.d.ts +12 -0
- package/dist/connection/connectors/ConnectedMailboxSyncDialog.d.ts +12 -0
- package/dist/connection/connectors/index.d.ts +4 -0
- package/dist/connection/connectors/sync-labels.d.ts +21 -0
- package/dist/connection/settings-page/ConnectedSettingsPage.d.ts +4 -0
- package/dist/connection/settings-page/index.d.ts +1 -1
- package/dist/connection/workspace-settings/ConnectedWorkspaceSettings.d.ts +53 -0
- package/dist/connection/workspace-settings/index.d.ts +2 -0
- package/dist/connection/workspace-settings/useConnectedWorkspaceSettings.d.ts +85 -0
- package/dist/document-tools/index.cjs +1 -1
- package/dist/document-tools/index.js +1 -1
- package/dist/facts/index.cjs +1 -1
- package/dist/facts/index.js +1 -1
- package/dist/files/index.cjs +3 -3
- package/dist/files/index.js +3 -3
- package/dist/index.cjs +445 -618
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +23 -205
- package/dist/index.js.map +1 -1
- package/dist/settings/PlanBadge.d.ts +1 -1
- package/dist/settings/index.cjs +551 -3716
- package/dist/settings/index.cjs.map +1 -1
- package/dist/settings/index.js +8 -3525
- package/dist/settings/index.js.map +1 -1
- package/dist/shell/index.cjs +1 -1
- package/dist/shell/index.js +1 -1
- package/dist/site/index.cjs +10 -10
- package/dist/site/index.js +2 -2
- package/dist/studio/index.cjs +3 -3
- package/dist/studio/index.js +3 -3
- package/dist/workflow-canvas/index.cjs +22 -22
- package/dist/workflow-canvas/index.js +9 -9
- package/dist/workspaces/CommonWorkspaceToggle.d.ts +15 -0
- package/dist/workspaces/index.cjs +38 -107
- package/dist/workspaces/index.cjs.map +1 -1
- package/dist/workspaces/index.d.ts +1 -0
- package/dist/workspaces/index.js +5 -102
- package/dist/workspaces/index.js.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +4 -4
- package/dist/chunk-34GDGE77.cjs.map +0 -1
- package/dist/chunk-5YHEHEJT.js +0 -1667
- package/dist/chunk-5YHEHEJT.js.map +0 -1
- package/dist/chunk-6HCJ3ZEU.js.map +0 -1
- package/dist/chunk-J4M37SXY.js.map +0 -1
- package/dist/chunk-O6IEZDRC.cjs.map +0 -1
- package/dist/chunk-OPTBQSCV.cjs.map +0 -1
- package/dist/chunk-U73KPFYH.cjs +0 -1717
- package/dist/chunk-U73KPFYH.cjs.map +0 -1
package/dist/settings/index.cjs
CHANGED
|
@@ -1,3759 +1,716 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
+
var chunkU37AYUPI_cjs = require('../chunk-U37AYUPI.cjs');
|
|
4
5
|
var chunk223D4727_cjs = require('../chunk-223D4727.cjs');
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var chunkNWNVWO6L_cjs = require('../chunk-NWNVWO6L.cjs');
|
|
8
|
-
var chunkDVUZTGVL_cjs = require('../chunk-DVUZTGVL.cjs');
|
|
6
|
+
require('../chunk-QZTNTP75.cjs');
|
|
7
|
+
require('../chunk-NWNVWO6L.cjs');
|
|
9
8
|
var chunkRFIBUWLF_cjs = require('../chunk-RFIBUWLF.cjs');
|
|
10
9
|
var chunkRQ2Y7USX_cjs = require('../chunk-RQ2Y7USX.cjs');
|
|
10
|
+
require('../chunk-DVUZTGVL.cjs');
|
|
11
11
|
require('../chunk-ADOKTJHV.cjs');
|
|
12
12
|
var chunkDWZXSPMB_cjs = require('../chunk-DWZXSPMB.cjs');
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
require('../chunk-7RGLTF76.cjs');
|
|
14
|
+
require('../chunk-32HW2Q33.cjs');
|
|
15
15
|
require('../chunk-PPCATBOY.cjs');
|
|
16
|
-
|
|
16
|
+
require('../chunk-MHVNT4J3.cjs');
|
|
17
17
|
var chunkULWRNGGE_cjs = require('../chunk-ULWRNGGE.cjs');
|
|
18
|
-
|
|
18
|
+
require('../chunk-KDG6FER6.cjs');
|
|
19
19
|
require('../chunk-DES3K4SD.cjs');
|
|
20
|
-
var RadioGroupPrimitive = require('@radix-ui/react-radio-group');
|
|
21
|
-
var ui = require('@arbidocs/react/ui');
|
|
22
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
23
|
-
var react = require('react');
|
|
24
|
-
var lucideReact = require('lucide-react');
|
|
25
|
-
var classVarianceAuthority = require('class-variance-authority');
|
|
26
20
|
|
|
27
|
-
function _interopNamespace(e) {
|
|
28
|
-
if (e && e.__esModule) return e;
|
|
29
|
-
var n = Object.create(null);
|
|
30
|
-
if (e) {
|
|
31
|
-
Object.keys(e).forEach(function (k) {
|
|
32
|
-
if (k !== 'default') {
|
|
33
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
34
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
35
|
-
enumerable: true,
|
|
36
|
-
get: function () { return e[k]; }
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
n.default = e;
|
|
42
|
-
return Object.freeze(n);
|
|
43
|
-
}
|
|
44
21
|
|
|
45
|
-
var RadioGroupPrimitive__namespace = /*#__PURE__*/_interopNamespace(RadioGroupPrimitive);
|
|
46
22
|
|
|
47
|
-
|
|
48
|
-
value,
|
|
49
|
-
onChange,
|
|
50
|
-
options,
|
|
51
|
-
ariaLabel,
|
|
52
|
-
className
|
|
53
|
-
}) {
|
|
54
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
55
|
-
RadioGroupPrimitive__namespace.Root,
|
|
56
|
-
{
|
|
57
|
-
"data-slot": "segmented-control",
|
|
58
|
-
"aria-label": ariaLabel,
|
|
59
|
-
value,
|
|
60
|
-
onValueChange: (next) => onChange(next),
|
|
61
|
-
orientation: "horizontal",
|
|
62
|
-
className: ui.cn("inline-flex rounded-lg border border-border bg-background p-1", className),
|
|
63
|
-
children: options.map((option) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
64
|
-
RadioGroupPrimitive__namespace.Item,
|
|
65
|
-
{
|
|
66
|
-
value: option.value,
|
|
67
|
-
"data-testid": option.testId,
|
|
68
|
-
className: ui.cn(
|
|
69
|
-
"flex items-center gap-2 rounded-md px-4 py-1.5 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 pointer-coarse:py-2.5",
|
|
70
|
-
option.value === value ? "bg-accent text-accent-foreground" : "text-muted-foreground hover:text-foreground"
|
|
71
|
-
),
|
|
72
|
-
children: [
|
|
73
|
-
option.icon,
|
|
74
|
-
option.label
|
|
75
|
-
]
|
|
76
|
-
},
|
|
77
|
-
option.value
|
|
78
|
-
))
|
|
79
|
-
}
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
function FloatingPanel({
|
|
83
|
-
panelId,
|
|
84
|
-
mode,
|
|
85
|
-
title,
|
|
86
|
-
subtitle,
|
|
87
|
-
headerIcon,
|
|
88
|
-
headerActions,
|
|
89
|
-
tabLabel,
|
|
90
|
-
modeSwitcher,
|
|
91
|
-
children,
|
|
92
|
-
footer,
|
|
93
|
-
onPanelClick,
|
|
94
|
-
className
|
|
95
|
-
}) {
|
|
96
|
-
const isRenderFunction = typeof children === "function";
|
|
97
|
-
const content = isRenderFunction ? children({ modeSwitcher }) : children;
|
|
98
|
-
const footerEl = footer && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 flex-shrink-0 border-t border-border p-3", children: footer });
|
|
99
|
-
const body = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
100
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: ui.cn("flex-1", isRenderFunction ? "overflow-hidden" : "overflow-auto p-3"), children: content }),
|
|
101
|
-
footerEl
|
|
102
|
-
] });
|
|
103
|
-
if (mode === "popout") {
|
|
104
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
105
|
-
"div",
|
|
106
|
-
{
|
|
107
|
-
"data-slot": "floating-panel",
|
|
108
|
-
className: ui.cn("flex h-screen flex-col bg-background text-foreground", className),
|
|
109
|
-
children: [
|
|
110
|
-
!isRenderFunction && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-shrink-0 items-start justify-between border-b border-border px-3 py-2", children: [
|
|
111
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
|
|
112
|
-
(title || headerIcon) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-base font-semibold text-primary", children: [
|
|
113
|
-
headerIcon,
|
|
114
|
-
title && /* @__PURE__ */ jsxRuntime.jsx("span", { children: title })
|
|
115
|
-
] }),
|
|
116
|
-
subtitle && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: subtitle }),
|
|
117
|
-
headerActions && /* @__PURE__ */ jsxRuntime.jsx("div", { className: title ? "mt-1.5" : "", children: headerActions })
|
|
118
|
-
] }),
|
|
119
|
-
modeSwitcher
|
|
120
|
-
] }),
|
|
121
|
-
body
|
|
122
|
-
]
|
|
123
|
-
}
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
127
|
-
"div",
|
|
128
|
-
{
|
|
129
|
-
"data-slot": "floating-panel",
|
|
130
|
-
"data-mode": mode,
|
|
131
|
-
className: ui.cn("flex h-full flex-col bg-background text-foreground", className),
|
|
132
|
-
onClick: onPanelClick,
|
|
133
|
-
children: [
|
|
134
|
-
!isRenderFunction && /* @__PURE__ */ jsxRuntime.jsx(
|
|
135
|
-
chunk7RGLTF76_cjs.TabHeader,
|
|
136
|
-
{
|
|
137
|
-
tabs: [{ id: panelId, label: tabLabel ?? title }],
|
|
138
|
-
activeTabId: panelId,
|
|
139
|
-
onTabChange: () => {
|
|
140
|
-
},
|
|
141
|
-
rightContent: modeSwitcher
|
|
142
|
-
}
|
|
143
|
-
),
|
|
144
|
-
body
|
|
145
|
-
]
|
|
146
|
-
}
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
var DEFAULT_CONFIG_SWITCHER_BAR_LABELS = {
|
|
150
|
-
placeholder: "Select configuration...",
|
|
151
|
-
save: "Save",
|
|
152
|
-
saving: "Saving...",
|
|
153
|
-
delete: "Delete"
|
|
154
|
-
};
|
|
155
|
-
var MARKERS = { default: lucideReact.Star, original: lucideReact.Undo2, "last-used": lucideReact.History };
|
|
156
|
-
function ConfigSwitcherBar({
|
|
157
|
-
options,
|
|
158
|
-
value,
|
|
159
|
-
onSelect,
|
|
160
|
-
hasUnsavedChanges,
|
|
161
|
-
unsavedTitle = "Unsaved Changes",
|
|
162
|
-
unsavedSubtitle = "Changes will be lost if you switch",
|
|
163
|
-
showNameField,
|
|
164
|
-
name,
|
|
165
|
-
onNameChange,
|
|
166
|
-
namePlaceholder,
|
|
167
|
-
saveLabel,
|
|
168
|
-
onSave,
|
|
169
|
-
isSaving,
|
|
170
|
-
canDelete,
|
|
171
|
-
onDelete,
|
|
172
|
-
isDeleting,
|
|
173
|
-
nameTestId,
|
|
174
|
-
saveTestId,
|
|
175
|
-
deleteTestId,
|
|
176
|
-
labels,
|
|
177
|
-
className
|
|
178
|
-
}) {
|
|
179
|
-
const l = react.useMemo(() => ({ ...DEFAULT_CONFIG_SWITCHER_BAR_LABELS, ...labels }), [labels]);
|
|
180
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
181
|
-
ui.DialogFooter,
|
|
182
|
-
{
|
|
183
|
-
"data-slot": "config-switcher-bar",
|
|
184
|
-
className: ui.cn("flex-shrink-0 border-t bg-muted px-4 py-4", className),
|
|
185
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex w-full flex-col gap-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-[36px] items-center gap-3", children: [
|
|
186
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
187
|
-
ui.Select,
|
|
188
|
-
{
|
|
189
|
-
value: hasUnsavedChanges ? "unsaved" : value,
|
|
190
|
-
onValueChange: (v) => {
|
|
191
|
-
if (v !== "unsaved") onSelect(v);
|
|
192
|
-
},
|
|
193
|
-
children: [
|
|
194
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.SelectTrigger, { className: "h-9 min-w-0 flex-1 border-0 bg-background", children: /* @__PURE__ */ jsxRuntime.jsx(ui.SelectValue, { placeholder: l.placeholder }) }),
|
|
195
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.SelectContent, { position: "popper", children: [
|
|
196
|
-
hasUnsavedChanges && /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: "unsaved", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
|
|
197
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: unsavedTitle }),
|
|
198
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: unsavedSubtitle })
|
|
199
|
-
] }) }),
|
|
200
|
-
options.map((o) => {
|
|
201
|
-
const Marker = o.marker ? MARKERS[o.marker] : null;
|
|
202
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: o.value, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-2", children: [
|
|
203
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
|
|
204
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: o.title }),
|
|
205
|
-
o.subtitle && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: o.subtitle })
|
|
206
|
-
] }),
|
|
207
|
-
Marker && /* @__PURE__ */ jsxRuntime.jsx(Marker, { className: "mt-0.5 size-3 flex-shrink-0 text-muted-foreground" })
|
|
208
|
-
] }) }, o.value);
|
|
209
|
-
})
|
|
210
|
-
] })
|
|
211
|
-
]
|
|
212
|
-
}
|
|
213
|
-
),
|
|
214
|
-
showNameField && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
215
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
216
|
-
ui.Input,
|
|
217
|
-
{
|
|
218
|
-
value: name,
|
|
219
|
-
onChange: (e) => onNameChange(e.target.value),
|
|
220
|
-
placeholder: namePlaceholder,
|
|
221
|
-
className: "h-9 min-w-0 flex-1 bg-background",
|
|
222
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(nameTestId, { testId: "config-name-input" })
|
|
223
|
-
}
|
|
224
|
-
),
|
|
225
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
226
|
-
ui.Button,
|
|
227
|
-
{
|
|
228
|
-
variant: "outline",
|
|
229
|
-
size: "sm",
|
|
230
|
-
className: "h-9",
|
|
231
|
-
onClick: onSave,
|
|
232
|
-
disabled: isSaving || !name.trim(),
|
|
233
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(saveTestId, { testId: "save-config-button" }),
|
|
234
|
-
children: isSaving ? l.saving : saveLabel
|
|
235
|
-
}
|
|
236
|
-
)
|
|
237
|
-
] }),
|
|
238
|
-
canDelete && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
239
|
-
ui.Button,
|
|
240
|
-
{
|
|
241
|
-
variant: "outline",
|
|
242
|
-
size: "sm",
|
|
243
|
-
className: "h-9 border-destructive text-destructive hover:bg-destructive hover:text-destructive-foreground",
|
|
244
|
-
onClick: onDelete,
|
|
245
|
-
disabled: isDeleting,
|
|
246
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(deleteTestId, { testId: "delete-config-button" }),
|
|
247
|
-
children: [
|
|
248
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2, { className: "mr-2 size-4" }),
|
|
249
|
-
l.delete
|
|
250
|
-
]
|
|
251
|
-
}
|
|
252
|
-
)
|
|
253
|
-
] }) })
|
|
254
|
-
}
|
|
255
|
-
);
|
|
256
|
-
}
|
|
257
|
-
var CONVERSATION_TITLE_MAX = 50;
|
|
258
|
-
var DEFAULT_CONVERSATION_TITLE_SECTION_LABELS = {
|
|
259
|
-
title: "Conversation Title",
|
|
260
|
-
placeholder: "New Conversation",
|
|
261
|
-
share: "Share",
|
|
262
|
-
shared: "Shared",
|
|
263
|
-
ownerOnlyShare: "Only available to conversation owner",
|
|
264
|
-
makePrivate: "Make private again",
|
|
265
|
-
characters: (count, max) => `${count}/${max} characters`,
|
|
266
|
-
saving: "Saving...",
|
|
267
|
-
ownerOnlyEdit: "Only the conversation owner can edit the title"
|
|
268
|
-
};
|
|
269
|
-
var SECTION_CLASS = "rounded-md border bg-muted/50 p-4";
|
|
270
|
-
function ConversationTitleSection({
|
|
271
|
-
title,
|
|
272
|
-
onTitleChange,
|
|
273
|
-
onTitleCommit,
|
|
274
|
-
isOwner,
|
|
275
|
-
isShared,
|
|
276
|
-
isSharing,
|
|
277
|
-
isSavingTitle,
|
|
278
|
-
onShare,
|
|
279
|
-
onUnshare,
|
|
280
|
-
inputTestId,
|
|
281
|
-
shareTestId,
|
|
282
|
-
labels
|
|
283
|
-
}) {
|
|
284
|
-
const l = react.useMemo(() => ({ ...DEFAULT_CONVERSATION_TITLE_SECTION_LABELS, ...labels }), [labels]);
|
|
285
|
-
const trimmed = title.trim();
|
|
286
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(chunkULWRNGGE_cjs.ModalSection, { className: SECTION_CLASS, children: [
|
|
287
|
-
/* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalSectionTitle, { children: l.title }),
|
|
288
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [
|
|
289
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
290
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
291
|
-
ui.Input,
|
|
292
|
-
{
|
|
293
|
-
value: title,
|
|
294
|
-
onChange: (e) => {
|
|
295
|
-
if (isOwner && e.target.value.length <= CONVERSATION_TITLE_MAX) {
|
|
296
|
-
onTitleChange(e.target.value);
|
|
297
|
-
}
|
|
298
|
-
},
|
|
299
|
-
onBlur: () => {
|
|
300
|
-
if (isOwner && trimmed && trimmed.length <= CONVERSATION_TITLE_MAX) onTitleCommit();
|
|
301
|
-
},
|
|
302
|
-
placeholder: l.placeholder,
|
|
303
|
-
maxLength: 60,
|
|
304
|
-
disabled: !isOwner,
|
|
305
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(inputTestId, { testId: "conversation-title-input" })
|
|
306
|
-
}
|
|
307
|
-
),
|
|
308
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
|
|
309
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { tabIndex: !isOwner ? 0 : void 0, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
310
|
-
ui.Button,
|
|
311
|
-
{
|
|
312
|
-
variant: isShared ? "secondary" : "outline",
|
|
313
|
-
size: "sm",
|
|
314
|
-
className: "h-9 px-3 pointer-coarse:h-11",
|
|
315
|
-
onClick: () => {
|
|
316
|
-
if (!isOwner) return;
|
|
317
|
-
if (isShared) onUnshare?.();
|
|
318
|
-
else onShare();
|
|
319
|
-
},
|
|
320
|
-
disabled: !isOwner || isShared && !onUnshare || isSharing,
|
|
321
|
-
title: isOwner && isShared && onUnshare ? l.makePrivate : void 0,
|
|
322
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(shareTestId, { testId: "share-conversation-button" }),
|
|
323
|
-
children: [
|
|
324
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Users, { className: "mr-1 size-3" }),
|
|
325
|
-
isShared ? l.shared : l.share
|
|
326
|
-
]
|
|
327
|
-
}
|
|
328
|
-
) }) }),
|
|
329
|
-
!isOwner && /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: l.ownerOnlyShare }) })
|
|
330
|
-
] })
|
|
331
|
-
] }),
|
|
332
|
-
isOwner ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
333
|
-
"p",
|
|
334
|
-
{
|
|
335
|
-
className: ui.cn(
|
|
336
|
-
"text-sm",
|
|
337
|
-
title.length > CONVERSATION_TITLE_MAX ? "text-destructive" : "text-muted-foreground"
|
|
338
|
-
),
|
|
339
|
-
children: [
|
|
340
|
-
l.characters(title.length, CONVERSATION_TITLE_MAX),
|
|
341
|
-
isSavingTitle && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-2 text-primary", children: l.saving })
|
|
342
|
-
]
|
|
343
|
-
}
|
|
344
|
-
) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: l.ownerOnlyEdit })
|
|
345
|
-
] })
|
|
346
|
-
] });
|
|
347
|
-
}
|
|
348
|
-
var DEFAULT_MODEL_SELECTION_SECTION_LABELS = {
|
|
349
|
-
title: "AI Model Selection",
|
|
350
|
-
description: "Select the AI model to use for this conversation",
|
|
351
|
-
useDefaults: "Use defaults",
|
|
352
|
-
auto: "Auto",
|
|
353
|
-
default: "Default",
|
|
354
|
-
lastUsed: "Last used",
|
|
355
|
-
deepThinking: "Deep Thinking"
|
|
356
|
-
};
|
|
357
|
-
function ModelSelectionSection({
|
|
358
|
-
selector,
|
|
359
|
-
onUseDefaults,
|
|
360
|
-
defaultsTestId,
|
|
361
|
-
labels
|
|
362
|
-
}) {
|
|
363
|
-
const l = react.useMemo(() => ({ ...DEFAULT_MODEL_SELECTION_SECTION_LABELS, ...labels }), [labels]);
|
|
364
|
-
const legend = [
|
|
365
|
-
{ icon: lucideReact.Sparkles, label: l.auto },
|
|
366
|
-
{ icon: lucideReact.Star, label: l.default },
|
|
367
|
-
{ icon: lucideReact.History, label: l.lastUsed },
|
|
368
|
-
{ icon: lucideReact.Brain, label: l.deepThinking }
|
|
369
|
-
];
|
|
370
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(chunkULWRNGGE_cjs.ModalSection, { className: SECTION_CLASS, children: [
|
|
371
|
-
/* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalSectionTitle, { children: l.title }),
|
|
372
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
373
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: l.description }),
|
|
374
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
375
|
-
selector,
|
|
376
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
377
|
-
ui.Button,
|
|
378
|
-
{
|
|
379
|
-
variant: "outline",
|
|
380
|
-
size: "sm",
|
|
381
|
-
className: "flex h-8 items-center gap-1.5 px-3 pointer-coarse:h-11",
|
|
382
|
-
onClick: onUseDefaults,
|
|
383
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(defaultsTestId, { testId: "use-defaults-button" }),
|
|
384
|
-
children: [
|
|
385
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Star, { className: "size-4" }),
|
|
386
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: l.useDefaults })
|
|
387
|
-
]
|
|
388
|
-
}
|
|
389
|
-
)
|
|
390
|
-
] }),
|
|
391
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-muted-foreground", children: legend.map(({ icon: Icon, label }) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1", children: [
|
|
392
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "size-3" }),
|
|
393
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: label })
|
|
394
|
-
] }, label)) })
|
|
395
|
-
] })
|
|
396
|
-
] });
|
|
397
|
-
}
|
|
398
|
-
function ThreadPreviewDialog({
|
|
399
|
-
open,
|
|
400
|
-
onOpenChange,
|
|
401
|
-
crumbs,
|
|
402
|
-
description = "Thread visualization",
|
|
403
|
-
width,
|
|
404
|
-
testId,
|
|
405
|
-
children
|
|
406
|
-
}) {
|
|
407
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
408
|
-
ui.DialogContent,
|
|
409
|
-
{
|
|
410
|
-
presentation: "sheet",
|
|
411
|
-
className: "flex flex-col overflow-hidden p-0",
|
|
412
|
-
style: { width: `${width}px`, maxWidth: "95vw", height: "80vh", maxHeight: "90vh" },
|
|
413
|
-
"data-testid": testId,
|
|
414
|
-
children: [
|
|
415
|
-
/* @__PURE__ */ jsxRuntime.jsxs(chunkULWRNGGE_cjs.ModalHeader, { children: [
|
|
416
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-3", children: crumbs.map((c, i) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-3", children: [
|
|
417
|
-
i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "/" }),
|
|
418
|
-
c.icon,
|
|
419
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: c.label })
|
|
420
|
-
] }, i)) }) }),
|
|
421
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { className: "sr-only", children: description })
|
|
422
|
-
] }),
|
|
423
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-auto px-6 pb-6", children })
|
|
424
|
-
]
|
|
425
|
-
}
|
|
426
|
-
) });
|
|
427
|
-
}
|
|
428
|
-
var ITEMS = { one: "item", other: "items" };
|
|
429
|
-
function isInlineObject(data) {
|
|
430
|
-
if (data === null || data === void 0) return true;
|
|
431
|
-
if (typeof data !== "object") return true;
|
|
432
|
-
if (Array.isArray(data)) return data.length === 0;
|
|
433
|
-
const keys = Object.keys(data);
|
|
434
|
-
if (keys.length === 0) return true;
|
|
435
|
-
if (keys.length > 4) return false;
|
|
436
|
-
return Object.values(data).every(
|
|
437
|
-
(v) => v === null || v === void 0 || typeof v !== "object"
|
|
438
|
-
);
|
|
439
|
-
}
|
|
440
|
-
function inlineSummary(data) {
|
|
441
|
-
const parts = Object.entries(data).map(([k, v]) => {
|
|
442
|
-
if (v === null) return `${k}: null`;
|
|
443
|
-
if (typeof v === "string") return `${k}: "${v.length > 40 ? v.slice(0, 40) + "\u2026" : v}"`;
|
|
444
|
-
return `${k}: ${String(v)}`;
|
|
445
|
-
});
|
|
446
|
-
return `{ ${parts.join(", ")} }`;
|
|
447
|
-
}
|
|
448
|
-
function arrayPreview(data) {
|
|
449
|
-
if (data.length === 0) return "[]";
|
|
450
|
-
const first = data[0];
|
|
451
|
-
if (typeof first !== "object" || first === null) return `[${chunkKDG6FER6_cjs.formatCount(data.length, ITEMS)}]`;
|
|
452
|
-
const obj = first;
|
|
453
|
-
const previewKeys = ["action", "step", "phase", "tool", "name", "type", "id"];
|
|
454
|
-
const parts = previewKeys.filter((k) => obj[k] !== void 0).slice(0, 3).map((k) => `${k}: ${JSON.stringify(obj[k])}`);
|
|
455
|
-
if (parts.length === 0) return `[${chunkKDG6FER6_cjs.formatCount(data.length, ITEMS)}]`;
|
|
456
|
-
return `[${chunkKDG6FER6_cjs.formatCount(data.length, ITEMS)} \u2014 { ${parts.join(", ")} }, \u2026]`;
|
|
457
|
-
}
|
|
458
|
-
var NAME_CLASS = "font-medium text-primary";
|
|
459
|
-
var COPY_CLASS = "rounded p-0.5 opacity-50 transition-opacity hover:bg-muted hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:flex pointer-coarse:size-11 pointer-coarse:items-center pointer-coarse:justify-center pointer-coarse:opacity-100";
|
|
460
|
-
function valueColor(data) {
|
|
461
|
-
if (data === null || data === void 0) return "text-muted-foreground";
|
|
462
|
-
switch (typeof data) {
|
|
463
|
-
case "string":
|
|
464
|
-
return "text-primary";
|
|
465
|
-
case "number":
|
|
466
|
-
return "text-primary";
|
|
467
|
-
case "boolean":
|
|
468
|
-
return "text-purple-700 dark:text-purple-400";
|
|
469
|
-
default:
|
|
470
|
-
return "text-foreground";
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
function plainValue(data) {
|
|
474
|
-
if (data === null) return "null";
|
|
475
|
-
if (data === void 0) return "undefined";
|
|
476
|
-
return typeof data === "string" ? `"${data}"` : String(data);
|
|
477
|
-
}
|
|
478
|
-
function JsonTree({
|
|
479
|
-
data,
|
|
480
|
-
name,
|
|
481
|
-
defaultExpanded = false,
|
|
482
|
-
level = 0,
|
|
483
|
-
path = [],
|
|
484
|
-
resolveHint,
|
|
485
|
-
formatValue: formatValue2
|
|
486
|
-
}) {
|
|
487
|
-
const [isExpanded, setIsExpanded] = react.useState(defaultExpanded || level < 2);
|
|
488
|
-
const [copied, setCopied] = react.useState(false);
|
|
489
|
-
const currentPath = name ? [...path, name] : path;
|
|
490
|
-
const hint = name && resolveHint ? resolveHint(currentPath, name) : null;
|
|
491
|
-
const displayName = hint?.displayName || name;
|
|
492
|
-
const handleCopy = (value) => {
|
|
493
|
-
const text = typeof value === "string" ? value : JSON.stringify(value, null, 2);
|
|
494
|
-
void navigator.clipboard.writeText(text).then(() => {
|
|
495
|
-
setCopied(true);
|
|
496
|
-
setTimeout(() => setCopied(false), 2e3);
|
|
497
|
-
});
|
|
498
|
-
};
|
|
499
|
-
const copyButton = (title, value) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
500
|
-
"button",
|
|
501
|
-
{
|
|
502
|
-
type: "button",
|
|
503
|
-
onClick: () => handleCopy(value),
|
|
504
|
-
className: COPY_CLASS,
|
|
505
|
-
title,
|
|
506
|
-
"aria-label": title,
|
|
507
|
-
children: copied ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { size: 12, className: "text-green-text" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, { size: 12 })
|
|
508
|
-
}
|
|
509
|
-
);
|
|
510
|
-
const isArray = Array.isArray(data);
|
|
511
|
-
const isObject = typeof data === "object" && data !== null && !isArray;
|
|
512
|
-
if (!isObject && !isArray) {
|
|
513
|
-
const displayValue = hint && formatValue2 ? formatValue2(data, hint) : plainValue(data);
|
|
514
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
515
|
-
"div",
|
|
516
|
-
{
|
|
517
|
-
"data-slot": "json-tree-leaf",
|
|
518
|
-
className: "group flex items-center gap-2 py-0.5 font-mono text-sm",
|
|
519
|
-
children: [
|
|
520
|
-
displayName && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: NAME_CLASS, title: hint?.description, children: [
|
|
521
|
-
displayName,
|
|
522
|
-
":"
|
|
523
|
-
] }),
|
|
524
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: valueColor(data), children: displayValue }),
|
|
525
|
-
hint?.formatType === "id" && typeof data === "string" && data.length > 20 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-muted-foreground", title: data, children: [
|
|
526
|
-
"(full: ",
|
|
527
|
-
data,
|
|
528
|
-
")"
|
|
529
|
-
] }),
|
|
530
|
-
copyButton("Copy value", data)
|
|
531
|
-
]
|
|
532
|
-
}
|
|
533
|
-
);
|
|
534
|
-
}
|
|
535
|
-
if (isObject && isInlineObject(data)) {
|
|
536
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
537
|
-
"div",
|
|
538
|
-
{
|
|
539
|
-
"data-slot": "json-tree-leaf",
|
|
540
|
-
className: "group flex items-center gap-2 py-0.5 font-mono text-sm",
|
|
541
|
-
children: [
|
|
542
|
-
displayName && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: NAME_CLASS, children: [
|
|
543
|
-
displayName,
|
|
544
|
-
":"
|
|
545
|
-
] }),
|
|
546
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: inlineSummary(data) }),
|
|
547
|
-
copyButton("Copy object", data)
|
|
548
|
-
]
|
|
549
|
-
}
|
|
550
|
-
);
|
|
551
|
-
}
|
|
552
|
-
const Icon = isExpanded ? lucideReact.ChevronDown : lucideReact.ChevronRight;
|
|
553
|
-
const entries = isArray ? data.map((item, index) => [String(index), item]) : Object.entries(data);
|
|
554
|
-
const collapsedPreview = isArray ? arrayPreview(data) : `{${Object.keys(data).length} fields}`;
|
|
555
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "json-tree", className: "font-mono text-sm", children: [
|
|
556
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group flex items-center gap-1 py-0.5", children: [
|
|
557
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
558
|
-
"button",
|
|
559
|
-
{
|
|
560
|
-
type: "button",
|
|
561
|
-
onClick: () => setIsExpanded(!isExpanded),
|
|
562
|
-
"aria-expanded": isExpanded,
|
|
563
|
-
className: "flex items-center gap-1 rounded p-0.5 transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11",
|
|
564
|
-
title: hint?.description,
|
|
565
|
-
children: [
|
|
566
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon, { size: 14, className: "shrink-0" }),
|
|
567
|
-
displayName && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: NAME_CLASS, children: [
|
|
568
|
-
displayName,
|
|
569
|
-
":"
|
|
570
|
-
] }),
|
|
571
|
-
!isExpanded && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "max-w-[400px] truncate text-sm text-muted-foreground", children: collapsedPreview }),
|
|
572
|
-
isExpanded && isArray && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-muted-foreground", children: [
|
|
573
|
-
data.length,
|
|
574
|
-
" items"
|
|
575
|
-
] })
|
|
576
|
-
]
|
|
577
|
-
}
|
|
578
|
-
),
|
|
579
|
-
copyButton("Copy object", data)
|
|
580
|
-
] }),
|
|
581
|
-
isExpanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-4 border-l border-border/40 pl-2", children: entries.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-0.5 text-sm text-muted-foreground", children: isArray ? "empty array" : "empty object" }) : entries.map(([key, value]) => {
|
|
582
|
-
if (isArray && typeof value === "object" && value !== null && isInlineObject(value)) {
|
|
583
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-0.5 font-mono text-sm text-muted-foreground", children: inlineSummary(value) }, key);
|
|
584
|
-
}
|
|
585
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
586
|
-
JsonTree,
|
|
587
|
-
{
|
|
588
|
-
name: isArray ? void 0 : key,
|
|
589
|
-
data: value,
|
|
590
|
-
level: level + 1,
|
|
591
|
-
path: currentPath,
|
|
592
|
-
resolveHint,
|
|
593
|
-
formatValue: formatValue2
|
|
594
|
-
},
|
|
595
|
-
key
|
|
596
|
-
);
|
|
597
|
-
}) })
|
|
598
|
-
] });
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
// src/settings/message-schema-hints.ts
|
|
602
|
-
var messageFieldHints = {
|
|
603
|
-
role: {
|
|
604
|
-
displayName: "Role",
|
|
605
|
-
formatType: "enum",
|
|
606
|
-
description: "Message role (user, assistant, or system)"
|
|
607
|
-
},
|
|
608
|
-
content: {
|
|
609
|
-
displayName: "Content",
|
|
610
|
-
formatType: "long-string",
|
|
611
|
-
description: "Message content text"
|
|
612
|
-
},
|
|
613
|
-
created_at: {
|
|
614
|
-
displayName: "Created At",
|
|
615
|
-
formatType: "timestamp",
|
|
616
|
-
description: "Message creation timestamp"
|
|
617
|
-
},
|
|
618
|
-
external_id: {
|
|
619
|
-
displayName: "Message ID",
|
|
620
|
-
formatType: "id",
|
|
621
|
-
description: "External message identifier"
|
|
622
|
-
},
|
|
623
|
-
conversation_ext_id: {
|
|
624
|
-
displayName: "Conversation ID",
|
|
625
|
-
formatType: "id",
|
|
626
|
-
description: "Parent conversation identifier"
|
|
627
|
-
},
|
|
628
|
-
parent_message_ext_id: {
|
|
629
|
-
displayName: "Parent Message ID",
|
|
630
|
-
formatType: "id",
|
|
631
|
-
description: "Parent message identifier (null for first message)"
|
|
632
|
-
},
|
|
633
|
-
created_by_ext_id: {
|
|
634
|
-
displayName: "Created By",
|
|
635
|
-
formatType: "id",
|
|
636
|
-
description: "User who created this message"
|
|
637
|
-
},
|
|
638
|
-
config_ext_id: {
|
|
639
|
-
displayName: "Config ID",
|
|
640
|
-
formatType: "id",
|
|
641
|
-
description: "Configuration used for this message"
|
|
642
|
-
},
|
|
643
|
-
shared: {
|
|
644
|
-
displayName: "Shared",
|
|
645
|
-
formatType: "boolean",
|
|
646
|
-
description: "Whether message is shared"
|
|
647
|
-
},
|
|
648
|
-
tools: {
|
|
649
|
-
displayName: "Tools",
|
|
650
|
-
formatType: "json",
|
|
651
|
-
description: "Tool outputs (citations, retrieval, trace)"
|
|
652
|
-
},
|
|
653
|
-
meta: {
|
|
654
|
-
displayName: "Metadata",
|
|
655
|
-
formatType: "json",
|
|
656
|
-
description: "Additional metadata"
|
|
657
|
-
}
|
|
658
|
-
};
|
|
659
|
-
var traceToolFieldHints = {
|
|
660
|
-
name: {
|
|
661
|
-
displayName: "Tool Name",
|
|
662
|
-
formatType: "enum",
|
|
663
|
-
description: "Execution trace tool"
|
|
664
|
-
},
|
|
665
|
-
description: {
|
|
666
|
-
displayName: "Description",
|
|
667
|
-
formatType: "string",
|
|
668
|
-
description: "Tool description"
|
|
669
|
-
},
|
|
670
|
-
trace_id: {
|
|
671
|
-
displayName: "Trace ID",
|
|
672
|
-
formatType: "id",
|
|
673
|
-
description: "Unique trace identifier"
|
|
674
|
-
},
|
|
675
|
-
start_time: {
|
|
676
|
-
displayName: "Start Time",
|
|
677
|
-
formatType: "timestamp",
|
|
678
|
-
description: "When execution started"
|
|
679
|
-
},
|
|
680
|
-
duration_seconds: {
|
|
681
|
-
displayName: "Duration (seconds)",
|
|
682
|
-
formatType: "number",
|
|
683
|
-
description: "Total execution time"
|
|
684
|
-
},
|
|
685
|
-
steps: {
|
|
686
|
-
displayName: "Execution Steps",
|
|
687
|
-
formatType: "json",
|
|
688
|
-
description: "Full execution trace with all steps"
|
|
689
|
-
}
|
|
690
|
-
};
|
|
691
|
-
var citationToolFieldHints = {
|
|
692
|
-
name: {
|
|
693
|
-
displayName: "Tool Name",
|
|
694
|
-
formatType: "enum",
|
|
695
|
-
description: "Model citation tool"
|
|
696
|
-
},
|
|
697
|
-
tool_responses: {
|
|
698
|
-
displayName: "Citations",
|
|
699
|
-
formatType: "json",
|
|
700
|
-
description: "Citation data mapped by citation number"
|
|
701
|
-
}
|
|
702
|
-
};
|
|
703
|
-
function getFieldHint(path, fieldName) {
|
|
704
|
-
if (path.length === 1 && path[0] === "message") {
|
|
705
|
-
return messageFieldHints[fieldName] || null;
|
|
706
|
-
}
|
|
707
|
-
if (path.length >= 3 && path[0] === "message" && path[1] === "tools" && path[2] === "trace") {
|
|
708
|
-
return traceToolFieldHints[fieldName] || null;
|
|
709
|
-
}
|
|
710
|
-
if (path.length >= 3 && path[0] === "message" && path[1] === "tools" && path[2] === "model_citations") {
|
|
711
|
-
return citationToolFieldHints[fieldName] || null;
|
|
712
|
-
}
|
|
713
|
-
if (fieldName === "external_id" || fieldName.endsWith("_ext_id")) {
|
|
714
|
-
return { formatType: "id", displayName: fieldName.replace(/_/g, " ") };
|
|
715
|
-
}
|
|
716
|
-
if (fieldName === "created_at" || fieldName === "updated_at" || fieldName.endsWith("_at")) {
|
|
717
|
-
return { formatType: "timestamp", displayName: fieldName.replace(/_/g, " ") };
|
|
718
|
-
}
|
|
719
|
-
if (fieldName.includes("time") && !fieldName.includes("duration")) {
|
|
720
|
-
return { formatType: "timestamp" };
|
|
721
|
-
}
|
|
722
|
-
if (fieldName.includes("duration")) {
|
|
723
|
-
return { formatType: "number", description: "Duration in seconds" };
|
|
724
|
-
}
|
|
725
|
-
if (path.length >= 2 && path[path.length - 2] === "tools" && fieldName === "trace") {
|
|
726
|
-
return {
|
|
727
|
-
displayName: "\u{1F50D} Execution Trace",
|
|
728
|
-
formatType: "json",
|
|
729
|
-
description: "Complete execution trace with all steps and timing"
|
|
730
|
-
};
|
|
731
|
-
}
|
|
732
|
-
return null;
|
|
733
|
-
}
|
|
734
|
-
function formatValue(value, hint) {
|
|
735
|
-
if (value === null) return "null";
|
|
736
|
-
if (value === void 0) return "undefined";
|
|
737
|
-
if (hint?.formatType === "timestamp" && typeof value === "string") {
|
|
738
|
-
try {
|
|
739
|
-
const date = new Date(value);
|
|
740
|
-
if (!isNaN(date.getTime())) {
|
|
741
|
-
return `${date.toLocaleString()} (${value})`;
|
|
742
|
-
}
|
|
743
|
-
} catch {
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
if (hint?.formatType === "timestamp" && typeof value === "number") {
|
|
747
|
-
const date = new Date(value * 1e3);
|
|
748
|
-
return `${date.toLocaleString()} (${value})`;
|
|
749
|
-
}
|
|
750
|
-
if (hint?.formatType === "id" && typeof value === "string") {
|
|
751
|
-
if (value.length > 20) {
|
|
752
|
-
return `${value.substring(0, 16)}...${value.substring(value.length - 4)}`;
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
if (typeof value === "string") {
|
|
756
|
-
if (value.length > 100) {
|
|
757
|
-
return `"${value.substring(0, 97)}..." (${value.length} chars)`;
|
|
758
|
-
}
|
|
759
|
-
return `"${value}"`;
|
|
760
|
-
}
|
|
761
|
-
return String(value);
|
|
762
|
-
}
|
|
763
|
-
function MessageJsonTree(props) {
|
|
764
|
-
return /* @__PURE__ */ jsxRuntime.jsx(JsonTree, { ...props, resolveHint: getFieldHint, formatValue });
|
|
765
|
-
}
|
|
766
|
-
var DEFAULT_TIPS_EDITOR_LABELS = {
|
|
767
|
-
titleList: "Edit tips",
|
|
768
|
-
titleNew: "New tip",
|
|
769
|
-
titleEdit: "Edit tip",
|
|
770
|
-
descriptionList: "All tips across every page. Change a tip's placement to move it to a page, show it everywhere, or hide it. Changes save instantly.",
|
|
771
|
-
descriptionNew: "Create a tip and choose where it shows.",
|
|
772
|
-
descriptionEdit: "Editing the tip below \u2014 change its copy, button, or placement.",
|
|
773
|
-
hiddenOff: "Hidden (off)",
|
|
774
|
-
customSuffix: " \xB7 custom",
|
|
775
|
-
editTip: "Edit tip",
|
|
776
|
-
deleteTip: "Delete tip",
|
|
777
|
-
addTip: "Add tip",
|
|
778
|
-
testerTitle: "Run a sequence (test)",
|
|
779
|
-
run: "Run",
|
|
780
|
-
cancel: "Cancel",
|
|
781
|
-
newTipIdentity: "New tip",
|
|
782
|
-
customTipIdentity: "Custom tip",
|
|
783
|
-
builtInTipIdentity: (code) => `Built-in tip \xB7 ${code}`,
|
|
784
|
-
yourNewTip: "Your new tip",
|
|
785
|
-
placement: "Placement",
|
|
786
|
-
message: "Message",
|
|
787
|
-
button: "Button",
|
|
788
|
-
noButton: "No button",
|
|
789
|
-
platformAction: "Platform action",
|
|
790
|
-
actionSequence: "Action sequence",
|
|
791
|
-
externalLink: "External link (new window)",
|
|
792
|
-
buttonLabel: "Button label",
|
|
793
|
-
action: "Action",
|
|
794
|
-
sequence: "Sequence",
|
|
795
|
-
url: "URL",
|
|
796
|
-
back: "Back",
|
|
797
|
-
save: "Save",
|
|
798
|
-
saving: "Saving\u2026"
|
|
799
|
-
};
|
|
800
|
-
function SelectField({
|
|
801
|
-
label,
|
|
802
|
-
value,
|
|
803
|
-
onValueChange,
|
|
804
|
-
options
|
|
805
|
-
}) {
|
|
806
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
807
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { children: label }),
|
|
808
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.Select, { value, onValueChange, children: [
|
|
809
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.SelectTrigger, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.SelectValue, {}) }),
|
|
810
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.SelectContent, { children: options.map((o) => /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: o.value, children: o.label }, o.value)) })
|
|
811
|
-
] })
|
|
812
|
-
] });
|
|
813
|
-
}
|
|
814
|
-
var ROW_BUTTON = "size-7 flex-shrink-0 pointer-coarse:size-11";
|
|
815
|
-
function TipsEditorDialog({
|
|
816
|
-
open,
|
|
817
|
-
onOpenChange,
|
|
818
|
-
form,
|
|
819
|
-
onFormChange,
|
|
820
|
-
onFormBack,
|
|
821
|
-
onFormSave,
|
|
822
|
-
rows,
|
|
823
|
-
onEditRow,
|
|
824
|
-
onDeleteRow,
|
|
825
|
-
onAdd,
|
|
826
|
-
busy,
|
|
827
|
-
error,
|
|
828
|
-
placementOptions,
|
|
829
|
-
actionOptions,
|
|
830
|
-
sequenceOptions,
|
|
831
|
-
activeSequenceId,
|
|
832
|
-
onRunSequence,
|
|
833
|
-
onCancelSequence,
|
|
834
|
-
messageMaxChars,
|
|
835
|
-
ctaLabelMaxChars,
|
|
836
|
-
labels
|
|
837
|
-
}) {
|
|
838
|
-
const tipCtaHrefId = react.useId();
|
|
839
|
-
const tipCtaLabelId = react.useId();
|
|
840
|
-
const tipMessageId = react.useId();
|
|
841
|
-
const l = react.useMemo(() => ({ ...DEFAULT_TIPS_EDITOR_LABELS, ...labels }), [labels]);
|
|
842
|
-
const isNew = form?.code === null;
|
|
843
|
-
const title = form ? isNew ? l.titleNew : l.titleEdit : l.titleList;
|
|
844
|
-
const description = form ? isNew ? l.descriptionNew : l.descriptionEdit : l.descriptionList;
|
|
845
|
-
const targetOptions = [
|
|
846
|
-
{ value: "none", label: l.noButton },
|
|
847
|
-
{ value: "action", label: l.platformAction },
|
|
848
|
-
{ value: "sequence", label: l.actionSequence },
|
|
849
|
-
{ value: "url", label: l.externalLink }
|
|
850
|
-
];
|
|
851
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
852
|
-
chunkULWRNGGE_cjs.ModalScaffold,
|
|
853
|
-
{
|
|
854
|
-
open,
|
|
855
|
-
onOpenChange,
|
|
856
|
-
title,
|
|
857
|
-
description,
|
|
858
|
-
showDescription: true,
|
|
859
|
-
className: "max-w-lg",
|
|
860
|
-
children: [
|
|
861
|
-
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive", children: error }),
|
|
862
|
-
form ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
863
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-md border border-l-4 border-l-red-500 bg-muted/40 px-3 py-2", children: [
|
|
864
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: isNew ? l.newTipIdentity : form.isCustom ? l.customTipIdentity : l.builtInTipIdentity(form.code ?? "") }),
|
|
865
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-0.5 truncate text-sm font-medium text-foreground", children: form.original || l.yourNewTip })
|
|
866
|
-
] }),
|
|
867
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
868
|
-
SelectField,
|
|
869
|
-
{
|
|
870
|
-
label: l.placement,
|
|
871
|
-
value: form.placement,
|
|
872
|
-
onValueChange: (placement) => onFormChange({ placement }),
|
|
873
|
-
options: placementOptions
|
|
874
|
-
}
|
|
875
|
-
),
|
|
876
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
877
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
878
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { htmlFor: tipMessageId, children: l.message }),
|
|
879
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs text-muted-foreground", children: [
|
|
880
|
-
form.message.length,
|
|
881
|
-
"/",
|
|
882
|
-
messageMaxChars
|
|
883
|
-
] })
|
|
884
|
-
] }),
|
|
885
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
886
|
-
ui.Textarea,
|
|
887
|
-
{
|
|
888
|
-
id: tipMessageId,
|
|
889
|
-
value: form.message,
|
|
890
|
-
onChange: (e) => onFormChange({ message: e.target.value.slice(0, messageMaxChars) }),
|
|
891
|
-
maxLength: messageMaxChars,
|
|
892
|
-
rows: 2
|
|
893
|
-
}
|
|
894
|
-
)
|
|
895
|
-
] }),
|
|
896
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
897
|
-
SelectField,
|
|
898
|
-
{
|
|
899
|
-
label: l.button,
|
|
900
|
-
value: form.target,
|
|
901
|
-
onValueChange: (v) => onFormChange({ target: v }),
|
|
902
|
-
options: targetOptions
|
|
903
|
-
}
|
|
904
|
-
),
|
|
905
|
-
form.target !== "none" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
906
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { htmlFor: tipCtaLabelId, children: l.buttonLabel }),
|
|
907
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
908
|
-
ui.Input,
|
|
909
|
-
{
|
|
910
|
-
id: tipCtaLabelId,
|
|
911
|
-
value: form.ctaLabel,
|
|
912
|
-
onChange: (e) => onFormChange({ ctaLabel: e.target.value.slice(0, ctaLabelMaxChars) }),
|
|
913
|
-
maxLength: ctaLabelMaxChars
|
|
914
|
-
}
|
|
915
|
-
)
|
|
916
|
-
] }),
|
|
917
|
-
form.target === "action" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
918
|
-
SelectField,
|
|
919
|
-
{
|
|
920
|
-
label: l.action,
|
|
921
|
-
value: form.ctaAction,
|
|
922
|
-
onValueChange: (ctaAction) => onFormChange({ ctaAction }),
|
|
923
|
-
options: actionOptions
|
|
924
|
-
}
|
|
925
|
-
),
|
|
926
|
-
form.target === "sequence" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
927
|
-
SelectField,
|
|
928
|
-
{
|
|
929
|
-
label: l.sequence,
|
|
930
|
-
value: form.ctaSequence,
|
|
931
|
-
onValueChange: (ctaSequence) => onFormChange({ ctaSequence }),
|
|
932
|
-
options: sequenceOptions
|
|
933
|
-
}
|
|
934
|
-
),
|
|
935
|
-
form.target === "url" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
936
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { htmlFor: tipCtaHrefId, children: l.url }),
|
|
937
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
938
|
-
ui.Input,
|
|
939
|
-
{
|
|
940
|
-
id: tipCtaHrefId,
|
|
941
|
-
placeholder: "https://\u2026",
|
|
942
|
-
value: form.ctaHref,
|
|
943
|
-
onChange: (e) => onFormChange({ ctaHref: e.target.value })
|
|
944
|
-
}
|
|
945
|
-
)
|
|
946
|
-
] }),
|
|
947
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DialogFooter, { children: [
|
|
948
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "ghost", onClick: onFormBack, disabled: busy, children: l.back }),
|
|
949
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { onClick: onFormSave, disabled: busy || !form.message.trim(), children: busy ? l.saving : l.save })
|
|
950
|
-
] })
|
|
951
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
|
|
952
|
-
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "max-h-[55dvh] divide-y overflow-y-auto rounded border", children: rows.map((row) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-center gap-2 p-2 text-sm", children: [
|
|
953
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
954
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: ui.cn(row.isHidden && "text-muted-foreground line-through"), children: row.message }),
|
|
955
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
956
|
-
row.isHidden ? l.hiddenOff : row.placementLabel,
|
|
957
|
-
row.isCustom && l.customSuffix
|
|
958
|
-
] })
|
|
959
|
-
] }),
|
|
960
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
961
|
-
ui.Button,
|
|
962
|
-
{
|
|
963
|
-
size: "icon",
|
|
964
|
-
variant: "ghost",
|
|
965
|
-
className: ROW_BUTTON,
|
|
966
|
-
onClick: () => onEditRow(row.code),
|
|
967
|
-
"aria-label": l.editTip,
|
|
968
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pencil, { className: "size-3.5" })
|
|
969
|
-
}
|
|
970
|
-
),
|
|
971
|
-
row.isCustom && /* @__PURE__ */ jsxRuntime.jsx(
|
|
972
|
-
ui.Button,
|
|
973
|
-
{
|
|
974
|
-
size: "icon",
|
|
975
|
-
variant: "ghost",
|
|
976
|
-
className: ROW_BUTTON,
|
|
977
|
-
disabled: busy,
|
|
978
|
-
onClick: () => onDeleteRow(row.code),
|
|
979
|
-
"aria-label": l.deleteTip,
|
|
980
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2, { className: "size-3.5" })
|
|
981
|
-
}
|
|
982
|
-
)
|
|
983
|
-
] }, row.code)) }),
|
|
984
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { variant: "outline", size: "sm", onClick: onAdd, children: [
|
|
985
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "mr-1 size-4" }),
|
|
986
|
-
" ",
|
|
987
|
-
l.addTip
|
|
988
|
-
] }),
|
|
989
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2 rounded border border-dashed p-2", children: [
|
|
990
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: l.testerTitle }),
|
|
991
|
-
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "divide-y rounded border", children: sequenceOptions.map((s) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-center gap-2 p-2 text-sm", children: [
|
|
992
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: s.label }),
|
|
993
|
-
activeSequenceId === s.value ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
994
|
-
ui.Button,
|
|
995
|
-
{
|
|
996
|
-
size: "sm",
|
|
997
|
-
variant: "outline",
|
|
998
|
-
className: "h-7 flex-shrink-0 pointer-coarse:h-11",
|
|
999
|
-
onClick: onCancelSequence,
|
|
1000
|
-
children: l.cancel
|
|
1001
|
-
}
|
|
1002
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
1003
|
-
ui.Button,
|
|
1004
|
-
{
|
|
1005
|
-
size: "sm",
|
|
1006
|
-
variant: "outline",
|
|
1007
|
-
className: "h-7 flex-shrink-0 pointer-coarse:h-11",
|
|
1008
|
-
onClick: () => onRunSequence(s.value),
|
|
1009
|
-
children: l.run
|
|
1010
|
-
}
|
|
1011
|
-
)
|
|
1012
|
-
] }, s.value)) })
|
|
1013
|
-
] })
|
|
1014
|
-
] })
|
|
1015
|
-
]
|
|
1016
|
-
}
|
|
1017
|
-
);
|
|
1018
|
-
}
|
|
1019
|
-
var DEFAULT_SYNC_DIALOG_FOOTER_LABELS = {
|
|
1020
|
-
cancel: "Cancel",
|
|
1021
|
-
save: "Save"
|
|
1022
|
-
};
|
|
1023
|
-
function SyncDialogFooter({
|
|
1024
|
-
onCancel,
|
|
1025
|
-
onSave,
|
|
1026
|
-
saveDisabled,
|
|
1027
|
-
isSaving,
|
|
1028
|
-
cancelButton,
|
|
1029
|
-
saveButton,
|
|
1030
|
-
labels
|
|
1031
|
-
}) {
|
|
1032
|
-
const l = { ...DEFAULT_SYNC_DIALOG_FOOTER_LABELS, ...labels };
|
|
1033
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogFooter, { "data-slot": "sync-dialog-footer", children: [
|
|
1034
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "outline", size: "sm", onClick: onCancel, "data-testid": cancelButton?.testId, children: l.cancel }),
|
|
1035
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1036
|
-
ui.Button,
|
|
1037
|
-
{
|
|
1038
|
-
size: "sm",
|
|
1039
|
-
onClick: onSave,
|
|
1040
|
-
disabled: saveDisabled || isSaving,
|
|
1041
|
-
"data-testid": saveButton?.testId,
|
|
1042
|
-
children: [
|
|
1043
|
-
isSaving && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "mr-1.5 size-3.5 animate-spin" }),
|
|
1044
|
-
l.save
|
|
1045
|
-
]
|
|
1046
|
-
}
|
|
1047
|
-
)
|
|
1048
|
-
] });
|
|
1049
|
-
}
|
|
1050
|
-
function SyncDialogBody({ children }) {
|
|
1051
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "sync-dialog-body", className: "space-y-4 py-2", children });
|
|
1052
|
-
}
|
|
1053
|
-
function SyncField({ label, htmlFor, actions, hint, children }) {
|
|
1054
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "sync-field", className: "space-y-1.5", children: [
|
|
1055
|
-
(label || actions) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ui.cn(actions && "flex items-center justify-between"), children: [
|
|
1056
|
-
label && /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { htmlFor, children: label }),
|
|
1057
|
-
actions
|
|
1058
|
-
] }),
|
|
1059
|
-
children,
|
|
1060
|
-
hint && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: hint })
|
|
1061
|
-
] });
|
|
1062
|
-
}
|
|
1063
|
-
function SyncLinkButton({
|
|
1064
|
-
onClick,
|
|
1065
|
-
testId,
|
|
1066
|
-
children
|
|
1067
|
-
}) {
|
|
1068
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1069
|
-
"button",
|
|
1070
|
-
{
|
|
1071
|
-
type: "button",
|
|
1072
|
-
className: "text-xs font-medium text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 pointer-coarse:px-1",
|
|
1073
|
-
onClick,
|
|
1074
|
-
"data-testid": testId,
|
|
1075
|
-
children
|
|
1076
|
-
}
|
|
1077
|
-
);
|
|
1078
|
-
}
|
|
1079
|
-
function SyncLinkRow({ children }) {
|
|
1080
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-3", children });
|
|
1081
|
-
}
|
|
1082
|
-
function SyncSelect({
|
|
1083
|
-
id,
|
|
1084
|
-
testId,
|
|
1085
|
-
value,
|
|
1086
|
-
onValueChange,
|
|
1087
|
-
options,
|
|
1088
|
-
placeholder
|
|
1089
|
-
}) {
|
|
1090
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Select, { value, onValueChange, children: [
|
|
1091
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.SelectTrigger, { id, "data-testid": testId, children: /* @__PURE__ */ jsxRuntime.jsx(ui.SelectValue, { placeholder }) }),
|
|
1092
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.SelectContent, { children: options.map((o) => /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: o.value, children: o.label }, o.value)) })
|
|
1093
|
-
] });
|
|
1094
|
-
}
|
|
1095
|
-
function SyncOptionToggle({
|
|
1096
|
-
checked,
|
|
1097
|
-
onCheckedChange,
|
|
1098
|
-
title,
|
|
1099
|
-
description,
|
|
1100
|
-
testId
|
|
1101
|
-
}) {
|
|
1102
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex cursor-pointer items-start gap-2 text-sm", children: [
|
|
1103
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1104
|
-
ui.Checkbox,
|
|
1105
|
-
{
|
|
1106
|
-
className: "mt-0.5",
|
|
1107
|
-
checked,
|
|
1108
|
-
onCheckedChange: (v) => onCheckedChange(v === true),
|
|
1109
|
-
"data-testid": testId
|
|
1110
|
-
}
|
|
1111
|
-
),
|
|
1112
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
1113
|
-
title,
|
|
1114
|
-
description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs text-muted-foreground", children: description })
|
|
1115
|
-
] })
|
|
1116
|
-
] });
|
|
1117
|
-
}
|
|
1118
|
-
function SyncOptions({ children }) {
|
|
1119
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "sync-options", className: "space-y-2.5", children });
|
|
1120
|
-
}
|
|
1121
|
-
function SyncLoading({ children, compact }) {
|
|
1122
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1123
|
-
"div",
|
|
1124
|
-
{
|
|
1125
|
-
className: ui.cn("flex items-center gap-2 text-sm text-muted-foreground", !compact && "py-2"),
|
|
1126
|
-
children: [
|
|
1127
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-3.5 animate-spin" }),
|
|
1128
|
-
" ",
|
|
1129
|
-
children
|
|
1130
|
-
]
|
|
1131
|
-
}
|
|
1132
|
-
);
|
|
1133
|
-
}
|
|
1134
|
-
function SyncNote({ children, testId }) {
|
|
1135
|
-
return /* @__PURE__ */ jsxRuntime.jsx("p", { className: "py-2 text-sm text-muted-foreground", "data-testid": testId, children });
|
|
1136
|
-
}
|
|
1137
|
-
function SyncSmallNote({ children, testId }) {
|
|
1138
|
-
return /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", "data-testid": testId, children });
|
|
1139
|
-
}
|
|
1140
|
-
function SyncReconnectNotice({
|
|
1141
|
-
message,
|
|
1142
|
-
onReconnect,
|
|
1143
|
-
isPending,
|
|
1144
|
-
testId,
|
|
1145
|
-
label = "Reconnect"
|
|
1146
|
-
}) {
|
|
1147
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2 py-2", children: [
|
|
1148
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive", children: message }),
|
|
1149
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1150
|
-
ui.Button,
|
|
1151
|
-
{
|
|
1152
|
-
type: "button",
|
|
1153
|
-
size: "sm",
|
|
1154
|
-
onClick: onReconnect,
|
|
1155
|
-
disabled: isPending,
|
|
1156
|
-
"data-testid": testId,
|
|
1157
|
-
children: [
|
|
1158
|
-
isPending && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "mr-1.5 size-3.5 animate-spin" }),
|
|
1159
|
-
label
|
|
1160
|
-
]
|
|
1161
|
-
}
|
|
1162
|
-
)
|
|
1163
|
-
] });
|
|
1164
|
-
}
|
|
1165
|
-
function SyncTreeFrame({ children }) {
|
|
1166
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.ScrollArea, { className: "h-72 rounded-md border p-2", children });
|
|
1167
|
-
}
|
|
1168
|
-
function SyncCheckList({ items, selected, onToggle }) {
|
|
1169
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.ScrollArea, { className: "max-h-44 rounded-md border border-border", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1 p-2", children: items.map((c) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1170
|
-
"label",
|
|
1171
|
-
{
|
|
1172
|
-
className: "flex cursor-pointer items-center gap-2 rounded px-1.5 py-1 text-sm hover:bg-muted/50 pointer-coarse:min-h-11",
|
|
1173
|
-
children: [
|
|
1174
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1175
|
-
ui.Checkbox,
|
|
1176
|
-
{
|
|
1177
|
-
checked: selected.includes(c.id),
|
|
1178
|
-
onCheckedChange: () => onToggle(c.id),
|
|
1179
|
-
"data-testid": c.testId
|
|
1180
|
-
}
|
|
1181
|
-
),
|
|
1182
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: c.label })
|
|
1183
|
-
]
|
|
1184
|
-
},
|
|
1185
|
-
c.id
|
|
1186
|
-
)) }) });
|
|
1187
|
-
}
|
|
1188
|
-
var DEFAULT_SYNC_FOLDER_ROW_LABELS = {
|
|
1189
|
-
collapse: "Collapse folder",
|
|
1190
|
-
expand: "Expand folder",
|
|
1191
|
-
loading: "Loading\u2026",
|
|
1192
|
-
noSubfolders: "No subfolders"
|
|
1193
|
-
};
|
|
1194
|
-
var INDENT = 18;
|
|
1195
|
-
function SyncFolderRow({
|
|
1196
|
-
id,
|
|
1197
|
-
name,
|
|
1198
|
-
depth,
|
|
1199
|
-
hasChildren,
|
|
1200
|
-
isExpanded,
|
|
1201
|
-
onToggleExpanded,
|
|
1202
|
-
isSelectable,
|
|
1203
|
-
checked,
|
|
1204
|
-
disabled,
|
|
1205
|
-
onCheckedChange,
|
|
1206
|
-
count,
|
|
1207
|
-
isCountLoading,
|
|
1208
|
-
children,
|
|
1209
|
-
labels
|
|
1210
|
-
}) {
|
|
1211
|
-
const l = { ...DEFAULT_SYNC_FOLDER_ROW_LABELS, ...labels };
|
|
1212
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1213
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1214
|
-
"div",
|
|
1215
|
-
{
|
|
1216
|
-
className: "flex items-center gap-1.5 rounded px-1 py-1 text-sm hover:bg-muted/50 pointer-coarse:min-h-11",
|
|
1217
|
-
style: { paddingLeft: depth * INDENT + 4 },
|
|
1218
|
-
children: [
|
|
1219
|
-
hasChildren ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1220
|
-
"button",
|
|
1221
|
-
{
|
|
1222
|
-
type: "button",
|
|
1223
|
-
className: "flex size-4 shrink-0 items-center justify-center text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-8",
|
|
1224
|
-
onClick: onToggleExpanded,
|
|
1225
|
-
"aria-label": isExpanded ? l.collapse : l.expand,
|
|
1226
|
-
"aria-expanded": isExpanded,
|
|
1227
|
-
children: isExpanded ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "size-3.5" })
|
|
1228
|
-
}
|
|
1229
|
-
) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-4 shrink-0" }),
|
|
1230
|
-
isSelectable ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1231
|
-
"label",
|
|
1232
|
-
{
|
|
1233
|
-
className: "flex flex-1 cursor-pointer items-center gap-2 truncate",
|
|
1234
|
-
"data-testid": `drive-folder-row-${id}`,
|
|
1235
|
-
children: [
|
|
1236
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1237
|
-
ui.Checkbox,
|
|
1238
|
-
{
|
|
1239
|
-
checked,
|
|
1240
|
-
disabled,
|
|
1241
|
-
onCheckedChange,
|
|
1242
|
-
"data-testid": `drive-folder-checkbox-${id}`
|
|
1243
|
-
}
|
|
1244
|
-
),
|
|
1245
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", "data-testid": `drive-folder-name-${id}`, children: name }),
|
|
1246
|
-
isCountLoading ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-3 shrink-0 animate-spin text-muted-foreground" }) : typeof count === "number" ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "shrink-0 text-xs text-muted-foreground", children: [
|
|
1247
|
-
"(",
|
|
1248
|
-
count.toLocaleString(),
|
|
1249
|
-
")"
|
|
1250
|
-
] }) : null
|
|
1251
|
-
]
|
|
1252
|
-
}
|
|
1253
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
1254
|
-
"span",
|
|
1255
|
-
{
|
|
1256
|
-
className: "flex flex-1 items-center truncate font-medium text-muted-foreground",
|
|
1257
|
-
"data-testid": `drive-folder-row-${id}`,
|
|
1258
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", "data-testid": `drive-folder-name-${id}`, children: name })
|
|
1259
|
-
}
|
|
1260
|
-
)
|
|
1261
|
-
]
|
|
1262
|
-
}
|
|
1263
|
-
),
|
|
1264
|
-
isExpanded && /* @__PURE__ */ jsxRuntime.jsx("div", { children })
|
|
1265
|
-
] });
|
|
1266
|
-
}
|
|
1267
|
-
function SyncFolderStatus({
|
|
1268
|
-
depth,
|
|
1269
|
-
kind,
|
|
1270
|
-
labels
|
|
1271
|
-
}) {
|
|
1272
|
-
const l = { ...DEFAULT_SYNC_FOLDER_ROW_LABELS, ...labels };
|
|
1273
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1274
|
-
"div",
|
|
1275
|
-
{
|
|
1276
|
-
className: "flex items-center gap-2 py-1 text-xs text-muted-foreground",
|
|
1277
|
-
style: { paddingLeft: (depth + 1) * INDENT + 4 },
|
|
1278
|
-
children: kind === "loading" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1279
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-3 animate-spin" }),
|
|
1280
|
-
" ",
|
|
1281
|
-
l.loading
|
|
1282
|
-
] }) : l.noSubfolders
|
|
1283
|
-
}
|
|
1284
|
-
);
|
|
1285
|
-
}
|
|
1286
|
-
function FilterChip({
|
|
1287
|
-
label,
|
|
1288
|
-
state,
|
|
1289
|
-
icon,
|
|
1290
|
-
color,
|
|
1291
|
-
onDismiss,
|
|
1292
|
-
dismissLabel,
|
|
1293
|
-
className,
|
|
1294
|
-
testId
|
|
1295
|
-
}) {
|
|
1296
|
-
const isExclude = state === "exclude";
|
|
1297
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1298
|
-
"span",
|
|
1299
|
-
{
|
|
1300
|
-
className: ui.cn(
|
|
1301
|
-
"inline-flex items-center gap-1 text-xs font-medium rounded px-1.5 py-0.5 flex-shrink-0 border",
|
|
1302
|
-
isExclude ? "bg-background text-red-text border-red-text" : "bg-primary text-white border-primary",
|
|
1303
|
-
className
|
|
1304
|
-
),
|
|
1305
|
-
"data-state": state,
|
|
1306
|
-
"data-testid": testId,
|
|
1307
|
-
children: [
|
|
1308
|
-
color ? (
|
|
1309
|
-
/* Filled square for include; empty square for exclude */
|
|
1310
|
-
isExclude ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1311
|
-
"span",
|
|
1312
|
-
{
|
|
1313
|
-
className: "w-3.5 h-3.5 rounded flex-shrink-0 border-2",
|
|
1314
|
-
style: { borderColor: color }
|
|
1315
|
-
}
|
|
1316
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
1317
|
-
"span",
|
|
1318
|
-
{
|
|
1319
|
-
className: "w-3.5 h-3.5 rounded flex items-center justify-center flex-shrink-0",
|
|
1320
|
-
style: { backgroundColor: color },
|
|
1321
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "w-2.5 h-2.5 text-white", strokeWidth: 3 })
|
|
1322
|
-
}
|
|
1323
|
-
)
|
|
1324
|
-
) : icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-none", children: icon }),
|
|
1325
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "truncate max-w-[80px]", title: label, children: [
|
|
1326
|
-
isExclude && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "opacity-70 mr-0.5", children: "Not" }),
|
|
1327
|
-
label
|
|
1328
|
-
] }),
|
|
1329
|
-
onDismiss && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1330
|
-
"button",
|
|
1331
|
-
{
|
|
1332
|
-
type: "button",
|
|
1333
|
-
onClick: onDismiss,
|
|
1334
|
-
"aria-label": dismissLabel ?? `Remove ${label}`,
|
|
1335
|
-
className: "flex-none ml-0.5 opacity-70 hover:opacity-100",
|
|
1336
|
-
"data-testid": testId ? `${testId}-remove` : void 0,
|
|
1337
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-3 w-3", strokeWidth: 2.5 })
|
|
1338
|
-
}
|
|
1339
|
-
)
|
|
1340
|
-
]
|
|
1341
|
-
}
|
|
1342
|
-
);
|
|
1343
|
-
}
|
|
1344
|
-
var planBadgeVariants = classVarianceAuthority.cva(
|
|
1345
|
-
"inline-flex flex-shrink-0 items-center rounded-full border font-semibold leading-none",
|
|
1346
|
-
{
|
|
1347
|
-
variants: {
|
|
1348
|
-
/** free/dev = neutral, paid = accent tint, pending = payment trouble or cancelling. */
|
|
1349
|
-
tone: {
|
|
1350
|
-
free: `border-transparent ${chunk32HW2Q33_cjs.TONE_SURFACE.neutral}`,
|
|
1351
|
-
dev: `border-transparent ${chunk32HW2Q33_cjs.TONE_SURFACE.neutral}`,
|
|
1352
|
-
paid: "border-transparent bg-accent text-accent-foreground",
|
|
1353
|
-
pending: `${chunk32HW2Q33_cjs.TONE_BORDER.warning} ${chunk32HW2Q33_cjs.TONE_SURFACE.warning}`
|
|
1354
|
-
},
|
|
1355
|
-
/** `sm` fits dense rows and tables; `md` holds its own beside body text. */
|
|
1356
|
-
size: {
|
|
1357
|
-
sm: "h-5 px-2 text-xs",
|
|
1358
|
-
md: "h-6 px-2.5 text-sm"
|
|
1359
|
-
}
|
|
1360
|
-
},
|
|
1361
|
-
defaultVariants: { tone: "free", size: "sm" }
|
|
1362
|
-
}
|
|
1363
|
-
);
|
|
1364
|
-
function PlanBadge({
|
|
1365
|
-
label,
|
|
1366
|
-
tone,
|
|
1367
|
-
size,
|
|
1368
|
-
className,
|
|
1369
|
-
testId = "project-plan-chip"
|
|
1370
|
-
}) {
|
|
1371
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1372
|
-
"span",
|
|
1373
|
-
{
|
|
1374
|
-
"data-slot": "plan-badge",
|
|
1375
|
-
className: ui.cn(planBadgeVariants({ tone, size }), className),
|
|
1376
|
-
"data-testid": testId,
|
|
1377
|
-
children: label
|
|
1378
|
-
}
|
|
1379
|
-
);
|
|
1380
|
-
}
|
|
1381
|
-
function MoreInfo({
|
|
1382
|
-
title,
|
|
1383
|
-
children,
|
|
1384
|
-
label = "More info",
|
|
1385
|
-
testId = "more-info",
|
|
1386
|
-
className
|
|
1387
|
-
}) {
|
|
1388
|
-
const [open, setOpen] = react.useState(false);
|
|
1389
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1390
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1391
|
-
"button",
|
|
1392
|
-
{
|
|
1393
|
-
type: "button",
|
|
1394
|
-
onClick: () => setOpen(true),
|
|
1395
|
-
className: ui.cn(
|
|
1396
|
-
"inline-flex shrink-0 items-center gap-1 whitespace-nowrap rounded-sm text-xs font-medium text-muted-foreground underline-offset-2 hover:text-foreground hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11",
|
|
1397
|
-
className
|
|
1398
|
-
),
|
|
1399
|
-
"data-slot": "more-info",
|
|
1400
|
-
"data-testid": testId,
|
|
1401
|
-
children: [
|
|
1402
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Info, { className: "size-3.5", "aria-hidden": true }),
|
|
1403
|
-
label
|
|
1404
|
-
]
|
|
1405
|
-
}
|
|
1406
|
-
),
|
|
1407
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogContent, { className: "sm:max-w-md", "data-testid": `${testId}-dialog`, children: [
|
|
1408
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { children: [
|
|
1409
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: title }),
|
|
1410
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { className: "sr-only", children: title })
|
|
1411
|
-
] }),
|
|
1412
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3 text-sm leading-relaxed text-muted-foreground", children })
|
|
1413
|
-
] }) })
|
|
1414
|
-
] });
|
|
1415
|
-
}
|
|
1416
|
-
function MoreInfoList({ items }) {
|
|
1417
|
-
return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-2", "data-slot": "more-info-list", children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { children: [
|
|
1418
|
-
item.term && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-medium text-foreground", children: [
|
|
1419
|
-
item.term,
|
|
1420
|
-
". "
|
|
1421
|
-
] }),
|
|
1422
|
-
item.text
|
|
1423
|
-
] }, item.term ?? i)) });
|
|
1424
|
-
}
|
|
1425
|
-
var barColor = (pct) => pct >= 100 ? "bg-red-500" : pct >= 50 ? "bg-yellow-500" : "bg-primary";
|
|
1426
|
-
var valueColor2 = (pct) => pct >= 100 ? "text-red-text" : pct >= 80 ? "text-yellow-text" : "text-muted-foreground";
|
|
1427
|
-
function QuotaMeter({
|
|
1428
|
-
items,
|
|
1429
|
-
size = "sm",
|
|
1430
|
-
showTooltips = true,
|
|
1431
|
-
showBars = true,
|
|
1432
|
-
showPercent = true,
|
|
1433
|
-
className,
|
|
1434
|
-
testIds
|
|
1435
|
-
}) {
|
|
1436
|
-
if (size === "lg") {
|
|
1437
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1438
|
-
"div",
|
|
1439
|
-
{
|
|
1440
|
-
"data-slot": "quota-meter",
|
|
1441
|
-
className: ui.cn("flex flex-wrap gap-3", className),
|
|
1442
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.root, { testId: "quota-badges-lg" }),
|
|
1443
|
-
children: items.map(({ key, icon: Icon, label, usedOfLimit, pct }) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1444
|
-
"div",
|
|
1445
|
-
{
|
|
1446
|
-
className: "min-w-[8rem] flex-1 rounded-lg bg-muted p-3",
|
|
1447
|
-
"data-testid": chunkMHVNT4J3_cjs.prefixedTestId(testIds?.badge, key, { testId: `quota-badge-${key}` }),
|
|
1448
|
-
children: [
|
|
1449
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
1450
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-3.5 w-3.5 flex-shrink-0" }),
|
|
1451
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label })
|
|
1452
|
-
] }),
|
|
1453
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-lg font-semibold tabular-nums text-foreground", children: usedOfLimit }),
|
|
1454
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 h-1.5 overflow-hidden rounded-full bg-background", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1455
|
-
"div",
|
|
1456
|
-
{
|
|
1457
|
-
className: ui.cn("h-full rounded-full", barColor(pct)),
|
|
1458
|
-
style: { width: `${Math.min(pct, 100)}%` },
|
|
1459
|
-
"data-testid": chunkMHVNT4J3_cjs.prefixedTestId(
|
|
1460
|
-
testIds?.badge,
|
|
1461
|
-
key,
|
|
1462
|
-
{ testId: `quota-badge-${key}-fill` },
|
|
1463
|
-
"-fill"
|
|
1464
|
-
)
|
|
1465
|
-
}
|
|
1466
|
-
) })
|
|
1467
|
-
]
|
|
1468
|
-
},
|
|
1469
|
-
key
|
|
1470
|
-
))
|
|
1471
|
-
}
|
|
1472
|
-
);
|
|
1473
|
-
}
|
|
1474
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1475
|
-
"div",
|
|
1476
|
-
{
|
|
1477
|
-
"data-slot": "quota-meter",
|
|
1478
|
-
className: ui.cn("flex flex-shrink-0 items-center gap-3 text-sm tabular-nums", className),
|
|
1479
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.root, { testId: "quota-badges-sm" }),
|
|
1480
|
-
children: items.map(({ key, icon: Icon, label, used, usedOfLimit, pct }) => {
|
|
1481
|
-
const badge = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1482
|
-
"span",
|
|
1483
|
-
{
|
|
1484
|
-
className: "inline-flex items-center gap-1",
|
|
1485
|
-
"data-testid": chunkMHVNT4J3_cjs.prefixedTestId(testIds?.badge, key, { testId: `quota-badge-${key}` }),
|
|
1486
|
-
children: [
|
|
1487
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-4 w-4 flex-shrink-0 text-muted-foreground" }),
|
|
1488
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: showBars ? valueColor2(pct) : "text-muted-foreground", children: showBars && showPercent ? `${used} (${Math.round(pct)}%)` : used })
|
|
1489
|
-
]
|
|
1490
|
-
}
|
|
1491
|
-
);
|
|
1492
|
-
return showTooltips ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
|
|
1493
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: badge }),
|
|
1494
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { children: `${usedOfLimit} ${label}` })
|
|
1495
|
-
] }, key) : /* @__PURE__ */ jsxRuntime.jsx(react.Fragment, { children: badge }, key);
|
|
1496
|
-
})
|
|
1497
|
-
}
|
|
1498
|
-
);
|
|
1499
|
-
}
|
|
1500
|
-
var DEFAULT_PLAN_CARD_LABELS = {
|
|
1501
|
-
currentPlan: "Current plan",
|
|
1502
|
-
popular: "Popular",
|
|
1503
|
-
noMonthlyCost: "\xA30",
|
|
1504
|
-
perMonth: "/mo",
|
|
1505
|
-
current: "Current",
|
|
1506
|
-
monthly: "Monthly",
|
|
1507
|
-
annual: "Annual",
|
|
1508
|
-
annualBilling: "Annual billing",
|
|
1509
|
-
save: (percent) => `Save ${percent}%`,
|
|
1510
|
-
havePromoCode: "Have a promo code?",
|
|
1511
|
-
promoCode: "Promo Code",
|
|
1512
|
-
enterCode: "Enter code",
|
|
1513
|
-
pricingExplainer: "How pricing works",
|
|
1514
|
-
explainerTiers: [
|
|
1515
|
-
"AI usage and storage are shared by everyone in the project. AI usage resets monthly.",
|
|
1516
|
-
"Need more? Add \xA325 of AI usage or 25 GB at a time, at checkout or later. Add-ons renew with the plan until you reduce them.",
|
|
1517
|
-
"Automatic top-ups add one more step when you run low, up to your monthly usage cap (\xA3100 by default; \xA30 = none; or no limit). Adding by hand is never capped.",
|
|
1518
|
-
"Add-ons start now: AI usage is charged in full, storage only for the rest of the period. Downgrades, billing switches and reductions start at the end of the period. No refunds.",
|
|
1519
|
-
"Annual plans are 25% off, add-ons included.",
|
|
1520
|
-
"Prices are shown + VAT; the total for your country is shown before you pay."
|
|
1521
|
-
],
|
|
1522
|
-
explainerAiUsage: "About 1p of AI usage buys one moderately complex request, or reading ~25 documents, on a Standard model. Premium models can cost 10\u2013100\xD7 more.",
|
|
1523
|
-
seeModelList: "AI model prices \u2192"
|
|
1524
|
-
};
|
|
1525
|
-
function PlanCard({ plan, onSelect, labels }) {
|
|
1526
|
-
const l = react.useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels]);
|
|
1527
|
-
const { id, name, isFree, isCurrent, isSelected, isPopular, price, features } = plan;
|
|
1528
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1529
|
-
"button",
|
|
1530
|
-
{
|
|
1531
|
-
type: "button",
|
|
1532
|
-
disabled: isCurrent,
|
|
1533
|
-
"aria-pressed": !!isSelected,
|
|
1534
|
-
onClick: () => !isCurrent && onSelect(id),
|
|
1535
|
-
"data-slot": "plan-card",
|
|
1536
|
-
"data-testid": `tier-card-${id}`,
|
|
1537
|
-
className: ui.cn(
|
|
1538
|
-
"relative flex flex-col justify-start rounded-lg p-4 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
1539
|
-
isCurrent ? "cursor-default bg-blue-bg" : isSelected ? "bg-accent ring-1 ring-primary/50" : "bg-muted hover:bg-muted/70"
|
|
1540
|
-
),
|
|
1541
|
-
children: [
|
|
1542
|
-
isCurrent && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-3 left-1/2 -translate-x-1/2 whitespace-nowrap rounded-full bg-blue-bg px-3 py-1 text-xs font-semibold leading-none text-blue-text", children: l.currentPlan }),
|
|
1543
|
-
isPopular && !isCurrent && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-3 left-1/2 -translate-x-1/2 whitespace-nowrap rounded-full bg-primary px-3 py-1 text-xs font-semibold leading-none text-primary-foreground", children: l.popular }),
|
|
1544
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-baseline gap-2", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1545
|
-
"span",
|
|
1546
|
-
{
|
|
1547
|
-
className: ui.cn(
|
|
1548
|
-
"text-lg font-semibold leading-none tracking-tight",
|
|
1549
|
-
isCurrent ? "text-blue-text" : "text-foreground"
|
|
1550
|
-
),
|
|
1551
|
-
children: name
|
|
1552
|
-
}
|
|
1553
|
-
) }),
|
|
1554
|
-
isFree ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-2xl font-semibold leading-none tabular-nums text-foreground", children: [
|
|
1555
|
-
l.noMonthlyCost,
|
|
1556
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-0.5 text-sm font-medium text-muted-foreground", children: l.perMonth })
|
|
1557
|
-
] }) : price && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
1558
|
-
price.annual && price.yearlyTotal && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-baseline gap-x-2 whitespace-nowrap text-base tabular-nums", children: [
|
|
1559
|
-
price.yearlyStrike && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-muted-foreground line-through decoration-muted-foreground/70 decoration-1", children: price.yearlyStrike }),
|
|
1560
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-lg font-semibold text-foreground", children: [
|
|
1561
|
-
price.yearlyTotal,
|
|
1562
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-0.5 text-xs font-semibold text-muted-foreground", children: price.intervalLabel })
|
|
1563
|
-
] })
|
|
1564
|
-
] }),
|
|
1565
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-baseline gap-x-1.5 whitespace-nowrap", children: [
|
|
1566
|
-
price.annual && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl font-semibold leading-none text-muted-foreground", children: "=" }),
|
|
1567
|
-
price.monthlyStrike && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-base font-medium tabular-nums text-muted-foreground line-through decoration-muted-foreground/70 decoration-1", children: price.monthlyStrike }),
|
|
1568
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-2xl font-semibold leading-none tabular-nums text-foreground", children: [
|
|
1569
|
-
price.monthly,
|
|
1570
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-0.5 text-sm font-medium text-muted-foreground", children: [
|
|
1571
|
-
l.perMonth,
|
|
1572
|
-
price.taxLabel && ` ${price.taxLabel}`
|
|
1573
|
-
] })
|
|
1574
|
-
] })
|
|
1575
|
-
] }),
|
|
1576
|
-
price.note && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-muted-foreground", "data-slot": "plan-card-price-note", children: price.note })
|
|
1577
|
-
] }),
|
|
1578
|
-
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-4 space-y-1 border-t border-border pt-4 text-sm text-foreground", children: features.map((feature) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: feature }, feature)) })
|
|
1579
|
-
]
|
|
1580
|
-
}
|
|
1581
|
-
);
|
|
1582
|
-
}
|
|
1583
|
-
function PlanCardGrid({
|
|
1584
|
-
plans,
|
|
1585
|
-
onSelect,
|
|
1586
|
-
labels
|
|
1587
|
-
}) {
|
|
1588
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "@container space-y-2", "data-slot": "plan-card-grid", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1589
|
-
"div",
|
|
1590
|
-
{
|
|
1591
|
-
className: ui.cn(
|
|
1592
|
-
"grid gap-2",
|
|
1593
|
-
plans.length === 4 ? "grid-cols-1 @xl:grid-cols-2 @4xl:grid-cols-4" : plans.length === 2 ? "grid-cols-1 @xl:grid-cols-2" : "grid-cols-1 @2xl:grid-cols-3"
|
|
1594
|
-
),
|
|
1595
|
-
children: plans.map((plan) => /* @__PURE__ */ jsxRuntime.jsx(PlanCard, { plan, onSelect, labels }, plan.id))
|
|
1596
|
-
}
|
|
1597
|
-
) });
|
|
1598
|
-
}
|
|
1599
|
-
function PlanTierOption({
|
|
1600
|
-
option,
|
|
1601
|
-
onSelect,
|
|
1602
|
-
labels
|
|
1603
|
-
}) {
|
|
1604
|
-
const l = react.useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels]);
|
|
1605
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1606
|
-
"button",
|
|
1607
|
-
{
|
|
1608
|
-
type: "button",
|
|
1609
|
-
onClick: () => onSelect(option.id),
|
|
1610
|
-
"aria-pressed": option.isSelected,
|
|
1611
|
-
"data-slot": "plan-tier-option",
|
|
1612
|
-
"data-testid": `tier-option-${option.id}`,
|
|
1613
|
-
className: ui.cn(
|
|
1614
|
-
"flex w-full items-center justify-between rounded-lg p-3 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11",
|
|
1615
|
-
option.isSelected ? "bg-accent ring-1 ring-primary/50" : "bg-muted hover:bg-muted/70"
|
|
1616
|
-
),
|
|
1617
|
-
children: [
|
|
1618
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1619
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-base font-semibold text-foreground", children: option.name }),
|
|
1620
|
-
option.isCurrent && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rounded-full bg-background px-1.5 py-0.5 text-xs font-medium text-muted-foreground", children: l.current }),
|
|
1621
|
-
option.isSelected && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-4 w-4 text-primary" })
|
|
1622
|
-
] }),
|
|
1623
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-right", children: [
|
|
1624
|
-
option.total && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "font-semibold tabular-nums", children: [
|
|
1625
|
-
option.total,
|
|
1626
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-normal text-muted-foreground", children: option.intervalLabel })
|
|
1627
|
-
] }),
|
|
1628
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs tabular-nums text-muted-foreground", children: option.summary })
|
|
1629
|
-
] })
|
|
1630
|
-
]
|
|
1631
|
-
}
|
|
1632
|
-
);
|
|
1633
|
-
}
|
|
1634
|
-
function PricingToggle({
|
|
1635
|
-
isAnnual,
|
|
1636
|
-
onToggle,
|
|
1637
|
-
savingsPercent,
|
|
1638
|
-
labels
|
|
1639
|
-
}) {
|
|
1640
|
-
const l = react.useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels]);
|
|
1641
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
|
|
1642
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: isAnnual ? "text-muted-foreground" : "font-medium", children: l.monthly }),
|
|
1643
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1644
|
-
"button",
|
|
1645
|
-
{
|
|
1646
|
-
type: "button",
|
|
1647
|
-
role: "switch",
|
|
1648
|
-
"aria-checked": isAnnual,
|
|
1649
|
-
"aria-label": l.annualBilling,
|
|
1650
|
-
onClick: onToggle,
|
|
1651
|
-
className: ui.cn(
|
|
1652
|
-
"relative inline-flex h-5 w-9 items-center rounded-full transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
1653
|
-
isAnnual ? "bg-primary" : "bg-muted"
|
|
1654
|
-
),
|
|
1655
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1656
|
-
"span",
|
|
1657
|
-
{
|
|
1658
|
-
className: ui.cn(
|
|
1659
|
-
"inline-block h-3 w-3 transform rounded-full bg-card transition-transform",
|
|
1660
|
-
isAnnual ? "translate-x-5" : "translate-x-1"
|
|
1661
|
-
)
|
|
1662
|
-
}
|
|
1663
|
-
)
|
|
1664
|
-
}
|
|
1665
|
-
),
|
|
1666
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: isAnnual ? "font-medium" : "text-muted-foreground", children: l.annual }),
|
|
1667
|
-
savingsPercent != null && savingsPercent > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rounded-full bg-green-bg px-1.5 py-0.5 text-sm font-semibold leading-none text-green-text", children: l.save(savingsPercent) })
|
|
1668
|
-
] });
|
|
1669
|
-
}
|
|
1670
|
-
function PromoCodeInput({
|
|
1671
|
-
value,
|
|
1672
|
-
onChange,
|
|
1673
|
-
labels
|
|
1674
|
-
}) {
|
|
1675
|
-
const l = react.useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels]);
|
|
1676
|
-
const [expanded, setExpanded] = react.useState(false);
|
|
1677
|
-
if (!expanded) {
|
|
1678
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1679
|
-
"button",
|
|
1680
|
-
{
|
|
1681
|
-
type: "button",
|
|
1682
|
-
onClick: () => setExpanded(true),
|
|
1683
|
-
className: "flex items-center gap-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground pointer-coarse:min-h-11",
|
|
1684
|
-
children: [
|
|
1685
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Tag, { className: "h-3 w-3" }),
|
|
1686
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: l.havePromoCode })
|
|
1687
|
-
]
|
|
1688
|
-
}
|
|
1689
|
-
);
|
|
1690
|
-
}
|
|
1691
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
1692
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-sm text-muted-foreground", children: l.promoCode }),
|
|
1693
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1694
|
-
ui.Input,
|
|
1695
|
-
{
|
|
1696
|
-
value,
|
|
1697
|
-
onChange: (e) => onChange(e.target.value),
|
|
1698
|
-
placeholder: l.enterCode,
|
|
1699
|
-
className: "h-8 text-sm",
|
|
1700
|
-
autoFocus: true
|
|
1701
|
-
}
|
|
1702
|
-
)
|
|
1703
|
-
] });
|
|
1704
|
-
}
|
|
1705
|
-
function PlanInfoPopover({
|
|
1706
|
-
onOpenModelList,
|
|
1707
|
-
labels
|
|
1708
|
-
}) {
|
|
1709
|
-
const l = react.useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels]);
|
|
1710
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(MoreInfo, { title: l.pricingExplainer, label: l.pricingExplainer, testId: "pricing-explainer", children: [
|
|
1711
|
-
/* @__PURE__ */ jsxRuntime.jsx(MoreInfoList, { items: l.explainerTiers.map((text) => ({ text })) }),
|
|
1712
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
1713
|
-
l.explainerAiUsage,
|
|
1714
|
-
" ",
|
|
1715
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1716
|
-
"button",
|
|
1717
|
-
{
|
|
1718
|
-
type: "button",
|
|
1719
|
-
onClick: onOpenModelList,
|
|
1720
|
-
className: "font-medium text-foreground underline underline-offset-2 hover:text-primary/80",
|
|
1721
|
-
children: l.seeModelList
|
|
1722
|
-
}
|
|
1723
|
-
)
|
|
1724
|
-
] })
|
|
1725
|
-
] });
|
|
1726
|
-
}
|
|
1727
|
-
var DEFAULT_REFERRAL_REWARD_LABELS = {
|
|
1728
|
-
badgeTitle: "Reward \u2014 automatically applied to your invoice period",
|
|
1729
|
-
badge: (amount) => `${amount} reward`,
|
|
1730
|
-
subtotal: "Subtotal",
|
|
1731
|
-
reward: "Reward",
|
|
1732
|
-
youPayNow: "You pay now",
|
|
1733
|
-
rollover: (amount) => `${amount} reward rolls over to your next invoice.`,
|
|
1734
|
-
applied: (amount) => `${amount} reward applied automatically to your invoice period.`,
|
|
1735
|
-
note: (amount) => `Your ${amount} reward applies to your invoice period.`
|
|
1736
|
-
};
|
|
1737
|
-
function ReferralRewardBadge({
|
|
1738
|
-
amountLabel,
|
|
1739
|
-
labels,
|
|
1740
|
-
testId
|
|
1741
|
-
}) {
|
|
1742
|
-
const l = react.useMemo(() => ({ ...DEFAULT_REFERRAL_REWARD_LABELS, ...labels }), [labels]);
|
|
1743
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1744
|
-
"span",
|
|
1745
|
-
{
|
|
1746
|
-
className: "flex h-8 items-center gap-1.5 rounded-full bg-green-bg px-2.5 text-sm font-medium text-green-text",
|
|
1747
|
-
title: l.badgeTitle,
|
|
1748
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "referral-reward-badge" }),
|
|
1749
|
-
children: [
|
|
1750
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Gift, { className: "h-3.5 w-3.5" }),
|
|
1751
|
-
l.badge(amountLabel)
|
|
1752
|
-
]
|
|
1753
|
-
}
|
|
1754
|
-
);
|
|
1755
|
-
}
|
|
1756
|
-
function ReferralRewardSummary({
|
|
1757
|
-
amountLabel,
|
|
1758
|
-
breakdown,
|
|
1759
|
-
labels,
|
|
1760
|
-
testId,
|
|
1761
|
-
testIds
|
|
1762
|
-
}) {
|
|
1763
|
-
const l = react.useMemo(() => ({ ...DEFAULT_REFERRAL_REWARD_LABELS, ...labels }), [labels]);
|
|
1764
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1765
|
-
"div",
|
|
1766
|
-
{
|
|
1767
|
-
className: "rounded-lg bg-green-bg/60 p-3 text-sm",
|
|
1768
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "referral-reward-summary" }),
|
|
1769
|
-
children: breakdown ? /* @__PURE__ */ jsxRuntime.jsxs("dl", { className: "space-y-1 tabular-nums", children: [
|
|
1770
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between text-muted-foreground", children: [
|
|
1771
|
-
/* @__PURE__ */ jsxRuntime.jsx("dt", { children: l.subtotal }),
|
|
1772
|
-
/* @__PURE__ */ jsxRuntime.jsx("dd", { children: breakdown.subtotal })
|
|
1773
|
-
] }),
|
|
1774
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between text-green-text", children: [
|
|
1775
|
-
/* @__PURE__ */ jsxRuntime.jsxs("dt", { className: "flex items-center gap-1.5", children: [
|
|
1776
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Gift, { className: "h-3.5 w-3.5" }),
|
|
1777
|
-
l.reward
|
|
1778
|
-
] }),
|
|
1779
|
-
/* @__PURE__ */ jsxRuntime.jsxs("dd", { "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.applied, { testId: "referral-reward-applied" }), children: [
|
|
1780
|
-
"\u2212",
|
|
1781
|
-
breakdown.reward
|
|
1782
|
-
] })
|
|
1783
|
-
] }),
|
|
1784
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between border-t border-green-border pt-1 font-semibold text-foreground", children: [
|
|
1785
|
-
/* @__PURE__ */ jsxRuntime.jsx("dt", { children: l.youPayNow }),
|
|
1786
|
-
/* @__PURE__ */ jsxRuntime.jsx("dd", { "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.youPay, { testId: "referral-reward-you-pay" }), children: breakdown.youPay })
|
|
1787
|
-
] }),
|
|
1788
|
-
breakdown.rollover && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "pt-0.5 text-xs font-normal text-muted-foreground", children: l.rollover(breakdown.rollover) })
|
|
1789
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "flex items-center gap-1.5 font-medium text-green-text", children: [
|
|
1790
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Gift, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
1791
|
-
l.applied(amountLabel)
|
|
1792
|
-
] })
|
|
1793
|
-
}
|
|
1794
|
-
);
|
|
1795
|
-
}
|
|
1796
|
-
function ReferralRewardNote({
|
|
1797
|
-
amountLabel,
|
|
1798
|
-
labels,
|
|
1799
|
-
testId
|
|
1800
|
-
}) {
|
|
1801
|
-
const l = react.useMemo(() => ({ ...DEFAULT_REFERRAL_REWARD_LABELS, ...labels }), [labels]);
|
|
1802
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1803
|
-
"p",
|
|
1804
|
-
{
|
|
1805
|
-
className: "flex items-center gap-1.5 text-sm text-green-text",
|
|
1806
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "referral-reward-note" }),
|
|
1807
|
-
children: [
|
|
1808
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Gift, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
1809
|
-
l.note(amountLabel)
|
|
1810
|
-
]
|
|
1811
|
-
}
|
|
1812
|
-
);
|
|
1813
|
-
}
|
|
1814
|
-
var DEFAULT_CONNECTION_CARD_LABELS = {
|
|
1815
|
-
connectedAs: (identity) => `Connected as ${identity}`,
|
|
1816
|
-
justConnected: "Just connected \u2713",
|
|
1817
|
-
connected: "Connected",
|
|
1818
|
-
disconnect: "Disconnect",
|
|
1819
|
-
connect: "Connect",
|
|
1820
|
-
organisationAccount: "Organisation account",
|
|
1821
|
-
readOnlyLead: "Read-only.",
|
|
1822
|
-
readOnlyBody: " ARBI only imports a copy of your email and files. It can\u2019t modify or delete anything in your account, and deleting an imported document here never affects the original."
|
|
1823
|
-
};
|
|
1824
|
-
function ConnectionCard({
|
|
1825
|
-
connection,
|
|
1826
|
-
onConnect,
|
|
1827
|
-
onDisconnect,
|
|
1828
|
-
labels
|
|
1829
|
-
}) {
|
|
1830
|
-
const l = react.useMemo(() => ({ ...DEFAULT_CONNECTION_CARD_LABELS, ...labels }), [labels]);
|
|
1831
|
-
const { id, status } = connection;
|
|
1832
|
-
const isConnected = status === "connected";
|
|
1833
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1834
|
-
"div",
|
|
1835
|
-
{
|
|
1836
|
-
"data-slot": "connection-card",
|
|
1837
|
-
className: "rounded-lg bg-background px-5 py-4",
|
|
1838
|
-
"data-testid": `connector-card-${id}`,
|
|
1839
|
-
children: [
|
|
1840
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-4", children: [
|
|
1841
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground", children: connection.iconUrl ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1842
|
-
"img",
|
|
1843
|
-
{
|
|
1844
|
-
src: connection.iconUrl,
|
|
1845
|
-
alt: connection.iconAlt ?? connection.title,
|
|
1846
|
-
className: "h-6 w-6 rounded object-contain"
|
|
1847
|
-
}
|
|
1848
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlugIcon, { className: "h-5 w-5" }) }),
|
|
1849
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
1850
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-heading text-sm font-semibold text-foreground", children: connection.title }),
|
|
1851
|
-
connection.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-0.5 text-sm text-muted-foreground", children: connection.description }),
|
|
1852
|
-
isConnected && connection.identity && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1853
|
-
"p",
|
|
1854
|
-
{
|
|
1855
|
-
className: "mt-1 text-xs text-muted-foreground",
|
|
1856
|
-
"data-testid": `connector-identity-${id}`,
|
|
1857
|
-
children: l.connectedAs(connection.identity)
|
|
1858
|
-
}
|
|
1859
|
-
),
|
|
1860
|
-
connection.warning && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-yellow-text", children: connection.warning }),
|
|
1861
|
-
connection.note && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: connection.note })
|
|
1862
|
-
] }),
|
|
1863
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 flex-col items-end gap-2", children: [
|
|
1864
|
-
(isConnected || connection.justConnected) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1865
|
-
chunkDVUZTGVL_cjs.ToneBadge,
|
|
1866
|
-
{
|
|
1867
|
-
tone: "success",
|
|
1868
|
-
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckCircle2, { className: "h-3 w-3", "aria-hidden": "true" }),
|
|
1869
|
-
children: connection.justConnected ? l.justConnected : l.connected
|
|
1870
|
-
}
|
|
1871
|
-
),
|
|
1872
|
-
isConnected ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1873
|
-
ui.Button,
|
|
1874
|
-
{
|
|
1875
|
-
variant: "outline",
|
|
1876
|
-
size: "sm",
|
|
1877
|
-
onClick: () => onDisconnect(id),
|
|
1878
|
-
disabled: connection.isDisconnecting,
|
|
1879
|
-
className: "text-destructive hover:bg-destructive/10 hover:text-destructive",
|
|
1880
|
-
"data-testid": `connector-disconnect-${id}`,
|
|
1881
|
-
children: [
|
|
1882
|
-
connection.isDisconnecting && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "mr-1.5 h-3.5 w-3.5 animate-spin" }),
|
|
1883
|
-
l.disconnect
|
|
1884
|
-
]
|
|
1885
|
-
}
|
|
1886
|
-
) : status === "available" ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1887
|
-
ui.Button,
|
|
1888
|
-
{
|
|
1889
|
-
variant: "outline",
|
|
1890
|
-
size: "sm",
|
|
1891
|
-
onClick: () => onConnect(id),
|
|
1892
|
-
className: "gap-1.5",
|
|
1893
|
-
"data-testid": `connector-connect-${id}`,
|
|
1894
|
-
children: [
|
|
1895
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ExternalLink, { className: "h-3.5 w-3.5" }),
|
|
1896
|
-
l.connect
|
|
1897
|
-
]
|
|
1898
|
-
}
|
|
1899
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { variant: "outline", className: "text-muted-foreground", children: l.organisationAccount })
|
|
1900
|
-
] })
|
|
1901
|
-
] }),
|
|
1902
|
-
connection.showReadOnlyNotice && isConnected && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex items-start gap-2 rounded-md bg-blue-bg px-3 py-2 text-xs text-blue-text", children: [
|
|
1903
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ShieldCheck, { className: "mt-0.5 h-4 w-4 shrink-0" }),
|
|
1904
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
1905
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: l.readOnlyLead }),
|
|
1906
|
-
l.readOnlyBody
|
|
1907
|
-
] })
|
|
1908
|
-
] })
|
|
1909
|
-
]
|
|
1910
|
-
}
|
|
1911
|
-
);
|
|
1912
|
-
}
|
|
1913
|
-
function ConnectionsEmpty({ message }) {
|
|
1914
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-2 py-8 text-center", children: [
|
|
1915
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plug, { className: "h-8 w-8 text-muted-foreground/40" }),
|
|
1916
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: message })
|
|
1917
|
-
] });
|
|
1918
|
-
}
|
|
1919
|
-
function ConnectionsLoading({ message }) {
|
|
1920
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 py-12 text-muted-foreground", children: [
|
|
1921
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
1922
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: message })
|
|
1923
|
-
] });
|
|
1924
|
-
}
|
|
1925
|
-
function ConnectionsError({ message }) {
|
|
1926
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 rounded-lg bg-destructive/10 px-4 py-3 text-sm text-destructive", children: [
|
|
1927
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircle, { className: "h-4 w-4 shrink-0" }),
|
|
1928
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: message })
|
|
1929
|
-
] });
|
|
1930
|
-
}
|
|
1931
|
-
var DEFAULT_PROJECT_LIST_LABELS = {
|
|
1932
|
-
loading: "Loading projects...",
|
|
1933
|
-
empty: "No projects yet. Create one to get started.",
|
|
1934
|
-
filteredOut: "No projects match the filter."
|
|
1935
|
-
};
|
|
1936
|
-
var DEFAULT_SHARED_PROJECTS_SECTION_LABELS = {
|
|
1937
|
-
title: "Shared with you"
|
|
1938
|
-
};
|
|
1939
|
-
var DEFAULT_PROJECT_DETAIL_HEADER_LABELS = {
|
|
1940
|
-
renameProject: "Rename project"
|
|
1941
|
-
};
|
|
1942
|
-
var DEFAULT_RENAME_DIALOG_LABELS = {
|
|
1943
|
-
title: "Rename project",
|
|
1944
|
-
description: "Enter a new name.",
|
|
1945
|
-
cancel: "Cancel",
|
|
1946
|
-
save: "Save"
|
|
1947
|
-
};
|
|
1948
|
-
function ProjectRow({ testId, onOpen, identity, summary, usage, actions }) {
|
|
1949
|
-
const handleKeyDown = (e) => {
|
|
1950
|
-
if (e.key === "Enter" || e.key === " ") {
|
|
1951
|
-
e.preventDefault();
|
|
1952
|
-
onOpen();
|
|
1953
|
-
}
|
|
1954
|
-
};
|
|
1955
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1956
|
-
"div",
|
|
1957
|
-
{
|
|
1958
|
-
role: "button",
|
|
1959
|
-
tabIndex: 0,
|
|
1960
|
-
onClick: onOpen,
|
|
1961
|
-
onKeyDown: handleKeyDown,
|
|
1962
|
-
"data-slot": "project-row",
|
|
1963
|
-
"data-testid": testId,
|
|
1964
|
-
className: "group flex cursor-pointer flex-wrap items-center gap-x-3 gap-y-3 px-3 py-3 transition-colors hover:bg-muted/50 focus:bg-muted/50 focus:outline-none pointer-coarse:min-h-11",
|
|
1965
|
-
children: [
|
|
1966
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 items-center", children: identity }),
|
|
1967
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
|
|
1968
|
-
summary && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "hidden items-center gap-3 md:flex", children: summary }),
|
|
1969
|
-
actions && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-0.5", onClick: (e) => e.stopPropagation(), children: actions }),
|
|
1970
|
-
usage && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "basis-full", children: usage })
|
|
1971
|
-
]
|
|
1972
|
-
}
|
|
1973
|
-
);
|
|
1974
|
-
}
|
|
1975
|
-
function ProjectList({
|
|
1976
|
-
isLoading,
|
|
1977
|
-
isEmpty,
|
|
1978
|
-
isFilteredOut,
|
|
1979
|
-
children,
|
|
1980
|
-
testId = "projects-list",
|
|
1981
|
-
labels
|
|
1982
|
-
}) {
|
|
1983
|
-
const l = react.useMemo(() => ({ ...DEFAULT_PROJECT_LIST_LABELS, ...labels }), [labels]);
|
|
1984
|
-
const message = isLoading ? l.loading : isEmpty ? l.empty : isFilteredOut ? l.filteredOut : null;
|
|
1985
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": testId, children: isLoading ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3 px-3 py-4", "aria-busy": "true", children: [
|
|
1986
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: message }),
|
|
1987
|
-
[0, 1].map((i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", "aria-hidden": "true", children: [
|
|
1988
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-5 w-40 animate-pulse rounded-md bg-muted" }),
|
|
1989
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
|
|
1990
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-5 w-48 animate-pulse rounded-md bg-muted" })
|
|
1991
|
-
] }, i))
|
|
1992
|
-
] }) : message ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-3 py-6 text-sm text-muted-foreground", children: message }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "divide-y divide-border", children }) });
|
|
1993
|
-
}
|
|
1994
|
-
function SharedProjectsSection({
|
|
1995
|
-
title,
|
|
1996
|
-
footnote,
|
|
1997
|
-
children,
|
|
1998
|
-
testId = "shared-projects",
|
|
1999
|
-
labels
|
|
2000
|
-
}) {
|
|
2001
|
-
const l = react.useMemo(() => ({ ...DEFAULT_SHARED_PROJECTS_SECTION_LABELS, ...labels }), [labels]);
|
|
2002
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "space-y-2", "data-testid": testId, children: [
|
|
2003
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "px-1 text-sm font-semibold text-foreground", children: title ?? l.title }),
|
|
2004
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "divide-y divide-border", children }),
|
|
2005
|
-
footnote && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-1 text-xs text-muted-foreground", children: footnote })
|
|
2006
|
-
] });
|
|
2007
|
-
}
|
|
2008
|
-
function SharedProjectRow({
|
|
2009
|
-
testId,
|
|
2010
|
-
identity,
|
|
2011
|
-
allowance
|
|
2012
|
-
}) {
|
|
2013
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4 px-3 py-2.5", "data-testid": testId, children: [
|
|
2014
|
-
identity,
|
|
2015
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto w-44", children: allowance })
|
|
2016
|
-
] });
|
|
2017
|
-
}
|
|
2018
|
-
function ProjectDetailHeader({
|
|
2019
|
-
icon,
|
|
2020
|
-
name,
|
|
2021
|
-
badge,
|
|
2022
|
-
onRename,
|
|
2023
|
-
action,
|
|
2024
|
-
labels
|
|
2025
|
-
}) {
|
|
2026
|
-
const l = react.useMemo(() => ({ ...DEFAULT_PROJECT_DETAIL_HEADER_LABELS, ...labels }), [labels]);
|
|
2027
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
|
|
2028
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-3", children: [
|
|
2029
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 text-primary [&>svg]:h-8 [&>svg]:w-8", children: icon }),
|
|
2030
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group flex items-center gap-2", children: [
|
|
2031
|
-
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "truncate text-xl font-semibold text-foreground", title: name, children: name }),
|
|
2032
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2033
|
-
ui.Button,
|
|
2034
|
-
{
|
|
2035
|
-
variant: "ghost",
|
|
2036
|
-
size: "icon",
|
|
2037
|
-
className: "h-6 w-6 shrink-0 text-muted-foreground opacity-0 transition-opacity hover:text-primary focus-visible:opacity-100 [.group:hover_&]:opacity-100 [@media(hover:none)]:opacity-100",
|
|
2038
|
-
title: l.renameProject,
|
|
2039
|
-
"aria-label": l.renameProject,
|
|
2040
|
-
"data-testid": "project-detail-rename",
|
|
2041
|
-
onClick: onRename,
|
|
2042
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pencil, { className: "h-3.5 w-3.5" })
|
|
2043
|
-
}
|
|
2044
|
-
),
|
|
2045
|
-
badge
|
|
2046
|
-
] }) })
|
|
2047
|
-
] }),
|
|
2048
|
-
action && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-shrink-0", children: action })
|
|
2049
|
-
] });
|
|
2050
|
-
}
|
|
2051
|
-
function ProjectDetailSection({
|
|
2052
|
-
title,
|
|
2053
|
-
className,
|
|
2054
|
-
children
|
|
2055
|
-
}) {
|
|
2056
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: ui.cn("rounded-lg border border-border bg-card shadow-xs p-5", className), children: [
|
|
2057
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mb-4 text-base font-semibold text-foreground", children: title }),
|
|
2058
|
-
children
|
|
2059
|
-
] });
|
|
2060
|
-
}
|
|
2061
|
-
function RenameDialog({
|
|
2062
|
-
open,
|
|
2063
|
-
onClose,
|
|
2064
|
-
title,
|
|
2065
|
-
value,
|
|
2066
|
-
onChange,
|
|
2067
|
-
onSave,
|
|
2068
|
-
isSaving,
|
|
2069
|
-
testId,
|
|
2070
|
-
dialogTestId,
|
|
2071
|
-
fieldLabel,
|
|
2072
|
-
placeholder,
|
|
2073
|
-
canSave = true,
|
|
2074
|
-
labels
|
|
2075
|
-
}) {
|
|
2076
|
-
const renameInputId = react.useId();
|
|
2077
|
-
const l = react.useMemo(() => ({ ...DEFAULT_RENAME_DIALOG_LABELS, ...labels }), [labels]);
|
|
2078
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange: (next) => !next && onClose(), children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogContent, { presentation: "sheet", "data-testid": dialogTestId, children: [
|
|
2079
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { children: [
|
|
2080
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: title ?? l.title }),
|
|
2081
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { className: "sr-only", children: l.description })
|
|
2082
|
-
] }),
|
|
2083
|
-
fieldLabel && /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: renameInputId, className: "block text-sm font-medium", children: fieldLabel }),
|
|
2084
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2085
|
-
ui.Input,
|
|
2086
|
-
{
|
|
2087
|
-
id: renameInputId,
|
|
2088
|
-
value,
|
|
2089
|
-
onChange: (e) => onChange(e.target.value),
|
|
2090
|
-
placeholder,
|
|
2091
|
-
autoFocus: true,
|
|
2092
|
-
onKeyDown: (e) => {
|
|
2093
|
-
if (e.key === "Enter") onSave();
|
|
2094
|
-
if (e.key === "Escape") onClose();
|
|
2095
|
-
},
|
|
2096
|
-
"data-testid": testId
|
|
2097
|
-
}
|
|
2098
|
-
),
|
|
2099
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DialogFooter, { children: [
|
|
2100
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "outline", onClick: onClose, children: l.cancel }),
|
|
2101
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { onClick: onSave, disabled: isSaving || !canSave, children: l.save })
|
|
2102
|
-
] })
|
|
2103
|
-
] }) });
|
|
2104
|
-
}
|
|
2105
|
-
var DEFAULT_SUPPORT_PANEL_LABELS = {
|
|
2106
|
-
support: "Support",
|
|
2107
|
-
userGuide: "User Guide"
|
|
2108
|
-
};
|
|
2109
|
-
function SupportPanel({
|
|
2110
|
-
activeTab,
|
|
2111
|
-
onTabChange,
|
|
2112
|
-
buildInfo = [],
|
|
2113
|
-
modeSwitcher,
|
|
2114
|
-
feedback,
|
|
2115
|
-
isFeedbackLoading,
|
|
2116
|
-
loadingIndicator,
|
|
2117
|
-
guide,
|
|
2118
|
-
testId = "feedback-modal",
|
|
2119
|
-
labels
|
|
2120
|
-
}) {
|
|
2121
|
-
const l = react.useMemo(() => ({ ...DEFAULT_SUPPORT_PANEL_LABELS, ...labels }), [labels]);
|
|
2122
|
-
const tabs = react.useMemo(
|
|
2123
|
-
() => [
|
|
2124
|
-
{
|
|
2125
|
-
id: "feedback",
|
|
2126
|
-
label: l.support,
|
|
2127
|
-
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageCircleQuestionMark, { className: "h-4 w-4" }),
|
|
2128
|
-
tooltip: l.support
|
|
2129
|
-
},
|
|
2130
|
-
{
|
|
2131
|
-
id: "guide",
|
|
2132
|
-
label: l.userGuide,
|
|
2133
|
-
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BookOpen, { className: "h-4 w-4" }),
|
|
2134
|
-
tooltip: l.userGuide
|
|
2135
|
-
}
|
|
2136
|
-
],
|
|
2137
|
-
[l]
|
|
2138
|
-
);
|
|
2139
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2140
|
-
"div",
|
|
2141
|
-
{
|
|
2142
|
-
className: "@container flex h-full flex-col bg-background",
|
|
2143
|
-
"data-testid": testId,
|
|
2144
|
-
"data-slot": "support-panel",
|
|
2145
|
-
children: [
|
|
2146
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2147
|
-
chunk7RGLTF76_cjs.TabHeader,
|
|
2148
|
-
{
|
|
2149
|
-
tabs,
|
|
2150
|
-
activeTabId: activeTab,
|
|
2151
|
-
onTabChange: (id) => onTabChange(id),
|
|
2152
|
-
rightContent: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
2153
|
-
buildInfo.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "hidden text-right font-mono text-xs leading-tight text-muted-foreground/70 @2xl:block", children: buildInfo.map((line) => /* @__PURE__ */ jsxRuntime.jsx("div", { children: line }, line)) }),
|
|
2154
|
-
modeSwitcher
|
|
2155
|
-
] }),
|
|
2156
|
-
compactBreakpoint: 360
|
|
2157
|
-
}
|
|
2158
|
-
) }),
|
|
2159
|
-
activeTab === "feedback" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative min-h-0 flex-1", children: [
|
|
2160
|
-
isFeedbackLoading && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 z-10 flex items-center justify-center bg-background", children: loadingIndicator }),
|
|
2161
|
-
feedback
|
|
2162
|
-
] }),
|
|
2163
|
-
activeTab === "guide" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-auto p-4", children: guide })
|
|
2164
|
-
]
|
|
2165
|
-
}
|
|
2166
|
-
);
|
|
2167
|
-
}
|
|
2168
|
-
function SupportUnavailable({ title, message }) {
|
|
2169
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center p-8 text-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2170
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mb-2 text-lg font-semibold", children: title }),
|
|
2171
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: message })
|
|
2172
|
-
] }) });
|
|
2173
|
-
}
|
|
2174
|
-
var DEFAULT_WELCOME_DIALOG_LABELS = {
|
|
2175
|
-
welcome: (firstName) => `Welcome${firstName ? `, ${firstName}` : ""}!`,
|
|
2176
|
-
description: "Your plan, usage and rewards at a glance.",
|
|
2177
|
-
currentPlan: "Current plan",
|
|
2178
|
-
seeUpgradeOptions: "See upgrade options",
|
|
2179
|
-
referralBefore: "Get ",
|
|
2180
|
-
referralAfter: " for every invited contact who goes Pro.",
|
|
2181
|
-
inviteContact: "Invite contact",
|
|
2182
|
-
currentRewards: "Current rewards: ",
|
|
2183
|
-
continue: "Continue"
|
|
2184
|
-
};
|
|
2185
|
-
var DEFAULT_INVITE_CONTACTS_DIALOG_LABELS = {
|
|
2186
|
-
title: "Invite contacts",
|
|
2187
|
-
description: "Invite contacts by email and earn the referral reward."
|
|
2188
|
-
};
|
|
2189
|
-
function WelcomeDialog({
|
|
2190
|
-
open,
|
|
2191
|
-
onClose,
|
|
2192
|
-
firstName,
|
|
2193
|
-
hasReward,
|
|
2194
|
-
projectPicker,
|
|
2195
|
-
planBadge,
|
|
2196
|
-
quotas,
|
|
2197
|
-
onSeePlans,
|
|
2198
|
-
referralOfferLabel,
|
|
2199
|
-
onInvite,
|
|
2200
|
-
rewardBalanceLabel,
|
|
2201
|
-
labels,
|
|
2202
|
-
testId,
|
|
2203
|
-
testIds
|
|
2204
|
-
}) {
|
|
2205
|
-
const l = react.useMemo(() => ({ ...DEFAULT_WELCOME_DIALOG_LABELS, ...labels }), [labels]);
|
|
2206
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange: (next) => !next && onClose(), children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2207
|
-
ui.DialogContent,
|
|
2208
|
-
{
|
|
2209
|
-
className: "sm:max-w-md",
|
|
2210
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "welcome-modal" }),
|
|
2211
|
-
hideCloseButton: true,
|
|
2212
|
-
children: [
|
|
2213
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { children: [
|
|
2214
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-wrap items-start justify-between gap-2", children: [
|
|
2215
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DialogTitle, { className: "flex items-center gap-2", children: [
|
|
2216
|
-
hasReward ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Gift, { className: "h-5 w-5 text-green-text" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { className: "h-5 w-5 text-yellow-text" }),
|
|
2217
|
-
l.welcome(firstName)
|
|
2218
|
-
] }),
|
|
2219
|
-
projectPicker
|
|
2220
|
-
] }),
|
|
2221
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { className: "sr-only", children: l.description })
|
|
2222
|
-
] }),
|
|
2223
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2224
|
-
chunkULWRNGGE_cjs.ModalSection,
|
|
2225
|
-
{
|
|
2226
|
-
className: "space-y-4",
|
|
2227
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.copy, { testId: "welcome-modal-copy" }),
|
|
2228
|
-
children: [
|
|
2229
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
2230
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: l.currentPlan }),
|
|
2231
|
-
planBadge
|
|
2232
|
-
] }),
|
|
2233
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: quotas.map((quota) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2234
|
-
chunkQZTNTP75_cjs.UsageMeter,
|
|
2235
|
-
{
|
|
2236
|
-
icon: quota.icon,
|
|
2237
|
-
label: quota.label,
|
|
2238
|
-
value: quota.value,
|
|
2239
|
-
pct: quota.pct,
|
|
2240
|
-
hint: quota.hint,
|
|
2241
|
-
testId: chunkMHVNT4J3_cjs.prefixedTestId(testIds?.quota, quota.key, {
|
|
2242
|
-
testId: `welcome-modal-quota-${quota.key}`
|
|
2243
|
-
})
|
|
2244
|
-
},
|
|
2245
|
-
quota.key
|
|
2246
|
-
)) }),
|
|
2247
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2248
|
-
ui.Button,
|
|
2249
|
-
{
|
|
2250
|
-
variant: "outline",
|
|
2251
|
-
className: "w-full",
|
|
2252
|
-
onClick: onSeePlans,
|
|
2253
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.showPlans, { testId: "welcome-modal-show-plans" }),
|
|
2254
|
-
children: l.seeUpgradeOptions
|
|
2255
|
-
}
|
|
2256
|
-
)
|
|
2257
|
-
]
|
|
2258
|
-
}
|
|
2259
|
-
),
|
|
2260
|
-
/* @__PURE__ */ jsxRuntime.jsxs(chunkULWRNGGE_cjs.ModalSection, { className: "space-y-2.5", children: [
|
|
2261
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3", children: [
|
|
2262
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground", children: [
|
|
2263
|
-
l.referralBefore,
|
|
2264
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold text-foreground", children: referralOfferLabel }),
|
|
2265
|
-
l.referralAfter
|
|
2266
|
-
] }),
|
|
2267
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2268
|
-
ui.Button,
|
|
2269
|
-
{
|
|
2270
|
-
variant: "outline",
|
|
2271
|
-
size: "sm",
|
|
2272
|
-
className: "shrink-0 gap-1.5",
|
|
2273
|
-
onClick: onInvite,
|
|
2274
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.earn, { testId: "welcome-modal-earn" }),
|
|
2275
|
-
children: [
|
|
2276
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserPlus, { className: "h-3.5 w-3.5" }),
|
|
2277
|
-
l.inviteContact
|
|
2278
|
-
]
|
|
2279
|
-
}
|
|
2280
|
-
)
|
|
2281
|
-
] }),
|
|
2282
|
-
rewardBalanceLabel && // A statement, not a door: the balance applies itself to the next invoice.
|
|
2283
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 rounded-md bg-green-bg px-3 py-2 text-sm text-green-text", children: [
|
|
2284
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Gift, { className: "h-4 w-4 shrink-0" }),
|
|
2285
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "truncate", children: [
|
|
2286
|
-
l.currentRewards,
|
|
2287
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: rewardBalanceLabel })
|
|
2288
|
-
] })
|
|
2289
|
-
] })
|
|
2290
|
-
] }),
|
|
2291
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogFooter, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2292
|
-
ui.Button,
|
|
2293
|
-
{
|
|
2294
|
-
className: "w-full",
|
|
2295
|
-
onClick: onClose,
|
|
2296
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.dismiss, { testId: "welcome-modal-dismiss" }),
|
|
2297
|
-
children: l.continue
|
|
2298
|
-
}
|
|
2299
|
-
) })
|
|
2300
|
-
]
|
|
2301
|
-
}
|
|
2302
|
-
) });
|
|
2303
|
-
}
|
|
2304
|
-
function InviteContactsDialog({
|
|
2305
|
-
open,
|
|
2306
|
-
onClose,
|
|
2307
|
-
children,
|
|
2308
|
-
testId = "welcome-modal-invite",
|
|
2309
|
-
labels
|
|
2310
|
-
}) {
|
|
2311
|
-
const l = react.useMemo(() => ({ ...DEFAULT_INVITE_CONTACTS_DIALOG_LABELS, ...labels }), [labels]);
|
|
2312
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2313
|
-
chunkULWRNGGE_cjs.ModalScaffold,
|
|
2314
|
-
{
|
|
2315
|
-
open,
|
|
2316
|
-
onOpenChange: (next) => !next && onClose(),
|
|
2317
|
-
title: l.title,
|
|
2318
|
-
description: l.description,
|
|
2319
|
-
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserPlus, { className: "h-5 w-5 text-primary" }),
|
|
2320
|
-
size: "lg",
|
|
2321
|
-
className: "sm:max-w-lg",
|
|
2322
|
-
testId,
|
|
2323
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalSection, { children })
|
|
2324
|
-
}
|
|
2325
|
-
);
|
|
2326
|
-
}
|
|
2327
|
-
var SERIES_STYLES = [
|
|
2328
|
-
{ bg: "bg-blue-500", stroke: "stroke-blue-500" },
|
|
2329
|
-
{ bg: "bg-purple-500", stroke: "stroke-purple-500" },
|
|
2330
|
-
{ bg: "bg-emerald-500", stroke: "stroke-emerald-500" },
|
|
2331
|
-
{ bg: "bg-amber-500", stroke: "stroke-amber-500" },
|
|
2332
|
-
{ bg: "bg-rose-500", stroke: "stroke-rose-500" },
|
|
2333
|
-
{ bg: "bg-cyan-500", stroke: "stroke-cyan-500" },
|
|
2334
|
-
{ bg: "bg-indigo-500", stroke: "stroke-indigo-500" },
|
|
2335
|
-
{ bg: "bg-orange-500", stroke: "stroke-orange-500" }
|
|
2336
|
-
];
|
|
2337
|
-
var styleAt = (index) => SERIES_STYLES[index % SERIES_STYLES.length];
|
|
2338
|
-
var DEFAULT_USAGE_LINE_CHART_LABELS = {
|
|
2339
|
-
noDailyData: "No daily data"
|
|
2340
|
-
};
|
|
2341
|
-
var DEFAULT_USAGE_PROPORTION_BAR_LABELS = {
|
|
2342
|
-
tokens: (formatted) => `${formatted} tokens`,
|
|
2343
|
-
gbp: (formatted) => formatted,
|
|
2344
|
-
tokensShort: (formatted) => `${formatted} tok`
|
|
2345
|
-
};
|
|
2346
|
-
var DEFAULT_USAGE_PANEL_LABELS = {
|
|
2347
|
-
empty: "No usage yet.",
|
|
2348
|
-
error: "Failed to load usage data"
|
|
2349
|
-
};
|
|
2350
|
-
var CHART_W = 440;
|
|
2351
|
-
var CHART_H = 120;
|
|
2352
|
-
var PAD = { top: 8, right: 8, bottom: 20, left: 40 };
|
|
2353
|
-
function UsageLineChart({
|
|
2354
|
-
dates,
|
|
2355
|
-
series,
|
|
2356
|
-
formatDate,
|
|
2357
|
-
formatValue: formatValue2,
|
|
2358
|
-
emptyLabel,
|
|
2359
|
-
labels
|
|
2360
|
-
}) {
|
|
2361
|
-
const l = react.useMemo(() => ({ ...DEFAULT_USAGE_LINE_CHART_LABELS, ...labels }), [labels]);
|
|
2362
|
-
const [hoverIdx, setHoverIdx] = react.useState(null);
|
|
2363
|
-
if (!dates.length || !series.length) {
|
|
2364
|
-
return /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: emptyLabel ?? l.noDailyData });
|
|
2365
|
-
}
|
|
2366
|
-
const maxVal = Math.max(...series.flatMap((s) => s.values), 1);
|
|
2367
|
-
const plotW = CHART_W - PAD.left - PAD.right;
|
|
2368
|
-
const plotH = CHART_H - PAD.top - PAD.bottom;
|
|
2369
|
-
const xStep = dates.length > 1 ? plotW / (dates.length - 1) : plotW;
|
|
2370
|
-
const yScale = (v) => PAD.top + plotH - v / maxVal * plotH;
|
|
2371
|
-
const yTicks = [0, maxVal / 2, maxVal].map((v) => ({
|
|
2372
|
-
v,
|
|
2373
|
-
y: yScale(v),
|
|
2374
|
-
label: v >= 1e3 ? `${Math.round(v / 1e3)}k` : String(Math.round(v * 100) / 100)
|
|
2375
|
-
}));
|
|
2376
|
-
const labelCount = Math.min(dates.length, 5);
|
|
2377
|
-
const labelStep = Math.max(1, Math.floor((dates.length - 1) / (labelCount - 1)));
|
|
2378
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", "data-slot": "usage-line-chart", children: [
|
|
2379
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2380
|
-
"svg",
|
|
2381
|
-
{
|
|
2382
|
-
viewBox: `0 0 ${CHART_W} ${CHART_H}`,
|
|
2383
|
-
className: "h-auto w-full",
|
|
2384
|
-
preserveAspectRatio: "xMidYMid meet",
|
|
2385
|
-
onMouseLeave: () => setHoverIdx(null),
|
|
2386
|
-
children: [
|
|
2387
|
-
yTicks.map((t) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
|
|
2388
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2389
|
-
"line",
|
|
2390
|
-
{
|
|
2391
|
-
x1: PAD.left,
|
|
2392
|
-
x2: CHART_W - PAD.right,
|
|
2393
|
-
y1: t.y,
|
|
2394
|
-
y2: t.y,
|
|
2395
|
-
className: "stroke-border",
|
|
2396
|
-
strokeDasharray: "2,2"
|
|
2397
|
-
}
|
|
2398
|
-
),
|
|
2399
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2400
|
-
"text",
|
|
2401
|
-
{
|
|
2402
|
-
x: PAD.left - 4,
|
|
2403
|
-
y: t.y + 3,
|
|
2404
|
-
textAnchor: "end",
|
|
2405
|
-
className: "fill-muted-foreground text-xs",
|
|
2406
|
-
children: t.label
|
|
2407
|
-
}
|
|
2408
|
-
)
|
|
2409
|
-
] }, t.v)),
|
|
2410
|
-
series.map((s, si) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2411
|
-
"polyline",
|
|
2412
|
-
{
|
|
2413
|
-
points: s.values.map((v, i) => `${PAD.left + i * xStep},${yScale(v)}`).join(" "),
|
|
2414
|
-
fill: "none",
|
|
2415
|
-
className: styleAt(si).stroke,
|
|
2416
|
-
strokeWidth: 1.5,
|
|
2417
|
-
strokeLinejoin: "round"
|
|
2418
|
-
},
|
|
2419
|
-
s.key
|
|
2420
|
-
)),
|
|
2421
|
-
dates.map((date, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2422
|
-
"rect",
|
|
2423
|
-
{
|
|
2424
|
-
x: PAD.left + i * xStep - xStep / 2,
|
|
2425
|
-
y: PAD.top,
|
|
2426
|
-
width: xStep,
|
|
2427
|
-
height: plotH,
|
|
2428
|
-
fill: "transparent",
|
|
2429
|
-
onMouseEnter: () => setHoverIdx(i),
|
|
2430
|
-
onClick: () => setHoverIdx(i)
|
|
2431
|
-
},
|
|
2432
|
-
date
|
|
2433
|
-
)),
|
|
2434
|
-
hoverIdx !== null && /* @__PURE__ */ jsxRuntime.jsx(
|
|
2435
|
-
"line",
|
|
2436
|
-
{
|
|
2437
|
-
x1: PAD.left + hoverIdx * xStep,
|
|
2438
|
-
x2: PAD.left + hoverIdx * xStep,
|
|
2439
|
-
y1: PAD.top,
|
|
2440
|
-
y2: PAD.top + plotH,
|
|
2441
|
-
className: "stroke-muted-foreground",
|
|
2442
|
-
strokeDasharray: "3,3"
|
|
2443
|
-
}
|
|
2444
|
-
),
|
|
2445
|
-
dates.map((d, i) => {
|
|
2446
|
-
const isLast = i === dates.length - 1;
|
|
2447
|
-
if (!isLast && (i % labelStep !== 0 || dates.length - 1 - i < labelStep / 2)) return null;
|
|
2448
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2449
|
-
"text",
|
|
2450
|
-
{
|
|
2451
|
-
x: PAD.left + i * xStep,
|
|
2452
|
-
y: CHART_H - 2,
|
|
2453
|
-
textAnchor: i === 0 ? "start" : isLast ? "end" : "middle",
|
|
2454
|
-
className: "fill-muted-foreground text-xs",
|
|
2455
|
-
children: formatDate(d)
|
|
2456
|
-
},
|
|
2457
|
-
d
|
|
2458
|
-
);
|
|
2459
|
-
})
|
|
2460
|
-
]
|
|
2461
|
-
}
|
|
2462
|
-
),
|
|
2463
|
-
hoverIdx !== null && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "pointer-events-none absolute right-0 top-0 rounded-md border bg-card/90 px-2 py-1 text-sm shadow-lg", children: [
|
|
2464
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium", children: dates[hoverIdx] }),
|
|
2465
|
-
series.map((s, si) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
|
|
2466
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.cn("inline-block h-2 w-2 rounded-full", styleAt(si).bg) }),
|
|
2467
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
2468
|
-
s.key,
|
|
2469
|
-
":"
|
|
2470
|
-
] }),
|
|
2471
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium tabular-nums", children: formatValue2(s.values[hoverIdx]) })
|
|
2472
|
-
] }, s.key))
|
|
2473
|
-
] })
|
|
2474
|
-
] });
|
|
2475
|
-
}
|
|
2476
|
-
function UsageLegend({ series }) {
|
|
2477
|
-
if (series.length <= 1 && series[0]?.key === "Total") return null;
|
|
2478
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-x-3 gap-y-1", children: series.map((s, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 text-sm", children: [
|
|
2479
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.cn("inline-block h-2.5 w-2.5 rounded-full", styleAt(i).bg) }),
|
|
2480
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: s.key })
|
|
2481
|
-
] }, s.key)) });
|
|
2482
|
-
}
|
|
2483
|
-
function UsageProportionBar({
|
|
2484
|
-
items,
|
|
2485
|
-
metric,
|
|
2486
|
-
labels
|
|
2487
|
-
}) {
|
|
2488
|
-
const l = react.useMemo(() => ({ ...DEFAULT_USAGE_PROPORTION_BAR_LABELS, ...labels }), [labels]);
|
|
2489
|
-
const total = items.reduce((sum, item) => sum + item.amount, 0);
|
|
2490
|
-
if (!items.length || total === 0) return null;
|
|
2491
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
|
|
2492
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-3 w-full overflow-hidden rounded-full bg-muted", children: items.map((item, i) => {
|
|
2493
|
-
const pct = item.amount / total * 100;
|
|
2494
|
-
if (pct < 0.5) return null;
|
|
2495
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2496
|
-
"div",
|
|
2497
|
-
{
|
|
2498
|
-
className: ui.cn("h-full first:rounded-l-full last:rounded-r-full", styleAt(i).bg),
|
|
2499
|
-
style: { width: `${pct}%` },
|
|
2500
|
-
title: `${item.label}: ${metric === "tokens" ? l.tokens(item.tokens) : l.gbp(item.gbp)}`
|
|
2501
|
-
},
|
|
2502
|
-
item.label
|
|
2503
|
-
);
|
|
2504
|
-
}) }),
|
|
2505
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1.5", children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between text-sm", children: [
|
|
2506
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [
|
|
2507
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2508
|
-
"span",
|
|
2509
|
-
{
|
|
2510
|
-
className: ui.cn("inline-block h-2.5 w-2.5 flex-shrink-0 rounded-full", styleAt(i).bg)
|
|
2511
|
-
}
|
|
2512
|
-
),
|
|
2513
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: item.label })
|
|
2514
|
-
] }),
|
|
2515
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-2 flex flex-shrink-0 items-center gap-2 tabular-nums", children: [
|
|
2516
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2517
|
-
"span",
|
|
2518
|
-
{
|
|
2519
|
-
className: ui.cn(
|
|
2520
|
-
"flex items-center gap-0.5",
|
|
2521
|
-
metric === "gbp" ? "font-medium text-muted-foreground" : "text-muted-foreground/60"
|
|
2522
|
-
),
|
|
2523
|
-
children: item.gbp
|
|
2524
|
-
}
|
|
2525
|
-
),
|
|
2526
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2527
|
-
"span",
|
|
2528
|
-
{
|
|
2529
|
-
className: metric === "tokens" ? "font-medium text-muted-foreground" : "text-muted-foreground/60",
|
|
2530
|
-
children: l.tokensShort(item.tokens)
|
|
2531
|
-
}
|
|
2532
|
-
),
|
|
2533
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "w-8 text-right text-muted-foreground/40", children: [
|
|
2534
|
-
(item.amount / total * 100).toFixed(0),
|
|
2535
|
-
"%"
|
|
2536
|
-
] })
|
|
2537
|
-
] })
|
|
2538
|
-
] }, item.label)) })
|
|
2539
|
-
] });
|
|
2540
|
-
}
|
|
2541
|
-
function UsageSummary({ stats }) {
|
|
2542
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-3 gap-2 text-center", children: stats.map((stat) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg bg-muted p-3", children: [
|
|
2543
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center gap-1 text-base font-semibold tabular-nums", children: stat.value }),
|
|
2544
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-muted-foreground", children: stat.label })
|
|
2545
|
-
] }, stat.key)) });
|
|
2546
|
-
}
|
|
2547
|
-
function UsageToggle({
|
|
2548
|
-
value,
|
|
2549
|
-
onChange,
|
|
2550
|
-
options,
|
|
2551
|
-
ariaLabel,
|
|
2552
|
-
size = "compact"
|
|
2553
|
-
}) {
|
|
2554
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2555
|
-
RadioGroupPrimitive__namespace.Root,
|
|
2556
|
-
{
|
|
2557
|
-
"aria-label": ariaLabel,
|
|
2558
|
-
value,
|
|
2559
|
-
onValueChange: (next) => onChange(next),
|
|
2560
|
-
orientation: "horizontal",
|
|
2561
|
-
className: "flex gap-1 rounded-md border border-border bg-background p-0.5 print:hidden",
|
|
2562
|
-
children: options.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2563
|
-
RadioGroupPrimitive__namespace.Item,
|
|
2564
|
-
{
|
|
2565
|
-
value: option.value,
|
|
2566
|
-
className: ui.cn(
|
|
2567
|
-
"rounded-md px-3 py-1 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:py-2.5",
|
|
2568
|
-
size === "fill" && "flex-1 px-2 py-1.5",
|
|
2569
|
-
option.value === value ? "bg-accent font-medium text-accent-foreground" : "text-muted-foreground hover:text-foreground"
|
|
2570
|
-
),
|
|
2571
|
-
children: option.label
|
|
2572
|
-
},
|
|
2573
|
-
option.value
|
|
2574
|
-
))
|
|
2575
|
-
}
|
|
2576
|
-
);
|
|
2577
|
-
}
|
|
2578
|
-
function UsagePanel({
|
|
2579
|
-
state,
|
|
2580
|
-
period,
|
|
2581
|
-
actions,
|
|
2582
|
-
dateRange,
|
|
2583
|
-
emptyMessage,
|
|
2584
|
-
errorMessage,
|
|
2585
|
-
labels,
|
|
2586
|
-
children
|
|
2587
|
-
}) {
|
|
2588
|
-
const l = react.useMemo(() => ({ ...DEFAULT_USAGE_PANEL_LABELS, ...labels }), [labels]);
|
|
2589
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", "data-slot": "usage-panel", children: [
|
|
2590
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
2591
|
-
period,
|
|
2592
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1", children: actions })
|
|
2593
|
-
] }),
|
|
2594
|
-
dateRange && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: dateRange }),
|
|
2595
|
-
state === "loading" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-5 w-5 animate-spin text-muted-foreground" }) }),
|
|
2596
|
-
state === "error" && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "py-4 text-sm text-destructive", children: errorMessage ?? l.error }),
|
|
2597
|
-
state === "empty" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center gap-2 py-10 text-center", children: [
|
|
2598
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChartNoAxesColumn, { className: "h-8 w-8 text-muted-foreground/40" }),
|
|
2599
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: emptyMessage ?? l.empty })
|
|
2600
|
-
] }),
|
|
2601
|
-
state === "ready" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-4", children })
|
|
2602
|
-
] });
|
|
2603
|
-
}
|
|
2604
|
-
var DEFAULT_INVOICES_DIALOG_LABELS = {
|
|
2605
|
-
title: (projectName) => `Receipts \xB7 ${projectName}`,
|
|
2606
|
-
description: (projectName) => `Receipts for ${projectName}`,
|
|
2607
|
-
noReceipts: "No receipts yet.",
|
|
2608
|
-
paid: "Paid"
|
|
2609
|
-
};
|
|
2610
|
-
var DEFAULT_DAILY_CAP_FIELD_LABELS = {
|
|
2611
|
-
noLimit: "No limit",
|
|
2612
|
-
ariaLabel: "Daily AI usage limit per collaborator (\xA3)",
|
|
2613
|
-
unit: "\xA3 / user / day",
|
|
2614
|
-
save: "Save"
|
|
2615
|
-
};
|
|
2616
|
-
var DEFAULT_MEMBER_PROJECT_ROW_LABELS = {
|
|
2617
|
-
noDailyLimit: "No daily limit"
|
|
2618
|
-
};
|
|
2619
|
-
var DEFAULT_INLINE_NAME_EDITOR_LABELS = {
|
|
2620
|
-
saveName: "Save name",
|
|
2621
|
-
cancelRename: "Cancel rename"
|
|
2622
|
-
};
|
|
2623
|
-
var DEFAULT_PROJECT_CARD_VIEW_LABELS = {
|
|
2624
|
-
collapseProject: "Collapse project",
|
|
2625
|
-
expandProject: "Expand project"
|
|
2626
|
-
};
|
|
2627
|
-
function InvoicesDialog({
|
|
2628
|
-
open,
|
|
2629
|
-
onOpenChange,
|
|
2630
|
-
projectName,
|
|
2631
|
-
isLoading,
|
|
2632
|
-
invoices,
|
|
2633
|
-
labels
|
|
2634
|
-
}) {
|
|
2635
|
-
const l = react.useMemo(() => ({ ...DEFAULT_INVOICES_DIALOG_LABELS, ...labels }), [labels]);
|
|
2636
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogContent, { presentation: "sheet", className: "max-w-lg", children: [
|
|
2637
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { children: [
|
|
2638
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: l.title(projectName) }),
|
|
2639
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { className: "sr-only", children: l.description(projectName) })
|
|
2640
|
-
] }),
|
|
2641
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
2642
|
-
isLoading && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-5 w-5 animate-spin text-muted-foreground" }) }),
|
|
2643
|
-
!isLoading && invoices.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "py-4 text-center text-sm text-muted-foreground", children: l.noReceipts }),
|
|
2644
|
-
!isLoading && invoices.map((invoice) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2645
|
-
"div",
|
|
2646
|
-
{
|
|
2647
|
-
className: "flex items-center justify-between border-b py-2 text-sm last:border-0",
|
|
2648
|
-
children: [
|
|
2649
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-0.5", children: [
|
|
2650
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums text-muted-foreground", children: invoice.date }),
|
|
2651
|
-
invoice.kind && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground", children: invoice.kind }),
|
|
2652
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium tabular-nums", children: invoice.amount }),
|
|
2653
|
-
invoice.amountNote && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs tabular-nums text-muted-foreground", children: invoice.amountNote }),
|
|
2654
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2655
|
-
ui.Badge,
|
|
2656
|
-
{
|
|
2657
|
-
variant: "outline",
|
|
2658
|
-
className: ui.cn(
|
|
2659
|
-
"h-4 px-1.5 py-0 text-sm",
|
|
2660
|
-
invoice.isPaid && "border-green-border text-green-text"
|
|
2661
|
-
),
|
|
2662
|
-
children: invoice.isPaid ? l.paid : invoice.status
|
|
2663
|
-
}
|
|
2664
|
-
)
|
|
2665
|
-
] }),
|
|
2666
|
-
invoice.href && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2667
|
-
"a",
|
|
2668
|
-
{
|
|
2669
|
-
href: invoice.href,
|
|
2670
|
-
target: "_blank",
|
|
2671
|
-
rel: "noopener noreferrer",
|
|
2672
|
-
className: "flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground",
|
|
2673
|
-
children: [
|
|
2674
|
-
invoice.linkLabel,
|
|
2675
|
-
" ",
|
|
2676
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "h-3 w-3" })
|
|
2677
|
-
]
|
|
2678
|
-
}
|
|
2679
|
-
)
|
|
2680
|
-
]
|
|
2681
|
-
},
|
|
2682
|
-
invoice.key
|
|
2683
|
-
))
|
|
2684
|
-
] })
|
|
2685
|
-
] }) });
|
|
2686
|
-
}
|
|
2687
|
-
function DailyCapField({
|
|
2688
|
-
value,
|
|
2689
|
-
onChange,
|
|
2690
|
-
onSave,
|
|
2691
|
-
canSave,
|
|
2692
|
-
isSaving,
|
|
2693
|
-
labels
|
|
2694
|
-
}) {
|
|
2695
|
-
const l = react.useMemo(() => ({ ...DEFAULT_DAILY_CAP_FIELD_LABELS, ...labels }), [labels]);
|
|
2696
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
2697
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2698
|
-
ui.Input,
|
|
2699
|
-
{
|
|
2700
|
-
type: "number",
|
|
2701
|
-
min: 0,
|
|
2702
|
-
step: 0.01,
|
|
2703
|
-
value,
|
|
2704
|
-
onChange: (e) => onChange(e.target.value),
|
|
2705
|
-
onKeyDown: (e) => {
|
|
2706
|
-
if (e.key === "Enter") onSave();
|
|
2707
|
-
},
|
|
2708
|
-
placeholder: l.noLimit,
|
|
2709
|
-
className: "h-9 w-40",
|
|
2710
|
-
"aria-label": l.ariaLabel
|
|
2711
|
-
}
|
|
2712
|
-
),
|
|
2713
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: l.unit }),
|
|
2714
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "sm", className: "h-9 px-4", disabled: !canSave || isSaving, onClick: onSave, children: l.save })
|
|
2715
|
-
] });
|
|
2716
|
-
}
|
|
2717
|
-
function MemberProjectRow({ icon, name, owner, allowance, labels }) {
|
|
2718
|
-
const l = react.useMemo(() => ({ ...DEFAULT_MEMBER_PROJECT_ROW_LABELS, ...labels }), [labels]);
|
|
2719
|
-
const barColor2 = allowance && allowance.pct >= 100 ? "bg-red-500" : allowance && allowance.pct >= 90 ? "bg-yellow-500" : "bg-primary";
|
|
2720
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 rounded-lg bg-muted p-3", children: [
|
|
2721
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 text-muted-foreground", children: icon }),
|
|
2722
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
2723
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-sm font-medium", children: name }),
|
|
2724
|
-
owner
|
|
2725
|
-
] }) }),
|
|
2726
|
-
allowance === null ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 text-sm text-muted-foreground", children: l.noDailyLimit }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-shrink-0 flex-col items-end gap-0.5 text-sm tabular-nums", children: [
|
|
2727
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: allowance.text }),
|
|
2728
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-1 w-24 overflow-hidden rounded-full bg-background", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2729
|
-
"span",
|
|
2730
|
-
{
|
|
2731
|
-
className: ui.cn("block h-full rounded-full", barColor2),
|
|
2732
|
-
style: { width: `${allowance.pct}%` }
|
|
2733
|
-
}
|
|
2734
|
-
) })
|
|
2735
|
-
] })
|
|
2736
|
-
] });
|
|
2737
|
-
}
|
|
2738
|
-
function InlineNameEditor({
|
|
2739
|
-
value,
|
|
2740
|
-
onChange,
|
|
2741
|
-
onSave,
|
|
2742
|
-
onCancel,
|
|
2743
|
-
labels
|
|
2744
|
-
}) {
|
|
2745
|
-
const l = react.useMemo(() => ({ ...DEFAULT_INLINE_NAME_EDITOR_LABELS, ...labels }), [labels]);
|
|
2746
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-1", children: [
|
|
2747
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2748
|
-
ui.Input,
|
|
2749
|
-
{
|
|
2750
|
-
value,
|
|
2751
|
-
onChange: (e) => onChange(e.target.value),
|
|
2752
|
-
className: "h-7 text-sm",
|
|
2753
|
-
autoFocus: true,
|
|
2754
|
-
onKeyDown: (e) => {
|
|
2755
|
-
if (e.key === "Enter") onSave();
|
|
2756
|
-
if (e.key === "Escape") onCancel();
|
|
2757
|
-
}
|
|
2758
|
-
}
|
|
2759
|
-
),
|
|
2760
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2761
|
-
ui.Button,
|
|
2762
|
-
{
|
|
2763
|
-
variant: "ghost",
|
|
2764
|
-
size: "icon",
|
|
2765
|
-
className: "h-6 w-6",
|
|
2766
|
-
"aria-label": l.saveName,
|
|
2767
|
-
onClick: onSave,
|
|
2768
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-3.5 w-3.5" })
|
|
2769
|
-
}
|
|
2770
|
-
),
|
|
2771
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2772
|
-
ui.Button,
|
|
2773
|
-
{
|
|
2774
|
-
variant: "ghost",
|
|
2775
|
-
size: "icon",
|
|
2776
|
-
className: "h-6 w-6",
|
|
2777
|
-
"aria-label": l.cancelRename,
|
|
2778
|
-
onClick: onCancel,
|
|
2779
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-3.5 w-3.5" })
|
|
2780
|
-
}
|
|
2781
|
-
)
|
|
2782
|
-
] });
|
|
2783
|
-
}
|
|
2784
|
-
function ProjectCardView({
|
|
2785
|
-
expanded,
|
|
2786
|
-
onToggleExpanded,
|
|
2787
|
-
rowRef,
|
|
2788
|
-
icon,
|
|
2789
|
-
identity,
|
|
2790
|
-
actions,
|
|
2791
|
-
badge,
|
|
2792
|
-
buttons,
|
|
2793
|
-
summary,
|
|
2794
|
-
children,
|
|
2795
|
-
overlays,
|
|
2796
|
-
labels
|
|
2797
|
-
}) {
|
|
2798
|
-
const l = react.useMemo(() => ({ ...DEFAULT_PROJECT_CARD_VIEW_LABELS, ...labels }), [labels]);
|
|
2799
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2800
|
-
"div",
|
|
2801
|
-
{
|
|
2802
|
-
"data-slot": "project-card",
|
|
2803
|
-
className: ui.cn("rounded-lg bg-muted transition-colors", expanded && "ring-1 ring-primary/40"),
|
|
2804
|
-
children: [
|
|
2805
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2806
|
-
"div",
|
|
2807
|
-
{
|
|
2808
|
-
ref: rowRef,
|
|
2809
|
-
className: ui.cn(
|
|
2810
|
-
"flex items-center gap-2 p-3 transition-colors",
|
|
2811
|
-
expanded ? "bg-blue-bg/60" : "hover:bg-muted/50"
|
|
2812
|
-
),
|
|
2813
|
-
children: [
|
|
2814
|
-
icon,
|
|
2815
|
-
identity,
|
|
2816
|
-
actions,
|
|
2817
|
-
badge,
|
|
2818
|
-
buttons,
|
|
2819
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
|
|
2820
|
-
summary,
|
|
2821
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2822
|
-
"button",
|
|
2823
|
-
{
|
|
2824
|
-
type: "button",
|
|
2825
|
-
onClick: onToggleExpanded,
|
|
2826
|
-
"aria-expanded": expanded,
|
|
2827
|
-
"aria-label": expanded ? l.collapseProject : l.expandProject,
|
|
2828
|
-
className: "flex-shrink-0 rounded p-1 hover:bg-muted pointer-coarse:p-3",
|
|
2829
|
-
children: expanded ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4 text-muted-foreground" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4 text-muted-foreground" })
|
|
2830
|
-
}
|
|
2831
|
-
)
|
|
2832
|
-
]
|
|
2833
|
-
}
|
|
2834
|
-
),
|
|
2835
|
-
expanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-4 border-t px-4 py-3", children }),
|
|
2836
|
-
overlays
|
|
2837
|
-
]
|
|
2838
|
-
}
|
|
2839
|
-
);
|
|
2840
|
-
}
|
|
2841
|
-
var DEFAULT_EMAIL_WORKSPACE_DIALOG_LABELS = {
|
|
2842
|
-
title: "Email this workspace",
|
|
2843
|
-
description: "Send documents and questions here from your registered email address \u2014 your Assistant reads the email and replies.",
|
|
2844
|
-
compose: "Compose email",
|
|
2845
|
-
paHintBefore: "Don\u2019t need this specific workspace? Send general questions to ",
|
|
2846
|
-
paHintAfter: " instead.",
|
|
2847
|
-
checking: "Checking your Assistant\u2019s access\u2026",
|
|
2848
|
-
noAssistant: "You don\u2019t have a default Assistant yet \u2014 one is created automatically the first time you email a workspace.",
|
|
2849
|
-
authorizedExpires: (ttl) => `Authorized \u2014 expires in ${ttl}`,
|
|
2850
|
-
end: "End",
|
|
2851
|
-
authorizePrompt: (ttl) => `Authorize your Assistant to act in this workspace${ttl ? ` for ${ttl}` : ""}, so it\u2019s ready as soon as it wakes.`,
|
|
2852
|
-
authorize: "Authorize",
|
|
2853
|
-
authorizing: "Authorizing\u2026",
|
|
2854
|
-
advanced: "Advanced",
|
|
2855
|
-
alreadyGranted: "Your Assistant already has standing access to this workspace.",
|
|
2856
|
-
standingWarning: "Standing access never expires and doesn\u2019t need re-authorizing \u2014 only use it if you trust the Assistant\u2019s environment long-term.",
|
|
2857
|
-
grant: "Grant standing access",
|
|
2858
|
-
granting: "Granting\u2026"
|
|
2859
|
-
};
|
|
2860
|
-
function EmailWorkspaceDialogView({
|
|
2861
|
-
open,
|
|
2862
|
-
onOpenChange,
|
|
2863
|
-
email,
|
|
2864
|
-
mailtoHref,
|
|
2865
|
-
paDomain,
|
|
2866
|
-
copyButton,
|
|
2867
|
-
access,
|
|
2868
|
-
standing,
|
|
2869
|
-
labels
|
|
2870
|
-
}) {
|
|
2871
|
-
const l = react.useMemo(() => ({ ...DEFAULT_EMAIL_WORKSPACE_DIALOG_LABELS, ...labels }), [labels]);
|
|
2872
|
-
const [advancedOpen, setAdvancedOpen] = react.useState(false);
|
|
2873
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogContent, { className: "sm:max-w-md", "data-testid": "email-workspace-dialog", children: [
|
|
2874
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { className: "-m-6 mb-4 bg-muted p-6 pb-4", children: [
|
|
2875
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
2876
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mail, { className: "size-6" }),
|
|
2877
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: l.title })
|
|
2878
|
-
] }),
|
|
2879
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { children: l.description })
|
|
2880
|
-
] }),
|
|
2881
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 rounded-lg border border-border bg-muted/30 px-3 py-2", children: [
|
|
2882
|
-
/* @__PURE__ */ jsxRuntime.jsx("code", { className: "flex-1 truncate font-mono text-sm", "data-testid": "email-workspace-address", children: email }),
|
|
2883
|
-
copyButton
|
|
2884
|
-
] }),
|
|
2885
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { asChild: true, "data-testid": "email-workspace-compose-button", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: mailtoHref, children: [
|
|
2886
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Send, { className: "mr-1.5 size-4" }),
|
|
2887
|
-
l.compose
|
|
2888
|
-
] }) }),
|
|
2889
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground", "data-testid": "email-workspace-pa-hint", children: [
|
|
2890
|
-
l.paHintBefore,
|
|
2891
|
-
/* @__PURE__ */ jsxRuntime.jsxs("code", { className: "font-mono", children: [
|
|
2892
|
-
"pa@",
|
|
2893
|
-
paDomain
|
|
2894
|
-
] }),
|
|
2895
|
-
l.paHintAfter
|
|
2896
|
-
] }),
|
|
2897
|
-
access && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2 rounded-md border border-border bg-muted/30 p-3", children: [
|
|
2898
|
-
access.kind === "loading" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2899
|
-
"p",
|
|
2900
|
-
{
|
|
2901
|
-
className: "text-xs text-muted-foreground",
|
|
2902
|
-
"data-testid": "email-workspace-authorize-loading",
|
|
2903
|
-
children: l.checking
|
|
2904
|
-
}
|
|
2905
|
-
) : access.kind === "none" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2906
|
-
"p",
|
|
2907
|
-
{
|
|
2908
|
-
className: "text-xs text-muted-foreground",
|
|
2909
|
-
"data-testid": "email-workspace-no-assistant",
|
|
2910
|
-
children: l.noAssistant
|
|
2911
|
-
}
|
|
2912
|
-
) : access.kind === "session" ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2913
|
-
"div",
|
|
2914
|
-
{
|
|
2915
|
-
className: "flex items-center justify-between gap-3",
|
|
2916
|
-
"data-testid": "email-workspace-active-session",
|
|
2917
|
-
children: [
|
|
2918
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
2919
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Clock, { className: "size-3.5" }),
|
|
2920
|
-
l.authorizedExpires(access.expiresIn)
|
|
2921
|
-
] }),
|
|
2922
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2923
|
-
ui.Button,
|
|
2924
|
-
{
|
|
2925
|
-
variant: "ghost",
|
|
2926
|
-
size: "sm",
|
|
2927
|
-
onClick: access.onEnd,
|
|
2928
|
-
disabled: access.isEnding,
|
|
2929
|
-
className: "h-7 shrink-0 gap-1 px-2 text-xs text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:h-11",
|
|
2930
|
-
"data-testid": "email-workspace-end-session-button",
|
|
2931
|
-
children: [
|
|
2932
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-3" }),
|
|
2933
|
-
l.end
|
|
2934
|
-
]
|
|
2935
|
-
}
|
|
2936
|
-
)
|
|
2937
|
-
]
|
|
2938
|
-
}
|
|
2939
|
-
) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3", children: [
|
|
2940
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: l.authorizePrompt(access.defaultTtl) }),
|
|
2941
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2942
|
-
ui.Button,
|
|
2943
|
-
{
|
|
2944
|
-
variant: "outline",
|
|
2945
|
-
size: "sm",
|
|
2946
|
-
onClick: access.onAuthorize,
|
|
2947
|
-
disabled: access.isAuthorizing,
|
|
2948
|
-
className: "shrink-0 gap-1.5",
|
|
2949
|
-
"data-testid": "email-workspace-authorize-button",
|
|
2950
|
-
children: [
|
|
2951
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Clock, { className: "size-3.5" }),
|
|
2952
|
-
access.isAuthorizing ? l.authorizing : l.authorize
|
|
2953
|
-
]
|
|
2954
|
-
}
|
|
2955
|
-
)
|
|
2956
|
-
] }),
|
|
2957
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2958
|
-
"button",
|
|
2959
|
-
{
|
|
2960
|
-
type: "button",
|
|
2961
|
-
onClick: () => setAdvancedOpen((o) => !o),
|
|
2962
|
-
"aria-expanded": advancedOpen,
|
|
2963
|
-
className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11",
|
|
2964
|
-
"data-testid": "email-workspace-advanced-toggle",
|
|
2965
|
-
children: l.advanced
|
|
2966
|
-
}
|
|
2967
|
-
),
|
|
2968
|
-
advancedOpen && standing && (standing.alreadyGranted ? /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
2969
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-3.5 text-green-solid" }),
|
|
2970
|
-
l.alreadyGranted
|
|
2971
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2972
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: l.standingWarning }),
|
|
2973
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2974
|
-
ui.Button,
|
|
2975
|
-
{
|
|
2976
|
-
variant: "outline",
|
|
2977
|
-
size: "sm",
|
|
2978
|
-
onClick: standing.onGrant,
|
|
2979
|
-
disabled: standing.isGranting,
|
|
2980
|
-
className: "gap-1.5",
|
|
2981
|
-
"data-testid": "email-workspace-grant-access-button",
|
|
2982
|
-
children: [
|
|
2983
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Infinity, { className: "size-3.5" }),
|
|
2984
|
-
standing.isGranting ? l.granting : l.grant
|
|
2985
|
-
]
|
|
2986
|
-
}
|
|
2987
|
-
)
|
|
2988
|
-
] }))
|
|
2989
|
-
] })
|
|
2990
|
-
] }) });
|
|
2991
|
-
}
|
|
2992
|
-
function PlanNotice({
|
|
2993
|
-
tone = "muted",
|
|
2994
|
-
className,
|
|
2995
|
-
testId,
|
|
2996
|
-
children
|
|
2997
|
-
}) {
|
|
2998
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2999
|
-
"p",
|
|
3000
|
-
{
|
|
3001
|
-
"data-slot": "plan-notice",
|
|
3002
|
-
"data-testid": testId,
|
|
3003
|
-
className: ui.cn(
|
|
3004
|
-
"text-sm",
|
|
3005
|
-
tone === "error" ? "text-destructive" : "text-muted-foreground",
|
|
3006
|
-
className
|
|
3007
|
-
),
|
|
3008
|
-
children
|
|
3009
|
-
}
|
|
3010
|
-
);
|
|
3011
|
-
}
|
|
3012
|
-
function PlanStack({
|
|
3013
|
-
gap = 3,
|
|
3014
|
-
testId,
|
|
3015
|
-
className,
|
|
3016
|
-
children
|
|
3017
|
-
}) {
|
|
3018
|
-
const GAP = { 2: "space-y-2", 3: "space-y-3", 4: "space-y-4", 5: "space-y-5 pt-2" };
|
|
3019
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "plan-stack", "data-testid": testId, className: ui.cn(GAP[gap], className), children });
|
|
3020
|
-
}
|
|
3021
|
-
function PlanTransition({ from, to }) {
|
|
3022
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "plan-transition", className: "flex flex-wrap items-center gap-2 text-sm", children: [
|
|
3023
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center rounded-full bg-muted px-2 py-0.5 text-xs font-semibold text-muted-foreground", children: from }),
|
|
3024
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRight, { className: "size-4 text-muted-foreground", "aria-hidden": true }),
|
|
3025
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center rounded-full bg-primary px-2 py-0.5 text-xs font-semibold text-white", children: to })
|
|
3026
|
-
] });
|
|
3027
|
-
}
|
|
3028
|
-
function PlanPickerHeader({
|
|
3029
|
-
title,
|
|
3030
|
-
info,
|
|
3031
|
-
infoPlacement = "title",
|
|
3032
|
-
toggle,
|
|
3033
|
-
className
|
|
3034
|
-
}) {
|
|
3035
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3036
|
-
"div",
|
|
3037
|
-
{
|
|
3038
|
-
"data-slot": "plan-picker-header",
|
|
3039
|
-
className: ui.cn("flex flex-wrap items-center justify-between gap-x-3 gap-y-2", className),
|
|
3040
|
-
children: [
|
|
3041
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
3042
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg font-semibold", children: title }),
|
|
3043
|
-
infoPlacement === "title" && info
|
|
3044
|
-
] }),
|
|
3045
|
-
infoPlacement === "toggle" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-2", children: [
|
|
3046
|
-
info,
|
|
3047
|
-
toggle
|
|
3048
|
-
] }) : toggle
|
|
3049
|
-
]
|
|
3050
|
-
}
|
|
3051
|
-
);
|
|
3052
|
-
}
|
|
3053
|
-
function PlanPickerCard({ children }) {
|
|
3054
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3055
|
-
"div",
|
|
3056
|
-
{
|
|
3057
|
-
"data-slot": "plan-picker-card",
|
|
3058
|
-
className: "space-y-4 rounded-lg border border-border bg-card shadow-xs p-4",
|
|
3059
|
-
children
|
|
3060
|
-
}
|
|
3061
|
-
);
|
|
3062
|
-
}
|
|
3063
|
-
function PlanActionRow({ children }) {
|
|
3064
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "plan-action-row", className: "flex flex-col-reverse gap-2 @xl:flex-row", children });
|
|
3065
|
-
}
|
|
3066
|
-
function PlanActionButton({
|
|
3067
|
-
tone = "primary",
|
|
3068
|
-
fill,
|
|
3069
|
-
...props
|
|
3070
|
-
}) {
|
|
3071
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3072
|
-
ui.Button,
|
|
3073
|
-
{
|
|
3074
|
-
"data-slot": "plan-action-button",
|
|
3075
|
-
variant: tone === "muted" ? "ghost" : "default",
|
|
3076
|
-
...props,
|
|
3077
|
-
className: ui.cn(
|
|
3078
|
-
"w-full",
|
|
3079
|
-
fill && "sm:flex-1",
|
|
3080
|
-
tone === "muted" && "text-muted-foreground",
|
|
3081
|
-
props.className
|
|
3082
|
-
)
|
|
3083
|
-
}
|
|
3084
|
-
);
|
|
3085
|
-
}
|
|
3086
|
-
var DEFAULT_SUBSCRIPTION_STATUS_LABELS = {
|
|
3087
|
-
aiUsageResets: (date) => `AI usage resets ${date}`,
|
|
3088
|
-
cancelsAtPeriodEnd: "\xB7 Cancels at period end",
|
|
3089
|
-
cancelsAtEndOfBillingPeriod: "Cancels at end of billing period"
|
|
3090
|
-
};
|
|
3091
|
-
function SubscriptionStatusView({
|
|
3092
|
-
resetDate,
|
|
3093
|
-
isCanceling,
|
|
3094
|
-
meters,
|
|
3095
|
-
testIdPrefix,
|
|
3096
|
-
labels
|
|
3097
|
-
}) {
|
|
3098
|
-
const l = { ...DEFAULT_SUBSCRIPTION_STATUS_LABELS, ...labels };
|
|
3099
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "subscription-status", className: "space-y-3", children: [
|
|
3100
|
-
resetDate && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground", children: [
|
|
3101
|
-
l.aiUsageResets(resetDate),
|
|
3102
|
-
isCanceling && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-2 text-yellow-text", children: l.cancelsAtPeriodEnd })
|
|
3103
|
-
] }),
|
|
3104
|
-
!resetDate && isCanceling && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-yellow-text", children: l.cancelsAtEndOfBillingPeriod }),
|
|
3105
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: meters.map((m) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
3106
|
-
chunkQZTNTP75_cjs.UsageMeter,
|
|
3107
|
-
{
|
|
3108
|
-
icon: m.icon,
|
|
3109
|
-
label: m.label,
|
|
3110
|
-
value: m.value,
|
|
3111
|
-
pct: m.pct,
|
|
3112
|
-
testId: chunkMHVNT4J3_cjs.prefixedTestId(testIdPrefix, m.key, { testId: `project-quota-${m.key}` })
|
|
3113
|
-
},
|
|
3114
|
-
m.key
|
|
3115
|
-
)) })
|
|
3116
|
-
] });
|
|
3117
|
-
}
|
|
3118
|
-
function PlanDialogFrame({
|
|
3119
|
-
open,
|
|
3120
|
-
onOpenChange,
|
|
3121
|
-
title,
|
|
3122
|
-
description,
|
|
3123
|
-
isDescriptionHidden,
|
|
3124
|
-
projectName,
|
|
3125
|
-
projectTestId,
|
|
3126
|
-
children,
|
|
3127
|
-
labels
|
|
3128
|
-
}) {
|
|
3129
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogContent, { className: "max-w-5xl", children: [
|
|
3130
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { className: "flex-row items-start justify-between gap-3 space-y-0 pr-8", children: [
|
|
3131
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
3132
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: title }),
|
|
3133
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { className: isDescriptionHidden ? "sr-only" : void 0, children: description })
|
|
3134
|
-
] }),
|
|
3135
|
-
projectName !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3136
|
-
"span",
|
|
3137
|
-
{
|
|
3138
|
-
className: "shrink-0 text-sm text-muted-foreground",
|
|
3139
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(projectTestId, { testId: "change-plan-project" }),
|
|
3140
|
-
children: [
|
|
3141
|
-
labels?.project ?? "Project:",
|
|
3142
|
-
" ",
|
|
3143
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold text-foreground", children: projectName })
|
|
3144
|
-
]
|
|
3145
|
-
}
|
|
3146
|
-
)
|
|
3147
|
-
] }),
|
|
3148
|
-
children
|
|
3149
|
-
] }) });
|
|
3150
|
-
}
|
|
3151
|
-
var DEFAULT_CHECKOUT_DIALOG_LABELS = {
|
|
3152
|
-
unavailableTitle: "Stripe Not Configured",
|
|
3153
|
-
unavailableDescription: "Stripe checkout is not available. Please contact support.",
|
|
3154
|
-
title: "Payment",
|
|
3155
|
-
description: "Enter your card to start the plan",
|
|
3156
|
-
loading: "Loading\u2026",
|
|
3157
|
-
error: "Checkout didn't load. Try again."
|
|
3158
|
-
};
|
|
3159
|
-
function CheckoutDialogFrame({
|
|
3160
|
-
open,
|
|
3161
|
-
onOpenChange,
|
|
3162
|
-
isUnavailable,
|
|
3163
|
-
isLoading,
|
|
3164
|
-
hasError,
|
|
3165
|
-
children,
|
|
3166
|
-
labels
|
|
3167
|
-
}) {
|
|
3168
|
-
const l = { ...DEFAULT_CHECKOUT_DIALOG_LABELS, ...labels };
|
|
3169
|
-
if (isUnavailable) {
|
|
3170
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsx(ui.DialogContent, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { children: [
|
|
3171
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: l.unavailableTitle }),
|
|
3172
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { children: l.unavailableDescription })
|
|
3173
|
-
] }) }) });
|
|
3174
|
-
}
|
|
3175
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3176
|
-
ui.DialogContent,
|
|
3177
|
-
{
|
|
3178
|
-
presentation: "sheet",
|
|
3179
|
-
className: "flex max-h-[calc(100dvh-2rem)] max-w-2xl flex-col gap-0 overflow-hidden p-0",
|
|
3180
|
-
onInteractOutside: (e) => e.preventDefault(),
|
|
3181
|
-
onEscapeKeyDown: (e) => e.preventDefault(),
|
|
3182
|
-
children: [
|
|
3183
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { className: "flex-shrink-0 px-6 pb-3 pt-6", children: [
|
|
3184
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: l.title }),
|
|
3185
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { className: "sr-only", children: l.description })
|
|
3186
|
-
] }),
|
|
3187
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto px-6 pb-6", children: [
|
|
3188
|
-
isLoading && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-8 text-center text-muted-foreground", children: l.loading }),
|
|
3189
|
-
hasError && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-8 text-center text-destructive", children: l.error }),
|
|
3190
|
-
children
|
|
3191
|
-
] })
|
|
3192
|
-
]
|
|
3193
|
-
}
|
|
3194
|
-
) });
|
|
3195
|
-
}
|
|
3196
|
-
var DEFAULT_QUOTA_EXCEEDED_DIALOG_LABELS = {
|
|
3197
|
-
title: "AI usage used up",
|
|
3198
|
-
projectUsage: "Project usage",
|
|
3199
|
-
progress: "AI usage this month",
|
|
3200
|
-
project: "Project:",
|
|
3201
|
-
close: "Not now",
|
|
3202
|
-
upgrade: "Upgrade"
|
|
3203
|
-
};
|
|
3204
|
-
function QuotaExceededDialogView({
|
|
3205
|
-
open,
|
|
3206
|
-
onClose,
|
|
3207
|
-
onUpgrade,
|
|
3208
|
-
message,
|
|
3209
|
-
usage,
|
|
3210
|
-
actions,
|
|
3211
|
-
extra,
|
|
3212
|
-
labels
|
|
3213
|
-
}) {
|
|
3214
|
-
const l = { ...DEFAULT_QUOTA_EXCEEDED_DIALOG_LABELS, ...labels };
|
|
3215
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange: (o) => !o && onClose(), children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogContent, { className: "max-w-md", "data-testid": "quota-exceeded-modal", children: [
|
|
3216
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { children: [
|
|
3217
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: l.title }),
|
|
3218
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { children: message })
|
|
3219
|
-
] }),
|
|
3220
|
-
usage && /* @__PURE__ */ jsxRuntime.jsxs(chunkULWRNGGE_cjs.ModalSection, { className: "space-y-2", children: [
|
|
3221
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Progress, { value: usage.percent, "aria-label": l.progress }),
|
|
3222
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
3223
|
-
"div",
|
|
3224
|
-
{
|
|
3225
|
-
className: "flex flex-wrap items-center justify-between gap-x-3 text-sm text-muted-foreground",
|
|
3226
|
-
"data-testid": "quota-usage-readout",
|
|
3227
|
-
children: [
|
|
3228
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: usage.readout }),
|
|
3229
|
-
usage.projectId && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: usage.projectId })
|
|
3230
|
-
]
|
|
3231
|
-
}
|
|
3232
|
-
)
|
|
3233
|
-
] }),
|
|
3234
|
-
extra,
|
|
3235
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DialogFooter, { children: [
|
|
3236
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "outline", onClick: onClose, "data-testid": "quota-close-button", children: l.close }),
|
|
3237
|
-
actions ?? /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { onClick: onUpgrade, "data-testid": "quota-upgrade-button", children: l.upgrade })
|
|
3238
|
-
] })
|
|
3239
|
-
] }) });
|
|
3240
|
-
}
|
|
3241
|
-
function WelcomeProjectPicker({
|
|
3242
|
-
value,
|
|
3243
|
-
options,
|
|
3244
|
-
onChange,
|
|
3245
|
-
testId = "welcome-modal-project-select"
|
|
3246
|
-
}) {
|
|
3247
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Select, { value, onValueChange: onChange, children: [
|
|
3248
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3249
|
-
ui.SelectTrigger,
|
|
3250
|
-
{
|
|
3251
|
-
className: "h-7 w-auto max-w-[9.5rem] shrink-0 gap-1 border-none bg-muted px-2 text-xs font-medium pointer-coarse:h-11",
|
|
3252
|
-
"data-testid": testId,
|
|
3253
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(ui.SelectValue, {})
|
|
3254
|
-
}
|
|
3255
|
-
),
|
|
3256
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.SelectContent, { align: "end", children: options.map((o) => /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: o.id, children: o.name }, o.id)) })
|
|
3257
|
-
] });
|
|
3258
|
-
}
|
|
3259
|
-
var DEFAULT_SUBSCRIPTION_SECTION_LABELS = {
|
|
3260
|
-
loading: "Loading projects...",
|
|
3261
|
-
empty: "No projects yet \u2014 create one above."
|
|
3262
|
-
};
|
|
3263
|
-
function SubscriptionSectionView({
|
|
3264
|
-
intro,
|
|
3265
|
-
isLoading,
|
|
3266
|
-
isEmpty,
|
|
3267
|
-
children,
|
|
3268
|
-
labels
|
|
3269
|
-
}) {
|
|
3270
|
-
const l = { ...DEFAULT_SUBSCRIPTION_SECTION_LABELS, ...labels };
|
|
3271
|
-
if (isLoading) {
|
|
3272
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-4 text-sm text-muted-foreground", children: l.loading });
|
|
3273
|
-
}
|
|
3274
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "subscription-section", className: "space-y-4", children: [
|
|
3275
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: intro }),
|
|
3276
|
-
isEmpty ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg bg-muted py-8 text-center", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: l.empty }) }) : children
|
|
3277
|
-
] });
|
|
3278
|
-
}
|
|
3279
|
-
function ProjectGroup({ children }) {
|
|
3280
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "project-group", className: "space-y-2", children });
|
|
3281
|
-
}
|
|
3282
|
-
function ProjectPlanPicker({ children }) {
|
|
3283
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "project-plan-picker", className: "border-b pb-3", children });
|
|
3284
|
-
}
|
|
3285
|
-
function ProjectNameLabel({ children }) {
|
|
3286
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-sm font-medium", children });
|
|
3287
|
-
}
|
|
3288
|
-
function ProjectRowActions({ children }) {
|
|
3289
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "project-row-actions", className: "flex flex-shrink-0 items-center gap-0.5", children });
|
|
3290
|
-
}
|
|
3291
|
-
function RowIconAction({
|
|
3292
|
-
label,
|
|
3293
|
-
tooltip,
|
|
3294
|
-
icon,
|
|
3295
|
-
tone = "primary",
|
|
3296
|
-
disabled,
|
|
3297
|
-
onClick
|
|
3298
|
-
}) {
|
|
3299
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
|
|
3300
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3301
|
-
ui.Button,
|
|
3302
|
-
{
|
|
3303
|
-
variant: "ghost",
|
|
3304
|
-
size: "icon",
|
|
3305
|
-
className: ui.cn(
|
|
3306
|
-
"size-6 text-muted-foreground/50 pointer-coarse:size-11",
|
|
3307
|
-
tone === "destructive" ? "hover:text-destructive" : "hover:text-primary"
|
|
3308
|
-
),
|
|
3309
|
-
"aria-label": label,
|
|
3310
|
-
disabled,
|
|
3311
|
-
onClick,
|
|
3312
|
-
children: icon
|
|
3313
|
-
}
|
|
3314
|
-
) }) }),
|
|
3315
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { children: tooltip ?? label })
|
|
3316
|
-
] });
|
|
3317
|
-
}
|
|
3318
|
-
function RowButton({
|
|
3319
|
-
icon,
|
|
3320
|
-
children,
|
|
3321
|
-
onClick
|
|
3322
|
-
}) {
|
|
3323
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3324
|
-
ui.Button,
|
|
3325
|
-
{
|
|
3326
|
-
variant: "outline",
|
|
3327
|
-
size: "sm",
|
|
3328
|
-
className: "h-7 gap-1 px-2.5 text-sm pointer-coarse:h-11",
|
|
3329
|
-
onClick,
|
|
3330
|
-
children: [
|
|
3331
|
-
icon,
|
|
3332
|
-
children
|
|
3333
|
-
]
|
|
3334
|
-
}
|
|
3335
|
-
);
|
|
3336
|
-
}
|
|
3337
|
-
function UsageActionButton({
|
|
3338
|
-
label,
|
|
3339
|
-
icon,
|
|
3340
|
-
onClick
|
|
3341
|
-
}) {
|
|
3342
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
|
|
3343
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3344
|
-
ui.Button,
|
|
3345
|
-
{
|
|
3346
|
-
variant: "ghost",
|
|
3347
|
-
size: "icon",
|
|
3348
|
-
className: "size-6 text-muted-foreground hover:text-foreground pointer-coarse:size-11",
|
|
3349
|
-
"aria-label": label,
|
|
3350
|
-
onClick,
|
|
3351
|
-
children: icon
|
|
3352
|
-
}
|
|
3353
|
-
) }),
|
|
3354
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { children: label })
|
|
3355
|
-
] });
|
|
3356
|
-
}
|
|
3357
|
-
function UsageQuotaHint({ children }) {
|
|
3358
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 tabular-nums", children });
|
|
3359
|
-
}
|
|
3360
|
-
function UsageSection({
|
|
3361
|
-
title,
|
|
3362
|
-
action,
|
|
3363
|
-
children,
|
|
3364
|
-
footer,
|
|
3365
|
-
gap = "sm"
|
|
3366
|
-
}) {
|
|
3367
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "usage-section", className: gap === "md" ? "space-y-3" : void 0, children: [
|
|
3368
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: ui.cn("flex items-center justify-between", gap === "sm" && "mb-2"), children: [
|
|
3369
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-medium text-muted-foreground", children: title }),
|
|
3370
|
-
action
|
|
3371
|
-
] }),
|
|
3372
|
-
children,
|
|
3373
|
-
footer && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2", children: footer })
|
|
3374
|
-
] });
|
|
3375
|
-
}
|
|
3376
|
-
var DEFAULT_ERROR_DIALOG_LABELS = {
|
|
3377
|
-
title: "Something Went Wrong",
|
|
3378
|
-
srDescription: "Error dialog",
|
|
3379
|
-
reportHint: "Please click below to report the error to our support team if you have not done so already.",
|
|
3380
|
-
refreshHint: "Clicking Refresh Session will attempt to refresh your session, which may help resolve the error.",
|
|
3381
|
-
hideDetails: "Hide Details",
|
|
3382
|
-
viewDetails: "View Details",
|
|
3383
|
-
toggleDetailsAria: "Toggle error details",
|
|
3384
|
-
copyAria: "Copy error details",
|
|
3385
|
-
copy: "Copy error",
|
|
3386
|
-
copied: "Copied",
|
|
3387
|
-
refreshSession: "Refresh Session",
|
|
3388
|
-
logout: "Logout"
|
|
3389
|
-
};
|
|
3390
|
-
function ErrorDialogView({
|
|
3391
|
-
details,
|
|
3392
|
-
report,
|
|
3393
|
-
onRefresh,
|
|
3394
|
-
onLogout,
|
|
3395
|
-
labels
|
|
3396
|
-
}) {
|
|
3397
|
-
const l = { ...DEFAULT_ERROR_DIALOG_LABELS, ...labels };
|
|
3398
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open: true, onOpenChange: () => {
|
|
3399
|
-
}, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3400
|
-
ui.DialogContent,
|
|
3401
|
-
{
|
|
3402
|
-
presentation: "sheet",
|
|
3403
|
-
className: "flex max-h-panel w-modal max-w-modal-vw flex-col overflow-hidden p-0",
|
|
3404
|
-
"data-testid": "error-boundary-modal",
|
|
3405
|
-
hideCloseButton: true,
|
|
3406
|
-
children: [
|
|
3407
|
-
/* @__PURE__ */ jsxRuntime.jsxs(chunkULWRNGGE_cjs.ModalHeader, { children: [
|
|
3408
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
3409
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircle, { className: "text-red-text", size: 24 }),
|
|
3410
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: l.title })
|
|
3411
|
-
] }) }),
|
|
3412
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { className: "sr-only", children: l.srDescription })
|
|
3413
|
-
] }),
|
|
3414
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-auto px-6 pb-6", children: /* @__PURE__ */ jsxRuntime.jsxs(chunkULWRNGGE_cjs.ModalSection, { "data-testid": "error-boundary", children: [
|
|
3415
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4 text-sm text-muted-foreground", children: l.reportHint }),
|
|
3416
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4 text-sm text-muted-foreground", children: l.refreshHint }),
|
|
3417
|
-
details?.isShown && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4 rounded border border-border bg-background p-3", children: /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "max-h-96 overflow-auto whitespace-pre-wrap font-mono text-sm", children: details.text }) }),
|
|
3418
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full flex-col gap-2", children: [
|
|
3419
|
-
details && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full gap-2", children: [
|
|
3420
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
3421
|
-
ui.Button,
|
|
3422
|
-
{
|
|
3423
|
-
variant: "outline",
|
|
3424
|
-
className: "flex-1",
|
|
3425
|
-
onClick: details.onToggle,
|
|
3426
|
-
"aria-label": l.toggleDetailsAria,
|
|
3427
|
-
"data-testid": "error-boundary-view-details",
|
|
3428
|
-
children: [
|
|
3429
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "mr-2 size-4" }),
|
|
3430
|
-
details.isShown ? l.hideDetails : l.viewDetails
|
|
3431
|
-
]
|
|
3432
|
-
}
|
|
3433
|
-
),
|
|
3434
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
3435
|
-
ui.Button,
|
|
3436
|
-
{
|
|
3437
|
-
variant: "outline",
|
|
3438
|
-
className: "flex-1",
|
|
3439
|
-
onClick: details.onCopy,
|
|
3440
|
-
"aria-label": l.copyAria,
|
|
3441
|
-
"data-testid": "error-boundary-copy-details",
|
|
3442
|
-
children: [
|
|
3443
|
-
details.isCopied ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "mr-2 size-4 text-green-text" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, { className: "mr-2 size-4" }),
|
|
3444
|
-
details.isCopied ? l.copied : l.copy
|
|
3445
|
-
]
|
|
3446
|
-
}
|
|
3447
|
-
)
|
|
3448
|
-
] }),
|
|
3449
|
-
report,
|
|
3450
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
3451
|
-
ui.Button,
|
|
3452
|
-
{
|
|
3453
|
-
variant: "outline",
|
|
3454
|
-
className: "w-full",
|
|
3455
|
-
onClick: onRefresh,
|
|
3456
|
-
"aria-label": "Refresh session",
|
|
3457
|
-
children: [
|
|
3458
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.RefreshCw, { className: "mr-2 size-4" }),
|
|
3459
|
-
l.refreshSession
|
|
3460
|
-
]
|
|
3461
|
-
}
|
|
3462
|
-
),
|
|
3463
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { variant: "outline", className: "w-full", onClick: onLogout, "aria-label": "Logout", children: [
|
|
3464
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.LogOut, { className: "mr-2 size-4" }),
|
|
3465
|
-
l.logout
|
|
3466
|
-
] })
|
|
3467
|
-
] })
|
|
3468
|
-
] }) })
|
|
3469
|
-
]
|
|
3470
|
-
}
|
|
3471
|
-
) });
|
|
3472
|
-
}
|
|
3473
|
-
var SCHEME_OPTIONS = [
|
|
3474
|
-
{ value: "light", label: "Light", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sun, { className: "h-4 w-4" }) },
|
|
3475
|
-
{ value: "dark", label: "Dark", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Moon, { className: "h-4 w-4" }) }
|
|
3476
|
-
].map((option) => ({ ...option, testId: `appearance-scheme-${option.value}` }));
|
|
3477
|
-
var TEXT_SIZE_OPTIONS = [
|
|
3478
|
-
{ value: "default", label: "Default" },
|
|
3479
|
-
{ value: "large", label: "Large" },
|
|
3480
|
-
{ value: "larger", label: "Larger" }
|
|
3481
|
-
].map((option) => ({ ...option, testId: `appearance-text-size-${option.value}` }));
|
|
3482
|
-
var DEFAULT_APPEARANCE_PAIRING_IDS = [
|
|
3483
|
-
"office",
|
|
3484
|
-
"inter",
|
|
3485
|
-
"fraunces-inter",
|
|
3486
|
-
"montserrat-nunito"
|
|
3487
|
-
];
|
|
3488
|
-
function AppearanceSettings({
|
|
3489
|
-
colorScheme,
|
|
3490
|
-
onColorSchemeChange,
|
|
3491
|
-
textSize,
|
|
3492
|
-
onTextSizeChange,
|
|
3493
|
-
pairingId,
|
|
3494
|
-
onPairingChange,
|
|
3495
|
-
pairingIds = DEFAULT_APPEARANCE_PAIRING_IDS,
|
|
3496
|
-
onReset
|
|
3497
|
-
}) {
|
|
3498
|
-
const activePairing = chunkNWNVWO6L_cjs.getFontPairing(pairingId) ?? chunkNWNVWO6L_cjs.getFontPairing(pairingIds[0]);
|
|
3499
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(chunkU73KPFYH_cjs.SettingsPanel, { testId: "settings-appearance", children: [
|
|
3500
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3501
|
-
chunkU73KPFYH_cjs.SettingsSection,
|
|
3502
|
-
{
|
|
3503
|
-
title: "Colour scheme",
|
|
3504
|
-
action: onReset && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3505
|
-
"button",
|
|
3506
|
-
{
|
|
3507
|
-
type: "button",
|
|
3508
|
-
onClick: onReset,
|
|
3509
|
-
className: "flex items-center gap-1.5 py-1 text-sm text-muted-foreground hover:text-foreground pointer-coarse:min-h-11",
|
|
3510
|
-
"data-testid": "appearance-reset",
|
|
3511
|
-
children: [
|
|
3512
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.RotateCcw, { className: "h-3 w-3" }),
|
|
3513
|
-
"Reset"
|
|
3514
|
-
]
|
|
3515
|
-
}
|
|
3516
|
-
),
|
|
3517
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3518
|
-
SegmentedControl,
|
|
3519
|
-
{
|
|
3520
|
-
value: colorScheme,
|
|
3521
|
-
onChange: onColorSchemeChange,
|
|
3522
|
-
options: SCHEME_OPTIONS,
|
|
3523
|
-
ariaLabel: "Colour scheme"
|
|
3524
|
-
}
|
|
3525
|
-
)
|
|
3526
|
-
}
|
|
3527
|
-
),
|
|
3528
|
-
/* @__PURE__ */ jsxRuntime.jsxs(chunkU73KPFYH_cjs.SettingsSection, { title: "Text size", children: [
|
|
3529
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3530
|
-
SegmentedControl,
|
|
3531
|
-
{
|
|
3532
|
-
value: textSize,
|
|
3533
|
-
onChange: onTextSizeChange,
|
|
3534
|
-
options: TEXT_SIZE_OPTIONS,
|
|
3535
|
-
ariaLabel: "Text size"
|
|
3536
|
-
}
|
|
3537
|
-
),
|
|
3538
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "Makes all text larger, including documents in the viewer and citations. Applied straight away and remembered on this device." })
|
|
3539
|
-
] }),
|
|
3540
|
-
/* @__PURE__ */ jsxRuntime.jsxs(chunkU73KPFYH_cjs.SettingsSection, { title: "Typeface", children: [
|
|
3541
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.Select, { value: pairingId, onValueChange: onPairingChange, children: [
|
|
3542
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.SelectTrigger, { className: "w-full", "data-testid": "appearance-typeface-select", children: /* @__PURE__ */ jsxRuntime.jsx(ui.SelectValue, { children: activePairing && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontFamily: activePairing.display }, children: activePairing.label }) }) }),
|
|
3543
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.SelectContent, { children: pairingIds.map((id) => {
|
|
3544
|
-
const pairing = chunkNWNVWO6L_cjs.getFontPairing(id);
|
|
3545
|
-
if (!pairing) return null;
|
|
3546
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: id, "data-testid": `appearance-typeface-${id}`, children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontFamily: pairing.display }, children: pairing.label }) }, id);
|
|
3547
|
-
}) })
|
|
3548
|
-
] }),
|
|
3549
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "Sets the headings and body text across the app. Applied straight away and remembered on this device." })
|
|
3550
|
-
] })
|
|
3551
|
-
] });
|
|
3552
|
-
}
|
|
3553
|
-
|
|
3554
|
-
Object.defineProperty(exports, "ModalBreadcrumbHeader", {
|
|
23
|
+
Object.defineProperty(exports, "ActiveSessionsDialog", {
|
|
3555
24
|
enumerable: true,
|
|
3556
|
-
get: function () { return
|
|
25
|
+
get: function () { return chunkU37AYUPI_cjs.ActiveSessionsDialog; }
|
|
3557
26
|
});
|
|
3558
|
-
Object.defineProperty(exports, "
|
|
27
|
+
Object.defineProperty(exports, "AppearanceSettings", {
|
|
3559
28
|
enumerable: true,
|
|
3560
|
-
get: function () { return
|
|
29
|
+
get: function () { return chunkU37AYUPI_cjs.AppearanceSettings; }
|
|
3561
30
|
});
|
|
3562
|
-
Object.defineProperty(exports, "
|
|
31
|
+
Object.defineProperty(exports, "AvatarPicker", {
|
|
3563
32
|
enumerable: true,
|
|
3564
|
-
get: function () { return
|
|
33
|
+
get: function () { return chunkU37AYUPI_cjs.AvatarPicker; }
|
|
3565
34
|
});
|
|
3566
|
-
Object.defineProperty(exports, "
|
|
35
|
+
Object.defineProperty(exports, "CONVERSATION_TITLE_MAX", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
get: function () { return chunkU37AYUPI_cjs.CONVERSATION_TITLE_MAX; }
|
|
38
|
+
});
|
|
39
|
+
Object.defineProperty(exports, "CheckoutDialogFrame", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
get: function () { return chunkU37AYUPI_cjs.CheckoutDialogFrame; }
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(exports, "ConfigSwitcherBar", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () { return chunkU37AYUPI_cjs.ConfigSwitcherBar; }
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(exports, "ConnectionCard", {
|
|
3567
48
|
enumerable: true,
|
|
3568
|
-
get: function () { return
|
|
49
|
+
get: function () { return chunkU37AYUPI_cjs.ConnectionCard; }
|
|
50
|
+
});
|
|
51
|
+
Object.defineProperty(exports, "ConnectionsEmpty", {
|
|
52
|
+
enumerable: true,
|
|
53
|
+
get: function () { return chunkU37AYUPI_cjs.ConnectionsEmpty; }
|
|
54
|
+
});
|
|
55
|
+
Object.defineProperty(exports, "ConnectionsError", {
|
|
56
|
+
enumerable: true,
|
|
57
|
+
get: function () { return chunkU37AYUPI_cjs.ConnectionsError; }
|
|
58
|
+
});
|
|
59
|
+
Object.defineProperty(exports, "ConnectionsLoading", {
|
|
60
|
+
enumerable: true,
|
|
61
|
+
get: function () { return chunkU37AYUPI_cjs.ConnectionsLoading; }
|
|
62
|
+
});
|
|
63
|
+
Object.defineProperty(exports, "ConversationTitleSection", {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
get: function () { return chunkU37AYUPI_cjs.ConversationTitleSection; }
|
|
3569
66
|
});
|
|
3570
67
|
Object.defineProperty(exports, "DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS", {
|
|
3571
68
|
enumerable: true,
|
|
3572
|
-
get: function () { return
|
|
69
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS; }
|
|
70
|
+
});
|
|
71
|
+
Object.defineProperty(exports, "DEFAULT_APPEARANCE_PAIRING_IDS", {
|
|
72
|
+
enumerable: true,
|
|
73
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_APPEARANCE_PAIRING_IDS; }
|
|
3573
74
|
});
|
|
3574
75
|
Object.defineProperty(exports, "DEFAULT_AVATAR_PICKER_LABELS", {
|
|
3575
76
|
enumerable: true,
|
|
3576
|
-
get: function () { return
|
|
77
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_AVATAR_PICKER_LABELS; }
|
|
78
|
+
});
|
|
79
|
+
Object.defineProperty(exports, "DEFAULT_CHECKOUT_DIALOG_LABELS", {
|
|
80
|
+
enumerable: true,
|
|
81
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_CHECKOUT_DIALOG_LABELS; }
|
|
82
|
+
});
|
|
83
|
+
Object.defineProperty(exports, "DEFAULT_CONFIG_SWITCHER_BAR_LABELS", {
|
|
84
|
+
enumerable: true,
|
|
85
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_CONFIG_SWITCHER_BAR_LABELS; }
|
|
86
|
+
});
|
|
87
|
+
Object.defineProperty(exports, "DEFAULT_CONNECTION_CARD_LABELS", {
|
|
88
|
+
enumerable: true,
|
|
89
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_CONNECTION_CARD_LABELS; }
|
|
90
|
+
});
|
|
91
|
+
Object.defineProperty(exports, "DEFAULT_CONVERSATION_TITLE_SECTION_LABELS", {
|
|
92
|
+
enumerable: true,
|
|
93
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_CONVERSATION_TITLE_SECTION_LABELS; }
|
|
94
|
+
});
|
|
95
|
+
Object.defineProperty(exports, "DEFAULT_DAILY_CAP_FIELD_LABELS", {
|
|
96
|
+
enumerable: true,
|
|
97
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_DAILY_CAP_FIELD_LABELS; }
|
|
3577
98
|
});
|
|
3578
99
|
Object.defineProperty(exports, "DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS", {
|
|
3579
100
|
enumerable: true,
|
|
3580
|
-
get: function () { return
|
|
101
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS; }
|
|
102
|
+
});
|
|
103
|
+
Object.defineProperty(exports, "DEFAULT_EMAIL_WORKSPACE_DIALOG_LABELS", {
|
|
104
|
+
enumerable: true,
|
|
105
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_EMAIL_WORKSPACE_DIALOG_LABELS; }
|
|
106
|
+
});
|
|
107
|
+
Object.defineProperty(exports, "DEFAULT_ERROR_DIALOG_LABELS", {
|
|
108
|
+
enumerable: true,
|
|
109
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_ERROR_DIALOG_LABELS; }
|
|
3581
110
|
});
|
|
3582
111
|
Object.defineProperty(exports, "DEFAULT_IDENTITY_VERIFICATION_LABELS", {
|
|
3583
112
|
enumerable: true,
|
|
3584
|
-
get: function () { return
|
|
113
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_IDENTITY_VERIFICATION_LABELS; }
|
|
114
|
+
});
|
|
115
|
+
Object.defineProperty(exports, "DEFAULT_INLINE_NAME_EDITOR_LABELS", {
|
|
116
|
+
enumerable: true,
|
|
117
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_INLINE_NAME_EDITOR_LABELS; }
|
|
118
|
+
});
|
|
119
|
+
Object.defineProperty(exports, "DEFAULT_INVITE_CONTACTS_DIALOG_LABELS", {
|
|
120
|
+
enumerable: true,
|
|
121
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_INVITE_CONTACTS_DIALOG_LABELS; }
|
|
122
|
+
});
|
|
123
|
+
Object.defineProperty(exports, "DEFAULT_INVOICES_DIALOG_LABELS", {
|
|
124
|
+
enumerable: true,
|
|
125
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_INVOICES_DIALOG_LABELS; }
|
|
3585
126
|
});
|
|
3586
127
|
Object.defineProperty(exports, "DEFAULT_LOGOUT_DIALOG_LABELS", {
|
|
3587
128
|
enumerable: true,
|
|
3588
|
-
get: function () { return
|
|
129
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_LOGOUT_DIALOG_LABELS; }
|
|
130
|
+
});
|
|
131
|
+
Object.defineProperty(exports, "DEFAULT_MEMBER_PROJECT_ROW_LABELS", {
|
|
132
|
+
enumerable: true,
|
|
133
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_MEMBER_PROJECT_ROW_LABELS; }
|
|
134
|
+
});
|
|
135
|
+
Object.defineProperty(exports, "DEFAULT_MODEL_SELECTION_SECTION_LABELS", {
|
|
136
|
+
enumerable: true,
|
|
137
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_MODEL_SELECTION_SECTION_LABELS; }
|
|
3589
138
|
});
|
|
3590
139
|
Object.defineProperty(exports, "DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS", {
|
|
3591
140
|
enumerable: true,
|
|
3592
|
-
get: function () { return
|
|
141
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS; }
|
|
142
|
+
});
|
|
143
|
+
Object.defineProperty(exports, "DEFAULT_PLAN_CARD_LABELS", {
|
|
144
|
+
enumerable: true,
|
|
145
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_PLAN_CARD_LABELS; }
|
|
3593
146
|
});
|
|
3594
147
|
Object.defineProperty(exports, "DEFAULT_PROFILE_CARD_LABELS", {
|
|
3595
148
|
enumerable: true,
|
|
3596
|
-
get: function () { return
|
|
149
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_PROFILE_CARD_LABELS; }
|
|
150
|
+
});
|
|
151
|
+
Object.defineProperty(exports, "DEFAULT_PROJECT_CARD_VIEW_LABELS", {
|
|
152
|
+
enumerable: true,
|
|
153
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_PROJECT_CARD_VIEW_LABELS; }
|
|
154
|
+
});
|
|
155
|
+
Object.defineProperty(exports, "DEFAULT_PROJECT_DETAIL_HEADER_LABELS", {
|
|
156
|
+
enumerable: true,
|
|
157
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_PROJECT_DETAIL_HEADER_LABELS; }
|
|
158
|
+
});
|
|
159
|
+
Object.defineProperty(exports, "DEFAULT_PROJECT_LIST_LABELS", {
|
|
160
|
+
enumerable: true,
|
|
161
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_PROJECT_LIST_LABELS; }
|
|
162
|
+
});
|
|
163
|
+
Object.defineProperty(exports, "DEFAULT_QUOTA_EXCEEDED_DIALOG_LABELS", {
|
|
164
|
+
enumerable: true,
|
|
165
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_QUOTA_EXCEEDED_DIALOG_LABELS; }
|
|
166
|
+
});
|
|
167
|
+
Object.defineProperty(exports, "DEFAULT_REFERRAL_REWARD_LABELS", {
|
|
168
|
+
enumerable: true,
|
|
169
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_REFERRAL_REWARD_LABELS; }
|
|
170
|
+
});
|
|
171
|
+
Object.defineProperty(exports, "DEFAULT_RENAME_DIALOG_LABELS", {
|
|
172
|
+
enumerable: true,
|
|
173
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_RENAME_DIALOG_LABELS; }
|
|
3597
174
|
});
|
|
3598
175
|
Object.defineProperty(exports, "DEFAULT_SETTINGS_DANGER_ZONE_LABELS", {
|
|
3599
176
|
enumerable: true,
|
|
3600
|
-
get: function () { return
|
|
177
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_SETTINGS_DANGER_ZONE_LABELS; }
|
|
178
|
+
});
|
|
179
|
+
Object.defineProperty(exports, "DEFAULT_SHARED_PROJECTS_SECTION_LABELS", {
|
|
180
|
+
enumerable: true,
|
|
181
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_SHARED_PROJECTS_SECTION_LABELS; }
|
|
182
|
+
});
|
|
183
|
+
Object.defineProperty(exports, "DEFAULT_SUBSCRIPTION_SECTION_LABELS", {
|
|
184
|
+
enumerable: true,
|
|
185
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_SUBSCRIPTION_SECTION_LABELS; }
|
|
186
|
+
});
|
|
187
|
+
Object.defineProperty(exports, "DEFAULT_SUBSCRIPTION_STATUS_LABELS", {
|
|
188
|
+
enumerable: true,
|
|
189
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_SUBSCRIPTION_STATUS_LABELS; }
|
|
190
|
+
});
|
|
191
|
+
Object.defineProperty(exports, "DEFAULT_SUPPORT_PANEL_LABELS", {
|
|
192
|
+
enumerable: true,
|
|
193
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_SUPPORT_PANEL_LABELS; }
|
|
194
|
+
});
|
|
195
|
+
Object.defineProperty(exports, "DEFAULT_SYNC_DIALOG_FOOTER_LABELS", {
|
|
196
|
+
enumerable: true,
|
|
197
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_SYNC_DIALOG_FOOTER_LABELS; }
|
|
198
|
+
});
|
|
199
|
+
Object.defineProperty(exports, "DEFAULT_SYNC_FOLDER_ROW_LABELS", {
|
|
200
|
+
enumerable: true,
|
|
201
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_SYNC_FOLDER_ROW_LABELS; }
|
|
202
|
+
});
|
|
203
|
+
Object.defineProperty(exports, "DEFAULT_TIPS_EDITOR_LABELS", {
|
|
204
|
+
enumerable: true,
|
|
205
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_TIPS_EDITOR_LABELS; }
|
|
206
|
+
});
|
|
207
|
+
Object.defineProperty(exports, "DEFAULT_USAGE_LINE_CHART_LABELS", {
|
|
208
|
+
enumerable: true,
|
|
209
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_USAGE_LINE_CHART_LABELS; }
|
|
210
|
+
});
|
|
211
|
+
Object.defineProperty(exports, "DEFAULT_USAGE_PANEL_LABELS", {
|
|
212
|
+
enumerable: true,
|
|
213
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_USAGE_PANEL_LABELS; }
|
|
214
|
+
});
|
|
215
|
+
Object.defineProperty(exports, "DEFAULT_USAGE_PROPORTION_BAR_LABELS", {
|
|
216
|
+
enumerable: true,
|
|
217
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_USAGE_PROPORTION_BAR_LABELS; }
|
|
218
|
+
});
|
|
219
|
+
Object.defineProperty(exports, "DEFAULT_WELCOME_DIALOG_LABELS", {
|
|
220
|
+
enumerable: true,
|
|
221
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_WELCOME_DIALOG_LABELS; }
|
|
3601
222
|
});
|
|
3602
223
|
Object.defineProperty(exports, "DEFAULT_WORK_OFFLINE_LABELS", {
|
|
3603
224
|
enumerable: true,
|
|
3604
|
-
get: function () { return
|
|
225
|
+
get: function () { return chunkU37AYUPI_cjs.DEFAULT_WORK_OFFLINE_LABELS; }
|
|
226
|
+
});
|
|
227
|
+
Object.defineProperty(exports, "DailyCapField", {
|
|
228
|
+
enumerable: true,
|
|
229
|
+
get: function () { return chunkU37AYUPI_cjs.DailyCapField; }
|
|
3605
230
|
});
|
|
3606
231
|
Object.defineProperty(exports, "DeleteAccountDialog", {
|
|
3607
232
|
enumerable: true,
|
|
3608
|
-
get: function () { return
|
|
233
|
+
get: function () { return chunkU37AYUPI_cjs.DeleteAccountDialog; }
|
|
3609
234
|
});
|
|
3610
235
|
Object.defineProperty(exports, "DraggableHeader", {
|
|
3611
236
|
enumerable: true,
|
|
3612
|
-
get: function () { return
|
|
237
|
+
get: function () { return chunkU37AYUPI_cjs.DraggableHeader; }
|
|
3613
238
|
});
|
|
3614
239
|
Object.defineProperty(exports, "EMAIL_NOTIFICATION_CATEGORIES", {
|
|
3615
240
|
enumerable: true,
|
|
3616
|
-
get: function () { return
|
|
241
|
+
get: function () { return chunkU37AYUPI_cjs.EMAIL_NOTIFICATION_CATEGORIES; }
|
|
3617
242
|
});
|
|
3618
243
|
Object.defineProperty(exports, "EMAIL_NOTIFICATION_KEYS", {
|
|
3619
244
|
enumerable: true,
|
|
3620
|
-
get: function () { return
|
|
245
|
+
get: function () { return chunkU37AYUPI_cjs.EMAIL_NOTIFICATION_KEYS; }
|
|
246
|
+
});
|
|
247
|
+
Object.defineProperty(exports, "EmailWorkspaceDialogView", {
|
|
248
|
+
enumerable: true,
|
|
249
|
+
get: function () { return chunkU37AYUPI_cjs.EmailWorkspaceDialogView; }
|
|
250
|
+
});
|
|
251
|
+
Object.defineProperty(exports, "ErrorDialogView", {
|
|
252
|
+
enumerable: true,
|
|
253
|
+
get: function () { return chunkU37AYUPI_cjs.ErrorDialogView; }
|
|
254
|
+
});
|
|
255
|
+
Object.defineProperty(exports, "FilterChip", {
|
|
256
|
+
enumerable: true,
|
|
257
|
+
get: function () { return chunkU37AYUPI_cjs.FilterChip; }
|
|
258
|
+
});
|
|
259
|
+
Object.defineProperty(exports, "FloatingPanel", {
|
|
260
|
+
enumerable: true,
|
|
261
|
+
get: function () { return chunkU37AYUPI_cjs.FloatingPanel; }
|
|
3621
262
|
});
|
|
3622
263
|
Object.defineProperty(exports, "IdentityVerificationCard", {
|
|
3623
264
|
enumerable: true,
|
|
3624
|
-
get: function () { return
|
|
265
|
+
get: function () { return chunkU37AYUPI_cjs.IdentityVerificationCard; }
|
|
3625
266
|
});
|
|
3626
267
|
Object.defineProperty(exports, "IdentityVerificationDialog", {
|
|
3627
268
|
enumerable: true,
|
|
3628
|
-
get: function () { return
|
|
269
|
+
get: function () { return chunkU37AYUPI_cjs.IdentityVerificationDialog; }
|
|
270
|
+
});
|
|
271
|
+
Object.defineProperty(exports, "InlineNameEditor", {
|
|
272
|
+
enumerable: true,
|
|
273
|
+
get: function () { return chunkU37AYUPI_cjs.InlineNameEditor; }
|
|
274
|
+
});
|
|
275
|
+
Object.defineProperty(exports, "InviteContactsDialog", {
|
|
276
|
+
enumerable: true,
|
|
277
|
+
get: function () { return chunkU37AYUPI_cjs.InviteContactsDialog; }
|
|
278
|
+
});
|
|
279
|
+
Object.defineProperty(exports, "InvoicesDialog", {
|
|
280
|
+
enumerable: true,
|
|
281
|
+
get: function () { return chunkU37AYUPI_cjs.InvoicesDialog; }
|
|
282
|
+
});
|
|
283
|
+
Object.defineProperty(exports, "JsonTree", {
|
|
284
|
+
enumerable: true,
|
|
285
|
+
get: function () { return chunkU37AYUPI_cjs.JsonTree; }
|
|
3629
286
|
});
|
|
3630
287
|
Object.defineProperty(exports, "LogoutDialog", {
|
|
3631
288
|
enumerable: true,
|
|
3632
|
-
get: function () { return
|
|
289
|
+
get: function () { return chunkU37AYUPI_cjs.LogoutDialog; }
|
|
290
|
+
});
|
|
291
|
+
Object.defineProperty(exports, "MemberProjectRow", {
|
|
292
|
+
enumerable: true,
|
|
293
|
+
get: function () { return chunkU37AYUPI_cjs.MemberProjectRow; }
|
|
294
|
+
});
|
|
295
|
+
Object.defineProperty(exports, "MessageJsonTree", {
|
|
296
|
+
enumerable: true,
|
|
297
|
+
get: function () { return chunkU37AYUPI_cjs.MessageJsonTree; }
|
|
3633
298
|
});
|
|
3634
299
|
Object.defineProperty(exports, "ModelProviderLabel", {
|
|
3635
300
|
enumerable: true,
|
|
3636
|
-
get: function () { return
|
|
301
|
+
get: function () { return chunkU37AYUPI_cjs.ModelProviderLabel; }
|
|
302
|
+
});
|
|
303
|
+
Object.defineProperty(exports, "ModelSelectionSection", {
|
|
304
|
+
enumerable: true,
|
|
305
|
+
get: function () { return chunkU37AYUPI_cjs.ModelSelectionSection; }
|
|
306
|
+
});
|
|
307
|
+
Object.defineProperty(exports, "MoreInfo", {
|
|
308
|
+
enumerable: true,
|
|
309
|
+
get: function () { return chunkU37AYUPI_cjs.MoreInfo; }
|
|
310
|
+
});
|
|
311
|
+
Object.defineProperty(exports, "MoreInfoList", {
|
|
312
|
+
enumerable: true,
|
|
313
|
+
get: function () { return chunkU37AYUPI_cjs.MoreInfoList; }
|
|
3637
314
|
});
|
|
3638
315
|
Object.defineProperty(exports, "NotificationCategoryList", {
|
|
3639
316
|
enumerable: true,
|
|
3640
|
-
get: function () { return
|
|
317
|
+
get: function () { return chunkU37AYUPI_cjs.NotificationCategoryList; }
|
|
3641
318
|
});
|
|
3642
319
|
Object.defineProperty(exports, "PanelActionsRow", {
|
|
3643
320
|
enumerable: true,
|
|
3644
|
-
get: function () { return
|
|
321
|
+
get: function () { return chunkU37AYUPI_cjs.PanelActionsRow; }
|
|
3645
322
|
});
|
|
3646
323
|
Object.defineProperty(exports, "PanelAddButton", {
|
|
3647
324
|
enumerable: true,
|
|
3648
|
-
get: function () { return
|
|
325
|
+
get: function () { return chunkU37AYUPI_cjs.PanelAddButton; }
|
|
3649
326
|
});
|
|
3650
327
|
Object.defineProperty(exports, "PanelFrame", {
|
|
3651
328
|
enumerable: true,
|
|
3652
|
-
get: function () { return
|
|
329
|
+
get: function () { return chunkU37AYUPI_cjs.PanelFrame; }
|
|
3653
330
|
});
|
|
3654
331
|
Object.defineProperty(exports, "PanelFrameBody", {
|
|
3655
332
|
enumerable: true,
|
|
3656
|
-
get: function () { return
|
|
333
|
+
get: function () { return chunkU37AYUPI_cjs.PanelFrameBody; }
|
|
3657
334
|
});
|
|
3658
335
|
Object.defineProperty(exports, "PanelNote", {
|
|
3659
336
|
enumerable: true,
|
|
3660
|
-
get: function () { return
|
|
337
|
+
get: function () { return chunkU37AYUPI_cjs.PanelNote; }
|
|
3661
338
|
});
|
|
3662
339
|
Object.defineProperty(exports, "PanelScroll", {
|
|
3663
340
|
enumerable: true,
|
|
3664
|
-
get: function () { return
|
|
341
|
+
get: function () { return chunkU37AYUPI_cjs.PanelScroll; }
|
|
3665
342
|
});
|
|
3666
343
|
Object.defineProperty(exports, "PanelTitleBar", {
|
|
3667
344
|
enumerable: true,
|
|
3668
|
-
get: function () { return
|
|
345
|
+
get: function () { return chunkU37AYUPI_cjs.PanelTitleBar; }
|
|
3669
346
|
});
|
|
3670
347
|
Object.defineProperty(exports, "PasswordChangeDialog", {
|
|
3671
348
|
enumerable: true,
|
|
3672
|
-
get: function () { return
|
|
349
|
+
get: function () { return chunkU37AYUPI_cjs.PasswordChangeDialog; }
|
|
350
|
+
});
|
|
351
|
+
Object.defineProperty(exports, "PlanActionButton", {
|
|
352
|
+
enumerable: true,
|
|
353
|
+
get: function () { return chunkU37AYUPI_cjs.PlanActionButton; }
|
|
354
|
+
});
|
|
355
|
+
Object.defineProperty(exports, "PlanActionRow", {
|
|
356
|
+
enumerable: true,
|
|
357
|
+
get: function () { return chunkU37AYUPI_cjs.PlanActionRow; }
|
|
358
|
+
});
|
|
359
|
+
Object.defineProperty(exports, "PlanBadge", {
|
|
360
|
+
enumerable: true,
|
|
361
|
+
get: function () { return chunkU37AYUPI_cjs.PlanBadge; }
|
|
362
|
+
});
|
|
363
|
+
Object.defineProperty(exports, "PlanCard", {
|
|
364
|
+
enumerable: true,
|
|
365
|
+
get: function () { return chunkU37AYUPI_cjs.PlanCard; }
|
|
366
|
+
});
|
|
367
|
+
Object.defineProperty(exports, "PlanCardGrid", {
|
|
368
|
+
enumerable: true,
|
|
369
|
+
get: function () { return chunkU37AYUPI_cjs.PlanCardGrid; }
|
|
370
|
+
});
|
|
371
|
+
Object.defineProperty(exports, "PlanDialogFrame", {
|
|
372
|
+
enumerable: true,
|
|
373
|
+
get: function () { return chunkU37AYUPI_cjs.PlanDialogFrame; }
|
|
374
|
+
});
|
|
375
|
+
Object.defineProperty(exports, "PlanInfoPopover", {
|
|
376
|
+
enumerable: true,
|
|
377
|
+
get: function () { return chunkU37AYUPI_cjs.PlanInfoPopover; }
|
|
378
|
+
});
|
|
379
|
+
Object.defineProperty(exports, "PlanNotice", {
|
|
380
|
+
enumerable: true,
|
|
381
|
+
get: function () { return chunkU37AYUPI_cjs.PlanNotice; }
|
|
382
|
+
});
|
|
383
|
+
Object.defineProperty(exports, "PlanPickerCard", {
|
|
384
|
+
enumerable: true,
|
|
385
|
+
get: function () { return chunkU37AYUPI_cjs.PlanPickerCard; }
|
|
386
|
+
});
|
|
387
|
+
Object.defineProperty(exports, "PlanPickerHeader", {
|
|
388
|
+
enumerable: true,
|
|
389
|
+
get: function () { return chunkU37AYUPI_cjs.PlanPickerHeader; }
|
|
390
|
+
});
|
|
391
|
+
Object.defineProperty(exports, "PlanStack", {
|
|
392
|
+
enumerable: true,
|
|
393
|
+
get: function () { return chunkU37AYUPI_cjs.PlanStack; }
|
|
394
|
+
});
|
|
395
|
+
Object.defineProperty(exports, "PlanTierOption", {
|
|
396
|
+
enumerable: true,
|
|
397
|
+
get: function () { return chunkU37AYUPI_cjs.PlanTierOption; }
|
|
398
|
+
});
|
|
399
|
+
Object.defineProperty(exports, "PlanTransition", {
|
|
400
|
+
enumerable: true,
|
|
401
|
+
get: function () { return chunkU37AYUPI_cjs.PlanTransition; }
|
|
3673
402
|
});
|
|
3674
403
|
Object.defineProperty(exports, "PremiumModelsFrame", {
|
|
3675
404
|
enumerable: true,
|
|
3676
|
-
get: function () { return
|
|
405
|
+
get: function () { return chunkU37AYUPI_cjs.PremiumModelsFrame; }
|
|
406
|
+
});
|
|
407
|
+
Object.defineProperty(exports, "PricingToggle", {
|
|
408
|
+
enumerable: true,
|
|
409
|
+
get: function () { return chunkU37AYUPI_cjs.PricingToggle; }
|
|
3677
410
|
});
|
|
3678
411
|
Object.defineProperty(exports, "ProfileCard", {
|
|
3679
412
|
enumerable: true,
|
|
3680
|
-
get: function () { return
|
|
413
|
+
get: function () { return chunkU37AYUPI_cjs.ProfileCard; }
|
|
414
|
+
});
|
|
415
|
+
Object.defineProperty(exports, "ProjectCardView", {
|
|
416
|
+
enumerable: true,
|
|
417
|
+
get: function () { return chunkU37AYUPI_cjs.ProjectCardView; }
|
|
418
|
+
});
|
|
419
|
+
Object.defineProperty(exports, "ProjectDetailHeader", {
|
|
420
|
+
enumerable: true,
|
|
421
|
+
get: function () { return chunkU37AYUPI_cjs.ProjectDetailHeader; }
|
|
422
|
+
});
|
|
423
|
+
Object.defineProperty(exports, "ProjectDetailSection", {
|
|
424
|
+
enumerable: true,
|
|
425
|
+
get: function () { return chunkU37AYUPI_cjs.ProjectDetailSection; }
|
|
426
|
+
});
|
|
427
|
+
Object.defineProperty(exports, "ProjectGroup", {
|
|
428
|
+
enumerable: true,
|
|
429
|
+
get: function () { return chunkU37AYUPI_cjs.ProjectGroup; }
|
|
430
|
+
});
|
|
431
|
+
Object.defineProperty(exports, "ProjectList", {
|
|
432
|
+
enumerable: true,
|
|
433
|
+
get: function () { return chunkU37AYUPI_cjs.ProjectList; }
|
|
434
|
+
});
|
|
435
|
+
Object.defineProperty(exports, "ProjectNameLabel", {
|
|
436
|
+
enumerable: true,
|
|
437
|
+
get: function () { return chunkU37AYUPI_cjs.ProjectNameLabel; }
|
|
438
|
+
});
|
|
439
|
+
Object.defineProperty(exports, "ProjectPlanPicker", {
|
|
440
|
+
enumerable: true,
|
|
441
|
+
get: function () { return chunkU37AYUPI_cjs.ProjectPlanPicker; }
|
|
442
|
+
});
|
|
443
|
+
Object.defineProperty(exports, "ProjectRow", {
|
|
444
|
+
enumerable: true,
|
|
445
|
+
get: function () { return chunkU37AYUPI_cjs.ProjectRow; }
|
|
446
|
+
});
|
|
447
|
+
Object.defineProperty(exports, "ProjectRowActions", {
|
|
448
|
+
enumerable: true,
|
|
449
|
+
get: function () { return chunkU37AYUPI_cjs.ProjectRowActions; }
|
|
450
|
+
});
|
|
451
|
+
Object.defineProperty(exports, "PromoCodeInput", {
|
|
452
|
+
enumerable: true,
|
|
453
|
+
get: function () { return chunkU37AYUPI_cjs.PromoCodeInput; }
|
|
454
|
+
});
|
|
455
|
+
Object.defineProperty(exports, "QuotaExceededDialogView", {
|
|
456
|
+
enumerable: true,
|
|
457
|
+
get: function () { return chunkU37AYUPI_cjs.QuotaExceededDialogView; }
|
|
458
|
+
});
|
|
459
|
+
Object.defineProperty(exports, "QuotaMeter", {
|
|
460
|
+
enumerable: true,
|
|
461
|
+
get: function () { return chunkU37AYUPI_cjs.QuotaMeter; }
|
|
462
|
+
});
|
|
463
|
+
Object.defineProperty(exports, "ReferralRewardBadge", {
|
|
464
|
+
enumerable: true,
|
|
465
|
+
get: function () { return chunkU37AYUPI_cjs.ReferralRewardBadge; }
|
|
466
|
+
});
|
|
467
|
+
Object.defineProperty(exports, "ReferralRewardNote", {
|
|
468
|
+
enumerable: true,
|
|
469
|
+
get: function () { return chunkU37AYUPI_cjs.ReferralRewardNote; }
|
|
470
|
+
});
|
|
471
|
+
Object.defineProperty(exports, "ReferralRewardSummary", {
|
|
472
|
+
enumerable: true,
|
|
473
|
+
get: function () { return chunkU37AYUPI_cjs.ReferralRewardSummary; }
|
|
474
|
+
});
|
|
475
|
+
Object.defineProperty(exports, "RenameDialog", {
|
|
476
|
+
enumerable: true,
|
|
477
|
+
get: function () { return chunkU37AYUPI_cjs.RenameDialog; }
|
|
3681
478
|
});
|
|
3682
479
|
Object.defineProperty(exports, "RequireVerified", {
|
|
3683
480
|
enumerable: true,
|
|
3684
|
-
get: function () { return
|
|
481
|
+
get: function () { return chunkU37AYUPI_cjs.RequireVerified; }
|
|
482
|
+
});
|
|
483
|
+
Object.defineProperty(exports, "RowButton", {
|
|
484
|
+
enumerable: true,
|
|
485
|
+
get: function () { return chunkU37AYUPI_cjs.RowButton; }
|
|
486
|
+
});
|
|
487
|
+
Object.defineProperty(exports, "RowIconAction", {
|
|
488
|
+
enumerable: true,
|
|
489
|
+
get: function () { return chunkU37AYUPI_cjs.RowIconAction; }
|
|
490
|
+
});
|
|
491
|
+
Object.defineProperty(exports, "SegmentedControl", {
|
|
492
|
+
enumerable: true,
|
|
493
|
+
get: function () { return chunkU37AYUPI_cjs.SegmentedControl; }
|
|
3685
494
|
});
|
|
3686
495
|
Object.defineProperty(exports, "ServerConnectionButton", {
|
|
3687
496
|
enumerable: true,
|
|
3688
|
-
get: function () { return
|
|
497
|
+
get: function () { return chunkU37AYUPI_cjs.ServerConnectionButton; }
|
|
3689
498
|
});
|
|
3690
499
|
Object.defineProperty(exports, "SettingsActionRow", {
|
|
3691
500
|
enumerable: true,
|
|
3692
|
-
get: function () { return
|
|
501
|
+
get: function () { return chunkU37AYUPI_cjs.SettingsActionRow; }
|
|
3693
502
|
});
|
|
3694
503
|
Object.defineProperty(exports, "SettingsCard", {
|
|
3695
504
|
enumerable: true,
|
|
3696
|
-
get: function () { return
|
|
505
|
+
get: function () { return chunkU37AYUPI_cjs.SettingsCard; }
|
|
3697
506
|
});
|
|
3698
507
|
Object.defineProperty(exports, "SettingsDangerZone", {
|
|
3699
508
|
enumerable: true,
|
|
3700
|
-
get: function () { return
|
|
509
|
+
get: function () { return chunkU37AYUPI_cjs.SettingsDangerZone; }
|
|
3701
510
|
});
|
|
3702
511
|
Object.defineProperty(exports, "SettingsPage", {
|
|
3703
512
|
enumerable: true,
|
|
3704
|
-
get: function () { return
|
|
513
|
+
get: function () { return chunkU37AYUPI_cjs.SettingsPage; }
|
|
3705
514
|
});
|
|
3706
515
|
Object.defineProperty(exports, "SettingsPanel", {
|
|
3707
516
|
enumerable: true,
|
|
3708
|
-
get: function () { return
|
|
517
|
+
get: function () { return chunkU37AYUPI_cjs.SettingsPanel; }
|
|
3709
518
|
});
|
|
3710
519
|
Object.defineProperty(exports, "SettingsRow", {
|
|
3711
520
|
enumerable: true,
|
|
3712
|
-
get: function () { return
|
|
521
|
+
get: function () { return chunkU37AYUPI_cjs.SettingsRow; }
|
|
3713
522
|
});
|
|
3714
523
|
Object.defineProperty(exports, "SettingsSection", {
|
|
3715
524
|
enumerable: true,
|
|
3716
|
-
get: function () { return
|
|
525
|
+
get: function () { return chunkU37AYUPI_cjs.SettingsSection; }
|
|
3717
526
|
});
|
|
3718
527
|
Object.defineProperty(exports, "SettingsSwitchGroup", {
|
|
3719
528
|
enumerable: true,
|
|
3720
|
-
get: function () { return
|
|
529
|
+
get: function () { return chunkU37AYUPI_cjs.SettingsSwitchGroup; }
|
|
3721
530
|
});
|
|
3722
531
|
Object.defineProperty(exports, "SettingsSwitchRow", {
|
|
3723
532
|
enumerable: true,
|
|
3724
|
-
get: function () { return
|
|
533
|
+
get: function () { return chunkU37AYUPI_cjs.SettingsSwitchRow; }
|
|
534
|
+
});
|
|
535
|
+
Object.defineProperty(exports, "SharedProjectRow", {
|
|
536
|
+
enumerable: true,
|
|
537
|
+
get: function () { return chunkU37AYUPI_cjs.SharedProjectRow; }
|
|
538
|
+
});
|
|
539
|
+
Object.defineProperty(exports, "SharedProjectsSection", {
|
|
540
|
+
enumerable: true,
|
|
541
|
+
get: function () { return chunkU37AYUPI_cjs.SharedProjectsSection; }
|
|
542
|
+
});
|
|
543
|
+
Object.defineProperty(exports, "SubscriptionSectionView", {
|
|
544
|
+
enumerable: true,
|
|
545
|
+
get: function () { return chunkU37AYUPI_cjs.SubscriptionSectionView; }
|
|
546
|
+
});
|
|
547
|
+
Object.defineProperty(exports, "SubscriptionStatusView", {
|
|
548
|
+
enumerable: true,
|
|
549
|
+
get: function () { return chunkU37AYUPI_cjs.SubscriptionStatusView; }
|
|
550
|
+
});
|
|
551
|
+
Object.defineProperty(exports, "SupportPanel", {
|
|
552
|
+
enumerable: true,
|
|
553
|
+
get: function () { return chunkU37AYUPI_cjs.SupportPanel; }
|
|
554
|
+
});
|
|
555
|
+
Object.defineProperty(exports, "SupportUnavailable", {
|
|
556
|
+
enumerable: true,
|
|
557
|
+
get: function () { return chunkU37AYUPI_cjs.SupportUnavailable; }
|
|
558
|
+
});
|
|
559
|
+
Object.defineProperty(exports, "SyncCheckList", {
|
|
560
|
+
enumerable: true,
|
|
561
|
+
get: function () { return chunkU37AYUPI_cjs.SyncCheckList; }
|
|
562
|
+
});
|
|
563
|
+
Object.defineProperty(exports, "SyncDialogBody", {
|
|
564
|
+
enumerable: true,
|
|
565
|
+
get: function () { return chunkU37AYUPI_cjs.SyncDialogBody; }
|
|
566
|
+
});
|
|
567
|
+
Object.defineProperty(exports, "SyncDialogFooter", {
|
|
568
|
+
enumerable: true,
|
|
569
|
+
get: function () { return chunkU37AYUPI_cjs.SyncDialogFooter; }
|
|
570
|
+
});
|
|
571
|
+
Object.defineProperty(exports, "SyncField", {
|
|
572
|
+
enumerable: true,
|
|
573
|
+
get: function () { return chunkU37AYUPI_cjs.SyncField; }
|
|
574
|
+
});
|
|
575
|
+
Object.defineProperty(exports, "SyncFolderRow", {
|
|
576
|
+
enumerable: true,
|
|
577
|
+
get: function () { return chunkU37AYUPI_cjs.SyncFolderRow; }
|
|
578
|
+
});
|
|
579
|
+
Object.defineProperty(exports, "SyncFolderStatus", {
|
|
580
|
+
enumerable: true,
|
|
581
|
+
get: function () { return chunkU37AYUPI_cjs.SyncFolderStatus; }
|
|
582
|
+
});
|
|
583
|
+
Object.defineProperty(exports, "SyncLinkButton", {
|
|
584
|
+
enumerable: true,
|
|
585
|
+
get: function () { return chunkU37AYUPI_cjs.SyncLinkButton; }
|
|
586
|
+
});
|
|
587
|
+
Object.defineProperty(exports, "SyncLinkRow", {
|
|
588
|
+
enumerable: true,
|
|
589
|
+
get: function () { return chunkU37AYUPI_cjs.SyncLinkRow; }
|
|
590
|
+
});
|
|
591
|
+
Object.defineProperty(exports, "SyncLoading", {
|
|
592
|
+
enumerable: true,
|
|
593
|
+
get: function () { return chunkU37AYUPI_cjs.SyncLoading; }
|
|
594
|
+
});
|
|
595
|
+
Object.defineProperty(exports, "SyncNote", {
|
|
596
|
+
enumerable: true,
|
|
597
|
+
get: function () { return chunkU37AYUPI_cjs.SyncNote; }
|
|
598
|
+
});
|
|
599
|
+
Object.defineProperty(exports, "SyncOptionToggle", {
|
|
600
|
+
enumerable: true,
|
|
601
|
+
get: function () { return chunkU37AYUPI_cjs.SyncOptionToggle; }
|
|
602
|
+
});
|
|
603
|
+
Object.defineProperty(exports, "SyncOptions", {
|
|
604
|
+
enumerable: true,
|
|
605
|
+
get: function () { return chunkU37AYUPI_cjs.SyncOptions; }
|
|
606
|
+
});
|
|
607
|
+
Object.defineProperty(exports, "SyncReconnectNotice", {
|
|
608
|
+
enumerable: true,
|
|
609
|
+
get: function () { return chunkU37AYUPI_cjs.SyncReconnectNotice; }
|
|
610
|
+
});
|
|
611
|
+
Object.defineProperty(exports, "SyncSelect", {
|
|
612
|
+
enumerable: true,
|
|
613
|
+
get: function () { return chunkU37AYUPI_cjs.SyncSelect; }
|
|
614
|
+
});
|
|
615
|
+
Object.defineProperty(exports, "SyncSmallNote", {
|
|
616
|
+
enumerable: true,
|
|
617
|
+
get: function () { return chunkU37AYUPI_cjs.SyncSmallNote; }
|
|
618
|
+
});
|
|
619
|
+
Object.defineProperty(exports, "SyncTreeFrame", {
|
|
620
|
+
enumerable: true,
|
|
621
|
+
get: function () { return chunkU37AYUPI_cjs.SyncTreeFrame; }
|
|
622
|
+
});
|
|
623
|
+
Object.defineProperty(exports, "ThreadPreviewDialog", {
|
|
624
|
+
enumerable: true,
|
|
625
|
+
get: function () { return chunkU37AYUPI_cjs.ThreadPreviewDialog; }
|
|
626
|
+
});
|
|
627
|
+
Object.defineProperty(exports, "TipsEditorDialog", {
|
|
628
|
+
enumerable: true,
|
|
629
|
+
get: function () { return chunkU37AYUPI_cjs.TipsEditorDialog; }
|
|
630
|
+
});
|
|
631
|
+
Object.defineProperty(exports, "UsageActionButton", {
|
|
632
|
+
enumerable: true,
|
|
633
|
+
get: function () { return chunkU37AYUPI_cjs.UsageActionButton; }
|
|
634
|
+
});
|
|
635
|
+
Object.defineProperty(exports, "UsageLegend", {
|
|
636
|
+
enumerable: true,
|
|
637
|
+
get: function () { return chunkU37AYUPI_cjs.UsageLegend; }
|
|
638
|
+
});
|
|
639
|
+
Object.defineProperty(exports, "UsageLineChart", {
|
|
640
|
+
enumerable: true,
|
|
641
|
+
get: function () { return chunkU37AYUPI_cjs.UsageLineChart; }
|
|
642
|
+
});
|
|
643
|
+
Object.defineProperty(exports, "UsagePanel", {
|
|
644
|
+
enumerable: true,
|
|
645
|
+
get: function () { return chunkU37AYUPI_cjs.UsagePanel; }
|
|
646
|
+
});
|
|
647
|
+
Object.defineProperty(exports, "UsageProportionBar", {
|
|
648
|
+
enumerable: true,
|
|
649
|
+
get: function () { return chunkU37AYUPI_cjs.UsageProportionBar; }
|
|
650
|
+
});
|
|
651
|
+
Object.defineProperty(exports, "UsageQuotaHint", {
|
|
652
|
+
enumerable: true,
|
|
653
|
+
get: function () { return chunkU37AYUPI_cjs.UsageQuotaHint; }
|
|
654
|
+
});
|
|
655
|
+
Object.defineProperty(exports, "UsageSection", {
|
|
656
|
+
enumerable: true,
|
|
657
|
+
get: function () { return chunkU37AYUPI_cjs.UsageSection; }
|
|
658
|
+
});
|
|
659
|
+
Object.defineProperty(exports, "UsageSummary", {
|
|
660
|
+
enumerable: true,
|
|
661
|
+
get: function () { return chunkU37AYUPI_cjs.UsageSummary; }
|
|
662
|
+
});
|
|
663
|
+
Object.defineProperty(exports, "UsageToggle", {
|
|
664
|
+
enumerable: true,
|
|
665
|
+
get: function () { return chunkU37AYUPI_cjs.UsageToggle; }
|
|
666
|
+
});
|
|
667
|
+
Object.defineProperty(exports, "WelcomeDialog", {
|
|
668
|
+
enumerable: true,
|
|
669
|
+
get: function () { return chunkU37AYUPI_cjs.WelcomeDialog; }
|
|
670
|
+
});
|
|
671
|
+
Object.defineProperty(exports, "WelcomeProjectPicker", {
|
|
672
|
+
enumerable: true,
|
|
673
|
+
get: function () { return chunkU37AYUPI_cjs.WelcomeProjectPicker; }
|
|
3725
674
|
});
|
|
3726
675
|
Object.defineProperty(exports, "WorkOfflineToggle", {
|
|
3727
676
|
enumerable: true,
|
|
3728
|
-
get: function () { return
|
|
677
|
+
get: function () { return chunkU37AYUPI_cjs.WorkOfflineToggle; }
|
|
3729
678
|
});
|
|
3730
679
|
Object.defineProperty(exports, "formatSessionTtl", {
|
|
3731
680
|
enumerable: true,
|
|
3732
|
-
get: function () { return
|
|
681
|
+
get: function () { return chunkU37AYUPI_cjs.formatSessionTtl; }
|
|
3733
682
|
});
|
|
3734
683
|
Object.defineProperty(exports, "resolveSettingsSection", {
|
|
3735
684
|
enumerable: true,
|
|
3736
|
-
get: function () { return
|
|
685
|
+
get: function () { return chunkU37AYUPI_cjs.resolveSettingsSection; }
|
|
3737
686
|
});
|
|
3738
687
|
Object.defineProperty(exports, "serverConnectionView", {
|
|
3739
688
|
enumerable: true,
|
|
3740
|
-
get: function () { return
|
|
689
|
+
get: function () { return chunkU37AYUPI_cjs.serverConnectionView; }
|
|
3741
690
|
});
|
|
3742
691
|
Object.defineProperty(exports, "toActiveSessionViews", {
|
|
3743
692
|
enumerable: true,
|
|
3744
|
-
get: function () { return
|
|
693
|
+
get: function () { return chunkU37AYUPI_cjs.toActiveSessionViews; }
|
|
3745
694
|
});
|
|
3746
695
|
Object.defineProperty(exports, "toDeleteBlockerViews", {
|
|
3747
696
|
enumerable: true,
|
|
3748
|
-
get: function () { return
|
|
697
|
+
get: function () { return chunkU37AYUPI_cjs.toDeleteBlockerViews; }
|
|
3749
698
|
});
|
|
3750
699
|
Object.defineProperty(exports, "toLogoutSessionViews", {
|
|
3751
700
|
enumerable: true,
|
|
3752
|
-
get: function () { return
|
|
701
|
+
get: function () { return chunkU37AYUPI_cjs.toLogoutSessionViews; }
|
|
3753
702
|
});
|
|
3754
703
|
Object.defineProperty(exports, "toNotificationCategories", {
|
|
3755
704
|
enumerable: true,
|
|
3756
|
-
get: function () { return
|
|
705
|
+
get: function () { return chunkU37AYUPI_cjs.toNotificationCategories; }
|
|
706
|
+
});
|
|
707
|
+
Object.defineProperty(exports, "ModalBreadcrumbHeader", {
|
|
708
|
+
enumerable: true,
|
|
709
|
+
get: function () { return chunk223D4727_cjs.ModalBreadcrumbHeader; }
|
|
710
|
+
});
|
|
711
|
+
Object.defineProperty(exports, "ModalCrumbs", {
|
|
712
|
+
enumerable: true,
|
|
713
|
+
get: function () { return chunk223D4727_cjs.ModalCrumbs; }
|
|
3757
714
|
});
|
|
3758
715
|
Object.defineProperty(exports, "MultiSelect", {
|
|
3759
716
|
enumerable: true,
|
|
@@ -3803,127 +760,5 @@ Object.defineProperty(exports, "ModalSectionTitle", {
|
|
|
3803
760
|
enumerable: true,
|
|
3804
761
|
get: function () { return chunkULWRNGGE_cjs.ModalSectionTitle; }
|
|
3805
762
|
});
|
|
3806
|
-
exports.AppearanceSettings = AppearanceSettings;
|
|
3807
|
-
exports.CONVERSATION_TITLE_MAX = CONVERSATION_TITLE_MAX;
|
|
3808
|
-
exports.CheckoutDialogFrame = CheckoutDialogFrame;
|
|
3809
|
-
exports.ConfigSwitcherBar = ConfigSwitcherBar;
|
|
3810
|
-
exports.ConnectionCard = ConnectionCard;
|
|
3811
|
-
exports.ConnectionsEmpty = ConnectionsEmpty;
|
|
3812
|
-
exports.ConnectionsError = ConnectionsError;
|
|
3813
|
-
exports.ConnectionsLoading = ConnectionsLoading;
|
|
3814
|
-
exports.ConversationTitleSection = ConversationTitleSection;
|
|
3815
|
-
exports.DEFAULT_APPEARANCE_PAIRING_IDS = DEFAULT_APPEARANCE_PAIRING_IDS;
|
|
3816
|
-
exports.DEFAULT_CHECKOUT_DIALOG_LABELS = DEFAULT_CHECKOUT_DIALOG_LABELS;
|
|
3817
|
-
exports.DEFAULT_CONFIG_SWITCHER_BAR_LABELS = DEFAULT_CONFIG_SWITCHER_BAR_LABELS;
|
|
3818
|
-
exports.DEFAULT_CONNECTION_CARD_LABELS = DEFAULT_CONNECTION_CARD_LABELS;
|
|
3819
|
-
exports.DEFAULT_CONVERSATION_TITLE_SECTION_LABELS = DEFAULT_CONVERSATION_TITLE_SECTION_LABELS;
|
|
3820
|
-
exports.DEFAULT_DAILY_CAP_FIELD_LABELS = DEFAULT_DAILY_CAP_FIELD_LABELS;
|
|
3821
|
-
exports.DEFAULT_EMAIL_WORKSPACE_DIALOG_LABELS = DEFAULT_EMAIL_WORKSPACE_DIALOG_LABELS;
|
|
3822
|
-
exports.DEFAULT_ERROR_DIALOG_LABELS = DEFAULT_ERROR_DIALOG_LABELS;
|
|
3823
|
-
exports.DEFAULT_INLINE_NAME_EDITOR_LABELS = DEFAULT_INLINE_NAME_EDITOR_LABELS;
|
|
3824
|
-
exports.DEFAULT_INVITE_CONTACTS_DIALOG_LABELS = DEFAULT_INVITE_CONTACTS_DIALOG_LABELS;
|
|
3825
|
-
exports.DEFAULT_INVOICES_DIALOG_LABELS = DEFAULT_INVOICES_DIALOG_LABELS;
|
|
3826
|
-
exports.DEFAULT_MEMBER_PROJECT_ROW_LABELS = DEFAULT_MEMBER_PROJECT_ROW_LABELS;
|
|
3827
|
-
exports.DEFAULT_MODEL_SELECTION_SECTION_LABELS = DEFAULT_MODEL_SELECTION_SECTION_LABELS;
|
|
3828
|
-
exports.DEFAULT_PLAN_CARD_LABELS = DEFAULT_PLAN_CARD_LABELS;
|
|
3829
|
-
exports.DEFAULT_PROJECT_CARD_VIEW_LABELS = DEFAULT_PROJECT_CARD_VIEW_LABELS;
|
|
3830
|
-
exports.DEFAULT_PROJECT_DETAIL_HEADER_LABELS = DEFAULT_PROJECT_DETAIL_HEADER_LABELS;
|
|
3831
|
-
exports.DEFAULT_PROJECT_LIST_LABELS = DEFAULT_PROJECT_LIST_LABELS;
|
|
3832
|
-
exports.DEFAULT_QUOTA_EXCEEDED_DIALOG_LABELS = DEFAULT_QUOTA_EXCEEDED_DIALOG_LABELS;
|
|
3833
|
-
exports.DEFAULT_REFERRAL_REWARD_LABELS = DEFAULT_REFERRAL_REWARD_LABELS;
|
|
3834
|
-
exports.DEFAULT_RENAME_DIALOG_LABELS = DEFAULT_RENAME_DIALOG_LABELS;
|
|
3835
|
-
exports.DEFAULT_SHARED_PROJECTS_SECTION_LABELS = DEFAULT_SHARED_PROJECTS_SECTION_LABELS;
|
|
3836
|
-
exports.DEFAULT_SUBSCRIPTION_SECTION_LABELS = DEFAULT_SUBSCRIPTION_SECTION_LABELS;
|
|
3837
|
-
exports.DEFAULT_SUBSCRIPTION_STATUS_LABELS = DEFAULT_SUBSCRIPTION_STATUS_LABELS;
|
|
3838
|
-
exports.DEFAULT_SUPPORT_PANEL_LABELS = DEFAULT_SUPPORT_PANEL_LABELS;
|
|
3839
|
-
exports.DEFAULT_SYNC_DIALOG_FOOTER_LABELS = DEFAULT_SYNC_DIALOG_FOOTER_LABELS;
|
|
3840
|
-
exports.DEFAULT_SYNC_FOLDER_ROW_LABELS = DEFAULT_SYNC_FOLDER_ROW_LABELS;
|
|
3841
|
-
exports.DEFAULT_TIPS_EDITOR_LABELS = DEFAULT_TIPS_EDITOR_LABELS;
|
|
3842
|
-
exports.DEFAULT_USAGE_LINE_CHART_LABELS = DEFAULT_USAGE_LINE_CHART_LABELS;
|
|
3843
|
-
exports.DEFAULT_USAGE_PANEL_LABELS = DEFAULT_USAGE_PANEL_LABELS;
|
|
3844
|
-
exports.DEFAULT_USAGE_PROPORTION_BAR_LABELS = DEFAULT_USAGE_PROPORTION_BAR_LABELS;
|
|
3845
|
-
exports.DEFAULT_WELCOME_DIALOG_LABELS = DEFAULT_WELCOME_DIALOG_LABELS;
|
|
3846
|
-
exports.DailyCapField = DailyCapField;
|
|
3847
|
-
exports.EmailWorkspaceDialogView = EmailWorkspaceDialogView;
|
|
3848
|
-
exports.ErrorDialogView = ErrorDialogView;
|
|
3849
|
-
exports.FilterChip = FilterChip;
|
|
3850
|
-
exports.FloatingPanel = FloatingPanel;
|
|
3851
|
-
exports.InlineNameEditor = InlineNameEditor;
|
|
3852
|
-
exports.InviteContactsDialog = InviteContactsDialog;
|
|
3853
|
-
exports.InvoicesDialog = InvoicesDialog;
|
|
3854
|
-
exports.JsonTree = JsonTree;
|
|
3855
|
-
exports.MemberProjectRow = MemberProjectRow;
|
|
3856
|
-
exports.MessageJsonTree = MessageJsonTree;
|
|
3857
|
-
exports.ModelSelectionSection = ModelSelectionSection;
|
|
3858
|
-
exports.MoreInfo = MoreInfo;
|
|
3859
|
-
exports.MoreInfoList = MoreInfoList;
|
|
3860
|
-
exports.PlanActionButton = PlanActionButton;
|
|
3861
|
-
exports.PlanActionRow = PlanActionRow;
|
|
3862
|
-
exports.PlanBadge = PlanBadge;
|
|
3863
|
-
exports.PlanCard = PlanCard;
|
|
3864
|
-
exports.PlanCardGrid = PlanCardGrid;
|
|
3865
|
-
exports.PlanDialogFrame = PlanDialogFrame;
|
|
3866
|
-
exports.PlanInfoPopover = PlanInfoPopover;
|
|
3867
|
-
exports.PlanNotice = PlanNotice;
|
|
3868
|
-
exports.PlanPickerCard = PlanPickerCard;
|
|
3869
|
-
exports.PlanPickerHeader = PlanPickerHeader;
|
|
3870
|
-
exports.PlanStack = PlanStack;
|
|
3871
|
-
exports.PlanTierOption = PlanTierOption;
|
|
3872
|
-
exports.PlanTransition = PlanTransition;
|
|
3873
|
-
exports.PricingToggle = PricingToggle;
|
|
3874
|
-
exports.ProjectCardView = ProjectCardView;
|
|
3875
|
-
exports.ProjectDetailHeader = ProjectDetailHeader;
|
|
3876
|
-
exports.ProjectDetailSection = ProjectDetailSection;
|
|
3877
|
-
exports.ProjectGroup = ProjectGroup;
|
|
3878
|
-
exports.ProjectList = ProjectList;
|
|
3879
|
-
exports.ProjectNameLabel = ProjectNameLabel;
|
|
3880
|
-
exports.ProjectPlanPicker = ProjectPlanPicker;
|
|
3881
|
-
exports.ProjectRow = ProjectRow;
|
|
3882
|
-
exports.ProjectRowActions = ProjectRowActions;
|
|
3883
|
-
exports.PromoCodeInput = PromoCodeInput;
|
|
3884
|
-
exports.QuotaExceededDialogView = QuotaExceededDialogView;
|
|
3885
|
-
exports.QuotaMeter = QuotaMeter;
|
|
3886
|
-
exports.ReferralRewardBadge = ReferralRewardBadge;
|
|
3887
|
-
exports.ReferralRewardNote = ReferralRewardNote;
|
|
3888
|
-
exports.ReferralRewardSummary = ReferralRewardSummary;
|
|
3889
|
-
exports.RenameDialog = RenameDialog;
|
|
3890
|
-
exports.RowButton = RowButton;
|
|
3891
|
-
exports.RowIconAction = RowIconAction;
|
|
3892
|
-
exports.SegmentedControl = SegmentedControl;
|
|
3893
|
-
exports.SharedProjectRow = SharedProjectRow;
|
|
3894
|
-
exports.SharedProjectsSection = SharedProjectsSection;
|
|
3895
|
-
exports.SubscriptionSectionView = SubscriptionSectionView;
|
|
3896
|
-
exports.SubscriptionStatusView = SubscriptionStatusView;
|
|
3897
|
-
exports.SupportPanel = SupportPanel;
|
|
3898
|
-
exports.SupportUnavailable = SupportUnavailable;
|
|
3899
|
-
exports.SyncCheckList = SyncCheckList;
|
|
3900
|
-
exports.SyncDialogBody = SyncDialogBody;
|
|
3901
|
-
exports.SyncDialogFooter = SyncDialogFooter;
|
|
3902
|
-
exports.SyncField = SyncField;
|
|
3903
|
-
exports.SyncFolderRow = SyncFolderRow;
|
|
3904
|
-
exports.SyncFolderStatus = SyncFolderStatus;
|
|
3905
|
-
exports.SyncLinkButton = SyncLinkButton;
|
|
3906
|
-
exports.SyncLinkRow = SyncLinkRow;
|
|
3907
|
-
exports.SyncLoading = SyncLoading;
|
|
3908
|
-
exports.SyncNote = SyncNote;
|
|
3909
|
-
exports.SyncOptionToggle = SyncOptionToggle;
|
|
3910
|
-
exports.SyncOptions = SyncOptions;
|
|
3911
|
-
exports.SyncReconnectNotice = SyncReconnectNotice;
|
|
3912
|
-
exports.SyncSelect = SyncSelect;
|
|
3913
|
-
exports.SyncSmallNote = SyncSmallNote;
|
|
3914
|
-
exports.SyncTreeFrame = SyncTreeFrame;
|
|
3915
|
-
exports.ThreadPreviewDialog = ThreadPreviewDialog;
|
|
3916
|
-
exports.TipsEditorDialog = TipsEditorDialog;
|
|
3917
|
-
exports.UsageActionButton = UsageActionButton;
|
|
3918
|
-
exports.UsageLegend = UsageLegend;
|
|
3919
|
-
exports.UsageLineChart = UsageLineChart;
|
|
3920
|
-
exports.UsagePanel = UsagePanel;
|
|
3921
|
-
exports.UsageProportionBar = UsageProportionBar;
|
|
3922
|
-
exports.UsageQuotaHint = UsageQuotaHint;
|
|
3923
|
-
exports.UsageSection = UsageSection;
|
|
3924
|
-
exports.UsageSummary = UsageSummary;
|
|
3925
|
-
exports.UsageToggle = UsageToggle;
|
|
3926
|
-
exports.WelcomeDialog = WelcomeDialog;
|
|
3927
|
-
exports.WelcomeProjectPicker = WelcomeProjectPicker;
|
|
3928
763
|
//# sourceMappingURL=index.cjs.map
|
|
3929
764
|
//# sourceMappingURL=index.cjs.map
|