@arbidocs/blocks 0.4.146 → 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.
Files changed (74) hide show
  1. package/dist/agents/index.cjs +262 -262
  2. package/dist/agents/index.js +5 -5
  3. package/dist/{chunk-MFMASSEO.cjs → chunk-AINU3EJ6.cjs} +8 -8
  4. package/dist/{chunk-MFMASSEO.cjs.map → chunk-AINU3EJ6.cjs.map} +1 -1
  5. package/dist/{chunk-O2GW5IY6.cjs → chunk-AO7SK6WP.cjs} +29 -29
  6. package/dist/{chunk-O2GW5IY6.cjs.map → chunk-AO7SK6WP.cjs.map} +1 -1
  7. package/dist/{chunk-OBWYM25Y.js → chunk-DAHCRVPM.js} +3 -3
  8. package/dist/{chunk-OBWYM25Y.js.map → chunk-DAHCRVPM.js.map} +1 -1
  9. package/dist/{chunk-FUTMU4FR.js → chunk-DGV7HQA7.js} +6 -179
  10. package/dist/chunk-DGV7HQA7.js.map +1 -0
  11. package/dist/{chunk-O6IEZDRC.cjs → chunk-GRGS5M6O.cjs} +181 -3
  12. package/dist/chunk-GRGS5M6O.cjs.map +1 -0
  13. package/dist/{chunk-A6IU4GIW.js → chunk-H74HEPKT.js} +3 -3
  14. package/dist/{chunk-A6IU4GIW.js.map → chunk-H74HEPKT.js.map} +1 -1
  15. package/dist/{chunk-LPYEUD2D.cjs → chunk-IL3WB3YX.cjs} +3 -3
  16. package/dist/{chunk-LPYEUD2D.cjs.map → chunk-IL3WB3YX.cjs.map} +1 -1
  17. package/dist/{chunk-C3CGJK7A.cjs → chunk-LTU35TQN.cjs} +5 -5
  18. package/dist/{chunk-C3CGJK7A.cjs.map → chunk-LTU35TQN.cjs.map} +1 -1
  19. package/dist/{chunk-T5B7FM7S.js → chunk-LZRMXJIE.js} +3 -3
  20. package/dist/{chunk-T5B7FM7S.js.map → chunk-LZRMXJIE.js.map} +1 -1
  21. package/dist/{chunk-OPTBQSCV.cjs → chunk-MFY2ZNP6.cjs} +2 -181
  22. package/dist/{chunk-FUTMU4FR.js.map → chunk-MFY2ZNP6.cjs.map} +1 -1
  23. package/dist/{chunk-6HCJ3ZEU.js → chunk-R6VCPDPF.js} +178 -6
  24. package/dist/chunk-R6VCPDPF.js.map +1 -0
  25. package/dist/{chunk-C44TDH54.js → chunk-SUUPR735.js} +3 -3
  26. package/dist/{chunk-C44TDH54.js.map → chunk-SUUPR735.js.map} +1 -1
  27. package/dist/{chunk-RB7GX2VT.cjs → chunk-T5I4NRFP.cjs} +6 -6
  28. package/dist/{chunk-RB7GX2VT.cjs.map → chunk-T5I4NRFP.cjs.map} +1 -1
  29. package/dist/chunk-U37AYUPI.cjs +5371 -0
  30. package/dist/chunk-U37AYUPI.cjs.map +1 -0
  31. package/dist/{chunk-IJST4EBM.js → chunk-VUR63NMQ.js} +5 -5
  32. package/dist/{chunk-IJST4EBM.js.map → chunk-VUR63NMQ.js.map} +1 -1
  33. package/dist/chunk-WIZ7Z7FN.js +5179 -0
  34. package/dist/chunk-WIZ7Z7FN.js.map +1 -0
  35. package/dist/collaboration/index.cjs +73 -73
  36. package/dist/collaboration/index.js +2 -2
  37. package/dist/connect/docx.cjs +7 -7
  38. package/dist/connect/docx.js +4 -4
  39. package/dist/connect/index.cjs +1029 -125
  40. package/dist/connect/index.cjs.map +1 -1
  41. package/dist/connect/index.d.ts +1 -0
  42. package/dist/connect/index.js +910 -13
  43. package/dist/connect/index.js.map +1 -1
  44. package/dist/connection/connectors/ConnectedAppsSettings.d.ts +24 -0
  45. package/dist/connection/connectors/ConnectedDriveSyncDialog.d.ts +12 -0
  46. package/dist/connection/connectors/ConnectedMailboxSyncDialog.d.ts +12 -0
  47. package/dist/connection/connectors/index.d.ts +4 -0
  48. package/dist/connection/connectors/sync-labels.d.ts +21 -0
  49. package/dist/connection/settings-page/ConnectedSettingsPage.d.ts +4 -0
  50. package/dist/connection/settings-page/index.d.ts +1 -1
  51. package/dist/files/index.cjs +2 -2
  52. package/dist/files/index.js +2 -2
  53. package/dist/index.cjs +395 -395
  54. package/dist/index.js +11 -11
  55. package/dist/settings/PlanBadge.d.ts +1 -1
  56. package/dist/settings/index.cjs +545 -3710
  57. package/dist/settings/index.cjs.map +1 -1
  58. package/dist/settings/index.js +8 -3525
  59. package/dist/settings/index.js.map +1 -1
  60. package/dist/site/index.cjs +5 -5
  61. package/dist/site/index.js +1 -1
  62. package/dist/studio/index.cjs +1 -1
  63. package/dist/studio/index.js +1 -1
  64. package/dist/workflow-canvas/index.cjs +18 -18
  65. package/dist/workflow-canvas/index.js +5 -5
  66. package/node_modules/@arbidocs/coedit/package.json +1 -1
  67. package/package.json +4 -4
  68. package/dist/chunk-5YHEHEJT.js +0 -1667
  69. package/dist/chunk-5YHEHEJT.js.map +0 -1
  70. package/dist/chunk-6HCJ3ZEU.js.map +0 -1
  71. package/dist/chunk-O6IEZDRC.cjs.map +0 -1
  72. package/dist/chunk-OPTBQSCV.cjs.map +0 -1
  73. package/dist/chunk-U73KPFYH.cjs +0 -1717
  74. package/dist/chunk-U73KPFYH.cjs.map +0 -1
