@epam/ai-dial-chat-shared 1.2.0-dev.28 → 1.2.0-dev.284
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/ConfirmationDialog/ConfirmationDialog.js +34 -0
- package/components/ConfirmationIdentityCard/ConfirmationIdentityCard.js +21 -0
- package/components/ConfirmationIdentityCard/ConfirmationIdentityCard.module.scss.js +6 -0
- package/components/ConfirmationIdentityRow/ConfirmationIdentityRow.js +24 -0
- package/components/ConfirmationIdentityRow/ConfirmationIdentityRow.module.scss.js +3 -0
- package/components/ConfirmationView/ConfirmationFooter.js +42 -0
- package/components/ConfirmationView/ConfirmationView.js +39 -0
- package/components/ConfirmationView/ConfirmationView.module.scss.js +7 -0
- package/components/FeaturedChip/FeaturedChip.js +9 -14
- package/components/InitialsAvatar/InitialsAvatar.js +10 -27
- package/components/MarkdownRenderer/CodeBlock/CodeBlock.js +65 -63
- package/components/MarkdownRenderer/CodeBlock/CodeBlock.module.scss.js +6 -6
- package/components/MarkdownRenderer/MDMessageViewer.js +23 -17
- package/components/MarkdownRenderer/MarkdownRenderer.js +88 -90
- package/components/MarkdownRenderer/Math/MarkdownMathBlock.js +19 -18
- package/components/MarkdownRenderer/PlainTextRenderer.js +21 -0
- package/components/MarkdownRenderer/Table/MarkdownTable.js +71 -56
- package/components/MarkdownRenderer/Table/MarkdownTable.module.scss.js +11 -11
- package/components/MarkdownRenderer/Table/TableHeader.js +18 -21
- package/components/MarkdownRenderer/Table/table-serialization.js +23 -3
- package/components/MarkdownRenderer/Table/useMarkdownTableActions/useMarkdownTableActions.js +48 -62
- package/components/MarkdownRenderer/ThinkingShimmer.js +14 -0
- package/components/PanelEmptyState/PanelEmptyState.js +2 -1
- package/components/TextRefinementField/TextRefinementField.js +86 -0
- package/constants/dial.js +2 -2
- package/constants/mime-types.js +49 -2
- package/constants/public-class-names.js +10 -0
- package/constants/resizable-fields.js +2 -2
- package/file-manager/DialFileManagerShell/DialFileManagerShell.js +251 -234
- package/file-manager/FileManagerAttachModal/FileManagerAttachModal.js +36 -32
- package/file-manager/OperationLoaderModal/OperationLoaderModal.js +17 -20
- package/file-manager/upload-batch.js +2 -2
- package/file-manager/upload-queue.js +17 -0
- package/file-manager.d.ts +35 -20
- package/file-manager.js +4 -3
- package/hooks/useTextRefinement.js +66 -0
- package/hooks/useUnsavedChangesGuard.js +30 -0
- package/index.css +2 -2
- package/index.d.ts +531 -44
- package/index.js +73 -61
- package/markdown.d.ts +61 -8
- package/markdown.js +13 -11
- package/models/chat.js +4 -2
- package/package.json +5 -5
- package/types/attachment.js +1 -1
- package/utils/entity-field-limits.js +4 -0
- package/utils/entity-type.js +15 -0
- package/utils/file-download.js +6 -6
- package/utils/is-skill-selection-unsupported.js +4 -0
- package/utils/latex.js +5 -3
- package/utils/merge-class.js +5 -4
- package/utils/mime-type.js +10 -6
- package/utils/syntax-highlighting.js +13 -0
- package/components/InitialsAvatar/InitialsAvatar.module.scss.js +0 -6
- package/file-manager/UploadProgressModal/UploadProgressModal.js +0 -56
|
@@ -1,42 +1,42 @@
|
|
|
1
1
|
import { isHiddenPath as e } from "../path.js";
|
|
2
2
|
import { DialFileManagerShell as t } from "../DialFileManagerShell/DialFileManagerShell.js";
|
|
3
|
-
import {
|
|
3
|
+
import { ButtonVariant as n, Popup as r, PopupSize as i } from "@epam/ai-dial-ui-kit";
|
|
4
4
|
import { memo as a, useCallback as o, useMemo as s } from "react";
|
|
5
5
|
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
6
|
import { DialFileNodeType as u } from "@epam/ai-dial-react-file-manager";
|
|
7
7
|
//#region src/file-manager/FileManagerAttachModal/FileManagerAttachModal.tsx
|
|
8
|
-
var d = a(({ isOpen: a, onClose: d, onAttach: f, onSkippedUnsupportedFiles: p, onCountLimitExceeded: m, controller: h, isAnyOperationInProgress: g, activeTab: _, tabs: v, onTabChange: y, labels: b, variant: x, actionProfile: S, selectedPaths: C, onSelectedPathsChange: w, resolveFolderPath: T, isFileTypeAllowed: E, maxSelectableFileSize: D, maximumAttachmentsAmount: O, existingAttachmentsAmount: k = 0, isRowSelectable: A, getDisabledTooltip: j, unsupportedFileTypeTooltip: M, allowedFileTypes: N, autoSelectUploadedItems: P = !1 }) => {
|
|
9
|
-
let { items:
|
|
8
|
+
var d = a(({ isOpen: a, onClose: d, onAttach: f, onSkippedUnsupportedFiles: p, onCountLimitExceeded: m, controller: h, isAnyOperationInProgress: g, activeTab: _, tabs: v, onTabChange: y, labels: b, variant: x, actionProfile: S, selectedPaths: C, onSelectedPathsChange: w, resolveFolderPath: T, isFileTypeAllowed: E, maxSelectableFileSize: D, maximumAttachmentsAmount: O, existingAttachmentsAmount: k = 0, isRowSelectable: A, getDisabledTooltip: j, unsupportedFileTypeTooltip: M, allowedFileTypes: N, autoSelectUploadedItems: P = !1, oversizedUploadMessage: F }) => {
|
|
9
|
+
let { items: I, isLoading: L, searchResults: R } = h, z = s(() => {
|
|
10
10
|
let e = /* @__PURE__ */ new Map(), t = (n) => {
|
|
11
11
|
n.forEach((n) => {
|
|
12
12
|
(n.nodeType === u.ITEM || n.nodeType === u.FOLDER) && (e.set(n.path, n), n.id && e.set(n.id, n)), n.items && t(n.items);
|
|
13
13
|
});
|
|
14
14
|
};
|
|
15
|
-
return t(
|
|
15
|
+
return t(I), R?.forEach((t) => {
|
|
16
16
|
e.set(t.path, t), t.id && e.set(t.id, t);
|
|
17
17
|
}), e;
|
|
18
|
-
}, [
|
|
18
|
+
}, [I, R]), B = s(() => Array.from(C).map((e) => z.get(e)).filter((e) => e != null), [z, C]), V = o((e) => {
|
|
19
19
|
if (A == null) {
|
|
20
20
|
w(new Set(e));
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
23
|
let t = /* @__PURE__ */ new Set();
|
|
24
24
|
for (let n of e) {
|
|
25
|
-
let e =
|
|
25
|
+
let e = z.get(n);
|
|
26
26
|
e != null && A({ data: e }) && t.add(n);
|
|
27
27
|
}
|
|
28
28
|
w(t);
|
|
29
29
|
}, [
|
|
30
|
-
|
|
30
|
+
z,
|
|
31
31
|
A,
|
|
32
32
|
w
|
|
33
|
-
]),
|
|
33
|
+
]), H = o(() => {
|
|
34
34
|
let t = [], n = [];
|
|
35
|
-
for (let r of
|
|
35
|
+
for (let r of B) e(r.path) || (r.nodeType === u.FOLDER ? t.push(r.path) : n.push(r));
|
|
36
36
|
let r = t.filter((e) => !t.some((t) => t !== e && e.startsWith(`${t}/`))), i = n.filter((t) => !(e(t.path) || E != null && t.contentType != null && !E(t.contentType))), a = i.filter((e) => !r.some((t) => e.path.startsWith(`${t}/`)));
|
|
37
37
|
n.length - i.length > 0 && p?.();
|
|
38
38
|
let o = r.flatMap((e) => {
|
|
39
|
-
let t =
|
|
39
|
+
let t = z.get(e);
|
|
40
40
|
if (t == null) return [];
|
|
41
41
|
let n = T(t);
|
|
42
42
|
return n == null ? [] : [n];
|
|
@@ -53,44 +53,47 @@ var d = a(({ isOpen: a, onClose: d, onAttach: f, onSkippedUnsupportedFiles: p, o
|
|
|
53
53
|
f,
|
|
54
54
|
p,
|
|
55
55
|
m,
|
|
56
|
-
|
|
56
|
+
B,
|
|
57
57
|
E,
|
|
58
58
|
O,
|
|
59
59
|
k,
|
|
60
|
-
|
|
60
|
+
z,
|
|
61
61
|
T
|
|
62
|
-
]), { title:
|
|
63
|
-
return /* @__PURE__ */ c(
|
|
62
|
+
]), { title: U, attachLabel: W, headerDescription: G, ...K } = b;
|
|
63
|
+
return /* @__PURE__ */ c(r, {
|
|
64
64
|
open: a,
|
|
65
|
-
header: /* @__PURE__ */ l("div", {
|
|
66
|
-
className: "flex flex-col gap-1",
|
|
67
|
-
children: [/* @__PURE__ */ c("
|
|
65
|
+
header: G == null ? U : /* @__PURE__ */ l("div", {
|
|
66
|
+
className: "flex min-w-0 flex-1 flex-col gap-1",
|
|
67
|
+
children: [/* @__PURE__ */ c("h3", {
|
|
68
|
+
className: "dial-h1-text truncate text-primary",
|
|
69
|
+
children: U
|
|
70
|
+
}), /* @__PURE__ */ c("p", {
|
|
68
71
|
className: "dial-small-text text-start",
|
|
69
|
-
children:
|
|
72
|
+
children: G
|
|
70
73
|
})]
|
|
71
74
|
}),
|
|
72
|
-
ariaLabel:
|
|
73
|
-
size:
|
|
75
|
+
ariaLabel: U,
|
|
76
|
+
size: i.Lg,
|
|
74
77
|
className: "flex !h-[min(800px,100dvh)] w-full flex-col !bg-layer-sunken",
|
|
78
|
+
headerClassName: "pb-0",
|
|
79
|
+
footerClassName: "pt-0",
|
|
75
80
|
onClose: d,
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
})
|
|
83
|
-
}),
|
|
81
|
+
mainButtons: [{
|
|
82
|
+
label: W,
|
|
83
|
+
variant: n.Primary,
|
|
84
|
+
disabled: B.length === 0 || L || g,
|
|
85
|
+
onClick: H
|
|
86
|
+
}],
|
|
84
87
|
children: /* @__PURE__ */ c("div", {
|
|
85
|
-
className: "flex min-h-0 flex-col",
|
|
88
|
+
className: "flex h-full min-h-0 flex-col",
|
|
86
89
|
children: /* @__PURE__ */ c(t, {
|
|
87
90
|
controller: h,
|
|
88
|
-
labels:
|
|
91
|
+
labels: K,
|
|
89
92
|
activeTab: _,
|
|
90
93
|
tabs: v,
|
|
91
94
|
onTabChange: y,
|
|
92
95
|
selectedPaths: C,
|
|
93
|
-
onSelectedPathsChange:
|
|
96
|
+
onSelectedPathsChange: V,
|
|
94
97
|
variant: x,
|
|
95
98
|
actionProfile: S,
|
|
96
99
|
autoSelectUploadedItems: P,
|
|
@@ -98,7 +101,8 @@ var d = a(({ isOpen: a, onClose: d, onAttach: f, onSkippedUnsupportedFiles: p, o
|
|
|
98
101
|
maxSelectableFileSize: D,
|
|
99
102
|
isRowSelectable: A,
|
|
100
103
|
getDisabledTooltip: j,
|
|
101
|
-
unsupportedFileTypeTooltip: M
|
|
104
|
+
unsupportedFileTypeTooltip: M,
|
|
105
|
+
oversizedUploadMessage: F
|
|
102
106
|
})
|
|
103
107
|
})
|
|
104
108
|
});
|
|
@@ -1,36 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { memo as
|
|
3
|
-
import { jsx as
|
|
1
|
+
import { Popup as e, Spinner as t } from "@epam/ai-dial-ui-kit";
|
|
2
|
+
import { memo as n } from "react";
|
|
3
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
4
4
|
//#region src/file-manager/OperationLoaderModal/OperationLoaderModal.tsx
|
|
5
|
-
var
|
|
5
|
+
var a = ({ title: n, text: a, cancelLabel: o, onCancel: s }) => /* @__PURE__ */ r(e, {
|
|
6
6
|
className: "!h-fit !max-h-full !w-[400px]",
|
|
7
7
|
open: !0,
|
|
8
8
|
closeOnOutsideClick: !1,
|
|
9
9
|
hideClose: !0,
|
|
10
|
-
onClose:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
})
|
|
17
|
-
}),
|
|
18
|
-
children: /* @__PURE__ */ a("div", {
|
|
10
|
+
onClose: s,
|
|
11
|
+
mainButtons: [{
|
|
12
|
+
label: o,
|
|
13
|
+
onClick: s
|
|
14
|
+
}],
|
|
15
|
+
children: /* @__PURE__ */ i("div", {
|
|
19
16
|
"aria-live": "polite",
|
|
20
17
|
className: "flex flex-col items-center gap-4 px-6 py-4 text-center",
|
|
21
|
-
children: [/* @__PURE__ */
|
|
18
|
+
children: [/* @__PURE__ */ r(t, {
|
|
22
19
|
size: 32,
|
|
23
20
|
fullWidth: !1,
|
|
24
|
-
ariaLabel:
|
|
25
|
-
}), /* @__PURE__ */
|
|
21
|
+
ariaLabel: n
|
|
22
|
+
}), /* @__PURE__ */ i("div", {
|
|
26
23
|
className: "flex flex-col gap-1",
|
|
27
|
-
children: [/* @__PURE__ */
|
|
24
|
+
children: [/* @__PURE__ */ r("div", { children: n }), /* @__PURE__ */ r("div", {
|
|
28
25
|
className: "dial-small-text text-secondary",
|
|
29
|
-
children:
|
|
26
|
+
children: a
|
|
30
27
|
})]
|
|
31
28
|
})]
|
|
32
29
|
})
|
|
33
30
|
});
|
|
34
|
-
|
|
31
|
+
n(a);
|
|
35
32
|
//#endregion
|
|
36
|
-
export {
|
|
33
|
+
export { a as OperationLoaderModal };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/file-manager/upload-batch.ts
|
|
2
2
|
var e = /* @__PURE__ */ function(e) {
|
|
3
3
|
return e.Queued = "queued", e.Uploading = "uploading", e.Completed = "completed", e.Failed = "failed", e.Cancelled = "cancelled", e;
|
|
4
|
-
}({});
|
|
4
|
+
}({}), t = (e) => e?.files.some((e) => e.status === "queued" || e.status === "uploading") ?? !1;
|
|
5
5
|
//#endregion
|
|
6
|
-
export { e as FileUploadStatus };
|
|
6
|
+
export { e as FileUploadStatus, t as isUploadInProgress };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FileUploadStatus as e } from "./upload-batch.js";
|
|
2
|
+
import { TransferQueueItemStatus as t } from "@epam/ai-dial-ui-kit";
|
|
3
|
+
//#region src/file-manager/upload-queue.ts
|
|
4
|
+
var n = {
|
|
5
|
+
[e.Queued]: t.InProgress,
|
|
6
|
+
[e.Uploading]: t.InProgress,
|
|
7
|
+
[e.Completed]: t.Success,
|
|
8
|
+
[e.Failed]: t.Failed,
|
|
9
|
+
[e.Cancelled]: t.Canceled
|
|
10
|
+
}, r = (e) => e.map((e) => ({
|
|
11
|
+
id: e.id,
|
|
12
|
+
name: e.name,
|
|
13
|
+
status: n[e.status],
|
|
14
|
+
percent: e.percent
|
|
15
|
+
}));
|
|
16
|
+
//#endregion
|
|
17
|
+
export { r as toUploadQueueItems };
|
package/file-manager.d.ts
CHANGED
|
@@ -11,8 +11,10 @@ import { DialUploadFileItem } from '@epam/ai-dial-react-file-manager';
|
|
|
11
11
|
import { FC } from 'react';
|
|
12
12
|
import { FileManagerColumnKey } from '@epam/ai-dial-react-file-manager';
|
|
13
13
|
import { FileManagerGridRow } from '@epam/ai-dial-react-file-manager';
|
|
14
|
+
import { FileTreeOptions } from '@epam/ai-dial-react-file-manager';
|
|
14
15
|
import { ReactNode } from 'react';
|
|
15
|
-
import {
|
|
16
|
+
import { TransferQueueItem } from '@epam/ai-dial-ui-kit';
|
|
17
|
+
import { TransferQueueLabels } from '@epam/ai-dial-ui-kit';
|
|
16
18
|
|
|
17
19
|
/** Result returned by the file-manager attach modal when the user confirms a selection. */
|
|
18
20
|
declare interface AttachResult {
|
|
@@ -62,7 +64,7 @@ declare interface DialFileManagerShellLabels {
|
|
|
62
64
|
showHiddenFilesLabel: string;
|
|
63
65
|
/** Label shown when hidden files are currently hidden. */
|
|
64
66
|
hideHiddenFilesLabel: string;
|
|
65
|
-
/** Returns
|
|
67
|
+
/** Returns the text shown after the selection-count badge; the file manager renders the count itself, so omit it (e.g. "items selected"). */
|
|
66
68
|
getSelectionLabel: (count: number) => string;
|
|
67
69
|
/** Label for the "Upload files" action in the New menu. */
|
|
68
70
|
uploadFilesLabel: string;
|
|
@@ -114,20 +116,20 @@ declare interface DialFileManagerShellLabels {
|
|
|
114
116
|
operationLoaderMoveTitle: string;
|
|
115
117
|
/** Cancel-button label in the operation loader modal. */
|
|
116
118
|
operationLoaderCancelLabel: string;
|
|
117
|
-
/** Returns the delete confirmation dialog title for the given item names. */
|
|
118
|
-
deleteConfirmTitle: (names: string[]) => ReactNode;
|
|
119
|
+
/** Returns the delete confirmation dialog title for the given item names and items; the items carry `nodeType`, so a folder and a file can be titled differently. */
|
|
120
|
+
deleteConfirmTitle: (names: string[], items: DialFile[]) => ReactNode;
|
|
119
121
|
/** Returns the delete confirmation dialog body for the given item names. */
|
|
120
122
|
deleteConfirmBody: (names: string[]) => ReactNode;
|
|
121
123
|
/** Confirm-button label in the delete confirmation dialog. */
|
|
122
124
|
deleteConfirmLabel: string;
|
|
123
125
|
/** Cancel-button label in the delete confirmation dialog. */
|
|
124
126
|
deleteCancelLabel: string;
|
|
125
|
-
/**
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
|
|
127
|
+
/** Accessible name of the delete confirmation dialog's close control. Unset falls back to the file manager's English default. */
|
|
128
|
+
deleteCloseLabel?: string;
|
|
129
|
+
/** Returns the upload queue heading for the number of files in it (e.g. "Uploading 5 files"). */
|
|
130
|
+
getUploadQueueTitle: (count: number) => string;
|
|
131
|
+
/** Translated strings for the upload `TransferQueue`; unset ones fall back to the kit's English defaults. */
|
|
132
|
+
uploadQueueLabels?: Partial<TransferQueueLabels>;
|
|
131
133
|
/** Empty-state title when a search yields no results. */
|
|
132
134
|
searchEmptyStateTitle: string;
|
|
133
135
|
/** Empty-state title for an empty subfolder. */
|
|
@@ -138,6 +140,8 @@ declare interface DialFileManagerShellLabels {
|
|
|
138
140
|
emptyStateByTab: Record<DialFileManagerTabs, EmptyStateCopy>;
|
|
139
141
|
/** Per-tab tree header label. */
|
|
140
142
|
treeHeaderByTab: Record<DialFileManagerTabs, string>;
|
|
143
|
+
/** Search field placeholder per source tab of the browsed folder; a tab without an entry keeps the file manager's default. */
|
|
144
|
+
searchPlaceholderByTab?: Partial<Record<DialFileManagerTabs, string>>;
|
|
141
145
|
/** Messages for inline rename validation. */
|
|
142
146
|
renameValidationMessages: RenameValidationMessages;
|
|
143
147
|
/** Options for the conflict resolution popup. */
|
|
@@ -174,8 +178,8 @@ export declare interface DialFileManagerShellProps {
|
|
|
174
178
|
labels: DialFileManagerShellLabels;
|
|
175
179
|
/** Currently active tab. */
|
|
176
180
|
activeTab: DialFileManagerTabs;
|
|
177
|
-
/**
|
|
178
|
-
tabs:
|
|
181
|
+
/** Filter chips scoping the tree and the grid, rendered above the folder tree. */
|
|
182
|
+
tabs: FileTreeOptions['tabs'];
|
|
179
183
|
/** Called when the user switches tabs. */
|
|
180
184
|
onTabChange: (tab: DialFileManagerTabs) => void;
|
|
181
185
|
/** Set of currently selected file/folder virtual paths. */
|
|
@@ -190,8 +194,10 @@ export declare interface DialFileManagerShellProps {
|
|
|
190
194
|
autoSelectUploadedItems?: boolean;
|
|
191
195
|
/** MIME type filters for selectable files. */
|
|
192
196
|
allowedFileTypes?: DialFileAcceptType[];
|
|
193
|
-
/** Maximum file size in bytes for selectable files. */
|
|
197
|
+
/** Maximum file size in bytes for selectable files, and — reused as the ui-kit's own `maxFileSize` — the maximum size accepted for a newly-uploaded file. */
|
|
194
198
|
maxSelectableFileSize?: number;
|
|
199
|
+
/** Pre-translated message shown by the ui-kit when a newly-selected file exceeds `maxSelectableFileSize`. Omit to leave upload-size validation unrestricted regardless of `maxSelectableFileSize`. */
|
|
200
|
+
oversizedUploadMessage?: string;
|
|
195
201
|
/** Custom row-selectability predicate, forwarded to the grid's row selection. */
|
|
196
202
|
isRowSelectable?: (node: {
|
|
197
203
|
data?: FileManagerSelectableNode | null;
|
|
@@ -261,8 +267,8 @@ export declare interface FileManagerAttachModalProps {
|
|
|
261
267
|
isAnyOperationInProgress: boolean;
|
|
262
268
|
/** Currently active tab. */
|
|
263
269
|
activeTab: DialFileManagerTabs;
|
|
264
|
-
/**
|
|
265
|
-
tabs:
|
|
270
|
+
/** Filter chips scoping the tree and the grid, rendered above the folder tree. */
|
|
271
|
+
tabs: FileTreeOptions['tabs'];
|
|
266
272
|
/**
|
|
267
273
|
* Called when the user switches tabs.
|
|
268
274
|
* The host is responsible for resetting `selectedPaths` to an empty set.
|
|
@@ -316,6 +322,8 @@ export declare interface FileManagerAttachModalProps {
|
|
|
316
322
|
allowedFileTypes?: DialFileAcceptType[];
|
|
317
323
|
/** Whether to auto-select items immediately after upload. Defaults to `false`. */
|
|
318
324
|
autoSelectUploadedItems?: boolean;
|
|
325
|
+
/** Pre-translated message shown by the ui-kit when a newly-selected file exceeds `maxSelectableFileSize`. Omit to leave upload-size validation unrestricted regardless of `maxSelectableFileSize`. */
|
|
326
|
+
oversizedUploadMessage?: string;
|
|
319
327
|
}
|
|
320
328
|
|
|
321
329
|
/**
|
|
@@ -344,7 +352,7 @@ declare interface FileManagerController {
|
|
|
344
352
|
onSearchFiles: (folder: string, query: string) => void;
|
|
345
353
|
/** Search: true while a search request is in flight. */
|
|
346
354
|
isSearching: boolean;
|
|
347
|
-
/** Search: flat
|
|
355
|
+
/** Search: flat, unfiltered recursive listing of the current folder, or null when search is not active. */
|
|
348
356
|
searchResults: DialFile[] | null;
|
|
349
357
|
/** Search: clears results and exits search mode. */
|
|
350
358
|
clearSearchResults: () => void;
|
|
@@ -368,7 +376,9 @@ declare interface FileManagerController {
|
|
|
368
376
|
uploadBatchState: FileUploadBatchState | null;
|
|
369
377
|
/** Upload: abort all in-flight and queued uploads. */
|
|
370
378
|
cancelUpload: () => void;
|
|
371
|
-
/** Upload:
|
|
379
|
+
/** Upload: abort one queued or in-flight upload by its entry id. */
|
|
380
|
+
cancelUploadFile: (id: string) => void;
|
|
381
|
+
/** Upload: empty the upload queue. */
|
|
372
382
|
clearUploadBatch: () => void;
|
|
373
383
|
/** Folder creation: called when user confirms a new folder name. */
|
|
374
384
|
onCreateFolder: (file: DialUploadFileItem, folderPath: string, fileId: string) => Promise<void>;
|
|
@@ -430,6 +440,8 @@ declare interface FileManagerController {
|
|
|
430
440
|
onGetInfo: (file: DialFile) => void;
|
|
431
441
|
/** Metadata: resets fileMetadata/isFileMetadataLoading; passed to fileMetadataPopupOptions.clearMetadata. */
|
|
432
442
|
clearMetadata: () => void;
|
|
443
|
+
/** Source tab of the browsed folder, never `All`; omitted by single-source controllers. */
|
|
444
|
+
sectionTab?: DialFileManagerTabs;
|
|
433
445
|
}
|
|
434
446
|
|
|
435
447
|
/**
|
|
@@ -448,11 +460,11 @@ declare interface FileManagerSelectableNode {
|
|
|
448
460
|
contentLength?: number;
|
|
449
461
|
}
|
|
450
462
|
|
|
451
|
-
/** State of
|
|
463
|
+
/** State of the upload queue, as returned by `useDialFileUploadBatch`. */
|
|
452
464
|
declare interface FileUploadBatchState {
|
|
453
|
-
/**
|
|
465
|
+
/** Every file uploaded since the queue was last cleared, settled ones included. */
|
|
454
466
|
files: FileUploadEntry[];
|
|
455
|
-
/** Whether the upload
|
|
467
|
+
/** Whether the upload queue should be visible. */
|
|
456
468
|
isOpen: boolean;
|
|
457
469
|
}
|
|
458
470
|
|
|
@@ -488,4 +500,7 @@ declare interface FileUploadValidationResult {
|
|
|
488
500
|
/** Validation messages shown during inline rename editing. */
|
|
489
501
|
declare type RenameValidationMessages = NonNullable<DialFileManagerComponentProps['renameValidationMessages']>;
|
|
490
502
|
|
|
503
|
+
/** Maps upload entries onto the UI kit's `TransferQueue` rows. */
|
|
504
|
+
export declare const toUploadQueueItems: (files: FileUploadEntry[]) => TransferQueueItem[];
|
|
505
|
+
|
|
491
506
|
export { }
|
package/file-manager.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { toUploadQueueItems as e } from "./file-manager/upload-queue.js";
|
|
2
|
+
import { DialFileManagerShell as t } from "./file-manager/DialFileManagerShell/DialFileManagerShell.js";
|
|
3
|
+
import { FileManagerAttachModal as n } from "./file-manager/FileManagerAttachModal/FileManagerAttachModal.js";
|
|
4
|
+
export { t as DialFileManagerShell, n as FileManagerAttachModal, e as toUploadQueueItems };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { useCallback as e, useLayoutEffect as t, useRef as n, useState as r } from "react";
|
|
2
|
+
//#region src/hooks/useTextRefinement.ts
|
|
3
|
+
var i = /* @__PURE__ */ function(e) {
|
|
4
|
+
return e.Idle = "idle", e.Pending = "pending", e.Success = "success", e.Error = "error", e.Restored = "restored", e.Unchanged = "unchanged", e;
|
|
5
|
+
}({}), a = (i) => {
|
|
6
|
+
let [a, o] = r("idle"), [s, c] = r(!1), l = n(i), u = n(!1), d = n({
|
|
7
|
+
value: i.value,
|
|
8
|
+
resetKey: i.resetKey,
|
|
9
|
+
generation: 0,
|
|
10
|
+
controller: void 0,
|
|
11
|
+
baseline: void 0,
|
|
12
|
+
expected: void 0
|
|
13
|
+
}), f = e(() => {
|
|
14
|
+
let e = d.current;
|
|
15
|
+
e.generation++, e.controller?.abort(), e.controller = void 0, e.baseline = void 0, e.expected = void 0;
|
|
16
|
+
}, []), p = e(() => {
|
|
17
|
+
f(), u.current && (o("idle"), c(!1));
|
|
18
|
+
}, [f]);
|
|
19
|
+
t(() => (u.current = !0, () => {
|
|
20
|
+
u.current = !1, f();
|
|
21
|
+
}), [f]), t(() => {
|
|
22
|
+
let e = l.current, t = d.current;
|
|
23
|
+
l.current = i;
|
|
24
|
+
let n = t.value !== i.value, r = n && t.expected === i.value;
|
|
25
|
+
t.resetKey !== i.resetKey || e.onRefine && !i.onRefine || !e.disabled && i.disabled || n && !r ? p() : r && (t.expected = void 0), t.value = i.value, t.resetKey = i.resetKey;
|
|
26
|
+
});
|
|
27
|
+
let m = e(async () => {
|
|
28
|
+
let e = l.current, t = d.current;
|
|
29
|
+
if (!u.current || !e.onRefine || e.disabled || !e.value.trim() || t.controller || t.expected !== void 0) return;
|
|
30
|
+
let n = new AbortController();
|
|
31
|
+
t.controller = n;
|
|
32
|
+
let r = ++t.generation, i = e.value, a = () => u.current && r === t.generation && !n.signal.aborted && l.current.value === i;
|
|
33
|
+
o("pending");
|
|
34
|
+
try {
|
|
35
|
+
let r = await e.onRefine(i, n.signal);
|
|
36
|
+
if (!a()) return;
|
|
37
|
+
if (typeof r != "string" || !r.trim()) throw Error("Empty refinement");
|
|
38
|
+
if (r === i) {
|
|
39
|
+
o("unchanged");
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
t.baseline ??= i, t.expected = r, c(!0), o("success"), l.current.onChange(r);
|
|
43
|
+
} catch (e) {
|
|
44
|
+
if (!a()) return;
|
|
45
|
+
typeof e == "object" && e && "name" in e && e.name === "AbortError" ? o("idle") : o("error");
|
|
46
|
+
} finally {
|
|
47
|
+
r === t.generation && (t.controller = void 0);
|
|
48
|
+
}
|
|
49
|
+
}, []), h = e(() => {
|
|
50
|
+
let e = d.current;
|
|
51
|
+
if (!u.current || l.current.disabled || e.controller || e.baseline === void 0) return;
|
|
52
|
+
let t = e.baseline;
|
|
53
|
+
e.baseline = void 0, e.expected = t, c(!1), o("restored"), l.current.onChange(t);
|
|
54
|
+
}, []);
|
|
55
|
+
return {
|
|
56
|
+
state: a,
|
|
57
|
+
isPending: a === "pending",
|
|
58
|
+
canRefine: !!(i.onRefine && !i.disabled && i.value.trim() && a !== "pending"),
|
|
59
|
+
canUndo: s,
|
|
60
|
+
refine: m,
|
|
61
|
+
undo: h,
|
|
62
|
+
reset: p
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
//#endregion
|
|
66
|
+
export { i as TextRefinementState, a as useTextRefinement };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { useCallback as e, useEffect as t, useRef as n, useState as r } from "react";
|
|
2
|
+
//#region src/hooks/useUnsavedChangesGuard.ts
|
|
3
|
+
var i = (i) => {
|
|
4
|
+
let [a, o] = r(!1), s = n(null);
|
|
5
|
+
return t(() => {
|
|
6
|
+
if (!i) return;
|
|
7
|
+
let e = (e) => {
|
|
8
|
+
e.preventDefault();
|
|
9
|
+
};
|
|
10
|
+
return window.addEventListener("beforeunload", e), () => window.removeEventListener("beforeunload", e);
|
|
11
|
+
}, [i]), {
|
|
12
|
+
guard: e((e) => {
|
|
13
|
+
if (!i) {
|
|
14
|
+
e();
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
s.current = e, o(!0);
|
|
18
|
+
}, [i]),
|
|
19
|
+
isConfirmOpen: a,
|
|
20
|
+
confirm: e(() => {
|
|
21
|
+
let e = s.current;
|
|
22
|
+
s.current = null, o(!1), e?.();
|
|
23
|
+
}, []),
|
|
24
|
+
dismiss: e(() => {
|
|
25
|
+
s.current = null, o(!1);
|
|
26
|
+
}, [])
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { i as useUnsavedChangesGuard };
|
package/index.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
._agentIconBadge_1ger8_1{background:var(--di-icon-bg,var(--bg-layer-sunken,#eef1f7))}.
|
|
2
|
-
/*$vite$:1*/.sr-only{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border-width:0;white-space:nowrap}.visible{visibility:visible}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.end-0{inset-inline-end:0}.top-0{top:0}.top-\[-6px\]{top:-6px}.z-\[2\]{z-index:2}.z-\[52\]{z-index:52}.
|
|
1
|
+
._message_1iqfi_1{color:var(--cfm-message-text,var(--text-primary,#161b2d))}._consequences_1iqfi_5{color:var(--cfm-consequence-text,var(--text-secondary,#57647a))}._footer_1iqfi_9{border-block-start:1px solid var(--cfm-footer-border,var(--stroke-tertiary,#e0e6f0))}._info_vyo7p_1{--rs-bg:var(--bg-info,#d6e2f9)}._danger_vyo7p_5{--rs-bg:var(--bg-control-error-alpha-active,#f7646433);--rs-border:var(--stroke-error-alpha,#ae2f2f73)}._agentIconBadge_1ger8_1{background:var(--di-icon-bg,var(--bg-layer-sunken,#eef1f7))}._title_11w3i_1{color:var(--ih-title-color,var(--text-primary,#161b2d))}._count_11w3i_5{color:var(--ih-count-color,var(--text-secondary,#57647a))}._row_1csuq_1{border-color:var(--rs-border,var(--stroke-tertiary,#e0e6f0));background:var(--rs-bg,var(--bg-layer-sunken,#eef1f7))}._versionTag_1csuq_7{border-color:var(--rs-version-tag-border,var(--stroke-tertiary,#e0e6f0))!important;background:var(--rs-version-tag-bg,var(--bg-control-accent-alpha,#2764d90f))!important;color:var(--rs-version-tag-text,var(--text-accent,#1d4ed8))!important}._typeLabel_17nhs_1{color:var(--cir-type-label-text,var(--text-secondary,#57647a))}._container_sqe5k_1{background:var(--cm-code-block-bg,var(--bg-layer-raised,#fcfcfc));border-color:var(--cm-code-block-border,var(--stroke-secondary,#d1dbea))}._containerLight_sqe5k_6{background:var(--cm-code-block-bg,var(--bg-layer-raised,#fcfcfc))}._header_sqe5k_10{background:var(--cm-code-block-header-bg,var(--bg-layer-raised,#fcfcfc));border-color:var(--cm-code-block-border,var(--stroke-secondary,#d1dbea))}._languageLabel_sqe5k_15{color:var(--cm-code-block-language,var(--text-secondary,#57647a))}._copiedIcon_sqe5k_19{color:var(--cm-code-block-copied,var(--text-success,#007274))}._scrollContainer_sqe5k_23 .token.table,._scrollContainer_sqe5k_23 .token.table-header-row,._scrollContainer_sqe5k_23 .token.table-line,._scrollContainer_sqe5k_23 .token.table-data-rows{display:inline}._scrollContainer_sqe5k_23{scrollbar-width:thin;scrollbar-color:var(--cm-code-block-scrollbar,var(--stroke-primary,#57647a)) transparent}._scrollContainer_sqe5k_23::-webkit-scrollbar{width:4px;height:4px}._scrollContainer_sqe5k_23::-webkit-scrollbar-track{background-color:#0000}._scrollContainer_sqe5k_23::-webkit-scrollbar-thumb{background-color:var(--cm-code-block-scrollbar,var(--stroke-primary,#57647a));border-radius:4px}@keyframes _cm-shimmer_1g29w_1{0%{background-position:200%}to{background-position:-200%}}._thinking_1g29w_9{background:linear-gradient(270deg, var(--cm-thinking-inverted,var(--text-primary,#161b2d)) 0%, var(--cm-thinking-secondary,var(--text-secondary,#57647a)) 40%, var(--cm-thinking-inverted,var(--text-primary,#161b2d)) 80%);color:#0000;background-size:200%;-webkit-background-clip:text;background-clip:text;animation:2s linear infinite _cm-shimmer_1g29w_1}._h6_1g29w_18{color:var(--cm-h6-text,var(--text-secondary,#57647a))}._codeInline_1g29w_22{background:var(--cm-code-inline-bg,var(--bg-layer-raised,#fcfcfc));color:var(--cm-code-inline-text,var(--text-primary,#161b2d))}._secondaryBorder_1g29w_27{border-color:var(--cm-markdown-border,var(--stroke-secondary,#d1dbea))}._blockquote_1g29w_31{border-color:var(--cm-blockquote-border,var(--stroke-primary,#57647a));color:var(--cm-blockquote-text,var(--text-secondary,#57647a))}._link_1g29w_36{color:var(--cm-link-text,var(--text-accent,#1d4ed8))}._link_1g29w_36:focus-visible{outline-color:var(--cm-link-focus,var(--stroke-focus-black,#161b2d))}._scrollContainer_1f433_1{scrollbar-width:thin;scrollbar-color:var(--cm-math-scrollbar,var(--stroke-primary,#57647a)) transparent}._scrollContainer_1f433_1::-webkit-scrollbar{height:4px}._scrollContainer_1f433_1::-webkit-scrollbar-track{background-color:#0000}._scrollContainer_1f433_1::-webkit-scrollbar-thumb{background-color:var(--cm-math-scrollbar,var(--stroke-primary,#57647a));border-radius:4px}._scrollContainer_1f433_1:focus-visible{outline:1px solid var(--cm-math-focus,var(--stroke-focus-black,#161b2d));outline-offset:2px}._mathContent_1f433_24{width:max-content;min-width:100%;display:block}._tableContainer_1fwnj_1{background:var(--cm-code-block-bg,var(--bg-layer-raised,#fcfcfc));border-color:var(--cm-markdown-border,var(--cm-code-block-border,var(--stroke-secondary,#d1dbea)))}._tableContainerLight_1fwnj_6{background:var(--cm-code-block-bg,var(--bg-layer-base,#f5f7fa))}._copiedIcon_1fwnj_10{color:var(--cm-code-block-copied,var(--text-success,#007274))}._scrollContainer_1fwnj_14{scrollbar-width:thin;scrollbar-color:var(--cm-table-scrollbar,var(--stroke-primary,#57647a)) transparent}._scrollContainer_1fwnj_14::-webkit-scrollbar{width:4px;height:4px}._scrollContainer_1fwnj_14::-webkit-scrollbar-track{background-color:#0000}._scrollContainer_1fwnj_14::-webkit-scrollbar-thumb{background-color:var(--cm-table-scrollbar,var(--stroke-primary,#57647a));border-radius:4px}._tableHeaderCell_1fwnj_30{background:var(--cm-code-block-header-bg,var(--bg-layer-raised,#fcfcfc));height:3rem;color:var(--cm-table-header-text,var(--text-secondary,#57647a))}._sectionRow_1fwnj_37 td{background:var(--cm-code-block-header-bg,var(--bg-layer-raised,#fcfcfc))}._rowDivider_1fwnj_41{border-block-end:.5px solid var(--cm-table-row-divider,var(--stroke-tertiary,#e0e6f0))}tbody ._row_1fwnj_41:hover td{background:var(--cm-table-row-hover-bg,var(--bg-control-accent-alpha-hover,#2764d924))}._tableScrollFadeEnd_1fwnj_51{-webkit-mask-image:linear-gradient(to right, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) calc(100% - 1rem), transparent 100%);-webkit-mask-image:linear-gradient(to right, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) calc(100% - 1rem), transparent 100%);mask-image:linear-gradient(to right, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) calc(100% - 1rem), transparent 100%)}[dir=rtl] ._tableScrollFadeEnd_1fwnj_51{-webkit-mask-image:linear-gradient(to left, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) calc(100% - 1rem), transparent 100%);-webkit-mask-image:linear-gradient(to left, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) calc(100% - 1rem), transparent 100%);mask-image:linear-gradient(to left, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) calc(100% - 1rem), transparent 100%)}._tableScrollFadeStart_1fwnj_59{-webkit-mask-image:linear-gradient(to right, transparent 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 1rem, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 100%);-webkit-mask-image:linear-gradient(to right, transparent 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 1rem, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 100%);mask-image:linear-gradient(to right, transparent 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 1rem, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 100%)}[dir=rtl] ._tableScrollFadeStart_1fwnj_59{-webkit-mask-image:linear-gradient(to left, transparent 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 1rem, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 100%);-webkit-mask-image:linear-gradient(to left, transparent 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 1rem, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 100%);mask-image:linear-gradient(to left, transparent 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 1rem, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 100%)}._tableScrollFadeBoth_1fwnj_67{-webkit-mask-image:linear-gradient(to right, transparent 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 1rem, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) calc(100% - 1rem), transparent 100%);-webkit-mask-image:linear-gradient(to right, transparent 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 1rem, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) calc(100% - 1rem), transparent 100%);mask-image:linear-gradient(to right, transparent 0, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) 1rem, var(--cm-table-fade,var(--stroke-focus-black,#161b2d)) calc(100% - 1rem), transparent 100%)}._tableHeader_1qvg8_1{background:var(--cm-code-block-header-bg,var(--bg-layer-raised,#fcfcfc));border-color:var(--cm-markdown-border,var(--cm-code-block-border,var(--stroke-secondary,#d1dbea)))}._label_12p89_1{color:var(--pes-label-color,var(--text-primary,#161b2d))}
|
|
2
|
+
/*$vite$:1*/.sr-only{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border-width:0;white-space:nowrap}.visible{visibility:visible}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-4{bottom:1rem}.end-0{inset-inline-end:0}.end-2{inset-inline-end:.5rem}.end-4{inset-inline-end:1rem}.top-0{top:0}.top-2{top:.5rem}.top-\[-6px\]{top:-6px}.z-10{z-index:10}.z-\[2\]{z-index:2}.z-\[52\]{z-index:52}.z-\[70\]{z-index:70}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.my-4{margin-bottom:1rem;margin-top:1rem}.my-5{margin-bottom:1.25rem;margin-top:1.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.me-1\.5{margin-inline-end:.375rem}.ms-auto{margin-inline-start:auto}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.size-full{height:100%;width:100%}.\!h-\[min\(800px\2c 100dvh\)\]{height:min(800px,100dvh)!important}.\!h-fit{height:-moz-fit-content!important;height:fit-content!important}.h-0{height:0}.h-\[24px\]{height:24px}.h-full{height:100%}.\!max-h-full{max-height:100%!important}.max-h-\[344px\]{max-height:344px}.max-h-\[50vh\]{max-height:50vh}.max-h-\[60vh\]{max-height:60vh}.min-h-0{min-height:0}.min-h-10{min-height:2.5rem}.\!w-\[400px\]{width:400px!important}.w-\[360px\]{width:360px}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-0{min-width:0}.min-w-full{min-width:100%}.max-w-96{max-width:24rem}.max-w-\[30\%\]{max-width:30%}.max-w-\[45\%\]{max-width:45%}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:4px}.rounded-\[14px\]{border-radius:14px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-s-2{border-inline-start-width:2px}.border-t{border-top-width:1px}.border-tertiary{border-color:var(--stroke-tertiary,#e0e6f0)}.\!bg-layer-sunken{background-color:var(--bg-layer-sunken,#eef1f7)!important}.bg-backdrop{background-color:var(--bg-backdrop,#161b2d4d)}.bg-layer-raised{background-color:var(--bg-layer-raised,#fcfcfc)}.bg-layer-sunken{background-color:var(--bg-layer-sunken,#eef1f7)}.object-contain{-o-object-fit:contain;object-fit:contain}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0{padding-bottom:0;padding-top:0}.py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-\[7px\]{padding-bottom:7px;padding-top:7px}.pb-0{padding-bottom:0}.ps-4{padding-inline-start:1rem}.ps-5{padding-inline-start:1.25rem}.ps-\[2em\]{padding-inline-start:2em}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.text-center{text-align:center}.text-start{text-align:start}.text-end{text-align:end}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.uppercase{text-transform:uppercase}.italic{font-style:italic}.text-primary{color:var(--text-primary,#161b2d)}.text-secondary{color:var(--text-secondary,#57647a)}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-75{opacity:.75}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-chat-button{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-chat-button{--tw-shadow:0 2px 12px 0 var(--shadow-xs-1,#2764d933),0 2px 6px 0 var(--shadow-xs-2,#161b2d08);--tw-shadow-colored:0 2px 12px 0 var(--tw-shadow-color),0 2px 6px 0 var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 8px 10px 0 var(--shadow-sm,#2764d914);--tw-shadow-colored:0 8px 10px 0 var(--tw-shadow-color)}.shadow-sm,.shadow-xs{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 4px 0 var(--shadow-xs-1,#2764d933),0 1px 2px 0 var(--shadow-xs-2,#161b2d08);--tw-shadow-colored:0 1px 4px 0 var(--tw-shadow-color),0 1px 2px 0 var(--tw-shadow-color)}.outline{outline-style:solid;outline-width:1px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.\[overflow\:clip\]{overflow:clip}.\[text-wrap\:balance\]{text-wrap:balance}.\[text-wrap\:pretty\]{text-wrap:pretty}.first\:mt-0:first-child{margin-top:0}.last\:mb-0:last-child{margin-bottom:0}.focus-within\:opacity-100:focus-within{opacity:1}.hover\:decoration-current:hover{text-decoration-color:currentColor}.focus-visible\:outline:focus-visible{outline-style:solid;outline-width:1px}.focus-visible\:outline-1:focus-visible{outline-width:1px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.group\/table:hover .group-hover\/table\:opacity-100{opacity:1}@media (min-width:1280px){.desktop\:p-4{padding:1rem}}.rtl\:flex-row-reverse:where([dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.rtl\:justify-start:where([dir=rtl],[dir=rtl] *){justify-content:flex-start}.\[\&_\.w-md-editor-bar\]\:hidden .w-md-editor-bar{display:none}.\[\&_\.w-md-editor\:not\(\.w-md-editor-fullscreen\)\]\:\!h-\[var\(--resizable-field-max-height\2c 70vh\)\] .w-md-editor:not(.w-md-editor-fullscreen){height:var(--resizable-field-max-height,70vh)!important}.\[\&_\.w-md-editor\:not\(\.w-md-editor-fullscreen\)\]\:max-h-\[var\(--resizable-field-max-height\2c 70vh\)\] .w-md-editor:not(.w-md-editor-fullscreen){max-height:var(--resizable-field-max-height,70vh)}.\[\&_\.wmde-markdown\>ol\]\:list-decimal .wmde-markdown>ol{list-style-type:decimal}.\[\&_\.wmde-markdown_ul\]\:list-disc .wmde-markdown ul{list-style-type:disc}.\[\&_\.wmde-markdown_ul_ul\]\:list-\[circle\] .wmde-markdown ul ul{list-style-type:circle}.\[\&_\.wmde-markdown_ul_ul_ul\]\:list-\[square\] .wmde-markdown ul ul ul{list-style-type:square}
|