@senguoyun/dsh-arkme 0.1.45 → 0.1.46
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/docs/direct-message-refusal.md +39 -0
- package/docs/plugin-release.md +28 -3
- package/lib/client.js +1719 -562
- package/lib/client.js.map +1 -1
- package/lib/harness-model-client.js +4922 -0
- package/lib/index.js +1605 -110
- package/lib/persistent-extension.js +1 -1
- package/lib/{persistent-runtime-CEGGFpR7.js → persistent-runtime-DpNP9UKr.js} +1152 -155
- package/lib/sdk.js +25 -2
- package/lib/types/arkme-service.d.ts +10 -1
- package/lib/types/arkme-service.d.ts.map +1 -1
- package/lib/types/chat-pin-projection.d.ts +4 -0
- package/lib/types/chat-pin-projection.d.ts.map +1 -0
- package/lib/types/chat-realtime.d.ts +13 -1
- package/lib/types/chat-realtime.d.ts.map +1 -1
- package/lib/types/client/ArkmeAttachmentStrip.d.ts +2 -1
- package/lib/types/client/ArkmeAttachmentStrip.d.ts.map +1 -1
- package/lib/types/client/ArkmeBillingSettings.d.ts +7 -1
- package/lib/types/client/ArkmeBillingSettings.d.ts.map +1 -1
- package/lib/types/client/ArkmeMarkdownComposerInput.d.ts.map +1 -1
- package/lib/types/client/ArkmeModelSelect.d.ts +20 -0
- package/lib/types/client/ArkmeModelSelect.d.ts.map +1 -0
- package/lib/types/client/ArkmeNoteDetails.d.ts +3 -1
- package/lib/types/client/ArkmeNoteDetails.d.ts.map +1 -1
- package/lib/types/client/ArkmeRichContent.d.ts +3 -1
- package/lib/types/client/ArkmeRichContent.d.ts.map +1 -1
- package/lib/types/client/ArkmeSidebar.d.ts.map +1 -1
- package/lib/types/client/ArkmeVirtualWorkspace.d.ts.map +1 -1
- package/lib/types/client/chat-directory-store.d.ts +7 -1
- package/lib/types/client/chat-directory-store.d.ts.map +1 -1
- package/lib/types/client/conversation-memory-cache.d.ts +3 -0
- package/lib/types/client/conversation-memory-cache.d.ts.map +1 -1
- package/lib/types/client/conversation-timeline-refresh.d.ts +5 -0
- package/lib/types/client/conversation-timeline-refresh.d.ts.map +1 -0
- package/lib/types/client/direct-message-admission.d.ts +15 -0
- package/lib/types/client/direct-message-admission.d.ts.map +1 -0
- package/lib/types/client/harness-model-client.d.ts +15 -0
- package/lib/types/client/harness-model-client.d.ts.map +1 -0
- package/lib/types/client/realtime-client-events.d.ts.map +1 -1
- package/lib/types/client/record-reedit-editors.d.ts +38 -0
- package/lib/types/client/record-reedit-editors.d.ts.map +1 -0
- package/lib/types/client/record-reedit-submissions.d.ts +12 -0
- package/lib/types/client/record-reedit-submissions.d.ts.map +1 -0
- package/lib/types/client/timeline-media.d.ts +4 -0
- package/lib/types/client/timeline-media.d.ts.map +1 -0
- package/lib/types/client/ui-controller.d.ts.map +1 -1
- package/lib/types/direct-message-admission.d.ts +17 -0
- package/lib/types/direct-message-admission.d.ts.map +1 -0
- package/lib/types/file-transfer-contract.d.ts +2 -0
- package/lib/types/file-transfer-contract.d.ts.map +1 -1
- package/lib/types/file-transfer-owner.d.ts.map +1 -1
- package/lib/types/harness-embed-contract.d.ts +1 -0
- package/lib/types/harness-embed-contract.d.ts.map +1 -1
- package/lib/types/harness-embed-route.d.ts +2 -1
- package/lib/types/harness-embed-route.d.ts.map +1 -1
- package/lib/types/host-api.d.ts.map +1 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/local-database.d.ts +7 -2
- package/lib/types/local-database.d.ts.map +1 -1
- package/lib/types/managed-ai/adapter.d.ts +4 -1
- package/lib/types/managed-ai/adapter.d.ts.map +1 -1
- package/lib/types/managed-ai/image-preparer.d.ts +19 -0
- package/lib/types/managed-ai/image-preparer.d.ts.map +1 -0
- package/lib/types/managed-ai/multipart-upload.d.ts +8 -0
- package/lib/types/managed-ai/multipart-upload.d.ts.map +1 -0
- package/lib/types/managed-ai/transport.d.ts +59 -0
- package/lib/types/managed-ai/transport.d.ts.map +1 -0
- package/lib/types/record-reedit-contract.d.ts +84 -1
- package/lib/types/record-reedit-contract.d.ts.map +1 -1
- package/lib/types/rich-media-routes.d.ts.map +1 -1
- package/lib/types/sdk/index.d.ts +6 -1
- package/lib/types/sdk/index.d.ts.map +1 -1
- package/lib/types/services/chat-realtime-service.d.ts +4 -3
- package/lib/types/services/chat-realtime-service.d.ts.map +1 -1
- package/lib/types/services/chat-service.d.ts.map +1 -1
- package/lib/types/services/direct-message-admission-service.d.ts +21 -0
- package/lib/types/services/direct-message-admission-service.d.ts.map +1 -0
- package/lib/types/services/file-transfers.d.ts +8 -1
- package/lib/types/services/file-transfers.d.ts.map +1 -1
- package/lib/types/services/media-service.d.ts +2 -0
- package/lib/types/services/media-service.d.ts.map +1 -1
- package/lib/types/services/message-action-infrastructure.d.ts.map +1 -1
- package/lib/types/services/record-reedit-attachments.d.ts +30 -0
- package/lib/types/services/record-reedit-attachments.d.ts.map +1 -0
- package/lib/types/services/record-reedit-submissions.d.ts +37 -0
- package/lib/types/services/record-reedit-submissions.d.ts.map +1 -0
- package/lib/types/services/record-service.d.ts +30 -2
- package/lib/types/services/record-service.d.ts.map +1 -1
- package/lib/types/services/recording-forward-gateway.d.ts.map +1 -1
- package/lib/types/services/service.d.ts +12 -2
- package/lib/types/services/service.d.ts.map +1 -1
- package/lib/types/services/source-service.d.ts +0 -1
- package/lib/types/services/source-service.d.ts.map +1 -1
- package/lib/types/state-store.d.ts +8 -2
- package/lib/types/state-store.d.ts.map +1 -1
- package/lib/types/tools/business/conversation/direct-message-refusal.d.ts +3 -0
- package/lib/types/tools/business/conversation/direct-message-refusal.d.ts.map +1 -0
- package/lib/types/tools/business/index.d.ts.map +1 -1
- package/lib/types/tools/business/records/reedit.d.ts.map +1 -1
- package/lib/types/tools/ports/index.d.ts +2 -1
- package/lib/types/tools/ports/index.d.ts.map +1 -1
- package/lib/types/tools/registry/registrar.d.ts.map +1 -1
- package/lib/types/types.d.ts +24 -2
- package/lib/types/types.d.ts.map +1 -1
- package/package.json +6 -6
package/lib/client.js
CHANGED
|
@@ -38,9 +38,9 @@ window.__ModuleLoader__.load({
|
|
|
38
38
|
//#endregion
|
|
39
39
|
let react = require("react");
|
|
40
40
|
react = __toESM(react, 1);
|
|
41
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
42
41
|
let react_dom = require("react-dom");
|
|
43
42
|
react_dom = __toESM(react_dom, 1);
|
|
43
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
44
44
|
let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
45
45
|
let react_dom_client = require("react-dom/client");
|
|
46
46
|
//#region src/types.ts
|
|
@@ -338,6 +338,28 @@ window.__ModuleLoader__.load({
|
|
|
338
338
|
if (sourceRef.trim() === "") throw new TypeError("Arkme private-chat source reference must not be empty");
|
|
339
339
|
return await this.call("user-ban.status", { sourceRef }, signal);
|
|
340
340
|
}
|
|
341
|
+
async directMessageAdmission(sourceRef, signal) {
|
|
342
|
+
if (sourceRef.trim() === "") throw new TypeError("Arkme private-chat source reference must not be empty");
|
|
343
|
+
if ((await this.capabilities(signal)).features.directMessageAdmission !== true) throw new ArkmeClientError({
|
|
344
|
+
code: "CAPABILITY_UNSUPPORTED",
|
|
345
|
+
message: "当前 Arkme Provider 不支持私聊拒收,请升级",
|
|
346
|
+
retryable: false
|
|
347
|
+
});
|
|
348
|
+
return await this.call("chat.direct-message-admission", { sourceRef }, signal);
|
|
349
|
+
}
|
|
350
|
+
async setDirectMessageRefusal(sourceRef, refused, expectedRevision, signal) {
|
|
351
|
+
if (sourceRef.trim() === "" || typeof refused !== "boolean" || !Number.isSafeInteger(expectedRevision) || expectedRevision < 0) throw new TypeError("Arkme private-chat refusal input is invalid");
|
|
352
|
+
if ((await this.capabilities(signal)).features.directMessageAdmission !== true) throw new ArkmeClientError({
|
|
353
|
+
code: "CAPABILITY_UNSUPPORTED",
|
|
354
|
+
message: "当前 Arkme Provider 不支持私聊拒收,请升级",
|
|
355
|
+
retryable: false
|
|
356
|
+
});
|
|
357
|
+
return await this.call("chat.direct-message-refusal.set", {
|
|
358
|
+
sourceRef,
|
|
359
|
+
refused,
|
|
360
|
+
expectedRevision
|
|
361
|
+
}, signal);
|
|
362
|
+
}
|
|
341
363
|
/** Employee-only idempotent ban. Callers must obtain explicit human approval first. */
|
|
342
364
|
async banPrivateChatUser(sourceRef, remark = "", signal) {
|
|
343
365
|
if (sourceRef.trim() === "") throw new TypeError("Arkme private-chat source reference must not be empty");
|
|
@@ -1160,14 +1182,15 @@ window.__ModuleLoader__.load({
|
|
|
1160
1182
|
if (!/^arkme-file-v1\.[0-9a-f-]{36}$/.test(fileRef)) throw new TypeError("Invalid local file reference");
|
|
1161
1183
|
return `${this.route}/files/local?ref=${encodeURIComponent(fileRef)}${download ? "&download=1" : ""}`;
|
|
1162
1184
|
}
|
|
1163
|
-
/** Stage locally
|
|
1185
|
+
/** Stage locally. Reference-managed files require a Host-persisted draft or task to retain them beyond seven days. */
|
|
1164
1186
|
async stageFile(file, options = {}) {
|
|
1165
1187
|
const payload = await (await this.fetchImpl(`${this.route}/files/stage`, {
|
|
1166
1188
|
method: "POST",
|
|
1167
1189
|
headers: {
|
|
1168
1190
|
"Content-Type": file.type || "application/octet-stream",
|
|
1169
1191
|
"X-Arkme-File-Name": encodeURIComponent(options.fileName ?? file.name ?? "attachment"),
|
|
1170
|
-
...expectedUserIdHeaders(options.expectedUserId)
|
|
1192
|
+
...expectedUserIdHeaders(options.expectedUserId),
|
|
1193
|
+
...options.retention ? { "X-Arkme-File-Retention": options.retention } : {}
|
|
1171
1194
|
},
|
|
1172
1195
|
body: file,
|
|
1173
1196
|
...options.signal === void 0 ? {} : { signal: options.signal }
|
|
@@ -5360,7 +5383,10 @@ window.__ModuleLoader__.load({
|
|
|
5360
5383
|
qrcode.stringToBytes;
|
|
5361
5384
|
//#endregion
|
|
5362
5385
|
//#region package.json
|
|
5363
|
-
var version$1 = "0.1.
|
|
5386
|
+
var version$1 = "0.1.46";
|
|
5387
|
+
//#endregion
|
|
5388
|
+
//#region src/client/arkme-billing.css?inline
|
|
5389
|
+
var arkme_billing_default = ".arkme-billing-backdrop {\n z-index: 120;\n backdrop-filter: blur(3px);\n background: #181b223d;\n place-items: center;\n padding: 28px;\n display: grid;\n position: fixed;\n inset: 0;\n}\n\n.arkme-billing-recharge-dialog, .arkme-billing-payment-dialog {\n color: #20232c;\n background: #fff;\n border: 1px solid #dedfe3;\n border-radius: 20px;\n width: min(620px, 100%);\n max-height: min(720px, 100vh - 56px);\n overflow-y: auto;\n box-shadow: 0 24px 72px #191c232e;\n}\n\n.arkme-billing-payment-dialog {\n width: min(420px, 100%);\n}\n\n.arkme-billing-dialog-header {\n border-bottom: 1px solid #ececef;\n justify-content: space-between;\n align-items: flex-start;\n gap: 18px;\n min-height: 78px;\n padding: 20px 22px 16px;\n display: flex;\n}\n\n.arkme-billing-dialog-header h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n line-height: 25px;\n}\n\n.arkme-billing-dialog-header p {\n overflow-wrap: anywhere;\n color: #8a8e96;\n margin: 4px 0 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-billing-dialog-header > button {\n color: #777c85;\n width: 32px;\n height: 32px;\n font: inherit;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n flex: none;\n place-items: center;\n font-size: 22px;\n display: grid;\n}\n\n.arkme-billing-dialog-header > button:hover {\n color: #20232c;\n background: #f3f3f5;\n}\n\n.arkme-billing-dialog-body {\n padding: 18px 22px 22px;\n}\n\n.arkme-billing-dialog-balance {\n border-bottom: 1px solid #ececef;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n column-gap: 12px;\n min-height: 48px;\n padding: 0 2px 16px;\n display: grid;\n}\n\n.arkme-billing-dialog-balance > span {\n color: #8a8e96;\n grid-column: 1;\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-billing-dialog-balance > strong {\n grid-column: 1;\n font-size: 22px;\n font-weight: 600;\n line-height: 28px;\n}\n\n.arkme-billing-dialog-balance > button, .arkme-billing-error > button {\n color: #626772;\n height: 30px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n grid-area: 1 / 2 / span 2;\n padding: 0 12px;\n font-size: 11px;\n}\n\n.arkme-billing-products-section, .arkme-billing-payment-section {\n padding-top: 17px;\n}\n\n.arkme-billing-products-section h3, .arkme-billing-payment-section h3 {\n color: #747984;\n margin: 0 0 11px;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.arkme-billing-product-grid {\n width: 100%;\n}\n\n.arkme-billing-product-grid > button {\n color: #20232c;\n min-width: 0;\n min-height: 62px;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 11px;\n align-content: center;\n gap: 4px;\n padding: 9px 11px;\n display: grid;\n}\n\n.arkme-billing-product-grid > button:hover {\n background: #f8f8f9;\n border-color: #cfd2d8;\n}\n\n.arkme-billing-product-grid > button.is-selected {\n border-color: #75839e;\n box-shadow: 0 0 0 1px #75839e;\n}\n\n.arkme-billing-product-grid > button > span {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n font-weight: 500;\n line-height: 17px;\n overflow: hidden;\n}\n\n.arkme-billing-product-grid > button > strong {\n font-size: 14px;\n font-weight: 600;\n line-height: 19px;\n}\n\n.arkme-billing-payment-actions {\n flex-wrap: wrap;\n gap: 10px;\n display: flex;\n}\n\n.arkme-billing-payment-actions > button {\n color: #333842;\n min-width: 154px;\n height: 38px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 10px;\n justify-content: center;\n align-items: center;\n gap: 8px;\n padding: 0 14px;\n font-size: 12px;\n display: inline-flex;\n}\n\n.arkme-billing-payment-actions > button:hover {\n background: #f7f7f8;\n border-color: #cfd3da;\n}\n\n.arkme-billing-payment-actions > button:disabled, .arkme-billing-product-grid > button:disabled {\n opacity: .48;\n cursor: default;\n}\n\n.arkme-billing-platform-icon {\n flex: none;\n width: 18px;\n height: 18px;\n}\n\n.arkme-billing-platform-icon.is-alipay {\n color: #1677ff;\n}\n\n.arkme-billing-platform-icon.is-wechat {\n color: #07c160;\n}\n\n.arkme-billing-state {\n color: #858992;\n margin: 12px 0 2px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-billing-error {\n color: #b54841;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n margin-top: 10px;\n font-size: 12px;\n line-height: 18px;\n display: flex;\n}\n\n.arkme-billing-error.is-purchase {\n justify-content: flex-start;\n}\n\n.arkme-billing-payment-content {\n text-align: center;\n justify-items: center;\n gap: 10px;\n padding: 28px 24px 18px;\n display: grid;\n}\n\n.arkme-billing-payment-content > .arkme-billing-platform-icon {\n width: 38px;\n height: 38px;\n margin-bottom: 4px;\n}\n\n.arkme-billing-payment-content > img {\n border-radius: 10px;\n width: 210px;\n height: 210px;\n}\n\n.arkme-billing-payment-content > strong {\n font-size: 14px;\n font-weight: 600;\n line-height: 21px;\n}\n\n.arkme-billing-payment-content > p {\n color: #858992;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-billing-payment-content.is-paid > strong {\n color: #16794f;\n font-size: 18px;\n line-height: 25px;\n}\n\n.arkme-billing-payment-content.is-paid > .arkme-billing-error {\n justify-content: center;\n}\n\n.arkme-billing-payment-content.is-crediting > strong {\n color: #335f9e;\n}\n\n.arkme-billing-dialog-actions {\n flex-wrap: wrap;\n justify-content: center;\n gap: 9px;\n padding: 0 22px 20px;\n display: flex;\n}\n\n.arkme-billing-dialog-actions > button, .arkme-billing-primary-action {\n color: #3c424d;\n height: 34px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n padding: 0 14px;\n font-size: 12px;\n}\n\n.arkme-billing-dialog-actions > .arkme-billing-primary-action, .arkme-billing-payment-content > .arkme-billing-primary-action {\n color: #fff;\n background: #20232d;\n border-color: #20232d;\n}\n";
|
|
5364
5390
|
//#endregion
|
|
5365
5391
|
//#region src/client/arkme-billing.ts
|
|
5366
5392
|
function createBillingClientRequestId(source = globalThis.crypto) {
|
|
@@ -5897,7 +5923,7 @@ window.__ModuleLoader__.load({
|
|
|
5897
5923
|
})
|
|
5898
5924
|
});
|
|
5899
5925
|
}
|
|
5900
|
-
function ArkmeBillingSettings() {
|
|
5926
|
+
function ArkmeBillingSettings({ active = true, renderTrigger } = {}) {
|
|
5901
5927
|
const [open, setOpen] = (0, react.useState)(false);
|
|
5902
5928
|
const [quotaState, setQuotaState] = (0, react.useState)({ kind: "loading" });
|
|
5903
5929
|
const [productsState, setProductsState] = (0, react.useState)({ kind: "loading" });
|
|
@@ -5912,15 +5938,20 @@ window.__ModuleLoader__.load({
|
|
|
5912
5938
|
const pollerRef = (0, react.useRef)();
|
|
5913
5939
|
const checkoutAttemptRef = (0, react.useRef)();
|
|
5914
5940
|
const selectedProductIdRef = (0, react.useRef)();
|
|
5941
|
+
const dialogRoot = (0, react.useRef)(null);
|
|
5915
5942
|
const quotaLoadGenerationRef = (0, react.useRef)(0);
|
|
5943
|
+
const quotaRequestRef = (0, react.useRef)();
|
|
5916
5944
|
const openPaymentUrl = (0, react.useCallback)((url) => {
|
|
5917
5945
|
window.open(url, "_blank", "noopener,noreferrer");
|
|
5918
5946
|
}, []);
|
|
5919
5947
|
const loadQuota = (0, react.useCallback)(async () => {
|
|
5920
5948
|
const generation = ++quotaLoadGenerationRef.current;
|
|
5949
|
+
quotaRequestRef.current?.abort();
|
|
5950
|
+
const request = new AbortController();
|
|
5951
|
+
quotaRequestRef.current = request;
|
|
5921
5952
|
setQuotaState({ kind: "loading" });
|
|
5922
5953
|
try {
|
|
5923
|
-
const quota = await callArkme("billing.quota");
|
|
5954
|
+
const quota = await callArkme("billing.quota", void 0, request.signal);
|
|
5924
5955
|
if (generation === quotaLoadGenerationRef.current) setQuotaState({
|
|
5925
5956
|
kind: "ready",
|
|
5926
5957
|
quota
|
|
@@ -5952,12 +5983,13 @@ window.__ModuleLoader__.load({
|
|
|
5952
5983
|
}
|
|
5953
5984
|
}, []);
|
|
5954
5985
|
(0, react.useEffect)(() => {
|
|
5955
|
-
loadQuota();
|
|
5956
|
-
|
|
5957
|
-
|
|
5958
|
-
|
|
5959
|
-
|
|
5960
|
-
|
|
5986
|
+
if (active) loadQuota();
|
|
5987
|
+
}, [active, loadQuota]);
|
|
5988
|
+
(0, react.useEffect)(() => () => {
|
|
5989
|
+
quotaLoadGenerationRef.current += 1;
|
|
5990
|
+
quotaRequestRef.current?.abort();
|
|
5991
|
+
pollerRef.current?.stop();
|
|
5992
|
+
}, []);
|
|
5961
5993
|
(0, react.useEffect)(() => {
|
|
5962
5994
|
if (open) loadProducts();
|
|
5963
5995
|
}, [loadProducts, open]);
|
|
@@ -6079,15 +6111,48 @@ window.__ModuleLoader__.load({
|
|
|
6079
6111
|
setOrder(void 0);
|
|
6080
6112
|
createPayment(paymentMethod, true);
|
|
6081
6113
|
};
|
|
6082
|
-
|
|
6083
|
-
|
|
6084
|
-
|
|
6085
|
-
|
|
6086
|
-
|
|
6087
|
-
|
|
6114
|
+
const triggerProps = {
|
|
6115
|
+
quotaState,
|
|
6116
|
+
onOpen: () => {
|
|
6117
|
+
setOpen(true);
|
|
6118
|
+
loadQuota();
|
|
6119
|
+
},
|
|
6120
|
+
onRefresh: () => {
|
|
6121
|
+
loadQuota();
|
|
6122
|
+
}
|
|
6123
|
+
};
|
|
6124
|
+
(0, react.useEffect)(() => {
|
|
6125
|
+
const dialog = dialogRoot.current;
|
|
6126
|
+
if (!dialog) return;
|
|
6127
|
+
const previous = document.activeElement;
|
|
6128
|
+
const controls = () => [...dialog.querySelectorAll("button:not(:disabled), [href], input:not(:disabled), [tabindex=\"0\"]")];
|
|
6129
|
+
controls()[0]?.focus();
|
|
6130
|
+
const keydown = (event) => {
|
|
6131
|
+
if (event.key === "Escape") {
|
|
6132
|
+
event.preventDefault();
|
|
6133
|
+
event.stopPropagation();
|
|
6134
|
+
if (order) closePayment();
|
|
6135
|
+
else closeRecharge();
|
|
6136
|
+
} else if (event.key === "Tab") {
|
|
6137
|
+
const items = controls(), first = items[0], last = items.at(-1);
|
|
6138
|
+
if (event.shiftKey && document.activeElement === first) {
|
|
6139
|
+
event.preventDefault();
|
|
6140
|
+
last?.focus();
|
|
6141
|
+
} else if (!event.shiftKey && document.activeElement === last) {
|
|
6142
|
+
event.preventDefault();
|
|
6143
|
+
first?.focus();
|
|
6144
|
+
}
|
|
6088
6145
|
}
|
|
6089
|
-
}
|
|
6090
|
-
|
|
6146
|
+
};
|
|
6147
|
+
dialog.addEventListener("keydown", keydown);
|
|
6148
|
+
return () => {
|
|
6149
|
+
dialog.removeEventListener("keydown", keydown);
|
|
6150
|
+
if (previous?.isConnected) previous.focus();
|
|
6151
|
+
};
|
|
6152
|
+
}, [open, order?.orderId]);
|
|
6153
|
+
const dialogs = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6154
|
+
ref: dialogRoot,
|
|
6155
|
+
children: [open && order === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeRechargeDialogView, {
|
|
6091
6156
|
quotaState,
|
|
6092
6157
|
productsState,
|
|
6093
6158
|
selectedProductId,
|
|
@@ -6104,8 +6169,7 @@ window.__ModuleLoader__.load({
|
|
|
6104
6169
|
onPurchase: (paymentMethod) => {
|
|
6105
6170
|
createPayment(paymentMethod);
|
|
6106
6171
|
}
|
|
6107
|
-
}),
|
|
6108
|
-
order !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmePaymentDialog, {
|
|
6172
|
+
}), order !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmePaymentDialog, {
|
|
6109
6173
|
order,
|
|
6110
6174
|
nowMillis,
|
|
6111
6175
|
statusError: orderStatusError,
|
|
@@ -6119,7 +6183,12 @@ window.__ModuleLoader__.load({
|
|
|
6119
6183
|
loadQuota();
|
|
6120
6184
|
},
|
|
6121
6185
|
onOpenPaymentUrl: openPaymentUrl
|
|
6122
|
-
})
|
|
6186
|
+
})]
|
|
6187
|
+
});
|
|
6188
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
6189
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("style", { children: arkme_billing_default }),
|
|
6190
|
+
renderTrigger ? renderTrigger(triggerProps) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeBalanceSettingsRowView, { ...triggerProps }),
|
|
6191
|
+
(open || order !== void 0) && (renderTrigger && typeof document !== "undefined" ? (0, react_dom.createPortal)(dialogs, document.body) : dialogs)
|
|
6123
6192
|
] });
|
|
6124
6193
|
}
|
|
6125
6194
|
//#endregion
|
|
@@ -8949,7 +9018,7 @@ window.__ModuleLoader__.load({
|
|
|
8949
9018
|
//#region src/client/ui-controller.ts
|
|
8950
9019
|
function sameSelectedSource(left, right) {
|
|
8951
9020
|
if (left === void 0 || right === void 0) return left === right;
|
|
8952
|
-
return left.sourceRef === right.sourceRef && left.sourceKey === right.sourceKey && left.kind === right.kind && left.displayName === right.displayName && left.latestPreview === right.latestPreview && left.activeAtMillis === right.activeAtMillis && left.unreadCount === right.unreadCount && left.hasUnreadMention === right.hasUnreadMention && left.badgeUnreadCount === right.badgeUnreadCount && left.notificationAllowed === right.notificationAllowed && left.isMuted === right.isMuted && left.isPinned === right.isPinned && left.latestSequence === right.latestSequence && left.avatarRef === right.avatarRef && (left.avatarRefs ?? []).join("|") === (right.avatarRefs ?? []).join("|") && JSON.stringify(left.groupAvatar) === JSON.stringify(right.groupAvatar);
|
|
9021
|
+
return left.sourceRef === right.sourceRef && left.sourceKey === right.sourceKey && left.kind === right.kind && left.displayName === right.displayName && left.latestPreview === right.latestPreview && left.activeAtMillis === right.activeAtMillis && left.unreadCount === right.unreadCount && left.hasUnreadMention === right.hasUnreadMention && left.badgeUnreadCount === right.badgeUnreadCount && left.notificationAllowed === right.notificationAllowed && left.directMessageAdmissionApplicable === right.directMessageAdmissionApplicable && left.isMuted === right.isMuted && left.isPinned === right.isPinned && left.latestSequence === right.latestSequence && left.avatarRef === right.avatarRef && (left.avatarRefs ?? []).join("|") === (right.avatarRefs ?? []).join("|") && JSON.stringify(left.groupAvatar) === JSON.stringify(right.groupAvatar);
|
|
8953
9022
|
}
|
|
8954
9023
|
function sameBot(left, right) {
|
|
8955
9024
|
if (left === void 0 || right === void 0) return left === right;
|
|
@@ -33164,6 +33233,212 @@ function(test) {
|
|
|
33164
33233
|
});
|
|
33165
33234
|
}
|
|
33166
33235
|
//#endregion
|
|
33236
|
+
//#region src/direct-message-admission.ts
|
|
33237
|
+
function directMessageAdmissionMessage(admission) {
|
|
33238
|
+
switch (admission.state) {
|
|
33239
|
+
case "allowed": return "";
|
|
33240
|
+
case "refused_by_self": return "你已拒收对方的消息";
|
|
33241
|
+
case "refused_by_counterpart": return "对方已拒收你的消息";
|
|
33242
|
+
case "mutually_refused": return "你们已互相拒收消息";
|
|
33243
|
+
}
|
|
33244
|
+
}
|
|
33245
|
+
//#endregion
|
|
33246
|
+
//#region src/client/direct-message-admission.ts
|
|
33247
|
+
async function requireDirectMessageSendAllowed(source, signal) {
|
|
33248
|
+
if (source.directMessageAdmissionApplicable !== true) return;
|
|
33249
|
+
let admission;
|
|
33250
|
+
try {
|
|
33251
|
+
admission = await callArkme("chat.direct-message-admission", { sourceRef: source.sourceRef }, signal);
|
|
33252
|
+
} catch {
|
|
33253
|
+
signal?.throwIfAborted();
|
|
33254
|
+
return;
|
|
33255
|
+
}
|
|
33256
|
+
if (!admission.canSend) throw new Error(`${source.displayName}:${directMessageAdmissionMessage(admission)}`);
|
|
33257
|
+
}
|
|
33258
|
+
function readCachedAdmission(scope) {
|
|
33259
|
+
if (scope === "") return void 0;
|
|
33260
|
+
try {
|
|
33261
|
+
const raw = typeof window === "undefined" ? null : window.localStorage?.getItem(`arkme.direct-message-admission.v1:${scope}`);
|
|
33262
|
+
if (raw == null) return void 0;
|
|
33263
|
+
const value = JSON.parse(raw);
|
|
33264
|
+
if (typeof value.ownRefused !== "boolean" || typeof value.counterpartRefused !== "boolean" || typeof value.refusalCreationEnabled !== "boolean" || typeof value.canSend !== "boolean" || !Number.isSafeInteger(value.ownRevision) || value.ownRevision < 0 || !Number.isSafeInteger(value.counterpartRevision) || value.counterpartRevision < 0 || value.ownRefused && value.ownRevision === 0 || value.counterpartRefused && value.counterpartRevision === 0) return void 0;
|
|
33265
|
+
const state = value.ownRefused ? value.counterpartRefused ? "mutually_refused" : "refused_by_self" : value.counterpartRefused ? "refused_by_counterpart" : "allowed";
|
|
33266
|
+
return value.state === state && value.canSend === (state === "allowed") ? value : void 0;
|
|
33267
|
+
} catch {
|
|
33268
|
+
return;
|
|
33269
|
+
}
|
|
33270
|
+
}
|
|
33271
|
+
function cacheAdmission(scope, admission) {
|
|
33272
|
+
try {
|
|
33273
|
+
if (scope !== "" && typeof window !== "undefined") window.localStorage?.setItem(`arkme.direct-message-admission.v1:${scope}`, JSON.stringify(admission));
|
|
33274
|
+
} catch {}
|
|
33275
|
+
}
|
|
33276
|
+
const listeners$1 = /* @__PURE__ */ new Set();
|
|
33277
|
+
function invalidateDirectMessageAdmission() {
|
|
33278
|
+
for (const listener of listeners$1) listener();
|
|
33279
|
+
}
|
|
33280
|
+
function useDirectMessageAdmission(account, sourceRef, applicable) {
|
|
33281
|
+
const scope = account !== void 0 && sourceRef !== void 0 && applicable ? `${account}:${sourceRef}` : "";
|
|
33282
|
+
const scopeRef = (0, react.useRef)(scope);
|
|
33283
|
+
scopeRef.current = scope;
|
|
33284
|
+
const [revision, setRevision] = (0, react.useState)(0);
|
|
33285
|
+
const [view, setView] = (0, react.useState)({
|
|
33286
|
+
scope: "",
|
|
33287
|
+
loading: false,
|
|
33288
|
+
mutating: false,
|
|
33289
|
+
error: ""
|
|
33290
|
+
});
|
|
33291
|
+
const queryAbort = (0, react.useRef)();
|
|
33292
|
+
const mutationAbort = (0, react.useRef)();
|
|
33293
|
+
const refresh = (0, react.useCallback)(() => {
|
|
33294
|
+
setRevision((value) => value + 1);
|
|
33295
|
+
}, []);
|
|
33296
|
+
(0, react.useEffect)(() => {
|
|
33297
|
+
if (scope === "") return;
|
|
33298
|
+
listeners$1.add(refresh);
|
|
33299
|
+
const browserWindow = typeof window === "undefined" ? void 0 : window;
|
|
33300
|
+
const browserDocument = typeof document === "undefined" ? void 0 : document;
|
|
33301
|
+
browserWindow?.addEventListener("focus", refresh);
|
|
33302
|
+
const visible = () => {
|
|
33303
|
+
if (browserDocument?.visibilityState === "visible") refresh();
|
|
33304
|
+
};
|
|
33305
|
+
browserDocument?.addEventListener("visibilitychange", visible);
|
|
33306
|
+
return () => {
|
|
33307
|
+
listeners$1.delete(refresh);
|
|
33308
|
+
browserWindow?.removeEventListener("focus", refresh);
|
|
33309
|
+
browserDocument?.removeEventListener("visibilitychange", visible);
|
|
33310
|
+
};
|
|
33311
|
+
}, [refresh, scope]);
|
|
33312
|
+
(0, react.useEffect)(() => () => {
|
|
33313
|
+
mutationAbort.current?.abort();
|
|
33314
|
+
mutationAbort.current = void 0;
|
|
33315
|
+
}, [scope]);
|
|
33316
|
+
(0, react.useEffect)(() => {
|
|
33317
|
+
if (scope === "" || sourceRef === void 0 || mutationAbort.current !== void 0) return;
|
|
33318
|
+
const controller = new AbortController();
|
|
33319
|
+
queryAbort.current = controller;
|
|
33320
|
+
setView((current) => {
|
|
33321
|
+
const admission = current.scope === scope ? current.admission : readCachedAdmission(scope);
|
|
33322
|
+
return {
|
|
33323
|
+
scope,
|
|
33324
|
+
...admission === void 0 ? {} : { admission },
|
|
33325
|
+
loading: true,
|
|
33326
|
+
mutating: false,
|
|
33327
|
+
error: ""
|
|
33328
|
+
};
|
|
33329
|
+
});
|
|
33330
|
+
callArkme("chat.direct-message-admission", { sourceRef }, controller.signal).then((admission) => {
|
|
33331
|
+
if (!controller.signal.aborted && scopeRef.current === scope) {
|
|
33332
|
+
cacheAdmission(scope, admission);
|
|
33333
|
+
setView({
|
|
33334
|
+
scope,
|
|
33335
|
+
admission,
|
|
33336
|
+
loading: false,
|
|
33337
|
+
mutating: false,
|
|
33338
|
+
error: ""
|
|
33339
|
+
});
|
|
33340
|
+
}
|
|
33341
|
+
}).catch(() => {
|
|
33342
|
+
if (!controller.signal.aborted && scopeRef.current === scope) setView((current) => ({
|
|
33343
|
+
...current,
|
|
33344
|
+
scope,
|
|
33345
|
+
loading: false,
|
|
33346
|
+
mutating: false,
|
|
33347
|
+
error: "暂时无法读取拒收设置"
|
|
33348
|
+
}));
|
|
33349
|
+
});
|
|
33350
|
+
return () => {
|
|
33351
|
+
controller.abort();
|
|
33352
|
+
};
|
|
33353
|
+
}, [
|
|
33354
|
+
scope,
|
|
33355
|
+
sourceRef,
|
|
33356
|
+
revision
|
|
33357
|
+
]);
|
|
33358
|
+
const current = view.scope === scope ? view : void 0;
|
|
33359
|
+
const toggle = async (confirmRefusal) => {
|
|
33360
|
+
if (scope === "" || sourceRef === void 0 || current?.loading || current?.mutating || mutationAbort.current !== void 0) return;
|
|
33361
|
+
if (current?.admission?.ownRefused === false && current.admission.refusalCreationEnabled === false) return;
|
|
33362
|
+
const controller = new AbortController();
|
|
33363
|
+
queryAbort.current?.abort();
|
|
33364
|
+
mutationAbort.current = controller;
|
|
33365
|
+
let admission = current?.admission;
|
|
33366
|
+
setView({
|
|
33367
|
+
scope,
|
|
33368
|
+
...admission === void 0 ? {} : { admission },
|
|
33369
|
+
loading: false,
|
|
33370
|
+
mutating: true,
|
|
33371
|
+
error: ""
|
|
33372
|
+
});
|
|
33373
|
+
let succeeded = false;
|
|
33374
|
+
let attemptedMutation = false;
|
|
33375
|
+
try {
|
|
33376
|
+
if (admission === void 0) {
|
|
33377
|
+
admission = await callArkme("chat.direct-message-admission", { sourceRef }, controller.signal);
|
|
33378
|
+
if (controller.signal.aborted || scopeRef.current !== scope) return;
|
|
33379
|
+
cacheAdmission(scope, admission);
|
|
33380
|
+
}
|
|
33381
|
+
if (!admission.ownRefused && (!admission.refusalCreationEnabled || confirmRefusal?.() === false)) {
|
|
33382
|
+
setView({
|
|
33383
|
+
scope,
|
|
33384
|
+
admission,
|
|
33385
|
+
loading: false,
|
|
33386
|
+
mutating: false,
|
|
33387
|
+
error: ""
|
|
33388
|
+
});
|
|
33389
|
+
return;
|
|
33390
|
+
}
|
|
33391
|
+
attemptedMutation = true;
|
|
33392
|
+
const next = await callArkme("chat.direct-message-refusal.set", {
|
|
33393
|
+
sourceRef,
|
|
33394
|
+
refused: !admission.ownRefused,
|
|
33395
|
+
expectedRevision: admission.ownRevision
|
|
33396
|
+
}, controller.signal);
|
|
33397
|
+
if (!controller.signal.aborted && scopeRef.current === scope) {
|
|
33398
|
+
cacheAdmission(scope, next);
|
|
33399
|
+
setView({
|
|
33400
|
+
scope,
|
|
33401
|
+
admission: next,
|
|
33402
|
+
loading: false,
|
|
33403
|
+
mutating: false,
|
|
33404
|
+
error: ""
|
|
33405
|
+
});
|
|
33406
|
+
succeeded = true;
|
|
33407
|
+
}
|
|
33408
|
+
} catch (error) {
|
|
33409
|
+
if (!controller.signal.aborted && scopeRef.current === scope) {
|
|
33410
|
+
const latest = error instanceof ArkmeClientError ? error.body.directMessageAdmission : void 0;
|
|
33411
|
+
if (latest !== void 0) cacheAdmission(scope, latest);
|
|
33412
|
+
const retained = latest ?? admission;
|
|
33413
|
+
setView({
|
|
33414
|
+
scope,
|
|
33415
|
+
...retained === void 0 ? {} : { admission: retained },
|
|
33416
|
+
loading: false,
|
|
33417
|
+
mutating: false,
|
|
33418
|
+
error: !attemptedMutation ? "暂时无法读取拒收设置" : error instanceof Error ? error.message : "拒收设置失败"
|
|
33419
|
+
});
|
|
33420
|
+
}
|
|
33421
|
+
} finally {
|
|
33422
|
+
if (mutationAbort.current === controller) mutationAbort.current = void 0;
|
|
33423
|
+
if (!controller.signal.aborted && scopeRef.current === scope) {
|
|
33424
|
+
if (succeeded) invalidateDirectMessageAdmission();
|
|
33425
|
+
else if (attemptedMutation) refresh();
|
|
33426
|
+
}
|
|
33427
|
+
}
|
|
33428
|
+
};
|
|
33429
|
+
const blocked = scope !== "" && current?.admission?.canSend === false;
|
|
33430
|
+
return {
|
|
33431
|
+
applicable: scope !== "",
|
|
33432
|
+
admission: current?.admission,
|
|
33433
|
+
blocked,
|
|
33434
|
+
error: current?.error ?? "",
|
|
33435
|
+
busy: current?.loading === true || current?.mutating === true,
|
|
33436
|
+
message: blocked && current?.admission !== void 0 ? directMessageAdmissionMessage(current.admission) : "",
|
|
33437
|
+
refresh,
|
|
33438
|
+
toggle
|
|
33439
|
+
};
|
|
33440
|
+
}
|
|
33441
|
+
//#endregion
|
|
33167
33442
|
//#region node_modules/@phosphor-icons/react/dist/defs/Robot.es.js
|
|
33168
33443
|
const e$36 = /* @__PURE__ */ new Map([
|
|
33169
33444
|
["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M72,104a16,16,0,1,1,16,16A16,16,0,0,1,72,104Zm96,16a16,16,0,1,0-16-16A16,16,0,0,0,168,120Zm68-40V192a36,36,0,0,1-36,36H56a36,36,0,0,1-36-36V80A36,36,0,0,1,56,44h60V16a12,12,0,0,1,24,0V44h60A36,36,0,0,1,236,80Zm-24,0a12,12,0,0,0-12-12H56A12,12,0,0,0,44,80V192a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12Zm-12,82a30,30,0,0,1-30,30H86a30,30,0,0,1,0-60h84A30,30,0,0,1,200,162Zm-80-6v12h16V156ZM86,168H96V156H86a6,6,0,0,0,0,12Zm90-6a6,6,0,0,0-6-6H160v12h10A6,6,0,0,0,176,162Z" }))],
|
|
@@ -33207,6 +33482,50 @@ function(test) {
|
|
|
33207
33482
|
o$11.displayName = "UserMinusIcon";
|
|
33208
33483
|
const m$5 = o$11;
|
|
33209
33484
|
//#endregion
|
|
33485
|
+
//#region node_modules/@phosphor-icons/react/dist/defs/Prohibit.es.js
|
|
33486
|
+
const t$5 = /* @__PURE__ */ new Map([
|
|
33487
|
+
["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm84,108a83.6,83.6,0,0,1-16.75,50.28L77.72,60.75A84,84,0,0,1,212,128ZM44,128A83.6,83.6,0,0,1,60.75,77.72L178.28,195.25A84,84,0,0,1,44,128Z" }))],
|
|
33488
|
+
["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
|
|
33489
|
+
d: "M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",
|
|
33490
|
+
opacity: "0.2"
|
|
33491
|
+
}), /* @__PURE__ */ react.createElement("path", { d: "M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.56,87.56,0,0,1-20.41,56.28L71.72,60.4A88,88,0,0,1,216,128ZM40,128A87.56,87.56,0,0,1,60.41,71.72L184.28,195.6A88,88,0,0,1,40,128Z" }))],
|
|
33492
|
+
["fill", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M200,128a71.69,71.69,0,0,1-15.78,44.91L83.09,71.78A71.95,71.95,0,0,1,200,128ZM56,128a71.95,71.95,0,0,0,116.91,56.22L71.78,83.09A71.69,71.69,0,0,0,56,128Zm180,0A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-20,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z" }))],
|
|
33493
|
+
["light", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm90,102a89.6,89.6,0,0,1-22.29,59.22L68.78,60.29A89.95,89.95,0,0,1,218,128ZM38,128A89.6,89.6,0,0,1,60.29,68.78L187.22,195.71A89.95,89.95,0,0,1,38,128Z" }))],
|
|
33494
|
+
["regular", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.56,87.56,0,0,1-20.41,56.28L71.72,60.4A88,88,0,0,1,216,128ZM40,128A87.56,87.56,0,0,1,60.41,71.72L184.28,195.6A88,88,0,0,1,40,128Z" }))],
|
|
33495
|
+
["thin", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm92,100a91.67,91.67,0,0,1-24.21,62.13L65.87,60.21A92,92,0,0,1,220,128ZM36,128A91.67,91.67,0,0,1,60.21,65.87L190.13,195.79A92,92,0,0,1,36,128Z" }))]
|
|
33496
|
+
]);
|
|
33497
|
+
//#endregion
|
|
33498
|
+
//#region node_modules/@phosphor-icons/react/dist/csr/Prohibit.es.js
|
|
33499
|
+
const r$8 = react.forwardRef((t, i) => /* @__PURE__ */ react.createElement(p$2, {
|
|
33500
|
+
ref: i,
|
|
33501
|
+
...t,
|
|
33502
|
+
weights: t$5
|
|
33503
|
+
}));
|
|
33504
|
+
r$8.displayName = "ProhibitIcon";
|
|
33505
|
+
const s$5 = r$8;
|
|
33506
|
+
//#endregion
|
|
33507
|
+
//#region node_modules/@phosphor-icons/react/dist/defs/Check.es.js
|
|
33508
|
+
const a$16 = /* @__PURE__ */ new Map([
|
|
33509
|
+
["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z" }))],
|
|
33510
|
+
["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
|
|
33511
|
+
d: "M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z",
|
|
33512
|
+
opacity: "0.2"
|
|
33513
|
+
}), /* @__PURE__ */ react.createElement("path", { d: "M205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z" }))],
|
|
33514
|
+
["fill", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z" }))],
|
|
33515
|
+
["light", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M228.24,76.24l-128,128a6,6,0,0,1-8.48,0l-56-56a6,6,0,0,1,8.48-8.48L96,191.51,219.76,67.76a6,6,0,0,1,8.48,8.48Z" }))],
|
|
33516
|
+
["regular", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z" }))],
|
|
33517
|
+
["thin", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M226.83,74.83l-128,128a4,4,0,0,1-5.66,0l-56-56a4,4,0,0,1,5.66-5.66L96,194.34,221.17,69.17a4,4,0,1,1,5.66,5.66Z" }))]
|
|
33518
|
+
]);
|
|
33519
|
+
//#endregion
|
|
33520
|
+
//#region node_modules/@phosphor-icons/react/dist/csr/Check.es.js
|
|
33521
|
+
const o$10 = react.forwardRef((c, r) => /* @__PURE__ */ react.createElement(p$2, {
|
|
33522
|
+
ref: r,
|
|
33523
|
+
...c,
|
|
33524
|
+
weights: a$16
|
|
33525
|
+
}));
|
|
33526
|
+
o$10.displayName = "CheckIcon";
|
|
33527
|
+
const n$6 = o$10;
|
|
33528
|
+
//#endregion
|
|
33210
33529
|
//#region node_modules/@phosphor-icons/react/dist/defs/UserPlus.es.js
|
|
33211
33530
|
const e$34 = /* @__PURE__ */ new Map([
|
|
33212
33531
|
["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M256,136a12,12,0,0,1-12,12h-8v8a12,12,0,0,1-24,0v-8h-8a12,12,0,0,1,0-24h8v-8a12,12,0,0,1,24,0v8h8A12,12,0,0,1,256,136Zm-54.81,56.28a12,12,0,1,1-18.38,15.44C169.12,191.42,145,172,108,172c-28.89,0-55.46,12.68-74.81,35.72a12,12,0,0,1-18.38-15.44A124.08,124.08,0,0,1,63.5,156.53a72,72,0,1,1,89,0A124,124,0,0,1,201.19,192.28ZM108,148a48,48,0,1,0-48-48A48.05,48.05,0,0,0,108,148Z" }))],
|
|
@@ -33221,13 +33540,32 @@ function(test) {
|
|
|
33221
33540
|
]);
|
|
33222
33541
|
//#endregion
|
|
33223
33542
|
//#region node_modules/@phosphor-icons/react/dist/csr/UserPlus.es.js
|
|
33224
|
-
const o$
|
|
33543
|
+
const o$9 = react.forwardRef((r, s) => /* @__PURE__ */ react.createElement(p$2, {
|
|
33225
33544
|
ref: s,
|
|
33226
33545
|
...r,
|
|
33227
33546
|
weights: e$34
|
|
33228
33547
|
}));
|
|
33229
|
-
o$
|
|
33230
|
-
const n$
|
|
33548
|
+
o$9.displayName = "UserPlusIcon";
|
|
33549
|
+
const n$5 = o$9;
|
|
33550
|
+
//#endregion
|
|
33551
|
+
//#region src/client/timeline-media.ts
|
|
33552
|
+
/** Same-version read failures may retain display, never claim a complete read. */
|
|
33553
|
+
function retainPartialTimelineMedia(previous, incoming) {
|
|
33554
|
+
const version = incoming.recordVersion ?? incoming.version ?? 0;
|
|
33555
|
+
if (incoming.mediaUnavailable !== true || incoming.status !== 1 || previous?.status !== 1 || previous.itemUid !== incoming.itemUid || version <= 0 || version !== (previous.recordVersion ?? previous.version)) return incoming;
|
|
33556
|
+
const current = incoming.contentBlocks ?? [];
|
|
33557
|
+
const assets = new Map(current.filter((block) => block.fileAssetUid).map((block) => [block.fileAssetUid, block]));
|
|
33558
|
+
const retained = (previous.contentBlocks ?? []).flatMap((block) => {
|
|
33559
|
+
if (!block.fileAssetUid) return current.length === 0 ? [block] : [];
|
|
33560
|
+
const replacement = assets.get(block.fileAssetUid);
|
|
33561
|
+
assets.delete(block.fileAssetUid);
|
|
33562
|
+
return [replacement ?? block];
|
|
33563
|
+
});
|
|
33564
|
+
return {
|
|
33565
|
+
...incoming,
|
|
33566
|
+
contentBlocks: [...retained, ...current.filter((block) => !block.fileAssetUid || assets.has(block.fileAssetUid))].sort((left, right) => left.sortOrder - right.sortOrder)
|
|
33567
|
+
};
|
|
33568
|
+
}
|
|
33231
33569
|
//#endregion
|
|
33232
33570
|
//#region src/client/member-event-hints.ts
|
|
33233
33571
|
const listeners = /* @__PURE__ */ new Set();
|
|
@@ -39554,7 +39892,7 @@ function(test) {
|
|
|
39554
39892
|
}
|
|
39555
39893
|
//#endregion
|
|
39556
39894
|
//#region node_modules/@phosphor-icons/react/dist/defs/Play.es.js
|
|
39557
|
-
const a$
|
|
39895
|
+
const a$15 = /* @__PURE__ */ new Map([
|
|
39558
39896
|
["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M234.49,111.07,90.41,22.94A20,20,0,0,0,60,39.87V216.13a20,20,0,0,0,30.41,16.93l144.08-88.13a19.82,19.82,0,0,0,0-33.86ZM84,208.85V47.15L216.16,128Z" }))],
|
|
39559
39897
|
["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
|
|
39560
39898
|
d: "M228.23,134.69,84.15,222.81A8,8,0,0,1,72,216.12V39.88a8,8,0,0,1,12.15-6.69l144.08,88.12A7.82,7.82,0,0,1,228.23,134.69Z",
|
|
@@ -39567,13 +39905,13 @@ function(test) {
|
|
|
39567
39905
|
]);
|
|
39568
39906
|
//#endregion
|
|
39569
39907
|
//#region node_modules/@phosphor-icons/react/dist/csr/Play.es.js
|
|
39570
|
-
const a$
|
|
39908
|
+
const a$14 = react.forwardRef((e, r) => /* @__PURE__ */ react.createElement(p$2, {
|
|
39571
39909
|
ref: r,
|
|
39572
39910
|
...e,
|
|
39573
|
-
weights: a$
|
|
39911
|
+
weights: a$15
|
|
39574
39912
|
}));
|
|
39575
|
-
a$
|
|
39576
|
-
const n$
|
|
39913
|
+
a$14.displayName = "PlayIcon";
|
|
39914
|
+
const n$4 = a$14;
|
|
39577
39915
|
//#endregion
|
|
39578
39916
|
//#region node_modules/@phosphor-icons/react/dist/defs/Pause.es.js
|
|
39579
39917
|
const e$33 = /* @__PURE__ */ new Map([
|
|
@@ -39589,13 +39927,13 @@ function(test) {
|
|
|
39589
39927
|
]);
|
|
39590
39928
|
//#endregion
|
|
39591
39929
|
//#region node_modules/@phosphor-icons/react/dist/csr/Pause.es.js
|
|
39592
|
-
const o$
|
|
39930
|
+
const o$8 = react.forwardRef((a, r) => /* @__PURE__ */ react.createElement(p$2, {
|
|
39593
39931
|
ref: r,
|
|
39594
39932
|
...a,
|
|
39595
39933
|
weights: e$33
|
|
39596
39934
|
}));
|
|
39597
|
-
o$
|
|
39598
|
-
const n$
|
|
39935
|
+
o$8.displayName = "PauseIcon";
|
|
39936
|
+
const n$3 = o$8;
|
|
39599
39937
|
//#endregion
|
|
39600
39938
|
//#region node_modules/@phosphor-icons/react/dist/defs/SpinnerGap.es.js
|
|
39601
39939
|
const e$32 = /* @__PURE__ */ new Map([
|
|
@@ -39611,13 +39949,13 @@ function(test) {
|
|
|
39611
39949
|
]);
|
|
39612
39950
|
//#endregion
|
|
39613
39951
|
//#region node_modules/@phosphor-icons/react/dist/csr/SpinnerGap.es.js
|
|
39614
|
-
const o$
|
|
39952
|
+
const o$7 = react.forwardRef((r, n) => /* @__PURE__ */ react.createElement(p$2, {
|
|
39615
39953
|
ref: n,
|
|
39616
39954
|
...r,
|
|
39617
39955
|
weights: e$32
|
|
39618
39956
|
}));
|
|
39619
|
-
o$
|
|
39620
|
-
const m$4 = o$
|
|
39957
|
+
o$7.displayName = "SpinnerGapIcon";
|
|
39958
|
+
const m$4 = o$7;
|
|
39621
39959
|
//#endregion
|
|
39622
39960
|
//#region node_modules/mediabunny/dist/modules/src/misc.js
|
|
39623
39961
|
/*!
|
|
@@ -53358,11 +53696,11 @@ function(test) {
|
|
|
53358
53696
|
"aria-hidden": true,
|
|
53359
53697
|
className: "arkme-icon-spin",
|
|
53360
53698
|
"data-arkme-voice-loading": "true"
|
|
53361
|
-
}) : status === "playing" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
53699
|
+
}) : status === "playing" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, {
|
|
53362
53700
|
size: 16,
|
|
53363
53701
|
weight: "fill",
|
|
53364
53702
|
"aria-hidden": true
|
|
53365
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
53703
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
|
|
53366
53704
|
size: 16,
|
|
53367
53705
|
weight: "fill",
|
|
53368
53706
|
"aria-hidden": true
|
|
@@ -54705,12 +55043,12 @@ function(test) {
|
|
|
54705
55043
|
renderLink
|
|
54706
55044
|
});
|
|
54707
55045
|
}
|
|
54708
|
-
function
|
|
55046
|
+
function arkmeContentMediaUrl(block) {
|
|
54709
55047
|
if (block.localFileRef !== void 0) return arkmeLocalFileUrl(block.localFileRef);
|
|
54710
55048
|
return `${mediaRoute$1}?ref=${encodeURIComponent(block.mediaRef)}`;
|
|
54711
55049
|
}
|
|
54712
55050
|
function mediaAttemptUrl(block, attempt) {
|
|
54713
|
-
const url =
|
|
55051
|
+
const url = arkmeContentMediaUrl(block);
|
|
54714
55052
|
return attempt > 0 ? `${url}${url.includes("?") ? "&" : "?"}retry=${String(attempt)}` : url;
|
|
54715
55053
|
}
|
|
54716
55054
|
function UploadProgress({ block }) {
|
|
@@ -55130,7 +55468,7 @@ function(test) {
|
|
|
55130
55468
|
const [imageMode, setImageMode] = (0, react.useState)("contained");
|
|
55131
55469
|
const [imageDragging, setImageDragging] = (0, react.useState)(false);
|
|
55132
55470
|
const original = useArkmeOriginal(selected, selected.kind === "image");
|
|
55133
|
-
const originalUrl = previewUrl ?? (original.localRef === void 0 ?
|
|
55471
|
+
const originalUrl = previewUrl ?? (original.localRef === void 0 ? arkmeContentMediaUrl(selected) : arkmeLocalFileUrl(original.localRef));
|
|
55134
55472
|
(0, react.useEffect)(() => {
|
|
55135
55473
|
setImageMode("contained");
|
|
55136
55474
|
setImageDragging(false);
|
|
@@ -55402,27 +55740,19 @@ function(test) {
|
|
|
55402
55740
|
function arkmeRelatedRecordingItemFromSharedRecording(item) {
|
|
55403
55741
|
return item.sharedRecording === void 0 ? void 0 : arkmeRelatedRecordingItemFromSharedRecordingPreview(item.sharedRecording, item);
|
|
55404
55742
|
}
|
|
55405
|
-
function ArkmeMessageContent({ item, sourceRef, onLongArticleUpdated, highlightMentions = false, collapseText = true, presentation = "bubble", shareWebsite, onMessageCopyLinkOpen }) {
|
|
55743
|
+
function ArkmeMessageContent({ item, sourceRef, onLongArticleUpdated, highlightMentions = false, collapseText = true, presentation = "bubble", shareWebsite, onMessageCopyLinkOpen, mediaSelectionIsExplicit = false }) {
|
|
55406
55744
|
const lastMedia = (0, react.useRef)();
|
|
55407
55745
|
const snapshot = lastMedia.current;
|
|
55408
55746
|
const previous = snapshot !== void 0 && snapshot.sourceRef === sourceRef ? snapshot.item : void 0;
|
|
55409
55747
|
const version = item.recordVersion ?? item.version;
|
|
55410
|
-
const
|
|
55411
|
-
const displayBlocks = (item.mediaUnavailable === true && sameRevision && item.status === 1 && previous?.status === 1 && previous.itemUid === item.itemUid && (item.contentBlocks?.length ?? 0) === 0 ? previous.contentBlocks : void 0) ?? item.contentBlocks;
|
|
55748
|
+
const display = mediaSelectionIsExplicit ? item : retainPartialTimelineMedia(previous, item);
|
|
55412
55749
|
(0, react.useEffect)(() => {
|
|
55413
55750
|
lastMedia.current = {
|
|
55414
55751
|
sourceRef,
|
|
55415
|
-
item:
|
|
55416
|
-
...item,
|
|
55417
|
-
...displayBlocks === void 0 ? {} : { contentBlocks: displayBlocks }
|
|
55418
|
-
}
|
|
55752
|
+
item: display
|
|
55419
55753
|
};
|
|
55420
|
-
}, [
|
|
55421
|
-
|
|
55422
|
-
sourceRef,
|
|
55423
|
-
displayBlocks
|
|
55424
|
-
]);
|
|
55425
|
-
const blocks = [...displayBlocks ?? []].sort((left, right) => left.sortOrder - right.sortOrder);
|
|
55754
|
+
}, [display, sourceRef]);
|
|
55755
|
+
const blocks = [...display.contentBlocks ?? []].sort((left, right) => left.sortOrder - right.sortOrder);
|
|
55426
55756
|
const visualBlocks = blocks.filter((block) => block.kind !== "audio");
|
|
55427
55757
|
const [preview, setPreview] = (0, react.useState)();
|
|
55428
55758
|
const [articleOpen, setArticleOpen] = (0, react.useState)(false);
|
|
@@ -56893,41 +57223,6 @@ function(test) {
|
|
|
56893
57223
|
});
|
|
56894
57224
|
}
|
|
56895
57225
|
//#endregion
|
|
56896
|
-
//#region src/chat-attention.ts
|
|
56897
|
-
function integerLikeValue(value) {
|
|
56898
|
-
if (typeof value === "number" && Number.isFinite(value)) return Math.trunc(value);
|
|
56899
|
-
if (typeof value !== "string" || value.trim() === "") return void 0;
|
|
56900
|
-
const parsed = Number(value.trim());
|
|
56901
|
-
return Number.isFinite(parsed) ? Math.trunc(parsed) : void 0;
|
|
56902
|
-
}
|
|
56903
|
-
function arkmeChatPolicyNotificationDisabled(policy) {
|
|
56904
|
-
if (policy === null || typeof policy !== "object" || Array.isArray(policy)) return void 0;
|
|
56905
|
-
const value = policy;
|
|
56906
|
-
const muteState = integerLikeValue(value.mute_state ?? value.muteState);
|
|
56907
|
-
const notifyState = integerLikeValue(value.notify_state ?? value.notifyState);
|
|
56908
|
-
if (muteState === 2 || notifyState === 2) return true;
|
|
56909
|
-
if (muteState === 1 || notifyState === 1) return false;
|
|
56910
|
-
}
|
|
56911
|
-
function projectArkmeChatAttention(rawUnreadCount, policy, fallbackMuted = false) {
|
|
56912
|
-
const unreadCount = Math.max(0, integerLikeValue(rawUnreadCount) ?? 0);
|
|
56913
|
-
const isMuted = arkmeChatPolicyNotificationDisabled(policy) ?? fallbackMuted;
|
|
56914
|
-
const notificationAllowed = !isMuted;
|
|
56915
|
-
return {
|
|
56916
|
-
unreadCount,
|
|
56917
|
-
badgeUnreadCount: notificationAllowed ? unreadCount : 0,
|
|
56918
|
-
notificationAllowed,
|
|
56919
|
-
isMuted
|
|
56920
|
-
};
|
|
56921
|
-
}
|
|
56922
|
-
function projectArkmeChatAttentionFromMuted(rawUnreadCount, isMuted) {
|
|
56923
|
-
return projectArkmeChatAttention(rawUnreadCount, void 0, isMuted);
|
|
56924
|
-
}
|
|
56925
|
-
function arkmeBadgeUnreadCount(value) {
|
|
56926
|
-
if (value.notificationAllowed === false || value.isMuted === true) return 0;
|
|
56927
|
-
if (typeof value.badgeUnreadCount === "number" && Number.isFinite(value.badgeUnreadCount)) return Math.max(0, Math.trunc(value.badgeUnreadCount));
|
|
56928
|
-
return value.notificationAllowed ?? true ? Math.max(0, Math.trunc(value.unreadCount ?? 0)) : 0;
|
|
56929
|
-
}
|
|
56930
|
-
//#endregion
|
|
56931
57226
|
//#region src/client/file-send-tasks.ts
|
|
56932
57227
|
function localFileBlock(file, sortOrder = 0) {
|
|
56933
57228
|
return {
|
|
@@ -57101,6 +57396,316 @@ function(test) {
|
|
|
57101
57396
|
};
|
|
57102
57397
|
}
|
|
57103
57398
|
//#endregion
|
|
57399
|
+
//#region src/client/record-reedit-submissions.ts
|
|
57400
|
+
/** Shared by display handoff and receipt acknowledgement; newer edits always win. */
|
|
57401
|
+
function recordReeditProjectionSettled(item, job) {
|
|
57402
|
+
if (!job.result || item.itemUid !== job.itemUid) return false;
|
|
57403
|
+
const version = item.recordVersion ?? item.version ?? 0;
|
|
57404
|
+
return version > job.result.version || version === job.result.version && (item.status !== 1 || item.mediaUnavailable !== true);
|
|
57405
|
+
}
|
|
57406
|
+
function projectRecordReedit(item, jobs) {
|
|
57407
|
+
const job = jobs.find((value) => value.itemUid === item.itemUid);
|
|
57408
|
+
const version = item.recordVersion ?? item.version ?? 0;
|
|
57409
|
+
if (!job || item.status !== 1 || (job.result ? recordReeditProjectionSettled(item, job) : version > job.baseVersion)) return item;
|
|
57410
|
+
const voiceBlock = job.voiceFileAssetUid ? [...item.contentBlocks ?? [], ...job.voiceBlock ? [job.voiceBlock] : []].find((block) => block.kind === "audio" && block.fileAssetUid === job.voiceFileAssetUid) : void 0;
|
|
57411
|
+
return {
|
|
57412
|
+
...item,
|
|
57413
|
+
title: job.title,
|
|
57414
|
+
textContent: job.textContent,
|
|
57415
|
+
mediaUnavailable: Boolean(job.voiceFileAssetUid && !voiceBlock),
|
|
57416
|
+
contentBlocks: [...voiceBlock ? [voiceBlock] : [], ...job.attachments.flatMap((attachment, index) => {
|
|
57417
|
+
const block = attachment.localFile ? localFileBlock(attachment.localFile, index) : (item.contentBlocks ?? []).find((value) => value.fileAssetUid === attachment.asset.fileAssetUid) ?? attachment.block ?? {
|
|
57418
|
+
kind: "file",
|
|
57419
|
+
mediaRef: "",
|
|
57420
|
+
fileName: attachment.asset.fileName,
|
|
57421
|
+
mimeType: attachment.asset.mimeType,
|
|
57422
|
+
size: attachment.asset.size,
|
|
57423
|
+
sortOrder: index
|
|
57424
|
+
};
|
|
57425
|
+
return block ? [{
|
|
57426
|
+
...block,
|
|
57427
|
+
sortOrder: index
|
|
57428
|
+
}] : [];
|
|
57429
|
+
})]
|
|
57430
|
+
};
|
|
57431
|
+
}
|
|
57432
|
+
/** Activates Host recovery explicitly and hands receipts off to the canonical timeline. */
|
|
57433
|
+
function useRecordReeditSubmissions(sourceRef, accountKey, active, items, refreshCurrentWindow, sourceKey) {
|
|
57434
|
+
const key = JSON.stringify([
|
|
57435
|
+
sourceKey,
|
|
57436
|
+
accountKey,
|
|
57437
|
+
active
|
|
57438
|
+
]);
|
|
57439
|
+
const scope = (0, react.useRef)({
|
|
57440
|
+
key,
|
|
57441
|
+
sourceRef,
|
|
57442
|
+
generation: 0,
|
|
57443
|
+
requestGeneration: 0
|
|
57444
|
+
});
|
|
57445
|
+
if (scope.current.key !== key || scope.current.sourceRef !== sourceRef) scope.current = {
|
|
57446
|
+
key,
|
|
57447
|
+
sourceRef,
|
|
57448
|
+
generation: scope.current.generation + (scope.current.key === key ? 0 : 1),
|
|
57449
|
+
requestGeneration: scope.current.requestGeneration + 1
|
|
57450
|
+
};
|
|
57451
|
+
const { generation, requestGeneration } = scope.current;
|
|
57452
|
+
const revision = (0, react.useRef)(0);
|
|
57453
|
+
const resumedGeneration = (0, react.useRef)(-1);
|
|
57454
|
+
const [snapshot, setSnapshot] = (0, react.useState)({
|
|
57455
|
+
key,
|
|
57456
|
+
generation,
|
|
57457
|
+
requestGeneration: -1,
|
|
57458
|
+
jobs: []
|
|
57459
|
+
});
|
|
57460
|
+
const jobs = snapshot.key === key && snapshot.generation === generation ? snapshot.jobs : [];
|
|
57461
|
+
const needsDiscovery = snapshot.key !== key || snapshot.generation !== generation || snapshot.requestGeneration !== requestGeneration;
|
|
57462
|
+
const needsPolling = needsDiscovery || jobs.some((job) => job.state === "pending" || job.state === "committing" || job.state === "uncertain" || job.result && items.some((item) => item.itemUid === job.itemUid));
|
|
57463
|
+
const refresh = (0, react.useCallback)(async (reconcile = false) => {
|
|
57464
|
+
if (!sourceRef || !accountKey || !active) return;
|
|
57465
|
+
const started = revision.current;
|
|
57466
|
+
if (reconcile) await callArkme("source.record-reedit.resume", {
|
|
57467
|
+
sourceRef,
|
|
57468
|
+
reconcile: true
|
|
57469
|
+
});
|
|
57470
|
+
const jobs = await callArkme("source.record-reedit.submissions", { sourceRef });
|
|
57471
|
+
if (scope.current.requestGeneration !== requestGeneration || scope.current.generation !== generation || scope.current.key !== key || started !== revision.current || !Array.isArray(jobs)) return;
|
|
57472
|
+
setSnapshot({
|
|
57473
|
+
key,
|
|
57474
|
+
generation,
|
|
57475
|
+
requestGeneration,
|
|
57476
|
+
jobs
|
|
57477
|
+
});
|
|
57478
|
+
}, [
|
|
57479
|
+
sourceRef,
|
|
57480
|
+
accountKey,
|
|
57481
|
+
active,
|
|
57482
|
+
key,
|
|
57483
|
+
generation,
|
|
57484
|
+
requestGeneration
|
|
57485
|
+
]);
|
|
57486
|
+
(0, react.useEffect)(() => {
|
|
57487
|
+
let disposed = false;
|
|
57488
|
+
let timer;
|
|
57489
|
+
const poll = async () => {
|
|
57490
|
+
if (resumedGeneration.current !== requestGeneration) try {
|
|
57491
|
+
await callArkme("source.record-reedit.resume", { sourceRef });
|
|
57492
|
+
if (!disposed) resumedGeneration.current = requestGeneration;
|
|
57493
|
+
} catch {}
|
|
57494
|
+
if (disposed) return;
|
|
57495
|
+
try {
|
|
57496
|
+
await refresh();
|
|
57497
|
+
} catch {}
|
|
57498
|
+
if (!disposed) timer = setTimeout(() => {
|
|
57499
|
+
poll();
|
|
57500
|
+
}, 1500);
|
|
57501
|
+
};
|
|
57502
|
+
if (active && sourceRef && accountKey && needsPolling) if (needsDiscovery) poll();
|
|
57503
|
+
else timer = setTimeout(() => {
|
|
57504
|
+
poll();
|
|
57505
|
+
}, 1500);
|
|
57506
|
+
return () => {
|
|
57507
|
+
disposed = true;
|
|
57508
|
+
clearTimeout(timer);
|
|
57509
|
+
};
|
|
57510
|
+
}, [
|
|
57511
|
+
refresh,
|
|
57512
|
+
active,
|
|
57513
|
+
sourceRef,
|
|
57514
|
+
accountKey,
|
|
57515
|
+
needsPolling,
|
|
57516
|
+
needsDiscovery,
|
|
57517
|
+
requestGeneration
|
|
57518
|
+
]);
|
|
57519
|
+
const accepted = (0, react.useCallback)((job) => {
|
|
57520
|
+
if (scope.current.key !== key || scope.current.generation !== generation) return;
|
|
57521
|
+
revision.current += 1;
|
|
57522
|
+
setSnapshot((previous) => ({
|
|
57523
|
+
...previous,
|
|
57524
|
+
key,
|
|
57525
|
+
generation,
|
|
57526
|
+
jobs: [...(previous.key === key && previous.generation === generation ? previous.jobs : []).filter((value) => value.itemUid !== job.itemUid), job]
|
|
57527
|
+
}));
|
|
57528
|
+
}, [key, generation]);
|
|
57529
|
+
const projectionWindow = (0, react.useRef)({
|
|
57530
|
+
items,
|
|
57531
|
+
refreshCurrentWindow
|
|
57532
|
+
});
|
|
57533
|
+
projectionWindow.current = {
|
|
57534
|
+
items,
|
|
57535
|
+
refreshCurrentWindow
|
|
57536
|
+
};
|
|
57537
|
+
(0, react.useEffect)(() => {
|
|
57538
|
+
if (!active || !sourceRef || !accountKey || scope.current.key !== key || scope.current.generation !== generation) return;
|
|
57539
|
+
const current = projectionWindow.current;
|
|
57540
|
+
for (const job of jobs) if (job.result && current.items.some((item) => recordReeditProjectionSettled(item, job))) callArkme("source.record-reedit.acknowledge", {
|
|
57541
|
+
sourceRef,
|
|
57542
|
+
submissionId: job.submissionId,
|
|
57543
|
+
version: job.result.version
|
|
57544
|
+
}).catch(() => void 0);
|
|
57545
|
+
if (jobs.some((job) => job.result && current.items.some((item) => item.itemUid === job.itemUid && !recordReeditProjectionSettled(item, job)))) current.refreshCurrentWindow().catch(() => void 0);
|
|
57546
|
+
}, [
|
|
57547
|
+
jobs,
|
|
57548
|
+
sourceRef,
|
|
57549
|
+
accountKey,
|
|
57550
|
+
active,
|
|
57551
|
+
key,
|
|
57552
|
+
generation
|
|
57553
|
+
]);
|
|
57554
|
+
return {
|
|
57555
|
+
jobs,
|
|
57556
|
+
accepted,
|
|
57557
|
+
refresh
|
|
57558
|
+
};
|
|
57559
|
+
}
|
|
57560
|
+
//#endregion
|
|
57561
|
+
//#region src/client/record-reedit-editors.ts
|
|
57562
|
+
const scopeKey = (scope) => JSON.stringify([scope.accountKey, scope.sourceKey]);
|
|
57563
|
+
const editorKey = (scope, itemUid) => JSON.stringify([scopeKey(scope), itemUid]);
|
|
57564
|
+
/** In-memory input owner; Host drafts and accepted submission receipts keep their existing owners. */
|
|
57565
|
+
function useRecordReeditEditors() {
|
|
57566
|
+
const [state, setState] = (0, react.useState)(() => ({
|
|
57567
|
+
candidates: /* @__PURE__ */ new Map(),
|
|
57568
|
+
selected: /* @__PURE__ */ new Map(),
|
|
57569
|
+
currentKey: void 0
|
|
57570
|
+
}));
|
|
57571
|
+
const stateRef = (0, react.useRef)(state);
|
|
57572
|
+
const composerRef = (0, react.useRef)();
|
|
57573
|
+
const publish = (0, react.useCallback)((next) => {
|
|
57574
|
+
stateRef.current = next;
|
|
57575
|
+
composerRef.current = next.currentKey === void 0 ? void 0 : next.candidates.get(next.currentKey);
|
|
57576
|
+
setState(next);
|
|
57577
|
+
}, []);
|
|
57578
|
+
const updateCandidate = (0, react.useCallback)((target, update) => {
|
|
57579
|
+
const previous = stateRef.current;
|
|
57580
|
+
const key = editorKey(target, target.item.itemUid);
|
|
57581
|
+
const current = previous.candidates.get(key);
|
|
57582
|
+
if (current === void 0 || current.persisted !== target.persisted) return;
|
|
57583
|
+
const value = update(current);
|
|
57584
|
+
if (value === current) return;
|
|
57585
|
+
const next = {
|
|
57586
|
+
...previous,
|
|
57587
|
+
candidates: new Map(previous.candidates),
|
|
57588
|
+
selected: new Map(previous.selected)
|
|
57589
|
+
};
|
|
57590
|
+
if (value === void 0) {
|
|
57591
|
+
next.candidates.delete(key);
|
|
57592
|
+
if (next.selected.get(scopeKey(target)) === key) next.selected.delete(scopeKey(target));
|
|
57593
|
+
if (next.currentKey === key) next.currentKey = void 0;
|
|
57594
|
+
} else next.candidates.set(key, value);
|
|
57595
|
+
publish(next);
|
|
57596
|
+
}, [publish]);
|
|
57597
|
+
const setComposer = (0, react.useCallback)((update) => {
|
|
57598
|
+
const current = composerRef.current;
|
|
57599
|
+
const value = typeof update === "function" ? update(current) : update;
|
|
57600
|
+
if (value === current) return;
|
|
57601
|
+
if (value === void 0) {
|
|
57602
|
+
if (current !== void 0) updateCandidate(current, () => void 0);
|
|
57603
|
+
return;
|
|
57604
|
+
}
|
|
57605
|
+
const previous = stateRef.current;
|
|
57606
|
+
const key = editorKey(value, value.item.itemUid);
|
|
57607
|
+
publish({
|
|
57608
|
+
candidates: new Map(previous.candidates).set(key, value),
|
|
57609
|
+
selected: new Map(previous.selected).set(scopeKey(value), key),
|
|
57610
|
+
currentKey: key
|
|
57611
|
+
});
|
|
57612
|
+
}, [publish, updateCandidate]);
|
|
57613
|
+
const activateScope = (0, react.useCallback)((scope, generation) => {
|
|
57614
|
+
const previous = stateRef.current;
|
|
57615
|
+
const key = previous.selected.get(scopeKey(scope));
|
|
57616
|
+
const current = key === void 0 ? void 0 : previous.candidates.get(key);
|
|
57617
|
+
const candidates = new Map(previous.candidates);
|
|
57618
|
+
if (current !== void 0 && key !== void 0) candidates.set(key, {
|
|
57619
|
+
...current,
|
|
57620
|
+
generation
|
|
57621
|
+
});
|
|
57622
|
+
publish({
|
|
57623
|
+
...previous,
|
|
57624
|
+
candidates,
|
|
57625
|
+
currentKey: key
|
|
57626
|
+
});
|
|
57627
|
+
}, [publish]);
|
|
57628
|
+
const findCandidate = (0, react.useCallback)((scope, itemUid) => stateRef.current.candidates.get(editorKey(scope, itemUid)), []);
|
|
57629
|
+
return {
|
|
57630
|
+
composer: state.currentKey === void 0 ? void 0 : state.candidates.get(state.currentKey),
|
|
57631
|
+
composerRef,
|
|
57632
|
+
setComposer,
|
|
57633
|
+
updateCandidate,
|
|
57634
|
+
activateScope,
|
|
57635
|
+
findCandidate
|
|
57636
|
+
};
|
|
57637
|
+
}
|
|
57638
|
+
//#endregion
|
|
57639
|
+
//#region src/client/conversation-timeline-refresh.ts
|
|
57640
|
+
/** Refresh the loaded records, not the navigation window. Apply only after all reads succeed. */
|
|
57641
|
+
async function readConversationTimelineWindow(snapshot, readPage, signal) {
|
|
57642
|
+
const records = snapshot.items.filter((item) => item.status === 1 && item.awaitingTimelineProjection !== true);
|
|
57643
|
+
const aroundRange = snapshot.mode === "around" ? snapshot.aroundSequenceRange : void 0;
|
|
57644
|
+
const sequenced = aroundRange !== void 0 || records.length > 0 && records.every((item) => (item.sequence ?? 0) > 0);
|
|
57645
|
+
const oldest = records.reduce((previous, item) => previous === void 0 || (sequenced ? item.sequence < previous.sequence : item.sendAtMillis < previous.sendAtMillis || item.sendAtMillis === previous.sendAtMillis && item.itemUid < previous.itemUid) ? item : previous, void 0);
|
|
57646
|
+
const minimumSequence = aroundRange?.minimumSequence ?? oldest?.sequence ?? 0;
|
|
57647
|
+
const maximumSequence = aroundRange?.maximumSequence ?? Math.max(...records.map((item) => item.sequence ?? 0));
|
|
57648
|
+
let cursor = snapshot.mode === "around" && sequenced ? { beforeSequence: maximumSequence + 1 } : void 0;
|
|
57649
|
+
const ids = new Set(snapshot.items.map((item) => item.itemUid));
|
|
57650
|
+
const items = /* @__PURE__ */ new Map();
|
|
57651
|
+
const visited = /* @__PURE__ */ new Set();
|
|
57652
|
+
let first;
|
|
57653
|
+
for (;;) {
|
|
57654
|
+
signal.throwIfAborted();
|
|
57655
|
+
const key = JSON.stringify(cursor ?? null);
|
|
57656
|
+
if (visited.has(key)) throw new Error("消息列表刷新游标未推进");
|
|
57657
|
+
visited.add(key);
|
|
57658
|
+
const page = await readPage(cursor);
|
|
57659
|
+
signal.throwIfAborted();
|
|
57660
|
+
first ??= page;
|
|
57661
|
+
for (const item of page.items) {
|
|
57662
|
+
if (aroundRange !== void 0 && ((item.sequence ?? 0) < minimumSequence || (item.sequence ?? 0) > maximumSequence)) continue;
|
|
57663
|
+
if (ids.has(item.itemUid) || oldest === void 0 || (sequenced ? (item.sequence ?? 0) >= minimumSequence : item.sendAtMillis > oldest.sendAtMillis || item.sendAtMillis === oldest.sendAtMillis && item.itemUid >= oldest.itemUid)) items.set(item.itemUid, item);
|
|
57664
|
+
}
|
|
57665
|
+
if ((sequenced ? page.items.some((item) => item.sequence === minimumSequence) || (page.nextCursor?.beforeSequence ?? Infinity) <= minimumSequence : oldest === void 0 || page.items.some((item) => item.itemUid === oldest.itemUid) || (page.nextCursor?.sendAtMillis ?? Infinity) < oldest.sendAtMillis || page.nextCursor?.sendAtMillis === oldest.sendAtMillis && page.nextCursor.itemUid !== void 0 && page.nextCursor.itemUid <= oldest.itemUid) || !page.hasMore) return {
|
|
57666
|
+
...first,
|
|
57667
|
+
items: [...items.values()]
|
|
57668
|
+
};
|
|
57669
|
+
if (page.nextCursor === void 0) throw new Error("消息列表刷新缺少分页游标");
|
|
57670
|
+
cursor = page.nextCursor;
|
|
57671
|
+
}
|
|
57672
|
+
}
|
|
57673
|
+
//#endregion
|
|
57674
|
+
//#region src/chat-attention.ts
|
|
57675
|
+
function integerLikeValue(value) {
|
|
57676
|
+
if (typeof value === "number" && Number.isFinite(value)) return Math.trunc(value);
|
|
57677
|
+
if (typeof value !== "string" || value.trim() === "") return void 0;
|
|
57678
|
+
const parsed = Number(value.trim());
|
|
57679
|
+
return Number.isFinite(parsed) ? Math.trunc(parsed) : void 0;
|
|
57680
|
+
}
|
|
57681
|
+
function arkmeChatPolicyNotificationDisabled(policy) {
|
|
57682
|
+
if (policy === null || typeof policy !== "object" || Array.isArray(policy)) return void 0;
|
|
57683
|
+
const value = policy;
|
|
57684
|
+
const muteState = integerLikeValue(value.mute_state ?? value.muteState);
|
|
57685
|
+
const notifyState = integerLikeValue(value.notify_state ?? value.notifyState);
|
|
57686
|
+
if (muteState === 2 || notifyState === 2) return true;
|
|
57687
|
+
if (muteState === 1 || notifyState === 1) return false;
|
|
57688
|
+
}
|
|
57689
|
+
function projectArkmeChatAttention(rawUnreadCount, policy, fallbackMuted = false) {
|
|
57690
|
+
const unreadCount = Math.max(0, integerLikeValue(rawUnreadCount) ?? 0);
|
|
57691
|
+
const isMuted = arkmeChatPolicyNotificationDisabled(policy) ?? fallbackMuted;
|
|
57692
|
+
const notificationAllowed = !isMuted;
|
|
57693
|
+
return {
|
|
57694
|
+
unreadCount,
|
|
57695
|
+
badgeUnreadCount: notificationAllowed ? unreadCount : 0,
|
|
57696
|
+
notificationAllowed,
|
|
57697
|
+
isMuted
|
|
57698
|
+
};
|
|
57699
|
+
}
|
|
57700
|
+
function projectArkmeChatAttentionFromMuted(rawUnreadCount, isMuted) {
|
|
57701
|
+
return projectArkmeChatAttention(rawUnreadCount, void 0, isMuted);
|
|
57702
|
+
}
|
|
57703
|
+
function arkmeBadgeUnreadCount(value) {
|
|
57704
|
+
if (value.notificationAllowed === false || value.isMuted === true) return 0;
|
|
57705
|
+
if (typeof value.badgeUnreadCount === "number" && Number.isFinite(value.badgeUnreadCount)) return Math.max(0, Math.trunc(value.badgeUnreadCount));
|
|
57706
|
+
return value.notificationAllowed ?? true ? Math.max(0, Math.trunc(value.unreadCount ?? 0)) : 0;
|
|
57707
|
+
}
|
|
57708
|
+
//#endregion
|
|
57104
57709
|
//#region src/client/read-intent-visibility.ts
|
|
57105
57710
|
function arkmeVisibleReadIntentAllowed(documentRef = typeof document === "undefined" ? void 0 : document) {
|
|
57106
57711
|
if (documentRef === void 0) return true;
|
|
@@ -57119,7 +57724,7 @@ function(test) {
|
|
|
57119
57724
|
}
|
|
57120
57725
|
//#endregion
|
|
57121
57726
|
//#region node_modules/@phosphor-icons/react/dist/defs/ArrowLeft.es.js
|
|
57122
|
-
const a$
|
|
57727
|
+
const a$13 = /* @__PURE__ */ new Map([
|
|
57123
57728
|
["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M228,128a12,12,0,0,1-12,12H69l51.52,51.51a12,12,0,0,1-17,17l-72-72a12,12,0,0,1,0-17l72-72a12,12,0,0,1,17,17L69,116H216A12,12,0,0,1,228,128Z" }))],
|
|
57124
57729
|
["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
|
|
57125
57730
|
d: "M112,56V200L40,128Z",
|
|
@@ -57132,16 +57737,16 @@ function(test) {
|
|
|
57132
57737
|
]);
|
|
57133
57738
|
//#endregion
|
|
57134
57739
|
//#region node_modules/@phosphor-icons/react/dist/csr/ArrowLeft.es.js
|
|
57135
|
-
const r$
|
|
57740
|
+
const r$7 = react.forwardRef((e, t) => /* @__PURE__ */ react.createElement(p$2, {
|
|
57136
57741
|
ref: t,
|
|
57137
57742
|
...e,
|
|
57138
|
-
weights: a$
|
|
57743
|
+
weights: a$13
|
|
57139
57744
|
}));
|
|
57140
|
-
r$
|
|
57141
|
-
const s$
|
|
57745
|
+
r$7.displayName = "ArrowLeftIcon";
|
|
57746
|
+
const s$4 = r$7;
|
|
57142
57747
|
//#endregion
|
|
57143
57748
|
//#region node_modules/@phosphor-icons/react/dist/defs/ArrowUp.es.js
|
|
57144
|
-
const a$
|
|
57749
|
+
const a$12 = /* @__PURE__ */ new Map([
|
|
57145
57750
|
["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M208.49,120.49a12,12,0,0,1-17,0L140,69V216a12,12,0,0,1-24,0V69L64.49,120.49a12,12,0,0,1-17-17l72-72a12,12,0,0,1,17,0l72,72A12,12,0,0,1,208.49,120.49Z" }))],
|
|
57146
57751
|
["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
|
|
57147
57752
|
d: "M200,112H56l72-72Z",
|
|
@@ -57154,16 +57759,16 @@ function(test) {
|
|
|
57154
57759
|
]);
|
|
57155
57760
|
//#endregion
|
|
57156
57761
|
//#region node_modules/@phosphor-icons/react/dist/csr/ArrowUp.es.js
|
|
57157
|
-
const r$
|
|
57762
|
+
const r$6 = react.forwardRef((e, t) => /* @__PURE__ */ react.createElement(p$2, {
|
|
57158
57763
|
ref: t,
|
|
57159
57764
|
...e,
|
|
57160
|
-
weights: a$
|
|
57765
|
+
weights: a$12
|
|
57161
57766
|
}));
|
|
57162
|
-
r$
|
|
57163
|
-
const s$
|
|
57767
|
+
r$6.displayName = "ArrowUpIcon";
|
|
57768
|
+
const s$3 = r$6;
|
|
57164
57769
|
//#endregion
|
|
57165
57770
|
//#region node_modules/@phosphor-icons/react/dist/defs/Plus.es.js
|
|
57166
|
-
const a$
|
|
57771
|
+
const a$11 = /* @__PURE__ */ new Map([
|
|
57167
57772
|
["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z" }))],
|
|
57168
57773
|
["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
|
|
57169
57774
|
d: "M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",
|
|
@@ -57179,32 +57784,10 @@ function(test) {
|
|
|
57179
57784
|
const e$31 = react.forwardRef((r, s) => /* @__PURE__ */ react.createElement(p$2, {
|
|
57180
57785
|
ref: s,
|
|
57181
57786
|
...r,
|
|
57182
|
-
weights: a$
|
|
57787
|
+
weights: a$11
|
|
57183
57788
|
}));
|
|
57184
57789
|
e$31.displayName = "PlusIcon";
|
|
57185
|
-
const n$
|
|
57186
|
-
//#endregion
|
|
57187
|
-
//#region node_modules/@phosphor-icons/react/dist/defs/Prohibit.es.js
|
|
57188
|
-
const t$5 = /* @__PURE__ */ new Map([
|
|
57189
|
-
["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm84,108a83.6,83.6,0,0,1-16.75,50.28L77.72,60.75A84,84,0,0,1,212,128ZM44,128A83.6,83.6,0,0,1,60.75,77.72L178.28,195.25A84,84,0,0,1,44,128Z" }))],
|
|
57190
|
-
["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
|
|
57191
|
-
d: "M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",
|
|
57192
|
-
opacity: "0.2"
|
|
57193
|
-
}), /* @__PURE__ */ react.createElement("path", { d: "M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.56,87.56,0,0,1-20.41,56.28L71.72,60.4A88,88,0,0,1,216,128ZM40,128A87.56,87.56,0,0,1,60.41,71.72L184.28,195.6A88,88,0,0,1,40,128Z" }))],
|
|
57194
|
-
["fill", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M200,128a71.69,71.69,0,0,1-15.78,44.91L83.09,71.78A71.95,71.95,0,0,1,200,128ZM56,128a71.95,71.95,0,0,0,116.91,56.22L71.78,83.09A71.69,71.69,0,0,0,56,128Zm180,0A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-20,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z" }))],
|
|
57195
|
-
["light", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm90,102a89.6,89.6,0,0,1-22.29,59.22L68.78,60.29A89.95,89.95,0,0,1,218,128ZM38,128A89.6,89.6,0,0,1,60.29,68.78L187.22,195.71A89.95,89.95,0,0,1,38,128Z" }))],
|
|
57196
|
-
["regular", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.56,87.56,0,0,1-20.41,56.28L71.72,60.4A88,88,0,0,1,216,128ZM40,128A87.56,87.56,0,0,1,60.41,71.72L184.28,195.6A88,88,0,0,1,40,128Z" }))],
|
|
57197
|
-
["thin", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm92,100a91.67,91.67,0,0,1-24.21,62.13L65.87,60.21A92,92,0,0,1,220,128ZM36,128A91.67,91.67,0,0,1,60.21,65.87L190.13,195.79A92,92,0,0,1,36,128Z" }))]
|
|
57198
|
-
]);
|
|
57199
|
-
//#endregion
|
|
57200
|
-
//#region node_modules/@phosphor-icons/react/dist/csr/Prohibit.es.js
|
|
57201
|
-
const r$6 = react.forwardRef((t, i) => /* @__PURE__ */ react.createElement(p$2, {
|
|
57202
|
-
ref: i,
|
|
57203
|
-
...t,
|
|
57204
|
-
weights: t$5
|
|
57205
|
-
}));
|
|
57206
|
-
r$6.displayName = "ProhibitIcon";
|
|
57207
|
-
const s$3 = r$6;
|
|
57790
|
+
const n$2 = e$31;
|
|
57208
57791
|
//#endregion
|
|
57209
57792
|
//#region node_modules/@phosphor-icons/react/dist/defs/Sparkle.es.js
|
|
57210
57793
|
const l$1 = /* @__PURE__ */ new Map([
|
|
@@ -57220,13 +57803,13 @@ function(test) {
|
|
|
57220
57803
|
]);
|
|
57221
57804
|
//#endregion
|
|
57222
57805
|
//#region node_modules/@phosphor-icons/react/dist/csr/Sparkle.es.js
|
|
57223
|
-
const o$
|
|
57806
|
+
const o$6 = react.forwardRef((r, a) => /* @__PURE__ */ react.createElement(p$2, {
|
|
57224
57807
|
ref: a,
|
|
57225
57808
|
...r,
|
|
57226
57809
|
weights: l$1
|
|
57227
57810
|
}));
|
|
57228
|
-
o$
|
|
57229
|
-
const s$2 = o$
|
|
57811
|
+
o$6.displayName = "SparkleIcon";
|
|
57812
|
+
const s$2 = o$6;
|
|
57230
57813
|
//#endregion
|
|
57231
57814
|
//#region src/client/arkme-assets.ts
|
|
57232
57815
|
/** Transparent Arkme application mark used by public DSH brand slots. */
|
|
@@ -59633,7 +60216,7 @@ function(test) {
|
|
|
59633
60216
|
setView("rules");
|
|
59634
60217
|
setError("");
|
|
59635
60218
|
},
|
|
59636
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$
|
|
60219
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$4, { size: 18 })
|
|
59637
60220
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {}),
|
|
59638
60221
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
59639
60222
|
style: styles$48.aiHeaderTitle,
|
|
@@ -59746,7 +60329,7 @@ function(test) {
|
|
|
59746
60329
|
openEditor();
|
|
59747
60330
|
},
|
|
59748
60331
|
children: [
|
|
59749
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
60332
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, { size: 16 }),
|
|
59750
60333
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
59751
60334
|
style: styles$48.aiRuleName,
|
|
59752
60335
|
children: "新建规则"
|
|
@@ -59846,7 +60429,7 @@ function(test) {
|
|
|
59846
60429
|
onClick: () => {
|
|
59847
60430
|
generateRule();
|
|
59848
60431
|
},
|
|
59849
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$
|
|
60432
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$3, {
|
|
59850
60433
|
size: 16,
|
|
59851
60434
|
weight: "bold"
|
|
59852
60435
|
})
|
|
@@ -60022,7 +60605,7 @@ function(test) {
|
|
|
60022
60605
|
display: "grid",
|
|
60023
60606
|
placeItems: "center"
|
|
60024
60607
|
},
|
|
60025
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$
|
|
60608
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$5, { size: 18 })
|
|
60026
60609
|
}),
|
|
60027
60610
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "禁止加入名单" }),
|
|
60028
60611
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
@@ -65285,29 +65868,7 @@ function(test) {
|
|
|
65285
65868
|
weights: e$29
|
|
65286
65869
|
}));
|
|
65287
65870
|
e$28.displayName = "ClockCounterClockwiseIcon";
|
|
65288
|
-
const a$
|
|
65289
|
-
//#endregion
|
|
65290
|
-
//#region node_modules/@phosphor-icons/react/dist/defs/Check.es.js
|
|
65291
|
-
const a$10 = /* @__PURE__ */ new Map([
|
|
65292
|
-
["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z" }))],
|
|
65293
|
-
["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
|
|
65294
|
-
d: "M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z",
|
|
65295
|
-
opacity: "0.2"
|
|
65296
|
-
}), /* @__PURE__ */ react.createElement("path", { d: "M205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z" }))],
|
|
65297
|
-
["fill", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z" }))],
|
|
65298
|
-
["light", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M228.24,76.24l-128,128a6,6,0,0,1-8.48,0l-56-56a6,6,0,0,1,8.48-8.48L96,191.51,219.76,67.76a6,6,0,0,1,8.48,8.48Z" }))],
|
|
65299
|
-
["regular", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z" }))],
|
|
65300
|
-
["thin", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M226.83,74.83l-128,128a4,4,0,0,1-5.66,0l-56-56a4,4,0,0,1,5.66-5.66L96,194.34,221.17,69.17a4,4,0,1,1,5.66,5.66Z" }))]
|
|
65301
|
-
]);
|
|
65302
|
-
//#endregion
|
|
65303
|
-
//#region node_modules/@phosphor-icons/react/dist/csr/Check.es.js
|
|
65304
|
-
const o$6 = react.forwardRef((c, r) => /* @__PURE__ */ react.createElement(p$2, {
|
|
65305
|
-
ref: r,
|
|
65306
|
-
...c,
|
|
65307
|
-
weights: a$10
|
|
65308
|
-
}));
|
|
65309
|
-
o$6.displayName = "CheckIcon";
|
|
65310
|
-
const n$2 = o$6;
|
|
65871
|
+
const a$10 = e$28;
|
|
65311
65872
|
//#endregion
|
|
65312
65873
|
//#region node_modules/@phosphor-icons/react/dist/defs/ArrowCounterClockwise.es.js
|
|
65313
65874
|
const e$27 = /* @__PURE__ */ new Map([
|
|
@@ -68323,7 +68884,7 @@ function(test) {
|
|
|
68323
68884
|
style: styles$42.optionLabel,
|
|
68324
68885
|
children: [option.label, option.isCurrentUser ? "(我)" : ""]
|
|
68325
68886
|
}),
|
|
68326
|
-
selected && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
68887
|
+
selected && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$6, {
|
|
68327
68888
|
size: 14,
|
|
68328
68889
|
"aria-label": "已选择"
|
|
68329
68890
|
})
|
|
@@ -68499,7 +69060,7 @@ function(test) {
|
|
|
68499
69060
|
mutate();
|
|
68500
69061
|
},
|
|
68501
69062
|
children: [
|
|
68502
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
69063
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, { size: 15 }),
|
|
68503
69064
|
"添加“",
|
|
68504
69065
|
newSpeakerName,
|
|
68505
69066
|
"”为说话人"
|
|
@@ -69566,11 +70127,11 @@ function(test) {
|
|
|
69566
70127
|
onClick: onTogglePlayback,
|
|
69567
70128
|
"aria-label": playbackLoading ? "取消录音加载" : isPlaying ? "暂停录音" : "播放录音",
|
|
69568
70129
|
title: playbackLoading ? "加载中,点击取消" : isPlaying ? "暂停" : "播放",
|
|
69569
|
-
children: isPlaying || playbackLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
70130
|
+
children: isPlaying || playbackLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, {
|
|
69570
70131
|
size: 10,
|
|
69571
70132
|
weight: "fill",
|
|
69572
70133
|
"aria-hidden": true
|
|
69573
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
70134
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
|
|
69574
70135
|
size: 10,
|
|
69575
70136
|
weight: "fill",
|
|
69576
70137
|
"aria-hidden": true
|
|
@@ -99210,7 +99771,7 @@ function(test) {
|
|
|
99210
99771
|
placeItems: "center",
|
|
99211
99772
|
background: "transparent"
|
|
99212
99773
|
},
|
|
99213
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
99774
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, { size: 18 })
|
|
99214
99775
|
}),
|
|
99215
99776
|
source === "doubao" && pending && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
|
|
99216
99777
|
role: "status",
|
|
@@ -100021,7 +100582,7 @@ function(test) {
|
|
|
100021
100582
|
cursor: "inherit",
|
|
100022
100583
|
opacity: disabled && !sent ? .4 : 1
|
|
100023
100584
|
}
|
|
100024
|
-
}), checked && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
100585
|
+
}), checked && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$6, {
|
|
100025
100586
|
"aria-hidden": true,
|
|
100026
100587
|
size: 14,
|
|
100027
100588
|
weight: "bold",
|
|
@@ -101625,7 +102186,7 @@ function(test) {
|
|
|
101625
102186
|
}),
|
|
101626
102187
|
variant === "model" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
101627
102188
|
style: styles$40.analysisDropdownCheck,
|
|
101628
|
-
children: isSelected && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
102189
|
+
children: isSelected && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$6, {
|
|
101629
102190
|
size: 18,
|
|
101630
102191
|
"aria-hidden": true
|
|
101631
102192
|
})
|
|
@@ -102436,7 +102997,7 @@ function(test) {
|
|
|
102436
102997
|
setVisibleMonth(monthStart(today));
|
|
102437
102998
|
setSelectedDate(today);
|
|
102438
102999
|
},
|
|
102439
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(a$
|
|
103000
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(a$10, { size: 18 }), "回到今日"]
|
|
102440
103001
|
})]
|
|
102441
103002
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
102442
103003
|
style: styles$40.calendarGrid,
|
|
@@ -104780,7 +105341,7 @@ function(test) {
|
|
|
104780
105341
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
104781
105342
|
style: styles$39.videoPlay,
|
|
104782
105343
|
"aria-hidden": "true",
|
|
104783
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
105344
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
|
|
104784
105345
|
size: 25,
|
|
104785
105346
|
weight: "fill"
|
|
104786
105347
|
})
|
|
@@ -104800,7 +105361,7 @@ function(test) {
|
|
|
104800
105361
|
onClick: () => {
|
|
104801
105362
|
startVideoPlayback(realMain);
|
|
104802
105363
|
},
|
|
104803
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
105364
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
|
|
104804
105365
|
size: 25,
|
|
104805
105366
|
weight: "fill"
|
|
104806
105367
|
})
|
|
@@ -104847,10 +105408,10 @@ function(test) {
|
|
|
104847
105408
|
style: styles$39.videoControlButton,
|
|
104848
105409
|
"aria-label": videoPlaying ? "暂停视频记录" : "继续播放视频记录",
|
|
104849
105410
|
onClick: toggleVideoPlayback,
|
|
104850
|
-
children: videoPlaying ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
105411
|
+
children: videoPlaying ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, {
|
|
104851
105412
|
size: 15,
|
|
104852
105413
|
weight: "fill"
|
|
104853
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
105414
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
|
|
104854
105415
|
size: 15,
|
|
104855
105416
|
weight: "fill"
|
|
104856
105417
|
})
|
|
@@ -105003,7 +105564,7 @@ function(test) {
|
|
|
105003
105564
|
onClick: () => {
|
|
105004
105565
|
openPicker();
|
|
105005
105566
|
},
|
|
105006
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
105567
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, { size: 16 }), "发起通话"]
|
|
105007
105568
|
})
|
|
105008
105569
|
]
|
|
105009
105570
|
})
|
|
@@ -108670,7 +109231,7 @@ function(test) {
|
|
|
108670
109231
|
style: styles$38.backButton,
|
|
108671
109232
|
"aria-label": "返回世界",
|
|
108672
109233
|
onClick: onBackToWorld,
|
|
108673
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$
|
|
109234
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$4, {
|
|
108674
109235
|
size: 18,
|
|
108675
109236
|
weight: "bold"
|
|
108676
109237
|
})
|
|
@@ -108713,7 +109274,7 @@ function(test) {
|
|
|
108713
109274
|
},
|
|
108714
109275
|
"aria-label": "发世界",
|
|
108715
109276
|
onClick: onOpenComposer,
|
|
108716
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
109277
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, {
|
|
108717
109278
|
size: 14,
|
|
108718
109279
|
weight: "regular",
|
|
108719
109280
|
"aria-hidden": true
|
|
@@ -109072,7 +109633,7 @@ function(test) {
|
|
|
109072
109633
|
children: [
|
|
109073
109634
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
109074
109635
|
style: styles$38.publishUploadIcon,
|
|
109075
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
109636
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, {
|
|
109076
109637
|
size: 18,
|
|
109077
109638
|
weight: "regular",
|
|
109078
109639
|
"aria-hidden": true
|
|
@@ -109116,7 +109677,7 @@ function(test) {
|
|
|
109116
109677
|
onClick: () => {
|
|
109117
109678
|
fileInputRef.current?.click();
|
|
109118
109679
|
},
|
|
109119
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
109680
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, {
|
|
109120
109681
|
size: 19,
|
|
109121
109682
|
weight: "regular",
|
|
109122
109683
|
"aria-hidden": true
|
|
@@ -109996,7 +110557,7 @@ function(test) {
|
|
|
109996
110557
|
})
|
|
109997
110558
|
});
|
|
109998
110559
|
}
|
|
109999
|
-
function ArkmeAttachmentStrip({ attachments, disabled, onMove, onRemove, onPreview }) {
|
|
110560
|
+
function ArkmeAttachmentStrip({ attachments, disabled, onMove, onRemove, onPreview, canPreview }) {
|
|
110000
110561
|
const dragging = (0, react.useRef)();
|
|
110001
110562
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
110002
110563
|
role: "list",
|
|
@@ -110061,7 +110622,7 @@ function(test) {
|
|
|
110061
110622
|
asset: metadata,
|
|
110062
110623
|
disabled,
|
|
110063
110624
|
...previewUrl === void 0 ? {} : { previewUrl },
|
|
110064
|
-
...attachment.localFile
|
|
110625
|
+
...canPreview?.(attachment) ?? attachment.localFile !== void 0 ? { onOpen: () => onPreview(attachment) } : {},
|
|
110065
110626
|
onRemove: () => {
|
|
110066
110627
|
if (!disabled) onRemove(attachment);
|
|
110067
110628
|
}
|
|
@@ -140140,7 +140701,10 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
140140
140701
|
if (!editor) return void 0;
|
|
140141
140702
|
const rect = editor.view.coordsAtPos(editor.state.selection.head);
|
|
140142
140703
|
return {
|
|
140143
|
-
|
|
140704
|
+
left: rect.left,
|
|
140705
|
+
right: rect.right,
|
|
140706
|
+
top: rect.top,
|
|
140707
|
+
bottom: rect.bottom,
|
|
140144
140708
|
width: rect.right - rect.left,
|
|
140145
140709
|
height: rect.bottom - rect.top
|
|
140146
140710
|
};
|
|
@@ -167436,10 +168000,22 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
167436
168000
|
});
|
|
167437
168001
|
}
|
|
167438
168002
|
//#endregion
|
|
168003
|
+
//#region src/chat-pin-projection.ts
|
|
168004
|
+
/** Policy freshness is independent of message sequence and event delivery order. */
|
|
168005
|
+
function retainNewerArkmeChatPin(current, incoming) {
|
|
168006
|
+
if (incoming.kind !== "private_chat" && incoming.kind !== "group_chat" || current?.kind !== incoming.kind || current.isPinned === void 0 || current.chatPolicyUpdatedAtMillis === void 0 || current.chatPolicyUpdatedAtMillis <= (incoming.chatPolicyUpdatedAtMillis ?? 0)) return incoming;
|
|
168007
|
+
return {
|
|
168008
|
+
...incoming,
|
|
168009
|
+
isPinned: current.isPinned,
|
|
168010
|
+
chatPolicyUpdatedAtMillis: current.chatPolicyUpdatedAtMillis
|
|
168011
|
+
};
|
|
168012
|
+
}
|
|
168013
|
+
//#endregion
|
|
167439
168014
|
//#region src/client/chat-directory-store.ts
|
|
167440
168015
|
const DEFAULT_ROOT_CACHE_MAX_AGE_MS = 3e4;
|
|
167441
168016
|
const ROOT_DIRECTORY_PAGE_LIMIT = 20;
|
|
167442
168017
|
const MAX_ROOT_PAGES = 10;
|
|
168018
|
+
const ROOT_READ_RETRY_DELAYS_MS = [2e3, 4e3];
|
|
167443
168019
|
function clientAccountScopeKey(scope) {
|
|
167444
168020
|
if (typeof scope === "number") return Number.isSafeInteger(scope) && scope > 0 ? String(scope) : void 0;
|
|
167445
168021
|
const normalized = scope?.trim();
|
|
@@ -167525,7 +168101,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
167525
168101
|
const existingSequence = normalizedSequence(existing?.latestSequence);
|
|
167526
168102
|
const sourceSequence = normalizedSequence(source.latestSequence);
|
|
167527
168103
|
const sourceWithAvatarPresentation = retainRealtimeAvatarPresentation(existing, source);
|
|
167528
|
-
return applyReadWatermark(projectSourceAttention(existing !== void 0 && sourceSequence < existingSequence ? (() => {
|
|
168104
|
+
return applyReadWatermark(projectSourceAttention(retainNewerArkmeChatPin(existing, existing !== void 0 && sourceSequence < existingSequence ? (() => {
|
|
167529
168105
|
const latestPreview = existing.latestPreview ?? sourceWithAvatarPresentation.latestPreview;
|
|
167530
168106
|
return {
|
|
167531
168107
|
...sourceWithAvatarPresentation,
|
|
@@ -167542,7 +168118,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
167542
168118
|
activeAtMillis: Math.max(existing?.activeAtMillis ?? 0, source.activeAtMillis),
|
|
167543
168119
|
...hasUnreadMention === void 0 ? {} : { hasUnreadMention }
|
|
167544
168120
|
};
|
|
167545
|
-
})() }), watermarks, indexes, sourceKey);
|
|
168121
|
+
})() })), watermarks, indexes, sourceKey);
|
|
167546
168122
|
}
|
|
167547
168123
|
function sourceUpdate(update) {
|
|
167548
168124
|
if ("source" in update) return update;
|
|
@@ -167555,6 +168131,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
167555
168131
|
return normalizedSourceKey(source.sourceKey) ?? source.sourceRef;
|
|
167556
168132
|
}
|
|
167557
168133
|
const DIRECTORY_SOURCE_SCALAR_FIELDS = {
|
|
168134
|
+
directMessageAdmissionApplicable: true,
|
|
167558
168135
|
sourceRef: true,
|
|
167559
168136
|
sourceKey: true,
|
|
167560
168137
|
peerUserId: true,
|
|
@@ -167574,6 +168151,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
167574
168151
|
hasUnreadMention: true,
|
|
167575
168152
|
isMuted: true,
|
|
167576
168153
|
isPinned: true,
|
|
168154
|
+
chatPolicyUpdatedAtMillis: true,
|
|
167577
168155
|
latestSequence: true,
|
|
167578
168156
|
recordCount: true
|
|
167579
168157
|
};
|
|
@@ -167600,7 +168178,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
167600
168178
|
const currentByIdentity = new Map(current.map((source) => [directorySourceIdentity(source), source]));
|
|
167601
168179
|
const reconciled = incoming.map((source) => {
|
|
167602
168180
|
const previous = currentByIdentity.get(directorySourceIdentity(source));
|
|
167603
|
-
|
|
168181
|
+
const projected = retainNewerArkmeChatPin(previous, source);
|
|
168182
|
+
return previous !== void 0 && sameDirectorySourcePresentation(previous, projected) ? previous : projected;
|
|
167604
168183
|
});
|
|
167605
168184
|
return reconciled.length === current.length && reconciled.every((source, index) => source === current[index]) ? current : reconciled;
|
|
167606
168185
|
}
|
|
@@ -167699,13 +168278,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
167699
168278
|
async refreshRoot(options = {}) {
|
|
167700
168279
|
if (options.force !== true && this.refreshedAtMillis > 0 && this.now() - this.refreshedAtMillis < this.maxAgeMs) return [...this.snapshot.sources];
|
|
167701
168280
|
if (this.refreshInFlight !== void 0) {
|
|
167702
|
-
if (options.silent
|
|
167703
|
-
this.
|
|
167704
|
-
try {
|
|
167705
|
-
return await this.refreshInFlight;
|
|
167706
|
-
} finally {
|
|
167707
|
-
this.setRefreshing(false);
|
|
167708
|
-
}
|
|
168281
|
+
if (options.silent !== true) this.setRefreshing(true);
|
|
168282
|
+
return await this.refreshInFlight;
|
|
167709
168283
|
}
|
|
167710
168284
|
if (options.silent !== true) this.setRefreshing(true);
|
|
167711
168285
|
const generation = this.generation;
|
|
@@ -167714,7 +168288,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
167714
168288
|
const seen = /* @__PURE__ */ new Set();
|
|
167715
168289
|
let cursor;
|
|
167716
168290
|
for (let pageIndex = 0; pageIndex < MAX_ROOT_PAGES; pageIndex += 1) {
|
|
167717
|
-
const page = await this.
|
|
168291
|
+
const page = await this.loadRootPage(cursor, options.force === true, generation);
|
|
168292
|
+
if (generation !== this.generation) return [...this.snapshot.sources];
|
|
168293
|
+
if (page === void 0) return [...this.snapshot.sources];
|
|
167718
168294
|
for (const source of page.items) {
|
|
167719
168295
|
const identity = arkmeSourceIdentityKey(source);
|
|
167720
168296
|
if (seen.has(identity)) continue;
|
|
@@ -167724,7 +168300,6 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
167724
168300
|
if (!page.hasMore || page.nextCursor === void 0) break;
|
|
167725
168301
|
cursor = page.nextCursor;
|
|
167726
168302
|
}
|
|
167727
|
-
if (generation !== this.generation) return [...this.snapshot.sources];
|
|
167728
168303
|
this.refreshedAtMillis = this.now();
|
|
167729
168304
|
this.publish(loaded);
|
|
167730
168305
|
return [...this.snapshot.sources];
|
|
@@ -167735,10 +168310,69 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
167735
168310
|
} finally {
|
|
167736
168311
|
if (this.refreshInFlight === pending) {
|
|
167737
168312
|
this.refreshInFlight = void 0;
|
|
167738
|
-
|
|
168313
|
+
this.setRefreshing(false);
|
|
167739
168314
|
}
|
|
167740
168315
|
}
|
|
167741
168316
|
}
|
|
168317
|
+
async loadRootPage(cursor, force, generation) {
|
|
168318
|
+
for (let attempt = 0;; attempt += 1) {
|
|
168319
|
+
if (generation !== this.generation) return void 0;
|
|
168320
|
+
try {
|
|
168321
|
+
return await this.loadPage(cursor, force);
|
|
168322
|
+
} catch (error) {
|
|
168323
|
+
if (generation !== this.generation) return void 0;
|
|
168324
|
+
const delay = ROOT_READ_RETRY_DELAYS_MS[attempt];
|
|
168325
|
+
if (!(error instanceof ArkmeClientError) || !error.body.retryable || delay === void 0) throw error;
|
|
168326
|
+
await new Promise((resolve) => {
|
|
168327
|
+
setTimeout(resolve, delay);
|
|
168328
|
+
});
|
|
168329
|
+
}
|
|
168330
|
+
}
|
|
168331
|
+
}
|
|
168332
|
+
/** Retain visible rows while preventing older reads from satisfying a new owner invalidation. */
|
|
168333
|
+
invalidateRoot() {
|
|
168334
|
+
this.generation += 1;
|
|
168335
|
+
this.refreshInFlight = void 0;
|
|
168336
|
+
this.refreshedAtMillis = 0;
|
|
168337
|
+
this.setRefreshing(false);
|
|
168338
|
+
}
|
|
168339
|
+
/** A reconnect pin projection is not a directory membership or message snapshot. */
|
|
168340
|
+
reconcilePins(pins) {
|
|
168341
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
168342
|
+
for (const pin of pins) {
|
|
168343
|
+
const previous = byKey.get(pin.sourceKey);
|
|
168344
|
+
if (previous === void 0 || previous.policyUpdatedAtMillis < pin.policyUpdatedAtMillis) byKey.set(pin.sourceKey, pin);
|
|
168345
|
+
}
|
|
168346
|
+
let changed = false;
|
|
168347
|
+
const sources = this.snapshot.sources.map((source) => {
|
|
168348
|
+
if (source.kind !== "private_chat" && source.kind !== "group_chat" || source.sourceKey === void 0) return source;
|
|
168349
|
+
const pin = byKey.get(source.sourceKey);
|
|
168350
|
+
if (pin === void 0) return source;
|
|
168351
|
+
const projected = retainNewerArkmeChatPin(source, {
|
|
168352
|
+
...source,
|
|
168353
|
+
isPinned: pin.pinned,
|
|
168354
|
+
chatPolicyUpdatedAtMillis: pin.policyUpdatedAtMillis
|
|
168355
|
+
});
|
|
168356
|
+
if (source.isPinned === projected.isPinned && source.chatPolicyUpdatedAtMillis === projected.chatPolicyUpdatedAtMillis) return source;
|
|
168357
|
+
changed = true;
|
|
168358
|
+
return projected;
|
|
168359
|
+
});
|
|
168360
|
+
if (changed) this.commit(sources);
|
|
168361
|
+
}
|
|
168362
|
+
confirmPin(source, pinned, policyUpdatedAtMillis) {
|
|
168363
|
+
if (source.kind !== "private_chat" && source.kind !== "group_chat") return;
|
|
168364
|
+
const targetKey = arkmeSourceIdentityKey(source);
|
|
168365
|
+
const current = this.snapshot.sources.find((item) => arkmeSourceIdentityKey(item) === targetKey);
|
|
168366
|
+
if (current === void 0) return;
|
|
168367
|
+
const updated = retainNewerArkmeChatPin(current, {
|
|
168368
|
+
...current,
|
|
168369
|
+
isPinned: pinned,
|
|
168370
|
+
chatPolicyUpdatedAtMillis: policyUpdatedAtMillis
|
|
168371
|
+
});
|
|
168372
|
+
if (updated.chatPolicyUpdatedAtMillis !== policyUpdatedAtMillis) return;
|
|
168373
|
+
this.refreshedAtMillis = 0;
|
|
168374
|
+
this.commit(this.snapshot.sources.map((item) => arkmeSourceIdentityKey(item) === targetKey ? updated : item));
|
|
168375
|
+
}
|
|
167742
168376
|
publish(sources) {
|
|
167743
168377
|
const merged = applyDirectoryMutations(sources, this.pendingMutations, this.combinedReadWatermarks(), { sourceKeysByRef: this.sourceKeysByRef });
|
|
167744
168378
|
const reconciled = reconcileDirectorySources(this.snapshot.sources, merged);
|
|
@@ -169872,9 +170506,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
169872
170506
|
const [topicCreateSubmitting, setTopicCreateSubmitting] = (0, react.useState)(false);
|
|
169873
170507
|
const [pendingRevealSourceRef, setPendingRevealSourceRef] = (0, react.useState)();
|
|
169874
170508
|
const [createdHighlight, setCreatedHighlight] = (0, react.useState)();
|
|
169875
|
-
const [
|
|
169876
|
-
const
|
|
169877
|
-
const [
|
|
170509
|
+
const [directoryContextTarget, setDirectoryContextMenu] = (0, react.useState)();
|
|
170510
|
+
const directoryMutationAbortRef = (0, react.useRef)();
|
|
170511
|
+
const [directoryMutation, setDirectoryMutation] = (0, react.useState)();
|
|
169878
170512
|
const [directoryActionFeedback, setDirectoryActionFeedback] = (0, react.useState)();
|
|
169879
170513
|
const [officialAuthorOpening, setOfficialAuthorOpening] = (0, react.useState)(false);
|
|
169880
170514
|
const [officialAuthorProfile, setOfficialAuthorProfile] = (0, react.useState)();
|
|
@@ -169945,6 +170579,18 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
169945
170579
|
conversationVisibility,
|
|
169946
170580
|
conversationVisibilityHydrated
|
|
169947
170581
|
]);
|
|
170582
|
+
const directoryContextMenu = (0, react.useMemo)(() => {
|
|
170583
|
+
if (directoryContextTarget === void 0) return void 0;
|
|
170584
|
+
const row = rootConversationRows.find((row) => row.kind === directoryContextTarget.kind && (row.kind === "source" ? arkmeSourceIdentityKey(row.source) : conversationBotVisibilityKey(row.bot)) === directoryContextTarget.key);
|
|
170585
|
+
return row === void 0 ? void 0 : {
|
|
170586
|
+
...row,
|
|
170587
|
+
x: directoryContextTarget.x,
|
|
170588
|
+
y: directoryContextTarget.y
|
|
170589
|
+
};
|
|
170590
|
+
}, [directoryContextTarget, rootConversationRows]);
|
|
170591
|
+
(0, react.useEffect)(() => {
|
|
170592
|
+
if (directoryContextTarget !== void 0 && directoryContextMenu === void 0) setDirectoryContextMenu(void 0);
|
|
170593
|
+
}, [directoryContextMenu, directoryContextTarget]);
|
|
169948
170594
|
const sendToSelfPresentation = arkmeSendToSelfDirectoryPresentation(sendToSelfSource);
|
|
169949
170595
|
const stopCreatedHighlightAnimation = (0, react.useCallback)(() => {
|
|
169950
170596
|
createdHighlightTimeoutsRef.current.forEach((timer) => {
|
|
@@ -170016,8 +170662,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
170016
170662
|
cacheRef.current = next;
|
|
170017
170663
|
writeNavigationCache(next);
|
|
170018
170664
|
}, []);
|
|
170019
|
-
const reconcileAuth = (0, react.useCallback)((
|
|
170020
|
-
if (
|
|
170665
|
+
const reconcileAuth = (0, react.useCallback)((status, environment, userId) => {
|
|
170666
|
+
if (status !== "authenticated" || userId === void 0) {
|
|
170021
170667
|
authenticatedUserIdRef.current = void 0;
|
|
170022
170668
|
cacheRef.current = void 0;
|
|
170023
170669
|
clearLastNavigationCache();
|
|
@@ -170026,11 +170672,11 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
170026
170672
|
setSources([]);
|
|
170027
170673
|
return;
|
|
170028
170674
|
}
|
|
170029
|
-
arkmeChatDirectory.activateAccount(`${
|
|
170030
|
-
authenticatedUserIdRef.current =
|
|
170031
|
-
const cached = readNavigationCache(
|
|
170675
|
+
arkmeChatDirectory.activateAccount(`${environment}:${String(userId)}`);
|
|
170676
|
+
authenticatedUserIdRef.current = userId;
|
|
170677
|
+
const cached = readNavigationCache(userId) ?? {
|
|
170032
170678
|
version: 1,
|
|
170033
|
-
userId
|
|
170679
|
+
userId,
|
|
170034
170680
|
directory: "root",
|
|
170035
170681
|
sources: {},
|
|
170036
170682
|
updatedAtMillis: 0
|
|
@@ -170088,18 +170734,35 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
170088
170734
|
if (directoryRequestAbortRef.current === controller) directoryRequestAbortRef.current = void 0;
|
|
170089
170735
|
}
|
|
170090
170736
|
}, [persistCache]);
|
|
170737
|
+
const authStatus = auth?.status;
|
|
170738
|
+
const authEnvironment = auth?.environment;
|
|
170739
|
+
const authUserId = auth?.userId;
|
|
170091
170740
|
(0, react.useEffect)(() => {
|
|
170092
|
-
reconcileAuth(
|
|
170093
|
-
}, [
|
|
170741
|
+
reconcileAuth(authStatus, authEnvironment, authUserId);
|
|
170742
|
+
}, [
|
|
170743
|
+
authStatus,
|
|
170744
|
+
authEnvironment,
|
|
170745
|
+
authUserId,
|
|
170746
|
+
reconcileAuth
|
|
170747
|
+
]);
|
|
170094
170748
|
(0, react.useEffect)(() => {
|
|
170095
170749
|
conversationVisibilityEpochRef.current += 1;
|
|
170096
170750
|
conversationVisibilityFeedbackRef.current = emptyConversationVisibilityOverlay();
|
|
170097
170751
|
setConversationVisibility(emptyConversationVisibilityOverlay());
|
|
170098
170752
|
setConversationVisibilityHydrated(emptyConversationVisibilityHydration());
|
|
170099
|
-
|
|
170100
|
-
|
|
170753
|
+
const controller = new AbortController();
|
|
170754
|
+
directoryMutationAbortRef.current = controller;
|
|
170755
|
+
setDirectoryMutation(void 0);
|
|
170756
|
+
setDirectoryContextMenu(void 0);
|
|
170101
170757
|
setDirectoryActionFeedback(void 0);
|
|
170102
|
-
|
|
170758
|
+
return () => {
|
|
170759
|
+
controller.abort();
|
|
170760
|
+
};
|
|
170761
|
+
}, [
|
|
170762
|
+
authenticated,
|
|
170763
|
+
auth?.environment,
|
|
170764
|
+
auth?.userId
|
|
170765
|
+
]);
|
|
170103
170766
|
(0, react.useEffect)(() => {
|
|
170104
170767
|
setBotDirectoryPreferences(readBotDirectoryPreferences(authenticated ? auth?.userId : void 0));
|
|
170105
170768
|
if (!authenticated) {
|
|
@@ -170159,6 +170822,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
170159
170822
|
};
|
|
170160
170823
|
}, [
|
|
170161
170824
|
authenticated,
|
|
170825
|
+
auth?.environment,
|
|
170162
170826
|
auth?.userId,
|
|
170163
170827
|
bots,
|
|
170164
170828
|
chatRevision,
|
|
@@ -170500,59 +171164,48 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
170500
171164
|
});
|
|
170501
171165
|
onActivateSurface?.();
|
|
170502
171166
|
};
|
|
170503
|
-
const updateRootSources = (nextSources) => {
|
|
170504
|
-
setSources(nextSources);
|
|
170505
|
-
arkmeChatDirectory.publish(nextSources);
|
|
170506
|
-
persistCache({
|
|
170507
|
-
directory: "root",
|
|
170508
|
-
sources: { root: nextSources }
|
|
170509
|
-
});
|
|
170510
|
-
};
|
|
170511
171167
|
const updateConversationDirectoryPin = async (target, pinned) => {
|
|
170512
|
-
if (
|
|
170513
|
-
const
|
|
170514
|
-
if (
|
|
170515
|
-
const previousSources = sources;
|
|
171168
|
+
if (directoryMutation !== void 0) return;
|
|
171169
|
+
const controller = directoryMutationAbortRef.current;
|
|
171170
|
+
if (authenticatedUserIdRef.current === void 0 || controller === void 0 || controller.signal.aborted) return;
|
|
170516
171171
|
const previousBotPreferences = botDirectoryPreferences;
|
|
170517
|
-
const nextSources = target.kind === "source" ? sources.map((item) => item.sourceRef === target.source.sourceRef ? {
|
|
170518
|
-
...item,
|
|
170519
|
-
isPinned: pinned
|
|
170520
|
-
} : item) : sources;
|
|
170521
171172
|
const nextBotPreferences = target.kind === "bot" ? updateBotDirectoryPreferences(botDirectoryPreferences, target.bot, { pinned }) : botDirectoryPreferences;
|
|
170522
171173
|
directoryContextRequestRef.current += 1;
|
|
170523
171174
|
setDirectoryContextMenu(void 0);
|
|
170524
|
-
|
|
170525
|
-
|
|
170526
|
-
|
|
170527
|
-
|
|
171175
|
+
setDirectoryMutation({
|
|
171176
|
+
kind: target.kind,
|
|
171177
|
+
key: target.kind === "source" ? arkmeSourceIdentityKey(target.source) : conversationBotVisibilityKey(target.bot),
|
|
171178
|
+
action: "pin"
|
|
171179
|
+
});
|
|
170528
171180
|
try {
|
|
170529
|
-
if (target.kind === "source")
|
|
170530
|
-
|
|
170531
|
-
|
|
170532
|
-
|
|
170533
|
-
|
|
171181
|
+
if (target.kind === "source") {
|
|
171182
|
+
const result = await callArkme("source.directory.policy.set", {
|
|
171183
|
+
sourceRef: target.source.sourceRef,
|
|
171184
|
+
pinned
|
|
171185
|
+
}, controller.signal);
|
|
171186
|
+
if (controller.signal.aborted) return;
|
|
171187
|
+
arkmeChatDirectory.confirmPin(target.source, result.pinned, result.policyUpdatedAtMillis);
|
|
171188
|
+
} else {
|
|
170534
171189
|
setBotDirectoryPreferences(nextBotPreferences);
|
|
170535
171190
|
writeBotDirectoryPreferences(auth?.userId, nextBotPreferences);
|
|
170536
171191
|
}
|
|
170537
|
-
if (
|
|
171192
|
+
if (controller.signal.aborted) return;
|
|
170538
171193
|
setDirectoryActionFeedback(pinned ? "已置顶对话" : "已取消置顶");
|
|
170539
171194
|
} catch (caught) {
|
|
170540
|
-
if (
|
|
170541
|
-
if (target.kind === "
|
|
170542
|
-
else {
|
|
171195
|
+
if (controller.signal.aborted) return;
|
|
171196
|
+
if (target.kind === "bot") {
|
|
170543
171197
|
setBotDirectoryPreferences(previousBotPreferences);
|
|
170544
171198
|
writeBotDirectoryPreferences(auth?.userId, previousBotPreferences);
|
|
170545
171199
|
}
|
|
170546
171200
|
setDirectoryActionFeedback(caught instanceof Error ? caught.message : "操作失败,请重试");
|
|
170547
171201
|
} finally {
|
|
170548
|
-
if (
|
|
170549
|
-
else setDirectoryMutationBotRef(void 0);
|
|
171202
|
+
if (!controller.signal.aborted) setDirectoryMutation(void 0);
|
|
170550
171203
|
}
|
|
170551
171204
|
};
|
|
170552
171205
|
const dismissConversationDirectoryEntry = async (target) => {
|
|
170553
|
-
if (
|
|
170554
|
-
const
|
|
170555
|
-
if (
|
|
171206
|
+
if (directoryMutation !== void 0) return;
|
|
171207
|
+
const controller = directoryMutationAbortRef.current;
|
|
171208
|
+
if (authenticatedUserIdRef.current === void 0 || controller === void 0 || controller.signal.aborted) return;
|
|
170556
171209
|
const entryKind = target.kind;
|
|
170557
171210
|
const stableKey = target.kind === "source" ? conversationSourceVisibilityKey(target.source) : conversationBotVisibilityKey(target.bot);
|
|
170558
171211
|
let entryRef;
|
|
@@ -170574,28 +171227,32 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
170574
171227
|
conversationVisibilityEpochRef.current += 1;
|
|
170575
171228
|
directoryContextRequestRef.current += 1;
|
|
170576
171229
|
setDirectoryContextMenu(void 0);
|
|
170577
|
-
|
|
170578
|
-
|
|
171230
|
+
setDirectoryMutation({
|
|
171231
|
+
kind: target.kind,
|
|
171232
|
+
key: target.kind === "source" ? arkmeSourceIdentityKey(target.source) : conversationBotVisibilityKey(target.bot),
|
|
171233
|
+
action: "dismiss"
|
|
171234
|
+
});
|
|
170579
171235
|
try {
|
|
170580
171236
|
await callArkme("conversation.directory.visibility.set", {
|
|
170581
171237
|
entryKind,
|
|
170582
171238
|
entryRef,
|
|
170583
171239
|
hidden: true
|
|
170584
|
-
});
|
|
170585
|
-
if (
|
|
171240
|
+
}, controller.signal);
|
|
171241
|
+
if (controller.signal.aborted) return;
|
|
170586
171242
|
const currentActivity = conversationVisibilityActivityRef.current.get(activityKey);
|
|
170587
171243
|
if (currentActivity === void 0 || conversationVisibilityActivityAdvanced(submittedActivity, currentActivity)) return;
|
|
170588
171244
|
setConversationVisibility((current) => dismissConversationVisibilityEntry(current, entryKind, stableKey));
|
|
170589
171245
|
setDirectoryActionFeedback("已移除对话,可在联系人中找回");
|
|
170590
171246
|
} catch (caught) {
|
|
170591
|
-
if (
|
|
171247
|
+
if (controller.signal.aborted) return;
|
|
170592
171248
|
setDirectoryActionFeedback(caught instanceof Error ? caught.message : "操作失败,请重试");
|
|
170593
171249
|
} finally {
|
|
170594
|
-
|
|
170595
|
-
|
|
170596
|
-
|
|
170597
|
-
|
|
170598
|
-
|
|
171250
|
+
if (!controller.signal.aborted) {
|
|
171251
|
+
const protectedKeys = new Set(conversationVisibilityFeedbackRef.current);
|
|
171252
|
+
protectedKeys.delete(protectedKey);
|
|
171253
|
+
conversationVisibilityFeedbackRef.current = protectedKeys;
|
|
171254
|
+
setDirectoryMutation(void 0);
|
|
171255
|
+
}
|
|
170599
171256
|
}
|
|
170600
171257
|
};
|
|
170601
171258
|
const selectTopicSource = (row) => {
|
|
@@ -170841,14 +171498,14 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
170841
171498
|
style: styles$16.createTaskButton,
|
|
170842
171499
|
"aria-label": "添加联系人、群聊或 Bot",
|
|
170843
171500
|
onClick: showLogin,
|
|
170844
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
171501
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, { size: 19 })
|
|
170845
171502
|
}),
|
|
170846
171503
|
onCreateTask !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
170847
171504
|
type: "button",
|
|
170848
171505
|
style: styles$16.createTaskButton,
|
|
170849
171506
|
"aria-label": "新任务",
|
|
170850
171507
|
onClick: onCreateTask,
|
|
170851
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
171508
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, { size: 19 })
|
|
170852
171509
|
})
|
|
170853
171510
|
]
|
|
170854
171511
|
}),
|
|
@@ -171024,7 +171681,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
171024
171681
|
const unreadPlacement = arkmeRootChatUnreadPlacement(bot);
|
|
171025
171682
|
const badgeUnreadCount = arkmeBadgeUnreadCount(bot);
|
|
171026
171683
|
const unreadText = badgeUnreadCount > 99 ? "99+" : badgeUnreadCount;
|
|
171027
|
-
const interactionsDisabled =
|
|
171684
|
+
const interactionsDisabled = directoryMutation?.kind === "bot" && directoryMutation.key === conversationBotVisibilityKey(bot);
|
|
171028
171685
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
171029
171686
|
type: "button",
|
|
171030
171687
|
role: "treeitem",
|
|
@@ -171048,7 +171705,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
171048
171705
|
directoryContextRequestRef.current += 1;
|
|
171049
171706
|
setDirectoryContextMenu({
|
|
171050
171707
|
kind: "bot",
|
|
171051
|
-
bot,
|
|
171708
|
+
key: conversationBotVisibilityKey(bot),
|
|
171052
171709
|
x: event.clientX,
|
|
171053
171710
|
y: event.clientY
|
|
171054
171711
|
});
|
|
@@ -171109,7 +171766,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
171109
171766
|
const unreadPlacement = arkmeRootChatUnreadPlacement(source);
|
|
171110
171767
|
const badgeUnreadCount = arkmeBadgeUnreadCount(source);
|
|
171111
171768
|
const unreadText = badgeUnreadCount > 99 ? "99+" : badgeUnreadCount;
|
|
171112
|
-
const
|
|
171769
|
+
const mutationPending = directoryMutation?.kind === "source" && directoryMutation.key === arkmeSourceIdentityKey(source);
|
|
171770
|
+
const interactionsDisabled = mutationPending && directoryMutation.action === "dismiss";
|
|
171113
171771
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
171114
171772
|
type: "button",
|
|
171115
171773
|
role: "treeitem",
|
|
@@ -171125,17 +171783,17 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
171125
171783
|
...interactionsDisabled ? styles$16.chatRowRemoving : {}
|
|
171126
171784
|
},
|
|
171127
171785
|
disabled: interactionsDisabled,
|
|
171128
|
-
"aria-busy":
|
|
171786
|
+
"aria-busy": mutationPending || void 0,
|
|
171129
171787
|
onClick: () => {
|
|
171130
171788
|
selectSource(source);
|
|
171131
171789
|
},
|
|
171132
171790
|
onContextMenu: (event) => {
|
|
171133
171791
|
event.preventDefault();
|
|
171134
|
-
if (
|
|
171792
|
+
if (mutationPending) return;
|
|
171135
171793
|
directoryContextRequestRef.current += 1;
|
|
171136
171794
|
setDirectoryContextMenu({
|
|
171137
171795
|
kind: "source",
|
|
171138
|
-
source,
|
|
171796
|
+
key: arkmeSourceIdentityKey(source),
|
|
171139
171797
|
x: event.clientX,
|
|
171140
171798
|
y: event.clientY
|
|
171141
171799
|
});
|
|
@@ -171277,10 +171935,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
171277
171935
|
type: "button",
|
|
171278
171936
|
role: "menuitem",
|
|
171279
171937
|
style: styles$16.directoryContextMenuItem,
|
|
171280
|
-
disabled:
|
|
171938
|
+
disabled: directoryMutation !== void 0,
|
|
171281
171939
|
onClick: () => {
|
|
171282
|
-
|
|
171283
|
-
else updateConversationDirectoryPin(directoryContextMenu, !directoryContextMenuPinned);
|
|
171940
|
+
updateConversationDirectoryPin(directoryContextMenu, !directoryContextMenuPinned);
|
|
171284
171941
|
},
|
|
171285
171942
|
onMouseEnter: (event) => {
|
|
171286
171943
|
event.currentTarget.style.background = arkmeTheme.subtle;
|
|
@@ -171301,7 +171958,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
171301
171958
|
...styles$16.directoryContextMenuItem,
|
|
171302
171959
|
...styles$16.directoryContextMenuDanger
|
|
171303
171960
|
},
|
|
171304
|
-
disabled:
|
|
171961
|
+
disabled: directoryMutation !== void 0,
|
|
171305
171962
|
onClick: () => {
|
|
171306
171963
|
dismissConversationDirectoryEntry(directoryContextMenu);
|
|
171307
171964
|
},
|
|
@@ -174637,9 +175294,21 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
174637
175294
|
pendingInterwovenRefreshRevisions = /* @__PURE__ */ new Map();
|
|
174638
175295
|
viewports = /* @__PURE__ */ new Map();
|
|
174639
175296
|
recency = /* @__PURE__ */ new Map();
|
|
175297
|
+
appliedTimelineDeltas = /* @__PURE__ */ new Map();
|
|
174640
175298
|
constructor(maxSources = 20) {
|
|
174641
175299
|
this.maxSources = maxSources;
|
|
174642
175300
|
}
|
|
175301
|
+
unappliedTimelineDeltaItems(conversationKey, items) {
|
|
175302
|
+
const applied = this.appliedTimelineDeltas.get(conversationKey);
|
|
175303
|
+
return items.filter((item) => !applied?.has(item));
|
|
175304
|
+
}
|
|
175305
|
+
consumeTimelineDeltaItems(conversationKey, items) {
|
|
175306
|
+
if (items.length === 0) return;
|
|
175307
|
+
const applied = this.appliedTimelineDeltas.get(conversationKey) ?? /* @__PURE__ */ new WeakSet();
|
|
175308
|
+
for (const item of items) applied.add(item);
|
|
175309
|
+
this.appliedTimelineDeltas.set(conversationKey, applied);
|
|
175310
|
+
this.touch(conversationKey);
|
|
175311
|
+
}
|
|
174643
175312
|
getTimeline(conversationKey) {
|
|
174644
175313
|
const snapshot = this.timelines.get(conversationKey);
|
|
174645
175314
|
if (snapshot !== void 0) this.touch(conversationKey);
|
|
@@ -174710,6 +175379,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
174710
175379
|
this.pendingInterwovenRefreshRevisions.clear();
|
|
174711
175380
|
this.viewports.clear();
|
|
174712
175381
|
this.recency.clear();
|
|
175382
|
+
this.appliedTimelineDeltas.clear();
|
|
174713
175383
|
}
|
|
174714
175384
|
touch(conversationKey) {
|
|
174715
175385
|
this.recency.delete(conversationKey);
|
|
@@ -174719,6 +175389,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
174719
175389
|
if (oldest === void 0) return;
|
|
174720
175390
|
this.recency.delete(oldest);
|
|
174721
175391
|
this.timelines.delete(oldest);
|
|
175392
|
+
this.appliedTimelineDeltas.delete(oldest);
|
|
174722
175393
|
this.interwovenMoments.delete(oldest);
|
|
174723
175394
|
this.interwovenRefreshRevisions.delete(oldest);
|
|
174724
175395
|
this.pendingInterwovenMoments.delete(oldest);
|
|
@@ -175667,7 +176338,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
175667
176338
|
rememberCurrentScroll();
|
|
175668
176339
|
onBackRelated?.();
|
|
175669
176340
|
},
|
|
175670
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$
|
|
176341
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$4, {
|
|
175671
176342
|
size: 18,
|
|
175672
176343
|
"aria-hidden": true
|
|
175673
176344
|
})
|
|
@@ -177257,7 +177928,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177257
177928
|
style: styles$9.back,
|
|
177258
177929
|
"aria-label": backLabel ?? "返回",
|
|
177259
177930
|
onClick: onBack,
|
|
177260
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$
|
|
177931
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$4, { size: 18 })
|
|
177261
177932
|
}),
|
|
177262
177933
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
177263
177934
|
style: styles$9.heading,
|
|
@@ -177318,7 +177989,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177318
177989
|
await removeDetailExtensionAttachments(attachments);
|
|
177319
177990
|
});
|
|
177320
177991
|
}
|
|
177321
|
-
function DetailExtensionComposer({ sourceRef, messageActionRef, parentRecordUid, targetKey, onSent, onError }) {
|
|
177992
|
+
function DetailExtensionComposer({ sourceRef, messageActionRef, parentRecordUid, targetKey, onSent, onError, messageCreationBlocked, messageCreationRestriction }) {
|
|
177322
177993
|
const [text, setText] = (0, react.useState)("");
|
|
177323
177994
|
const [markdown, setMarkdown] = (0, react.useState)();
|
|
177324
177995
|
const [markdownEnabled, setMarkdownEnabled] = (0, react.useState)(false);
|
|
@@ -177367,7 +178038,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177367
178038
|
};
|
|
177368
178039
|
}, [targetKey]);
|
|
177369
178040
|
const selectFiles = async (files) => {
|
|
177370
|
-
if (files === null || files.length === 0 || preparing || sending) return;
|
|
178041
|
+
if (messageCreationBlocked || files === null || files.length === 0 || preparing || sending) return;
|
|
177371
178042
|
const controller = new AbortController();
|
|
177372
178043
|
stageAbortRef.current?.abort();
|
|
177373
178044
|
stageAbortRef.current = controller;
|
|
@@ -177423,7 +178094,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177423
178094
|
const send = async () => {
|
|
177424
178095
|
const normalizedText = markdown?.source ?? text.trim();
|
|
177425
178096
|
const fileRefs = attachments.flatMap((attachment) => attachment.localFile === void 0 ? [] : [attachment.localFile.fileRef]);
|
|
177426
|
-
if (sending || preparing || normalizedText === "" && fileRefs.length === 0) return;
|
|
178097
|
+
if (messageCreationBlocked || sending || preparing || normalizedText === "" && fileRefs.length === 0) return;
|
|
177427
178098
|
const fingerprint = JSON.stringify([
|
|
177428
178099
|
parentRecordUid ?? "",
|
|
177429
178100
|
normalizedText,
|
|
@@ -177474,7 +178145,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177474
178145
|
if (generationRef.current === generation) setSending(false);
|
|
177475
178146
|
}
|
|
177476
178147
|
};
|
|
177477
|
-
const disabled = preparing || sending;
|
|
178148
|
+
const disabled = messageCreationBlocked || preparing || sending;
|
|
177478
178149
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
177479
178150
|
style: styles$9.extensionComposer,
|
|
177480
178151
|
onDragOver: (event) => {
|
|
@@ -177490,11 +178161,16 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177490
178161
|
}
|
|
177491
178162
|
},
|
|
177492
178163
|
children: [
|
|
178164
|
+
messageCreationBlocked && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
178165
|
+
role: "status",
|
|
178166
|
+
children: messageCreationRestriction
|
|
178167
|
+
}),
|
|
177493
178168
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
177494
178169
|
ref: fileInputRef,
|
|
177495
178170
|
type: "file",
|
|
177496
178171
|
multiple: true,
|
|
177497
178172
|
hidden: true,
|
|
178173
|
+
disabled,
|
|
177498
178174
|
"data-arkme-detail-extension-file-input": "true",
|
|
177499
178175
|
onChange: (event) => selectFiles(event.currentTarget.files)
|
|
177500
178176
|
}),
|
|
@@ -177561,8 +178237,12 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177561
178237
|
maxLength: 2e4,
|
|
177562
178238
|
markdownEnabled,
|
|
177563
178239
|
markdown,
|
|
177564
|
-
onTextChange:
|
|
177565
|
-
|
|
178240
|
+
onTextChange: (value) => {
|
|
178241
|
+
if (!disabled) setText(value);
|
|
178242
|
+
},
|
|
178243
|
+
onMarkdownChange: (value) => {
|
|
178244
|
+
if (!disabled) setMarkdown(value);
|
|
178245
|
+
},
|
|
177566
178246
|
onPaste: (event) => {
|
|
177567
178247
|
const files = clipboardFiles(event.clipboardData);
|
|
177568
178248
|
if (files.length > 0) {
|
|
@@ -177806,7 +178486,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177806
178486
|
function relatedQuickNoteReferenceExpired$1(error) {
|
|
177807
178487
|
return error instanceof ArkmeClientError && error.body.code === "related-quick-note-ref-expired";
|
|
177808
178488
|
}
|
|
177809
|
-
function ArkmeTimelineDetailDrawer({ item, sourceRef, showOriginal, onClose, onToggleOriginal, shareWebsite, onMessageCopyLinkOpen, onExtensionSent, onToast }) {
|
|
178489
|
+
function ArkmeTimelineDetailDrawer({ item, sourceRef, showOriginal, onClose, onToggleOriginal, shareWebsite, onMessageCopyLinkOpen, onExtensionSent, onToast, messageCreationBlocked = false, messageCreationRestriction = "" }) {
|
|
177810
178490
|
const [relatedView, setRelatedView] = (0, react.useState)("source-detail");
|
|
177811
178491
|
const [relatedState, setRelatedState] = (0, react.useState)({ kind: "idle" });
|
|
177812
178492
|
const [relatedDetailState, setRelatedDetailState] = (0, react.useState)({ kind: "idle" });
|
|
@@ -177956,6 +178636,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177956
178636
|
const extensionFooter = normalizedSourceRef === "" || messageActionRef === "" ? void 0 : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DetailExtensionComposer, {
|
|
177957
178637
|
sourceRef: normalizedSourceRef,
|
|
177958
178638
|
messageActionRef,
|
|
178639
|
+
messageCreationBlocked,
|
|
178640
|
+
messageCreationRestriction,
|
|
177959
178641
|
...selectedExtensionRecordUid === void 0 ? {} : { parentRecordUid: selectedExtensionRecordUid },
|
|
177960
178642
|
targetKey: `${normalizedSourceRef}:${item.itemUid}:${selectedExtensionRecordUid ?? item.itemUid}`,
|
|
177961
178643
|
onError: (message) => {
|
|
@@ -182045,8 +182727,11 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
182045
182727
|
const map = new Map(current.map((item) => [item.itemUid, item]));
|
|
182046
182728
|
for (const item of incoming) {
|
|
182047
182729
|
const previous = map.get(item.itemUid);
|
|
182730
|
+
const version = item.recordVersion ?? item.version ?? 0;
|
|
182731
|
+
const previousVersion = previous?.recordVersion ?? previous?.version ?? 0;
|
|
182732
|
+
if (previous?.status === 1 && item.status === 1 && version > 0 && previousVersion > 0 && previousVersion > version) continue;
|
|
182048
182733
|
map.set(item.itemUid, {
|
|
182049
|
-
...item,
|
|
182734
|
+
...retainPartialTimelineMedia(previous, item),
|
|
182050
182735
|
...previous?.aiPolish !== void 0 && item.aiPolish === void 0 ? { aiPolish: previous.aiPolish } : {},
|
|
182051
182736
|
...previous?.recordDurationMillis !== void 0 && item.recordDurationMillis === void 0 ? { recordDurationMillis: previous.recordDurationMillis } : {},
|
|
182052
182737
|
...previous?.editDurationMillis !== void 0 && item.editDurationMillis === void 0 ? { editDurationMillis: previous.editDurationMillis } : {},
|
|
@@ -182057,6 +182742,15 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
182057
182742
|
}
|
|
182058
182743
|
return [...map.values()].sort((a, b) => a.sendAtMillis - b.sendAtMillis || a.itemUid.localeCompare(b.itemUid));
|
|
182059
182744
|
}
|
|
182745
|
+
function reconcileTimelinePage(cachedItems, delta, pageItems, readStartDeltas) {
|
|
182746
|
+
const removedKeys = new Set(delta?.removedItemKeys ?? []);
|
|
182747
|
+
const retainedPage = pageItems.filter((item) => !removedKeys.has(item.timelineItemKey ?? ""));
|
|
182748
|
+
const ids = new Set(retainedPage.map((item) => item.itemUid));
|
|
182749
|
+
const relevant = (delta?.items ?? []).filter((item) => ids.has(item.itemUid));
|
|
182750
|
+
const beforeRead = relevant.filter((item) => item === readStartDeltas.get(item.itemUid));
|
|
182751
|
+
const duringRead = relevant.filter((item) => item !== readStartDeltas.get(item.itemUid));
|
|
182752
|
+
return mergeItems(mergeItems(mergeItems(cachedItems.filter((item) => ids.has(item.itemUid)), beforeRead), retainedPage), duringRead);
|
|
182753
|
+
}
|
|
182060
182754
|
function detailExtensionTimelineItem(parent, result) {
|
|
182061
182755
|
const extension = result.extension;
|
|
182062
182756
|
const avatarRef = extension.senderAvatarUrl?.trim() ?? "";
|
|
@@ -182151,11 +182845,29 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
182151
182845
|
};
|
|
182152
182846
|
return mergeItems(current.filter((item) => item.itemUid !== optimisticItemUid && item.itemUid !== result.itemUid), [confirmed]);
|
|
182153
182847
|
}
|
|
182154
|
-
function
|
|
182155
|
-
|
|
182848
|
+
function arkmeRecordReeditFailure(caught) {
|
|
182849
|
+
const code = caught instanceof ArkmeClientError ? caught.body.code : void 0;
|
|
182850
|
+
return {
|
|
182851
|
+
error: errorMessage$2(caught) || "草稿保存失败,请重试",
|
|
182852
|
+
conflict: code === "record-reedit-conflict" ? "record" : code === "record-reedit-draft-changed" ? "draft" : void 0
|
|
182853
|
+
};
|
|
182854
|
+
}
|
|
182855
|
+
function arkmeRecordReeditCandidateKey(title, textContent, attachments, textFormat = "plain") {
|
|
182856
|
+
return JSON.stringify([
|
|
182857
|
+
title.trim(),
|
|
182858
|
+
textFormat === "markdown" ? textContent : textContent.trim(),
|
|
182859
|
+
attachments.map((attachment) => attachment.selection)
|
|
182860
|
+
]);
|
|
182156
182861
|
}
|
|
182157
182862
|
function sameArkmeRecordReeditSession(left, right) {
|
|
182158
|
-
return left !== void 0 && left.generation === right.generation && left.sourceRef === right.sourceRef && left.item.itemUid === right.item.itemUid;
|
|
182863
|
+
return left !== void 0 && left.generation === right.generation && left.accountKey === right.accountKey && left.sourceKey === right.sourceKey && left.sourceRef === right.sourceRef && left.item.itemUid === right.item.itemUid;
|
|
182864
|
+
}
|
|
182865
|
+
function arkmeRecordReeditPreparationKey(target) {
|
|
182866
|
+
return `record-reedit:${target.generation}`;
|
|
182867
|
+
}
|
|
182868
|
+
function arkmeRecordReeditAttachmentBlock(attachment) {
|
|
182869
|
+
if (attachment.unavailable) return void 0;
|
|
182870
|
+
return attachment.block ?? (attachment.localFile === void 0 ? void 0 : localFileBlock(attachment.localFile));
|
|
182159
182871
|
}
|
|
182160
182872
|
function resolveStateAction(action, current) {
|
|
182161
182873
|
return typeof action === "function" ? action(current) : action;
|
|
@@ -183248,8 +183960,26 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183248
183960
|
activeSourceKeyRef.current = conversationKey;
|
|
183249
183961
|
}, [conversationKey]);
|
|
183250
183962
|
const sourceIsChat = source?.kind === "private_chat" || source?.kind === "group_chat";
|
|
183963
|
+
const [foregroundReadRevision, setForegroundReadRevision] = (0, react.useState)(0);
|
|
183964
|
+
(0, react.useEffect)(() => {
|
|
183965
|
+
if (!activeConversation || !sourceIsChat || authenticatedUserId === void 0 || typeof window === "undefined" || typeof document === "undefined") return;
|
|
183966
|
+
const resumeRead = () => {
|
|
183967
|
+
if (arkmeVisibleReadIntentAllowed()) setForegroundReadRevision((value) => value + 1);
|
|
183968
|
+
};
|
|
183969
|
+
window.addEventListener("focus", resumeRead);
|
|
183970
|
+
document.addEventListener("visibilitychange", resumeRead);
|
|
183971
|
+
return () => {
|
|
183972
|
+
window.removeEventListener("focus", resumeRead);
|
|
183973
|
+
document.removeEventListener("visibilitychange", resumeRead);
|
|
183974
|
+
};
|
|
183975
|
+
}, [
|
|
183976
|
+
activeConversation,
|
|
183977
|
+
authenticatedUserId,
|
|
183978
|
+
sourceIsChat
|
|
183979
|
+
]);
|
|
183251
183980
|
const sourceProjectionRevision = (0, react.useSyncExternalStore)(activeConversation && !sourceIsChat ? arkmeUi.subscribe : NOOP_SUBSCRIBE, () => activeConversation && !sourceIsChat ? arkmeUi.getRecordRevision() : 0, () => 0);
|
|
183252
183981
|
const composerDraftKey = arkmeSourceComposerDraftKey(authenticatedUserId, source);
|
|
183982
|
+
const directAdmission = useDirectMessageAdmission(authenticatedAccountKey, source?.sourceRef, activeConversation && source?.directMessageAdmissionApplicable === true);
|
|
183253
183983
|
const composerAsyncScopeRef = (0, react.useRef)({
|
|
183254
183984
|
accountKey: void 0,
|
|
183255
183985
|
sourceKey: "",
|
|
@@ -183275,59 +184005,58 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183275
184005
|
const [composerShowsInputTime, setComposerShowsInputTime] = (0, react.useState)(arkmeComposerShowsInputTime);
|
|
183276
184006
|
const [composerExtensionTarget, setComposerExtensionTarget] = (0, react.useState)();
|
|
183277
184007
|
const activeComposerExtensionTarget = composerExtensionTarget?.sourceRef === source?.sourceRef ? composerExtensionTarget : void 0;
|
|
183278
|
-
const
|
|
183279
|
-
const
|
|
184008
|
+
const { composer: recordReeditComposer, composerRef: recordReeditComposerRef, setComposer: setRecordReeditComposer, updateCandidate: updateRecordReeditCandidate, activateScope: activateRecordReeditScope, findCandidate: findRecordReeditCandidate } = useRecordReeditEditors();
|
|
184009
|
+
const seenReeditCommits = (0, react.useRef)(/* @__PURE__ */ new Set());
|
|
184010
|
+
const pendingReeditHighlights = (0, react.useRef)(/* @__PURE__ */ new Set());
|
|
183280
184011
|
const recordReeditGenerationRef = (0, react.useRef)(0);
|
|
183281
|
-
const recordReeditDraftSaveTailRef = (0, react.useRef)(Promise.resolve());
|
|
183282
|
-
const recordReeditCommitGenerationRef = (0, react.useRef)();
|
|
183283
184012
|
const [recordReeditHighlightUid, setRecordReeditHighlightUid] = (0, react.useState)("");
|
|
183284
184013
|
const recordReeditHighlightTimerRef = (0, react.useRef)();
|
|
183285
|
-
|
|
183286
|
-
const
|
|
183287
|
-
const persistRecordReeditDraft = (0, react.useCallback)(async (target) => {
|
|
184014
|
+
const activeRecordReeditComposer = recordReeditComposer?.sourceKey === conversationKey && recordReeditComposer?.accountKey === authenticatedAccountKey ? recordReeditComposer : void 0;
|
|
184015
|
+
const persistRecordReeditDraft = (0, react.useCallback)(async (target, forCommit = false) => {
|
|
183288
184016
|
const snapshot = target.snapshot;
|
|
183289
|
-
if (snapshot === void 0 || target.busy) return;
|
|
184017
|
+
if (snapshot === void 0 || target.busy || arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth) !== target.accountKey) return false;
|
|
183290
184018
|
const nextTitle = target.title.trim();
|
|
183291
184019
|
const textFormat = snapshot.textFormat ?? target.item.textFormat;
|
|
183292
184020
|
const nextText = textFormat === "markdown" ? target.textContent : target.textContent.trim();
|
|
183293
184021
|
const supportsTitle = snapshot.displayKind === 1;
|
|
183294
|
-
|
|
183295
|
-
const
|
|
183296
|
-
|
|
183297
|
-
|
|
183298
|
-
|
|
183299
|
-
await callArkme("source.record-reedit.draft.put", {
|
|
184022
|
+
const nextCandidateKey = arkmeRecordReeditCandidateKey(nextTitle, nextText, target.attachments, textFormat);
|
|
184023
|
+
const alreadyPersisted = () => nextCandidateKey === target.persisted.candidateKey && (!forCommit || target.persisted.draftRevision > 0);
|
|
184024
|
+
const operation = target.persisted.saveTail.catch(() => void 0).then(async () => {
|
|
184025
|
+
if (!forCommit && target.persisted.exclusive || arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth) !== target.accountKey || alreadyPersisted()) return;
|
|
184026
|
+
const result = await callArkme("source.record-reedit.draft.put", {
|
|
183300
184027
|
sourceRef: target.sourceRef,
|
|
183301
184028
|
itemUid: target.item.itemUid,
|
|
183302
184029
|
newText: nextText,
|
|
183303
|
-
expectedVersion: snapshot.version,
|
|
184030
|
+
expectedVersion: snapshot.draft?.baseVersion ?? snapshot.version,
|
|
184031
|
+
expectedDraftRevision: target.persisted.draftRevision,
|
|
184032
|
+
attachments: target.attachments.map((attachment) => attachment.selection),
|
|
183304
184033
|
...supportsTitle ? { newTitle: nextTitle } : {}
|
|
183305
184034
|
});
|
|
183306
|
-
|
|
184035
|
+
target.persisted.draftRevision = result.draftRevision;
|
|
184036
|
+
target.persisted.candidateKey = nextCandidateKey;
|
|
183307
184037
|
});
|
|
183308
|
-
|
|
183309
|
-
|
|
183310
|
-
|
|
183311
|
-
...current,
|
|
183312
|
-
persistedCandidateKey: nextCandidateKey
|
|
183313
|
-
} : current);
|
|
184038
|
+
target.persisted.saveTail = operation.then(() => void 0, () => void 0);
|
|
184039
|
+
await operation;
|
|
184040
|
+
return alreadyPersisted();
|
|
183314
184041
|
}, []);
|
|
183315
184042
|
const persistRecordReeditBeforeContextExit = (0, react.useCallback)((target, shouldClose) => {
|
|
183316
184043
|
recordReeditGenerationRef.current += 1;
|
|
183317
|
-
if (target.snapshot === void 0
|
|
183318
|
-
|
|
184044
|
+
if (target.snapshot === void 0) {
|
|
184045
|
+
updateRecordReeditCandidate(target, (current) => sameArkmeRecordReeditSession(current, target) ? void 0 : current);
|
|
183319
184046
|
return;
|
|
183320
184047
|
}
|
|
183321
|
-
|
|
183322
|
-
|
|
184048
|
+
if (target.busy) return;
|
|
184049
|
+
persistRecordReeditDraft(target).then((saved) => {
|
|
184050
|
+
if (!saved) return;
|
|
184051
|
+
updateRecordReeditCandidate(target, (current) => sameArkmeRecordReeditSession(current, target) && arkmeRecordReeditCandidateKey(current.title, current.textContent, current.attachments, current.snapshot?.textFormat ?? current.item.textFormat) === arkmeRecordReeditCandidateKey(target.title, target.textContent, target.attachments, target.snapshot?.textFormat ?? target.item.textFormat) && shouldClose() ? void 0 : current);
|
|
183323
184052
|
}).catch((caught) => {
|
|
183324
|
-
|
|
184053
|
+
updateRecordReeditCandidate(target, (current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
183325
184054
|
...current,
|
|
183326
184055
|
busy: false,
|
|
183327
|
-
|
|
184056
|
+
...arkmeRecordReeditFailure(caught)
|
|
183328
184057
|
} : current);
|
|
183329
184058
|
});
|
|
183330
|
-
}, [persistRecordReeditDraft]);
|
|
184059
|
+
}, [persistRecordReeditDraft, updateRecordReeditCandidate]);
|
|
183331
184060
|
(0, react.useEffect)(() => {
|
|
183332
184061
|
if (composerExtensionTarget !== void 0 && composerExtensionTarget.sourceRef !== source?.sourceRef) setComposerExtensionTarget(void 0);
|
|
183333
184062
|
}, [composerExtensionTarget, source?.sourceRef]);
|
|
@@ -183338,9 +184067,40 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183338
184067
|
}
|
|
183339
184068
|
setRecordReeditHighlightUid("");
|
|
183340
184069
|
const target = recordReeditComposerRef.current;
|
|
183341
|
-
|
|
183342
|
-
|
|
183343
|
-
|
|
184070
|
+
const nextScope = {
|
|
184071
|
+
accountKey: authenticatedAccountKey,
|
|
184072
|
+
sourceKey: conversationKey,
|
|
184073
|
+
sourceRef: source?.sourceRef ?? ""
|
|
184074
|
+
};
|
|
184075
|
+
if (target === void 0 || target.accountKey !== authenticatedAccountKey) {
|
|
184076
|
+
if (target !== void 0 && target.snapshot === void 0) updateRecordReeditCandidate(target, () => void 0);
|
|
184077
|
+
activateRecordReeditScope(nextScope, ++recordReeditGenerationRef.current);
|
|
184078
|
+
return;
|
|
184079
|
+
}
|
|
184080
|
+
if (target.sourceKey === conversationKey) {
|
|
184081
|
+
if (activeConversation && target.generation !== recordReeditGenerationRef.current) {
|
|
184082
|
+
const generation = ++recordReeditGenerationRef.current;
|
|
184083
|
+
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
184084
|
+
...current,
|
|
184085
|
+
generation
|
|
184086
|
+
} : current);
|
|
184087
|
+
}
|
|
184088
|
+
return;
|
|
184089
|
+
}
|
|
184090
|
+
persistRecordReeditBeforeContextExit(target, () => {
|
|
184091
|
+
const selected = arkmeUi.getSnapshot().selectedSource;
|
|
184092
|
+
return selected === void 0 || arkmeSourceIdentityKey(selected) !== target.sourceKey;
|
|
184093
|
+
});
|
|
184094
|
+
activateRecordReeditScope(nextScope, ++recordReeditGenerationRef.current);
|
|
184095
|
+
}, [
|
|
184096
|
+
activeConversation,
|
|
184097
|
+
authenticatedAccountKey,
|
|
184098
|
+
conversationKey,
|
|
184099
|
+
persistRecordReeditBeforeContextExit,
|
|
184100
|
+
source?.sourceRef,
|
|
184101
|
+
activateRecordReeditScope,
|
|
184102
|
+
updateRecordReeditCandidate
|
|
184103
|
+
]);
|
|
183344
184104
|
(0, react.useEffect)(() => {
|
|
183345
184105
|
if (activeRecordReeditComposer?.snapshot === void 0) return;
|
|
183346
184106
|
const generation = activeRecordReeditComposer.generation;
|
|
@@ -183380,18 +184140,26 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183380
184140
|
};
|
|
183381
184141
|
}, [recordInputCaptureOwner]);
|
|
183382
184142
|
const backgroundSoundCaptureEnabled = (0, react.useSyncExternalStore)((0, react.useCallback)((listener) => subscribeArkmeBackgroundSoundCapturePreference(authenticatedAccountKey, listener), [authenticatedAccountKey]), (0, react.useCallback)(() => arkmeBackgroundSoundCaptureEnabled(authenticatedAccountKey), [authenticatedAccountKey]), () => false);
|
|
183383
|
-
const visibleComposerText = activeRecordReeditComposer?.textContent ?? draft;
|
|
184143
|
+
const visibleComposerText = activeRecordReeditComposer?.textContent ?? (directAdmission.blocked ? "" : draft);
|
|
184144
|
+
const visibleComposerAttachments = activeRecordReeditComposer === void 0 ? attachments : activeRecordReeditComposer.attachments.map((attachment) => {
|
|
184145
|
+
const block = arkmeRecordReeditAttachmentBlock(attachment);
|
|
184146
|
+
return block === void 0 ? attachment : {
|
|
184147
|
+
...attachment,
|
|
184148
|
+
previewUrl: arkmeContentMediaUrl(block)
|
|
184149
|
+
};
|
|
184150
|
+
});
|
|
183384
184151
|
const composerTextLength = Array.from(visibleComposerText).length;
|
|
183385
|
-
const composerHasUserContent = composerTextLength > 0 ||
|
|
184152
|
+
const composerHasUserContent = composerTextLength > 0 || visibleComposerAttachments.length > 0;
|
|
183386
184153
|
const composerStatsVisible = composerInputFocused || composerHasUserContent;
|
|
183387
184154
|
const composerInputStartedAtMillis = recordInputCaptureOwner.getStartedAtMillis(composerDraftKey);
|
|
183388
184155
|
(0, react.useEffect)(() => {
|
|
183389
184156
|
recordInputCaptureOwner.sync({
|
|
183390
184157
|
draftKey: composerDraftKey,
|
|
183391
|
-
isActive: activeRecordReeditComposer === void 0 && activeConversation && backgroundSoundSupported && backgroundSoundEligibilityReason === "eligible" && composerInputFocused && arkmeSourceSupportsRecordInputCapture(source?.kind),
|
|
184158
|
+
isActive: !directAdmission.blocked && activeRecordReeditComposer === void 0 && activeConversation && backgroundSoundSupported && backgroundSoundEligibilityReason === "eligible" && composerInputFocused && arkmeSourceSupportsRecordInputCapture(source?.kind),
|
|
183392
184159
|
hasUserContent: composerHasUserContent
|
|
183393
184160
|
});
|
|
183394
184161
|
}, [
|
|
184162
|
+
directAdmission.blocked,
|
|
183395
184163
|
activeConversation,
|
|
183396
184164
|
activeRecordReeditComposer,
|
|
183397
184165
|
backgroundSoundEligibilityReason,
|
|
@@ -183405,11 +184173,12 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183405
184173
|
const syncComposerUserInput = (0, react.useCallback)((hasUserContent) => {
|
|
183406
184174
|
recordInputCaptureOwner.sync({
|
|
183407
184175
|
draftKey: composerDraftKey,
|
|
183408
|
-
isActive: activeConversation && backgroundSoundSupported && backgroundSoundEligibilityReason === "eligible" && composerInputFocused && arkmeSourceSupportsRecordInputCapture(source?.kind),
|
|
184176
|
+
isActive: !directAdmission.blocked && activeConversation && backgroundSoundSupported && backgroundSoundEligibilityReason === "eligible" && composerInputFocused && arkmeSourceSupportsRecordInputCapture(source?.kind),
|
|
183409
184177
|
hasUserContent
|
|
183410
184178
|
});
|
|
183411
184179
|
if (hasUserContent) recordInputCaptureOwner.beginUserInput(composerDraftKey);
|
|
183412
184180
|
}, [
|
|
184181
|
+
directAdmission.blocked,
|
|
183413
184182
|
activeConversation,
|
|
183414
184183
|
backgroundSoundEligibilityReason,
|
|
183415
184184
|
backgroundSoundSupported,
|
|
@@ -183599,13 +184368,16 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183599
184368
|
}, [authenticatedUserId]);
|
|
183600
184369
|
const [busy, setBusy] = (0, react.useState)(false);
|
|
183601
184370
|
const preparingFiles = composerDraftKey !== void 0 && preparingKeys.has(composerDraftKey);
|
|
184371
|
+
const preparingReeditFiles = activeRecordReeditComposer !== void 0 && preparingKeys.has(arkmeRecordReeditPreparationKey(activeRecordReeditComposer));
|
|
184372
|
+
const composerFilesDisabled = activeRecordReeditComposer === void 0 ? preparingFiles || directAdmission.blocked : activeRecordReeditComposer.snapshot === void 0 || preparingReeditFiles || activeRecordReeditComposer.loading || activeRecordReeditComposer.busy;
|
|
184373
|
+
const composerFileAddingDisabled = composerFilesDisabled || activeRecordReeditComposer?.snapshot?.maxAttachments === 0;
|
|
183602
184374
|
const messagePreparing = useMessagePreparing({
|
|
183603
184375
|
source,
|
|
183604
184376
|
accountScope: authenticatedAccountKey,
|
|
183605
|
-
enabled: activeConversation && activeRecordReeditComposer === void 0 && !preparingFiles,
|
|
184377
|
+
enabled: activeConversation && activeRecordReeditComposer === void 0 && !preparingFiles && !directAdmission.blocked,
|
|
183606
184378
|
focused: composerInputFocused
|
|
183607
184379
|
});
|
|
183608
|
-
const canSend = activeRecordReeditComposer === void 0 ? arkmeComposerCanSend(draft, attachments.length + (composerDraftKey !== void 0 && preparingKeys.has(composerDraftKey) ? 1 : 0), preparingFiles) : activeRecordReeditComposer.snapshot !== void 0 && !activeRecordReeditComposer.loading && !activeRecordReeditComposer.busy && activeRecordReeditComposer.textContent.trim() !== "";
|
|
184380
|
+
const canSend = activeRecordReeditComposer === void 0 ? !directAdmission.blocked && arkmeComposerCanSend(draft, attachments.length + (composerDraftKey !== void 0 && preparingKeys.has(composerDraftKey) ? 1 : 0), preparingFiles) : activeRecordReeditComposer.snapshot !== void 0 && !activeRecordReeditComposer.loading && !activeRecordReeditComposer.busy && !preparingReeditFiles && (activeRecordReeditComposer.textContent.trim() !== "" || activeRecordReeditComposer.attachments.length > 0 || activeRecordReeditComposer.snapshot.hasVoice === true);
|
|
183609
184381
|
const pendingComposerFocusDraftKeyRef = (0, react.useRef)();
|
|
183610
184382
|
const [compactNavigation, setCompactNavigation] = (0, react.useState)(false);
|
|
183611
184383
|
const [submitBusy, setSubmitBusy] = (0, react.useState)(false);
|
|
@@ -183916,6 +184688,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183916
184688
|
const cacheAccountKeyRef = (0, react.useRef)();
|
|
183917
184689
|
const timelineGenerationRef = (0, react.useRef)(0);
|
|
183918
184690
|
const timelineWindowRevisionRef = (0, react.useRef)(0);
|
|
184691
|
+
const appliedTimelineInvalidationsRef = (0, react.useRef)(/* @__PURE__ */ new Map());
|
|
183919
184692
|
const timelineRequestsRef = (0, react.useRef)(/* @__PURE__ */ new Map());
|
|
183920
184693
|
const pendingViewportRestoreRef = (0, react.useRef)();
|
|
183921
184694
|
const pendingConversationTargetLocateRef = (0, react.useRef)();
|
|
@@ -184430,7 +185203,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184430
185203
|
const hostRect = host.getBoundingClientRect();
|
|
184431
185204
|
const buttonRect = button.getBoundingClientRect();
|
|
184432
185205
|
const menuWidth = 248;
|
|
184433
|
-
const menuHeight = canManageUserBan ? 88 : 44;
|
|
185206
|
+
const menuHeight = (canManageUserBan ? 88 : 44) + (directAdmission.applicable ? 88 : 0);
|
|
184434
185207
|
setRelatedMenuPosition({
|
|
184435
185208
|
left: Math.max(12, Math.min(hostRect.width - menuWidth - 12, buttonRect.right - hostRect.left - menuWidth)),
|
|
184436
185209
|
top: Math.max(8, Math.min(hostRect.height - menuHeight - 12, buttonRect.bottom - hostRect.top + 8))
|
|
@@ -184441,6 +185214,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184441
185214
|
ensureUserBanStatus();
|
|
184442
185215
|
}, [
|
|
184443
185216
|
canManageUserBan,
|
|
185217
|
+
directAdmission.applicable,
|
|
184444
185218
|
ensureRelatedEligibility,
|
|
184445
185219
|
ensureUserBanStatus,
|
|
184446
185220
|
relatedMenuOpen,
|
|
@@ -184453,7 +185227,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184453
185227
|
const readAckKey = `${source.sourceRef}:${String(readSequence)}`;
|
|
184454
185228
|
if (readSequence <= 0 || lastReadAckRef.current === readAckKey) return;
|
|
184455
185229
|
if (!(source.unreadCount > 0 || arkmeChatDirectory.hasOptimisticRead(source.sourceRef, source.sourceKey, source.latestSequence ?? readSequence))) return;
|
|
185230
|
+
const generation = timelineGenerationRef.current;
|
|
184456
185231
|
if (!await arkmeAwaitVisibleReadIntent()) return;
|
|
185232
|
+
if (!activeConversationRef.current || generation !== timelineGenerationRef.current) return;
|
|
184457
185233
|
if (lastReadAckRef.current === readAckKey) return;
|
|
184458
185234
|
lastReadAckRef.current = readAckKey;
|
|
184459
185235
|
try {
|
|
@@ -184473,9 +185249,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184473
185249
|
const sourceRef = source.sourceRef;
|
|
184474
185250
|
const sourceKey = arkmeSourceIdentityKey(source);
|
|
184475
185251
|
const generation = timelineGenerationRef.current;
|
|
185252
|
+
const invalidationRevision = arkmeChatTimelineDelta.getSnapshotForSource(sourceKey).invalidationRevision;
|
|
185253
|
+
const refreshWindow = intent === "refresh" || intent === "background" ? conversationCacheRef.current.getTimeline(sourceKey) : void 0;
|
|
185254
|
+
if (intent === "refresh" && conversationTargetAbortRef.current !== void 0 && !conversationTargetAbortRef.current.signal.aborted) return;
|
|
184476
185255
|
if (intent === "background" && (conversationCacheRef.current.getTimeline(sourceKey)?.mode === "around" || conversationTargetAbortRef.current !== void 0 && !conversationTargetAbortRef.current.signal.aborted)) return;
|
|
184477
|
-
|
|
184478
|
-
const
|
|
185256
|
+
if (refreshWindow !== void 0 && timelineRequestsRef.current.get("initial")?.controller.signal.aborted === false) return;
|
|
185257
|
+
const direction = refreshWindow === void 0 ? cursor === void 0 ? "initial" : (cursor.afterSequence ?? 0) > 0 ? "newer" : "older" : "refresh";
|
|
185258
|
+
const requestKey = refreshWindow === void 0 ? `${sourceKey}:${cursor === void 0 ? "initial" : JSON.stringify(cursor)}` : `${sourceKey}:refresh:${invalidationRevision}`;
|
|
184479
185259
|
const activeRequest = timelineRequestsRef.current.get(direction);
|
|
184480
185260
|
if (activeRequest !== void 0 && !activeRequest.controller.signal.aborted && activeRequest.requestKey === requestKey) return;
|
|
184481
185261
|
if (intent === "latest") {
|
|
@@ -184490,31 +185270,50 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184490
185270
|
controller,
|
|
184491
185271
|
requestKey
|
|
184492
185272
|
});
|
|
185273
|
+
const readStartDeltas = /* @__PURE__ */ new Map();
|
|
184493
185274
|
let page;
|
|
184494
185275
|
try {
|
|
184495
|
-
|
|
184496
|
-
|
|
184497
|
-
|
|
184498
|
-
|
|
184499
|
-
|
|
185276
|
+
const readPage = (pageCursor) => retryArkmeRead(async () => {
|
|
185277
|
+
const start = new Map((sourceIsChat ? arkmeChatTimelineDelta.getSnapshotForSource(sourceKey).items : []).map((item) => [item.itemUid, item]));
|
|
185278
|
+
const result = await callArkme("source.timeline", {
|
|
185279
|
+
sourceRef,
|
|
185280
|
+
limit: refreshWindow === void 0 ? limit : 100,
|
|
185281
|
+
...pageCursor === void 0 ? {} : { cursor: pageCursor }
|
|
185282
|
+
}, controller.signal);
|
|
185283
|
+
for (const item of result.items) readStartDeltas.set(item.itemUid, start.get(item.itemUid));
|
|
185284
|
+
return result;
|
|
185285
|
+
}, { signal: controller.signal });
|
|
185286
|
+
page = refreshWindow === void 0 ? await readPage(cursor) : await readConversationTimelineWindow(refreshWindow, readPage, controller.signal);
|
|
184500
185287
|
} catch (caught) {
|
|
184501
185288
|
if (isArkmeRequestAbort(caught, controller.signal)) return;
|
|
184502
185289
|
throw caught;
|
|
184503
185290
|
} finally {
|
|
184504
185291
|
if (timelineRequestsRef.current.get(direction)?.controller === controller) timelineRequestsRef.current.delete(direction);
|
|
184505
185292
|
}
|
|
184506
|
-
if (generation !== timelineGenerationRef.current || windowRevision !== timelineWindowRevisionRef.current) return;
|
|
185293
|
+
if (controller.signal.aborted || generation !== timelineGenerationRef.current || windowRevision !== timelineWindowRevisionRef.current) return;
|
|
184507
185294
|
const cached = conversationCacheRef.current.getTimeline(sourceKey);
|
|
184508
185295
|
const loadingNewerPage = (cursor?.afterSequence ?? 0) > 0;
|
|
184509
185296
|
const cachedItemUids = new Set((cached?.items ?? []).map((item) => item.itemUid));
|
|
184510
185297
|
const newerPageStartItemUid = loadingNewerPage ? mergeItems([], page.items.filter((item) => !cachedItemUids.has(item.itemUid)))[0]?.itemUid : void 0;
|
|
184511
185298
|
const nextAroundSequenceRange = !(cursor === void 0 || loadingNewerPage && !page.hasMore) && (cached?.mode ?? "latest") === "around" ? arkmeConversationTimelineSequenceRange(page.items, cached?.aroundSequenceRange) : void 0;
|
|
184512
185299
|
const nextAiPolishSettings = cursor === void 0 ? page.aiPolishSettings : cached?.aiPolishSettings;
|
|
184513
|
-
const
|
|
184514
|
-
const
|
|
185300
|
+
const pendingProjectionItems = cursor === void 0 ? (cached?.items ?? []).filter((item) => item.awaitingTimelineProjection === true && !page.items.some((projected) => projected.itemUid === item.itemUid)) : [];
|
|
185301
|
+
const delta = sourceIsChat ? arkmeChatTimelineDelta.getSnapshotForSource(sourceKey) : void 0;
|
|
185302
|
+
const removedKeys = new Set(delta?.removedItemKeys ?? []);
|
|
185303
|
+
const authoritativeItems = mergeItems(pendingProjectionItems, reconcileTimelinePage(cached?.items ?? [], delta, page.items, readStartDeltas));
|
|
185304
|
+
const refreshRange = refreshWindow?.mode === "around" ? refreshWindow.aroundSequenceRange : void 0;
|
|
185305
|
+
const refreshedIds = new Set(refreshWindow?.items.filter((item) => item.status === 1 && (refreshRange === void 0 || (item.sequence ?? 0) >= refreshRange.minimumSequence && (item.sequence ?? 0) <= refreshRange.maximumSequence)).map((item) => item.itemUid));
|
|
185306
|
+
const snapshot = refreshWindow !== void 0 && cached !== void 0 ? {
|
|
185307
|
+
...cached,
|
|
185308
|
+
items: confirmedSendRetention.merge(sourceKey, mergeItems(cached.items.filter((item) => !refreshedIds.has(item.itemUid) && !removedKeys.has(item.timelineItemKey ?? "")), authoritativeItems)),
|
|
185309
|
+
fetchedAtMillis: Date.now(),
|
|
185310
|
+
aiPolishNotices: page.aiPolishNotices ?? cached.aiPolishNotices,
|
|
185311
|
+
...page.aiPolishSettings === void 0 ? {} : { aiPolishSettings: page.aiPolishSettings },
|
|
185312
|
+
...sourceIsChat ? { latestSequence: Math.max(cached.latestSequence ?? 0, source.latestSequence ?? 0, ...page.items.map((item) => item.sequence ?? 0)) } : { recordRevision: sourceProjectionRevision }
|
|
185313
|
+
} : {
|
|
184515
185314
|
mode: cursor === void 0 ? "latest" : loadingNewerPage && !page.hasMore ? "latest" : cached?.mode ?? "latest",
|
|
184516
185315
|
...nextAroundSequenceRange === void 0 ? {} : { aroundSequenceRange: nextAroundSequenceRange },
|
|
184517
|
-
items: cursor === void 0 ? confirmedSendRetention.merge(sourceKey, authoritativeItems) : mergeItems(cached?.items ?? [],
|
|
185316
|
+
items: cursor === void 0 ? confirmedSendRetention.merge(sourceKey, authoritativeItems) : mergeItems(cached?.items ?? [], authoritativeItems),
|
|
184518
185317
|
aiPolishNotices: cursor === void 0 ? page.aiPolishNotices ?? [] : cached?.aiPolishNotices ?? [],
|
|
184519
185318
|
hasMore: loadingNewerPage ? cached?.hasMore ?? false : page.hasMore,
|
|
184520
185319
|
newerHasMore: loadingNewerPage ? page.hasMore : cursor === void 0 ? false : cached?.newerHasMore ?? false,
|
|
@@ -184526,6 +185325,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184526
185325
|
};
|
|
184527
185326
|
const contentChanged = !arkmeConversationTimelineContentEqual(cached, snapshot);
|
|
184528
185327
|
const releasedMoments = conversationCacheRef.current.storeTimeline(sourceKey, snapshot);
|
|
185328
|
+
const readIds = new Set(page.items.map((item) => item.itemUid));
|
|
185329
|
+
conversationCacheRef.current.consumeTimelineDeltaItems(sourceKey, (delta?.items ?? []).filter((item) => readIds.has(item.itemUid)));
|
|
185330
|
+
if (cursor === void 0) appliedTimelineInvalidationsRef.current.set(sourceKey, Math.max(appliedTimelineInvalidationsRef.current.get(sourceKey) ?? 0, invalidationRevision));
|
|
184529
185331
|
const releasedMomentsChanged = releasedMoments !== void 0 && JSON.stringify(releasedMoments) !== JSON.stringify(interwovenMoments);
|
|
184530
185332
|
if (contentChanged || releasedMomentsChanged) {
|
|
184531
185333
|
const body = bodyRef.current;
|
|
@@ -184554,6 +185356,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184554
185356
|
if (!hadCachedTimeline && snapshot.items.length > 0) setTimelineRevealKey(sourceKey);
|
|
184555
185357
|
await acknowledgeRead(snapshot.items);
|
|
184556
185358
|
}
|
|
185359
|
+
if (generation === timelineGenerationRef.current && windowRevision === timelineWindowRevisionRef.current && arkmeChatTimelineDelta.getSnapshotForSource(sourceKey).invalidationRevision > invalidationRevision) await loadTimeline(void 0, true, 40, "refresh");
|
|
184557
185360
|
}, [
|
|
184558
185361
|
acknowledgeRead,
|
|
184559
185362
|
confirmedSendRetention,
|
|
@@ -184660,24 +185463,30 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184660
185463
|
const controller = new AbortController();
|
|
184661
185464
|
conversationTargetAbortRef.current?.abort();
|
|
184662
185465
|
conversationTargetAbortRef.current = controller;
|
|
184663
|
-
|
|
184664
|
-
|
|
184665
|
-
|
|
184666
|
-
|
|
184667
|
-
|
|
184668
|
-
|
|
184669
|
-
|
|
185466
|
+
let readStartDeltas = /* @__PURE__ */ new Map();
|
|
185467
|
+
retryArkmeRead(() => {
|
|
185468
|
+
readStartDeltas = new Map(arkmeChatTimelineDelta.getSnapshotForSource(conversationKey).items.map((item) => [item.itemUid, item]));
|
|
185469
|
+
return callArkme("source.timeline-around", {
|
|
185470
|
+
sourceRef: source.sourceRef,
|
|
185471
|
+
itemUid: target.itemUid,
|
|
185472
|
+
recordOwnerUserId: target.recordOwnerUserId,
|
|
185473
|
+
beforeLimit: 20,
|
|
185474
|
+
afterLimit: 20
|
|
185475
|
+
}, controller.signal);
|
|
185476
|
+
}, { signal: controller.signal }).then((page) => {
|
|
184670
185477
|
if (controller.signal.aborted || generation !== timelineGenerationRef.current || windowRevision !== timelineWindowRevisionRef.current || arkmeUi.getSnapshot().conversationTarget?.revision !== target.revision) return;
|
|
184671
|
-
|
|
185478
|
+
const cached = conversationCacheRef.current.getTimeline(conversationKey);
|
|
185479
|
+
const delta = sourceIsChat ? arkmeChatTimelineDelta.getSnapshotForSource(conversationKey) : void 0;
|
|
185480
|
+
const items = reconcileTimelinePage(cached?.items ?? [], delta, page.items, readStartDeltas);
|
|
185481
|
+
if (!items.some((item) => item.itemUid === target.itemUid)) throw new Error("未找到要定位的快记");
|
|
184672
185482
|
timelineRequestsRef.current.get("initial")?.controller.abort();
|
|
184673
185483
|
timelineRequestsRef.current.delete("initial");
|
|
184674
185484
|
timelineWindowRevisionRef.current += 1;
|
|
184675
|
-
const cached = conversationCacheRef.current.getTimeline(conversationKey);
|
|
184676
185485
|
const nextAroundSequenceRange = arkmeConversationTimelineSequenceRange(page.items);
|
|
184677
185486
|
const snapshot = {
|
|
184678
185487
|
mode: "around",
|
|
184679
185488
|
...nextAroundSequenceRange === void 0 ? {} : { aroundSequenceRange: nextAroundSequenceRange },
|
|
184680
|
-
items
|
|
185489
|
+
items,
|
|
184681
185490
|
aiPolishNotices: cached?.aiPolishNotices ?? [],
|
|
184682
185491
|
hasMore: page.olderHasMore,
|
|
184683
185492
|
newerHasMore: page.newerHasMore,
|
|
@@ -184688,6 +185497,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184688
185497
|
...page.newerCursor === void 0 ? {} : { newerCursor: page.newerCursor }
|
|
184689
185498
|
};
|
|
184690
185499
|
conversationCacheRef.current.storeTimeline(conversationKey, snapshot);
|
|
185500
|
+
const readIds = new Set(page.items.map((item) => item.itemUid));
|
|
185501
|
+
conversationCacheRef.current.consumeTimelineDeltaItems(conversationKey, (delta?.items ?? []).filter((item) => readIds.has(item.itemUid)));
|
|
185502
|
+
conversationTargetAbortRef.current = void 0;
|
|
184691
185503
|
pendingViewportRestoreRef.current = void 0;
|
|
184692
185504
|
setMemberEventWindowRevision((value) => value + 1);
|
|
184693
185505
|
pendingConversationTargetLocateRef.current = {
|
|
@@ -184707,8 +185519,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184707
185519
|
newerCursor: snapshot.newerCursor,
|
|
184708
185520
|
newerHasMore: snapshot.newerHasMore ?? false
|
|
184709
185521
|
});
|
|
185522
|
+
if (arkmeChatTimelineDelta.getSnapshotForSource(conversationKey).invalidationRevision > (appliedTimelineInvalidationsRef.current.get(conversationKey) ?? 0)) loadTimeline(void 0, true, 40, "refresh").catch((caught) => {
|
|
185523
|
+
setError(errorMessage$2(caught));
|
|
185524
|
+
});
|
|
184710
185525
|
}).catch((caught) => {
|
|
184711
185526
|
if (isArkmeRequestAbort(caught, controller.signal)) return;
|
|
185527
|
+
if (generation !== timelineGenerationRef.current || windowRevision !== timelineWindowRevisionRef.current) return;
|
|
185528
|
+
conversationTargetAbortRef.current = void 0;
|
|
184712
185529
|
if (pendingConversationTargetLocateRef.current?.revision === target.revision) pendingConversationTargetLocateRef.current = void 0;
|
|
184713
185530
|
const message = errorMessage$2(caught) || "暂时无法定位这条快记";
|
|
184714
185531
|
if (messageActionStatusTimerRef.current !== void 0) window.clearTimeout(messageActionStatusTimerRef.current);
|
|
@@ -184718,6 +185535,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184718
185535
|
messageActionStatusTimerRef.current = void 0;
|
|
184719
185536
|
}, MESSAGE_ACTION_NOTICE_MS);
|
|
184720
185537
|
arkmeUi.consumeConversationTarget(target.revision);
|
|
185538
|
+
if (arkmeChatTimelineDelta.getSnapshotForSource(conversationKey).invalidationRevision > (appliedTimelineInvalidationsRef.current.get(conversationKey) ?? 0)) loadTimeline(void 0, true, 40, "refresh").catch((error) => {
|
|
185539
|
+
setError(errorMessage$2(error));
|
|
185540
|
+
});
|
|
184721
185541
|
}).finally(() => {
|
|
184722
185542
|
if (conversationTargetAbortRef.current === controller) conversationTargetAbortRef.current = void 0;
|
|
184723
185543
|
});
|
|
@@ -184774,6 +185594,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184774
185594
|
if (!accountChanged && timelineStateKey !== "" && bodyRef.current !== null) conversationCacheRef.current.storeViewport(timelineStateKey, arkmeConversationViewport(bodyRef.current));
|
|
184775
185595
|
if (accountChanged) {
|
|
184776
185596
|
conversationCacheRef.current.clear();
|
|
185597
|
+
appliedTimelineInvalidationsRef.current.clear();
|
|
184777
185598
|
cacheAccountKeyRef.current = authenticatedAccountKey;
|
|
184778
185599
|
}
|
|
184779
185600
|
const sourceKey = authenticated && conversationKey !== "" ? conversationKey : void 0;
|
|
@@ -184904,6 +185725,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184904
185725
|
authenticated,
|
|
184905
185726
|
chatDelta.items,
|
|
184906
185727
|
conversationKey,
|
|
185728
|
+
foregroundReadRevision,
|
|
184907
185729
|
loadTimeline,
|
|
184908
185730
|
notificationActivationRevision,
|
|
184909
185731
|
source,
|
|
@@ -185013,13 +185835,14 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185013
185835
|
};
|
|
185014
185836
|
}, [activeConversation, authenticated]);
|
|
185015
185837
|
(0, react.useEffect)(() => {
|
|
185016
|
-
if (!activeConversation || !authenticated || source === void 0) return;
|
|
185017
|
-
const deltaItems = chatDelta.items;
|
|
185838
|
+
if (!activeConversation || !authenticated || source === void 0 || timelineStateKey !== conversationKey) return;
|
|
185839
|
+
const deltaItems = conversationCacheRef.current.unappliedTimelineDeltaItems(conversationKey, chatDelta.items);
|
|
185018
185840
|
const removedItemKeys = new Set(chatDelta.removedItemKeys);
|
|
185019
185841
|
const retainedItems = removedItemKeys.size === 0 ? items : items.filter((item) => !removedItemKeys.has(item.timelineItemKey ?? ""));
|
|
185020
185842
|
const applicableDeltaItems = arkmeConversationTimelineDeltaItems(timelineMode, aroundSequenceRange, retainedItems, deltaItems);
|
|
185021
185843
|
if (applicableDeltaItems.length === 0 && retainedItems.length === items.length) return;
|
|
185022
185844
|
const nextItems = mergeItems(retainedItems, applicableDeltaItems);
|
|
185845
|
+
conversationCacheRef.current.consumeTimelineDeltaItems(conversationKey, applicableDeltaItems);
|
|
185023
185846
|
if (JSON.stringify(nextItems) === JSON.stringify(items)) return;
|
|
185024
185847
|
const body = bodyRef.current;
|
|
185025
185848
|
const viewport = body === null ? void 0 : arkmeConversationViewport(body);
|
|
@@ -185049,15 +185872,14 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185049
185872
|
conversationKey,
|
|
185050
185873
|
items,
|
|
185051
185874
|
source,
|
|
185052
|
-
timelineMode
|
|
185875
|
+
timelineMode,
|
|
185876
|
+
timelineStateKey
|
|
185053
185877
|
]);
|
|
185054
|
-
const appliedTimelineInvalidationsRef = (0, react.useRef)(/* @__PURE__ */ new Map());
|
|
185055
185878
|
(0, react.useEffect)(() => {
|
|
185056
185879
|
if (!activeConversation || !authenticated || source === void 0 || chatDelta.invalidationRevision <= 0) return;
|
|
185057
185880
|
const applied = appliedTimelineInvalidationsRef.current.get(conversationKey) ?? 0;
|
|
185058
185881
|
if (chatDelta.invalidationRevision <= applied) return;
|
|
185059
|
-
|
|
185060
|
-
loadTimeline(void 0, true).catch((caught) => {
|
|
185882
|
+
loadTimeline(void 0, true, 40, "refresh").catch((caught) => {
|
|
185061
185883
|
setError(errorMessage$2(caught));
|
|
185062
185884
|
});
|
|
185063
185885
|
}, [
|
|
@@ -185430,28 +186252,45 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185430
186252
|
request.send(file);
|
|
185431
186253
|
});
|
|
185432
186254
|
const selectFiles = async (files) => {
|
|
186255
|
+
if (activeRecordReeditComposer === void 0 && directAdmission.blocked) return;
|
|
185433
186256
|
if (files === null || files.length === 0) return;
|
|
186257
|
+
const reeditTarget = activeRecordReeditComposer;
|
|
186258
|
+
if (reeditTarget?.snapshot?.maxAttachments === 0) return;
|
|
185434
186259
|
const targetDraftKey = composerDraftKey;
|
|
185435
186260
|
const targetUserId = authenticatedUserId;
|
|
185436
186261
|
if (targetDraftKey === void 0 || targetUserId === void 0) return;
|
|
185437
|
-
|
|
186262
|
+
const preparationKey = reeditTarget === void 0 ? targetDraftKey : arkmeRecordReeditPreparationKey(reeditTarget);
|
|
186263
|
+
if (reeditTarget !== void 0 && (reeditTarget.snapshot === void 0 || reeditTarget.loading || reeditTarget.busy || preparationJobs.current.has(preparationKey))) return;
|
|
186264
|
+
const scope = captureComposerAsyncScope();
|
|
186265
|
+
const sameReeditTarget = () => reeditTarget !== void 0 && sameComposerAsyncScope(scope) && recordReeditGenerationRef.current === reeditTarget.generation && sameArkmeRecordReeditSession(recordReeditComposerRef.current, reeditTarget);
|
|
186266
|
+
const showPreparationError = (message) => {
|
|
186267
|
+
if (reeditTarget === void 0) setError(message);
|
|
186268
|
+
else if (sameReeditTarget()) setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, reeditTarget) ? {
|
|
186269
|
+
...current,
|
|
186270
|
+
error: message
|
|
186271
|
+
} : current);
|
|
186272
|
+
};
|
|
186273
|
+
if (reeditTarget === void 0) syncComposerUserInput(true);
|
|
185438
186274
|
const picked = Array.from(files);
|
|
185439
186275
|
const controller = new AbortController();
|
|
185440
186276
|
stageControllers.current.add(controller);
|
|
185441
186277
|
setAddMenuOpen(false);
|
|
185442
|
-
|
|
185443
|
-
setPreparingKeys((current) => /* @__PURE__ */ new Set([...current,
|
|
186278
|
+
showPreparationError("");
|
|
186279
|
+
setPreparingKeys((current) => /* @__PURE__ */ new Set([...current, preparationKey]));
|
|
185444
186280
|
if (fileInputRef.current !== null) fileInputRef.current.value = "";
|
|
185445
|
-
const job = (preparationJobs.current.get(
|
|
186281
|
+
const job = (preparationJobs.current.get(preparationKey) ?? Promise.resolve(true)).catch(() => false).then(async () => {
|
|
185446
186282
|
const sdk = createArkmeSdk();
|
|
185447
186283
|
const policy = await sdk.fileCapabilities();
|
|
186284
|
+
const maxAttachments = Math.min(policy.maxAttachments, reeditTarget?.snapshot?.maxAttachments ?? policy.maxAttachments);
|
|
185448
186285
|
const errors = [];
|
|
186286
|
+
let reeditAttachmentCount = reeditTarget?.attachments.length ?? 0;
|
|
185449
186287
|
let added = false;
|
|
185450
186288
|
for (const file of picked) {
|
|
185451
186289
|
controller.signal.throwIfAborted();
|
|
186290
|
+
if (reeditTarget !== void 0 && !sameReeditTarget()) return false;
|
|
185452
186291
|
const limit = file.type.startsWith("image/") ? policy.maxImageBytes : policy.maxFileBytes;
|
|
185453
|
-
if (arkmeComposerDraftStore.get(targetDraftKey).attachments.length >=
|
|
185454
|
-
errors.push(`最多添加 ${
|
|
186292
|
+
if ((reeditTarget === void 0 ? arkmeComposerDraftStore.get(targetDraftKey).attachments.length : reeditAttachmentCount) >= maxAttachments) {
|
|
186293
|
+
errors.push(`最多添加 ${maxAttachments} 个附件:${file.name}`);
|
|
185455
186294
|
continue;
|
|
185456
186295
|
}
|
|
185457
186296
|
if (file.size === 0 || file.size > limit) {
|
|
@@ -185459,34 +186298,52 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185459
186298
|
continue;
|
|
185460
186299
|
}
|
|
185461
186300
|
try {
|
|
185462
|
-
const localFile = await sdk.stageFile(file, {
|
|
186301
|
+
const localFile = await sdk.stageFile(file, {
|
|
186302
|
+
signal: controller.signal,
|
|
186303
|
+
expectedUserId: targetUserId,
|
|
186304
|
+
...reeditTarget ? { retention: "references" } : {}
|
|
186305
|
+
});
|
|
185463
186306
|
const currentAuth = arkmeAuthStore.getSnapshot().auth;
|
|
185464
186307
|
if (currentAuth?.status !== "authenticated" || currentAuth.userId !== targetUserId) return false;
|
|
185465
|
-
arkmeComposerDraftStore.appendAttachments(targetDraftKey, [{ localFile }], policy.maxAttachments);
|
|
186308
|
+
if (reeditTarget === void 0) arkmeComposerDraftStore.appendAttachments(targetDraftKey, [{ localFile }], policy.maxAttachments);
|
|
186309
|
+
else {
|
|
186310
|
+
if (!sameReeditTarget()) return false;
|
|
186311
|
+
reeditAttachmentCount += 1;
|
|
186312
|
+
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, reeditTarget) ? {
|
|
186313
|
+
...current,
|
|
186314
|
+
attachments: [...current.attachments, {
|
|
186315
|
+
localFile,
|
|
186316
|
+
selection: { fileRef: localFile.fileRef }
|
|
186317
|
+
}]
|
|
186318
|
+
} : current);
|
|
186319
|
+
}
|
|
185466
186320
|
added = true;
|
|
185467
186321
|
} catch (caught) {
|
|
185468
186322
|
if (controller.signal.aborted) throw caught;
|
|
185469
186323
|
errors.push(`${file.name}:${errorMessage$2(caught)}`);
|
|
185470
186324
|
}
|
|
185471
186325
|
}
|
|
185472
|
-
if (errors.length > 0)
|
|
186326
|
+
if (errors.length > 0) showPreparationError(errors.join(";"));
|
|
185473
186327
|
return added;
|
|
185474
186328
|
}).catch((caught) => {
|
|
185475
|
-
if (!controller.signal.aborted)
|
|
186329
|
+
if (!controller.signal.aborted) showPreparationError(errorMessage$2(caught));
|
|
185476
186330
|
return false;
|
|
185477
186331
|
}).finally(() => {
|
|
185478
186332
|
stageControllers.current.delete(controller);
|
|
185479
|
-
if (preparationJobs.current.get(
|
|
185480
|
-
preparationJobs.current.delete(
|
|
186333
|
+
if (preparationJobs.current.get(preparationKey) === job) {
|
|
186334
|
+
preparationJobs.current.delete(preparationKey);
|
|
185481
186335
|
setPreparingKeys((current) => {
|
|
185482
186336
|
const next = new Set(current);
|
|
185483
|
-
next.delete(
|
|
186337
|
+
next.delete(preparationKey);
|
|
185484
186338
|
return next;
|
|
185485
186339
|
});
|
|
185486
186340
|
}
|
|
185487
|
-
pendingComposerFocusDraftKeyRef.current = targetDraftKey;
|
|
186341
|
+
if (reeditTarget === void 0) pendingComposerFocusDraftKeyRef.current = targetDraftKey;
|
|
186342
|
+
else if (sameReeditTarget()) requestAnimationFrame(() => {
|
|
186343
|
+
textareaRef.current?.focus();
|
|
186344
|
+
});
|
|
185488
186345
|
});
|
|
185489
|
-
preparationJobs.current.set(
|
|
186346
|
+
preparationJobs.current.set(preparationKey, job);
|
|
185490
186347
|
await job;
|
|
185491
186348
|
};
|
|
185492
186349
|
const rememberSentHashTags = (0, react.useCallback)((accountKey, itemUid, textContent, sendAtMillis, textFormat) => {
|
|
@@ -185499,6 +186356,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185499
186356
|
}]));
|
|
185500
186357
|
}, []);
|
|
185501
186358
|
const send = async () => {
|
|
186359
|
+
if (activeRecordReeditComposer === void 0 && directAdmission.blocked) return;
|
|
185502
186360
|
if (activeRecordReeditComposer !== void 0) {
|
|
185503
186361
|
await commitRecordReedit();
|
|
185504
186362
|
return;
|
|
@@ -185908,6 +186766,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185908
186766
|
if (pendingAssets.length > 0) await loadTimeline();
|
|
185909
186767
|
} catch (caught) {
|
|
185910
186768
|
if (sameTargetComposer()) setItems((current) => current.filter((item) => item.itemUid !== recordUid));
|
|
186769
|
+
if (caught instanceof ArkmeClientError && caught.body.directMessageAdmission !== void 0) invalidateDirectMessageAdmission();
|
|
185911
186770
|
if (sameTargetAccount()) if (!durableFileSendUncertain) {
|
|
185912
186771
|
arkmeComposerDraftStore.restore(targetDraftKey, pendingDraft);
|
|
185913
186772
|
recordInputCaptureOwner.restoreForRetry(targetDraftKey, inputCapture);
|
|
@@ -185917,7 +186776,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185917
186776
|
}
|
|
185918
186777
|
};
|
|
185919
186778
|
const updateComposerText = (text) => {
|
|
186779
|
+
if (activeRecordReeditComposer === void 0 && directAdmission.blocked) return;
|
|
185920
186780
|
if (activeRecordReeditComposer !== void 0) {
|
|
186781
|
+
if (activeRecordReeditComposer.snapshot === void 0 || activeRecordReeditComposer.loading || activeRecordReeditComposer.busy || preparationJobs.current.has(arkmeRecordReeditPreparationKey(activeRecordReeditComposer))) return;
|
|
185921
186782
|
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, activeRecordReeditComposer) ? {
|
|
185922
186783
|
...current,
|
|
185923
186784
|
textContent: text,
|
|
@@ -186455,10 +187316,39 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186455
187316
|
}
|
|
186456
187317
|
setMomentRelatedView(relatedDrawerBackTarget(momentRelatedView));
|
|
186457
187318
|
};
|
|
186458
|
-
const
|
|
187319
|
+
const refreshCurrentWindow = (0, react.useCallback)(() => loadTimeline(void 0, true, 40, "refresh"), [loadTimeline]);
|
|
187320
|
+
const reeditSubmissions = useRecordReeditSubmissions(source?.sourceRef, authenticatedAccountKey, activeConversation, timelineStateKey === conversationKey ? items : [], refreshCurrentWindow, conversationKey);
|
|
187321
|
+
const { displayItems, reeditItems } = (0, react.useMemo)(() => {
|
|
186459
187322
|
const remoteIds = new Set(items.map((item) => item.itemUid));
|
|
186460
|
-
|
|
186461
|
-
|
|
187323
|
+
const reeditItems = /* @__PURE__ */ new Set();
|
|
187324
|
+
return {
|
|
187325
|
+
displayItems: [...items.map((item) => {
|
|
187326
|
+
const bound = bindSentFileTaskLocals(item, fileTasks.tasks);
|
|
187327
|
+
const projected = projectRecordReedit(bound, reeditSubmissions.jobs);
|
|
187328
|
+
if (projected !== bound) reeditItems.add(projected);
|
|
187329
|
+
return projected;
|
|
187330
|
+
}), ...fileTasks.tasks.filter((task) => !remoteIds.has(task.result?.itemUid ?? task.recordUid)).map(fileTaskTimelineItem)].sort((a, b) => a.sendAtMillis - b.sendAtMillis),
|
|
187331
|
+
reeditItems
|
|
187332
|
+
};
|
|
187333
|
+
}, [
|
|
187334
|
+
items,
|
|
187335
|
+
fileTasks.tasks,
|
|
187336
|
+
reeditSubmissions.jobs
|
|
187337
|
+
]);
|
|
187338
|
+
(0, react.useEffect)(() => {
|
|
187339
|
+
for (const job of reeditSubmissions.jobs) if (job.state === "pending" || job.state === "committing") pendingReeditHighlights.current.add(job.submissionId);
|
|
187340
|
+
const committed = reeditSubmissions.jobs.filter((job) => job.state === "committed" && pendingReeditHighlights.current.has(job.submissionId) && !seenReeditCommits.current.has(job.submissionId));
|
|
187341
|
+
if (committed.length === 0) return;
|
|
187342
|
+
for (const job of committed) seenReeditCommits.current.add(job.submissionId);
|
|
187343
|
+
const latest = committed[committed.length - 1];
|
|
187344
|
+
if (recordReeditHighlightTimerRef.current !== void 0) window.clearTimeout(recordReeditHighlightTimerRef.current);
|
|
187345
|
+
setHighlightedTargetUid("");
|
|
187346
|
+
setRecordReeditHighlightUid(latest.itemUid);
|
|
187347
|
+
recordReeditHighlightTimerRef.current = window.setTimeout(() => {
|
|
187348
|
+
recordReeditHighlightTimerRef.current = void 0;
|
|
187349
|
+
setRecordReeditHighlightUid("");
|
|
187350
|
+
}, ARKME_RECORD_REEDIT_HIGHLIGHT_MILLIS);
|
|
187351
|
+
}, [reeditSubmissions.jobs]);
|
|
186462
187352
|
const visibleConversationJoinEvents = (0, react.useMemo)(() => source?.kind === "group_chat" ? arkmeConversationJoinEventsInLoadedWindow(conversationJoinEvents, displayItems, hasMore) : [], [
|
|
186463
187353
|
conversationJoinEvents,
|
|
186464
187354
|
displayItems,
|
|
@@ -186676,7 +187566,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186676
187566
|
const actionRef = arkmeTimelineMessageActionRef(item);
|
|
186677
187567
|
closeMessageMenu();
|
|
186678
187568
|
if (source === void 0 || actionRef === "") return;
|
|
186679
|
-
if (
|
|
187569
|
+
if (activeRecordReeditComposer !== void 0) {
|
|
186680
187570
|
showMessageActionStatus("请先完成编辑后再进行延展");
|
|
186681
187571
|
return;
|
|
186682
187572
|
}
|
|
@@ -186689,42 +187579,51 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186689
187579
|
textareaRef.current?.focus();
|
|
186690
187580
|
});
|
|
186691
187581
|
}, [
|
|
187582
|
+
activeRecordReeditComposer,
|
|
186692
187583
|
closeMessageMenu,
|
|
186693
187584
|
showMessageActionStatus,
|
|
186694
187585
|
source
|
|
186695
187586
|
]);
|
|
186696
187587
|
const closeRecordReedit = (0, react.useCallback)(async () => {
|
|
186697
187588
|
const target = recordReeditComposerRef.current;
|
|
186698
|
-
if (target === void 0 || target.busy) return;
|
|
187589
|
+
if (target === void 0 || target.busy || preparationJobs.current.has(arkmeRecordReeditPreparationKey(target))) return;
|
|
186699
187590
|
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
186700
187591
|
...current,
|
|
186701
187592
|
busy: true,
|
|
186702
187593
|
error: ""
|
|
186703
187594
|
} : current);
|
|
186704
187595
|
try {
|
|
186705
|
-
await persistRecordReeditDraft(target)
|
|
186706
|
-
|
|
186707
|
-
|
|
186708
|
-
|
|
186709
|
-
|
|
186710
|
-
|
|
186711
|
-
}
|
|
187596
|
+
if (target.snapshot !== void 0 && !await persistRecordReeditDraft(target)) {
|
|
187597
|
+
updateRecordReeditCandidate(target, (current) => ({
|
|
187598
|
+
...current,
|
|
187599
|
+
busy: false
|
|
187600
|
+
}));
|
|
187601
|
+
return;
|
|
187602
|
+
}
|
|
187603
|
+
const active = sameArkmeRecordReeditSession(recordReeditComposerRef.current, target);
|
|
187604
|
+
updateRecordReeditCandidate(target, () => void 0);
|
|
187605
|
+
if (active) {
|
|
187606
|
+
recordReeditGenerationRef.current += 1;
|
|
187607
|
+
requestAnimationFrame(() => {
|
|
187608
|
+
textareaRef.current?.focus();
|
|
187609
|
+
});
|
|
187610
|
+
}
|
|
186712
187611
|
} catch (caught) {
|
|
186713
|
-
|
|
187612
|
+
updateRecordReeditCandidate(target, (current) => ({
|
|
186714
187613
|
...current,
|
|
186715
187614
|
busy: false,
|
|
186716
|
-
|
|
186717
|
-
}
|
|
187615
|
+
...arkmeRecordReeditFailure(caught)
|
|
187616
|
+
}));
|
|
186718
187617
|
}
|
|
186719
|
-
}, [persistRecordReeditDraft]);
|
|
187618
|
+
}, [persistRecordReeditDraft, updateRecordReeditCandidate]);
|
|
186720
187619
|
const commitRecordReedit = (0, react.useCallback)(async () => {
|
|
186721
187620
|
const target = recordReeditComposerRef.current;
|
|
186722
187621
|
const targetSource = source;
|
|
186723
|
-
if (target === void 0 || target.snapshot === void 0 || target.loading || target.busy || targetSource === void 0) return;
|
|
187622
|
+
if (target === void 0 || target.snapshot === void 0 || target.loading || target.busy || targetSource === void 0 || preparationJobs.current.has(arkmeRecordReeditPreparationKey(target)) || target.persisted.exclusive || target.sourceKey !== arkmeSourceIdentityKey(targetSource) || target.accountKey !== arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth)) return;
|
|
186724
187623
|
const nextTitle = target.title.trim();
|
|
186725
187624
|
const nextText = (target.snapshot.textFormat ?? target.item.textFormat) === "markdown" ? target.textContent : target.textContent.trim();
|
|
186726
187625
|
const supportsTitle = target.snapshot.displayKind === 1;
|
|
186727
|
-
if (nextText.trim() === "" || supportsTitle && nextTitle === "") {
|
|
187626
|
+
if (nextText.trim() === "" && target.attachments.length === 0 && !target.snapshot.hasVoice || supportsTitle && nextTitle === "") {
|
|
186728
187627
|
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
186729
187628
|
...current,
|
|
186730
187629
|
error: "请输入完整内容"
|
|
@@ -186738,94 +187637,172 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186738
187637
|
} : current);
|
|
186739
187638
|
return;
|
|
186740
187639
|
}
|
|
186741
|
-
|
|
187640
|
+
target.persisted.exclusive = true;
|
|
186742
187641
|
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
186743
187642
|
...current,
|
|
186744
187643
|
busy: true,
|
|
186745
187644
|
error: ""
|
|
186746
187645
|
} : current);
|
|
186747
187646
|
try {
|
|
186748
|
-
await
|
|
186749
|
-
|
|
187647
|
+
await persistRecordReeditDraft(target, true);
|
|
187648
|
+
await target.persisted.saveTail;
|
|
187649
|
+
if (target.accountKey !== arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth)) return;
|
|
187650
|
+
const result = await callArkme("source.record-reedit.submit", {
|
|
186750
187651
|
sourceRef: target.sourceRef,
|
|
186751
187652
|
itemUid: target.item.itemUid,
|
|
186752
187653
|
newText: nextText,
|
|
186753
|
-
expectedVersion: target.snapshot.version,
|
|
187654
|
+
expectedVersion: target.snapshot.draft?.baseVersion ?? target.snapshot.version,
|
|
187655
|
+
expectedDraftRevision: target.persisted.draftRevision,
|
|
187656
|
+
attachments: target.attachments.map((attachment) => attachment.selection),
|
|
186754
187657
|
...supportsTitle ? { newTitle: nextTitle } : {}
|
|
186755
187658
|
});
|
|
186756
|
-
|
|
186757
|
-
|
|
186758
|
-
|
|
186759
|
-
|
|
186760
|
-
|
|
186761
|
-
|
|
186762
|
-
|
|
186763
|
-
|
|
186764
|
-
}
|
|
186765
|
-
if (isArkmeSelfWorkspaceSource(targetSource)) arkmeUi.recordChanged();
|
|
186766
|
-
recordReeditGenerationRef.current += 1;
|
|
186767
|
-
setRecordReeditComposer(void 0);
|
|
186768
|
-
if (recordReeditHighlightTimerRef.current !== void 0) window.clearTimeout(recordReeditHighlightTimerRef.current);
|
|
186769
|
-
setHighlightedTargetUid("");
|
|
186770
|
-
setRecordReeditHighlightUid(result.itemUid);
|
|
186771
|
-
recordReeditHighlightTimerRef.current = window.setTimeout(() => {
|
|
186772
|
-
recordReeditHighlightTimerRef.current = void 0;
|
|
186773
|
-
setRecordReeditHighlightUid((current) => current === result.itemUid ? "" : current);
|
|
186774
|
-
}, ARKME_RECORD_REEDIT_HIGHLIGHT_MILLIS);
|
|
186775
|
-
requestAnimationFrame(() => {
|
|
186776
|
-
textareaRef.current?.focus();
|
|
186777
|
-
});
|
|
187659
|
+
const active = sameArkmeRecordReeditSession(recordReeditComposerRef.current, target) && target.accountKey === arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth) && recordReeditGenerationRef.current === target.generation;
|
|
187660
|
+
reeditSubmissions.accepted(result);
|
|
187661
|
+
updateRecordReeditCandidate(target, () => void 0);
|
|
187662
|
+
if (active) {
|
|
187663
|
+
recordReeditGenerationRef.current += 1;
|
|
187664
|
+
requestAnimationFrame(() => {
|
|
187665
|
+
textareaRef.current?.focus();
|
|
187666
|
+
});
|
|
187667
|
+
}
|
|
186778
187668
|
} catch (caught) {
|
|
187669
|
+
updateRecordReeditCandidate(target, (current) => ({
|
|
187670
|
+
...current,
|
|
187671
|
+
busy: false,
|
|
187672
|
+
...arkmeRecordReeditFailure(caught)
|
|
187673
|
+
}));
|
|
187674
|
+
} finally {
|
|
187675
|
+
target.persisted.exclusive = false;
|
|
187676
|
+
updateRecordReeditCandidate(target, (current) => current.busy ? {
|
|
187677
|
+
...current,
|
|
187678
|
+
busy: false
|
|
187679
|
+
} : current);
|
|
187680
|
+
}
|
|
187681
|
+
}, [
|
|
187682
|
+
persistRecordReeditDraft,
|
|
187683
|
+
source,
|
|
187684
|
+
reeditSubmissions.accepted,
|
|
187685
|
+
updateRecordReeditCandidate
|
|
187686
|
+
]);
|
|
187687
|
+
const recoverRecordReedit = (0, react.useCallback)(async () => {
|
|
187688
|
+
const target = recordReeditComposerRef.current;
|
|
187689
|
+
if (target === void 0 || target.busy || !target.recoveryConfirmation || preparationJobs.current.has(arkmeRecordReeditPreparationKey(target)) || target.persisted.exclusive) return;
|
|
187690
|
+
const sameTarget = () => {
|
|
187691
|
+
const selected = arkmeUi.getSnapshot().selectedSource;
|
|
187692
|
+
return selected !== void 0 && arkmeSourceIdentityKey(selected) === target.sourceKey && arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth) === target.accountKey && sameArkmeRecordReeditSession(recordReeditComposerRef.current, target) && recordReeditGenerationRef.current === target.generation;
|
|
187693
|
+
};
|
|
187694
|
+
if (!sameTarget()) return;
|
|
187695
|
+
target.persisted.exclusive = true;
|
|
187696
|
+
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
187697
|
+
...current,
|
|
187698
|
+
busy: true,
|
|
187699
|
+
error: ""
|
|
187700
|
+
} : current);
|
|
187701
|
+
try {
|
|
187702
|
+
await target.persisted.saveTail;
|
|
187703
|
+
if (!sameTarget()) return;
|
|
187704
|
+
let snapshot = await callArkme("source.record-reedit.detail", {
|
|
187705
|
+
sourceRef: target.sourceRef,
|
|
187706
|
+
itemUid: target.item.itemUid
|
|
187707
|
+
});
|
|
187708
|
+
if (!sameTarget()) return;
|
|
187709
|
+
const draftChanged = (snapshot.draft?.draftRevision ?? 0) !== target.persisted.draftRevision;
|
|
187710
|
+
if (target.conflict !== "draft" && !draftChanged && snapshot.draft !== void 0) {
|
|
187711
|
+
await callArkme("source.record-reedit.draft.delete", {
|
|
187712
|
+
sourceRef: target.sourceRef,
|
|
187713
|
+
itemUid: target.item.itemUid,
|
|
187714
|
+
expectedDraftRevision: target.persisted.draftRevision
|
|
187715
|
+
});
|
|
187716
|
+
if (!sameTarget()) return;
|
|
187717
|
+
snapshot = await callArkme("source.record-reedit.detail", {
|
|
187718
|
+
sourceRef: target.sourceRef,
|
|
187719
|
+
itemUid: target.item.itemUid
|
|
187720
|
+
});
|
|
187721
|
+
}
|
|
187722
|
+
if (!sameTarget()) return;
|
|
187723
|
+
const title = snapshot.draft?.title ?? snapshot.title;
|
|
187724
|
+
const textContent = snapshot.draft?.textContent ?? snapshot.textContent;
|
|
187725
|
+
const attachments = snapshot.draft?.attachments ?? snapshot.attachments ?? [];
|
|
186779
187726
|
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
186780
187727
|
...current,
|
|
187728
|
+
snapshot,
|
|
187729
|
+
title,
|
|
187730
|
+
textContent,
|
|
187731
|
+
attachments,
|
|
187732
|
+
persisted: {
|
|
187733
|
+
candidateKey: arkmeRecordReeditCandidateKey(title, textContent, attachments, snapshot.textFormat ?? current.item.textFormat),
|
|
187734
|
+
draftRevision: snapshot.draft?.draftRevision ?? 0,
|
|
187735
|
+
saveTail: Promise.resolve()
|
|
187736
|
+
},
|
|
186781
187737
|
busy: false,
|
|
186782
|
-
|
|
187738
|
+
conflict: void 0,
|
|
187739
|
+
recoveryConfirmation: false,
|
|
187740
|
+
error: draftChanged ? "已重新载入其他入口更新的草稿,请检查后再决定是否放弃" : ""
|
|
187741
|
+
} : current);
|
|
187742
|
+
setDraftPreview(void 0);
|
|
187743
|
+
} catch (caught) {
|
|
187744
|
+
if (sameTarget()) setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
187745
|
+
...current,
|
|
187746
|
+
busy: false,
|
|
187747
|
+
...arkmeRecordReeditFailure(caught)
|
|
186783
187748
|
} : current);
|
|
186784
187749
|
} finally {
|
|
186785
|
-
|
|
187750
|
+
target.persisted.exclusive = false;
|
|
187751
|
+
updateRecordReeditCandidate(target, (current) => current.busy ? {
|
|
187752
|
+
...current,
|
|
187753
|
+
busy: false
|
|
187754
|
+
} : current);
|
|
186786
187755
|
}
|
|
186787
|
-
}, [
|
|
187756
|
+
}, [updateRecordReeditCandidate]);
|
|
186788
187757
|
const openRecordReedit = (0, react.useCallback)(async (item) => {
|
|
186789
187758
|
closeMessageMenu();
|
|
186790
187759
|
if (source === void 0 || !arkmeCanReeditTimelineMessage(item)) return;
|
|
187760
|
+
const submission = reeditSubmissions.jobs.find((job) => job.itemUid === item.itemUid);
|
|
187761
|
+
if (submission && [
|
|
187762
|
+
"pending",
|
|
187763
|
+
"committing",
|
|
187764
|
+
"uncertain"
|
|
187765
|
+
].includes(submission.state)) {
|
|
187766
|
+
showMessageActionStatus("这条快记仍在保存或核对,请稍后再编辑;其他消息不受影响");
|
|
187767
|
+
return;
|
|
187768
|
+
}
|
|
186791
187769
|
const previous = recordReeditComposerRef.current;
|
|
186792
187770
|
if (previous !== void 0) {
|
|
186793
|
-
if (previous.
|
|
186794
|
-
if (previous.sourceRef === source.sourceRef && previous.item.itemUid === item.itemUid) {
|
|
187771
|
+
if (previous.accountKey === authenticatedAccountKey && previous.sourceKey === arkmeSourceIdentityKey(source) && previous.item.itemUid === item.itemUid) {
|
|
186795
187772
|
requestAnimationFrame(() => {
|
|
186796
187773
|
textareaRef.current?.focus();
|
|
186797
187774
|
});
|
|
186798
187775
|
return;
|
|
186799
187776
|
}
|
|
186800
|
-
|
|
186801
|
-
...current,
|
|
186802
|
-
busy: true,
|
|
186803
|
-
error: ""
|
|
186804
|
-
} : current);
|
|
186805
|
-
try {
|
|
186806
|
-
await persistRecordReeditDraft(previous);
|
|
186807
|
-
} catch (caught) {
|
|
186808
|
-
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, previous) ? {
|
|
186809
|
-
...current,
|
|
186810
|
-
busy: false,
|
|
186811
|
-
error: errorMessage$2(caught) || "草稿保存失败,请重试"
|
|
186812
|
-
} : current);
|
|
186813
|
-
return;
|
|
186814
|
-
}
|
|
186815
|
-
if (!sameArkmeRecordReeditSession(recordReeditComposerRef.current, previous)) return;
|
|
187777
|
+
persistRecordReeditBeforeContextExit(previous, () => true);
|
|
186816
187778
|
}
|
|
186817
187779
|
const generation = ++recordReeditGenerationRef.current;
|
|
186818
|
-
const
|
|
187780
|
+
const retained = findRecordReeditCandidate({
|
|
187781
|
+
accountKey: authenticatedAccountKey,
|
|
187782
|
+
sourceKey: arkmeSourceIdentityKey(source),
|
|
187783
|
+
sourceRef: source.sourceRef
|
|
187784
|
+
}, item.itemUid);
|
|
187785
|
+
const target = retained === void 0 ? {
|
|
186819
187786
|
generation,
|
|
187787
|
+
accountKey: authenticatedAccountKey,
|
|
187788
|
+
sourceKey: arkmeSourceIdentityKey(source),
|
|
186820
187789
|
sourceRef: source.sourceRef,
|
|
186821
187790
|
item,
|
|
186822
187791
|
snapshot: void 0,
|
|
186823
187792
|
title: item.title,
|
|
186824
187793
|
textContent: item.textContent,
|
|
186825
|
-
|
|
187794
|
+
attachments: [],
|
|
187795
|
+
persisted: {
|
|
187796
|
+
candidateKey: arkmeRecordReeditCandidateKey(item.title, item.textContent, [], item.textFormat),
|
|
187797
|
+
draftRevision: 0,
|
|
187798
|
+
saveTail: Promise.resolve()
|
|
187799
|
+
},
|
|
186826
187800
|
loading: true,
|
|
186827
187801
|
busy: false,
|
|
186828
187802
|
error: ""
|
|
187803
|
+
} : {
|
|
187804
|
+
...retained,
|
|
187805
|
+
generation
|
|
186829
187806
|
};
|
|
186830
187807
|
setComposerExtensionTarget(void 0);
|
|
186831
187808
|
setAddMenuOpen(false);
|
|
@@ -186836,6 +187813,12 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186836
187813
|
setDraftPreview(void 0);
|
|
186837
187814
|
setDrawer(void 0);
|
|
186838
187815
|
setRecordReeditComposer(target);
|
|
187816
|
+
if (retained !== void 0) {
|
|
187817
|
+
requestAnimationFrame(() => {
|
|
187818
|
+
textareaRef.current?.focus();
|
|
187819
|
+
});
|
|
187820
|
+
return;
|
|
187821
|
+
}
|
|
186839
187822
|
try {
|
|
186840
187823
|
const snapshot = await callArkme("source.record-reedit.detail", {
|
|
186841
187824
|
sourceRef: source.sourceRef,
|
|
@@ -186844,12 +187827,18 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186844
187827
|
if (recordReeditGenerationRef.current !== generation) return;
|
|
186845
187828
|
const title = snapshot.draft?.title ?? snapshot.title;
|
|
186846
187829
|
const textContent = snapshot.draft?.textContent ?? snapshot.textContent;
|
|
187830
|
+
const attachments = snapshot.draft?.attachments ?? snapshot.attachments ?? [];
|
|
186847
187831
|
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
186848
187832
|
...current,
|
|
186849
187833
|
snapshot,
|
|
186850
187834
|
title,
|
|
186851
187835
|
textContent,
|
|
186852
|
-
|
|
187836
|
+
attachments,
|
|
187837
|
+
persisted: {
|
|
187838
|
+
candidateKey: arkmeRecordReeditCandidateKey(title, textContent, attachments, snapshot.textFormat ?? item.textFormat),
|
|
187839
|
+
draftRevision: snapshot.draft?.draftRevision ?? 0,
|
|
187840
|
+
saveTail: Promise.resolve()
|
|
187841
|
+
},
|
|
186853
187842
|
loading: false
|
|
186854
187843
|
} : current);
|
|
186855
187844
|
if (snapshot.draft !== void 0) showMessageActionStatus("已恢复本机重新编辑草稿");
|
|
@@ -186865,10 +187854,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186865
187854
|
} : current);
|
|
186866
187855
|
}
|
|
186867
187856
|
}, [
|
|
187857
|
+
authenticatedAccountKey,
|
|
186868
187858
|
closeMessageMenu,
|
|
186869
|
-
|
|
187859
|
+
persistRecordReeditBeforeContextExit,
|
|
187860
|
+
findRecordReeditCandidate,
|
|
186870
187861
|
showMessageActionStatus,
|
|
186871
|
-
source
|
|
187862
|
+
source,
|
|
187863
|
+
reeditSubmissions.jobs
|
|
186872
187864
|
]);
|
|
186873
187865
|
const closeMessageSnapshot = (0, react.useCallback)(() => {
|
|
186874
187866
|
snapshotRequestRef.current?.abort();
|
|
@@ -187189,7 +188181,11 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187189
188181
|
const openForwardTargetPicker = (0, react.useCallback)((itemsToForward = selectedMessageItems) => {
|
|
187190
188182
|
if (!activeConversationRef.current) return;
|
|
187191
188183
|
closeMessageMenu();
|
|
187192
|
-
const
|
|
188184
|
+
const savedItems = itemsToForward.map((item) => {
|
|
188185
|
+
const saved = items.find((value) => arkmeTimelineOccurrenceKey(value) === arkmeTimelineOccurrenceKey(item));
|
|
188186
|
+
return saved && projectRecordReedit(saved, reeditSubmissions.jobs) !== saved ? saved : item;
|
|
188187
|
+
});
|
|
188188
|
+
const forwardableItems = savedItems.filter((item) => arkmeTimelineMessageActionRef(item) !== "");
|
|
187193
188189
|
if (source === void 0 || forwardableItems.length === 0) {
|
|
187194
188190
|
showMessageActionStatus("请选择要转发的快记");
|
|
187195
188191
|
return;
|
|
@@ -187198,6 +188194,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187198
188194
|
showMessageActionStatus("最多选择 100 条快记");
|
|
187199
188195
|
return;
|
|
187200
188196
|
}
|
|
188197
|
+
if (savedItems.some((saved, index) => saved !== itemsToForward[index])) showMessageActionStatus("转发使用已保存内容,请核对预览;尚未同步的编辑不参与转发");
|
|
187201
188198
|
const initialTargets = arkmeForwardableTargetSources(arkmeChatDirectory.getSnapshot().sources, selfSources, aggregateSource);
|
|
187202
188199
|
const sourceKey = conversationKey;
|
|
187203
188200
|
setForwardTargetPicker({
|
|
@@ -187250,19 +188247,27 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187250
188247
|
aggregateSource,
|
|
187251
188248
|
closeMessageMenu,
|
|
187252
188249
|
conversationKey,
|
|
188250
|
+
items,
|
|
188251
|
+
reeditSubmissions.jobs,
|
|
187253
188252
|
selectedMessageItems,
|
|
187254
188253
|
selfSources,
|
|
187255
188254
|
showMessageActionStatus,
|
|
187256
188255
|
source
|
|
187257
188256
|
]);
|
|
187258
|
-
const toggleForwardTarget = (0, react.useCallback)((target) => {
|
|
188257
|
+
const toggleForwardTarget = (0, react.useCallback)(async (target) => {
|
|
187259
188258
|
if (forwardTargetPicker === void 0 || messageActionBusy === "forward") return;
|
|
187260
188259
|
const selected = forwardTargetPicker.selectedSourceRefs.includes(target.sourceRef);
|
|
188260
|
+
if (!selected && target.directMessageAdmissionApplicable === true) try {
|
|
188261
|
+
await requireDirectMessageSendAllowed(target);
|
|
188262
|
+
} catch (error) {
|
|
188263
|
+
showMessageActionStatus(errorMessage$2(error));
|
|
188264
|
+
return;
|
|
188265
|
+
}
|
|
187261
188266
|
if (!selected && forwardTargetPicker.selectedSourceRefs.length >= MAX_FORWARD_TARGET_SELECTION) {
|
|
187262
188267
|
showMessageActionStatus(`最多选择 ${String(MAX_FORWARD_TARGET_SELECTION)} 个转发对象`);
|
|
187263
188268
|
return;
|
|
187264
188269
|
}
|
|
187265
|
-
setForwardTargetPicker({
|
|
188270
|
+
setForwardTargetPicker((current) => current !== forwardTargetPicker ? current : {
|
|
187266
188271
|
...forwardTargetPicker,
|
|
187267
188272
|
selectedSourceRefs: selected ? forwardTargetPicker.selectedSourceRefs.filter((sourceRef) => sourceRef !== target.sourceRef) : [...forwardTargetPicker.selectedSourceRefs, target.sourceRef]
|
|
187268
188273
|
});
|
|
@@ -187290,17 +188295,20 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187290
188295
|
sendError: ""
|
|
187291
188296
|
});
|
|
187292
188297
|
try {
|
|
187293
|
-
const results = await Promise.allSettled(targetSources.map(async (targetSource) =>
|
|
187294
|
-
targetSource,
|
|
187295
|
-
|
|
187296
|
-
|
|
187297
|
-
|
|
187298
|
-
|
|
187299
|
-
|
|
187300
|
-
|
|
187301
|
-
|
|
187302
|
-
|
|
187303
|
-
|
|
188298
|
+
const results = await Promise.allSettled(targetSources.map(async (targetSource) => {
|
|
188299
|
+
await requireDirectMessageSendAllowed(targetSource, controller.signal);
|
|
188300
|
+
return {
|
|
188301
|
+
targetSource,
|
|
188302
|
+
result: await callArkme("source.forward-messages", {
|
|
188303
|
+
sourceRef,
|
|
188304
|
+
targetSourceRef: targetSource.sourceRef,
|
|
188305
|
+
actionRefs,
|
|
188306
|
+
recordUid: crypto.randomUUID(),
|
|
188307
|
+
relationUid: crypto.randomUUID(),
|
|
188308
|
+
...normalizedCommentText === "" ? {} : { commentText: normalizedCommentText }
|
|
188309
|
+
}, controller.signal)
|
|
188310
|
+
};
|
|
188311
|
+
}));
|
|
187304
188312
|
if (activeSourceKeyRef.current !== sourceKey) return;
|
|
187305
188313
|
let successCount = 0;
|
|
187306
188314
|
let failureCount = 0;
|
|
@@ -187436,7 +188444,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187436
188444
|
const utilityContentVisible = authView === "content" && (ui.mode === "recordings" || ui.mode === "world" || ui.mode === "search" || ui.mode === "extensions" || ui.mode === "voiceprint" || ui.mode === "calls");
|
|
187437
188445
|
const conversationOverlayHost = panelRef.current;
|
|
187438
188446
|
const composerPlaceholder = arkmeComposerPlaceholderText(arkmeComposerPlaceholderTargetForSource(selectedSource, conversationMembers.length));
|
|
187439
|
-
const effectiveComposerPlaceholder = activeRecordReeditComposer !== void 0 ? activeRecordReeditComposer.loading ? "正在读取快记和草稿…" : "重新编辑快记…" : activeComposerExtensionTarget === void 0 ? composerPlaceholder : `发送到「${source?.displayName ?? ""}」…`;
|
|
188447
|
+
const effectiveComposerPlaceholder = activeRecordReeditComposer !== void 0 ? activeRecordReeditComposer.loading ? "正在读取快记和草稿…" : "重新编辑快记…" : directAdmission.blocked ? directAdmission.message : activeComposerExtensionTarget === void 0 ? composerPlaceholder : `发送到「${source?.displayName ?? ""}」…`;
|
|
187440
188448
|
const activeComposerTargetItem = activeRecordReeditComposer === void 0 ? activeComposerExtensionTarget?.item : {
|
|
187441
188449
|
...activeRecordReeditComposer.item,
|
|
187442
188450
|
title: activeRecordReeditComposer.snapshot?.title ?? activeRecordReeditComposer.item.title,
|
|
@@ -187718,81 +188726,119 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187718
188726
|
onMouseDown: (event) => {
|
|
187719
188727
|
event.stopPropagation();
|
|
187720
188728
|
},
|
|
187721
|
-
children: [
|
|
187722
|
-
|
|
187723
|
-
|
|
187724
|
-
|
|
187725
|
-
|
|
187726
|
-
event
|
|
187727
|
-
|
|
187728
|
-
|
|
187729
|
-
event
|
|
187730
|
-
|
|
187731
|
-
|
|
187732
|
-
|
|
187733
|
-
|
|
187734
|
-
|
|
187735
|
-
|
|
187736
|
-
|
|
187737
|
-
|
|
187738
|
-
|
|
187739
|
-
|
|
187740
|
-
|
|
187741
|
-
event
|
|
187742
|
-
|
|
187743
|
-
|
|
187744
|
-
event
|
|
187745
|
-
|
|
187746
|
-
|
|
187747
|
-
|
|
187748
|
-
|
|
187749
|
-
|
|
187750
|
-
|
|
187751
|
-
|
|
187752
|
-
|
|
187753
|
-
|
|
187754
|
-
|
|
187755
|
-
|
|
187756
|
-
|
|
187757
|
-
|
|
187758
|
-
|
|
187759
|
-
|
|
187760
|
-
|
|
187761
|
-
|
|
187762
|
-
|
|
187763
|
-
|
|
187764
|
-
|
|
187765
|
-
|
|
187766
|
-
|
|
187767
|
-
|
|
187768
|
-
|
|
187769
|
-
|
|
187770
|
-
|
|
187771
|
-
|
|
187772
|
-
|
|
187773
|
-
|
|
187774
|
-
|
|
187775
|
-
|
|
187776
|
-
|
|
187777
|
-
|
|
187778
|
-
|
|
187779
|
-
|
|
187780
|
-
|
|
187781
|
-
|
|
187782
|
-
|
|
187783
|
-
|
|
187784
|
-
|
|
187785
|
-
|
|
187786
|
-
|
|
187787
|
-
|
|
187788
|
-
|
|
187789
|
-
|
|
187790
|
-
|
|
187791
|
-
|
|
187792
|
-
|
|
187793
|
-
|
|
187794
|
-
|
|
187795
|
-
|
|
188729
|
+
children: [
|
|
188730
|
+
shouldShowRelatedRecordingsEntry(authenticated, source?.kind, relatedEligibility, relatedPanelOpen) ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
188731
|
+
type: "button",
|
|
188732
|
+
role: "menuitem",
|
|
188733
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
|
|
188734
|
+
onMouseEnter: (event) => {
|
|
188735
|
+
event.currentTarget.style.background = arkmeTheme.subtle;
|
|
188736
|
+
},
|
|
188737
|
+
onMouseLeave: (event) => {
|
|
188738
|
+
event.currentTarget.style.background = "transparent";
|
|
188739
|
+
},
|
|
188740
|
+
onClick: openRelatedPanel,
|
|
188741
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$7, {
|
|
188742
|
+
size: 20,
|
|
188743
|
+
"aria-hidden": true
|
|
188744
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "相关录音" })]
|
|
188745
|
+
}) : relatedEligibility === "error" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
188746
|
+
type: "button",
|
|
188747
|
+
role: "menuitem",
|
|
188748
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
|
|
188749
|
+
onMouseEnter: (event) => {
|
|
188750
|
+
event.currentTarget.style.background = arkmeTheme.subtle;
|
|
188751
|
+
},
|
|
188752
|
+
onMouseLeave: (event) => {
|
|
188753
|
+
event.currentTarget.style.background = "transparent";
|
|
188754
|
+
},
|
|
188755
|
+
onClick: ensureRelatedEligibility,
|
|
188756
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$7, {
|
|
188757
|
+
size: 20,
|
|
188758
|
+
"aria-hidden": true
|
|
188759
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "重新检查相关录音" })]
|
|
188760
|
+
}) : relatedEligibility === "denied" && (canManageUserBan || directAdmission.applicable) ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
188761
|
+
role: "status",
|
|
188762
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_STATUS_STYLE,
|
|
188763
|
+
children: relatedEligibility === "denied" ? "当前没有可用操作" : "正在检查相关录音…"
|
|
188764
|
+
}),
|
|
188765
|
+
directAdmission.applicable && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
188766
|
+
type: "button",
|
|
188767
|
+
role: "menuitemcheckbox",
|
|
188768
|
+
"aria-checked": directAdmission.admission === void 0 ? "mixed" : directAdmission.admission.ownRefused,
|
|
188769
|
+
"aria-busy": directAdmission.busy,
|
|
188770
|
+
title: directAdmission.error || void 0,
|
|
188771
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
|
|
188772
|
+
disabled: directAdmission.busy || directAdmission.admission !== void 0 && !directAdmission.admission.ownRefused && !directAdmission.admission.refusalCreationEnabled,
|
|
188773
|
+
onMouseEnter: (event) => {
|
|
188774
|
+
event.currentTarget.style.background = arkmeTheme.subtle;
|
|
188775
|
+
},
|
|
188776
|
+
onMouseLeave: (event) => {
|
|
188777
|
+
event.currentTarget.style.background = "transparent";
|
|
188778
|
+
},
|
|
188779
|
+
onClick: () => {
|
|
188780
|
+
directAdmission.toggle(() => window.confirm("拒收对方消息?\n拒收后你们都无法发送新消息;聊天记录保留,你可以随时解除拒收。"));
|
|
188781
|
+
},
|
|
188782
|
+
children: [
|
|
188783
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$5, {
|
|
188784
|
+
size: 20,
|
|
188785
|
+
"aria-hidden": true
|
|
188786
|
+
}),
|
|
188787
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "拒收对方消息" }),
|
|
188788
|
+
directAdmission.admission?.ownRefused === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$6, {
|
|
188789
|
+
size: 16,
|
|
188790
|
+
style: { marginLeft: "auto" },
|
|
188791
|
+
"aria-hidden": true
|
|
188792
|
+
})
|
|
188793
|
+
]
|
|
188794
|
+
}),
|
|
188795
|
+
directAdmission.applicable && directAdmission.error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
188796
|
+
role: "status",
|
|
188797
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_STATUS_STYLE,
|
|
188798
|
+
children: directAdmission.error
|
|
188799
|
+
}),
|
|
188800
|
+
canManageUserBan && userBanState === "ready" && userBanSnapshot !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
188801
|
+
type: "button",
|
|
188802
|
+
role: "menuitem",
|
|
188803
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
|
|
188804
|
+
disabled: userBanBusy,
|
|
188805
|
+
onMouseEnter: (event) => {
|
|
188806
|
+
event.currentTarget.style.background = arkmeTheme.subtle;
|
|
188807
|
+
},
|
|
188808
|
+
onMouseLeave: (event) => {
|
|
188809
|
+
event.currentTarget.style.background = "transparent";
|
|
188810
|
+
},
|
|
188811
|
+
onClick: () => {
|
|
188812
|
+
changeUserBanState();
|
|
188813
|
+
},
|
|
188814
|
+
children: [userBanSnapshot.banned ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$5, {
|
|
188815
|
+
size: 20,
|
|
188816
|
+
"aria-hidden": true
|
|
188817
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(m$5, {
|
|
188818
|
+
size: 20,
|
|
188819
|
+
"aria-hidden": true
|
|
188820
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: userBanSnapshot.banned ? "解封用户" : "封禁用户" })]
|
|
188821
|
+
}) : canManageUserBan && userBanState === "error" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
188822
|
+
type: "button",
|
|
188823
|
+
role: "menuitem",
|
|
188824
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
|
|
188825
|
+
onMouseEnter: (event) => {
|
|
188826
|
+
event.currentTarget.style.background = arkmeTheme.subtle;
|
|
188827
|
+
},
|
|
188828
|
+
onMouseLeave: (event) => {
|
|
188829
|
+
event.currentTarget.style.background = "transparent";
|
|
188830
|
+
},
|
|
188831
|
+
onClick: ensureUserBanStatus,
|
|
188832
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(m$5, {
|
|
188833
|
+
size: 20,
|
|
188834
|
+
"aria-hidden": true
|
|
188835
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "重新检查封禁状态" })]
|
|
188836
|
+
}) : canManageUserBan ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
188837
|
+
role: "status",
|
|
188838
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_STATUS_STYLE,
|
|
188839
|
+
children: "正在检查封禁状态…"
|
|
188840
|
+
}) : null
|
|
188841
|
+
]
|
|
187796
188842
|
})
|
|
187797
188843
|
}), conversationOverlayHost)
|
|
187798
188844
|
]
|
|
@@ -188108,6 +189154,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188108
189154
|
}),
|
|
188109
189155
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeMessageContent, {
|
|
188110
189156
|
item,
|
|
189157
|
+
mediaSelectionIsExplicit: reeditItems.has(item),
|
|
188111
189158
|
sourceRef: source.sourceRef,
|
|
188112
189159
|
highlightMentions: true,
|
|
188113
189160
|
shareWebsite,
|
|
@@ -188129,6 +189176,32 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188129
189176
|
}
|
|
188130
189177
|
}, `message-content:${conversationOverlayKey}`),
|
|
188131
189178
|
!isSharedRecordingCard && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeTimelineAgentSourceBadge, { item }),
|
|
189179
|
+
reeditSubmissions.jobs.filter((job) => job.itemUid === item.itemUid && (job.state === "failed" || job.state === "uncertain")).map((job) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
189180
|
+
role: "status",
|
|
189181
|
+
"aria-label": "重新编辑保存状态",
|
|
189182
|
+
style: styles$6.polishMeta,
|
|
189183
|
+
children: [
|
|
189184
|
+
job.state === "failed" ? `保存失败:${job.error ?? "请恢复编辑后重试"}` : "保存结果待确认",
|
|
189185
|
+
job.state === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
189186
|
+
type: "button",
|
|
189187
|
+
style: styles$6.retry,
|
|
189188
|
+
onClick: (event) => {
|
|
189189
|
+
event.stopPropagation();
|
|
189190
|
+
openRecordReedit(item);
|
|
189191
|
+
},
|
|
189192
|
+
children: "恢复编辑"
|
|
189193
|
+
}),
|
|
189194
|
+
job.state === "uncertain" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
189195
|
+
type: "button",
|
|
189196
|
+
style: styles$6.retry,
|
|
189197
|
+
onClick: (event) => {
|
|
189198
|
+
event.stopPropagation();
|
|
189199
|
+
reeditSubmissions.refresh(true).catch((caught) => setError(errorMessage$2(caught)));
|
|
189200
|
+
},
|
|
189201
|
+
children: "核对结果"
|
|
189202
|
+
})
|
|
189203
|
+
]
|
|
189204
|
+
}, job.submissionId)),
|
|
188132
189205
|
fileTasks.tasks.filter((task) => (task.result?.itemUid ?? task.recordUid) === item.itemUid && task.state !== "sent" && fileTaskShowsInlineStatus(task)).map((task) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
188133
189206
|
role: "status",
|
|
188134
189207
|
style: {
|
|
@@ -188137,7 +189210,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188137
189210
|
},
|
|
188138
189211
|
children: [
|
|
188139
189212
|
task.error ?? (task.state === "sending" ? "正在发送…" : task.state === "queued" ? "等待上传" : "正在上传"),
|
|
188140
|
-
task.state === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
189213
|
+
task.state === "failed" && task.retryable !== false && !directAdmission.blocked && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
188141
189214
|
type: "button",
|
|
188142
189215
|
onClick: (event) => {
|
|
188143
189216
|
event.stopPropagation();
|
|
@@ -188385,13 +189458,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188385
189458
|
className: "arkme-conversation-composer",
|
|
188386
189459
|
style: styles$6.composer,
|
|
188387
189460
|
onDragOver: (event) => {
|
|
188388
|
-
if (!
|
|
189461
|
+
if (!composerFileAddingDisabled && Array.from(event.dataTransfer.types).includes("Files")) {
|
|
188389
189462
|
event.preventDefault();
|
|
188390
189463
|
event.dataTransfer.dropEffect = "copy";
|
|
188391
189464
|
}
|
|
188392
189465
|
},
|
|
188393
189466
|
onDrop: (event) => {
|
|
188394
|
-
if (!
|
|
189467
|
+
if (!composerFileAddingDisabled && event.dataTransfer.files.length > 0) {
|
|
188395
189468
|
event.preventDefault();
|
|
188396
189469
|
selectFiles(event.dataTransfer.files);
|
|
188397
189470
|
}
|
|
@@ -188421,6 +189494,34 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188421
189494
|
style: styles$6.error,
|
|
188422
189495
|
children: activeRecordReeditComposer.error
|
|
188423
189496
|
}),
|
|
189497
|
+
activeRecordReeditComposer !== void 0 && (activeRecordReeditComposer.conflict !== void 0 || activeRecordReeditComposer.snapshot?.draft !== void 0 && activeRecordReeditComposer.snapshot.draft.baseVersion !== void 0 && activeRecordReeditComposer.snapshot.draft.baseVersion !== activeRecordReeditComposer.snapshot.version) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
189498
|
+
type: "button",
|
|
189499
|
+
style: styles$6.retry,
|
|
189500
|
+
disabled: composerFilesDisabled,
|
|
189501
|
+
"aria-label": activeRecordReeditComposer.conflict === "draft" ? "重新载入草稿" : "放弃草稿并重新载入",
|
|
189502
|
+
onClick: () => setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, activeRecordReeditComposer) ? {
|
|
189503
|
+
...current,
|
|
189504
|
+
recoveryConfirmation: true
|
|
189505
|
+
} : current),
|
|
189506
|
+
children: activeRecordReeditComposer.conflict === "draft" ? "重新载入草稿" : "放弃草稿并重新载入"
|
|
189507
|
+
}),
|
|
189508
|
+
activeRecordReeditComposer?.recoveryConfirmation && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeConfirmDialog, {
|
|
189509
|
+
titleId: "arkme-reedit-recovery-title",
|
|
189510
|
+
title: activeRecordReeditComposer.conflict === "draft" ? "重新载入最新草稿?" : "放弃草稿并重新载入?",
|
|
189511
|
+
description: activeRecordReeditComposer.conflict === "draft" ? "当前输入区将替换为其他入口保存的最新草稿。不会删除草稿或修改已保存的快记。" : "本机这份重新编辑草稿中的正文和附件改动将被放弃,重新载入已保存的快记。此操作不会删除线上附件。",
|
|
189512
|
+
busy: activeRecordReeditComposer.busy,
|
|
189513
|
+
error: activeRecordReeditComposer.error,
|
|
189514
|
+
confirmTone: activeRecordReeditComposer.conflict === "draft" ? "primary" : "danger",
|
|
189515
|
+
confirmLabel: activeRecordReeditComposer.conflict === "draft" ? "重新载入" : "放弃并重新载入",
|
|
189516
|
+
busyLabel: "正在重新载入…",
|
|
189517
|
+
onClose: () => setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, activeRecordReeditComposer) && !current.busy ? {
|
|
189518
|
+
...current,
|
|
189519
|
+
recoveryConfirmation: false
|
|
189520
|
+
} : current),
|
|
189521
|
+
onConfirm: () => {
|
|
189522
|
+
recoverRecordReedit();
|
|
189523
|
+
}
|
|
189524
|
+
}),
|
|
188424
189525
|
activeComposerTargetItem !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
188425
189526
|
style: styles$6.composerExtensionTarget,
|
|
188426
189527
|
...activeRecordReeditComposer === void 0 ? { "data-arkme-composer-extension-target": "true" } : { "data-arkme-composer-reedit-target": "true" },
|
|
@@ -188458,7 +189559,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188458
189559
|
type: "button",
|
|
188459
189560
|
style: styles$6.composerExtensionTargetCancel,
|
|
188460
189561
|
"aria-label": activeRecordReeditComposer === void 0 ? "取消延展" : "关闭重新编辑",
|
|
188461
|
-
disabled: activeRecordReeditComposer?.busy === true,
|
|
189562
|
+
disabled: activeRecordReeditComposer?.busy === true || preparingReeditFiles,
|
|
188462
189563
|
onClick: () => {
|
|
188463
189564
|
if (activeRecordReeditComposer === void 0) {
|
|
188464
189565
|
setComposerExtensionTarget(void 0);
|
|
@@ -188488,35 +189589,31 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188488
189589
|
ref: addMenuRef,
|
|
188489
189590
|
style: styles$6.addMenu,
|
|
188490
189591
|
role: "menu",
|
|
188491
|
-
children: [
|
|
188492
|
-
|
|
188493
|
-
|
|
188494
|
-
|
|
188495
|
-
|
|
188496
|
-
|
|
188497
|
-
|
|
188498
|
-
|
|
188499
|
-
|
|
188500
|
-
|
|
188501
|
-
|
|
188502
|
-
|
|
188503
|
-
|
|
188504
|
-
|
|
188505
|
-
|
|
188506
|
-
|
|
188507
|
-
|
|
188508
|
-
|
|
188509
|
-
|
|
188510
|
-
|
|
188511
|
-
|
|
188512
|
-
|
|
188513
|
-
|
|
188514
|
-
|
|
188515
|
-
|
|
188516
|
-
children: "✎"
|
|
188517
|
-
}), "写长文"]
|
|
188518
|
-
})
|
|
188519
|
-
]
|
|
189592
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
189593
|
+
type: "button",
|
|
189594
|
+
role: "menuitem",
|
|
189595
|
+
style: styles$6.addMenuItem,
|
|
189596
|
+
onClick: () => {
|
|
189597
|
+
setAddMenuOpen(false);
|
|
189598
|
+
fileInputRef.current?.click();
|
|
189599
|
+
},
|
|
189600
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
189601
|
+
"aria-hidden": true,
|
|
189602
|
+
children: "📎"
|
|
189603
|
+
}), "添加照片和文件"]
|
|
189604
|
+
}), activeRecordReeditComposer === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { style: styles$6.menuDivider }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
189605
|
+
type: "button",
|
|
189606
|
+
role: "menuitem",
|
|
189607
|
+
style: styles$6.addMenuItem,
|
|
189608
|
+
onClick: () => {
|
|
189609
|
+
setLongArticleCreating(true);
|
|
189610
|
+
setAddMenuOpen(false);
|
|
189611
|
+
},
|
|
189612
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
189613
|
+
"aria-hidden": true,
|
|
189614
|
+
children: "✎"
|
|
189615
|
+
}), "写长文"]
|
|
189616
|
+
})] })]
|
|
188520
189617
|
}),
|
|
188521
189618
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
188522
189619
|
ref: fileInputRef,
|
|
@@ -188530,21 +189627,61 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188530
189627
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
188531
189628
|
className: "arkme-conversation-input-card",
|
|
188532
189629
|
children: [
|
|
188533
|
-
|
|
188534
|
-
attachments,
|
|
188535
|
-
disabled:
|
|
188536
|
-
onMove: (from, to) =>
|
|
189630
|
+
visibleComposerAttachments.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeAttachmentStrip, {
|
|
189631
|
+
attachments: visibleComposerAttachments,
|
|
189632
|
+
disabled: composerFilesDisabled,
|
|
189633
|
+
onMove: (from, to) => {
|
|
189634
|
+
if (composerFilesDisabled) return;
|
|
189635
|
+
if (activeRecordReeditComposer === void 0) arkmeComposerDraftStore.moveAttachment(composerDraftKey, from, to);
|
|
189636
|
+
else setRecordReeditComposer((current) => {
|
|
189637
|
+
if (!sameArkmeRecordReeditSession(current, activeRecordReeditComposer)) return current;
|
|
189638
|
+
const next = [...current.attachments];
|
|
189639
|
+
const attachment = next[from];
|
|
189640
|
+
if (attachment === void 0 || to < 0 || to >= next.length) return current;
|
|
189641
|
+
next.splice(from, 1);
|
|
189642
|
+
next.splice(to, 0, attachment);
|
|
189643
|
+
return {
|
|
189644
|
+
...current,
|
|
189645
|
+
attachments: next,
|
|
189646
|
+
error: ""
|
|
189647
|
+
};
|
|
189648
|
+
});
|
|
189649
|
+
},
|
|
189650
|
+
canPreview: (attachment) => activeRecordReeditComposer === void 0 ? attachment.localFile !== void 0 : activeRecordReeditComposer.attachments.some((view) => arkmeAttachmentId(view) === arkmeAttachmentId(attachment) && arkmeRecordReeditAttachmentBlock(view) !== void 0),
|
|
188537
189651
|
onPreview: (attachment) => {
|
|
188538
|
-
if (
|
|
189652
|
+
if (activeRecordReeditComposer === void 0) {
|
|
189653
|
+
if (attachment.localFile !== void 0) setDraftPreview(localFileBlock(attachment.localFile));
|
|
189654
|
+
} else {
|
|
189655
|
+
const view = activeRecordReeditComposer.attachments.find((view) => arkmeAttachmentId(view) === arkmeAttachmentId(attachment));
|
|
189656
|
+
if (view !== void 0) setDraftPreview(arkmeRecordReeditAttachmentBlock(view));
|
|
189657
|
+
}
|
|
188539
189658
|
},
|
|
188540
189659
|
onRemove: (attachment) => {
|
|
189660
|
+
if (composerFilesDisabled) return;
|
|
189661
|
+
if (activeRecordReeditComposer !== void 0) {
|
|
189662
|
+
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, activeRecordReeditComposer) ? {
|
|
189663
|
+
...current,
|
|
189664
|
+
attachments: current.attachments.filter((view) => arkmeAttachmentId(view) !== arkmeAttachmentId(attachment)),
|
|
189665
|
+
error: ""
|
|
189666
|
+
} : current);
|
|
189667
|
+
setDraftPreview(void 0);
|
|
189668
|
+
return;
|
|
189669
|
+
}
|
|
188541
189670
|
arkmeComposerDraftStore.removeAttachment(composerDraftKey, arkmeAttachmentId(attachment));
|
|
188542
189671
|
if (attachment.localFile !== void 0) callArkme("files.local.remove", { fileRef: attachment.localFile.fileRef }).catch((caught) => setError(errorMessage$2(caught)));
|
|
188543
189672
|
}
|
|
188544
189673
|
}),
|
|
189674
|
+
activeRecordReeditComposer?.attachments.some((attachment) => attachment.unavailable) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
189675
|
+
role: "status",
|
|
189676
|
+
style: styles$6.error,
|
|
189677
|
+
children: "部分附件不可用,请移除后重新添加"
|
|
189678
|
+
}),
|
|
188545
189679
|
activeConversation && draftPreview !== void 0 && typeof document !== "undefined" && (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeMediaPreview, {
|
|
188546
189680
|
selected: draftPreview,
|
|
188547
|
-
blocks: attachments.flatMap((attachment) => attachment.localFile === void 0 ? [] : [localFileBlock(attachment.localFile)])
|
|
189681
|
+
blocks: activeRecordReeditComposer === void 0 ? attachments.flatMap((attachment) => attachment.localFile === void 0 ? [] : [localFileBlock(attachment.localFile)]) : activeRecordReeditComposer.attachments.flatMap((attachment) => {
|
|
189682
|
+
const block = arkmeRecordReeditAttachmentBlock(attachment);
|
|
189683
|
+
return block === void 0 ? [] : [block];
|
|
189684
|
+
}),
|
|
188548
189685
|
onSelect: setDraftPreview,
|
|
188549
189686
|
onClose: () => setDraftPreview(void 0),
|
|
188550
189687
|
openLocalFile: false
|
|
@@ -188666,10 +189803,10 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188666
189803
|
maxLength: activeRecordReeditComposer?.snapshot?.maxTextLength ?? 2e4,
|
|
188667
189804
|
placeholder: effectiveComposerPlaceholder,
|
|
188668
189805
|
ariaLabel: activeRecordReeditComposer === void 0 ? effectiveComposerPlaceholder : "重新编辑快记",
|
|
188669
|
-
disabled:
|
|
188670
|
-
markdown: activeRecordReeditComposer === void 0 ? composerDraft.markdown : void 0,
|
|
189806
|
+
disabled: composerFilesDisabled,
|
|
189807
|
+
markdown: activeRecordReeditComposer === void 0 && !directAdmission.blocked ? composerDraft.markdown : void 0,
|
|
188671
189808
|
onMarkdownChange: (markdown, text, mentions, emojis) => {
|
|
188672
|
-
if (activeRecordReeditComposer === void 0) arkmeComposerDraftStore.setMarkdown(composerDraftKey, markdown, text, mentions, emojis);
|
|
189809
|
+
if (activeRecordReeditComposer === void 0 && !directAdmission.blocked) arkmeComposerDraftStore.setMarkdown(composerDraftKey, markdown, text, mentions, emojis);
|
|
188673
189810
|
},
|
|
188674
189811
|
onTextChange: updateComposerText,
|
|
188675
189812
|
onInputActivity: messagePreparing.input,
|
|
@@ -188683,7 +189820,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188683
189820
|
},
|
|
188684
189821
|
onSelectionChange: updateComposerRichTrigger,
|
|
188685
189822
|
onPaste: (event) => {
|
|
188686
|
-
if (
|
|
189823
|
+
if (composerFileAddingDisabled) return;
|
|
188687
189824
|
const files = arkmeClipboardFiles(event.clipboardData);
|
|
188688
189825
|
if (files.length === 0) return;
|
|
188689
189826
|
event.preventDefault();
|
|
@@ -188764,13 +189901,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188764
189901
|
"aria-label": "添加内容",
|
|
188765
189902
|
"aria-haspopup": "menu",
|
|
188766
189903
|
"aria-expanded": addMenuOpen,
|
|
188767
|
-
disabled:
|
|
189904
|
+
disabled: composerFileAddingDisabled,
|
|
188768
189905
|
onClick: () => {
|
|
188769
189906
|
setAddMenuOpen((value) => !value);
|
|
188770
189907
|
},
|
|
188771
|
-
children: preparingFiles ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeFilePreparingIndicator, {}) : "+"
|
|
189908
|
+
children: (activeRecordReeditComposer === void 0 ? preparingFiles : preparingReeditFiles) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeFilePreparingIndicator, {}) : "+"
|
|
188772
189909
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeEmojiPicker, {
|
|
188773
|
-
disabled: preparingFiles || activeRecordReeditComposer !== void 0,
|
|
189910
|
+
disabled: preparingFiles || directAdmission.blocked || activeRecordReeditComposer !== void 0,
|
|
188774
189911
|
scopeKey: composerDraftKey,
|
|
188775
189912
|
...source?.kind === "private_chat" || source?.kind === "group_chat" ? { sourceRef: source.sourceRef } : {},
|
|
188776
189913
|
getCaretGeometry: () => textareaRef.current?.getCaretGeometry(),
|
|
@@ -189390,6 +190527,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
189390
190527
|
shareWebsite,
|
|
189391
190528
|
onMessageCopyLinkOpen: openMessageCopyLinkDetail,
|
|
189392
190529
|
onExtensionSent: acceptDetailExtension,
|
|
190530
|
+
messageCreationBlocked: directAdmission.blocked,
|
|
190531
|
+
messageCreationRestriction: directAdmission.blocked ? directAdmission.message : "",
|
|
189393
190532
|
onToast: showMessageActionStatus
|
|
189394
190533
|
}, detailItem.itemUid),
|
|
189395
190534
|
activeConversation && drawer === "copyLink" && copyLinkDetail !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
@@ -191604,7 +192743,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
191604
192743
|
onClick: () => {
|
|
191605
192744
|
playback.toggle(item.segmentRef, mediaRef);
|
|
191606
192745
|
},
|
|
191607
|
-
children: controlState === "pause" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
192746
|
+
children: controlState === "pause" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, {
|
|
191608
192747
|
"aria-hidden": true,
|
|
191609
192748
|
"data-audio-state-icon": "pause",
|
|
191610
192749
|
size: 18,
|
|
@@ -191615,7 +192754,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
191615
192754
|
"data-audio-state-icon": "loading",
|
|
191616
192755
|
size: 18,
|
|
191617
192756
|
weight: "bold"
|
|
191618
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
192757
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
|
|
191619
192758
|
"aria-hidden": true,
|
|
191620
192759
|
"data-audio-state-icon": controlState,
|
|
191621
192760
|
size: 18,
|
|
@@ -192295,6 +193434,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
192295
193434
|
if (stopped) return;
|
|
192296
193435
|
if (ownsMessagePreparing) arkmeMessagePreparing.reset();
|
|
192297
193436
|
reconcileReceipts();
|
|
193437
|
+
invalidateDirectMessageAdmission();
|
|
192298
193438
|
reconcileArkmeProviderInstance().then(async (changed) => {
|
|
192299
193439
|
if (!changed || stopped) return;
|
|
192300
193440
|
try {
|
|
@@ -192346,6 +193486,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
192346
193486
|
if (update.attentionSummary !== void 0) arkmeAttentionSummary.apply(update.attentionSummary);
|
|
192347
193487
|
arkmeInterwovenInvalidation.invalidate();
|
|
192348
193488
|
reconcileReceipts();
|
|
193489
|
+
invalidateDirectMessageAdmission();
|
|
192349
193490
|
if (update.refresh === "none") return;
|
|
192350
193491
|
refreshUnread(update.refresh === "force").then(() => {
|
|
192351
193492
|
if (stopped) return;
|
|
@@ -192367,6 +193508,10 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
192367
193508
|
return;
|
|
192368
193509
|
}
|
|
192369
193510
|
if (update.type === "projection-invalidated") {
|
|
193511
|
+
if (update.projection === "chat.direct_message_admission") {
|
|
193512
|
+
invalidateDirectMessageAdmission();
|
|
193513
|
+
return;
|
|
193514
|
+
}
|
|
192370
193515
|
if (update.projection !== "record") return;
|
|
192371
193516
|
arkmeInterwovenInvalidation.invalidate();
|
|
192372
193517
|
arkmeCalendarInvalidations.publishAll();
|
|
@@ -192383,6 +193528,18 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
192383
193528
|
arkmeCalendarInvalidations.publishAll();
|
|
192384
193529
|
return;
|
|
192385
193530
|
}
|
|
193531
|
+
if (update.type === "chat-pins-reconciled") {
|
|
193532
|
+
arkmeChatDirectory.reconcilePins(update.pins);
|
|
193533
|
+
return;
|
|
193534
|
+
}
|
|
193535
|
+
if (update.type === "chat-policy-invalidated") {
|
|
193536
|
+
arkmeChatDirectory.invalidateRoot();
|
|
193537
|
+
arkmeChatDirectory.refreshRoot({
|
|
193538
|
+
force: true,
|
|
193539
|
+
silent: true
|
|
193540
|
+
}).catch(() => void 0);
|
|
193541
|
+
return;
|
|
193542
|
+
}
|
|
192386
193543
|
if (update.type === "conversation-list-preference-invalidated") {
|
|
192387
193544
|
arkmeUi.chatChanged();
|
|
192388
193545
|
return;
|
|
@@ -193273,7 +194430,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
193273
194430
|
}
|
|
193274
194431
|
//#endregion
|
|
193275
194432
|
//#region src/client/redesign/arkme-redesign.css?inline
|
|
193276
|
-
var arkme_redesign_default = "[data-arkme-workspace] {\n --arkme-line: #e7e7e9;\n --arkme-muted: #8e9199;\n --arkme-soft: #f6f6f7;\n --arkme-focus: #cbd5ff;\n color: #171923;\n font-synthesis: none;\n font-family: SF Pro Text, SF Pro Display, -apple-system, BlinkMacSystemFont, PingFang SC, Helvetica Neue, Microsoft YaHei, sans-serif;\n}\n\n[data-arkme-workspace], [data-arkme-workspace] * {\n box-sizing: border-box;\n}\n\n[data-arkme-workspace] button, [data-arkme-workspace] input, [data-arkme-workspace] textarea {\n font: inherit;\n}\n\n[data-arkme-workspace] button {\n color: inherit;\n cursor: pointer;\n background: none;\n border: 0;\n}\n\n[data-arkme-workspace] [data-arkme-theme-image=\"dark\"] {\n display: none !important;\n}\n\n.arkme-redesign-root {\n --arkme-native-titlebar: 0px;\n background: #fff;\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n.arkme-native-desktop .arkme-redesign-root {\n --arkme-native-titlebar: 50px;\n}\n\n.arkme-native-desktop .arkme-redesign-root:before {\n content: \"\";\n z-index: 30;\n pointer-events: none;\n background: #e8e8ea;\n height: 1px;\n position: absolute;\n top: 49px;\n left: 0;\n right: 0;\n}\n\n.arkme-native-desktop [data-arkme-owned=\"persistent-sidebar\"] > [data-arkme-owned=\"product-navigation\"] {\n padding-top: 28px !important;\n}\n\n.arkme-redesign-rail {\n z-index: 8;\n top: calc(26px + var(--arkme-native-titlebar));\n background: #fbfbfc;\n border: 1px solid #e4e4e7;\n border-radius: 22px;\n flex-direction: column;\n width: 72px;\n padding: 10px 8px;\n display: flex;\n position: absolute;\n bottom: 22px;\n left: 24px;\n box-shadow: 0 16px 38px #1e20260e;\n}\n\n.arkme-redesign-rail-primary {\n flex-direction: column;\n gap: 5px;\n display: flex;\n}\n\n.arkme-redesign-rail-primary button {\n color: #3e4149;\n border-radius: 15px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: 5px;\n min-height: 57px;\n transition: background .18s, color .18s;\n display: flex;\n position: relative;\n}\n\n.arkme-redesign-rail-primary button span {\n letter-spacing: .01em;\n font-size: 11px;\n font-weight: 400;\n}\n\n.arkme-redesign-rail-primary button:hover {\n background: #f4f4f5;\n}\n\n.arkme-redesign-rail-primary button.is-active {\n color: #151722;\n background: #f1f2f6;\n}\n\n.arkme-redesign-rail-primary button.is-active:before {\n content: \"\";\n background: #9eadff;\n border-radius: 3px;\n width: 3px;\n height: 33px;\n position: absolute;\n left: -9px;\n}\n\n.arkme-redesign-rail-footer {\n border-top: 0 solid #ededee;\n justify-items: center;\n gap: 7px;\n margin-top: auto;\n padding-top: 0;\n display: grid;\n position: relative;\n}\n\n.arkme-redesign-rail-footer:has( > .arkme-update-rail-slot) {\n border-top-width: 1px;\n padding-top: 10px;\n}\n\n.arkme-redesign-rail-footer > button {\n color: #4b4f58;\n border-radius: 14px;\n place-items: center;\n width: 46px;\n height: 46px;\n display: grid;\n}\n\n.arkme-redesign-rail-footer > button:hover, .arkme-redesign-rail-footer > button.is-active {\n background: #f1f2f5;\n}\n\n.arkme-redesign-rail-footer:empty {\n display: none;\n}\n\n.arkme-conversation-input-card {\n display: contents;\n}\n\nbody:is([data-ds-skin=\"qq2006\"], [data-arkme-skin=\"qq2006\"]) [data-arkme-owned=\"product-surface\"] .arkme-conversation-input-card.arkme-conversation-input-card.arkme-conversation-tools {\n display: flex !important;\n}\n\n.arkme-update-rail-slot {\n width: 52px;\n height: 30px;\n position: relative;\n}\n\nbutton.arkme-update-rail {\n color: #53648e;\n cursor: pointer;\n width: 52px;\n min-height: 28px;\n font: inherit;\n background: #f1f3fa;\n border: 0;\n border-radius: 999px;\n justify-content: center;\n align-items: center;\n gap: 4px;\n padding: 0 7px;\n transition: transform .16s, background .16s, color .16s, box-shadow .16s;\n display: flex;\n box-shadow: inset 0 0 0 1px #5b70ab17;\n}\n\nbutton.arkme-update-rail:hover, button.arkme-update-rail.is-active {\n transform: translateY(-1px);\n color: #34476f !important;\n background: #e9edf8 !important;\n}\n\nbutton.arkme-update-rail.is-available {\n color: #fff !important;\n background: #f0524f !important;\n box-shadow: 0 5px 12px #e03c3933, inset 0 0 0 1px #b2232014 !important;\n}\n\nbutton.arkme-update-rail.is-available:hover, button.arkme-update-rail.is-available.is-active {\n color: #fff !important;\n background: #df4542 !important;\n box-shadow: 0 7px 16px #d736333d, inset 0 0 0 1px #961a181a !important;\n}\n\nbutton.arkme-update-rail.is-error {\n color: #b54841 !important;\n background: #fff0ee !important;\n}\n\n.arkme-update-rail span {\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n font-size: 9px;\n font-weight: 550;\n line-height: 1;\n}\n\n.arkme-update-rail svg {\n flex: none;\n}\n\n.arkme-update-rail.is-ready {\n gap: 3px;\n padding: 0 4px;\n}\n\n.arkme-update-rail.is-ready svg {\n width: 13px;\n height: 13px;\n}\n\n.arkme-update-rail.is-downloading svg {\n animation: 1.6s linear infinite arkme-update-spin;\n}\n\n.arkme-update-popover {\n z-index: 100000;\n overflow-wrap: anywhere;\n box-sizing: border-box;\n color: #171923;\n backdrop-filter: blur(20px) saturate(1.12);\n background: #fffffff7;\n border: 1px solid #cfd1d7e6;\n border-radius: 20px;\n width: 356px;\n max-width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n padding: 18px;\n animation: .2s cubic-bezier(.2, .8, .2, 1) arkme-update-popover-in;\n position: fixed;\n bottom: 14px;\n left: 68px;\n overflow-y: auto;\n box-shadow: 0 24px 58px #1b1e2629, 0 3px 10px #1b1e260e;\n}\n\n.arkme-update-popover-heading {\n grid-template-columns: minmax(0, 1fr) 28px;\n align-items: center;\n gap: 12px;\n display: grid;\n}\n\n.arkme-update-popover-heading > div {\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-update-popover-heading span {\n color: #92959d;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 10px;\n font-weight: 500;\n overflow: hidden;\n}\n\n.arkme-update-popover-heading h2 {\n color: #242731;\n letter-spacing: -.025em;\n margin: 0;\n font-size: 17px;\n font-weight: 600;\n}\n\n.arkme-update-popover-heading > button {\n color: #93969e;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n place-items: center;\n width: 28px;\n height: 28px;\n padding: 0;\n display: grid;\n}\n\n.arkme-update-popover-heading > button:hover {\n color: #3d414a;\n background: #f1f2f4;\n}\n\n.arkme-update-popover-summary {\n color: #7d818a;\n margin: 13px 0 0;\n font-size: 11px;\n line-height: 1.55;\n}\n\n.arkme-update-release-notes {\n border-top: 1px solid #ececef;\n border-bottom: 1px solid #ececef;\n margin-top: 14px;\n padding: 5px 0;\n}\n\n.arkme-update-release-notes > div {\n grid-template-columns: 28px minmax(0, 1fr);\n align-items: center;\n gap: 10px;\n min-height: 51px;\n display: grid;\n}\n\n.arkme-update-release-notes > div + div {\n border-top: 1px solid #f0f0f2;\n}\n\n.arkme-update-release-notes > div > span {\n color: #a3a6ad;\n font-variant-numeric: tabular-nums;\n font-size: 9px;\n}\n\n.arkme-update-release-notes p {\n gap: 4px;\n margin: 0;\n display: grid;\n}\n\n.arkme-update-release-notes strong {\n color: #3b3f48;\n font-size: 12px;\n font-weight: 500;\n}\n\n.arkme-update-release-notes small {\n color: #92959d;\n font-size: 10px;\n line-height: 1.45;\n}\n\n.arkme-update-message {\n color: #747983;\n margin: 12px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-update-message.is-error {\n color: #b54841;\n}\n\n.arkme-update-popover-actions {\n grid-template-columns: 1fr 1.45fr;\n gap: 9px;\n margin-top: 16px;\n display: grid;\n}\n\n.arkme-update-popover-actions button {\n cursor: pointer;\n height: 42px;\n font: inherit;\n border-radius: 12px;\n padding: 0;\n font-size: 12px;\n font-weight: 500;\n transition: transform .16s, background .16s, box-shadow .16s;\n border: 0 !important;\n}\n\n.arkme-update-popover-actions button:hover {\n transform: translateY(-1px);\n}\n\n.arkme-update-popover-actions .arkme-update-later {\n color: #666a73 !important;\n background: #f2f2f4 !important;\n}\n\n.arkme-update-popover-actions .arkme-update-later:hover {\n background: #ececef !important;\n}\n\n.arkme-update-popover-actions .arkme-update-now {\n color: #fff !important;\n background: #1c1f28 !important;\n box-shadow: 0 7px 18px #181b2324 !important;\n}\n\n.arkme-update-popover-actions .arkme-update-now:hover {\n background: #11131b !important;\n box-shadow: 0 9px 22px #181b232e !important;\n}\n\n.arkme-update-now:disabled {\n opacity: .46;\n cursor: default;\n transform: none;\n}\n\n.arkme-update-capsule {\n z-index: 10030;\n box-sizing: border-box;\n color: #171923;\n backdrop-filter: blur(20px) saturate(1.2);\n background: #ffffffed;\n border: 1px solid #cdd0d8d6;\n border-radius: 18px;\n grid-template-columns: minmax(0, 1fr) 28px;\n align-items: center;\n gap: 10px;\n width: 326px;\n max-width: calc(100vw - 16px);\n min-height: 52px;\n padding: 9px 9px 9px 14px;\n animation: .22s cubic-bezier(.2, .8, .2, 1) arkme-update-capsule-in;\n display: grid;\n position: fixed;\n top: 18px;\n left: 50%;\n transform: translateX(-50%);\n box-shadow: 0 16px 40px #1c1f2724, 0 2px 8px #1c1f270f;\n}\n\n.arkme-native-desktop .arkme-update-capsule {\n top: 62px;\n}\n\n.arkme-update-capsule-copy {\n gap: 3px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-update-capsule-copy strong {\n color: #333741;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 11px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.arkme-update-capsule-copy small {\n color: #93969e;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 9px;\n overflow: hidden;\n}\n\n.arkme-update-progress {\n background: #eceef3;\n border-radius: 999px;\n height: 4px;\n overflow: hidden;\n}\n\n.arkme-update-progress span {\n border-radius: inherit;\n background: #6779b5;\n height: 100%;\n transition: width .65s cubic-bezier(.2, .7, .25, 1);\n display: block;\n}\n\n.arkme-update-progress.is-indeterminate span {\n width: 34%;\n animation: 1.25s ease-in-out infinite arkme-update-indeterminate;\n}\n\n.arkme-update-capsule > b {\n color: #656a75;\n font-variant-numeric: tabular-nums;\n text-align: right;\n font-size: 10px;\n font-weight: 500;\n}\n\n.arkme-update-capsule[data-layout=\"progress\"] {\n grid-template-columns: minmax(0, 1fr) minmax(40px, .8fr) 34px 28px;\n}\n\n.arkme-update-capsule[data-layout=\"action\"], .arkme-update-capsule[data-layout=\"ready-action\"] {\n width: 380px;\n}\n\n.arkme-update-capsule[data-layout=\"action\"] {\n grid-template-columns: minmax(0, 1fr) auto 28px;\n}\n\n.arkme-update-capsule[data-layout=\"ready-action\"] {\n grid-template-columns: minmax(0, 1fr) auto;\n padding-right: 16px;\n}\n\n.arkme-update-capsule:is([data-layout=\"action\"], [data-layout=\"ready-action\"]) .arkme-update-capsule-copy small {\n -webkit-line-clamp: 3;\n white-space: normal;\n overflow-wrap: anywhere;\n -webkit-box-orient: vertical;\n font-size: 11px;\n line-height: 1.45;\n display: -webkit-box;\n}\n\n.arkme-update-capsule[data-layout=\"restarting\"] {\n grid-template-columns: minmax(0, 1fr);\n width: 218px;\n padding-right: 14px;\n}\n\n.arkme-update-capsule.is-restarting .arkme-update-capsule-copy {\n text-align: center;\n justify-self: center;\n}\n\n.arkme-update-ready-action {\n color: #fff;\n cursor: pointer;\n width: auto;\n height: 32px;\n font: inherit;\n white-space: nowrap;\n background: #242731;\n border: 0;\n border-radius: 10px;\n padding: 0 11px;\n font-size: 10px;\n font-weight: 550;\n}\n\n.arkme-update-ready-action:hover {\n background: #151821;\n}\n\n.arkme-update-ready-action:disabled {\n opacity: .65;\n cursor: wait;\n}\n\n.arkme-update-ready-action:focus-visible {\n outline-offset: 2px;\n outline: 2px solid #6779b5;\n}\n\n.arkme-update-ready-actions {\n align-items: center;\n gap: 6px;\n display: flex;\n}\n\n.arkme-update-later-action {\n color: #737781;\n cursor: pointer;\n height: 32px;\n font: inherit;\n white-space: nowrap;\n background: none;\n border: 0;\n border-radius: 9px;\n padding: 0 8px;\n font-size: 10px;\n}\n\n.arkme-update-later-action:hover {\n color: #343841;\n background: #f0f1f3;\n}\n\n.arkme-update-capsule-close {\n color: #8a8e97;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n place-items: center;\n width: 28px;\n height: 28px;\n padding: 0;\n display: grid;\n}\n\n.arkme-update-capsule-close:hover {\n color: #343841;\n background: #f0f1f3;\n}\n\n@keyframes arkme-update-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes arkme-update-popover-in {\n from {\n opacity: 0;\n transform: translate(-8px, 3px) scale(.985);\n }\n}\n\n@keyframes arkme-update-capsule-in {\n from {\n opacity: 0;\n transform: translate(-50%, -8px) scale(.98);\n }\n}\n\n@keyframes arkme-update-indeterminate {\n from {\n transform: translateX(-100%);\n }\n\n to {\n transform: translateX(300%);\n }\n}\n\n.arkme-redesign-profile {\n position: relative;\n}\n\n.arkme-redesign-profile > span {\n width: 32px !important;\n height: 32px !important;\n}\n\n.arkme-redesign-profile-popover {\n z-index: 10000;\n backdrop-filter: blur(20px);\n background: #fffffff5;\n border: 1px solid #d8d9dde6;\n border-radius: 18px;\n width: 264px;\n padding: 10px;\n position: fixed;\n bottom: 14px;\n left: 64px;\n box-shadow: 0 20px 50px #1a1c2326, 0 2px 8px #1a1c230d;\n}\n\n.arkme-redesign-profile-head {\n align-items: center;\n gap: 11px;\n padding: 9px 9px 13px;\n display: flex;\n}\n\n.arkme-redesign-profile-head > span {\n text-align: left;\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-profile-head strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.arkme-redesign-profile-head small {\n color: #8b8f98;\n font-size: 11px;\n font-weight: 400;\n}\n\n.arkme-redesign-profile-menu {\n border-top: 1px solid #eeeeef;\n gap: 2px;\n padding-top: 6px;\n display: grid;\n}\n\n.arkme-redesign-profile-menu button {\n width: 100%;\n min-height: 50px;\n box-shadow: none;\n color: #393d46;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 11px;\n outline: 0;\n grid-template-columns: 28px minmax(0, 1fr) 16px;\n align-items: center;\n gap: 8px;\n padding: 7px 8px;\n display: grid;\n}\n\n.arkme-redesign-profile-menu button:hover {\n background: #f4f4f5;\n}\n\n.arkme-redesign-profile-menu button > span {\n gap: 3px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-profile-menu strong {\n font-size: 12px;\n font-weight: 500;\n}\n\n.arkme-redesign-profile-menu small {\n color: #92969f;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 10px;\n font-weight: 400;\n overflow: hidden;\n}\n\n.arkme-redesign-profile-menu button > svg:last-child {\n color: #a0a3aa;\n}\n\n.arkme-redesign-native-settings-trigger {\n clip-path: inset(50%);\n width: 1px;\n height: 1px;\n position: absolute;\n overflow: hidden;\n}\n\n.arkme-redesign-chat-panel {\n inset: var(--arkme-native-titlebar) auto 0 96px;\n z-index: 3;\n border-right: 1px solid var(--arkme-line);\n background: #fff;\n flex-direction: column;\n width: 300px;\n min-width: 0;\n padding: 0;\n display: flex;\n position: absolute;\n overflow: hidden;\n}\n\n.arkme-redesign-chat-search {\n text-align: left;\n border-radius: 11px;\n align-items: center;\n gap: 9px;\n width: 100%;\n height: 40px;\n margin: 20px 0 10px;\n padding: 0 12px;\n display: flex;\n color: #9699a1 !important;\n border: 1px solid #e1e2e5 !important;\n font-size: 11px !important;\n}\n\n.arkme-redesign-chat-search:hover {\n background: #f7f7f8;\n}\n\n.arkme-redesign-chat-directory {\n flex: 1;\n min-height: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-chat-directory > section {\n background: none !important;\n}\n\n.arkme-redesign-task-section {\n z-index: 3;\n border-bottom: 1px solid #ececef;\n outline: none;\n height: 158px;\n margin: 0 6px 12px;\n position: relative;\n}\n\n.arkme-redesign-task-section-title {\n color: #767b85;\n justify-content: space-between;\n align-items: center;\n height: 28px;\n padding: 0 7px;\n display: flex;\n}\n\n.arkme-redesign-task-section-title strong {\n font-size: 12px;\n font-weight: 500;\n}\n\n.arkme-redesign-task-section-title button {\n border-radius: 7px;\n place-items: center;\n width: 24px;\n height: 24px;\n display: grid;\n}\n\n.arkme-redesign-task-section-title button:hover {\n background: #f3f3f5;\n}\n\n.arkme-redesign-task-list {\n overscroll-behavior: contain;\n scrollbar-gutter: stable;\n background: #fff;\n max-height: 128px;\n padding-bottom: 2px;\n transition: max-height .18s, box-shadow .18s, padding .18s;\n display: grid;\n position: absolute;\n top: 28px;\n left: 0;\n right: 0;\n overflow: hidden auto;\n}\n\n.arkme-redesign-task-section:hover .arkme-redesign-task-list, .arkme-redesign-task-section:focus-within .arkme-redesign-task-list {\n max-height: min(360px, 100vh - 180px);\n padding-bottom: 6px;\n box-shadow: 0 14px 22px #1b1e2512;\n}\n\n.arkme-redesign-task-list > button {\n color: #555a64;\n text-align: left;\n border-radius: 8px;\n grid-template-columns: 16px minmax(0, 1fr);\n align-items: center;\n gap: 4px;\n width: 100%;\n min-width: 0;\n height: 32px;\n padding: 0 8px;\n display: grid;\n}\n\n.arkme-redesign-task-list > button:hover {\n background: #f7f7f8;\n}\n\n.arkme-redesign-task-list > button.is-selected {\n color: #232630;\n background: #f0f1f4;\n}\n\n.arkme-redesign-task-state {\n justify-content: center;\n align-items: center;\n width: 16px;\n height: 20px;\n display: inline-flex;\n}\n\n.arkme-redesign-task-state.is-complete > i {\n background: #39a56b1a;\n border-radius: 50%;\n width: 10px;\n height: 10px;\n display: block;\n position: relative;\n}\n\n.arkme-redesign-task-state.is-complete > i:after {\n content: \"\";\n background: #39a56b;\n border-radius: 50%;\n position: absolute;\n inset: 2px;\n}\n\n.arkme-redesign-task-matrix {\n grid-template-columns: repeat(3, 2px);\n grid-auto-rows: 2px;\n gap: 1px;\n width: 10px;\n height: 10px;\n display: grid;\n}\n\n.arkme-redesign-task-matrix i {\n opacity: .15;\n background: #5d76e8;\n border-radius: 1px;\n animation: 1s infinite arkme-task-dot-chase;\n}\n\n.arkme-redesign-task-matrix i:nth-child(2) {\n animation-delay: .125s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(3) {\n animation-delay: .25s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(4) {\n animation-delay: .375s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(5) {\n animation-delay: .5s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(6) {\n animation-delay: .625s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(7) {\n animation-delay: .75s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(8) {\n animation-delay: .875s;\n}\n\n@keyframes arkme-task-dot-chase {\n 0%, 12.4% {\n opacity: 1;\n }\n\n 12.5%, 24.9% {\n opacity: .6;\n }\n\n 25%, 37.4% {\n opacity: .35;\n }\n\n 37.5%, 100% {\n opacity: .15;\n }\n}\n\n.arkme-redesign-task-copy {\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-redesign-task-copy strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 0;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-redesign-task-copy small {\n color: #9a9da5;\n flex: none;\n font-size: 12px;\n line-height: 20px;\n}\n\n.arkme-redesign-task-first {\n color: #555a64;\n text-align: left;\n border-radius: 8px;\n width: calc(100% - 12px);\n height: 32px;\n margin: 0 6px;\n padding: 0 8px;\n font-size: 14px;\n}\n\n.arkme-redesign-task-first:hover {\n background: #f7f7f8;\n}\n\n.arkme-redesign-content {\n inset: var(--arkme-native-titlebar) 0 0 96px;\n background: #fff;\n min-width: 0;\n min-height: 0;\n position: absolute;\n overflow: hidden;\n}\n\n.arkme-redesign-content.has-panel {\n left: 396px;\n}\n\n.arkme-redesign-content.has-details {\n right: 360px;\n}\n\n.arkme-redesign-content.is-login-takeover {\n left: 0;\n right: 0;\n}\n\n.arkme-redesign-route-surface {\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-surface {\n background: #fff !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-header {\n border-bottom: 1px solid #ececef !important;\n height: 68px !important;\n padding: 12px 16px 12px 20px !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-header h2 {\n font-size: 15px !important;\n font-weight: 600 !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-body {\n padding: 22px 22px 12px !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-records {\n gap: 0 !important;\n width: 100% !important;\n}\n\n.arkme-conversation-records-reveal {\n animation: .12s ease-out both arkme-conversation-records-reveal;\n}\n\n@keyframes arkme-conversation-records-reveal {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-conversation-records-reveal {\n animation: none;\n }\n}\n\n.arkme-redesign-route-chats [data-arkme-content-presentation=\"bubble\"] p {\n font-size: 14px;\n line-height: 1.62;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer {\n padding: 0 24px 20px !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer-inner {\n background: #fff !important;\n border: 1px solid #dfe1e6 !important;\n border-radius: 15px !important;\n gap: 8px !important;\n width: 100% !important;\n padding: 12px 13px 9px !important;\n box-shadow: 0 8px 30px #1c1f270b !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"] {\n box-shadow: none !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"][data-arkme-composer-focused=\"true\"] {\n background: color-mix(in srgb, var(--dsw-alias-bg-base, #fff) 97%, #000) !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer textarea {\n min-height: 38px !important;\n padding: 0 !important;\n font-size: 14px !important;\n line-height: 22px !important;\n}\n\n.arkme-redesign-task-conversation {\n font-size: 15px;\n}\n\n.arkme-redesign-task-conversation [data-phase] {\n --dsh-chat-content-width: calc(100% - 64px);\n --dsh-composer-card-max-width: calc(100% - 32px);\n}\n\n.arkme-redesign-task-conversation [data-chat-flow] {\n width: calc(100% - 64px) !important;\n max-width: none !important;\n margin-left: 32px !important;\n margin-right: 32px !important;\n}\n\n.arkme-redesign-task-conversation textarea {\n font-size: 14px !important;\n}\n\n[data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"][data-arkme-directory-visible=\"true\"] [data-arkme-directory-mode=\"conversations\"]), [data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-web-locked] [data-arkme-directory-mode=\"web-locked\"]) {\n grid-template-columns: var(--arkme-persistent-sidebar-width, 356px) minmax(0, 1fr) 0 !important;\n}\n\n[data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"][data-arkme-directory-visible=\"false\"]) {\n grid-template-columns: 72px minmax(0, 1fr) 0 !important;\n}\n\n@media (width >= 1100px) {\n [data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"] [data-arkme-directory-mode=\"contacts\"]) {\n grid-template-columns: var(--arkme-persistent-sidebar-width, 356px) minmax(0, 1fr) 0 !important;\n }\n\n [data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"true\"]:not([data-arkme-web-locked])) {\n grid-template-columns: 0 minmax(0, 1fr) 0 !important;\n }\n}\n\n[data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"]:has( > [data-arkme-directory-mode=\"conversations\"]) > [data-arkme-owned=\"product-navigation\"] {\n flex: 0 0 72px !important;\n width: 72px !important;\n min-width: 72px !important;\n}\n\n[data-arkme-owned=\"persistent-sidebar\"] :is([data-arkme-directory-mode=\"conversations\"], [data-arkme-directory-mode=\"web-locked\"]) {\n min-width: 64px !important;\n}\n\n[data-arkme-avatar-only=\"true\"] > :not([role=\"tree\"]) {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] {\n padding: 8px 6px 18px !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button {\n justify-content: center !important;\n gap: 0 !important;\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > :not(:first-child) {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child:has( > span:nth-child(2)) {\n justify-content: center !important;\n gap: 0 !important;\n width: auto !important;\n min-width: 38px !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) {\n display: contents !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:first-child {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:last-child {\n display: contents !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:last-child > :not([style*=\"min-width: 17px\"]) {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:last-child > [style*=\"min-width: 17px\"] {\n top: 3px;\n right: 3px;\n position: absolute !important;\n}\n\n.arkme-redesign-feature-page {\n background: #fff;\n flex-direction: column;\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n padding: 30px 48px 36px;\n display: flex;\n overflow: hidden;\n}\n\n.arkme-redesign-feature-page > header {\n flex: none;\n margin: 0 0 22px;\n}\n\n.arkme-redesign-feature-page > header p {\n color: #8d9098;\n margin: 0 0 8px;\n font-size: 11px;\n}\n\n.arkme-redesign-feature-page > header h1 {\n letter-spacing: -.04em;\n margin: 0;\n font-size: 27px;\n font-weight: 600;\n}\n\n.arkme-redesign-feature-page > header span {\n color: #858992;\n margin-top: 10px;\n font-size: 12px;\n display: block;\n}\n\n.arkme-redesign-feature-body {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-recordings-page {\n background: #fff;\n padding: 0;\n}\n\n.arkme-redesign-recordings-page > div {\n height: 100% !important;\n}\n\n.arkme-redesign-search-page {\n padding: 66px 0 40px;\n}\n\n.arkme-redesign-search-page > header, .arkme-redesign-search-page > .arkme-redesign-feature-body {\n width: min(980px, 100% - 80px);\n margin-left: auto;\n margin-right: auto;\n}\n\n.arkme-redesign-search-page > header {\n margin-bottom: 28px;\n}\n\n.arkme-redesign-search-page > header h1 {\n font-size: 32px;\n}\n\n.arkme-redesign-search-page .arkme-redesign-feature-body {\n overflow-y: auto;\n}\n\n.arkme-redesign-search-page .arkme-redesign-feature-body > div {\n width: 100% !important;\n padding: 0 !important;\n}\n\n.arkme-redesign-search-page .arkme-redesign-feature-body > div > header {\n display: none !important;\n}\n\n.arkme-redesign-search-page .arkme-search-box {\n box-shadow: 0 8px 28px #1c1f2709;\n color: #646872 !important;\n background: #fff !important;\n border: 1px solid #e1e2e5 !important;\n border-radius: 15px !important;\n gap: 12px !important;\n height: 68px !important;\n padding: 0 20px !important;\n}\n\n.arkme-redesign-search-page input[aria-label=\"搜索\"] {\n font-size: 14px !important;\n}\n\n.arkme-redesign-search-page input[aria-label=\"搜索\"]:not(:focus)::placeholder {\n color: #92959d;\n}\n\n.arkme-redesign-search-page .arkme-search-history, .arkme-redesign-search-page .arkme-search-quick {\n margin: 24px 0 0 !important;\n}\n\n.arkme-redesign-search-page .arkme-search-history > div, .arkme-redesign-search-page .arkme-search-quick > div {\n gap: 0 !important;\n display: grid !important;\n}\n\n.arkme-redesign-search-page .arkme-search-history button, .arkme-redesign-search-page .arkme-search-quick button {\n text-align: left;\n overflow: hidden;\n color: #30333b !important;\n border: 0 !important;\n border-bottom: 1px solid #e6e7e9 !important;\n border-radius: 0 !important;\n justify-content: space-between !important;\n align-items: center !important;\n gap: 14px !important;\n width: 100% !important;\n height: 52px !important;\n padding: 0 6px !important;\n font-size: 12px !important;\n display: flex !important;\n}\n\n.arkme-redesign-search-page .arkme-search-history button span, .arkme-redesign-search-page .arkme-search-quick button span {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.arkme-redesign-plugins-page {\n background: #fff;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded > section {\n background: #fff !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded header {\n display: none !important;\n}\n\n.arkme-extension-toolbar {\n align-items: center;\n gap: 12px;\n height: 46px;\n display: flex;\n}\n\n.arkme-extension-toolbar label {\n color: #8e929a;\n border: 1px solid #e1e2e5;\n border-radius: 12px;\n flex: 1;\n align-items: center;\n gap: 10px;\n min-width: 0;\n height: 44px;\n padding: 0 14px;\n display: flex;\n}\n\n.arkme-extension-toolbar input {\n color: #262932;\n background: none;\n border: 0;\n outline: 0;\n flex: 1;\n min-width: 0;\n font-size: 12px;\n}\n\n.arkme-extension-toolbar > button {\n border-radius: 11px;\n height: 38px;\n padding: 0 15px;\n font-size: 11px;\n border: 1px solid #e1e2e5 !important;\n}\n\n.arkme-extension-toolbar > button:hover {\n background: #f6f6f7;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded nav {\n width: 420px;\n height: 38px !important;\n padding: 0 !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded main {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n align-content: start;\n gap: 12px;\n padding: 16px 0 0 !important;\n display: grid !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-card {\n background: #fff !important;\n border: 1px solid #e3e4e7 !important;\n border-radius: 15px !important;\n min-height: 138px !important;\n margin: 0 !important;\n padding: 18px !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-card:hover {\n background: #fafafa !important;\n border-color: #d5d7dc !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-grid-span, .arkme-redesign-plugins-page .arkme-extension-center-embedded main > [role=\"status\"], .arkme-redesign-plugins-page .arkme-extension-center-embedded main > [role=\"alert\"] {\n grid-column: 1 / -1;\n}\n\n@keyframes arkme-icon-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.arkme-icon-spin {\n animation: .8s linear infinite arkme-icon-spin;\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-arkme-voice] .arkme-icon-spin {\n animation: none;\n }\n}\n\n.arkme-redesign-settings-surface {\n color: #20232c;\n background: none;\n width: 100%;\n height: auto;\n overflow: visible;\n}\n\n.arkme-redesign-settings-shell {\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n padding: 0;\n}\n\n.arkme-redesign-settings-profile {\n align-items: center;\n gap: 16px;\n padding: 0 0 24px;\n display: flex;\n}\n\n.arkme-redesign-settings-profile > div:nth-child(2) {\n min-width: 0;\n}\n\n.arkme-redesign-settings-profile h1 {\n color: #20232c;\n letter-spacing: -.03em;\n white-space: nowrap;\n text-overflow: ellipsis;\n margin: 0 0 6px;\n font-size: 24px;\n font-weight: 600;\n line-height: 30px;\n overflow: hidden;\n}\n\n.arkme-redesign-settings-profile p {\n color: #858992;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 13px;\n line-height: 18px;\n display: flex;\n overflow: hidden;\n}\n\n.arkme-redesign-settings-profile p > span {\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 0;\n overflow: hidden;\n}\n\n.arkme-account-profile-qr {\n color: #858992;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 0;\n flex: none;\n justify-content: center;\n align-items: center;\n width: 24px;\n height: 24px;\n margin: 0;\n padding: 2px;\n display: inline-flex;\n}\n\n.arkme-account-profile-qr:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-account-profile-qr svg {\n width: 20px;\n height: 20px;\n display: block;\n}\n\n.arkme-redesign-settings-group {\n background: none;\n border: 0;\n border-bottom: 1px solid #e1e2e5;\n border-radius: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-settings-group:last-child {\n border-bottom: 0;\n}\n\n.arkme-redesign-settings-group > h2 {\n color: #8a8e96;\n border-bottom: 1px solid #ededee;\n margin: 0;\n padding: 15px 1px 10px;\n font-size: 12px;\n font-weight: 500;\n line-height: 17px;\n}\n\n.arkme-redesign-settings-group > div {\n padding: 0;\n}\n\n.arkme-redesign-setting-row {\n box-sizing: border-box;\n width: 100%;\n min-height: 54px;\n color: inherit;\n font: inherit;\n text-align: left;\n background: none;\n border: 0;\n border-bottom: 1px solid #ededee;\n grid-template-columns: minmax(0, 1fr) auto 18px;\n align-items: center;\n gap: 10px;\n padding: 9px 1px;\n text-decoration: none;\n display: grid;\n}\n\n.arkme-redesign-setting-row:last-child {\n border-bottom: 0;\n}\n\nbutton.arkme-redesign-setting-row, a.arkme-redesign-setting-row {\n cursor: pointer;\n}\n\nbutton.arkme-redesign-setting-row:hover, a.arkme-redesign-setting-row:hover {\n color: #53617d;\n}\n\n.arkme-redesign-setting-row:disabled {\n opacity: .6;\n cursor: default;\n}\n\n.arkme-redesign-setting-row > strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-redesign-setting-row > strong.is-danger {\n color: #b54841;\n}\n\n.arkme-redesign-setting-summary {\n color: #858992;\n text-align: right;\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: 360px;\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n}\n\n.arkme-redesign-setting-row > svg {\n color: #8d929b;\n}\n\n.arkme-account-info-row {\n box-sizing: border-box;\n width: 100%;\n min-height: 54px;\n color: inherit;\n font: inherit;\n text-align: left;\n background: none;\n border: 0;\n border-bottom: 1px solid #ededee;\n grid-template-columns: 26px minmax(0, 1fr) auto 18px;\n align-items: center;\n gap: 10px;\n padding: 9px 1px;\n display: grid;\n}\n\n.arkme-account-info-row:last-child {\n border-bottom: 0;\n}\n\nbutton.arkme-account-info-row {\n cursor: pointer;\n}\n\n.arkme-account-info-row:disabled {\n opacity: .6;\n cursor: default;\n}\n\n.arkme-account-info-icon {\n color: #6f7580;\n justify-content: center;\n align-items: center;\n width: 26px;\n height: 26px;\n display: inline-flex;\n}\n\n.arkme-account-info-copy {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-account-info-copy > strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-account-info-copy > small {\n color: #858992;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n}\n\n.arkme-account-info-action {\n color: #858992;\n white-space: nowrap;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-info-row > svg {\n color: #8d929b;\n}\n\n.arkme-account-feedback {\n color: #b54841;\n align-items: flex-start;\n gap: 6px;\n margin: 8px 0 14px;\n font-size: 12px;\n line-height: 18px;\n display: flex;\n}\n\n.arkme-account-dialog-backdrop {\n z-index: 50;\n background: #12141a6b;\n justify-content: center;\n align-items: center;\n padding: 18px;\n display: flex;\n position: fixed;\n inset: 0;\n}\n\n.arkme-account-dialog {\n box-sizing: border-box;\n color: #20232c;\n background: #fff;\n border: 1px solid #e1e2e5;\n border-radius: 16px;\n width: min(420px, 100vw - 36px);\n max-height: calc(100vh - 56px);\n overflow: auto;\n box-shadow: 0 18px 52px #11182738;\n}\n\n.arkme-account-dialog > header {\n border-bottom: 1px solid #ededee;\n justify-content: space-between;\n align-items: center;\n height: 58px;\n padding: 0 16px 0 20px;\n display: flex;\n}\n\n.arkme-account-dialog h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 650;\n line-height: 24px;\n}\n\n.arkme-account-dialog > header button {\n color: #8d929b;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 50%;\n width: 34px;\n height: 34px;\n}\n\n.arkme-account-qr-card {\n box-sizing: border-box;\n background: #fff;\n border: 1px solid #ededee;\n border-radius: 14px;\n justify-items: center;\n gap: 7px;\n width: 270px;\n margin: 22px auto 16px;\n padding: 24px 22px 22px;\n display: grid;\n}\n\n.arkme-account-qr-card strong {\n margin-top: 4px;\n font-size: 17px;\n font-weight: 650;\n line-height: 23px;\n}\n\n.arkme-account-qr-card span, .arkme-account-qr-card small {\n color: #858992;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-qr-card img {\n width: 180px;\n height: 180px;\n margin-top: 8px;\n}\n\n.arkme-account-form {\n gap: 12px;\n padding: 18px 20px 20px;\n display: grid;\n}\n\n.arkme-account-form label {\n color: #5f6570;\n gap: 7px;\n font-size: 12px;\n line-height: 18px;\n display: grid;\n}\n\n.arkme-account-form input {\n box-sizing: border-box;\n color: #20232c;\n width: 100%;\n height: 42px;\n font: inherit;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 11px;\n outline: none;\n padding: 0 12px;\n}\n\n.arkme-account-form input:focus {\n border-color: #9aa7c2;\n box-shadow: 0 0 0 3px #53617d1f;\n}\n\n.arkme-account-rule {\n color: #858992;\n margin: -2px 0 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-code-row {\n grid-template-columns: minmax(0, 1fr) 92px;\n gap: 8px;\n display: grid;\n}\n\n.arkme-account-code-row button {\n color: #343944;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 11px;\n}\n\n.arkme-account-code-row button:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-account-dialog-actions {\n justify-content: flex-end;\n gap: 10px;\n padding-top: 6px;\n display: flex;\n}\n\n.arkme-account-dialog-actions button {\n color: #343944;\n min-width: 78px;\n height: 36px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 10px;\n justify-content: center;\n align-items: center;\n gap: 6px;\n padding: 0 14px;\n display: inline-flex;\n}\n\n.arkme-account-dialog-actions button[type=\"submit\"], .arkme-account-dialog-actions button:last-child {\n color: #fff;\n background: #20232c;\n border-color: #20232c;\n}\n\n.arkme-account-dialog-actions button:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-account-dialog-status {\n color: #13a85b;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-dialog-status.is-error {\n color: #b54841;\n}\n\n.arkme-redesign-version-row {\n grid-template-columns: minmax(0, 1fr) minmax(150px, auto) auto 18px;\n}\n\n.arkme-redesign-version-row.is-without-action {\n grid-template-columns: minmax(0, 1fr) auto 18px;\n}\n\n.arkme-redesign-version-copy {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-version-copy > strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-redesign-version-copy > small {\n color: #858992;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 11px;\n line-height: 16px;\n overflow: hidden;\n}\n\n.arkme-redesign-version-value {\n color: #858992;\n white-space: nowrap;\n justify-self: end;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-redesign-version-action-slot {\n justify-content: flex-end;\n display: inline-flex;\n}\n\n.arkme-redesign-trailing-slot {\n width: 18px;\n height: 1px;\n}\n\nbutton.arkme-redesign-update-button {\n color: #343944;\n min-width: 72px;\n height: 30px;\n font: inherit;\n white-space: nowrap;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n justify-content: center;\n align-items: center;\n gap: 5px;\n padding: 0 11px;\n font-size: 11px;\n display: inline-flex;\n}\n\nbutton.arkme-redesign-update-button:hover {\n background: #f7f7f8;\n border-color: #cfd3da;\n}\n\nbutton.arkme-redesign-update-button:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-redesign-settings-group:has(.arkme-redesign-balance-row) {\n overflow: visible;\n}\n\n.arkme-redesign-balance-row {\n grid-template-columns: max-content max-content minmax(0, 1fr) 18px;\n column-gap: 20px;\n}\n\n.arkme-redesign-balance-row.is-without-reserved {\n grid-template-columns: max-content minmax(0, 1fr) 18px;\n}\n\n.arkme-redesign-balance-main {\n min-width: 0;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n gap: 2px;\n padding: 0;\n display: grid;\n}\n\n.arkme-redesign-balance-main > strong {\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.arkme-redesign-balance-main > small {\n color: #858992;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-redesign-balance-usage {\n color: #8a8e96;\n white-space: nowrap;\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-redesign-reserved-balance {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-recharge-trigger {\n justify-self: end;\n}\n\n.arkme-redesign-reserved-title {\n align-items: center;\n gap: 5px;\n width: fit-content;\n display: inline-flex;\n position: relative;\n}\n\n.arkme-redesign-reserved-title > strong {\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.arkme-redesign-reserved-balance > small {\n color: #858992;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-redesign-reserved-help {\n box-sizing: border-box;\n color: #858992;\n cursor: help;\n border: 1px solid #a6aab2;\n border-radius: 50%;\n place-items: center;\n width: 15px;\n height: 15px;\n font-size: 10px;\n font-weight: 600;\n line-height: 1;\n display: inline-grid;\n}\n\n.arkme-redesign-reserved-help:focus-visible {\n outline-offset: 2px;\n outline: 2px solid #7b8cad;\n}\n\n.arkme-redesign-reserved-title > [role=\"tooltip\"] {\n box-sizing: border-box;\n z-index: 20;\n color: #fff;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n background: #2e323b;\n border-radius: 8px;\n width: 240px;\n padding: 9px 11px;\n font-size: 11px;\n font-weight: 400;\n line-height: 17px;\n transition: opacity .12s, transform .12s, visibility .12s;\n position: absolute;\n bottom: calc(100% + 8px);\n left: calc(100% - 7.5px);\n transform: translate(-50%, 2px);\n box-shadow: 0 6px 18px #181b222e;\n}\n\n.arkme-redesign-reserved-help:hover ~ [role=\"tooltip\"], .arkme-redesign-reserved-help:focus ~ [role=\"tooltip\"] {\n opacity: 1;\n visibility: visible;\n transform: translate(-50%);\n}\n\n.arkme-billing-backdrop {\n z-index: 120;\n backdrop-filter: blur(3px);\n background: #181b223d;\n place-items: center;\n padding: 28px;\n display: grid;\n position: fixed;\n inset: 0;\n}\n\n.arkme-billing-recharge-dialog, .arkme-billing-payment-dialog {\n color: #20232c;\n background: #fff;\n border: 1px solid #dedfe3;\n border-radius: 20px;\n width: min(620px, 100%);\n max-height: min(720px, 100vh - 56px);\n overflow-y: auto;\n box-shadow: 0 24px 72px #191c232e;\n}\n\n.arkme-billing-payment-dialog {\n width: min(420px, 100%);\n}\n\n.arkme-billing-dialog-header {\n border-bottom: 1px solid #ececef;\n justify-content: space-between;\n align-items: flex-start;\n gap: 18px;\n min-height: 78px;\n padding: 20px 22px 16px;\n display: flex;\n}\n\n.arkme-billing-dialog-header h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n line-height: 25px;\n}\n\n.arkme-billing-dialog-header p {\n overflow-wrap: anywhere;\n color: #8a8e96;\n margin: 4px 0 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-billing-dialog-header > button {\n color: #777c85;\n width: 32px;\n height: 32px;\n font: inherit;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n flex: none;\n place-items: center;\n font-size: 22px;\n display: grid;\n}\n\n.arkme-billing-dialog-header > button:hover {\n color: #20232c;\n background: #f3f3f5;\n}\n\n.arkme-billing-dialog-body {\n padding: 18px 22px 22px;\n}\n\n.arkme-billing-dialog-balance {\n border-bottom: 1px solid #ececef;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n column-gap: 12px;\n min-height: 48px;\n padding: 0 2px 16px;\n display: grid;\n}\n\n.arkme-billing-dialog-balance > span {\n color: #8a8e96;\n grid-column: 1;\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-billing-dialog-balance > strong {\n grid-column: 1;\n font-size: 22px;\n font-weight: 600;\n line-height: 28px;\n}\n\n.arkme-billing-dialog-balance > button, .arkme-billing-error > button {\n color: #626772;\n height: 30px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n grid-area: 1 / 2 / span 2;\n padding: 0 12px;\n font-size: 11px;\n}\n\n.arkme-billing-products-section, .arkme-billing-payment-section {\n padding-top: 17px;\n}\n\n.arkme-billing-products-section h3, .arkme-billing-payment-section h3 {\n color: #747984;\n margin: 0 0 11px;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.arkme-billing-product-grid {\n width: 100%;\n}\n\n.arkme-billing-product-grid > button {\n color: #20232c;\n min-width: 0;\n min-height: 62px;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 11px;\n align-content: center;\n gap: 4px;\n padding: 9px 11px;\n display: grid;\n}\n\n.arkme-billing-product-grid > button:hover {\n background: #f8f8f9;\n border-color: #cfd2d8;\n}\n\n.arkme-billing-product-grid > button.is-selected {\n border-color: #75839e;\n box-shadow: 0 0 0 1px #75839e;\n}\n\n.arkme-billing-product-grid > button > span {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n font-weight: 500;\n line-height: 17px;\n overflow: hidden;\n}\n\n.arkme-billing-product-grid > button > strong {\n font-size: 14px;\n font-weight: 600;\n line-height: 19px;\n}\n\n.arkme-billing-payment-actions {\n flex-wrap: wrap;\n gap: 10px;\n display: flex;\n}\n\n.arkme-billing-payment-actions > button {\n color: #333842;\n min-width: 154px;\n height: 38px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 10px;\n justify-content: center;\n align-items: center;\n gap: 8px;\n padding: 0 14px;\n font-size: 12px;\n display: inline-flex;\n}\n\n.arkme-billing-payment-actions > button:hover {\n background: #f7f7f8;\n border-color: #cfd3da;\n}\n\n.arkme-billing-payment-actions > button:disabled, .arkme-billing-product-grid > button:disabled {\n opacity: .48;\n cursor: default;\n}\n\n.arkme-billing-platform-icon {\n flex: none;\n width: 18px;\n height: 18px;\n}\n\n.arkme-billing-platform-icon.is-alipay {\n color: #1677ff;\n}\n\n.arkme-billing-platform-icon.is-wechat {\n color: #07c160;\n}\n\n.arkme-billing-state {\n color: #858992;\n margin: 12px 0 2px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-billing-error {\n color: #b54841;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n margin-top: 10px;\n font-size: 12px;\n line-height: 18px;\n display: flex;\n}\n\n.arkme-billing-error.is-purchase {\n justify-content: flex-start;\n}\n\n.arkme-billing-payment-content {\n text-align: center;\n justify-items: center;\n gap: 10px;\n padding: 28px 24px 18px;\n display: grid;\n}\n\n.arkme-billing-payment-content > .arkme-billing-platform-icon {\n width: 38px;\n height: 38px;\n margin-bottom: 4px;\n}\n\n.arkme-billing-payment-content > img {\n border-radius: 10px;\n width: 210px;\n height: 210px;\n}\n\n.arkme-billing-payment-content > strong {\n font-size: 14px;\n font-weight: 600;\n line-height: 21px;\n}\n\n.arkme-billing-payment-content > p {\n color: #858992;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-billing-payment-content.is-paid > strong {\n color: #16794f;\n font-size: 18px;\n line-height: 25px;\n}\n\n.arkme-billing-payment-content.is-paid > .arkme-billing-error {\n justify-content: center;\n}\n\n.arkme-billing-payment-content.is-crediting > strong {\n color: #335f9e;\n}\n\n.arkme-billing-dialog-actions {\n flex-wrap: wrap;\n justify-content: center;\n gap: 9px;\n padding: 0 22px 20px;\n display: flex;\n}\n\n.arkme-billing-dialog-actions > button, .arkme-billing-primary-action {\n color: #3c424d;\n height: 34px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n padding: 0 14px;\n font-size: 12px;\n}\n\n.arkme-billing-dialog-actions > .arkme-billing-primary-action, .arkme-billing-payment-content > .arkme-billing-primary-action {\n color: #fff;\n background: #20232d;\n border-color: #20232d;\n}\n\n.arkme-redesign-settings-error {\n color: #b54841;\n background: #fff3f0;\n border-radius: 10px;\n margin: -8px 0 28px;\n padding: 10px 13px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-remote-settings-dialog-backdrop {\n z-index: 1150;\n box-sizing: border-box;\n backdrop-filter: blur(1.5px);\n background: #16181d47;\n place-items: center;\n padding: 24px;\n display: grid;\n position: fixed;\n inset: 0;\n}\n\n.arkme-remote-settings-dialog {\n color: #20232c;\n background: #fff;\n border: 1px solid #14182014;\n border-radius: 19px;\n flex-direction: column;\n width: min(720px, 100vw - 48px);\n max-height: min(720px, 100vh - 48px);\n display: flex;\n overflow: hidden;\n box-shadow: 0 18px 54px #11141b2e;\n}\n\n.arkme-remote-page-header {\n box-sizing: border-box;\n border-bottom: 1px solid #ededee;\n justify-content: space-between;\n align-items: center;\n gap: 20px;\n min-height: 74px;\n padding: 0 24px 0 28px;\n display: flex;\n}\n\n.arkme-remote-page-header > div {\n min-width: 0;\n}\n\n.arkme-remote-page-header h1 {\n color: #20232c;\n letter-spacing: -.02em;\n margin: 0;\n font-size: 18px;\n font-weight: 620;\n line-height: 25px;\n}\n\n.arkme-remote-page-header p {\n color: #8b9098;\n margin: 3px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-remote-settings-close {\n color: #777c85;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n flex: none;\n justify-content: center;\n align-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n}\n\n.arkme-remote-settings-close:hover {\n color: #20232c;\n background: #f3f3f4;\n}\n\n.arkme-remote-settings-dialog-body {\n overscroll-behavior: contain;\n gap: 28px;\n padding: 24px 28px 28px;\n display: grid;\n overflow-y: auto;\n}\n\n.arkme-remote-section {\n gap: 13px;\n display: grid;\n}\n\n.arkme-remote-section-header {\n justify-content: space-between;\n align-items: flex-end;\n gap: 18px;\n min-height: 34px;\n display: flex;\n}\n\n.arkme-remote-section-header > div:first-child {\n min-width: 0;\n}\n\n.arkme-remote-section-header h2 {\n color: #292c34;\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n line-height: 21px;\n}\n\n.arkme-remote-section-header p {\n color: #8b9098;\n margin: 2px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-remote-section-header > div:last-child {\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n.arkme-remote-icon-button {\n color: #8a8f97;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n justify-content: center;\n align-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n}\n\n.arkme-remote-icon-button:hover {\n color: #343944;\n background: #f3f3f4;\n}\n\n.arkme-remote-add-button {\n color: #fff;\n min-height: 32px;\n font: inherit;\n cursor: pointer;\n background: #20232c;\n border: 0;\n border-radius: 9px;\n align-items: center;\n gap: 5px;\n padding: 0 12px;\n font-size: 11px;\n font-weight: 550;\n display: inline-flex;\n}\n\n.arkme-remote-add-button:hover {\n background: #343944;\n}\n\n.arkme-remote-add-button:disabled, .arkme-remote-icon-button:disabled {\n opacity: .45;\n cursor: default;\n}\n\n.arkme-remote-settings-card {\n background: #fff;\n border: 1px solid #e1e2e5;\n border-radius: 16px;\n overflow: hidden;\n}\n\n.arkme-remote-allow-row {\n border-bottom: 1px solid #ededee;\n justify-content: space-between;\n align-items: center;\n gap: 18px;\n min-height: 60px;\n padding: 0 18px;\n display: flex;\n}\n\n.arkme-remote-allow-row > div {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-remote-allow-row strong, .arkme-remote-device-row strong, .arkme-remote-name-row strong {\n color: #343944;\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.arkme-remote-allow-row span, .arkme-remote-device-row span, .arkme-remote-name-row small {\n color: #8b9098;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 10px;\n line-height: 16px;\n overflow: hidden;\n}\n\n.arkme-remote-switch {\n cursor: pointer;\n background: #d7d9dd;\n border: 0;\n border-radius: 999px;\n flex: none;\n width: 40px;\n height: 23px;\n padding: 0;\n transition: background .16s;\n position: relative;\n}\n\n.arkme-remote-switch > span {\n background: #fff;\n border-radius: 50%;\n width: 17px;\n height: 17px;\n transition: transform .16s;\n position: absolute;\n top: 3px;\n left: 3px;\n box-shadow: 0 1px 3px #14182038;\n}\n\n.arkme-remote-switch[aria-checked=\"true\"] {\n background: #3b9cf5;\n}\n\n.arkme-remote-switch[aria-checked=\"true\"] > span {\n transform: translateX(17px);\n}\n\n.arkme-remote-switch:disabled {\n opacity: .5;\n cursor: default;\n}\n\n.arkme-remote-device-row {\n border-bottom: 1px solid #ededee;\n grid-template-columns: 24px minmax(0, 1fr) auto;\n align-items: center;\n gap: 11px;\n min-height: 64px;\n padding: 0 18px;\n display: grid;\n}\n\n.arkme-remote-device-row:last-child {\n border-bottom: 0;\n}\n\n.arkme-remote-device-row > svg {\n color: #68707c;\n}\n\n.arkme-remote-device-row > div {\n gap: 1px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-remote-device-row > button {\n color: #5d626c;\n min-height: 30px;\n font: inherit;\n cursor: pointer;\n background: #f3f3f4;\n border: 0;\n border-radius: 9px;\n padding: 0 10px;\n font-size: 10px;\n}\n\n.arkme-remote-device-row > button:hover {\n color: #b54841;\n background: #fff0ed;\n}\n\n.arkme-remote-device-row > button:disabled {\n opacity: .45;\n cursor: default;\n}\n\n.arkme-remote-empty-row {\n color: #989ca3;\n align-items: center;\n gap: 11px;\n min-height: 52px;\n padding: 0 18px;\n font-size: 11px;\n display: flex;\n}\n\n.arkme-remote-empty-row > svg {\n color: #a2a6ad;\n}\n\n.arkme-remote-name-row {\n color: #727780;\n width: 100%;\n min-height: 62px;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n grid-template-columns: 24px minmax(0, 1fr) 20px;\n align-items: center;\n gap: 11px;\n padding: 0 18px;\n display: grid;\n}\n\n.arkme-remote-name-row:hover {\n background: #fafafb;\n}\n\n.arkme-remote-name-row > span {\n gap: 1px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-remote-name-row small {\n display: block;\n}\n\n.arkme-remote-rename {\n border-top: 1px solid #ededee;\n grid-template-columns: minmax(0, 1fr) auto auto;\n gap: 7px;\n padding: 12px 18px;\n display: grid;\n}\n\n.arkme-remote-rename input {\n box-sizing: border-box;\n color: #20232c;\n min-width: 0;\n height: 34px;\n font: inherit;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n outline: 0;\n padding: 0 10px;\n font-size: 12px;\n}\n\n.arkme-remote-rename input:focus {\n border-color: #6eb3f3;\n box-shadow: 0 0 0 3px #3b9cf51f;\n}\n\n.arkme-remote-rename button {\n color: #4f5560;\n min-height: 34px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #e0e1e4;\n border-radius: 9px;\n padding: 0 11px;\n font-size: 11px;\n}\n\n.arkme-remote-rename button[type=\"submit\"] {\n color: #fff;\n background: #20232c;\n border-color: #20232c;\n}\n\n.arkme-remote-rename button:disabled {\n opacity: .5;\n cursor: default;\n}\n\n.arkme-remote-error {\n margin: -22px 0 0;\n}\n\n.arkme-remote-dialog-backdrop {\n z-index: 1200;\n box-sizing: border-box;\n backdrop-filter: blur(1.5px);\n background: #16181d47;\n place-items: center;\n padding: 24px;\n display: grid;\n position: fixed;\n inset: 0;\n overflow: auto;\n}\n\n.arkme-remote-dialog {\n box-sizing: border-box;\n color: #20232c;\n background: #fff;\n border: 1px solid #14182014;\n border-radius: 19px;\n width: min(440px, 100vw - 32px);\n max-height: calc(100vh - 48px);\n padding: 28px;\n position: relative;\n overflow: auto;\n box-shadow: 0 18px 54px #11141b2e;\n}\n\n.arkme-remote-dialog-close {\n color: #777c85;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n justify-content: center;\n align-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n position: absolute;\n top: 16px;\n right: 16px;\n}\n\n.arkme-remote-dialog-close:hover {\n color: #20232c;\n background: #f3f3f4;\n}\n\n.arkme-remote-dialog-symbol {\n color: #343944;\n justify-content: center;\n align-items: center;\n gap: 9px;\n height: 38px;\n display: flex;\n}\n\n.arkme-remote-dialog-symbol > span {\n background: #d6d8dc;\n width: 28px;\n height: 1px;\n}\n\n.arkme-remote-dialog > header {\n text-align: center;\n margin: 12px 0 22px;\n}\n\n.arkme-remote-dialog h2 {\n letter-spacing: -.02em;\n margin: 0;\n font-size: 19px;\n font-weight: 620;\n line-height: 27px;\n}\n\n.arkme-remote-dialog header p {\n color: #858992;\n margin: 6px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-remote-pairing-tabs {\n box-sizing: border-box;\n background: #f1f1f2;\n border-radius: 11px;\n grid-template-columns: 1fr 1fr;\n gap: 3px;\n height: 38px;\n padding: 3px;\n display: grid;\n}\n\n.arkme-remote-pairing-tabs button {\n color: #737881;\n font: inherit;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 8px;\n font-size: 11px;\n}\n\n.arkme-remote-pairing-tabs button[aria-selected=\"true\"] {\n color: #252831;\n background: #fff;\n box-shadow: 0 1px 3px #14182017;\n}\n\n.arkme-remote-pairing-display {\n box-sizing: border-box;\n background: #fff;\n border: 1px solid #e5e6e8;\n border-radius: 16px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n min-height: 308px;\n margin-top: 14px;\n padding: 24px;\n display: flex;\n position: relative;\n}\n\n.arkme-remote-pairing-display > img {\n width: 232px;\n height: 232px;\n image-rendering: pixelated;\n display: block;\n}\n\n.arkme-remote-pairing-display > p {\n color: #8b9098;\n text-align: center;\n margin: 10px 0 0;\n font-size: 10px;\n line-height: 16px;\n}\n\n.arkme-remote-pairing-code {\n color: #20232c;\n letter-spacing: .17em;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n user-select: all;\n font-size: 33px;\n font-weight: 620;\n line-height: 46px;\n}\n\n.arkme-remote-pairing-tools {\n gap: 4px;\n display: flex;\n position: absolute;\n bottom: 12px;\n right: 12px;\n}\n\n.arkme-remote-pairing-tools button {\n color: #8a8f97;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 8px;\n justify-content: center;\n align-items: center;\n width: 30px;\n height: 30px;\n padding: 0;\n display: inline-flex;\n}\n\n.arkme-remote-pairing-tools button:hover {\n color: #343944;\n background: #f3f3f4;\n}\n\n.arkme-remote-pairing-expired {\n text-align: center;\n justify-items: center;\n gap: 7px;\n display: grid;\n}\n\n.arkme-remote-pairing-expired strong {\n font-size: 14px;\n line-height: 20px;\n}\n\n.arkme-remote-pairing-expired p {\n color: #8b9098;\n margin: 0;\n font-size: 11px;\n}\n\n.arkme-remote-pairing-expired button {\n color: #fff;\n min-height: 32px;\n font: inherit;\n cursor: pointer;\n background: #20232c;\n border: 0;\n border-radius: 9px;\n margin-top: 7px;\n padding: 0 12px;\n font-size: 11px;\n}\n\n.arkme-remote-dialog-note {\n color: #858992;\n align-items: flex-start;\n gap: 7px;\n margin: 14px 2px 0;\n font-size: 10px;\n line-height: 16px;\n display: flex;\n}\n\n.arkme-remote-dialog-note > svg {\n color: #5e856d;\n flex: none;\n margin-top: 1px;\n}\n\n.arkme-remote-settings-close:focus-visible, .arkme-remote-icon-button:focus-visible, .arkme-remote-add-button:focus-visible, .arkme-remote-switch:focus-visible, .arkme-remote-device-row > button:focus-visible, .arkme-remote-name-row:focus-visible, .arkme-remote-rename button:focus-visible, .arkme-remote-dialog button:focus-visible {\n outline-offset: 2px;\n outline: 2px solid #3b9cf5;\n}\n\n@media (width <= 520px) {\n .arkme-remote-settings-dialog-backdrop {\n padding: 10px;\n }\n\n .arkme-remote-settings-dialog {\n border-radius: 17px;\n width: calc(100vw - 20px);\n max-height: calc(100vh - 20px);\n }\n\n .arkme-remote-page-header {\n min-height: 68px;\n padding: 0 16px 0 20px;\n }\n\n .arkme-remote-page-header p {\n display: none;\n }\n\n .arkme-remote-settings-dialog-body {\n gap: 24px;\n padding: 20px 18px 22px;\n }\n\n .arkme-remote-section-header p {\n display: none;\n }\n\n .arkme-remote-device-row {\n grid-template-columns: 22px minmax(0, 1fr);\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .arkme-remote-device-row > button {\n grid-column: 2;\n justify-self: start;\n }\n\n .arkme-remote-dialog-backdrop {\n padding: 12px;\n }\n\n .arkme-remote-dialog {\n padding: 24px 20px;\n }\n\n .arkme-remote-pairing-display {\n min-height: 282px;\n padding: 18px;\n }\n\n .arkme-remote-pairing-display > img {\n width: min(224px, 100%);\n height: auto;\n }\n\n .arkme-remote-pairing-code {\n letter-spacing: .12em;\n font-size: 26px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-remote-switch, .arkme-remote-switch > span {\n transition: none;\n }\n}\n\n.arkme-redesign-model-settings {\n color: #20232c;\n background: #fff;\n width: 100%;\n height: 100%;\n overflow-y: auto;\n}\n\n.arkme-redesign-model-settings > header {\n width: min(760px, 100% - 96px);\n margin: 0 auto;\n padding: 42px 0 22px;\n}\n\n.arkme-redesign-model-settings > header button {\n color: #525762;\n height: 34px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #e1e2e5;\n border-radius: 18px;\n align-items: center;\n gap: 4px;\n padding: 0 10px 0 7px;\n font-size: 13px;\n display: inline-flex;\n}\n\n.arkme-redesign-model-settings > header button:hover {\n color: #20232c;\n background: #f6f6f7;\n}\n\n.arkme-redesign-model-settings-body {\n width: min(760px, 100% - 96px);\n margin: 0 auto;\n padding: 0 0 68px;\n}\n\n.arkme-redesign-model-settings-body > * {\n max-width: none !important;\n}\n\n.arkme-redesign-task-start {\n place-items: center;\n width: 100%;\n height: 100%;\n padding: 28px 58px 64px;\n display: grid;\n}\n\n.arkme-redesign-task-start-inner {\n text-align: center;\n width: min(760px, 88%);\n transform: translateY(-12px);\n}\n\n.arkme-redesign-task-greeting {\n justify-content: center;\n align-items: center;\n gap: 12px;\n margin-bottom: 24px;\n display: flex;\n}\n\n.arkme-redesign-task-greeting img {\n object-fit: contain;\n flex: none;\n width: 62px;\n height: 16px;\n display: block;\n}\n\n.arkme-redesign-task-start h1 {\n letter-spacing: -.03em;\n margin: 0;\n font-size: 29px;\n font-weight: 600;\n line-height: 1.15;\n}\n\n.arkme-redesign-hero-input {\n border: 1px solid var(--arkme-focus);\n text-align: left;\n background: #fff;\n border-radius: 17px;\n grid-template-rows: minmax(56px, 1fr) auto;\n min-height: 142px;\n padding: 17px 16px 13px 20px;\n display: grid;\n box-shadow: 0 8px 30px #1c1f270b;\n}\n\n.arkme-redesign-hero-input:focus-within {\n border-color: #aebdff;\n box-shadow: 0 10px 38px #36488c13, 0 0 0 3px #91a4ff12;\n}\n\n.arkme-redesign-hero-input textarea {\n resize: none;\n color: #20232c;\n border: 0;\n outline: 0;\n width: 100%;\n min-height: 58px;\n padding: 0;\n font-size: 15px;\n line-height: 1.6;\n}\n\n.arkme-redesign-hero-input textarea::placeholder {\n color: #a3a6ad;\n}\n\n.arkme-redesign-hero-controls {\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n display: flex;\n}\n\n.arkme-redesign-hero-controls > div {\n align-items: center;\n gap: 7px;\n display: flex;\n}\n\n.arkme-redesign-source-button {\n border-radius: 22px;\n align-items: center;\n gap: 8px;\n height: 36px;\n padding: 0 13px;\n font-size: 13px;\n display: flex;\n border: 1px solid #e2e3e6 !important;\n}\n\n.arkme-redesign-round-tool, .arkme-redesign-send-task {\n border-radius: 50%;\n place-items: center;\n width: 40px;\n height: 40px;\n display: grid;\n border: 1px solid #e2e3e6 !important;\n}\n\n.arkme-redesign-round-tool:hover {\n background: #f5f5f6;\n}\n\n.arkme-redesign-send-task {\n color: #fff !important;\n background: #20232d !important;\n border: 0 !important;\n}\n\n.arkme-redesign-send-task:disabled {\n cursor: default;\n background: #d9dade !important;\n}\n\n.arkme-redesign-task-error {\n color: #b84747;\n text-align: left;\n margin-top: 10px;\n font-size: 12px;\n}\n\n.arkme-redesign-starters {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n width: calc(100% - 18px);\n margin: 22px auto 0;\n display: grid;\n}\n\n.arkme-redesign-starters > button {\n text-align: left;\n border-right: 1px solid #e7e7e9;\n align-items: center;\n gap: 12px;\n min-width: 0;\n min-height: 48px;\n padding: 4px 18px;\n display: flex;\n}\n\n.arkme-redesign-starters > button:last-child {\n border-right: 0;\n}\n\n.arkme-redesign-starters > button:hover strong {\n color: #5365ad;\n}\n\n.arkme-redesign-starter-icon {\n color: #30333b;\n border: 1px solid #e2e3e6;\n border-radius: 50%;\n flex: none;\n place-items: center;\n width: 38px;\n height: 38px;\n display: grid;\n}\n\n.arkme-redesign-starters > button > span:last-child {\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-starters strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 13px;\n font-weight: 500;\n overflow: hidden;\n}\n\n.arkme-redesign-starters small {\n color: #8d919a;\n font-size: 12px;\n}\n\n.arkme-redesign-details {\n z-index: 4;\n top: var(--arkme-native-titlebar);\n background: #fff;\n border-left: 1px solid #e7e7e9;\n width: 360px;\n position: absolute;\n bottom: 0;\n right: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-calendar-overlay {\n z-index: 14;\n inset: var(--arkme-native-titlebar) 0 0;\n pointer-events: none;\n position: absolute;\n}\n\n.arkme-redesign-calendar-overlay > * {\n pointer-events: auto;\n}\n\n.arkme-redesign-overlays {\n z-index: 20;\n pointer-events: none;\n position: absolute;\n inset: 0;\n}\n\n.arkme-redesign-overlays > * {\n pointer-events: auto;\n}\n\n.arkme-workspace-dialog-backdrop {\n z-index: 60;\n backdrop-filter: blur(2px);\n background: #181b2238;\n place-items: center;\n padding: 28px;\n display: grid;\n position: absolute;\n inset: 0;\n}\n\n.arkme-workspace-dialog {\n background: #fff;\n border: 1px solid #dddfe4;\n border-radius: 18px;\n grid-template-rows: auto auto minmax(0, 1fr) auto;\n width: min(640px, 100%);\n height: min(620px, 100%);\n min-height: 420px;\n display: grid;\n overflow: hidden;\n box-shadow: 0 24px 70px #191c232e;\n}\n\n.arkme-workspace-dialog > header {\n justify-content: space-between;\n align-items: flex-start;\n gap: 18px;\n padding: 22px 24px 16px;\n display: flex;\n}\n\n.arkme-workspace-dialog > header span {\n color: #8b8e96;\n font-size: 10px;\n}\n\n.arkme-workspace-dialog > header h2 {\n margin: 5px 0 0;\n font-size: 19px;\n font-weight: 600;\n}\n\n.arkme-workspace-dialog > header > button {\n border-radius: 9px;\n place-items: center;\n width: 32px;\n height: 32px;\n display: grid;\n}\n\n.arkme-workspace-dialog > nav {\n border-top: 1px solid #ececef;\n border-bottom: 1px solid #ececef;\n align-items: center;\n gap: 2px;\n min-height: 42px;\n padding: 0 22px;\n display: flex;\n overflow-x: auto;\n}\n\n.arkme-workspace-dialog > nav > span {\n white-space: nowrap;\n color: #9a9da5;\n align-items: center;\n gap: 2px;\n display: inline-flex;\n}\n\n.arkme-workspace-dialog > nav button {\n color: #666a73;\n border-radius: 8px;\n align-items: center;\n gap: 5px;\n height: 30px;\n padding: 0 7px;\n font-size: 11px;\n display: inline-flex;\n}\n\n.arkme-workspace-directory-list {\n min-height: 0;\n padding: 10px 14px;\n overflow-y: auto;\n}\n\n.arkme-workspace-directory-list > button {\n text-align: left;\n border-radius: 11px;\n grid-template-columns: 34px minmax(0, 1fr) 18px;\n align-items: center;\n gap: 9px;\n width: 100%;\n height: 48px;\n padding: 0 11px;\n display: grid;\n}\n\n.arkme-workspace-directory-list > button:hover {\n background: #f5f5f7;\n}\n\n.arkme-workspace-directory-list > button > span {\n color: #636873;\n border: 1px solid #e5e6e9;\n border-radius: 9px;\n place-items: center;\n width: 32px;\n height: 32px;\n display: grid;\n}\n\n.arkme-workspace-directory-list strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n font-weight: 500;\n overflow: hidden;\n}\n\n.arkme-workspace-dialog-status, .arkme-workspace-dialog-error {\n color: #8c9098;\n text-align: center;\n padding: 54px 16px;\n font-size: 12px;\n}\n\n.arkme-workspace-dialog-error {\n color: #b94b4b;\n}\n\n.arkme-workspace-dialog > footer {\n border-top: 1px solid #e8e9ec;\n justify-content: space-between;\n align-items: center;\n gap: 18px;\n min-height: 72px;\n padding: 12px 18px;\n display: flex;\n}\n\n.arkme-workspace-dialog-back {\n color: #696d76;\n align-items: center;\n gap: 6px;\n height: 36px;\n padding: 0 10px;\n font-size: 11px;\n display: inline-flex;\n}\n\n.arkme-workspace-dialog > footer > div {\n align-items: center;\n gap: 12px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-workspace-dialog > footer small {\n white-space: nowrap;\n text-overflow: ellipsis;\n color: #92959d;\n max-width: 280px;\n font-size: 9px;\n overflow: hidden;\n}\n\n.arkme-workspace-dialog > footer > div > button {\n color: #fff;\n background: #20232d;\n border-radius: 10px;\n flex: none;\n height: 38px;\n padding: 0 17px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.arkme-workspace-dialog button:disabled {\n opacity: .48;\n cursor: default;\n}\n\n.arkme-redesign-placeholder {\n color: #858992;\n text-align: center;\n place-content: center;\n justify-items: center;\n width: 100%;\n height: 100%;\n display: grid;\n}\n\n.arkme-redesign-placeholder > span {\n color: #555a64;\n border: 1px solid #e1e2e5;\n border-radius: 14px;\n place-items: center;\n width: 48px;\n height: 48px;\n display: grid;\n}\n\n.arkme-redesign-placeholder h1 {\n color: #3e424b;\n margin: 16px 0 7px;\n font-size: 18px;\n}\n\n.arkme-redesign-placeholder p {\n margin: 0;\n font-size: 12px;\n}\n\nbody[data-ds-dark-theme] [data-arkme-workspace] {\n --arkme-line: var(--dsw-alias-border-l1);\n --arkme-muted: var(--dsw-alias-label-tertiary);\n --arkme-soft: var(--dsw-alias-bg-layer-2);\n --arkme-focus: var(--dsw-alias-state-business-primary);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"], body[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] {\n background: var(--dsw-specific-sidebar-fill) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-brand\"] {\n box-shadow: none;\n background: none !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-workspace] [data-arkme-theme-image=\"light\"] {\n display: none !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-workspace] [data-arkme-theme-image=\"dark\"] {\n display: block !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] > div {\n border-color: var(--dsw-alias-border-l1) !important;\n background: var(--dsw-alias-bg-layer-1) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] {\n background: var(--dsw-alias-bg-base) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] .arkme-conversation-surface, body[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] .arkme-conversation-composer {\n background: var(--dsw-alias-bg-base) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] div:has( > input[aria-label=\"搜索\"]) {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] button:hover {\n background: var(--dsw-alias-interactive-bg-hover) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] button[aria-current=\"page\"] {\n background: var(--dsw-alias-interactive-bg-active) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] button[aria-current=\"page\"] > span[aria-hidden=\"true\"] {\n background: var(--dsw-alias-state-business-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"], body[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"], body[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] [aria-label=\"Arkme 会话列表\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] {\n background: var(--dsw-alias-bg-base) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] label:has( > input[aria-label=\"搜索对话或消息\"]), body[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] button[aria-label=\"新任务\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] label:has( > input[aria-label=\"搜索对话或消息\"]), body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] button[aria-label=\"新任务\"] {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] [role=\"treeitem\"][aria-selected=\"true\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] [role=\"treeitem\"][aria-selected=\"true\"] {\n background: var(--dsw-alias-interactive-bg-active) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] [role=\"status\"][aria-label$=\"个人测试版\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] [role=\"status\"][aria-label$=\"个人测试版\"] {\n background: var(--dsw-alias-bg-layer-2) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"] .arkme-conversation-composer {\n background: var(--dsw-alias-bg-base) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-recordings-page [aria-label=\"全天候录音操作\"] > div > button, body[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"] [aria-label=\"全天候录音操作\"] > div > button {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-button-elevated-fill) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-recordings-page [aria-label=\"全天候录音操作\"] > div > button:first-child, body[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"] [aria-label=\"全天候录音操作\"] > div > button:first-child {\n border-color: var(--dsw-alias-button-primary-fill) !important;\n background: var(--dsw-alias-button-primary-fill) !important;\n color: var(--dsw-alias-label-primary-inverted) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-update-popover, body[data-ds-dark-theme] .arkme-update-capsule {\n border-color: var(--dsw-alias-border-l1);\n background: color-mix(in srgb, var(--dsw-alias-bg-base) 94%, transparent);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-update-popover-heading h2, body[data-ds-dark-theme] .arkme-update-release-notes strong, body[data-ds-dark-theme] .arkme-update-capsule-copy strong {\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-update-popover-heading span, body[data-ds-dark-theme] .arkme-update-popover-summary, body[data-ds-dark-theme] .arkme-update-release-notes small, body[data-ds-dark-theme] .arkme-update-capsule-copy small {\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-update-release-notes, body[data-ds-dark-theme] .arkme-update-release-notes > div + div {\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-update-later, body[data-ds-dark-theme] .arkme-update-progress, body[data-ds-dark-theme] .arkme-update-rail:not(.is-available) {\n background: var(--dsw-alias-fill-l1);\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) > div > section[aria-label=\"客户端日历\"], body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) > div > section[aria-label=\"当天内容\"] {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-bg-layer-1) !important;\n color: var(--dsw-alias-label-primary) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) > div > section[aria-label=\"客户端日历\"] > span[aria-hidden] {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-bg-layer-1) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] > header button, body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[aria-label*=\"记录\"] {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] > div > span {\n color: var(--dsw-alias-label-tertiary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"false\"][aria-label*=\"条记录\"] > span:last-child {\n background: var(--dsw-alias-bg-layer-2) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"true\"], body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"true\"] > span {\n color: var(--dsw-alias-label-primary-inverted) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"true\"] > span:last-child {\n color: var(--dsw-alias-label-primary-inverted) !important;\n background: none !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article > div > div:last-child {\n border-color: var(--dsw-alias-border-l1) !important;\n background: var(--dsw-alias-bg-layer-2) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article h3, body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article p {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article time, body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article span {\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-root, body[data-ds-dark-theme] .arkme-redesign-chat-panel, body[data-ds-dark-theme] .arkme-redesign-content, body[data-ds-dark-theme] .arkme-redesign-feature-page, body[data-ds-dark-theme] .arkme-redesign-recordings-page, body[data-ds-dark-theme] .arkme-redesign-plugins-page, body[data-ds-dark-theme] .arkme-redesign-model-settings, body[data-ds-dark-theme] .arkme-redesign-details {\n background: var(--dsw-alias-bg-base);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-native-desktop .arkme-redesign-root:before {\n background: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-specific-sidebar-fill);\n box-shadow: var(--dsw-shadow-lv2);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button, body[data-ds-dark-theme] .arkme-redesign-rail-footer > button, body[data-ds-dark-theme] .arkme-redesign-profile-menu button, body[data-ds-dark-theme] .arkme-redesign-task-list > button, body[data-ds-dark-theme] .arkme-redesign-task-first, body[data-ds-dark-theme] .arkme-workspace-dialog > nav button, body[data-ds-dark-theme] .arkme-workspace-dialog-back, body[data-ds-dark-theme] .arkme-redesign-placeholder > span {\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button:hover, body[data-ds-dark-theme] .arkme-redesign-rail-footer > button:hover, body[data-ds-dark-theme] .arkme-redesign-profile-menu button:hover, body[data-ds-dark-theme] .arkme-redesign-chat-search:hover, body[data-ds-dark-theme] .arkme-redesign-task-section-title button:hover, body[data-ds-dark-theme] .arkme-redesign-task-list > button:hover, body[data-ds-dark-theme] .arkme-redesign-task-first:hover, body[data-ds-dark-theme] .arkme-extension-toolbar > button:hover, body[data-ds-dark-theme] button.arkme-redesign-setting-row:hover, body[data-ds-dark-theme] a.arkme-redesign-setting-row:hover, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button:hover, body[data-ds-dark-theme] .arkme-redesign-round-tool:hover, body[data-ds-dark-theme] .arkme-workspace-directory-list > button:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button.is-active, body[data-ds-dark-theme] .arkme-redesign-rail-footer > button.is-active, body[data-ds-dark-theme] .arkme-redesign-task-list > button.is-selected {\n background: var(--dsw-alias-interactive-bg-active);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button.is-active:before {\n background: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-footer, body[data-ds-dark-theme] .arkme-redesign-profile-menu, body[data-ds-dark-theme] .arkme-redesign-task-section, body[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-header, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-history button, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-quick button, body[data-ds-dark-theme] .arkme-redesign-settings-group h2, body[data-ds-dark-theme] .arkme-redesign-setting-row, body[data-ds-dark-theme] .arkme-account-info-row, body[data-ds-dark-theme] .arkme-redesign-starters > button, body[data-ds-dark-theme] .arkme-redesign-details, body[data-ds-dark-theme] .arkme-workspace-dialog > nav, body[data-ds-dark-theme] .arkme-workspace-dialog > footer {\n border-color: var(--dsw-alias-border-l1) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-profile-popover, body[data-ds-dark-theme] .arkme-workspace-dialog {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-specific-menu);\n box-shadow: var(--dsw-shadow-lv3);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-profile-head small, body[data-ds-dark-theme] .arkme-redesign-profile-menu small, body[data-ds-dark-theme] .arkme-redesign-profile-menu button > svg:last-child, body[data-ds-dark-theme] .arkme-redesign-task-section-title, body[data-ds-dark-theme] .arkme-redesign-task-copy small, body[data-ds-dark-theme] .arkme-account-profile-qr, body[data-ds-dark-theme] .arkme-redesign-feature-page > header p, body[data-ds-dark-theme] .arkme-redesign-feature-page > header span, body[data-ds-dark-theme] .arkme-redesign-search-page input[aria-label=\"搜索\"]:not(:focus)::placeholder, body[data-ds-dark-theme] .arkme-redesign-settings-profile p, body[data-ds-dark-theme] .arkme-redesign-settings-group h2, body[data-ds-dark-theme] .arkme-redesign-setting-summary, body[data-ds-dark-theme] .arkme-account-info-copy > small, body[data-ds-dark-theme] .arkme-account-info-action, body[data-ds-dark-theme] .arkme-account-info-row > svg, body[data-ds-dark-theme] .arkme-account-info-icon, body[data-ds-dark-theme] .arkme-redesign-setting-row > svg, body[data-ds-dark-theme] .arkme-redesign-hero-input textarea::placeholder, body[data-ds-dark-theme] .arkme-redesign-starters small, body[data-ds-dark-theme] .arkme-workspace-dialog > header span, body[data-ds-dark-theme] .arkme-workspace-dialog > nav > span, body[data-ds-dark-theme] .arkme-workspace-dialog-status, body[data-ds-dark-theme] .arkme-workspace-dialog > footer small, body[data-ds-dark-theme] .arkme-redesign-placeholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-chat-search, body[data-ds-dark-theme] .arkme-extension-toolbar label, body[data-ds-dark-theme] .arkme-extension-toolbar > button, body[data-ds-dark-theme] .arkme-redesign-settings-group, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button, body[data-ds-dark-theme] .arkme-redesign-source-button, body[data-ds-dark-theme] .arkme-redesign-round-tool, body[data-ds-dark-theme] .arkme-redesign-starter-icon, body[data-ds-dark-theme] .arkme-workspace-directory-list > button > span, body[data-ds-dark-theme] .arkme-redesign-placeholder > span {\n border-color: var(--dsw-alias-border-l2) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-chat-search, body[data-ds-dark-theme] .arkme-extension-toolbar label {\n color: var(--dsw-alias-label-tertiary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-extension-toolbar input, body[data-ds-dark-theme] .arkme-redesign-settings-profile h1, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button, body[data-ds-dark-theme] .arkme-redesign-task-start h1, body[data-ds-dark-theme] .arkme-redesign-hero-input textarea, body[data-ds-dark-theme] .arkme-redesign-starter-icon, body[data-ds-dark-theme] .arkme-redesign-placeholder h1 {\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-list, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button, body[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-card {\n background: var(--dsw-alias-bg-layer-1) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-settings-surface, body[data-ds-dark-theme] .arkme-redesign-settings-group {\n color: var(--dsw-alias-label-primary);\n background: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-account-dialog {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-specific-menu);\n color: var(--dsw-alias-label-primary);\n box-shadow: var(--dsw-shadow-lv3);\n}\n\nbody[data-ds-dark-theme] .arkme-account-dialog > header, body[data-ds-dark-theme] .arkme-account-qr-card {\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-account-qr-card, body[data-ds-dark-theme] .arkme-account-form input, body[data-ds-dark-theme] .arkme-account-code-row button, body[data-ds-dark-theme] .arkme-account-dialog-actions button {\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-border-l2);\n}\n\nbody[data-ds-dark-theme] .arkme-account-dialog-actions button[type=\"submit\"], body[data-ds-dark-theme] .arkme-account-dialog-actions button:last-child {\n border-color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-base);\n}\n\nbody[data-ds-dark-theme] .arkme-account-rule, body[data-ds-dark-theme] .arkme-account-qr-card span, body[data-ds-dark-theme] .arkme-account-qr-card small, body[data-ds-dark-theme] .arkme-account-form label {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-surface, body[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-center-embedded > section {\n background: var(--dsw-alias-bg-base) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-composer-inner, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-box {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n color: var(--dsw-alias-label-primary) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"] {\n box-shadow: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"][data-arkme-composer-focused=\"true\"] {\n background: color-mix(in srgb, var(--dsw-alias-bg-base, #fff) 97%, #000) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-greeting img {\n filter: invert() hue-rotate(180deg);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-hero-input {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n color: var(--dsw-alias-label-primary) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-hero-input textarea {\n background: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-source-button, body[data-ds-dark-theme] .arkme-redesign-round-tool, body[data-ds-dark-theme] .arkme-redesign-starter-icon {\n background: var(--dsw-alias-button-elevated-fill) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-history button, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-quick button {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-card {\n border-color: var(--dsw-alias-border-l1) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-card:hover {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-interactive-bg-hover) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-section:focus-within .arkme-redesign-task-list {\n box-shadow: var(--dsw-shadow-lv2);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-settings-error {\n background: var(--dsw-alias-interactive-bg-hover-danger);\n color: var(--dsw-alias-state-error-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-page-header h1, body[data-ds-dark-theme] .arkme-remote-section-header h2, body[data-ds-dark-theme] .arkme-remote-allow-row strong, body[data-ds-dark-theme] .arkme-remote-device-row strong, body[data-ds-dark-theme] .arkme-remote-name-row strong, body[data-ds-dark-theme] .arkme-remote-dialog, body[data-ds-dark-theme] .arkme-remote-pairing-code {\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-section-header p, body[data-ds-dark-theme] .arkme-remote-page-header p, body[data-ds-dark-theme] .arkme-remote-allow-row span, body[data-ds-dark-theme] .arkme-remote-device-row span, body[data-ds-dark-theme] .arkme-remote-name-row small, body[data-ds-dark-theme] .arkme-remote-dialog header p, body[data-ds-dark-theme] .arkme-remote-pairing-display > p, body[data-ds-dark-theme] .arkme-remote-dialog-note, body[data-ds-dark-theme] .arkme-remote-empty-row {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-card, body[data-ds-dark-theme] .arkme-remote-settings-dialog, body[data-ds-dark-theme] .arkme-remote-dialog, body[data-ds-dark-theme] .arkme-remote-pairing-display, body[data-ds-dark-theme] .arkme-remote-rename input {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-allow-row, body[data-ds-dark-theme] .arkme-remote-device-row, body[data-ds-dark-theme] .arkme-remote-rename, body[data-ds-dark-theme] .arkme-remote-page-header {\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-close, body[data-ds-dark-theme] .arkme-remote-icon-button, body[data-ds-dark-theme] .arkme-remote-dialog-close, body[data-ds-dark-theme] .arkme-remote-pairing-tools button, body[data-ds-dark-theme] .arkme-remote-name-row {\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-close:hover, body[data-ds-dark-theme] .arkme-remote-icon-button:hover, body[data-ds-dark-theme] .arkme-remote-dialog-close:hover, body[data-ds-dark-theme] .arkme-remote-pairing-tools button:hover, body[data-ds-dark-theme] .arkme-remote-name-row:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-add-button, body[data-ds-dark-theme] .arkme-remote-rename button[type=\"submit\"], body[data-ds-dark-theme] .arkme-remote-pairing-expired button {\n background: var(--dsw-alias-button-primary-fill);\n color: var(--dsw-alias-label-primary-inverted);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-device-row > button, body[data-ds-dark-theme] .arkme-remote-rename button {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-switch[aria-checked=\"true\"] {\n background: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-pairing-tabs {\n background: var(--dsw-alias-bg-layer-2);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-pairing-tabs button {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-pairing-tabs button[aria-selected=\"true\"] {\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-dialog-backdrop, body[data-ds-dark-theme] .arkme-remote-dialog-backdrop {\n background: #07090d8f;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-setting-row > strong.is-danger, body[data-ds-dark-theme] .arkme-redesign-task-error, body[data-ds-dark-theme] .arkme-workspace-dialog-error {\n color: var(--dsw-alias-state-error-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-state.is-complete > i {\n background: var(--dsw-alias-state-success-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-state.is-complete > i:after {\n background: var(--dsw-alias-state-success-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-matrix i, body[data-ds-dark-theme] .arkme-redesign-rail-primary button.is-active:before {\n background: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-hero-input:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: 0 0 0 3px var(--dsw-alias-state-business-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-starters > button:hover strong {\n color: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-send-task, body[data-ds-dark-theme] .arkme-workspace-dialog > footer > div > button {\n background: var(--dsw-alias-button-primary-fill) !important;\n color: var(--dsw-alias-label-primary-inverted) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-send-task:disabled {\n background: var(--dsw-alias-button-elevated-fill) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-workspace-dialog-backdrop {\n background: var(--dsw-alias-bg-mask-1);\n}\n\n@media (width <= 1024px) {\n .arkme-redesign-chat-panel {\n width: 264px;\n left: 82px;\n }\n\n .arkme-redesign-content {\n left: 82px;\n }\n\n .arkme-redesign-content.has-panel {\n left: 346px;\n }\n\n .arkme-redesign-rail {\n left: 12px;\n }\n\n .arkme-redesign-starters > button {\n padding: 0 10px;\n }\n\n .arkme-redesign-feature-page {\n padding-left: 30px;\n padding-right: 30px;\n }\n}\n\n@media (width <= 820px) {\n .arkme-redesign-chat-panel {\n display: none;\n }\n\n .arkme-redesign-content.has-panel {\n left: 82px;\n }\n\n .arkme-redesign-task-start {\n padding: 28px;\n }\n\n .arkme-redesign-starters {\n grid-template-columns: 1fr;\n gap: 6px;\n }\n\n .arkme-redesign-starters > button {\n border-right: 0;\n }\n\n .arkme-voiceprint-relationships {\n grid-template-columns: minmax(0, 1fr) !important;\n gap: 28px !important;\n }\n\n .arkme-voiceprint-outbound {\n border-left: 0 !important;\n border-top: 1px solid var(--dsw-alias-border-subtle, #e6e7eb) !important;\n padding-top: 28px !important;\n padding-left: 0 !important;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-redesign-task-matrix i {\n opacity: .6;\n animation: none;\n }\n\n .arkme-update-rail.is-downloading svg, .arkme-update-popover, .arkme-update-capsule, .arkme-update-progress.is-indeterminate span {\n animation: none;\n }\n\n .arkme-update-rail, .arkme-update-progress span {\n transition: none;\n }\n}\n\n.arkme-contact-directory, .arkme-directory-detail-pane {\n box-sizing: border-box;\n min-width: 0;\n height: 100%;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #202124);\n font-size: 13px;\n overflow: hidden;\n}\n\n[data-arkme-directory-mode=\"contacts\"] {\n background: var(--dsw-specific-sidebar-fill, #fff) !important;\n border-left-color: var(--dsw-alias-border-l1, #ececef) !important;\n}\n\n.arkme-contact-directory {\n overflow-wrap: anywhere;\n padding: 8px 6px 18px;\n overflow-y: auto;\n}\n\n.arkme-directory-detail-pane {\n overflow: hidden;\n}\n\n.arkme-contact-directory button, .arkme-directory-detail-pane button {\n appearance: none;\n box-sizing: border-box;\n font: inherit;\n color: inherit;\n border: 0;\n margin: 0;\n}\n\n.arkme-contact-directory-section {\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n min-width: 0;\n padding: 2px 0 5px;\n}\n\n.arkme-contact-directory-section-header {\n text-align: left;\n cursor: pointer;\n background: none;\n border-radius: 10px;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-width: 0;\n min-height: 42px;\n padding: 0 10px;\n display: flex;\n}\n\n.arkme-contact-directory-section-title {\n align-items: center;\n gap: 6px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-contact-directory-section-title strong {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 650;\n overflow: hidden;\n}\n\n.arkme-contact-directory-caret {\n width: 14px;\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n transform-origin: center;\n flex: none;\n font-size: 18px;\n line-height: 1;\n transition: transform .16s;\n}\n\n.arkme-contact-directory-section-header[aria-expanded=\"true\"] .arkme-contact-directory-caret {\n transform: rotate(90deg);\n}\n\n.arkme-contact-directory-section-header:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f6f6f7);\n}\n\n.arkme-contact-directory-section-body {\n min-width: 0;\n padding: 0 0 5px;\n}\n\n.arkme-contact-directory-list {\n gap: 1px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-directory-count {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n font-variant-numeric: tabular-nums;\n flex: none;\n font-size: 11px;\n}\n\n.arkme-contact-directory-row {\n text-align: left;\n cursor: pointer;\n background: none;\n border-radius: 13px;\n align-items: center;\n gap: 10px;\n width: 100%;\n min-width: 0;\n min-height: 52px;\n margin: 1px 0;\n padding: 7px 10px;\n display: flex;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row img {\n object-fit: cover;\n border-radius: 50%;\n flex: none;\n width: 38px;\n height: 38px;\n}\n\n.arkme-contact-directory-row.is-static {\n cursor: default;\n}\n\n.arkme-contact-directory-row.is-selected {\n background: var(--dsw-alias-interactive-bg-active, #eef0f4);\n}\n\n.arkme-contact-directory-row:not(.is-static):hover {\n background: var(--dsw-alias-interactive-bg-hover, #f6f6f7);\n}\n\n.arkme-contact-directory-avatar {\n border-radius: 50%;\n flex: none;\n place-items: center;\n width: 38px;\n height: 38px;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row-copy {\n flex: 1;\n align-content: center;\n min-width: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row-copy strong {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 600;\n line-height: 18px;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row-copy small {\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 11px;\n line-height: 16px;\n overflow: hidden;\n}\n\n.arkme-contact-directory-letter {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n padding: 8px 10px 2px;\n font-size: 11px;\n font-weight: 600;\n line-height: 16px;\n}\n\n.arkme-contact-directory-alphabetical, .arkme-contact-directory-letter-group {\n min-width: 0;\n}\n\n.arkme-contact-directory-status, .arkme-contact-directory-warning {\n color: var(--dsw-alias-label-secondary, var(--arkme-muted));\n overflow-wrap: anywhere;\n margin: 3px 8px;\n padding: 7px 9px;\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-contact-directory-warning {\n color: var(--dsw-alias-state-warning-primary, #b45309);\n background: var(--dsw-alias-state-warning-tertiary, #fff7ed);\n border-radius: 9px;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n.arkme-contact-directory-warning button {\n color: inherit;\n cursor: pointer;\n background: none;\n flex: none;\n padding: 2px 4px;\n font-weight: 600;\n}\n\n.arkme-contact-directory-more {\n text-align: center;\n cursor: pointer;\n background: none;\n border-radius: 9px;\n width: calc(100% - 16px);\n min-height: 32px;\n padding: 6px 8px;\n color: var(--dsw-alias-state-business-primary, #4f5fbf) !important;\n margin: 3px 8px !important;\n}\n\n.arkme-contact-directory-empty {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n padding: 14px 12px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-directory-detail-empty {\n background: var(--dsw-alias-bg-base, #fff);\n place-items: center;\n min-width: 0;\n height: 100%;\n min-height: 0;\n display: grid;\n}\n\n.arkme-directory-detail-logo {\n object-fit: contain;\n opacity: .9;\n width: 96px;\n height: 96px;\n}\n\n.arkme-contact-detail, .arkme-contact-profile, .arkme-contact-world-card, .arkme-unmarked-speaker-summary, .arkme-unmarked-speaker-audio, .arkme-unmarked-speaker-choice {\n overflow-wrap: anywhere;\n min-width: 0;\n}\n\n.arkme-contact-detail {\n background: var(--dsw-alias-bg-base, #fff);\n grid-template-rows: auto minmax(0, 1fr);\n height: 100%;\n min-height: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-profile {\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n padding: 32px clamp(24px, 5vw, 56px);\n}\n\n.arkme-contact-profile-main {\n grid-template-columns: 72px minmax(0, 1fr) auto;\n align-items: center;\n gap: 18px;\n width: min(100%, 760px);\n margin: 0 auto;\n display: grid;\n}\n\n.arkme-contact-profile-avatar {\n border-radius: 50%;\n place-items: center;\n width: 72px;\n height: 72px;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-profile-identity {\n gap: 8px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-profile-name {\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0;\n font-size: 20px;\n font-weight: 650;\n line-height: 28px;\n display: block;\n overflow: hidden;\n}\n\n.arkme-contact-profile-fields {\n gap: 4px;\n margin: 0;\n display: grid;\n}\n\n.arkme-contact-profile-fields > div {\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #68707c);\n gap: 4px;\n font-size: 12px;\n line-height: 18px;\n display: flex;\n}\n\n.arkme-contact-profile-fields dt, .arkme-contact-profile-fields dd {\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0;\n overflow: hidden;\n}\n\n.arkme-contact-profile-fields dt {\n flex: none;\n}\n\n[data-arkme-workspace] .arkme-contact-profile-message {\n background: var(--dsw-alias-button-primary-fill, #5667cc);\n cursor: pointer;\n border-radius: 10px;\n min-height: 36px;\n padding: 0 16px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary-inverted, #fff) !important;\n}\n\n.arkme-contact-profile-message:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-contact-profile-error, .arkme-contact-profile-message-error {\n max-width: 760px;\n color: var(--dsw-alias-state-error-primary, #b42318);\n overflow-wrap: anywhere;\n margin: 0 auto;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-contact-profile-error {\n background: var(--dsw-alias-state-error-tertiary, #fff1f0);\n border-radius: 10px;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n display: flex;\n}\n\n.arkme-contact-profile-status {\n max-width: 760px;\n color: var(--dsw-alias-label-secondary, var(--arkme-muted));\n margin: 0 auto;\n padding: 24px 0;\n font-size: 12px;\n}\n\n.arkme-team-detail {\n background: var(--dsw-alias-bg-base, #fff);\n grid-template-rows: auto minmax(0, 1fr);\n min-width: 0;\n height: 100%;\n min-height: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-team-detail-header {\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n min-width: 0;\n padding: 32px clamp(24px, 5vw, 56px);\n}\n\n.arkme-team-detail-header-main {\n grid-template-columns: 72px minmax(0, 1fr) auto;\n align-items: center;\n gap: 18px;\n width: min(100%, 760px);\n min-width: 0;\n margin: 0 auto;\n display: grid;\n}\n\n.arkme-team-detail-glyph {\n background: var(--dsw-alias-state-business-tertiary, #eef0ff);\n width: 72px;\n height: 72px;\n color: var(--dsw-alias-state-business-primary, #4f5fbf);\n border-radius: 20px;\n place-items: center;\n font-size: 20px;\n font-weight: 700;\n line-height: 1;\n display: grid;\n}\n\n.arkme-team-detail-summary {\n gap: 7px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-team-detail-header h1 {\n text-overflow: ellipsis;\n white-space: nowrap;\n letter-spacing: -.02em;\n margin: 0;\n font-size: 20px;\n font-weight: 650;\n line-height: 28px;\n overflow: hidden;\n}\n\n.arkme-team-detail-meta {\n flex-wrap: wrap;\n align-items: center;\n gap: 7px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-team-detail-public-id {\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 12px;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-team-role-badge, .arkme-team-member-role {\n background: var(--dsw-alias-bg-layer-2, #f2f3f5);\n color: var(--dsw-alias-label-secondary, #68707c);\n border-radius: 999px;\n flex: none;\n font-size: 11px;\n font-weight: 600;\n line-height: 20px;\n}\n\n.arkme-team-role-badge {\n padding: 0 8px;\n}\n\n.arkme-team-detail-count {\n min-width: 58px;\n color: var(--dsw-alias-label-secondary, #68707c);\n justify-items: end;\n gap: 1px;\n display: grid;\n}\n\n.arkme-team-detail-count strong {\n color: var(--dsw-alias-label-primary, #202124);\n font-variant-numeric: tabular-nums;\n font-size: 21px;\n font-weight: 680;\n line-height: 24px;\n}\n\n.arkme-team-detail-count span {\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-team-members {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-subtle, #f7f7f8);\n min-width: 0;\n min-height: 0;\n padding: 22px clamp(24px, 5vw, 56px) 32px;\n overflow-y: auto;\n}\n\n.arkme-team-members-container {\n width: min(100%, 760px);\n min-width: 0;\n margin: 0 auto;\n}\n\n.arkme-team-members h2 {\n margin: 0 0 13px;\n font-size: 15px;\n font-weight: 650;\n line-height: 22px;\n}\n\n.arkme-team-member-list {\n border: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 14px;\n min-width: 0;\n overflow: hidden;\n box-shadow: 0 8px 24px #161b2309;\n}\n\n.arkme-team-member-row {\n box-sizing: border-box;\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n grid-template-columns: 40px minmax(0, 1fr) auto;\n align-items: center;\n gap: 12px;\n min-width: 0;\n min-height: 64px;\n padding: 11px 14px;\n display: grid;\n}\n\n.arkme-team-member-row:not(:has( ~ .arkme-team-member-row)) {\n border-bottom: 0;\n}\n\n.arkme-team-member-avatar {\n border-radius: 50%;\n place-items: center;\n width: 40px;\n height: 40px;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-team-member-copy {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-team-member-copy strong, .arkme-team-member-copy small {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.arkme-team-member-copy strong {\n font-size: 14px;\n font-weight: 620;\n line-height: 20px;\n}\n\n.arkme-team-member-copy small {\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 12px;\n line-height: 17px;\n}\n\n.arkme-team-member-role {\n padding: 0 9px;\n}\n\n.arkme-team-role-badge[data-team-role=\"owner\"], .arkme-team-role-badge[data-team-role=\"admin\"], .arkme-team-member-role[data-team-member-role=\"owner\"], .arkme-team-member-role[data-team-member-role=\"admin\"] {\n background: var(--dsw-alias-state-business-tertiary, #eef0ff);\n color: var(--dsw-alias-state-business-primary, #4f5fbf);\n}\n\n.arkme-team-detail-status {\n min-height: 100%;\n color: var(--dsw-alias-label-secondary, #68707c);\n justify-content: center;\n align-items: center;\n gap: 12px;\n display: flex;\n}\n\n.arkme-team-detail-status.is-error, .arkme-team-member-more-error {\n color: var(--dsw-alias-state-error-primary, #b42318);\n}\n\n.arkme-team-detail-status button, .arkme-team-member-more {\n border: 1px solid var(--dsw-alias-border-l2, var(--arkme-line));\n background: var(--dsw-alias-button-elevated-fill, #fff);\n cursor: pointer;\n border-radius: 9px;\n min-height: 34px;\n padding: 0 12px;\n}\n\n.arkme-team-member-more {\n width: calc(100% - 24px);\n color: var(--dsw-alias-state-business-primary, #4f5fbf) !important;\n margin: 12px !important;\n}\n\n.arkme-team-member-more:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-team-member-more-error {\n padding: 12px 14px 0;\n font-size: 12px;\n}\n\n.arkme-contact-world {\n min-height: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-detail > .arkme-contact-world {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-subtle, #f7f7f8);\n padding: 22px clamp(20px, 4vw, 52px) 28px;\n}\n\n.arkme-contact-world-container {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 18px;\n flex-direction: column;\n width: min(100%, 980px);\n min-width: 0;\n height: 100%;\n min-height: 0;\n margin: 0 auto;\n display: flex;\n overflow-y: auto;\n box-shadow: 0 16px 48px #161b230f;\n}\n\n.arkme-contact-world-title {\n box-sizing: border-box;\n width: min(100%, 760px);\n margin: 0 auto;\n padding: 22px 28px 10px;\n font-size: 15px;\n font-weight: 650;\n line-height: 22px;\n}\n\n.arkme-contact-world-list {\n box-sizing: border-box;\n align-content: start;\n gap: 30px;\n width: min(100%, 760px);\n min-height: 0;\n margin: 0 auto;\n padding: 28px 28px 42px;\n display: grid;\n}\n\n.arkme-contact-world-year {\n gap: 24px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-world-year > h2 {\n letter-spacing: -.04em;\n margin: 0;\n font-size: 28px;\n font-weight: 750;\n line-height: 36px;\n}\n\n.arkme-contact-world-entry {\n gap: 8px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-world-diary {\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 13px;\n font-weight: 500;\n line-height: 19px;\n}\n\n.arkme-contact-world-entry > .arkme-contact-world-time {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n align-items: center;\n gap: 8px;\n font-size: 11px;\n line-height: 16px;\n display: flex;\n}\n\n.arkme-contact-world-entry > .arkme-contact-world-time span {\n font-size: 17px;\n line-height: 10px;\n}\n\n.arkme-contact-world-card {\n border: 1px dashed var(--dsw-alias-border-l2, #d9dce2);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 14px;\n gap: 10px;\n padding: 15px 16px;\n display: grid;\n}\n\n.arkme-contact-world-card-header {\n grid-template-columns: 36px minmax(0, 1fr) auto;\n align-items: center;\n gap: 9px;\n display: grid;\n}\n\n.arkme-contact-world-author {\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n font-size: 13px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.arkme-contact-world-time {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n flex: none;\n font-size: 11px;\n}\n\n.arkme-contact-world-headline {\n margin: 2px 0 0;\n font-size: 14px;\n line-height: 20px;\n}\n\n.arkme-contact-world-text {\n color: var(--dsw-alias-label-secondary, #68707c);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.arkme-contact-world-images {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 6px;\n width: 100%;\n min-width: 0;\n max-width: 620px;\n display: grid;\n}\n\n.arkme-contact-world-image {\n aspect-ratio: 1;\n object-fit: cover;\n border-radius: 11px;\n width: 100%;\n display: block;\n}\n\n.arkme-contact-world-image-error, .arkme-contact-world-image-loading {\n aspect-ratio: 1;\n background: var(--dsw-alias-bg-layer-2, var(--arkme-soft));\n width: 100%;\n min-width: 0;\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n border-radius: 11px;\n place-items: center;\n display: grid;\n}\n\n.arkme-contact-world-tags {\n flex-wrap: wrap;\n gap: 6px;\n display: flex;\n}\n\n.arkme-contact-world-tag {\n background: var(--dsw-alias-bg-layer-2, var(--arkme-soft));\n color: var(--dsw-alias-label-secondary, var(--arkme-muted));\n border-radius: 999px;\n padding: 2px 7px;\n font-size: 11px;\n}\n\n.arkme-contact-world-empty {\n box-sizing: border-box;\n text-align: center;\n flex: 1;\n place-content: center;\n justify-items: center;\n min-height: 240px;\n padding: 36px 20px;\n display: grid;\n}\n\n.arkme-contact-world-empty img {\n width: 140px;\n height: 100px;\n display: block;\n}\n\n.arkme-contact-world-empty p {\n color: var(--dsw-alias-label-secondary, #858992);\n margin: 16px 0 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.arkme-contact-world-error, .arkme-contact-world-status {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n place-self: center;\n padding: 28px 20px;\n font-size: 12px;\n}\n\n.arkme-contact-world-error {\n color: var(--dsw-alias-state-error-primary, #b42318);\n}\n\n.arkme-contact-world-load-more {\n cursor: pointer;\n background: none;\n border-radius: 9px;\n place-self: center;\n min-height: 34px;\n padding: 0 12px;\n color: var(--dsw-alias-state-business-primary, #4f5fbf) !important;\n}\n\n.arkme-contact-world-load-more-status, .arkme-contact-world-load-more-error {\n min-height: 20px;\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n padding: 8px 16px;\n font-size: 11px;\n}\n\n.arkme-contact-world-load-more-error {\n color: var(--dsw-alias-state-error-primary, #b42318);\n}\n\n.arkme-contact-world-page-empty {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n align-self: center;\n padding: 28px 20px;\n font-size: 12px;\n}\n\n.arkme-directory-unmarked-speaker-detail {\n background: var(--dsw-alias-bg-base, #fff);\n min-height: 0;\n padding: clamp(28px, 5vw, 60px);\n overflow-y: auto;\n}\n\n.arkme-unmarked-speaker-token-avatar {\n background: var(--dsw-alias-bg-module-platform, var(--dsw-alias-bg-layer-1, #f1f2f3));\n color: var(--dsw-alias-label-secondary, #666c75);\n letter-spacing: -.02em;\n border-radius: 50%;\n flex: none;\n place-items: center;\n font-weight: 650;\n line-height: 1;\n display: grid;\n}\n\n.arkme-unmarked-speaker-summary {\n box-sizing: border-box;\n background: none;\n border: 0;\n gap: 18px;\n width: min(100%, 720px);\n margin: 0 auto;\n padding: 4px 0 24px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-summary h1, .arkme-unmarked-speaker-summary h2, .arkme-unmarked-speaker-audio h2, .arkme-unmarked-speaker-choice h2 {\n letter-spacing: -.02em;\n margin: 0;\n font-size: 20px;\n font-weight: 680;\n line-height: 28px;\n}\n\n.arkme-unmarked-speaker-identity {\n align-items: center;\n gap: 16px;\n min-width: 0;\n padding: 2px 4px;\n display: flex;\n}\n\n.arkme-unmarked-speaker-identity > div {\n gap: 3px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-identity p {\n color: var(--dsw-alias-label-secondary, #737984);\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-unmarked-speaker-stats {\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #737984);\n flex-wrap: wrap;\n gap: 8px 20px;\n padding: 0 4px;\n font-size: 12px;\n line-height: 19px;\n display: flex;\n}\n\n.arkme-unmarked-speaker-stats span {\n white-space: nowrap;\n position: relative;\n}\n\n.arkme-unmarked-speaker-stats span + span:before {\n content: \"\";\n background: var(--dsw-alias-label-caption, #b3b7bd);\n border-radius: 50%;\n width: 3px;\n height: 3px;\n position: absolute;\n top: 8px;\n left: -11px;\n}\n\n.arkme-unmarked-speaker-stats strong {\n color: var(--dsw-alias-label-primary, #202124);\n font-weight: 650;\n}\n\n.arkme-unmarked-speaker-inference {\n background: var(--dsw-alias-bg-layer-2, #f5f5f6);\n border-radius: 18px;\n grid-template-columns: 40px minmax(0, 1fr);\n align-items: start;\n gap: 12px;\n min-width: 0;\n padding: 18px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-inference-icon, .arkme-unmarked-speaker-action-icon {\n border: 1px solid var(--dsw-alias-border-l1, #e3e4e7);\n background: var(--dsw-alias-bg-layer-1, #fff);\n width: 40px;\n height: 40px;\n color: var(--dsw-alias-label-secondary, #656b75);\n border-radius: 50%;\n place-items: center;\n display: grid;\n}\n\n.arkme-unmarked-speaker-inference-icon svg path, .arkme-unmarked-speaker-action-icon svg path {\n stroke: currentColor;\n stroke-width: 1.5px;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.arkme-unmarked-speaker-inference > div {\n gap: 5px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-inference-label {\n color: var(--dsw-alias-label-secondary, #747983);\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-unmarked-speaker-inference strong {\n color: var(--dsw-alias-label-primary, #202124);\n font-size: 14px;\n font-weight: 650;\n line-height: 21px;\n}\n\n.arkme-unmarked-speaker-inference p {\n color: var(--dsw-alias-label-secondary, #686e78);\n margin: 0;\n font-size: 12px;\n line-height: 20px;\n}\n\n.arkme-unmarked-speaker-actions {\n gap: 10px;\n display: grid;\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-action {\n border: 1px solid var(--dsw-alias-border-l1, #e5e6e8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n width: 100%;\n min-height: 62px;\n color: var(--dsw-alias-label-primary, #202124);\n text-align: left;\n cursor: pointer;\n border-radius: 16px;\n grid-template-columns: 42px minmax(0, 1fr);\n align-items: center;\n gap: 12px;\n padding: 10px 46px 10px 14px;\n font-size: 13px;\n font-weight: 650;\n display: grid;\n position: relative;\n}\n\n.arkme-unmarked-speaker-action:after {\n content: \"›\";\n color: var(--dsw-alias-label-caption, #a7abb2);\n font-size: 22px;\n font-weight: 400;\n position: absolute;\n right: 18px;\n}\n\n.arkme-unmarked-speaker-action:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f7f7f8);\n border-color: var(--dsw-alias-border-l2, #d9dade);\n}\n\n.arkme-unmarked-speaker-summary > [role=\"status\"], .arkme-unmarked-speaker-summary > [role=\"alert\"], .arkme-unmarked-speaker-audio > [role=\"status\"], .arkme-unmarked-speaker-audio > [role=\"alert\"], .arkme-unmarked-speaker-choice > [role=\"status\"], .arkme-unmarked-speaker-choice > [role=\"alert\"] {\n color: var(--dsw-alias-label-secondary, #68707c);\n background: var(--dsw-alias-bg-layer-2, #f5f5f6);\n border-radius: 10px;\n padding: 9px 12px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-unmarked-speaker-summary > [role=\"alert\"], .arkme-unmarked-speaker-audio > [role=\"alert\"], .arkme-unmarked-speaker-choice > [role=\"alert\"] {\n color: var(--dsw-alias-state-error-primary, #b42318);\n background: var(--dsw-alias-state-error-tertiary, #fff1f0);\n}\n\n.arkme-unmarked-speaker-audio, .arkme-unmarked-speaker-choice {\n box-sizing: border-box;\n background: none;\n border: 0;\n gap: 16px;\n width: min(100%, 720px);\n margin: 0 auto;\n padding: 4px 0 28px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-subview-header {\n grid-template-columns: auto 40px minmax(0, 1fr);\n align-items: center;\n gap: 12px;\n min-width: 0;\n padding-bottom: 4px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-subview-header > button {\n min-height: 32px;\n color: var(--dsw-alias-label-secondary, #68707c);\n cursor: pointer;\n background: none;\n border-radius: 9px;\n padding: 0 10px;\n font-size: 11px;\n}\n\n.arkme-unmarked-speaker-subview-header > button:before {\n content: \"‹\";\n vertical-align: -1px;\n margin-right: 4px;\n font-size: 17px;\n}\n\n.arkme-unmarked-speaker-subview-heading {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-subview-heading p {\n color: var(--dsw-alias-label-secondary, #737984);\n margin: 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-unmarked-speaker-segment-list {\n gap: 10px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-segment-card {\n border: 1px solid var(--dsw-alias-border-l1, #e5e6e8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 16px;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 8px 16px;\n min-width: 0;\n padding: 16px 16px 14px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-segment-meta {\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #757b85);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 11px;\n line-height: 17px;\n overflow: hidden;\n}\n\n.arkme-unmarked-speaker-segment-transcript {\n min-width: 0;\n color: var(--dsw-alias-label-primary, #292c34);\n white-space: pre-wrap;\n grid-column: 1;\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-segment-play {\n background: var(--dsw-alias-bg-layer-2, #f4f4f5);\n width: 38px;\n min-width: 38px;\n height: 38px;\n min-height: 38px;\n color: var(--dsw-alias-label-primary, #292c34);\n cursor: pointer;\n border-radius: 50%;\n grid-area: 1 / 2 / span 2;\n align-self: center;\n place-items: center;\n padding: 0;\n display: inline-grid;\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-segment-play:not(:disabled):hover {\n background: var(--dsw-alias-bg-layer-3, #e9eaec);\n}\n\n.arkme-unmarked-speaker-segment-play:disabled {\n opacity: .5;\n cursor: default;\n}\n\n.arkme-unmarked-speaker-choice-meta {\n color: var(--dsw-alias-label-secondary, #737984);\n margin: -4px 0 0;\n padding: 0 4px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-unmarked-speaker-choice-options {\n border: 0;\n gap: 8px;\n min-width: 0;\n margin: 0;\n padding: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-choice-options legend {\n color: var(--dsw-alias-label-secondary, #737984);\n margin-bottom: 9px;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-unmarked-speaker-choice-option {\n border: 1px solid var(--dsw-alias-border-l1, #e5e6e8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n cursor: pointer;\n border-radius: 14px;\n grid-template-columns: 18px minmax(0, 1fr) auto;\n align-items: center;\n gap: 10px;\n min-width: 0;\n min-height: 52px;\n padding: 10px 14px;\n font-size: 13px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-choice-option:has(input:checked) {\n border-color: var(--dsw-alias-state-business-primary, #6677d9);\n background: var(--dsw-alias-interactive-bg-active, #f0f2ff);\n}\n\n.arkme-unmarked-speaker-choice-option input {\n width: 16px;\n height: 16px;\n accent-color: var(--dsw-alias-state-business-primary, #6677d9);\n margin: 0;\n}\n\n.arkme-unmarked-speaker-recommended {\n background: var(--dsw-alias-state-business-tertiary, #eef0ff);\n color: var(--dsw-alias-state-business-primary, #5667cc);\n border-radius: 999px;\n padding: 2px 7px;\n font-size: 10px;\n line-height: 16px;\n}\n\n.arkme-unmarked-speaker-choice-new-name {\n border: 1px solid var(--dsw-alias-border-l1, #dfe1e5);\n background: var(--dsw-specific-input-major, #fff);\n width: 100%;\n min-height: 42px;\n color: var(--dsw-alias-label-primary, #202124);\n border-radius: 12px;\n outline: 0;\n padding: 0 13px;\n font-size: 12px;\n}\n\n.arkme-unmarked-speaker-choice-new-name:focus {\n border-color: var(--dsw-alias-state-business-primary, #6677d9);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--dsw-alias-state-business-primary, #6677d9) 14%, transparent);\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-confirm {\n background: var(--dsw-alias-button-primary-fill, #202124);\n min-height: 42px;\n color: var(--dsw-alias-label-primary-inverted, #fff);\n cursor: pointer;\n border-radius: 12px;\n padding: 0 16px;\n font-size: 12px;\n font-weight: 650;\n}\n\n.arkme-unmarked-speaker-confirm:disabled {\n opacity: .45;\n cursor: default;\n}\n\n.arkme-unmarked-speaker-summary button:not(.arkme-unmarked-speaker-action), .arkme-unmarked-speaker-audio button:not(.arkme-unmarked-speaker-segment-play), .arkme-unmarked-speaker-choice button:not(.arkme-unmarked-speaker-confirm), .arkme-contact-world-error button, .arkme-contact-profile-error button {\n border: 1px solid var(--dsw-alias-border-l2, var(--arkme-line));\n background: var(--dsw-alias-button-elevated-fill, #fff);\n min-height: 34px;\n color: var(--dsw-alias-label-primary, #202124);\n cursor: pointer;\n border-radius: 9px;\n padding: 0 12px;\n}\n\n.arkme-unmarked-speaker-gone, .arkme-unmarked-speaker-success {\n box-sizing: border-box;\n background: var(--dsw-alias-state-warning-tertiary, #fff7ed);\n width: min(100%, 680px);\n color: var(--dsw-alias-state-warning-primary, #9a3412);\n border-radius: 10px;\n margin: 0 auto;\n padding: 12px 14px;\n}\n\n.arkme-unmarked-speaker-success {\n background: var(--dsw-alias-state-success-tertiary, #ecfdf3);\n color: var(--dsw-alias-state-success-primary, #067647);\n}\n\n.arkme-contact-directory button:focus-visible, .arkme-directory-detail-pane button:focus-visible, [data-arkme-owned=\"product-navigation\"] button:focus-visible {\n outline: 2px solid var(--arkme-focus);\n outline-offset: 2px;\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory, body[data-ds-dark-theme] .arkme-directory-detail-pane {\n background: var(--dsw-alias-bg-base);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory-row.is-selected, body[data-ds-dark-theme] .arkme-contact-world-card, body[data-ds-dark-theme] .arkme-unmarked-speaker-choice {\n background: var(--dsw-alias-interactive-bg-active);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-inference, body[data-ds-dark-theme] .arkme-unmarked-speaker-segment-card, body[data-ds-dark-theme] .arkme-unmarked-speaker-choice-option, body[data-ds-dark-theme] .arkme-unmarked-speaker-action {\n background: var(--dsw-alias-bg-layer-1);\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-inference-icon, body[data-ds-dark-theme] .arkme-unmarked-speaker-action-icon, body[data-ds-dark-theme] .arkme-unmarked-speaker-segment-play {\n background: var(--dsw-specific-input-major);\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-choice-option:has(input:checked) {\n background: var(--dsw-alias-interactive-bg-active);\n border-color: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-detail > .arkme-contact-world {\n background: var(--dsw-alias-bg-subtle);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-world-container {\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: none;\n}\n\nbody[data-ds-dark-theme] .arkme-team-detail {\n background: var(--dsw-alias-bg-base);\n}\n\nbody[data-ds-dark-theme] .arkme-team-members {\n background: var(--dsw-alias-bg-subtle);\n}\n\nbody[data-ds-dark-theme] .arkme-team-member-list {\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: none;\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory-warning, body[data-ds-dark-theme] .arkme-unmarked-speaker-gone, body[data-ds-dark-theme] .arkme-contact-world-image-error, body[data-ds-dark-theme] .arkme-contact-world-image-loading {\n background: var(--dsw-specific-input-major);\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-success {\n background: var(--dsw-alias-state-success-tertiary);\n color: var(--dsw-alias-state-success-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-profile-error, body[data-ds-dark-theme] .arkme-contact-profile-message-error, body[data-ds-dark-theme] .arkme-contact-world-error, body[data-ds-dark-theme] .arkme-contact-world-load-more-error {\n color: var(--dsw-alias-state-error-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-profile-message {\n background: var(--dsw-alias-button-primary-fill);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory-more, body[data-ds-dark-theme] .arkme-contact-world-load-more {\n color: var(--dsw-alias-state-business-primary);\n}\n\n@media (width <= 1024px) {\n [data-arkme-owned=\"persistent-sidebar\"] [data-arkme-directory-mode=\"contacts\"] {\n min-width: 0;\n }\n}\n\n@media (width <= 820px) {\n div:has( > [data-shell-overlay]):has([data-arkme-directory-mode=\"contacts\"]):has([data-arkme-contacts-mobile-view=\"directory\"]) {\n grid-template-columns: minmax(0, 1fr) 0 0 !important;\n }\n\n div:has( > [data-shell-overlay]):has([data-arkme-directory-mode=\"contacts\"]):has([data-arkme-contacts-mobile-view=\"content\"]) {\n grid-template-columns: 0 minmax(0, 1fr) 0 !important;\n }\n\n [data-arkme-owned=\"persistent-sidebar\"][data-arkme-contacts-mobile-view=\"content\"], [data-arkme-owned=\"persistent-workspace\"][data-arkme-contacts-mobile-view=\"directory\"] {\n display: none !important;\n }\n\n [data-arkme-owned=\"persistent-sidebar\"] [data-arkme-directory-mode=\"contacts\"], .arkme-directory-detail-pane {\n min-width: 0;\n }\n}\n\n.arkme-directory-mobile-back {\n display: none;\n}\n\n@media (width <= 820px) {\n .arkme-directory-mobile-back {\n min-height: 42px;\n color: var(--dsw-alias-label-secondary, #68707c);\n cursor: pointer;\n background: none;\n align-items: center;\n gap: 5px;\n padding: 0 14px;\n display: inline-flex;\n }\n\n .arkme-directory-mobile-back:before {\n content: \"‹\";\n font-size: 18px;\n line-height: 1;\n }\n\n .arkme-directory-mobile-back:hover {\n color: var(--dsw-alias-label-primary, #202124);\n }\n\n .arkme-contact-profile {\n padding: 26px 20px;\n }\n\n .arkme-contact-profile-main {\n grid-template-columns: 56px minmax(0, 1fr) auto;\n gap: 12px;\n }\n\n .arkme-contact-profile-avatar {\n width: 56px;\n height: 56px;\n }\n\n .arkme-contact-profile-avatar > span {\n width: 56px !important;\n height: 56px !important;\n }\n\n .arkme-team-detail-header {\n padding: 26px 20px;\n }\n\n .arkme-team-detail-header-main {\n grid-template-columns: 56px minmax(0, 1fr);\n gap: 12px;\n }\n\n .arkme-team-detail-glyph {\n border-radius: 16px;\n width: 56px;\n height: 56px;\n font-size: 18px;\n }\n\n .arkme-team-detail-count {\n justify-items: initial;\n grid-column: 2;\n align-items: baseline;\n gap: 4px;\n min-width: 0;\n display: flex;\n }\n\n .arkme-team-detail-count strong {\n font-size: 14px;\n line-height: 18px;\n }\n\n .arkme-team-detail-count span {\n font-size: 11px;\n }\n\n .arkme-team-members {\n padding: 18px 20px 28px;\n }\n\n .arkme-team-member-list {\n border-radius: 12px;\n }\n\n .arkme-team-member-row {\n padding-left: 12px;\n padding-right: 12px;\n }\n\n .arkme-contact-world-title {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .arkme-directory-unmarked-speaker-detail {\n padding: 20px 18px 30px;\n }\n\n .arkme-unmarked-speaker-summary, .arkme-unmarked-speaker-audio, .arkme-unmarked-speaker-choice {\n gap: 14px;\n }\n\n .arkme-unmarked-speaker-stats {\n gap: 7px 14px;\n }\n\n .arkme-unmarked-speaker-stats span + span:before {\n display: none;\n }\n\n .arkme-unmarked-speaker-inference {\n grid-template-columns: 36px minmax(0, 1fr);\n padding: 15px;\n }\n\n .arkme-unmarked-speaker-inference-icon, .arkme-unmarked-speaker-action-icon {\n width: 36px;\n height: 36px;\n }\n\n .arkme-unmarked-speaker-subview-header {\n grid-template-columns: auto 36px minmax(0, 1fr);\n gap: 9px;\n }\n\n .arkme-unmarked-speaker-segment-card {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .arkme-unmarked-speaker-segment-transcript, [data-arkme-workspace] .arkme-unmarked-speaker-segment-play {\n grid-area: auto / 1;\n }\n\n [data-arkme-workspace] .arkme-unmarked-speaker-segment-play {\n justify-self: start;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-contact-directory-caret {\n transition: none;\n }\n\n .arkme-icon-spin {\n animation: none;\n }\n}\n\n.arkme-conversation-surface {\n --arkme-chat-self-bubble: #eef1f8;\n --arkme-chat-other-bubble: #f3f4f6;\n}\n\nbody[data-ds-dark-theme] .arkme-conversation-surface {\n --arkme-chat-self-bubble: #2c3142;\n --arkme-chat-other-bubble: #282a31;\n --arkme-audio-control: #8995c5;\n}\n\nbody[data-ds-dark-theme] .arkme-detail-extension-input-bar {\n border-top-color: #363636 !important;\n}\n\nbody[data-ds-dark-theme] .arkme-detail-extension-input-shell {\n background: #2b2b2b !important;\n}\n\n[data-arkme-message-direction]:focus-visible, [data-arkme-note-detail] button:focus-visible {\n outline: 2px solid var(--dsw-alias-state-business-primary, #8295e8);\n outline-offset: 2px;\n}\n";
|
|
194433
|
+
var arkme_redesign_default = "[data-arkme-workspace] {\n --arkme-line: #e7e7e9;\n --arkme-muted: #8e9199;\n --arkme-soft: #f6f6f7;\n --arkme-focus: #cbd5ff;\n color: #171923;\n font-synthesis: none;\n font-family: SF Pro Text, SF Pro Display, -apple-system, BlinkMacSystemFont, PingFang SC, Helvetica Neue, Microsoft YaHei, sans-serif;\n}\n\n[data-arkme-workspace], [data-arkme-workspace] * {\n box-sizing: border-box;\n}\n\n[data-arkme-workspace] button, [data-arkme-workspace] input, [data-arkme-workspace] textarea {\n font: inherit;\n}\n\n[data-arkme-workspace] button {\n color: inherit;\n cursor: pointer;\n background: none;\n border: 0;\n}\n\n[data-arkme-workspace] [data-arkme-theme-image=\"dark\"] {\n display: none !important;\n}\n\n.arkme-redesign-root {\n --arkme-native-titlebar: 0px;\n background: #fff;\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n.arkme-native-desktop .arkme-redesign-root {\n --arkme-native-titlebar: 50px;\n}\n\n.arkme-native-desktop .arkme-redesign-root:before {\n content: \"\";\n z-index: 30;\n pointer-events: none;\n background: #e8e8ea;\n height: 1px;\n position: absolute;\n top: 49px;\n left: 0;\n right: 0;\n}\n\n.arkme-native-desktop [data-arkme-owned=\"persistent-sidebar\"] > [data-arkme-owned=\"product-navigation\"] {\n padding-top: 28px !important;\n}\n\n.arkme-redesign-rail {\n z-index: 8;\n top: calc(26px + var(--arkme-native-titlebar));\n background: #fbfbfc;\n border: 1px solid #e4e4e7;\n border-radius: 22px;\n flex-direction: column;\n width: 72px;\n padding: 10px 8px;\n display: flex;\n position: absolute;\n bottom: 22px;\n left: 24px;\n box-shadow: 0 16px 38px #1e20260e;\n}\n\n.arkme-redesign-rail-primary {\n flex-direction: column;\n gap: 5px;\n display: flex;\n}\n\n.arkme-redesign-rail-primary button {\n color: #3e4149;\n border-radius: 15px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: 5px;\n min-height: 57px;\n transition: background .18s, color .18s;\n display: flex;\n position: relative;\n}\n\n.arkme-redesign-rail-primary button span {\n letter-spacing: .01em;\n font-size: 11px;\n font-weight: 400;\n}\n\n.arkme-redesign-rail-primary button:hover {\n background: #f4f4f5;\n}\n\n.arkme-redesign-rail-primary button.is-active {\n color: #151722;\n background: #f1f2f6;\n}\n\n.arkme-redesign-rail-primary button.is-active:before {\n content: \"\";\n background: #9eadff;\n border-radius: 3px;\n width: 3px;\n height: 33px;\n position: absolute;\n left: -9px;\n}\n\n.arkme-redesign-rail-footer {\n border-top: 0 solid #ededee;\n justify-items: center;\n gap: 7px;\n margin-top: auto;\n padding-top: 0;\n display: grid;\n position: relative;\n}\n\n.arkme-redesign-rail-footer:has( > .arkme-update-rail-slot) {\n border-top-width: 1px;\n padding-top: 10px;\n}\n\n.arkme-redesign-rail-footer > button {\n color: #4b4f58;\n border-radius: 14px;\n place-items: center;\n width: 46px;\n height: 46px;\n display: grid;\n}\n\n.arkme-redesign-rail-footer > button:hover, .arkme-redesign-rail-footer > button.is-active {\n background: #f1f2f5;\n}\n\n.arkme-redesign-rail-footer:empty {\n display: none;\n}\n\n.arkme-conversation-input-card {\n display: contents;\n}\n\nbody:is([data-ds-skin=\"qq2006\"], [data-arkme-skin=\"qq2006\"]) [data-arkme-owned=\"product-surface\"] .arkme-conversation-input-card.arkme-conversation-input-card.arkme-conversation-tools {\n display: flex !important;\n}\n\n.arkme-update-rail-slot {\n width: 52px;\n height: 30px;\n position: relative;\n}\n\nbutton.arkme-update-rail {\n color: #53648e;\n cursor: pointer;\n width: 52px;\n min-height: 28px;\n font: inherit;\n background: #f1f3fa;\n border: 0;\n border-radius: 999px;\n justify-content: center;\n align-items: center;\n gap: 4px;\n padding: 0 7px;\n transition: transform .16s, background .16s, color .16s, box-shadow .16s;\n display: flex;\n box-shadow: inset 0 0 0 1px #5b70ab17;\n}\n\nbutton.arkme-update-rail:hover, button.arkme-update-rail.is-active {\n transform: translateY(-1px);\n color: #34476f !important;\n background: #e9edf8 !important;\n}\n\nbutton.arkme-update-rail.is-available {\n color: #fff !important;\n background: #f0524f !important;\n box-shadow: 0 5px 12px #e03c3933, inset 0 0 0 1px #b2232014 !important;\n}\n\nbutton.arkme-update-rail.is-available:hover, button.arkme-update-rail.is-available.is-active {\n color: #fff !important;\n background: #df4542 !important;\n box-shadow: 0 7px 16px #d736333d, inset 0 0 0 1px #961a181a !important;\n}\n\nbutton.arkme-update-rail.is-error {\n color: #b54841 !important;\n background: #fff0ee !important;\n}\n\n.arkme-update-rail span {\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n font-size: 9px;\n font-weight: 550;\n line-height: 1;\n}\n\n.arkme-update-rail svg {\n flex: none;\n}\n\n.arkme-update-rail.is-ready {\n gap: 3px;\n padding: 0 4px;\n}\n\n.arkme-update-rail.is-ready svg {\n width: 13px;\n height: 13px;\n}\n\n.arkme-update-rail.is-downloading svg {\n animation: 1.6s linear infinite arkme-update-spin;\n}\n\n.arkme-update-popover {\n z-index: 100000;\n overflow-wrap: anywhere;\n box-sizing: border-box;\n color: #171923;\n backdrop-filter: blur(20px) saturate(1.12);\n background: #fffffff7;\n border: 1px solid #cfd1d7e6;\n border-radius: 20px;\n width: 356px;\n max-width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n padding: 18px;\n animation: .2s cubic-bezier(.2, .8, .2, 1) arkme-update-popover-in;\n position: fixed;\n bottom: 14px;\n left: 68px;\n overflow-y: auto;\n box-shadow: 0 24px 58px #1b1e2629, 0 3px 10px #1b1e260e;\n}\n\n.arkme-update-popover-heading {\n grid-template-columns: minmax(0, 1fr) 28px;\n align-items: center;\n gap: 12px;\n display: grid;\n}\n\n.arkme-update-popover-heading > div {\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-update-popover-heading span {\n color: #92959d;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 10px;\n font-weight: 500;\n overflow: hidden;\n}\n\n.arkme-update-popover-heading h2 {\n color: #242731;\n letter-spacing: -.025em;\n margin: 0;\n font-size: 17px;\n font-weight: 600;\n}\n\n.arkme-update-popover-heading > button {\n color: #93969e;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n place-items: center;\n width: 28px;\n height: 28px;\n padding: 0;\n display: grid;\n}\n\n.arkme-update-popover-heading > button:hover {\n color: #3d414a;\n background: #f1f2f4;\n}\n\n.arkme-update-popover-summary {\n color: #7d818a;\n margin: 13px 0 0;\n font-size: 11px;\n line-height: 1.55;\n}\n\n.arkme-update-release-notes {\n border-top: 1px solid #ececef;\n border-bottom: 1px solid #ececef;\n margin-top: 14px;\n padding: 5px 0;\n}\n\n.arkme-update-release-notes > div {\n grid-template-columns: 28px minmax(0, 1fr);\n align-items: center;\n gap: 10px;\n min-height: 51px;\n display: grid;\n}\n\n.arkme-update-release-notes > div + div {\n border-top: 1px solid #f0f0f2;\n}\n\n.arkme-update-release-notes > div > span {\n color: #a3a6ad;\n font-variant-numeric: tabular-nums;\n font-size: 9px;\n}\n\n.arkme-update-release-notes p {\n gap: 4px;\n margin: 0;\n display: grid;\n}\n\n.arkme-update-release-notes strong {\n color: #3b3f48;\n font-size: 12px;\n font-weight: 500;\n}\n\n.arkme-update-release-notes small {\n color: #92959d;\n font-size: 10px;\n line-height: 1.45;\n}\n\n.arkme-update-message {\n color: #747983;\n margin: 12px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-update-message.is-error {\n color: #b54841;\n}\n\n.arkme-update-popover-actions {\n grid-template-columns: 1fr 1.45fr;\n gap: 9px;\n margin-top: 16px;\n display: grid;\n}\n\n.arkme-update-popover-actions button {\n cursor: pointer;\n height: 42px;\n font: inherit;\n border-radius: 12px;\n padding: 0;\n font-size: 12px;\n font-weight: 500;\n transition: transform .16s, background .16s, box-shadow .16s;\n border: 0 !important;\n}\n\n.arkme-update-popover-actions button:hover {\n transform: translateY(-1px);\n}\n\n.arkme-update-popover-actions .arkme-update-later {\n color: #666a73 !important;\n background: #f2f2f4 !important;\n}\n\n.arkme-update-popover-actions .arkme-update-later:hover {\n background: #ececef !important;\n}\n\n.arkme-update-popover-actions .arkme-update-now {\n color: #fff !important;\n background: #1c1f28 !important;\n box-shadow: 0 7px 18px #181b2324 !important;\n}\n\n.arkme-update-popover-actions .arkme-update-now:hover {\n background: #11131b !important;\n box-shadow: 0 9px 22px #181b232e !important;\n}\n\n.arkme-update-now:disabled {\n opacity: .46;\n cursor: default;\n transform: none;\n}\n\n.arkme-update-capsule {\n z-index: 10030;\n box-sizing: border-box;\n color: #171923;\n backdrop-filter: blur(20px) saturate(1.2);\n background: #ffffffed;\n border: 1px solid #cdd0d8d6;\n border-radius: 18px;\n grid-template-columns: minmax(0, 1fr) 28px;\n align-items: center;\n gap: 10px;\n width: 326px;\n max-width: calc(100vw - 16px);\n min-height: 52px;\n padding: 9px 9px 9px 14px;\n animation: .22s cubic-bezier(.2, .8, .2, 1) arkme-update-capsule-in;\n display: grid;\n position: fixed;\n top: 18px;\n left: 50%;\n transform: translateX(-50%);\n box-shadow: 0 16px 40px #1c1f2724, 0 2px 8px #1c1f270f;\n}\n\n.arkme-native-desktop .arkme-update-capsule {\n top: 62px;\n}\n\n.arkme-update-capsule-copy {\n gap: 3px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-update-capsule-copy strong {\n color: #333741;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 11px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.arkme-update-capsule-copy small {\n color: #93969e;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 9px;\n overflow: hidden;\n}\n\n.arkme-update-progress {\n background: #eceef3;\n border-radius: 999px;\n height: 4px;\n overflow: hidden;\n}\n\n.arkme-update-progress span {\n border-radius: inherit;\n background: #6779b5;\n height: 100%;\n transition: width .65s cubic-bezier(.2, .7, .25, 1);\n display: block;\n}\n\n.arkme-update-progress.is-indeterminate span {\n width: 34%;\n animation: 1.25s ease-in-out infinite arkme-update-indeterminate;\n}\n\n.arkme-update-capsule > b {\n color: #656a75;\n font-variant-numeric: tabular-nums;\n text-align: right;\n font-size: 10px;\n font-weight: 500;\n}\n\n.arkme-update-capsule[data-layout=\"progress\"] {\n grid-template-columns: minmax(0, 1fr) minmax(40px, .8fr) 34px 28px;\n}\n\n.arkme-update-capsule[data-layout=\"action\"], .arkme-update-capsule[data-layout=\"ready-action\"] {\n width: 380px;\n}\n\n.arkme-update-capsule[data-layout=\"action\"] {\n grid-template-columns: minmax(0, 1fr) auto 28px;\n}\n\n.arkme-update-capsule[data-layout=\"ready-action\"] {\n grid-template-columns: minmax(0, 1fr) auto;\n padding-right: 16px;\n}\n\n.arkme-update-capsule:is([data-layout=\"action\"], [data-layout=\"ready-action\"]) .arkme-update-capsule-copy small {\n -webkit-line-clamp: 3;\n white-space: normal;\n overflow-wrap: anywhere;\n -webkit-box-orient: vertical;\n font-size: 11px;\n line-height: 1.45;\n display: -webkit-box;\n}\n\n.arkme-update-capsule[data-layout=\"restarting\"] {\n grid-template-columns: minmax(0, 1fr);\n width: 218px;\n padding-right: 14px;\n}\n\n.arkme-update-capsule.is-restarting .arkme-update-capsule-copy {\n text-align: center;\n justify-self: center;\n}\n\n.arkme-update-ready-action {\n color: #fff;\n cursor: pointer;\n width: auto;\n height: 32px;\n font: inherit;\n white-space: nowrap;\n background: #242731;\n border: 0;\n border-radius: 10px;\n padding: 0 11px;\n font-size: 10px;\n font-weight: 550;\n}\n\n.arkme-update-ready-action:hover {\n background: #151821;\n}\n\n.arkme-update-ready-action:disabled {\n opacity: .65;\n cursor: wait;\n}\n\n.arkme-update-ready-action:focus-visible {\n outline-offset: 2px;\n outline: 2px solid #6779b5;\n}\n\n.arkme-update-ready-actions {\n align-items: center;\n gap: 6px;\n display: flex;\n}\n\n.arkme-update-later-action {\n color: #737781;\n cursor: pointer;\n height: 32px;\n font: inherit;\n white-space: nowrap;\n background: none;\n border: 0;\n border-radius: 9px;\n padding: 0 8px;\n font-size: 10px;\n}\n\n.arkme-update-later-action:hover {\n color: #343841;\n background: #f0f1f3;\n}\n\n.arkme-update-capsule-close {\n color: #8a8e97;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n place-items: center;\n width: 28px;\n height: 28px;\n padding: 0;\n display: grid;\n}\n\n.arkme-update-capsule-close:hover {\n color: #343841;\n background: #f0f1f3;\n}\n\n@keyframes arkme-update-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes arkme-update-popover-in {\n from {\n opacity: 0;\n transform: translate(-8px, 3px) scale(.985);\n }\n}\n\n@keyframes arkme-update-capsule-in {\n from {\n opacity: 0;\n transform: translate(-50%, -8px) scale(.98);\n }\n}\n\n@keyframes arkme-update-indeterminate {\n from {\n transform: translateX(-100%);\n }\n\n to {\n transform: translateX(300%);\n }\n}\n\n.arkme-redesign-profile {\n position: relative;\n}\n\n.arkme-redesign-profile > span {\n width: 32px !important;\n height: 32px !important;\n}\n\n.arkme-redesign-profile-popover {\n z-index: 10000;\n backdrop-filter: blur(20px);\n background: #fffffff5;\n border: 1px solid #d8d9dde6;\n border-radius: 18px;\n width: 264px;\n padding: 10px;\n position: fixed;\n bottom: 14px;\n left: 64px;\n box-shadow: 0 20px 50px #1a1c2326, 0 2px 8px #1a1c230d;\n}\n\n.arkme-redesign-profile-head {\n align-items: center;\n gap: 11px;\n padding: 9px 9px 13px;\n display: flex;\n}\n\n.arkme-redesign-profile-head > span {\n text-align: left;\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-profile-head strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.arkme-redesign-profile-head small {\n color: #8b8f98;\n font-size: 11px;\n font-weight: 400;\n}\n\n.arkme-redesign-profile-menu {\n border-top: 1px solid #eeeeef;\n gap: 2px;\n padding-top: 6px;\n display: grid;\n}\n\n.arkme-redesign-profile-menu button {\n width: 100%;\n min-height: 50px;\n box-shadow: none;\n color: #393d46;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 11px;\n outline: 0;\n grid-template-columns: 28px minmax(0, 1fr) 16px;\n align-items: center;\n gap: 8px;\n padding: 7px 8px;\n display: grid;\n}\n\n.arkme-redesign-profile-menu button:hover {\n background: #f4f4f5;\n}\n\n.arkme-redesign-profile-menu button > span {\n gap: 3px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-profile-menu strong {\n font-size: 12px;\n font-weight: 500;\n}\n\n.arkme-redesign-profile-menu small {\n color: #92969f;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 10px;\n font-weight: 400;\n overflow: hidden;\n}\n\n.arkme-redesign-profile-menu button > svg:last-child {\n color: #a0a3aa;\n}\n\n.arkme-redesign-native-settings-trigger {\n clip-path: inset(50%);\n width: 1px;\n height: 1px;\n position: absolute;\n overflow: hidden;\n}\n\n.arkme-redesign-chat-panel {\n inset: var(--arkme-native-titlebar) auto 0 96px;\n z-index: 3;\n border-right: 1px solid var(--arkme-line);\n background: #fff;\n flex-direction: column;\n width: 300px;\n min-width: 0;\n padding: 0;\n display: flex;\n position: absolute;\n overflow: hidden;\n}\n\n.arkme-redesign-chat-search {\n text-align: left;\n border-radius: 11px;\n align-items: center;\n gap: 9px;\n width: 100%;\n height: 40px;\n margin: 20px 0 10px;\n padding: 0 12px;\n display: flex;\n color: #9699a1 !important;\n border: 1px solid #e1e2e5 !important;\n font-size: 11px !important;\n}\n\n.arkme-redesign-chat-search:hover {\n background: #f7f7f8;\n}\n\n.arkme-redesign-chat-directory {\n flex: 1;\n min-height: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-chat-directory > section {\n background: none !important;\n}\n\n.arkme-redesign-task-section {\n z-index: 3;\n border-bottom: 1px solid #ececef;\n outline: none;\n height: 158px;\n margin: 0 6px 12px;\n position: relative;\n}\n\n.arkme-redesign-task-section-title {\n color: #767b85;\n justify-content: space-between;\n align-items: center;\n height: 28px;\n padding: 0 7px;\n display: flex;\n}\n\n.arkme-redesign-task-section-title strong {\n font-size: 12px;\n font-weight: 500;\n}\n\n.arkme-redesign-task-section-title button {\n border-radius: 7px;\n place-items: center;\n width: 24px;\n height: 24px;\n display: grid;\n}\n\n.arkme-redesign-task-section-title button:hover {\n background: #f3f3f5;\n}\n\n.arkme-redesign-task-list {\n overscroll-behavior: contain;\n scrollbar-gutter: stable;\n background: #fff;\n max-height: 128px;\n padding-bottom: 2px;\n transition: max-height .18s, box-shadow .18s, padding .18s;\n display: grid;\n position: absolute;\n top: 28px;\n left: 0;\n right: 0;\n overflow: hidden auto;\n}\n\n.arkme-redesign-task-section:hover .arkme-redesign-task-list, .arkme-redesign-task-section:focus-within .arkme-redesign-task-list {\n max-height: min(360px, 100vh - 180px);\n padding-bottom: 6px;\n box-shadow: 0 14px 22px #1b1e2512;\n}\n\n.arkme-redesign-task-list > button {\n color: #555a64;\n text-align: left;\n border-radius: 8px;\n grid-template-columns: 16px minmax(0, 1fr);\n align-items: center;\n gap: 4px;\n width: 100%;\n min-width: 0;\n height: 32px;\n padding: 0 8px;\n display: grid;\n}\n\n.arkme-redesign-task-list > button:hover {\n background: #f7f7f8;\n}\n\n.arkme-redesign-task-list > button.is-selected {\n color: #232630;\n background: #f0f1f4;\n}\n\n.arkme-redesign-task-state {\n justify-content: center;\n align-items: center;\n width: 16px;\n height: 20px;\n display: inline-flex;\n}\n\n.arkme-redesign-task-state.is-complete > i {\n background: #39a56b1a;\n border-radius: 50%;\n width: 10px;\n height: 10px;\n display: block;\n position: relative;\n}\n\n.arkme-redesign-task-state.is-complete > i:after {\n content: \"\";\n background: #39a56b;\n border-radius: 50%;\n position: absolute;\n inset: 2px;\n}\n\n.arkme-redesign-task-matrix {\n grid-template-columns: repeat(3, 2px);\n grid-auto-rows: 2px;\n gap: 1px;\n width: 10px;\n height: 10px;\n display: grid;\n}\n\n.arkme-redesign-task-matrix i {\n opacity: .15;\n background: #5d76e8;\n border-radius: 1px;\n animation: 1s infinite arkme-task-dot-chase;\n}\n\n.arkme-redesign-task-matrix i:nth-child(2) {\n animation-delay: .125s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(3) {\n animation-delay: .25s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(4) {\n animation-delay: .375s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(5) {\n animation-delay: .5s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(6) {\n animation-delay: .625s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(7) {\n animation-delay: .75s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(8) {\n animation-delay: .875s;\n}\n\n@keyframes arkme-task-dot-chase {\n 0%, 12.4% {\n opacity: 1;\n }\n\n 12.5%, 24.9% {\n opacity: .6;\n }\n\n 25%, 37.4% {\n opacity: .35;\n }\n\n 37.5%, 100% {\n opacity: .15;\n }\n}\n\n.arkme-redesign-task-copy {\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-redesign-task-copy strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 0;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-redesign-task-copy small {\n color: #9a9da5;\n flex: none;\n font-size: 12px;\n line-height: 20px;\n}\n\n.arkme-redesign-task-first {\n color: #555a64;\n text-align: left;\n border-radius: 8px;\n width: calc(100% - 12px);\n height: 32px;\n margin: 0 6px;\n padding: 0 8px;\n font-size: 14px;\n}\n\n.arkme-redesign-task-first:hover {\n background: #f7f7f8;\n}\n\n.arkme-redesign-content {\n inset: var(--arkme-native-titlebar) 0 0 96px;\n background: #fff;\n min-width: 0;\n min-height: 0;\n position: absolute;\n overflow: hidden;\n}\n\n.arkme-redesign-content.has-panel {\n left: 396px;\n}\n\n.arkme-redesign-content.has-details {\n right: 360px;\n}\n\n.arkme-redesign-content.is-login-takeover {\n left: 0;\n right: 0;\n}\n\n.arkme-redesign-route-surface {\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-surface {\n background: #fff !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-header {\n border-bottom: 1px solid #ececef !important;\n height: 68px !important;\n padding: 12px 16px 12px 20px !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-header h2 {\n font-size: 15px !important;\n font-weight: 600 !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-body {\n padding: 22px 22px 12px !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-records {\n gap: 0 !important;\n width: 100% !important;\n}\n\n.arkme-conversation-records-reveal {\n animation: .12s ease-out both arkme-conversation-records-reveal;\n}\n\n@keyframes arkme-conversation-records-reveal {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-conversation-records-reveal {\n animation: none;\n }\n}\n\n.arkme-redesign-route-chats [data-arkme-content-presentation=\"bubble\"] p {\n font-size: 14px;\n line-height: 1.62;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer {\n padding: 0 24px 20px !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer-inner {\n background: #fff !important;\n border: 1px solid #dfe1e6 !important;\n border-radius: 15px !important;\n gap: 8px !important;\n width: 100% !important;\n padding: 12px 13px 9px !important;\n box-shadow: 0 8px 30px #1c1f270b !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"] {\n box-shadow: none !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"][data-arkme-composer-focused=\"true\"] {\n background: color-mix(in srgb, var(--dsw-alias-bg-base, #fff) 97%, #000) !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer textarea {\n min-height: 38px !important;\n padding: 0 !important;\n font-size: 14px !important;\n line-height: 22px !important;\n}\n\n.arkme-redesign-task-conversation {\n font-size: 15px;\n}\n\n.arkme-redesign-task-conversation [data-phase] {\n --dsh-chat-content-width: calc(100% - 64px);\n --dsh-composer-card-max-width: calc(100% - 32px);\n}\n\n.arkme-redesign-task-conversation [data-chat-flow] {\n width: calc(100% - 64px) !important;\n max-width: none !important;\n margin-left: 32px !important;\n margin-right: 32px !important;\n}\n\n.arkme-redesign-task-conversation textarea {\n font-size: 14px !important;\n}\n\n[data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"][data-arkme-directory-visible=\"true\"] [data-arkme-directory-mode=\"conversations\"]), [data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-web-locked] [data-arkme-directory-mode=\"web-locked\"]) {\n grid-template-columns: var(--arkme-persistent-sidebar-width, 356px) minmax(0, 1fr) 0 !important;\n}\n\n[data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"][data-arkme-directory-visible=\"false\"]) {\n grid-template-columns: 72px minmax(0, 1fr) 0 !important;\n}\n\n@media (width >= 1100px) {\n [data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"] [data-arkme-directory-mode=\"contacts\"]) {\n grid-template-columns: var(--arkme-persistent-sidebar-width, 356px) minmax(0, 1fr) 0 !important;\n }\n\n [data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"true\"]:not([data-arkme-web-locked])) {\n grid-template-columns: 0 minmax(0, 1fr) 0 !important;\n }\n}\n\n[data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"]:has( > [data-arkme-directory-mode=\"conversations\"]) > [data-arkme-owned=\"product-navigation\"] {\n flex: 0 0 72px !important;\n width: 72px !important;\n min-width: 72px !important;\n}\n\n[data-arkme-owned=\"persistent-sidebar\"] :is([data-arkme-directory-mode=\"conversations\"], [data-arkme-directory-mode=\"web-locked\"]) {\n min-width: 64px !important;\n}\n\n[data-arkme-avatar-only=\"true\"] > :not([role=\"tree\"]) {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] {\n padding: 8px 6px 18px !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button {\n justify-content: center !important;\n gap: 0 !important;\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > :not(:first-child) {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child:has( > span:nth-child(2)) {\n justify-content: center !important;\n gap: 0 !important;\n width: auto !important;\n min-width: 38px !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) {\n display: contents !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:first-child {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:last-child {\n display: contents !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:last-child > :not([style*=\"min-width: 17px\"]) {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:last-child > [style*=\"min-width: 17px\"] {\n top: 3px;\n right: 3px;\n position: absolute !important;\n}\n\n.arkme-redesign-feature-page {\n background: #fff;\n flex-direction: column;\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n padding: 30px 48px 36px;\n display: flex;\n overflow: hidden;\n}\n\n.arkme-redesign-feature-page > header {\n flex: none;\n margin: 0 0 22px;\n}\n\n.arkme-redesign-feature-page > header p {\n color: #8d9098;\n margin: 0 0 8px;\n font-size: 11px;\n}\n\n.arkme-redesign-feature-page > header h1 {\n letter-spacing: -.04em;\n margin: 0;\n font-size: 27px;\n font-weight: 600;\n}\n\n.arkme-redesign-feature-page > header span {\n color: #858992;\n margin-top: 10px;\n font-size: 12px;\n display: block;\n}\n\n.arkme-redesign-feature-body {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-recordings-page {\n background: #fff;\n padding: 0;\n}\n\n.arkme-redesign-recordings-page > div {\n height: 100% !important;\n}\n\n.arkme-redesign-search-page {\n padding: 66px 0 40px;\n}\n\n.arkme-redesign-search-page > header, .arkme-redesign-search-page > .arkme-redesign-feature-body {\n width: min(980px, 100% - 80px);\n margin-left: auto;\n margin-right: auto;\n}\n\n.arkme-redesign-search-page > header {\n margin-bottom: 28px;\n}\n\n.arkme-redesign-search-page > header h1 {\n font-size: 32px;\n}\n\n.arkme-redesign-search-page .arkme-redesign-feature-body {\n overflow-y: auto;\n}\n\n.arkme-redesign-search-page .arkme-redesign-feature-body > div {\n width: 100% !important;\n padding: 0 !important;\n}\n\n.arkme-redesign-search-page .arkme-redesign-feature-body > div > header {\n display: none !important;\n}\n\n.arkme-redesign-search-page .arkme-search-box {\n box-shadow: 0 8px 28px #1c1f2709;\n color: #646872 !important;\n background: #fff !important;\n border: 1px solid #e1e2e5 !important;\n border-radius: 15px !important;\n gap: 12px !important;\n height: 68px !important;\n padding: 0 20px !important;\n}\n\n.arkme-redesign-search-page input[aria-label=\"搜索\"] {\n font-size: 14px !important;\n}\n\n.arkme-redesign-search-page input[aria-label=\"搜索\"]:not(:focus)::placeholder {\n color: #92959d;\n}\n\n.arkme-redesign-search-page .arkme-search-history, .arkme-redesign-search-page .arkme-search-quick {\n margin: 24px 0 0 !important;\n}\n\n.arkme-redesign-search-page .arkme-search-history > div, .arkme-redesign-search-page .arkme-search-quick > div {\n gap: 0 !important;\n display: grid !important;\n}\n\n.arkme-redesign-search-page .arkme-search-history button, .arkme-redesign-search-page .arkme-search-quick button {\n text-align: left;\n overflow: hidden;\n color: #30333b !important;\n border: 0 !important;\n border-bottom: 1px solid #e6e7e9 !important;\n border-radius: 0 !important;\n justify-content: space-between !important;\n align-items: center !important;\n gap: 14px !important;\n width: 100% !important;\n height: 52px !important;\n padding: 0 6px !important;\n font-size: 12px !important;\n display: flex !important;\n}\n\n.arkme-redesign-search-page .arkme-search-history button span, .arkme-redesign-search-page .arkme-search-quick button span {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.arkme-redesign-plugins-page {\n background: #fff;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded > section {\n background: #fff !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded header {\n display: none !important;\n}\n\n.arkme-extension-toolbar {\n align-items: center;\n gap: 12px;\n height: 46px;\n display: flex;\n}\n\n.arkme-extension-toolbar label {\n color: #8e929a;\n border: 1px solid #e1e2e5;\n border-radius: 12px;\n flex: 1;\n align-items: center;\n gap: 10px;\n min-width: 0;\n height: 44px;\n padding: 0 14px;\n display: flex;\n}\n\n.arkme-extension-toolbar input {\n color: #262932;\n background: none;\n border: 0;\n outline: 0;\n flex: 1;\n min-width: 0;\n font-size: 12px;\n}\n\n.arkme-extension-toolbar > button {\n border-radius: 11px;\n height: 38px;\n padding: 0 15px;\n font-size: 11px;\n border: 1px solid #e1e2e5 !important;\n}\n\n.arkme-extension-toolbar > button:hover {\n background: #f6f6f7;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded nav {\n width: 420px;\n height: 38px !important;\n padding: 0 !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded main {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n align-content: start;\n gap: 12px;\n padding: 16px 0 0 !important;\n display: grid !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-card {\n background: #fff !important;\n border: 1px solid #e3e4e7 !important;\n border-radius: 15px !important;\n min-height: 138px !important;\n margin: 0 !important;\n padding: 18px !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-card:hover {\n background: #fafafa !important;\n border-color: #d5d7dc !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-grid-span, .arkme-redesign-plugins-page .arkme-extension-center-embedded main > [role=\"status\"], .arkme-redesign-plugins-page .arkme-extension-center-embedded main > [role=\"alert\"] {\n grid-column: 1 / -1;\n}\n\n@keyframes arkme-icon-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.arkme-icon-spin {\n animation: .8s linear infinite arkme-icon-spin;\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-arkme-voice] .arkme-icon-spin {\n animation: none;\n }\n}\n\n.arkme-redesign-settings-surface {\n color: #20232c;\n background: none;\n width: 100%;\n height: auto;\n overflow: visible;\n}\n\n.arkme-redesign-settings-shell {\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n padding: 0;\n}\n\n.arkme-redesign-settings-profile {\n align-items: center;\n gap: 16px;\n padding: 0 0 24px;\n display: flex;\n}\n\n.arkme-redesign-settings-profile > div:nth-child(2) {\n min-width: 0;\n}\n\n.arkme-redesign-settings-profile h1 {\n color: #20232c;\n letter-spacing: -.03em;\n white-space: nowrap;\n text-overflow: ellipsis;\n margin: 0 0 6px;\n font-size: 24px;\n font-weight: 600;\n line-height: 30px;\n overflow: hidden;\n}\n\n.arkme-redesign-settings-profile p {\n color: #858992;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 13px;\n line-height: 18px;\n display: flex;\n overflow: hidden;\n}\n\n.arkme-redesign-settings-profile p > span {\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 0;\n overflow: hidden;\n}\n\n.arkme-account-profile-qr {\n color: #858992;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 0;\n flex: none;\n justify-content: center;\n align-items: center;\n width: 24px;\n height: 24px;\n margin: 0;\n padding: 2px;\n display: inline-flex;\n}\n\n.arkme-account-profile-qr:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-account-profile-qr svg {\n width: 20px;\n height: 20px;\n display: block;\n}\n\n.arkme-redesign-settings-group {\n background: none;\n border: 0;\n border-bottom: 1px solid #e1e2e5;\n border-radius: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-settings-group:last-child {\n border-bottom: 0;\n}\n\n.arkme-redesign-settings-group > h2 {\n color: #8a8e96;\n border-bottom: 1px solid #ededee;\n margin: 0;\n padding: 15px 1px 10px;\n font-size: 12px;\n font-weight: 500;\n line-height: 17px;\n}\n\n.arkme-redesign-settings-group > div {\n padding: 0;\n}\n\n.arkme-redesign-setting-row {\n box-sizing: border-box;\n width: 100%;\n min-height: 54px;\n color: inherit;\n font: inherit;\n text-align: left;\n background: none;\n border: 0;\n border-bottom: 1px solid #ededee;\n grid-template-columns: minmax(0, 1fr) auto 18px;\n align-items: center;\n gap: 10px;\n padding: 9px 1px;\n text-decoration: none;\n display: grid;\n}\n\n.arkme-redesign-setting-row:last-child {\n border-bottom: 0;\n}\n\nbutton.arkme-redesign-setting-row, a.arkme-redesign-setting-row {\n cursor: pointer;\n}\n\nbutton.arkme-redesign-setting-row:hover, a.arkme-redesign-setting-row:hover {\n color: #53617d;\n}\n\n.arkme-redesign-setting-row:disabled {\n opacity: .6;\n cursor: default;\n}\n\n.arkme-redesign-setting-row > strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-redesign-setting-row > strong.is-danger {\n color: #b54841;\n}\n\n.arkme-redesign-setting-summary {\n color: #858992;\n text-align: right;\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: 360px;\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n}\n\n.arkme-redesign-setting-row > svg {\n color: #8d929b;\n}\n\n.arkme-account-info-row {\n box-sizing: border-box;\n width: 100%;\n min-height: 54px;\n color: inherit;\n font: inherit;\n text-align: left;\n background: none;\n border: 0;\n border-bottom: 1px solid #ededee;\n grid-template-columns: 26px minmax(0, 1fr) auto 18px;\n align-items: center;\n gap: 10px;\n padding: 9px 1px;\n display: grid;\n}\n\n.arkme-account-info-row:last-child {\n border-bottom: 0;\n}\n\nbutton.arkme-account-info-row {\n cursor: pointer;\n}\n\n.arkme-account-info-row:disabled {\n opacity: .6;\n cursor: default;\n}\n\n.arkme-account-info-icon {\n color: #6f7580;\n justify-content: center;\n align-items: center;\n width: 26px;\n height: 26px;\n display: inline-flex;\n}\n\n.arkme-account-info-copy {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-account-info-copy > strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-account-info-copy > small {\n color: #858992;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n}\n\n.arkme-account-info-action {\n color: #858992;\n white-space: nowrap;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-info-row > svg {\n color: #8d929b;\n}\n\n.arkme-account-feedback {\n color: #b54841;\n align-items: flex-start;\n gap: 6px;\n margin: 8px 0 14px;\n font-size: 12px;\n line-height: 18px;\n display: flex;\n}\n\n.arkme-account-dialog-backdrop {\n z-index: 50;\n background: #12141a6b;\n justify-content: center;\n align-items: center;\n padding: 18px;\n display: flex;\n position: fixed;\n inset: 0;\n}\n\n.arkme-account-dialog {\n box-sizing: border-box;\n color: #20232c;\n background: #fff;\n border: 1px solid #e1e2e5;\n border-radius: 16px;\n width: min(420px, 100vw - 36px);\n max-height: calc(100vh - 56px);\n overflow: auto;\n box-shadow: 0 18px 52px #11182738;\n}\n\n.arkme-account-dialog > header {\n border-bottom: 1px solid #ededee;\n justify-content: space-between;\n align-items: center;\n height: 58px;\n padding: 0 16px 0 20px;\n display: flex;\n}\n\n.arkme-account-dialog h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 650;\n line-height: 24px;\n}\n\n.arkme-account-dialog > header button {\n color: #8d929b;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 50%;\n width: 34px;\n height: 34px;\n}\n\n.arkme-account-qr-card {\n box-sizing: border-box;\n background: #fff;\n border: 1px solid #ededee;\n border-radius: 14px;\n justify-items: center;\n gap: 7px;\n width: 270px;\n margin: 22px auto 16px;\n padding: 24px 22px 22px;\n display: grid;\n}\n\n.arkme-account-qr-card strong {\n margin-top: 4px;\n font-size: 17px;\n font-weight: 650;\n line-height: 23px;\n}\n\n.arkme-account-qr-card span, .arkme-account-qr-card small {\n color: #858992;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-qr-card img {\n width: 180px;\n height: 180px;\n margin-top: 8px;\n}\n\n.arkme-account-form {\n gap: 12px;\n padding: 18px 20px 20px;\n display: grid;\n}\n\n.arkme-account-form label {\n color: #5f6570;\n gap: 7px;\n font-size: 12px;\n line-height: 18px;\n display: grid;\n}\n\n.arkme-account-form input {\n box-sizing: border-box;\n color: #20232c;\n width: 100%;\n height: 42px;\n font: inherit;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 11px;\n outline: none;\n padding: 0 12px;\n}\n\n.arkme-account-form input:focus {\n border-color: #9aa7c2;\n box-shadow: 0 0 0 3px #53617d1f;\n}\n\n.arkme-account-rule {\n color: #858992;\n margin: -2px 0 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-code-row {\n grid-template-columns: minmax(0, 1fr) 92px;\n gap: 8px;\n display: grid;\n}\n\n.arkme-account-code-row button {\n color: #343944;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 11px;\n}\n\n.arkme-account-code-row button:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-account-dialog-actions {\n justify-content: flex-end;\n gap: 10px;\n padding-top: 6px;\n display: flex;\n}\n\n.arkme-account-dialog-actions button {\n color: #343944;\n min-width: 78px;\n height: 36px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 10px;\n justify-content: center;\n align-items: center;\n gap: 6px;\n padding: 0 14px;\n display: inline-flex;\n}\n\n.arkme-account-dialog-actions button[type=\"submit\"], .arkme-account-dialog-actions button:last-child {\n color: #fff;\n background: #20232c;\n border-color: #20232c;\n}\n\n.arkme-account-dialog-actions button:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-account-dialog-status {\n color: #13a85b;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-dialog-status.is-error {\n color: #b54841;\n}\n\n.arkme-redesign-version-row {\n grid-template-columns: minmax(0, 1fr) minmax(150px, auto) auto 18px;\n}\n\n.arkme-redesign-version-row.is-without-action {\n grid-template-columns: minmax(0, 1fr) auto 18px;\n}\n\n.arkme-redesign-version-copy {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-version-copy > strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-redesign-version-copy > small {\n color: #858992;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 11px;\n line-height: 16px;\n overflow: hidden;\n}\n\n.arkme-redesign-version-value {\n color: #858992;\n white-space: nowrap;\n justify-self: end;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-redesign-version-action-slot {\n justify-content: flex-end;\n display: inline-flex;\n}\n\n.arkme-redesign-trailing-slot {\n width: 18px;\n height: 1px;\n}\n\nbutton.arkme-redesign-update-button {\n color: #343944;\n min-width: 72px;\n height: 30px;\n font: inherit;\n white-space: nowrap;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n justify-content: center;\n align-items: center;\n gap: 5px;\n padding: 0 11px;\n font-size: 11px;\n display: inline-flex;\n}\n\nbutton.arkme-redesign-update-button:hover {\n background: #f7f7f8;\n border-color: #cfd3da;\n}\n\nbutton.arkme-redesign-update-button:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-redesign-settings-group:has(.arkme-redesign-balance-row) {\n overflow: visible;\n}\n\n.arkme-redesign-balance-row {\n grid-template-columns: max-content max-content minmax(0, 1fr) 18px;\n column-gap: 20px;\n}\n\n.arkme-redesign-balance-row.is-without-reserved {\n grid-template-columns: max-content minmax(0, 1fr) 18px;\n}\n\n.arkme-redesign-balance-main {\n min-width: 0;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n gap: 2px;\n padding: 0;\n display: grid;\n}\n\n.arkme-redesign-balance-main > strong {\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.arkme-redesign-balance-main > small {\n color: #858992;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-redesign-balance-usage {\n color: #8a8e96;\n white-space: nowrap;\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-redesign-reserved-balance {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-recharge-trigger {\n justify-self: end;\n}\n\n.arkme-redesign-reserved-title {\n align-items: center;\n gap: 5px;\n width: fit-content;\n display: inline-flex;\n position: relative;\n}\n\n.arkme-redesign-reserved-title > strong {\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.arkme-redesign-reserved-balance > small {\n color: #858992;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-redesign-reserved-help {\n box-sizing: border-box;\n color: #858992;\n cursor: help;\n border: 1px solid #a6aab2;\n border-radius: 50%;\n place-items: center;\n width: 15px;\n height: 15px;\n font-size: 10px;\n font-weight: 600;\n line-height: 1;\n display: inline-grid;\n}\n\n.arkme-redesign-reserved-help:focus-visible {\n outline-offset: 2px;\n outline: 2px solid #7b8cad;\n}\n\n.arkme-redesign-reserved-title > [role=\"tooltip\"] {\n box-sizing: border-box;\n z-index: 20;\n color: #fff;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n background: #2e323b;\n border-radius: 8px;\n width: 240px;\n padding: 9px 11px;\n font-size: 11px;\n font-weight: 400;\n line-height: 17px;\n transition: opacity .12s, transform .12s, visibility .12s;\n position: absolute;\n bottom: calc(100% + 8px);\n left: calc(100% - 7.5px);\n transform: translate(-50%, 2px);\n box-shadow: 0 6px 18px #181b222e;\n}\n\n.arkme-redesign-reserved-help:hover ~ [role=\"tooltip\"], .arkme-redesign-reserved-help:focus ~ [role=\"tooltip\"] {\n opacity: 1;\n visibility: visible;\n transform: translate(-50%);\n}\n\n.arkme-redesign-settings-error {\n color: #b54841;\n background: #fff3f0;\n border-radius: 10px;\n margin: -8px 0 28px;\n padding: 10px 13px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-remote-settings-dialog-backdrop {\n z-index: 1150;\n box-sizing: border-box;\n backdrop-filter: blur(1.5px);\n background: #16181d47;\n place-items: center;\n padding: 24px;\n display: grid;\n position: fixed;\n inset: 0;\n}\n\n.arkme-remote-settings-dialog {\n color: #20232c;\n background: #fff;\n border: 1px solid #14182014;\n border-radius: 19px;\n flex-direction: column;\n width: min(720px, 100vw - 48px);\n max-height: min(720px, 100vh - 48px);\n display: flex;\n overflow: hidden;\n box-shadow: 0 18px 54px #11141b2e;\n}\n\n.arkme-remote-page-header {\n box-sizing: border-box;\n border-bottom: 1px solid #ededee;\n justify-content: space-between;\n align-items: center;\n gap: 20px;\n min-height: 74px;\n padding: 0 24px 0 28px;\n display: flex;\n}\n\n.arkme-remote-page-header > div {\n min-width: 0;\n}\n\n.arkme-remote-page-header h1 {\n color: #20232c;\n letter-spacing: -.02em;\n margin: 0;\n font-size: 18px;\n font-weight: 620;\n line-height: 25px;\n}\n\n.arkme-remote-page-header p {\n color: #8b9098;\n margin: 3px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-remote-settings-close {\n color: #777c85;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n flex: none;\n justify-content: center;\n align-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n}\n\n.arkme-remote-settings-close:hover {\n color: #20232c;\n background: #f3f3f4;\n}\n\n.arkme-remote-settings-dialog-body {\n overscroll-behavior: contain;\n gap: 28px;\n padding: 24px 28px 28px;\n display: grid;\n overflow-y: auto;\n}\n\n.arkme-remote-section {\n gap: 13px;\n display: grid;\n}\n\n.arkme-remote-section-header {\n justify-content: space-between;\n align-items: flex-end;\n gap: 18px;\n min-height: 34px;\n display: flex;\n}\n\n.arkme-remote-section-header > div:first-child {\n min-width: 0;\n}\n\n.arkme-remote-section-header h2 {\n color: #292c34;\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n line-height: 21px;\n}\n\n.arkme-remote-section-header p {\n color: #8b9098;\n margin: 2px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-remote-section-header > div:last-child {\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n.arkme-remote-icon-button {\n color: #8a8f97;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n justify-content: center;\n align-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n}\n\n.arkme-remote-icon-button:hover {\n color: #343944;\n background: #f3f3f4;\n}\n\n.arkme-remote-add-button {\n color: #fff;\n min-height: 32px;\n font: inherit;\n cursor: pointer;\n background: #20232c;\n border: 0;\n border-radius: 9px;\n align-items: center;\n gap: 5px;\n padding: 0 12px;\n font-size: 11px;\n font-weight: 550;\n display: inline-flex;\n}\n\n.arkme-remote-add-button:hover {\n background: #343944;\n}\n\n.arkme-remote-add-button:disabled, .arkme-remote-icon-button:disabled {\n opacity: .45;\n cursor: default;\n}\n\n.arkme-remote-settings-card {\n background: #fff;\n border: 1px solid #e1e2e5;\n border-radius: 16px;\n overflow: hidden;\n}\n\n.arkme-remote-allow-row {\n border-bottom: 1px solid #ededee;\n justify-content: space-between;\n align-items: center;\n gap: 18px;\n min-height: 60px;\n padding: 0 18px;\n display: flex;\n}\n\n.arkme-remote-allow-row > div {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-remote-allow-row strong, .arkme-remote-device-row strong, .arkme-remote-name-row strong {\n color: #343944;\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.arkme-remote-allow-row span, .arkme-remote-device-row span, .arkme-remote-name-row small {\n color: #8b9098;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 10px;\n line-height: 16px;\n overflow: hidden;\n}\n\n.arkme-remote-switch {\n cursor: pointer;\n background: #d7d9dd;\n border: 0;\n border-radius: 999px;\n flex: none;\n width: 40px;\n height: 23px;\n padding: 0;\n transition: background .16s;\n position: relative;\n}\n\n.arkme-remote-switch > span {\n background: #fff;\n border-radius: 50%;\n width: 17px;\n height: 17px;\n transition: transform .16s;\n position: absolute;\n top: 3px;\n left: 3px;\n box-shadow: 0 1px 3px #14182038;\n}\n\n.arkme-remote-switch[aria-checked=\"true\"] {\n background: #3b9cf5;\n}\n\n.arkme-remote-switch[aria-checked=\"true\"] > span {\n transform: translateX(17px);\n}\n\n.arkme-remote-switch:disabled {\n opacity: .5;\n cursor: default;\n}\n\n.arkme-remote-device-row {\n border-bottom: 1px solid #ededee;\n grid-template-columns: 24px minmax(0, 1fr) auto;\n align-items: center;\n gap: 11px;\n min-height: 64px;\n padding: 0 18px;\n display: grid;\n}\n\n.arkme-remote-device-row:last-child {\n border-bottom: 0;\n}\n\n.arkme-remote-device-row > svg {\n color: #68707c;\n}\n\n.arkme-remote-device-row > div {\n gap: 1px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-remote-device-row > button {\n color: #5d626c;\n min-height: 30px;\n font: inherit;\n cursor: pointer;\n background: #f3f3f4;\n border: 0;\n border-radius: 9px;\n padding: 0 10px;\n font-size: 10px;\n}\n\n.arkme-remote-device-row > button:hover {\n color: #b54841;\n background: #fff0ed;\n}\n\n.arkme-remote-device-row > button:disabled {\n opacity: .45;\n cursor: default;\n}\n\n.arkme-remote-empty-row {\n color: #989ca3;\n align-items: center;\n gap: 11px;\n min-height: 52px;\n padding: 0 18px;\n font-size: 11px;\n display: flex;\n}\n\n.arkme-remote-empty-row > svg {\n color: #a2a6ad;\n}\n\n.arkme-remote-name-row {\n color: #727780;\n width: 100%;\n min-height: 62px;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n grid-template-columns: 24px minmax(0, 1fr) 20px;\n align-items: center;\n gap: 11px;\n padding: 0 18px;\n display: grid;\n}\n\n.arkme-remote-name-row:hover {\n background: #fafafb;\n}\n\n.arkme-remote-name-row > span {\n gap: 1px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-remote-name-row small {\n display: block;\n}\n\n.arkme-remote-rename {\n border-top: 1px solid #ededee;\n grid-template-columns: minmax(0, 1fr) auto auto;\n gap: 7px;\n padding: 12px 18px;\n display: grid;\n}\n\n.arkme-remote-rename input {\n box-sizing: border-box;\n color: #20232c;\n min-width: 0;\n height: 34px;\n font: inherit;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n outline: 0;\n padding: 0 10px;\n font-size: 12px;\n}\n\n.arkme-remote-rename input:focus {\n border-color: #6eb3f3;\n box-shadow: 0 0 0 3px #3b9cf51f;\n}\n\n.arkme-remote-rename button {\n color: #4f5560;\n min-height: 34px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #e0e1e4;\n border-radius: 9px;\n padding: 0 11px;\n font-size: 11px;\n}\n\n.arkme-remote-rename button[type=\"submit\"] {\n color: #fff;\n background: #20232c;\n border-color: #20232c;\n}\n\n.arkme-remote-rename button:disabled {\n opacity: .5;\n cursor: default;\n}\n\n.arkme-remote-error {\n margin: -22px 0 0;\n}\n\n.arkme-remote-dialog-backdrop {\n z-index: 1200;\n box-sizing: border-box;\n backdrop-filter: blur(1.5px);\n background: #16181d47;\n place-items: center;\n padding: 24px;\n display: grid;\n position: fixed;\n inset: 0;\n overflow: auto;\n}\n\n.arkme-remote-dialog {\n box-sizing: border-box;\n color: #20232c;\n background: #fff;\n border: 1px solid #14182014;\n border-radius: 19px;\n width: min(440px, 100vw - 32px);\n max-height: calc(100vh - 48px);\n padding: 28px;\n position: relative;\n overflow: auto;\n box-shadow: 0 18px 54px #11141b2e;\n}\n\n.arkme-remote-dialog-close {\n color: #777c85;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n justify-content: center;\n align-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n position: absolute;\n top: 16px;\n right: 16px;\n}\n\n.arkme-remote-dialog-close:hover {\n color: #20232c;\n background: #f3f3f4;\n}\n\n.arkme-remote-dialog-symbol {\n color: #343944;\n justify-content: center;\n align-items: center;\n gap: 9px;\n height: 38px;\n display: flex;\n}\n\n.arkme-remote-dialog-symbol > span {\n background: #d6d8dc;\n width: 28px;\n height: 1px;\n}\n\n.arkme-remote-dialog > header {\n text-align: center;\n margin: 12px 0 22px;\n}\n\n.arkme-remote-dialog h2 {\n letter-spacing: -.02em;\n margin: 0;\n font-size: 19px;\n font-weight: 620;\n line-height: 27px;\n}\n\n.arkme-remote-dialog header p {\n color: #858992;\n margin: 6px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-remote-pairing-tabs {\n box-sizing: border-box;\n background: #f1f1f2;\n border-radius: 11px;\n grid-template-columns: 1fr 1fr;\n gap: 3px;\n height: 38px;\n padding: 3px;\n display: grid;\n}\n\n.arkme-remote-pairing-tabs button {\n color: #737881;\n font: inherit;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 8px;\n font-size: 11px;\n}\n\n.arkme-remote-pairing-tabs button[aria-selected=\"true\"] {\n color: #252831;\n background: #fff;\n box-shadow: 0 1px 3px #14182017;\n}\n\n.arkme-remote-pairing-display {\n box-sizing: border-box;\n background: #fff;\n border: 1px solid #e5e6e8;\n border-radius: 16px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n min-height: 308px;\n margin-top: 14px;\n padding: 24px;\n display: flex;\n position: relative;\n}\n\n.arkme-remote-pairing-display > img {\n width: 232px;\n height: 232px;\n image-rendering: pixelated;\n display: block;\n}\n\n.arkme-remote-pairing-display > p {\n color: #8b9098;\n text-align: center;\n margin: 10px 0 0;\n font-size: 10px;\n line-height: 16px;\n}\n\n.arkme-remote-pairing-code {\n color: #20232c;\n letter-spacing: .17em;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n user-select: all;\n font-size: 33px;\n font-weight: 620;\n line-height: 46px;\n}\n\n.arkme-remote-pairing-tools {\n gap: 4px;\n display: flex;\n position: absolute;\n bottom: 12px;\n right: 12px;\n}\n\n.arkme-remote-pairing-tools button {\n color: #8a8f97;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 8px;\n justify-content: center;\n align-items: center;\n width: 30px;\n height: 30px;\n padding: 0;\n display: inline-flex;\n}\n\n.arkme-remote-pairing-tools button:hover {\n color: #343944;\n background: #f3f3f4;\n}\n\n.arkme-remote-pairing-expired {\n text-align: center;\n justify-items: center;\n gap: 7px;\n display: grid;\n}\n\n.arkme-remote-pairing-expired strong {\n font-size: 14px;\n line-height: 20px;\n}\n\n.arkme-remote-pairing-expired p {\n color: #8b9098;\n margin: 0;\n font-size: 11px;\n}\n\n.arkme-remote-pairing-expired button {\n color: #fff;\n min-height: 32px;\n font: inherit;\n cursor: pointer;\n background: #20232c;\n border: 0;\n border-radius: 9px;\n margin-top: 7px;\n padding: 0 12px;\n font-size: 11px;\n}\n\n.arkme-remote-dialog-note {\n color: #858992;\n align-items: flex-start;\n gap: 7px;\n margin: 14px 2px 0;\n font-size: 10px;\n line-height: 16px;\n display: flex;\n}\n\n.arkme-remote-dialog-note > svg {\n color: #5e856d;\n flex: none;\n margin-top: 1px;\n}\n\n.arkme-remote-settings-close:focus-visible, .arkme-remote-icon-button:focus-visible, .arkme-remote-add-button:focus-visible, .arkme-remote-switch:focus-visible, .arkme-remote-device-row > button:focus-visible, .arkme-remote-name-row:focus-visible, .arkme-remote-rename button:focus-visible, .arkme-remote-dialog button:focus-visible {\n outline-offset: 2px;\n outline: 2px solid #3b9cf5;\n}\n\n@media (width <= 520px) {\n .arkme-remote-settings-dialog-backdrop {\n padding: 10px;\n }\n\n .arkme-remote-settings-dialog {\n border-radius: 17px;\n width: calc(100vw - 20px);\n max-height: calc(100vh - 20px);\n }\n\n .arkme-remote-page-header {\n min-height: 68px;\n padding: 0 16px 0 20px;\n }\n\n .arkme-remote-page-header p {\n display: none;\n }\n\n .arkme-remote-settings-dialog-body {\n gap: 24px;\n padding: 20px 18px 22px;\n }\n\n .arkme-remote-section-header p {\n display: none;\n }\n\n .arkme-remote-device-row {\n grid-template-columns: 22px minmax(0, 1fr);\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .arkme-remote-device-row > button {\n grid-column: 2;\n justify-self: start;\n }\n\n .arkme-remote-dialog-backdrop {\n padding: 12px;\n }\n\n .arkme-remote-dialog {\n padding: 24px 20px;\n }\n\n .arkme-remote-pairing-display {\n min-height: 282px;\n padding: 18px;\n }\n\n .arkme-remote-pairing-display > img {\n width: min(224px, 100%);\n height: auto;\n }\n\n .arkme-remote-pairing-code {\n letter-spacing: .12em;\n font-size: 26px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-remote-switch, .arkme-remote-switch > span {\n transition: none;\n }\n}\n\n.arkme-redesign-model-settings {\n color: #20232c;\n background: #fff;\n width: 100%;\n height: 100%;\n overflow-y: auto;\n}\n\n.arkme-redesign-model-settings > header {\n width: min(760px, 100% - 96px);\n margin: 0 auto;\n padding: 42px 0 22px;\n}\n\n.arkme-redesign-model-settings > header button {\n color: #525762;\n height: 34px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #e1e2e5;\n border-radius: 18px;\n align-items: center;\n gap: 4px;\n padding: 0 10px 0 7px;\n font-size: 13px;\n display: inline-flex;\n}\n\n.arkme-redesign-model-settings > header button:hover {\n color: #20232c;\n background: #f6f6f7;\n}\n\n.arkme-redesign-model-settings-body {\n width: min(760px, 100% - 96px);\n margin: 0 auto;\n padding: 0 0 68px;\n}\n\n.arkme-redesign-model-settings-body > * {\n max-width: none !important;\n}\n\n.arkme-redesign-task-start {\n place-items: center;\n width: 100%;\n height: 100%;\n padding: 28px 58px 64px;\n display: grid;\n}\n\n.arkme-redesign-task-start-inner {\n text-align: center;\n width: min(760px, 88%);\n transform: translateY(-12px);\n}\n\n.arkme-redesign-task-greeting {\n justify-content: center;\n align-items: center;\n gap: 12px;\n margin-bottom: 24px;\n display: flex;\n}\n\n.arkme-redesign-task-greeting img {\n object-fit: contain;\n flex: none;\n width: 62px;\n height: 16px;\n display: block;\n}\n\n.arkme-redesign-task-start h1 {\n letter-spacing: -.03em;\n margin: 0;\n font-size: 29px;\n font-weight: 600;\n line-height: 1.15;\n}\n\n.arkme-redesign-hero-input {\n border: 1px solid var(--arkme-focus);\n text-align: left;\n background: #fff;\n border-radius: 17px;\n grid-template-rows: minmax(56px, 1fr) auto;\n min-height: 142px;\n padding: 17px 16px 13px 20px;\n display: grid;\n box-shadow: 0 8px 30px #1c1f270b;\n}\n\n.arkme-redesign-hero-input:focus-within {\n border-color: #aebdff;\n box-shadow: 0 10px 38px #36488c13, 0 0 0 3px #91a4ff12;\n}\n\n.arkme-redesign-hero-input textarea {\n resize: none;\n color: #20232c;\n border: 0;\n outline: 0;\n width: 100%;\n min-height: 58px;\n padding: 0;\n font-size: 15px;\n line-height: 1.6;\n}\n\n.arkme-redesign-hero-input textarea::placeholder {\n color: #a3a6ad;\n}\n\n.arkme-redesign-hero-controls {\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n display: flex;\n}\n\n.arkme-redesign-hero-controls > div {\n align-items: center;\n gap: 7px;\n display: flex;\n}\n\n.arkme-redesign-source-button {\n border-radius: 22px;\n align-items: center;\n gap: 8px;\n height: 36px;\n padding: 0 13px;\n font-size: 13px;\n display: flex;\n border: 1px solid #e2e3e6 !important;\n}\n\n.arkme-redesign-round-tool, .arkme-redesign-send-task {\n border-radius: 50%;\n place-items: center;\n width: 40px;\n height: 40px;\n display: grid;\n border: 1px solid #e2e3e6 !important;\n}\n\n.arkme-redesign-round-tool:hover {\n background: #f5f5f6;\n}\n\n.arkme-redesign-send-task {\n color: #fff !important;\n background: #20232d !important;\n border: 0 !important;\n}\n\n.arkme-redesign-send-task:disabled {\n cursor: default;\n background: #d9dade !important;\n}\n\n.arkme-redesign-task-error {\n color: #b84747;\n text-align: left;\n margin-top: 10px;\n font-size: 12px;\n}\n\n.arkme-redesign-starters {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n width: calc(100% - 18px);\n margin: 22px auto 0;\n display: grid;\n}\n\n.arkme-redesign-starters > button {\n text-align: left;\n border-right: 1px solid #e7e7e9;\n align-items: center;\n gap: 12px;\n min-width: 0;\n min-height: 48px;\n padding: 4px 18px;\n display: flex;\n}\n\n.arkme-redesign-starters > button:last-child {\n border-right: 0;\n}\n\n.arkme-redesign-starters > button:hover strong {\n color: #5365ad;\n}\n\n.arkme-redesign-starter-icon {\n color: #30333b;\n border: 1px solid #e2e3e6;\n border-radius: 50%;\n flex: none;\n place-items: center;\n width: 38px;\n height: 38px;\n display: grid;\n}\n\n.arkme-redesign-starters > button > span:last-child {\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-starters strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 13px;\n font-weight: 500;\n overflow: hidden;\n}\n\n.arkme-redesign-starters small {\n color: #8d919a;\n font-size: 12px;\n}\n\n.arkme-redesign-details {\n z-index: 4;\n top: var(--arkme-native-titlebar);\n background: #fff;\n border-left: 1px solid #e7e7e9;\n width: 360px;\n position: absolute;\n bottom: 0;\n right: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-calendar-overlay {\n z-index: 14;\n inset: var(--arkme-native-titlebar) 0 0;\n pointer-events: none;\n position: absolute;\n}\n\n.arkme-redesign-calendar-overlay > * {\n pointer-events: auto;\n}\n\n.arkme-redesign-overlays {\n z-index: 20;\n pointer-events: none;\n position: absolute;\n inset: 0;\n}\n\n.arkme-redesign-overlays > * {\n pointer-events: auto;\n}\n\n.arkme-workspace-dialog-backdrop {\n z-index: 60;\n backdrop-filter: blur(2px);\n background: #181b2238;\n place-items: center;\n padding: 28px;\n display: grid;\n position: absolute;\n inset: 0;\n}\n\n.arkme-workspace-dialog {\n background: #fff;\n border: 1px solid #dddfe4;\n border-radius: 18px;\n grid-template-rows: auto auto minmax(0, 1fr) auto;\n width: min(640px, 100%);\n height: min(620px, 100%);\n min-height: 420px;\n display: grid;\n overflow: hidden;\n box-shadow: 0 24px 70px #191c232e;\n}\n\n.arkme-workspace-dialog > header {\n justify-content: space-between;\n align-items: flex-start;\n gap: 18px;\n padding: 22px 24px 16px;\n display: flex;\n}\n\n.arkme-workspace-dialog > header span {\n color: #8b8e96;\n font-size: 10px;\n}\n\n.arkme-workspace-dialog > header h2 {\n margin: 5px 0 0;\n font-size: 19px;\n font-weight: 600;\n}\n\n.arkme-workspace-dialog > header > button {\n border-radius: 9px;\n place-items: center;\n width: 32px;\n height: 32px;\n display: grid;\n}\n\n.arkme-workspace-dialog > nav {\n border-top: 1px solid #ececef;\n border-bottom: 1px solid #ececef;\n align-items: center;\n gap: 2px;\n min-height: 42px;\n padding: 0 22px;\n display: flex;\n overflow-x: auto;\n}\n\n.arkme-workspace-dialog > nav > span {\n white-space: nowrap;\n color: #9a9da5;\n align-items: center;\n gap: 2px;\n display: inline-flex;\n}\n\n.arkme-workspace-dialog > nav button {\n color: #666a73;\n border-radius: 8px;\n align-items: center;\n gap: 5px;\n height: 30px;\n padding: 0 7px;\n font-size: 11px;\n display: inline-flex;\n}\n\n.arkme-workspace-directory-list {\n min-height: 0;\n padding: 10px 14px;\n overflow-y: auto;\n}\n\n.arkme-workspace-directory-list > button {\n text-align: left;\n border-radius: 11px;\n grid-template-columns: 34px minmax(0, 1fr) 18px;\n align-items: center;\n gap: 9px;\n width: 100%;\n height: 48px;\n padding: 0 11px;\n display: grid;\n}\n\n.arkme-workspace-directory-list > button:hover {\n background: #f5f5f7;\n}\n\n.arkme-workspace-directory-list > button > span {\n color: #636873;\n border: 1px solid #e5e6e9;\n border-radius: 9px;\n place-items: center;\n width: 32px;\n height: 32px;\n display: grid;\n}\n\n.arkme-workspace-directory-list strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n font-weight: 500;\n overflow: hidden;\n}\n\n.arkme-workspace-dialog-status, .arkme-workspace-dialog-error {\n color: #8c9098;\n text-align: center;\n padding: 54px 16px;\n font-size: 12px;\n}\n\n.arkme-workspace-dialog-error {\n color: #b94b4b;\n}\n\n.arkme-workspace-dialog > footer {\n border-top: 1px solid #e8e9ec;\n justify-content: space-between;\n align-items: center;\n gap: 18px;\n min-height: 72px;\n padding: 12px 18px;\n display: flex;\n}\n\n.arkme-workspace-dialog-back {\n color: #696d76;\n align-items: center;\n gap: 6px;\n height: 36px;\n padding: 0 10px;\n font-size: 11px;\n display: inline-flex;\n}\n\n.arkme-workspace-dialog > footer > div {\n align-items: center;\n gap: 12px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-workspace-dialog > footer small {\n white-space: nowrap;\n text-overflow: ellipsis;\n color: #92959d;\n max-width: 280px;\n font-size: 9px;\n overflow: hidden;\n}\n\n.arkme-workspace-dialog > footer > div > button {\n color: #fff;\n background: #20232d;\n border-radius: 10px;\n flex: none;\n height: 38px;\n padding: 0 17px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.arkme-workspace-dialog button:disabled {\n opacity: .48;\n cursor: default;\n}\n\n.arkme-redesign-placeholder {\n color: #858992;\n text-align: center;\n place-content: center;\n justify-items: center;\n width: 100%;\n height: 100%;\n display: grid;\n}\n\n.arkme-redesign-placeholder > span {\n color: #555a64;\n border: 1px solid #e1e2e5;\n border-radius: 14px;\n place-items: center;\n width: 48px;\n height: 48px;\n display: grid;\n}\n\n.arkme-redesign-placeholder h1 {\n color: #3e424b;\n margin: 16px 0 7px;\n font-size: 18px;\n}\n\n.arkme-redesign-placeholder p {\n margin: 0;\n font-size: 12px;\n}\n\nbody[data-ds-dark-theme] [data-arkme-workspace] {\n --arkme-line: var(--dsw-alias-border-l1);\n --arkme-muted: var(--dsw-alias-label-tertiary);\n --arkme-soft: var(--dsw-alias-bg-layer-2);\n --arkme-focus: var(--dsw-alias-state-business-primary);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"], body[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] {\n background: var(--dsw-specific-sidebar-fill) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-brand\"] {\n box-shadow: none;\n background: none !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-workspace] [data-arkme-theme-image=\"light\"] {\n display: none !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-workspace] [data-arkme-theme-image=\"dark\"] {\n display: block !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] > div {\n border-color: var(--dsw-alias-border-l1) !important;\n background: var(--dsw-alias-bg-layer-1) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] {\n background: var(--dsw-alias-bg-base) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] .arkme-conversation-surface, body[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] .arkme-conversation-composer {\n background: var(--dsw-alias-bg-base) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] div:has( > input[aria-label=\"搜索\"]) {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] button:hover {\n background: var(--dsw-alias-interactive-bg-hover) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] button[aria-current=\"page\"] {\n background: var(--dsw-alias-interactive-bg-active) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] button[aria-current=\"page\"] > span[aria-hidden=\"true\"] {\n background: var(--dsw-alias-state-business-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"], body[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"], body[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] [aria-label=\"Arkme 会话列表\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] {\n background: var(--dsw-alias-bg-base) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] label:has( > input[aria-label=\"搜索对话或消息\"]), body[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] button[aria-label=\"新任务\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] label:has( > input[aria-label=\"搜索对话或消息\"]), body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] button[aria-label=\"新任务\"] {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] [role=\"treeitem\"][aria-selected=\"true\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] [role=\"treeitem\"][aria-selected=\"true\"] {\n background: var(--dsw-alias-interactive-bg-active) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] [role=\"status\"][aria-label$=\"个人测试版\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] [role=\"status\"][aria-label$=\"个人测试版\"] {\n background: var(--dsw-alias-bg-layer-2) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"] .arkme-conversation-composer {\n background: var(--dsw-alias-bg-base) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-recordings-page [aria-label=\"全天候录音操作\"] > div > button, body[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"] [aria-label=\"全天候录音操作\"] > div > button {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-button-elevated-fill) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-recordings-page [aria-label=\"全天候录音操作\"] > div > button:first-child, body[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"] [aria-label=\"全天候录音操作\"] > div > button:first-child {\n border-color: var(--dsw-alias-button-primary-fill) !important;\n background: var(--dsw-alias-button-primary-fill) !important;\n color: var(--dsw-alias-label-primary-inverted) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-update-popover, body[data-ds-dark-theme] .arkme-update-capsule {\n border-color: var(--dsw-alias-border-l1);\n background: color-mix(in srgb, var(--dsw-alias-bg-base) 94%, transparent);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-update-popover-heading h2, body[data-ds-dark-theme] .arkme-update-release-notes strong, body[data-ds-dark-theme] .arkme-update-capsule-copy strong {\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-update-popover-heading span, body[data-ds-dark-theme] .arkme-update-popover-summary, body[data-ds-dark-theme] .arkme-update-release-notes small, body[data-ds-dark-theme] .arkme-update-capsule-copy small {\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-update-release-notes, body[data-ds-dark-theme] .arkme-update-release-notes > div + div {\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-update-later, body[data-ds-dark-theme] .arkme-update-progress, body[data-ds-dark-theme] .arkme-update-rail:not(.is-available) {\n background: var(--dsw-alias-fill-l1);\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) > div > section[aria-label=\"客户端日历\"], body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) > div > section[aria-label=\"当天内容\"] {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-bg-layer-1) !important;\n color: var(--dsw-alias-label-primary) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) > div > section[aria-label=\"客户端日历\"] > span[aria-hidden] {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-bg-layer-1) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] > header button, body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[aria-label*=\"记录\"] {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] > div > span {\n color: var(--dsw-alias-label-tertiary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"false\"][aria-label*=\"条记录\"] > span:last-child {\n background: var(--dsw-alias-bg-layer-2) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"true\"], body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"true\"] > span {\n color: var(--dsw-alias-label-primary-inverted) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"true\"] > span:last-child {\n color: var(--dsw-alias-label-primary-inverted) !important;\n background: none !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article > div > div:last-child {\n border-color: var(--dsw-alias-border-l1) !important;\n background: var(--dsw-alias-bg-layer-2) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article h3, body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article p {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article time, body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article span {\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-root, body[data-ds-dark-theme] .arkme-redesign-chat-panel, body[data-ds-dark-theme] .arkme-redesign-content, body[data-ds-dark-theme] .arkme-redesign-feature-page, body[data-ds-dark-theme] .arkme-redesign-recordings-page, body[data-ds-dark-theme] .arkme-redesign-plugins-page, body[data-ds-dark-theme] .arkme-redesign-model-settings, body[data-ds-dark-theme] .arkme-redesign-details {\n background: var(--dsw-alias-bg-base);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-native-desktop .arkme-redesign-root:before {\n background: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-specific-sidebar-fill);\n box-shadow: var(--dsw-shadow-lv2);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button, body[data-ds-dark-theme] .arkme-redesign-rail-footer > button, body[data-ds-dark-theme] .arkme-redesign-profile-menu button, body[data-ds-dark-theme] .arkme-redesign-task-list > button, body[data-ds-dark-theme] .arkme-redesign-task-first, body[data-ds-dark-theme] .arkme-workspace-dialog > nav button, body[data-ds-dark-theme] .arkme-workspace-dialog-back, body[data-ds-dark-theme] .arkme-redesign-placeholder > span {\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button:hover, body[data-ds-dark-theme] .arkme-redesign-rail-footer > button:hover, body[data-ds-dark-theme] .arkme-redesign-profile-menu button:hover, body[data-ds-dark-theme] .arkme-redesign-chat-search:hover, body[data-ds-dark-theme] .arkme-redesign-task-section-title button:hover, body[data-ds-dark-theme] .arkme-redesign-task-list > button:hover, body[data-ds-dark-theme] .arkme-redesign-task-first:hover, body[data-ds-dark-theme] .arkme-extension-toolbar > button:hover, body[data-ds-dark-theme] button.arkme-redesign-setting-row:hover, body[data-ds-dark-theme] a.arkme-redesign-setting-row:hover, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button:hover, body[data-ds-dark-theme] .arkme-redesign-round-tool:hover, body[data-ds-dark-theme] .arkme-workspace-directory-list > button:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button.is-active, body[data-ds-dark-theme] .arkme-redesign-rail-footer > button.is-active, body[data-ds-dark-theme] .arkme-redesign-task-list > button.is-selected {\n background: var(--dsw-alias-interactive-bg-active);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button.is-active:before {\n background: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-footer, body[data-ds-dark-theme] .arkme-redesign-profile-menu, body[data-ds-dark-theme] .arkme-redesign-task-section, body[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-header, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-history button, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-quick button, body[data-ds-dark-theme] .arkme-redesign-settings-group h2, body[data-ds-dark-theme] .arkme-redesign-setting-row, body[data-ds-dark-theme] .arkme-account-info-row, body[data-ds-dark-theme] .arkme-redesign-starters > button, body[data-ds-dark-theme] .arkme-redesign-details, body[data-ds-dark-theme] .arkme-workspace-dialog > nav, body[data-ds-dark-theme] .arkme-workspace-dialog > footer {\n border-color: var(--dsw-alias-border-l1) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-profile-popover, body[data-ds-dark-theme] .arkme-workspace-dialog {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-specific-menu);\n box-shadow: var(--dsw-shadow-lv3);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-profile-head small, body[data-ds-dark-theme] .arkme-redesign-profile-menu small, body[data-ds-dark-theme] .arkme-redesign-profile-menu button > svg:last-child, body[data-ds-dark-theme] .arkme-redesign-task-section-title, body[data-ds-dark-theme] .arkme-redesign-task-copy small, body[data-ds-dark-theme] .arkme-account-profile-qr, body[data-ds-dark-theme] .arkme-redesign-feature-page > header p, body[data-ds-dark-theme] .arkme-redesign-feature-page > header span, body[data-ds-dark-theme] .arkme-redesign-search-page input[aria-label=\"搜索\"]:not(:focus)::placeholder, body[data-ds-dark-theme] .arkme-redesign-settings-profile p, body[data-ds-dark-theme] .arkme-redesign-settings-group h2, body[data-ds-dark-theme] .arkme-redesign-setting-summary, body[data-ds-dark-theme] .arkme-account-info-copy > small, body[data-ds-dark-theme] .arkme-account-info-action, body[data-ds-dark-theme] .arkme-account-info-row > svg, body[data-ds-dark-theme] .arkme-account-info-icon, body[data-ds-dark-theme] .arkme-redesign-setting-row > svg, body[data-ds-dark-theme] .arkme-redesign-hero-input textarea::placeholder, body[data-ds-dark-theme] .arkme-redesign-starters small, body[data-ds-dark-theme] .arkme-workspace-dialog > header span, body[data-ds-dark-theme] .arkme-workspace-dialog > nav > span, body[data-ds-dark-theme] .arkme-workspace-dialog-status, body[data-ds-dark-theme] .arkme-workspace-dialog > footer small, body[data-ds-dark-theme] .arkme-redesign-placeholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-chat-search, body[data-ds-dark-theme] .arkme-extension-toolbar label, body[data-ds-dark-theme] .arkme-extension-toolbar > button, body[data-ds-dark-theme] .arkme-redesign-settings-group, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button, body[data-ds-dark-theme] .arkme-redesign-source-button, body[data-ds-dark-theme] .arkme-redesign-round-tool, body[data-ds-dark-theme] .arkme-redesign-starter-icon, body[data-ds-dark-theme] .arkme-workspace-directory-list > button > span, body[data-ds-dark-theme] .arkme-redesign-placeholder > span {\n border-color: var(--dsw-alias-border-l2) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-chat-search, body[data-ds-dark-theme] .arkme-extension-toolbar label {\n color: var(--dsw-alias-label-tertiary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-extension-toolbar input, body[data-ds-dark-theme] .arkme-redesign-settings-profile h1, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button, body[data-ds-dark-theme] .arkme-redesign-task-start h1, body[data-ds-dark-theme] .arkme-redesign-hero-input textarea, body[data-ds-dark-theme] .arkme-redesign-starter-icon, body[data-ds-dark-theme] .arkme-redesign-placeholder h1 {\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-list, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button, body[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-card {\n background: var(--dsw-alias-bg-layer-1) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-settings-surface, body[data-ds-dark-theme] .arkme-redesign-settings-group {\n color: var(--dsw-alias-label-primary);\n background: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-account-dialog {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-specific-menu);\n color: var(--dsw-alias-label-primary);\n box-shadow: var(--dsw-shadow-lv3);\n}\n\nbody[data-ds-dark-theme] .arkme-account-dialog > header, body[data-ds-dark-theme] .arkme-account-qr-card {\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-account-qr-card, body[data-ds-dark-theme] .arkme-account-form input, body[data-ds-dark-theme] .arkme-account-code-row button, body[data-ds-dark-theme] .arkme-account-dialog-actions button {\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-border-l2);\n}\n\nbody[data-ds-dark-theme] .arkme-account-dialog-actions button[type=\"submit\"], body[data-ds-dark-theme] .arkme-account-dialog-actions button:last-child {\n border-color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-base);\n}\n\nbody[data-ds-dark-theme] .arkme-account-rule, body[data-ds-dark-theme] .arkme-account-qr-card span, body[data-ds-dark-theme] .arkme-account-qr-card small, body[data-ds-dark-theme] .arkme-account-form label {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-surface, body[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-center-embedded > section {\n background: var(--dsw-alias-bg-base) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-composer-inner, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-box {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n color: var(--dsw-alias-label-primary) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"] {\n box-shadow: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"][data-arkme-composer-focused=\"true\"] {\n background: color-mix(in srgb, var(--dsw-alias-bg-base, #fff) 97%, #000) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-greeting img {\n filter: invert() hue-rotate(180deg);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-hero-input {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n color: var(--dsw-alias-label-primary) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-hero-input textarea {\n background: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-source-button, body[data-ds-dark-theme] .arkme-redesign-round-tool, body[data-ds-dark-theme] .arkme-redesign-starter-icon {\n background: var(--dsw-alias-button-elevated-fill) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-history button, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-quick button {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-card {\n border-color: var(--dsw-alias-border-l1) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-card:hover {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-interactive-bg-hover) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-section:focus-within .arkme-redesign-task-list {\n box-shadow: var(--dsw-shadow-lv2);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-settings-error {\n background: var(--dsw-alias-interactive-bg-hover-danger);\n color: var(--dsw-alias-state-error-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-page-header h1, body[data-ds-dark-theme] .arkme-remote-section-header h2, body[data-ds-dark-theme] .arkme-remote-allow-row strong, body[data-ds-dark-theme] .arkme-remote-device-row strong, body[data-ds-dark-theme] .arkme-remote-name-row strong, body[data-ds-dark-theme] .arkme-remote-dialog, body[data-ds-dark-theme] .arkme-remote-pairing-code {\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-section-header p, body[data-ds-dark-theme] .arkme-remote-page-header p, body[data-ds-dark-theme] .arkme-remote-allow-row span, body[data-ds-dark-theme] .arkme-remote-device-row span, body[data-ds-dark-theme] .arkme-remote-name-row small, body[data-ds-dark-theme] .arkme-remote-dialog header p, body[data-ds-dark-theme] .arkme-remote-pairing-display > p, body[data-ds-dark-theme] .arkme-remote-dialog-note, body[data-ds-dark-theme] .arkme-remote-empty-row {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-card, body[data-ds-dark-theme] .arkme-remote-settings-dialog, body[data-ds-dark-theme] .arkme-remote-dialog, body[data-ds-dark-theme] .arkme-remote-pairing-display, body[data-ds-dark-theme] .arkme-remote-rename input {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-allow-row, body[data-ds-dark-theme] .arkme-remote-device-row, body[data-ds-dark-theme] .arkme-remote-rename, body[data-ds-dark-theme] .arkme-remote-page-header {\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-close, body[data-ds-dark-theme] .arkme-remote-icon-button, body[data-ds-dark-theme] .arkme-remote-dialog-close, body[data-ds-dark-theme] .arkme-remote-pairing-tools button, body[data-ds-dark-theme] .arkme-remote-name-row {\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-close:hover, body[data-ds-dark-theme] .arkme-remote-icon-button:hover, body[data-ds-dark-theme] .arkme-remote-dialog-close:hover, body[data-ds-dark-theme] .arkme-remote-pairing-tools button:hover, body[data-ds-dark-theme] .arkme-remote-name-row:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-add-button, body[data-ds-dark-theme] .arkme-remote-rename button[type=\"submit\"], body[data-ds-dark-theme] .arkme-remote-pairing-expired button {\n background: var(--dsw-alias-button-primary-fill);\n color: var(--dsw-alias-label-primary-inverted);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-device-row > button, body[data-ds-dark-theme] .arkme-remote-rename button {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-switch[aria-checked=\"true\"] {\n background: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-pairing-tabs {\n background: var(--dsw-alias-bg-layer-2);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-pairing-tabs button {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-pairing-tabs button[aria-selected=\"true\"] {\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-dialog-backdrop, body[data-ds-dark-theme] .arkme-remote-dialog-backdrop {\n background: #07090d8f;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-setting-row > strong.is-danger, body[data-ds-dark-theme] .arkme-redesign-task-error, body[data-ds-dark-theme] .arkme-workspace-dialog-error {\n color: var(--dsw-alias-state-error-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-state.is-complete > i {\n background: var(--dsw-alias-state-success-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-state.is-complete > i:after {\n background: var(--dsw-alias-state-success-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-matrix i, body[data-ds-dark-theme] .arkme-redesign-rail-primary button.is-active:before {\n background: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-hero-input:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: 0 0 0 3px var(--dsw-alias-state-business-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-starters > button:hover strong {\n color: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-send-task, body[data-ds-dark-theme] .arkme-workspace-dialog > footer > div > button {\n background: var(--dsw-alias-button-primary-fill) !important;\n color: var(--dsw-alias-label-primary-inverted) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-send-task:disabled {\n background: var(--dsw-alias-button-elevated-fill) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-workspace-dialog-backdrop {\n background: var(--dsw-alias-bg-mask-1);\n}\n\n@media (width <= 1024px) {\n .arkme-redesign-chat-panel {\n width: 264px;\n left: 82px;\n }\n\n .arkme-redesign-content {\n left: 82px;\n }\n\n .arkme-redesign-content.has-panel {\n left: 346px;\n }\n\n .arkme-redesign-rail {\n left: 12px;\n }\n\n .arkme-redesign-starters > button {\n padding: 0 10px;\n }\n\n .arkme-redesign-feature-page {\n padding-left: 30px;\n padding-right: 30px;\n }\n}\n\n@media (width <= 820px) {\n .arkme-redesign-chat-panel {\n display: none;\n }\n\n .arkme-redesign-content.has-panel {\n left: 82px;\n }\n\n .arkme-redesign-task-start {\n padding: 28px;\n }\n\n .arkme-redesign-starters {\n grid-template-columns: 1fr;\n gap: 6px;\n }\n\n .arkme-redesign-starters > button {\n border-right: 0;\n }\n\n .arkme-voiceprint-relationships {\n grid-template-columns: minmax(0, 1fr) !important;\n gap: 28px !important;\n }\n\n .arkme-voiceprint-outbound {\n border-left: 0 !important;\n border-top: 1px solid var(--dsw-alias-border-subtle, #e6e7eb) !important;\n padding-top: 28px !important;\n padding-left: 0 !important;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-redesign-task-matrix i {\n opacity: .6;\n animation: none;\n }\n\n .arkme-update-rail.is-downloading svg, .arkme-update-popover, .arkme-update-capsule, .arkme-update-progress.is-indeterminate span {\n animation: none;\n }\n\n .arkme-update-rail, .arkme-update-progress span {\n transition: none;\n }\n}\n\n.arkme-contact-directory, .arkme-directory-detail-pane {\n box-sizing: border-box;\n min-width: 0;\n height: 100%;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #202124);\n font-size: 13px;\n overflow: hidden;\n}\n\n[data-arkme-directory-mode=\"contacts\"] {\n background: var(--dsw-specific-sidebar-fill, #fff) !important;\n border-left-color: var(--dsw-alias-border-l1, #ececef) !important;\n}\n\n.arkme-contact-directory {\n overflow-wrap: anywhere;\n padding: 8px 6px 18px;\n overflow-y: auto;\n}\n\n.arkme-directory-detail-pane {\n overflow: hidden;\n}\n\n.arkme-contact-directory button, .arkme-directory-detail-pane button {\n appearance: none;\n box-sizing: border-box;\n font: inherit;\n color: inherit;\n border: 0;\n margin: 0;\n}\n\n.arkme-contact-directory-section {\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n min-width: 0;\n padding: 2px 0 5px;\n}\n\n.arkme-contact-directory-section-header {\n text-align: left;\n cursor: pointer;\n background: none;\n border-radius: 10px;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-width: 0;\n min-height: 42px;\n padding: 0 10px;\n display: flex;\n}\n\n.arkme-contact-directory-section-title {\n align-items: center;\n gap: 6px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-contact-directory-section-title strong {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 650;\n overflow: hidden;\n}\n\n.arkme-contact-directory-caret {\n width: 14px;\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n transform-origin: center;\n flex: none;\n font-size: 18px;\n line-height: 1;\n transition: transform .16s;\n}\n\n.arkme-contact-directory-section-header[aria-expanded=\"true\"] .arkme-contact-directory-caret {\n transform: rotate(90deg);\n}\n\n.arkme-contact-directory-section-header:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f6f6f7);\n}\n\n.arkme-contact-directory-section-body {\n min-width: 0;\n padding: 0 0 5px;\n}\n\n.arkme-contact-directory-list {\n gap: 1px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-directory-count {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n font-variant-numeric: tabular-nums;\n flex: none;\n font-size: 11px;\n}\n\n.arkme-contact-directory-row {\n text-align: left;\n cursor: pointer;\n background: none;\n border-radius: 13px;\n align-items: center;\n gap: 10px;\n width: 100%;\n min-width: 0;\n min-height: 52px;\n margin: 1px 0;\n padding: 7px 10px;\n display: flex;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row img {\n object-fit: cover;\n border-radius: 50%;\n flex: none;\n width: 38px;\n height: 38px;\n}\n\n.arkme-contact-directory-row.is-static {\n cursor: default;\n}\n\n.arkme-contact-directory-row.is-selected {\n background: var(--dsw-alias-interactive-bg-active, #eef0f4);\n}\n\n.arkme-contact-directory-row:not(.is-static):hover {\n background: var(--dsw-alias-interactive-bg-hover, #f6f6f7);\n}\n\n.arkme-contact-directory-avatar {\n border-radius: 50%;\n flex: none;\n place-items: center;\n width: 38px;\n height: 38px;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row-copy {\n flex: 1;\n align-content: center;\n min-width: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row-copy strong {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 600;\n line-height: 18px;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row-copy small {\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 11px;\n line-height: 16px;\n overflow: hidden;\n}\n\n.arkme-contact-directory-letter {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n padding: 8px 10px 2px;\n font-size: 11px;\n font-weight: 600;\n line-height: 16px;\n}\n\n.arkme-contact-directory-alphabetical, .arkme-contact-directory-letter-group {\n min-width: 0;\n}\n\n.arkme-contact-directory-status, .arkme-contact-directory-warning {\n color: var(--dsw-alias-label-secondary, var(--arkme-muted));\n overflow-wrap: anywhere;\n margin: 3px 8px;\n padding: 7px 9px;\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-contact-directory-warning {\n color: var(--dsw-alias-state-warning-primary, #b45309);\n background: var(--dsw-alias-state-warning-tertiary, #fff7ed);\n border-radius: 9px;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n.arkme-contact-directory-warning button {\n color: inherit;\n cursor: pointer;\n background: none;\n flex: none;\n padding: 2px 4px;\n font-weight: 600;\n}\n\n.arkme-contact-directory-more {\n text-align: center;\n cursor: pointer;\n background: none;\n border-radius: 9px;\n width: calc(100% - 16px);\n min-height: 32px;\n padding: 6px 8px;\n color: var(--dsw-alias-state-business-primary, #4f5fbf) !important;\n margin: 3px 8px !important;\n}\n\n.arkme-contact-directory-empty {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n padding: 14px 12px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-directory-detail-empty {\n background: var(--dsw-alias-bg-base, #fff);\n place-items: center;\n min-width: 0;\n height: 100%;\n min-height: 0;\n display: grid;\n}\n\n.arkme-directory-detail-logo {\n object-fit: contain;\n opacity: .9;\n width: 96px;\n height: 96px;\n}\n\n.arkme-contact-detail, .arkme-contact-profile, .arkme-contact-world-card, .arkme-unmarked-speaker-summary, .arkme-unmarked-speaker-audio, .arkme-unmarked-speaker-choice {\n overflow-wrap: anywhere;\n min-width: 0;\n}\n\n.arkme-contact-detail {\n background: var(--dsw-alias-bg-base, #fff);\n grid-template-rows: auto minmax(0, 1fr);\n height: 100%;\n min-height: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-profile {\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n padding: 32px clamp(24px, 5vw, 56px);\n}\n\n.arkme-contact-profile-main {\n grid-template-columns: 72px minmax(0, 1fr) auto;\n align-items: center;\n gap: 18px;\n width: min(100%, 760px);\n margin: 0 auto;\n display: grid;\n}\n\n.arkme-contact-profile-avatar {\n border-radius: 50%;\n place-items: center;\n width: 72px;\n height: 72px;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-profile-identity {\n gap: 8px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-profile-name {\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0;\n font-size: 20px;\n font-weight: 650;\n line-height: 28px;\n display: block;\n overflow: hidden;\n}\n\n.arkme-contact-profile-fields {\n gap: 4px;\n margin: 0;\n display: grid;\n}\n\n.arkme-contact-profile-fields > div {\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #68707c);\n gap: 4px;\n font-size: 12px;\n line-height: 18px;\n display: flex;\n}\n\n.arkme-contact-profile-fields dt, .arkme-contact-profile-fields dd {\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0;\n overflow: hidden;\n}\n\n.arkme-contact-profile-fields dt {\n flex: none;\n}\n\n[data-arkme-workspace] .arkme-contact-profile-message {\n background: var(--dsw-alias-button-primary-fill, #5667cc);\n cursor: pointer;\n border-radius: 10px;\n min-height: 36px;\n padding: 0 16px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary-inverted, #fff) !important;\n}\n\n.arkme-contact-profile-message:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-contact-profile-error, .arkme-contact-profile-message-error {\n max-width: 760px;\n color: var(--dsw-alias-state-error-primary, #b42318);\n overflow-wrap: anywhere;\n margin: 0 auto;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-contact-profile-error {\n background: var(--dsw-alias-state-error-tertiary, #fff1f0);\n border-radius: 10px;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n display: flex;\n}\n\n.arkme-contact-profile-status {\n max-width: 760px;\n color: var(--dsw-alias-label-secondary, var(--arkme-muted));\n margin: 0 auto;\n padding: 24px 0;\n font-size: 12px;\n}\n\n.arkme-team-detail {\n background: var(--dsw-alias-bg-base, #fff);\n grid-template-rows: auto minmax(0, 1fr);\n min-width: 0;\n height: 100%;\n min-height: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-team-detail-header {\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n min-width: 0;\n padding: 32px clamp(24px, 5vw, 56px);\n}\n\n.arkme-team-detail-header-main {\n grid-template-columns: 72px minmax(0, 1fr) auto;\n align-items: center;\n gap: 18px;\n width: min(100%, 760px);\n min-width: 0;\n margin: 0 auto;\n display: grid;\n}\n\n.arkme-team-detail-glyph {\n background: var(--dsw-alias-state-business-tertiary, #eef0ff);\n width: 72px;\n height: 72px;\n color: var(--dsw-alias-state-business-primary, #4f5fbf);\n border-radius: 20px;\n place-items: center;\n font-size: 20px;\n font-weight: 700;\n line-height: 1;\n display: grid;\n}\n\n.arkme-team-detail-summary {\n gap: 7px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-team-detail-header h1 {\n text-overflow: ellipsis;\n white-space: nowrap;\n letter-spacing: -.02em;\n margin: 0;\n font-size: 20px;\n font-weight: 650;\n line-height: 28px;\n overflow: hidden;\n}\n\n.arkme-team-detail-meta {\n flex-wrap: wrap;\n align-items: center;\n gap: 7px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-team-detail-public-id {\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 12px;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-team-role-badge, .arkme-team-member-role {\n background: var(--dsw-alias-bg-layer-2, #f2f3f5);\n color: var(--dsw-alias-label-secondary, #68707c);\n border-radius: 999px;\n flex: none;\n font-size: 11px;\n font-weight: 600;\n line-height: 20px;\n}\n\n.arkme-team-role-badge {\n padding: 0 8px;\n}\n\n.arkme-team-detail-count {\n min-width: 58px;\n color: var(--dsw-alias-label-secondary, #68707c);\n justify-items: end;\n gap: 1px;\n display: grid;\n}\n\n.arkme-team-detail-count strong {\n color: var(--dsw-alias-label-primary, #202124);\n font-variant-numeric: tabular-nums;\n font-size: 21px;\n font-weight: 680;\n line-height: 24px;\n}\n\n.arkme-team-detail-count span {\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-team-members {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-subtle, #f7f7f8);\n min-width: 0;\n min-height: 0;\n padding: 22px clamp(24px, 5vw, 56px) 32px;\n overflow-y: auto;\n}\n\n.arkme-team-members-container {\n width: min(100%, 760px);\n min-width: 0;\n margin: 0 auto;\n}\n\n.arkme-team-members h2 {\n margin: 0 0 13px;\n font-size: 15px;\n font-weight: 650;\n line-height: 22px;\n}\n\n.arkme-team-member-list {\n border: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 14px;\n min-width: 0;\n overflow: hidden;\n box-shadow: 0 8px 24px #161b2309;\n}\n\n.arkme-team-member-row {\n box-sizing: border-box;\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n grid-template-columns: 40px minmax(0, 1fr) auto;\n align-items: center;\n gap: 12px;\n min-width: 0;\n min-height: 64px;\n padding: 11px 14px;\n display: grid;\n}\n\n.arkme-team-member-row:not(:has( ~ .arkme-team-member-row)) {\n border-bottom: 0;\n}\n\n.arkme-team-member-avatar {\n border-radius: 50%;\n place-items: center;\n width: 40px;\n height: 40px;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-team-member-copy {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-team-member-copy strong, .arkme-team-member-copy small {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.arkme-team-member-copy strong {\n font-size: 14px;\n font-weight: 620;\n line-height: 20px;\n}\n\n.arkme-team-member-copy small {\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 12px;\n line-height: 17px;\n}\n\n.arkme-team-member-role {\n padding: 0 9px;\n}\n\n.arkme-team-role-badge[data-team-role=\"owner\"], .arkme-team-role-badge[data-team-role=\"admin\"], .arkme-team-member-role[data-team-member-role=\"owner\"], .arkme-team-member-role[data-team-member-role=\"admin\"] {\n background: var(--dsw-alias-state-business-tertiary, #eef0ff);\n color: var(--dsw-alias-state-business-primary, #4f5fbf);\n}\n\n.arkme-team-detail-status {\n min-height: 100%;\n color: var(--dsw-alias-label-secondary, #68707c);\n justify-content: center;\n align-items: center;\n gap: 12px;\n display: flex;\n}\n\n.arkme-team-detail-status.is-error, .arkme-team-member-more-error {\n color: var(--dsw-alias-state-error-primary, #b42318);\n}\n\n.arkme-team-detail-status button, .arkme-team-member-more {\n border: 1px solid var(--dsw-alias-border-l2, var(--arkme-line));\n background: var(--dsw-alias-button-elevated-fill, #fff);\n cursor: pointer;\n border-radius: 9px;\n min-height: 34px;\n padding: 0 12px;\n}\n\n.arkme-team-member-more {\n width: calc(100% - 24px);\n color: var(--dsw-alias-state-business-primary, #4f5fbf) !important;\n margin: 12px !important;\n}\n\n.arkme-team-member-more:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-team-member-more-error {\n padding: 12px 14px 0;\n font-size: 12px;\n}\n\n.arkme-contact-world {\n min-height: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-detail > .arkme-contact-world {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-subtle, #f7f7f8);\n padding: 22px clamp(20px, 4vw, 52px) 28px;\n}\n\n.arkme-contact-world-container {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 18px;\n flex-direction: column;\n width: min(100%, 980px);\n min-width: 0;\n height: 100%;\n min-height: 0;\n margin: 0 auto;\n display: flex;\n overflow-y: auto;\n box-shadow: 0 16px 48px #161b230f;\n}\n\n.arkme-contact-world-title {\n box-sizing: border-box;\n width: min(100%, 760px);\n margin: 0 auto;\n padding: 22px 28px 10px;\n font-size: 15px;\n font-weight: 650;\n line-height: 22px;\n}\n\n.arkme-contact-world-list {\n box-sizing: border-box;\n align-content: start;\n gap: 30px;\n width: min(100%, 760px);\n min-height: 0;\n margin: 0 auto;\n padding: 28px 28px 42px;\n display: grid;\n}\n\n.arkme-contact-world-year {\n gap: 24px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-world-year > h2 {\n letter-spacing: -.04em;\n margin: 0;\n font-size: 28px;\n font-weight: 750;\n line-height: 36px;\n}\n\n.arkme-contact-world-entry {\n gap: 8px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-world-diary {\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 13px;\n font-weight: 500;\n line-height: 19px;\n}\n\n.arkme-contact-world-entry > .arkme-contact-world-time {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n align-items: center;\n gap: 8px;\n font-size: 11px;\n line-height: 16px;\n display: flex;\n}\n\n.arkme-contact-world-entry > .arkme-contact-world-time span {\n font-size: 17px;\n line-height: 10px;\n}\n\n.arkme-contact-world-card {\n border: 1px dashed var(--dsw-alias-border-l2, #d9dce2);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 14px;\n gap: 10px;\n padding: 15px 16px;\n display: grid;\n}\n\n.arkme-contact-world-card-header {\n grid-template-columns: 36px minmax(0, 1fr) auto;\n align-items: center;\n gap: 9px;\n display: grid;\n}\n\n.arkme-contact-world-author {\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n font-size: 13px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.arkme-contact-world-time {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n flex: none;\n font-size: 11px;\n}\n\n.arkme-contact-world-headline {\n margin: 2px 0 0;\n font-size: 14px;\n line-height: 20px;\n}\n\n.arkme-contact-world-text {\n color: var(--dsw-alias-label-secondary, #68707c);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.arkme-contact-world-images {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 6px;\n width: 100%;\n min-width: 0;\n max-width: 620px;\n display: grid;\n}\n\n.arkme-contact-world-image {\n aspect-ratio: 1;\n object-fit: cover;\n border-radius: 11px;\n width: 100%;\n display: block;\n}\n\n.arkme-contact-world-image-error, .arkme-contact-world-image-loading {\n aspect-ratio: 1;\n background: var(--dsw-alias-bg-layer-2, var(--arkme-soft));\n width: 100%;\n min-width: 0;\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n border-radius: 11px;\n place-items: center;\n display: grid;\n}\n\n.arkme-contact-world-tags {\n flex-wrap: wrap;\n gap: 6px;\n display: flex;\n}\n\n.arkme-contact-world-tag {\n background: var(--dsw-alias-bg-layer-2, var(--arkme-soft));\n color: var(--dsw-alias-label-secondary, var(--arkme-muted));\n border-radius: 999px;\n padding: 2px 7px;\n font-size: 11px;\n}\n\n.arkme-contact-world-empty {\n box-sizing: border-box;\n text-align: center;\n flex: 1;\n place-content: center;\n justify-items: center;\n min-height: 240px;\n padding: 36px 20px;\n display: grid;\n}\n\n.arkme-contact-world-empty img {\n width: 140px;\n height: 100px;\n display: block;\n}\n\n.arkme-contact-world-empty p {\n color: var(--dsw-alias-label-secondary, #858992);\n margin: 16px 0 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.arkme-contact-world-error, .arkme-contact-world-status {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n place-self: center;\n padding: 28px 20px;\n font-size: 12px;\n}\n\n.arkme-contact-world-error {\n color: var(--dsw-alias-state-error-primary, #b42318);\n}\n\n.arkme-contact-world-load-more {\n cursor: pointer;\n background: none;\n border-radius: 9px;\n place-self: center;\n min-height: 34px;\n padding: 0 12px;\n color: var(--dsw-alias-state-business-primary, #4f5fbf) !important;\n}\n\n.arkme-contact-world-load-more-status, .arkme-contact-world-load-more-error {\n min-height: 20px;\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n padding: 8px 16px;\n font-size: 11px;\n}\n\n.arkme-contact-world-load-more-error {\n color: var(--dsw-alias-state-error-primary, #b42318);\n}\n\n.arkme-contact-world-page-empty {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n align-self: center;\n padding: 28px 20px;\n font-size: 12px;\n}\n\n.arkme-directory-unmarked-speaker-detail {\n background: var(--dsw-alias-bg-base, #fff);\n min-height: 0;\n padding: clamp(28px, 5vw, 60px);\n overflow-y: auto;\n}\n\n.arkme-unmarked-speaker-token-avatar {\n background: var(--dsw-alias-bg-module-platform, var(--dsw-alias-bg-layer-1, #f1f2f3));\n color: var(--dsw-alias-label-secondary, #666c75);\n letter-spacing: -.02em;\n border-radius: 50%;\n flex: none;\n place-items: center;\n font-weight: 650;\n line-height: 1;\n display: grid;\n}\n\n.arkme-unmarked-speaker-summary {\n box-sizing: border-box;\n background: none;\n border: 0;\n gap: 18px;\n width: min(100%, 720px);\n margin: 0 auto;\n padding: 4px 0 24px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-summary h1, .arkme-unmarked-speaker-summary h2, .arkme-unmarked-speaker-audio h2, .arkme-unmarked-speaker-choice h2 {\n letter-spacing: -.02em;\n margin: 0;\n font-size: 20px;\n font-weight: 680;\n line-height: 28px;\n}\n\n.arkme-unmarked-speaker-identity {\n align-items: center;\n gap: 16px;\n min-width: 0;\n padding: 2px 4px;\n display: flex;\n}\n\n.arkme-unmarked-speaker-identity > div {\n gap: 3px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-identity p {\n color: var(--dsw-alias-label-secondary, #737984);\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-unmarked-speaker-stats {\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #737984);\n flex-wrap: wrap;\n gap: 8px 20px;\n padding: 0 4px;\n font-size: 12px;\n line-height: 19px;\n display: flex;\n}\n\n.arkme-unmarked-speaker-stats span {\n white-space: nowrap;\n position: relative;\n}\n\n.arkme-unmarked-speaker-stats span + span:before {\n content: \"\";\n background: var(--dsw-alias-label-caption, #b3b7bd);\n border-radius: 50%;\n width: 3px;\n height: 3px;\n position: absolute;\n top: 8px;\n left: -11px;\n}\n\n.arkme-unmarked-speaker-stats strong {\n color: var(--dsw-alias-label-primary, #202124);\n font-weight: 650;\n}\n\n.arkme-unmarked-speaker-inference {\n background: var(--dsw-alias-bg-layer-2, #f5f5f6);\n border-radius: 18px;\n grid-template-columns: 40px minmax(0, 1fr);\n align-items: start;\n gap: 12px;\n min-width: 0;\n padding: 18px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-inference-icon, .arkme-unmarked-speaker-action-icon {\n border: 1px solid var(--dsw-alias-border-l1, #e3e4e7);\n background: var(--dsw-alias-bg-layer-1, #fff);\n width: 40px;\n height: 40px;\n color: var(--dsw-alias-label-secondary, #656b75);\n border-radius: 50%;\n place-items: center;\n display: grid;\n}\n\n.arkme-unmarked-speaker-inference-icon svg path, .arkme-unmarked-speaker-action-icon svg path {\n stroke: currentColor;\n stroke-width: 1.5px;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.arkme-unmarked-speaker-inference > div {\n gap: 5px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-inference-label {\n color: var(--dsw-alias-label-secondary, #747983);\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-unmarked-speaker-inference strong {\n color: var(--dsw-alias-label-primary, #202124);\n font-size: 14px;\n font-weight: 650;\n line-height: 21px;\n}\n\n.arkme-unmarked-speaker-inference p {\n color: var(--dsw-alias-label-secondary, #686e78);\n margin: 0;\n font-size: 12px;\n line-height: 20px;\n}\n\n.arkme-unmarked-speaker-actions {\n gap: 10px;\n display: grid;\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-action {\n border: 1px solid var(--dsw-alias-border-l1, #e5e6e8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n width: 100%;\n min-height: 62px;\n color: var(--dsw-alias-label-primary, #202124);\n text-align: left;\n cursor: pointer;\n border-radius: 16px;\n grid-template-columns: 42px minmax(0, 1fr);\n align-items: center;\n gap: 12px;\n padding: 10px 46px 10px 14px;\n font-size: 13px;\n font-weight: 650;\n display: grid;\n position: relative;\n}\n\n.arkme-unmarked-speaker-action:after {\n content: \"›\";\n color: var(--dsw-alias-label-caption, #a7abb2);\n font-size: 22px;\n font-weight: 400;\n position: absolute;\n right: 18px;\n}\n\n.arkme-unmarked-speaker-action:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f7f7f8);\n border-color: var(--dsw-alias-border-l2, #d9dade);\n}\n\n.arkme-unmarked-speaker-summary > [role=\"status\"], .arkme-unmarked-speaker-summary > [role=\"alert\"], .arkme-unmarked-speaker-audio > [role=\"status\"], .arkme-unmarked-speaker-audio > [role=\"alert\"], .arkme-unmarked-speaker-choice > [role=\"status\"], .arkme-unmarked-speaker-choice > [role=\"alert\"] {\n color: var(--dsw-alias-label-secondary, #68707c);\n background: var(--dsw-alias-bg-layer-2, #f5f5f6);\n border-radius: 10px;\n padding: 9px 12px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-unmarked-speaker-summary > [role=\"alert\"], .arkme-unmarked-speaker-audio > [role=\"alert\"], .arkme-unmarked-speaker-choice > [role=\"alert\"] {\n color: var(--dsw-alias-state-error-primary, #b42318);\n background: var(--dsw-alias-state-error-tertiary, #fff1f0);\n}\n\n.arkme-unmarked-speaker-audio, .arkme-unmarked-speaker-choice {\n box-sizing: border-box;\n background: none;\n border: 0;\n gap: 16px;\n width: min(100%, 720px);\n margin: 0 auto;\n padding: 4px 0 28px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-subview-header {\n grid-template-columns: auto 40px minmax(0, 1fr);\n align-items: center;\n gap: 12px;\n min-width: 0;\n padding-bottom: 4px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-subview-header > button {\n min-height: 32px;\n color: var(--dsw-alias-label-secondary, #68707c);\n cursor: pointer;\n background: none;\n border-radius: 9px;\n padding: 0 10px;\n font-size: 11px;\n}\n\n.arkme-unmarked-speaker-subview-header > button:before {\n content: \"‹\";\n vertical-align: -1px;\n margin-right: 4px;\n font-size: 17px;\n}\n\n.arkme-unmarked-speaker-subview-heading {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-subview-heading p {\n color: var(--dsw-alias-label-secondary, #737984);\n margin: 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-unmarked-speaker-segment-list {\n gap: 10px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-segment-card {\n border: 1px solid var(--dsw-alias-border-l1, #e5e6e8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 16px;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 8px 16px;\n min-width: 0;\n padding: 16px 16px 14px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-segment-meta {\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #757b85);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 11px;\n line-height: 17px;\n overflow: hidden;\n}\n\n.arkme-unmarked-speaker-segment-transcript {\n min-width: 0;\n color: var(--dsw-alias-label-primary, #292c34);\n white-space: pre-wrap;\n grid-column: 1;\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-segment-play {\n background: var(--dsw-alias-bg-layer-2, #f4f4f5);\n width: 38px;\n min-width: 38px;\n height: 38px;\n min-height: 38px;\n color: var(--dsw-alias-label-primary, #292c34);\n cursor: pointer;\n border-radius: 50%;\n grid-area: 1 / 2 / span 2;\n align-self: center;\n place-items: center;\n padding: 0;\n display: inline-grid;\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-segment-play:not(:disabled):hover {\n background: var(--dsw-alias-bg-layer-3, #e9eaec);\n}\n\n.arkme-unmarked-speaker-segment-play:disabled {\n opacity: .5;\n cursor: default;\n}\n\n.arkme-unmarked-speaker-choice-meta {\n color: var(--dsw-alias-label-secondary, #737984);\n margin: -4px 0 0;\n padding: 0 4px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-unmarked-speaker-choice-options {\n border: 0;\n gap: 8px;\n min-width: 0;\n margin: 0;\n padding: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-choice-options legend {\n color: var(--dsw-alias-label-secondary, #737984);\n margin-bottom: 9px;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-unmarked-speaker-choice-option {\n border: 1px solid var(--dsw-alias-border-l1, #e5e6e8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n cursor: pointer;\n border-radius: 14px;\n grid-template-columns: 18px minmax(0, 1fr) auto;\n align-items: center;\n gap: 10px;\n min-width: 0;\n min-height: 52px;\n padding: 10px 14px;\n font-size: 13px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-choice-option:has(input:checked) {\n border-color: var(--dsw-alias-state-business-primary, #6677d9);\n background: var(--dsw-alias-interactive-bg-active, #f0f2ff);\n}\n\n.arkme-unmarked-speaker-choice-option input {\n width: 16px;\n height: 16px;\n accent-color: var(--dsw-alias-state-business-primary, #6677d9);\n margin: 0;\n}\n\n.arkme-unmarked-speaker-recommended {\n background: var(--dsw-alias-state-business-tertiary, #eef0ff);\n color: var(--dsw-alias-state-business-primary, #5667cc);\n border-radius: 999px;\n padding: 2px 7px;\n font-size: 10px;\n line-height: 16px;\n}\n\n.arkme-unmarked-speaker-choice-new-name {\n border: 1px solid var(--dsw-alias-border-l1, #dfe1e5);\n background: var(--dsw-specific-input-major, #fff);\n width: 100%;\n min-height: 42px;\n color: var(--dsw-alias-label-primary, #202124);\n border-radius: 12px;\n outline: 0;\n padding: 0 13px;\n font-size: 12px;\n}\n\n.arkme-unmarked-speaker-choice-new-name:focus {\n border-color: var(--dsw-alias-state-business-primary, #6677d9);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--dsw-alias-state-business-primary, #6677d9) 14%, transparent);\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-confirm {\n background: var(--dsw-alias-button-primary-fill, #202124);\n min-height: 42px;\n color: var(--dsw-alias-label-primary-inverted, #fff);\n cursor: pointer;\n border-radius: 12px;\n padding: 0 16px;\n font-size: 12px;\n font-weight: 650;\n}\n\n.arkme-unmarked-speaker-confirm:disabled {\n opacity: .45;\n cursor: default;\n}\n\n.arkme-unmarked-speaker-summary button:not(.arkme-unmarked-speaker-action), .arkme-unmarked-speaker-audio button:not(.arkme-unmarked-speaker-segment-play), .arkme-unmarked-speaker-choice button:not(.arkme-unmarked-speaker-confirm), .arkme-contact-world-error button, .arkme-contact-profile-error button {\n border: 1px solid var(--dsw-alias-border-l2, var(--arkme-line));\n background: var(--dsw-alias-button-elevated-fill, #fff);\n min-height: 34px;\n color: var(--dsw-alias-label-primary, #202124);\n cursor: pointer;\n border-radius: 9px;\n padding: 0 12px;\n}\n\n.arkme-unmarked-speaker-gone, .arkme-unmarked-speaker-success {\n box-sizing: border-box;\n background: var(--dsw-alias-state-warning-tertiary, #fff7ed);\n width: min(100%, 680px);\n color: var(--dsw-alias-state-warning-primary, #9a3412);\n border-radius: 10px;\n margin: 0 auto;\n padding: 12px 14px;\n}\n\n.arkme-unmarked-speaker-success {\n background: var(--dsw-alias-state-success-tertiary, #ecfdf3);\n color: var(--dsw-alias-state-success-primary, #067647);\n}\n\n.arkme-contact-directory button:focus-visible, .arkme-directory-detail-pane button:focus-visible, [data-arkme-owned=\"product-navigation\"] button:focus-visible {\n outline: 2px solid var(--arkme-focus);\n outline-offset: 2px;\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory, body[data-ds-dark-theme] .arkme-directory-detail-pane {\n background: var(--dsw-alias-bg-base);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory-row.is-selected, body[data-ds-dark-theme] .arkme-contact-world-card, body[data-ds-dark-theme] .arkme-unmarked-speaker-choice {\n background: var(--dsw-alias-interactive-bg-active);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-inference, body[data-ds-dark-theme] .arkme-unmarked-speaker-segment-card, body[data-ds-dark-theme] .arkme-unmarked-speaker-choice-option, body[data-ds-dark-theme] .arkme-unmarked-speaker-action {\n background: var(--dsw-alias-bg-layer-1);\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-inference-icon, body[data-ds-dark-theme] .arkme-unmarked-speaker-action-icon, body[data-ds-dark-theme] .arkme-unmarked-speaker-segment-play {\n background: var(--dsw-specific-input-major);\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-choice-option:has(input:checked) {\n background: var(--dsw-alias-interactive-bg-active);\n border-color: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-detail > .arkme-contact-world {\n background: var(--dsw-alias-bg-subtle);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-world-container {\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: none;\n}\n\nbody[data-ds-dark-theme] .arkme-team-detail {\n background: var(--dsw-alias-bg-base);\n}\n\nbody[data-ds-dark-theme] .arkme-team-members {\n background: var(--dsw-alias-bg-subtle);\n}\n\nbody[data-ds-dark-theme] .arkme-team-member-list {\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: none;\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory-warning, body[data-ds-dark-theme] .arkme-unmarked-speaker-gone, body[data-ds-dark-theme] .arkme-contact-world-image-error, body[data-ds-dark-theme] .arkme-contact-world-image-loading {\n background: var(--dsw-specific-input-major);\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-success {\n background: var(--dsw-alias-state-success-tertiary);\n color: var(--dsw-alias-state-success-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-profile-error, body[data-ds-dark-theme] .arkme-contact-profile-message-error, body[data-ds-dark-theme] .arkme-contact-world-error, body[data-ds-dark-theme] .arkme-contact-world-load-more-error {\n color: var(--dsw-alias-state-error-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-profile-message {\n background: var(--dsw-alias-button-primary-fill);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory-more, body[data-ds-dark-theme] .arkme-contact-world-load-more {\n color: var(--dsw-alias-state-business-primary);\n}\n\n@media (width <= 1024px) {\n [data-arkme-owned=\"persistent-sidebar\"] [data-arkme-directory-mode=\"contacts\"] {\n min-width: 0;\n }\n}\n\n@media (width <= 820px) {\n div:has( > [data-shell-overlay]):has([data-arkme-directory-mode=\"contacts\"]):has([data-arkme-contacts-mobile-view=\"directory\"]) {\n grid-template-columns: minmax(0, 1fr) 0 0 !important;\n }\n\n div:has( > [data-shell-overlay]):has([data-arkme-directory-mode=\"contacts\"]):has([data-arkme-contacts-mobile-view=\"content\"]) {\n grid-template-columns: 0 minmax(0, 1fr) 0 !important;\n }\n\n [data-arkme-owned=\"persistent-sidebar\"][data-arkme-contacts-mobile-view=\"content\"], [data-arkme-owned=\"persistent-workspace\"][data-arkme-contacts-mobile-view=\"directory\"] {\n display: none !important;\n }\n\n [data-arkme-owned=\"persistent-sidebar\"] [data-arkme-directory-mode=\"contacts\"], .arkme-directory-detail-pane {\n min-width: 0;\n }\n}\n\n.arkme-directory-mobile-back {\n display: none;\n}\n\n@media (width <= 820px) {\n .arkme-directory-mobile-back {\n min-height: 42px;\n color: var(--dsw-alias-label-secondary, #68707c);\n cursor: pointer;\n background: none;\n align-items: center;\n gap: 5px;\n padding: 0 14px;\n display: inline-flex;\n }\n\n .arkme-directory-mobile-back:before {\n content: \"‹\";\n font-size: 18px;\n line-height: 1;\n }\n\n .arkme-directory-mobile-back:hover {\n color: var(--dsw-alias-label-primary, #202124);\n }\n\n .arkme-contact-profile {\n padding: 26px 20px;\n }\n\n .arkme-contact-profile-main {\n grid-template-columns: 56px minmax(0, 1fr) auto;\n gap: 12px;\n }\n\n .arkme-contact-profile-avatar {\n width: 56px;\n height: 56px;\n }\n\n .arkme-contact-profile-avatar > span {\n width: 56px !important;\n height: 56px !important;\n }\n\n .arkme-team-detail-header {\n padding: 26px 20px;\n }\n\n .arkme-team-detail-header-main {\n grid-template-columns: 56px minmax(0, 1fr);\n gap: 12px;\n }\n\n .arkme-team-detail-glyph {\n border-radius: 16px;\n width: 56px;\n height: 56px;\n font-size: 18px;\n }\n\n .arkme-team-detail-count {\n justify-items: initial;\n grid-column: 2;\n align-items: baseline;\n gap: 4px;\n min-width: 0;\n display: flex;\n }\n\n .arkme-team-detail-count strong {\n font-size: 14px;\n line-height: 18px;\n }\n\n .arkme-team-detail-count span {\n font-size: 11px;\n }\n\n .arkme-team-members {\n padding: 18px 20px 28px;\n }\n\n .arkme-team-member-list {\n border-radius: 12px;\n }\n\n .arkme-team-member-row {\n padding-left: 12px;\n padding-right: 12px;\n }\n\n .arkme-contact-world-title {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .arkme-directory-unmarked-speaker-detail {\n padding: 20px 18px 30px;\n }\n\n .arkme-unmarked-speaker-summary, .arkme-unmarked-speaker-audio, .arkme-unmarked-speaker-choice {\n gap: 14px;\n }\n\n .arkme-unmarked-speaker-stats {\n gap: 7px 14px;\n }\n\n .arkme-unmarked-speaker-stats span + span:before {\n display: none;\n }\n\n .arkme-unmarked-speaker-inference {\n grid-template-columns: 36px minmax(0, 1fr);\n padding: 15px;\n }\n\n .arkme-unmarked-speaker-inference-icon, .arkme-unmarked-speaker-action-icon {\n width: 36px;\n height: 36px;\n }\n\n .arkme-unmarked-speaker-subview-header {\n grid-template-columns: auto 36px minmax(0, 1fr);\n gap: 9px;\n }\n\n .arkme-unmarked-speaker-segment-card {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .arkme-unmarked-speaker-segment-transcript, [data-arkme-workspace] .arkme-unmarked-speaker-segment-play {\n grid-area: auto / 1;\n }\n\n [data-arkme-workspace] .arkme-unmarked-speaker-segment-play {\n justify-self: start;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-contact-directory-caret {\n transition: none;\n }\n\n .arkme-icon-spin {\n animation: none;\n }\n}\n\n.arkme-conversation-surface {\n --arkme-chat-self-bubble: #eef1f8;\n --arkme-chat-other-bubble: #f3f4f6;\n}\n\nbody[data-ds-dark-theme] .arkme-conversation-surface {\n --arkme-chat-self-bubble: #2c3142;\n --arkme-chat-other-bubble: #282a31;\n --arkme-audio-control: #8995c5;\n}\n\nbody[data-ds-dark-theme] .arkme-detail-extension-input-bar {\n border-top-color: #363636 !important;\n}\n\nbody[data-ds-dark-theme] .arkme-detail-extension-input-shell {\n background: #2b2b2b !important;\n}\n\n[data-arkme-message-direction]:focus-visible, [data-arkme-note-detail] button:focus-visible {\n outline: 2px solid var(--dsw-alias-state-business-primary, #8295e8);\n outline-offset: 2px;\n}\n";
|
|
193277
194434
|
//#endregion
|
|
193278
194435
|
//#region src/client/redesign/styles.ts
|
|
193279
194436
|
const REDESIGN_STYLE_ID = "@senguoyun/dsh-arkme/redesign";
|