@@ -1,3751 +1,708 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkU73KPFYH_cjs = require('../chunk-U73KPFYH.cjs');
4
+ var chunkU37AYUPI_cjs = require('../chunk-U37AYUPI.cjs');
5
5
  var chunk223D4727_cjs = require('../chunk-223D4727.cjs');
6
- var chunkQZTNTP75_cjs = require('../chunk-QZTNTP75.cjs');
7
- var chunkNWNVWO6L_cjs = require('../chunk-NWNVWO6L.cjs');
6
+ require('../chunk-QZTNTP75.cjs');
7
+ require('../chunk-NWNVWO6L.cjs');
8
8
  var chunkRFIBUWLF_cjs = require('../chunk-RFIBUWLF.cjs');
9
9
  var chunkRQ2Y7USX_cjs = require('../chunk-RQ2Y7USX.cjs');
10
- var chunkDVUZTGVL_cjs = require('../chunk-DVUZTGVL.cjs');
10
+ require('../chunk-DVUZTGVL.cjs');
11
11
  require('../chunk-ADOKTJHV.cjs');
12
12
  var chunkDWZXSPMB_cjs = require('../chunk-DWZXSPMB.cjs');
13
- var chunk7RGLTF76_cjs = require('../chunk-7RGLTF76.cjs');
14
- var chunk32HW2Q33_cjs = require('../chunk-32HW2Q33.cjs');
13
+ require('../chunk-7RGLTF76.cjs');
14
+ require('../chunk-32HW2Q33.cjs');
15
15
  require('../chunk-PPCATBOY.cjs');
16
- var chunkMHVNT4J3_cjs = require('../chunk-MHVNT4J3.cjs');
16
+ require('../chunk-MHVNT4J3.cjs');
17
17
  var chunkULWRNGGE_cjs = require('../chunk-ULWRNGGE.cjs');
18
- var chunkKDG6FER6_cjs = require('../chunk-KDG6FER6.cjs');
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
-
47
- function SegmentedControl({
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
22
 
3554
23
  Object.defineProperty(exports, "ActiveSessionsDialog", {
3555
24
  enumerable: true,
3556
- get: function () { return chunkU73KPFYH_cjs.ActiveSessionsDialog; }
25
+ get: function () { return chunkU37AYUPI_cjs.ActiveSessionsDialog; }
26
+ });
27
+ Object.defineProperty(exports, "AppearanceSettings", {
28
+ enumerable: true,
29
+ get: function () { return chunkU37AYUPI_cjs.AppearanceSettings; }
3557
30
  });
3558
31
  Object.defineProperty(exports, "AvatarPicker", {
3559
32
  enumerable: true,
3560
- get: function () { return chunkU73KPFYH_cjs.AvatarPicker; }
33
+ get: function () { return chunkU37AYUPI_cjs.AvatarPicker; }
34
+ });
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", {
48
+ enumerable: true,
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; }
3561
66
  });
3562
67
  Object.defineProperty(exports, "DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS", {
3563
68
  enumerable: true,
3564
- get: function () { return chunkU73KPFYH_cjs.DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS; }
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; }
3565
74
  });
3566
75
  Object.defineProperty(exports, "DEFAULT_AVATAR_PICKER_LABELS", {
3567
76
  enumerable: true,
3568
- get: function () { return chunkU73KPFYH_cjs.DEFAULT_AVATAR_PICKER_LABELS; }
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; }
3569
98
  });
3570
99
  Object.defineProperty(exports, "DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS", {
3571
100
  enumerable: true,
3572
- get: function () { return chunkU73KPFYH_cjs.DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS; }
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; }
3573
110
  });
3574
111
  Object.defineProperty(exports, "DEFAULT_IDENTITY_VERIFICATION_LABELS", {
3575
112
  enumerable: true,
3576
- get: function () { return chunkU73KPFYH_cjs.DEFAULT_IDENTITY_VERIFICATION_LABELS; }
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; }
3577
126
  });
3578
127
  Object.defineProperty(exports, "DEFAULT_LOGOUT_DIALOG_LABELS", {
3579
128
  enumerable: true,
3580
- get: function () { return chunkU73KPFYH_cjs.DEFAULT_LOGOUT_DIALOG_LABELS; }
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; }
3581
138
  });
3582
139
  Object.defineProperty(exports, "DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS", {
3583
140
  enumerable: true,
3584
- get: function () { return chunkU73KPFYH_cjs.DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS; }
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; }
3585
146
  });
3586
147
  Object.defineProperty(exports, "DEFAULT_PROFILE_CARD_LABELS", {
3587
148
  enumerable: true,
3588
- get: function () { return chunkU73KPFYH_cjs.DEFAULT_PROFILE_CARD_LABELS; }
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; }
3589
174
  });
3590
175
  Object.defineProperty(exports, "DEFAULT_SETTINGS_DANGER_ZONE_LABELS", {
3591
176
  enumerable: true,
3592
- get: function () { return chunkU73KPFYH_cjs.DEFAULT_SETTINGS_DANGER_ZONE_LABELS; }
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; }
3593
222
  });
3594
223
  Object.defineProperty(exports, "DEFAULT_WORK_OFFLINE_LABELS", {
3595
224
  enumerable: true,
3596
- get: function () { return chunkU73KPFYH_cjs.DEFAULT_WORK_OFFLINE_LABELS; }
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; }
3597
230
  });
3598
231
  Object.defineProperty(exports, "DeleteAccountDialog", {
3599
232
  enumerable: true,
3600
- get: function () { return chunkU73KPFYH_cjs.DeleteAccountDialog; }
233
+ get: function () { return chunkU37AYUPI_cjs.DeleteAccountDialog; }
3601
234
  });
3602
235
  Object.defineProperty(exports, "DraggableHeader", {
3603
236
  enumerable: true,
3604
- get: function () { return chunkU73KPFYH_cjs.DraggableHeader; }
237
+ get: function () { return chunkU37AYUPI_cjs.DraggableHeader; }
3605
238
  });
3606
239
  Object.defineProperty(exports, "EMAIL_NOTIFICATION_CATEGORIES", {
3607
240
  enumerable: true,
3608
- get: function () { return chunkU73KPFYH_cjs.EMAIL_NOTIFICATION_CATEGORIES; }
241
+ get: function () { return chunkU37AYUPI_cjs.EMAIL_NOTIFICATION_CATEGORIES; }
3609
242
  });
3610
243
  Object.defineProperty(exports, "EMAIL_NOTIFICATION_KEYS", {
3611
244
  enumerable: true,
3612
- get: function () { return chunkU73KPFYH_cjs.EMAIL_NOTIFICATION_KEYS; }
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; }
3613
262
  });
3614
263
  Object.defineProperty(exports, "IdentityVerificationCard", {
3615
264
  enumerable: true,
3616
- get: function () { return chunkU73KPFYH_cjs.IdentityVerificationCard; }
265
+ get: function () { return chunkU37AYUPI_cjs.IdentityVerificationCard; }
3617
266
  });
3618
267
  Object.defineProperty(exports, "IdentityVerificationDialog", {
3619
268
  enumerable: true,
3620
- get: function () { return chunkU73KPFYH_cjs.IdentityVerificationDialog; }
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; }
3621
286
  });
3622
287
  Object.defineProperty(exports, "LogoutDialog", {
3623
288
  enumerable: true,
3624
- get: function () { return chunkU73KPFYH_cjs.LogoutDialog; }
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; }
3625
298
  });
3626
299
  Object.defineProperty(exports, "ModelProviderLabel", {
3627
300
  enumerable: true,
3628
- get: function () { return chunkU73KPFYH_cjs.ModelProviderLabel; }
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; }
3629
314
  });
3630
315
  Object.defineProperty(exports, "NotificationCategoryList", {
3631
316
  enumerable: true,
3632
- get: function () { return chunkU73KPFYH_cjs.NotificationCategoryList; }
317
+ get: function () { return chunkU37AYUPI_cjs.NotificationCategoryList; }
3633
318
  });
3634
319
  Object.defineProperty(exports, "PanelActionsRow", {
3635
320
  enumerable: true,
3636
- get: function () { return chunkU73KPFYH_cjs.PanelActionsRow; }
321
+ get: function () { return chunkU37AYUPI_cjs.PanelActionsRow; }
3637
322
  });
3638
323
  Object.defineProperty(exports, "PanelAddButton", {
3639
324
  enumerable: true,
3640
- get: function () { return chunkU73KPFYH_cjs.PanelAddButton; }
325
+ get: function () { return chunkU37AYUPI_cjs.PanelAddButton; }
3641
326
  });
3642
327
  Object.defineProperty(exports, "PanelFrame", {
3643
328
  enumerable: true,
3644
- get: function () { return chunkU73KPFYH_cjs.PanelFrame; }
329
+ get: function () { return chunkU37AYUPI_cjs.PanelFrame; }
3645
330
  });
3646
331
  Object.defineProperty(exports, "PanelFrameBody", {
3647
332
  enumerable: true,
3648
- get: function () { return chunkU73KPFYH_cjs.PanelFrameBody; }
333
+ get: function () { return chunkU37AYUPI_cjs.PanelFrameBody; }
3649
334
  });
3650
335
  Object.defineProperty(exports, "PanelNote", {
3651
336
  enumerable: true,
3652
- get: function () { return chunkU73KPFYH_cjs.PanelNote; }
337
+ get: function () { return chunkU37AYUPI_cjs.PanelNote; }
3653
338
  });
3654
339
  Object.defineProperty(exports, "PanelScroll", {
3655
340
  enumerable: true,
3656
- get: function () { return chunkU73KPFYH_cjs.PanelScroll; }
341
+ get: function () { return chunkU37AYUPI_cjs.PanelScroll; }
3657
342
  });
3658
343
  Object.defineProperty(exports, "PanelTitleBar", {
3659
344
  enumerable: true,
3660
- get: function () { return chunkU73KPFYH_cjs.PanelTitleBar; }
345
+ get: function () { return chunkU37AYUPI_cjs.PanelTitleBar; }
3661
346
  });
3662
347
  Object.defineProperty(exports, "PasswordChangeDialog", {
3663
348
  enumerable: true,
3664
- get: function () { return chunkU73KPFYH_cjs.PasswordChangeDialog; }
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; }
3665
402
  });
3666
403
  Object.defineProperty(exports, "PremiumModelsFrame", {
3667
404
  enumerable: true,
3668
- get: function () { return chunkU73KPFYH_cjs.PremiumModelsFrame; }
405
+ get: function () { return chunkU37AYUPI_cjs.PremiumModelsFrame; }
406
+ });
407
+ Object.defineProperty(exports, "PricingToggle", {
408
+ enumerable: true,
409
+ get: function () { return chunkU37AYUPI_cjs.PricingToggle; }
3669
410
  });
3670
411
  Object.defineProperty(exports, "ProfileCard", {
3671
412
  enumerable: true,
3672
- get: function () { return chunkU73KPFYH_cjs.ProfileCard; }
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; }
3673
478
  });
3674
479
  Object.defineProperty(exports, "RequireVerified", {
3675
480
  enumerable: true,
3676
- get: function () { return chunkU73KPFYH_cjs.RequireVerified; }
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; }
3677
494
  });
3678
495
  Object.defineProperty(exports, "ServerConnectionButton", {
3679
496
  enumerable: true,
3680
- get: function () { return chunkU73KPFYH_cjs.ServerConnectionButton; }
497
+ get: function () { return chunkU37AYUPI_cjs.ServerConnectionButton; }
3681
498
  });
3682
499
  Object.defineProperty(exports, "SettingsActionRow", {
3683
500
  enumerable: true,
3684
- get: function () { return chunkU73KPFYH_cjs.SettingsActionRow; }
501
+ get: function () { return chunkU37AYUPI_cjs.SettingsActionRow; }
3685
502
  });
3686
503
  Object.defineProperty(exports, "SettingsCard", {
3687
504
  enumerable: true,
3688
- get: function () { return chunkU73KPFYH_cjs.SettingsCard; }
505
+ get: function () { return chunkU37AYUPI_cjs.SettingsCard; }
3689
506
  });
3690
507
  Object.defineProperty(exports, "SettingsDangerZone", {
3691
508
  enumerable: true,
3692
- get: function () { return chunkU73KPFYH_cjs.SettingsDangerZone; }
509
+ get: function () { return chunkU37AYUPI_cjs.SettingsDangerZone; }
3693
510
  });
3694
511
  Object.defineProperty(exports, "SettingsPage", {
3695
512
  enumerable: true,
3696
- get: function () { return chunkU73KPFYH_cjs.SettingsPage; }
513
+ get: function () { return chunkU37AYUPI_cjs.SettingsPage; }
3697
514
  });
3698
515
  Object.defineProperty(exports, "SettingsPanel", {
3699
516
  enumerable: true,
3700
- get: function () { return chunkU73KPFYH_cjs.SettingsPanel; }
517
+ get: function () { return chunkU37AYUPI_cjs.SettingsPanel; }
3701
518
  });
3702
519
  Object.defineProperty(exports, "SettingsRow", {
3703
520
  enumerable: true,
3704
- get: function () { return chunkU73KPFYH_cjs.SettingsRow; }
521
+ get: function () { return chunkU37AYUPI_cjs.SettingsRow; }
3705
522
  });
3706
523
  Object.defineProperty(exports, "SettingsSection", {
3707
524
  enumerable: true,
3708
- get: function () { return chunkU73KPFYH_cjs.SettingsSection; }
525
+ get: function () { return chunkU37AYUPI_cjs.SettingsSection; }
3709
526
  });
3710
527
  Object.defineProperty(exports, "SettingsSwitchGroup", {
3711
528
  enumerable: true,
3712
- get: function () { return chunkU73KPFYH_cjs.SettingsSwitchGroup; }
529
+ get: function () { return chunkU37AYUPI_cjs.SettingsSwitchGroup; }
3713
530
  });
3714
531
  Object.defineProperty(exports, "SettingsSwitchRow", {
3715
532
  enumerable: true,
3716
- get: function () { return chunkU73KPFYH_cjs.SettingsSwitchRow; }
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; }
3717
674
  });
3718
675
  Object.defineProperty(exports, "WorkOfflineToggle", {
3719
676
  enumerable: true,
3720
- get: function () { return chunkU73KPFYH_cjs.WorkOfflineToggle; }
677
+ get: function () { return chunkU37AYUPI_cjs.WorkOfflineToggle; }
3721
678
  });
3722
679
  Object.defineProperty(exports, "formatSessionTtl", {
3723
680
  enumerable: true,
3724
- get: function () { return chunkU73KPFYH_cjs.formatSessionTtl; }
681
+ get: function () { return chunkU37AYUPI_cjs.formatSessionTtl; }
3725
682
  });
3726
683
  Object.defineProperty(exports, "resolveSettingsSection", {
3727
684
  enumerable: true,
3728
- get: function () { return chunkU73KPFYH_cjs.resolveSettingsSection; }
685
+ get: function () { return chunkU37AYUPI_cjs.resolveSettingsSection; }
3729
686
  });
3730
687
  Object.defineProperty(exports, "serverConnectionView", {
3731
688
  enumerable: true,
3732
- get: function () { return chunkU73KPFYH_cjs.serverConnectionView; }
689
+ get: function () { return chunkU37AYUPI_cjs.serverConnectionView; }
3733
690
  });
3734
691
  Object.defineProperty(exports, "toActiveSessionViews", {
3735
692
  enumerable: true,
3736
- get: function () { return chunkU73KPFYH_cjs.toActiveSessionViews; }
693
+ get: function () { return chunkU37AYUPI_cjs.toActiveSessionViews; }
3737
694
  });
3738
695
  Object.defineProperty(exports, "toDeleteBlockerViews", {
3739
696
  enumerable: true,
3740
- get: function () { return chunkU73KPFYH_cjs.toDeleteBlockerViews; }
697
+ get: function () { return chunkU37AYUPI_cjs.toDeleteBlockerViews; }
3741
698
  });
3742
699
  Object.defineProperty(exports, "toLogoutSessionViews", {
3743
700
  enumerable: true,
3744
- get: function () { return chunkU73KPFYH_cjs.toLogoutSessionViews; }
701
+ get: function () { return chunkU37AYUPI_cjs.toLogoutSessionViews; }
3745
702
  });
3746
703
  Object.defineProperty(exports, "toNotificationCategories", {
3747
704
  enumerable: true,
3748
- get: function () { return chunkU73KPFYH_cjs.toNotificationCategories; }
705
+ get: function () { return chunkU37AYUPI_cjs.toNotificationCategories; }
3749
706
  });
3750
707
  Object.defineProperty(exports, "ModalBreadcrumbHeader", {
3751
708
  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