@senguoyun/dsh-arkme 0.1.45 → 0.1.47
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 +34 -3
- package/lib/client.js +1861 -582
- 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/interwoven-moments.d.ts +9 -0
- package/lib/types/client/interwoven-moments.d.ts.map +1 -1
- 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.47";
|
|
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);
|
|
168314
|
+
}
|
|
168315
|
+
}
|
|
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
|
+
});
|
|
167739
168329
|
}
|
|
167740
168330
|
}
|
|
167741
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);
|
|
@@ -175308,6 +175979,53 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
175308
175979
|
}))
|
|
175309
175980
|
].sort((left, right) => left.occurredAtMillis - right.occurredAtMillis || left.id.localeCompare(right.id));
|
|
175310
175981
|
}
|
|
175982
|
+
/** Match the desktop prelude policy while preserving each card's identity. */
|
|
175983
|
+
function projectInterwovenWindow(messages, moments, hasMoreMessages) {
|
|
175984
|
+
const sorted = [...new Map(moments.map((moment) => [moment.momentId, moment])).values()].sort((a, b) => a.occurredAtMillis - b.occurredAtMillis || a.momentId.localeCompare(b.momentId));
|
|
175985
|
+
const oldest = messages.length === 0 ? Infinity : Math.min(...messages.map((message) => message.sendAtMillis));
|
|
175986
|
+
const prelude = sorted.filter((moment) => moment.occurredAtMillis <= oldest);
|
|
175987
|
+
const inline = sorted.filter((moment) => moment.occurredAtMillis > oldest);
|
|
175988
|
+
return {
|
|
175989
|
+
prelude: hasMoreMessages && inline.length > 0 ? [] : prelude,
|
|
175990
|
+
inline
|
|
175991
|
+
};
|
|
175992
|
+
}
|
|
175993
|
+
function ArkmeInterwovenPrelude({ moments, onOpen }) {
|
|
175994
|
+
const [expanded, setExpanded] = (0, react.useState)(false);
|
|
175995
|
+
const hiddenCount = Math.max(0, moments.length - 2);
|
|
175996
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
|
|
175997
|
+
"data-arkme-interwoven-prelude": true,
|
|
175998
|
+
style: {
|
|
175999
|
+
listStyle: "none",
|
|
176000
|
+
margin: 0,
|
|
176001
|
+
padding: 0,
|
|
176002
|
+
display: "flex",
|
|
176003
|
+
flexDirection: "column",
|
|
176004
|
+
gap: 8
|
|
176005
|
+
},
|
|
176006
|
+
children: [!expanded && hiddenCount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
|
|
176007
|
+
style: styles$11.momentRow,
|
|
176008
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
176009
|
+
type: "button",
|
|
176010
|
+
"data-arkme-interwoven-expand": true,
|
|
176011
|
+
"aria-expanded": false,
|
|
176012
|
+
style: styles$11.card,
|
|
176013
|
+
onClick: () => {
|
|
176014
|
+
setExpanded(true);
|
|
176015
|
+
},
|
|
176016
|
+
children: [
|
|
176017
|
+
"展开另外",
|
|
176018
|
+
hiddenCount,
|
|
176019
|
+
"条更早互动"
|
|
176020
|
+
]
|
|
176021
|
+
})
|
|
176022
|
+
}), (expanded ? moments : moments.slice(-2)).map((moment) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeInterwovenMentionCard, {
|
|
176023
|
+
moment,
|
|
176024
|
+
rowId: `moment:${moment.momentId}`,
|
|
176025
|
+
onOpen
|
|
176026
|
+
}, moment.momentId))]
|
|
176027
|
+
});
|
|
176028
|
+
}
|
|
175311
176029
|
function interwovenTimeLabel(value, now = Date.now()) {
|
|
175312
176030
|
const date = new Date(value);
|
|
175313
176031
|
const current = new Date(now);
|
|
@@ -175667,7 +176385,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
175667
176385
|
rememberCurrentScroll();
|
|
175668
176386
|
onBackRelated?.();
|
|
175669
176387
|
},
|
|
175670
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$
|
|
176388
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$4, {
|
|
175671
176389
|
size: 18,
|
|
175672
176390
|
"aria-hidden": true
|
|
175673
176391
|
})
|
|
@@ -177257,7 +177975,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177257
177975
|
style: styles$9.back,
|
|
177258
177976
|
"aria-label": backLabel ?? "返回",
|
|
177259
177977
|
onClick: onBack,
|
|
177260
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$
|
|
177978
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$4, { size: 18 })
|
|
177261
177979
|
}),
|
|
177262
177980
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
177263
177981
|
style: styles$9.heading,
|
|
@@ -177318,7 +178036,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177318
178036
|
await removeDetailExtensionAttachments(attachments);
|
|
177319
178037
|
});
|
|
177320
178038
|
}
|
|
177321
|
-
function DetailExtensionComposer({ sourceRef, messageActionRef, parentRecordUid, targetKey, onSent, onError }) {
|
|
178039
|
+
function DetailExtensionComposer({ sourceRef, messageActionRef, parentRecordUid, targetKey, onSent, onError, messageCreationBlocked, messageCreationRestriction }) {
|
|
177322
178040
|
const [text, setText] = (0, react.useState)("");
|
|
177323
178041
|
const [markdown, setMarkdown] = (0, react.useState)();
|
|
177324
178042
|
const [markdownEnabled, setMarkdownEnabled] = (0, react.useState)(false);
|
|
@@ -177367,7 +178085,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177367
178085
|
};
|
|
177368
178086
|
}, [targetKey]);
|
|
177369
178087
|
const selectFiles = async (files) => {
|
|
177370
|
-
if (files === null || files.length === 0 || preparing || sending) return;
|
|
178088
|
+
if (messageCreationBlocked || files === null || files.length === 0 || preparing || sending) return;
|
|
177371
178089
|
const controller = new AbortController();
|
|
177372
178090
|
stageAbortRef.current?.abort();
|
|
177373
178091
|
stageAbortRef.current = controller;
|
|
@@ -177423,7 +178141,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177423
178141
|
const send = async () => {
|
|
177424
178142
|
const normalizedText = markdown?.source ?? text.trim();
|
|
177425
178143
|
const fileRefs = attachments.flatMap((attachment) => attachment.localFile === void 0 ? [] : [attachment.localFile.fileRef]);
|
|
177426
|
-
if (sending || preparing || normalizedText === "" && fileRefs.length === 0) return;
|
|
178144
|
+
if (messageCreationBlocked || sending || preparing || normalizedText === "" && fileRefs.length === 0) return;
|
|
177427
178145
|
const fingerprint = JSON.stringify([
|
|
177428
178146
|
parentRecordUid ?? "",
|
|
177429
178147
|
normalizedText,
|
|
@@ -177474,7 +178192,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177474
178192
|
if (generationRef.current === generation) setSending(false);
|
|
177475
178193
|
}
|
|
177476
178194
|
};
|
|
177477
|
-
const disabled = preparing || sending;
|
|
178195
|
+
const disabled = messageCreationBlocked || preparing || sending;
|
|
177478
178196
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
177479
178197
|
style: styles$9.extensionComposer,
|
|
177480
178198
|
onDragOver: (event) => {
|
|
@@ -177490,11 +178208,16 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177490
178208
|
}
|
|
177491
178209
|
},
|
|
177492
178210
|
children: [
|
|
178211
|
+
messageCreationBlocked && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
178212
|
+
role: "status",
|
|
178213
|
+
children: messageCreationRestriction
|
|
178214
|
+
}),
|
|
177493
178215
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
177494
178216
|
ref: fileInputRef,
|
|
177495
178217
|
type: "file",
|
|
177496
178218
|
multiple: true,
|
|
177497
178219
|
hidden: true,
|
|
178220
|
+
disabled,
|
|
177498
178221
|
"data-arkme-detail-extension-file-input": "true",
|
|
177499
178222
|
onChange: (event) => selectFiles(event.currentTarget.files)
|
|
177500
178223
|
}),
|
|
@@ -177561,8 +178284,12 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177561
178284
|
maxLength: 2e4,
|
|
177562
178285
|
markdownEnabled,
|
|
177563
178286
|
markdown,
|
|
177564
|
-
onTextChange:
|
|
177565
|
-
|
|
178287
|
+
onTextChange: (value) => {
|
|
178288
|
+
if (!disabled) setText(value);
|
|
178289
|
+
},
|
|
178290
|
+
onMarkdownChange: (value) => {
|
|
178291
|
+
if (!disabled) setMarkdown(value);
|
|
178292
|
+
},
|
|
177566
178293
|
onPaste: (event) => {
|
|
177567
178294
|
const files = clipboardFiles(event.clipboardData);
|
|
177568
178295
|
if (files.length > 0) {
|
|
@@ -177806,7 +178533,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177806
178533
|
function relatedQuickNoteReferenceExpired$1(error) {
|
|
177807
178534
|
return error instanceof ArkmeClientError && error.body.code === "related-quick-note-ref-expired";
|
|
177808
178535
|
}
|
|
177809
|
-
function ArkmeTimelineDetailDrawer({ item, sourceRef, showOriginal, onClose, onToggleOriginal, shareWebsite, onMessageCopyLinkOpen, onExtensionSent, onToast }) {
|
|
178536
|
+
function ArkmeTimelineDetailDrawer({ item, sourceRef, showOriginal, onClose, onToggleOriginal, shareWebsite, onMessageCopyLinkOpen, onExtensionSent, onToast, messageCreationBlocked = false, messageCreationRestriction = "" }) {
|
|
177810
178537
|
const [relatedView, setRelatedView] = (0, react.useState)("source-detail");
|
|
177811
178538
|
const [relatedState, setRelatedState] = (0, react.useState)({ kind: "idle" });
|
|
177812
178539
|
const [relatedDetailState, setRelatedDetailState] = (0, react.useState)({ kind: "idle" });
|
|
@@ -177956,6 +178683,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
177956
178683
|
const extensionFooter = normalizedSourceRef === "" || messageActionRef === "" ? void 0 : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DetailExtensionComposer, {
|
|
177957
178684
|
sourceRef: normalizedSourceRef,
|
|
177958
178685
|
messageActionRef,
|
|
178686
|
+
messageCreationBlocked,
|
|
178687
|
+
messageCreationRestriction,
|
|
177959
178688
|
...selectedExtensionRecordUid === void 0 ? {} : { parentRecordUid: selectedExtensionRecordUid },
|
|
177960
178689
|
targetKey: `${normalizedSourceRef}:${item.itemUid}:${selectedExtensionRecordUid ?? item.itemUid}`,
|
|
177961
178690
|
onError: (message) => {
|
|
@@ -181450,12 +182179,12 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
181450
182179
|
composerInner: {
|
|
181451
182180
|
...arkmeConversationComposerLayout.composerInner,
|
|
181452
182181
|
border: `1px solid ${colors.border}`,
|
|
181453
|
-
background:
|
|
182182
|
+
background: "var(--arkme-primary-composer-idle, #f6f6f6)",
|
|
181454
182183
|
boxShadow: "none",
|
|
181455
182184
|
transition: "background-color 140ms ease"
|
|
181456
182185
|
},
|
|
181457
182186
|
composerInnerFocused: {
|
|
181458
|
-
background: "
|
|
182187
|
+
background: "var(--arkme-primary-composer-focused, #ffffff)",
|
|
181459
182188
|
boxShadow: "none"
|
|
181460
182189
|
},
|
|
181461
182190
|
composerInnerExtension: {
|
|
@@ -182045,8 +182774,11 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
182045
182774
|
const map = new Map(current.map((item) => [item.itemUid, item]));
|
|
182046
182775
|
for (const item of incoming) {
|
|
182047
182776
|
const previous = map.get(item.itemUid);
|
|
182777
|
+
const version = item.recordVersion ?? item.version ?? 0;
|
|
182778
|
+
const previousVersion = previous?.recordVersion ?? previous?.version ?? 0;
|
|
182779
|
+
if (previous?.status === 1 && item.status === 1 && version > 0 && previousVersion > 0 && previousVersion > version) continue;
|
|
182048
182780
|
map.set(item.itemUid, {
|
|
182049
|
-
...item,
|
|
182781
|
+
...retainPartialTimelineMedia(previous, item),
|
|
182050
182782
|
...previous?.aiPolish !== void 0 && item.aiPolish === void 0 ? { aiPolish: previous.aiPolish } : {},
|
|
182051
182783
|
...previous?.recordDurationMillis !== void 0 && item.recordDurationMillis === void 0 ? { recordDurationMillis: previous.recordDurationMillis } : {},
|
|
182052
182784
|
...previous?.editDurationMillis !== void 0 && item.editDurationMillis === void 0 ? { editDurationMillis: previous.editDurationMillis } : {},
|
|
@@ -182057,6 +182789,15 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
182057
182789
|
}
|
|
182058
182790
|
return [...map.values()].sort((a, b) => a.sendAtMillis - b.sendAtMillis || a.itemUid.localeCompare(b.itemUid));
|
|
182059
182791
|
}
|
|
182792
|
+
function reconcileTimelinePage(cachedItems, delta, pageItems, readStartDeltas) {
|
|
182793
|
+
const removedKeys = new Set(delta?.removedItemKeys ?? []);
|
|
182794
|
+
const retainedPage = pageItems.filter((item) => !removedKeys.has(item.timelineItemKey ?? ""));
|
|
182795
|
+
const ids = new Set(retainedPage.map((item) => item.itemUid));
|
|
182796
|
+
const relevant = (delta?.items ?? []).filter((item) => ids.has(item.itemUid));
|
|
182797
|
+
const beforeRead = relevant.filter((item) => item === readStartDeltas.get(item.itemUid));
|
|
182798
|
+
const duringRead = relevant.filter((item) => item !== readStartDeltas.get(item.itemUid));
|
|
182799
|
+
return mergeItems(mergeItems(mergeItems(cachedItems.filter((item) => ids.has(item.itemUid)), beforeRead), retainedPage), duringRead);
|
|
182800
|
+
}
|
|
182060
182801
|
function detailExtensionTimelineItem(parent, result) {
|
|
182061
182802
|
const extension = result.extension;
|
|
182062
182803
|
const avatarRef = extension.senderAvatarUrl?.trim() ?? "";
|
|
@@ -182151,11 +182892,29 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
182151
182892
|
};
|
|
182152
182893
|
return mergeItems(current.filter((item) => item.itemUid !== optimisticItemUid && item.itemUid !== result.itemUid), [confirmed]);
|
|
182153
182894
|
}
|
|
182154
|
-
function
|
|
182155
|
-
|
|
182895
|
+
function arkmeRecordReeditFailure(caught) {
|
|
182896
|
+
const code = caught instanceof ArkmeClientError ? caught.body.code : void 0;
|
|
182897
|
+
return {
|
|
182898
|
+
error: errorMessage$2(caught) || "草稿保存失败,请重试",
|
|
182899
|
+
conflict: code === "record-reedit-conflict" ? "record" : code === "record-reedit-draft-changed" ? "draft" : void 0
|
|
182900
|
+
};
|
|
182901
|
+
}
|
|
182902
|
+
function arkmeRecordReeditCandidateKey(title, textContent, attachments, textFormat = "plain") {
|
|
182903
|
+
return JSON.stringify([
|
|
182904
|
+
title.trim(),
|
|
182905
|
+
textFormat === "markdown" ? textContent : textContent.trim(),
|
|
182906
|
+
attachments.map((attachment) => attachment.selection)
|
|
182907
|
+
]);
|
|
182156
182908
|
}
|
|
182157
182909
|
function sameArkmeRecordReeditSession(left, right) {
|
|
182158
|
-
return left !== void 0 && left.generation === right.generation && left.sourceRef === right.sourceRef && left.item.itemUid === right.item.itemUid;
|
|
182910
|
+
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;
|
|
182911
|
+
}
|
|
182912
|
+
function arkmeRecordReeditPreparationKey(target) {
|
|
182913
|
+
return `record-reedit:${target.generation}`;
|
|
182914
|
+
}
|
|
182915
|
+
function arkmeRecordReeditAttachmentBlock(attachment) {
|
|
182916
|
+
if (attachment.unavailable) return void 0;
|
|
182917
|
+
return attachment.block ?? (attachment.localFile === void 0 ? void 0 : localFileBlock(attachment.localFile));
|
|
182159
182918
|
}
|
|
182160
182919
|
function resolveStateAction(action, current) {
|
|
182161
182920
|
return typeof action === "function" ? action(current) : action;
|
|
@@ -182173,13 +182932,14 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
182173
182932
|
for (let sequence = cachedSequence + 1; sequence <= targetSequence; sequence += 1) if (!sequences.has(sequence)) return false;
|
|
182174
182933
|
return true;
|
|
182175
182934
|
}
|
|
182176
|
-
function arkmeConversationViewport(root) {
|
|
182177
|
-
if (root.scrollHeight - root.scrollTop - root.clientHeight <= 80) return {
|
|
182935
|
+
function arkmeConversationViewport(root, messagesOnly = false) {
|
|
182936
|
+
if (!messagesOnly && root.scrollHeight - root.scrollTop - root.clientHeight <= 80) return {
|
|
182178
182937
|
scrollTop: root.scrollTop,
|
|
182179
182938
|
stickToBottom: true
|
|
182180
182939
|
};
|
|
182181
182940
|
const rootRect = root.getBoundingClientRect();
|
|
182182
182941
|
for (const row of root.querySelectorAll("[data-arkme-conversation-row]")) {
|
|
182942
|
+
if (messagesOnly && !row.dataset.arkmeConversationRow?.startsWith("message:")) continue;
|
|
182183
182943
|
const rowRect = row.getBoundingClientRect();
|
|
182184
182944
|
if (rowRect.bottom <= rootRect.top || rowRect.top >= rootRect.bottom) continue;
|
|
182185
182945
|
const anchorId = row.dataset.arkmeConversationRow;
|
|
@@ -183248,8 +184008,26 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183248
184008
|
activeSourceKeyRef.current = conversationKey;
|
|
183249
184009
|
}, [conversationKey]);
|
|
183250
184010
|
const sourceIsChat = source?.kind === "private_chat" || source?.kind === "group_chat";
|
|
184011
|
+
const [foregroundReadRevision, setForegroundReadRevision] = (0, react.useState)(0);
|
|
184012
|
+
(0, react.useEffect)(() => {
|
|
184013
|
+
if (!activeConversation || !sourceIsChat || authenticatedUserId === void 0 || typeof window === "undefined" || typeof document === "undefined") return;
|
|
184014
|
+
const resumeRead = () => {
|
|
184015
|
+
if (arkmeVisibleReadIntentAllowed()) setForegroundReadRevision((value) => value + 1);
|
|
184016
|
+
};
|
|
184017
|
+
window.addEventListener("focus", resumeRead);
|
|
184018
|
+
document.addEventListener("visibilitychange", resumeRead);
|
|
184019
|
+
return () => {
|
|
184020
|
+
window.removeEventListener("focus", resumeRead);
|
|
184021
|
+
document.removeEventListener("visibilitychange", resumeRead);
|
|
184022
|
+
};
|
|
184023
|
+
}, [
|
|
184024
|
+
activeConversation,
|
|
184025
|
+
authenticatedUserId,
|
|
184026
|
+
sourceIsChat
|
|
184027
|
+
]);
|
|
183251
184028
|
const sourceProjectionRevision = (0, react.useSyncExternalStore)(activeConversation && !sourceIsChat ? arkmeUi.subscribe : NOOP_SUBSCRIBE, () => activeConversation && !sourceIsChat ? arkmeUi.getRecordRevision() : 0, () => 0);
|
|
183252
184029
|
const composerDraftKey = arkmeSourceComposerDraftKey(authenticatedUserId, source);
|
|
184030
|
+
const directAdmission = useDirectMessageAdmission(authenticatedAccountKey, source?.sourceRef, activeConversation && source?.directMessageAdmissionApplicable === true);
|
|
183253
184031
|
const composerAsyncScopeRef = (0, react.useRef)({
|
|
183254
184032
|
accountKey: void 0,
|
|
183255
184033
|
sourceKey: "",
|
|
@@ -183275,59 +184053,58 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183275
184053
|
const [composerShowsInputTime, setComposerShowsInputTime] = (0, react.useState)(arkmeComposerShowsInputTime);
|
|
183276
184054
|
const [composerExtensionTarget, setComposerExtensionTarget] = (0, react.useState)();
|
|
183277
184055
|
const activeComposerExtensionTarget = composerExtensionTarget?.sourceRef === source?.sourceRef ? composerExtensionTarget : void 0;
|
|
183278
|
-
const
|
|
183279
|
-
const
|
|
184056
|
+
const { composer: recordReeditComposer, composerRef: recordReeditComposerRef, setComposer: setRecordReeditComposer, updateCandidate: updateRecordReeditCandidate, activateScope: activateRecordReeditScope, findCandidate: findRecordReeditCandidate } = useRecordReeditEditors();
|
|
184057
|
+
const seenReeditCommits = (0, react.useRef)(/* @__PURE__ */ new Set());
|
|
184058
|
+
const pendingReeditHighlights = (0, react.useRef)(/* @__PURE__ */ new Set());
|
|
183280
184059
|
const recordReeditGenerationRef = (0, react.useRef)(0);
|
|
183281
|
-
const recordReeditDraftSaveTailRef = (0, react.useRef)(Promise.resolve());
|
|
183282
|
-
const recordReeditCommitGenerationRef = (0, react.useRef)();
|
|
183283
184060
|
const [recordReeditHighlightUid, setRecordReeditHighlightUid] = (0, react.useState)("");
|
|
183284
184061
|
const recordReeditHighlightTimerRef = (0, react.useRef)();
|
|
183285
|
-
|
|
183286
|
-
const
|
|
183287
|
-
const persistRecordReeditDraft = (0, react.useCallback)(async (target) => {
|
|
184062
|
+
const activeRecordReeditComposer = recordReeditComposer?.sourceKey === conversationKey && recordReeditComposer?.accountKey === authenticatedAccountKey ? recordReeditComposer : void 0;
|
|
184063
|
+
const persistRecordReeditDraft = (0, react.useCallback)(async (target, forCommit = false) => {
|
|
183288
184064
|
const snapshot = target.snapshot;
|
|
183289
|
-
if (snapshot === void 0 || target.busy) return;
|
|
184065
|
+
if (snapshot === void 0 || target.busy || arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth) !== target.accountKey) return false;
|
|
183290
184066
|
const nextTitle = target.title.trim();
|
|
183291
184067
|
const textFormat = snapshot.textFormat ?? target.item.textFormat;
|
|
183292
184068
|
const nextText = textFormat === "markdown" ? target.textContent : target.textContent.trim();
|
|
183293
184069
|
const supportsTitle = snapshot.displayKind === 1;
|
|
183294
|
-
|
|
183295
|
-
const
|
|
183296
|
-
|
|
183297
|
-
|
|
183298
|
-
|
|
183299
|
-
await callArkme("source.record-reedit.draft.put", {
|
|
184070
|
+
const nextCandidateKey = arkmeRecordReeditCandidateKey(nextTitle, nextText, target.attachments, textFormat);
|
|
184071
|
+
const alreadyPersisted = () => nextCandidateKey === target.persisted.candidateKey && (!forCommit || target.persisted.draftRevision > 0);
|
|
184072
|
+
const operation = target.persisted.saveTail.catch(() => void 0).then(async () => {
|
|
184073
|
+
if (!forCommit && target.persisted.exclusive || arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth) !== target.accountKey || alreadyPersisted()) return;
|
|
184074
|
+
const result = await callArkme("source.record-reedit.draft.put", {
|
|
183300
184075
|
sourceRef: target.sourceRef,
|
|
183301
184076
|
itemUid: target.item.itemUid,
|
|
183302
184077
|
newText: nextText,
|
|
183303
|
-
expectedVersion: snapshot.version,
|
|
184078
|
+
expectedVersion: snapshot.draft?.baseVersion ?? snapshot.version,
|
|
184079
|
+
expectedDraftRevision: target.persisted.draftRevision,
|
|
184080
|
+
attachments: target.attachments.map((attachment) => attachment.selection),
|
|
183304
184081
|
...supportsTitle ? { newTitle: nextTitle } : {}
|
|
183305
184082
|
});
|
|
183306
|
-
|
|
184083
|
+
target.persisted.draftRevision = result.draftRevision;
|
|
184084
|
+
target.persisted.candidateKey = nextCandidateKey;
|
|
183307
184085
|
});
|
|
183308
|
-
|
|
183309
|
-
|
|
183310
|
-
|
|
183311
|
-
...current,
|
|
183312
|
-
persistedCandidateKey: nextCandidateKey
|
|
183313
|
-
} : current);
|
|
184086
|
+
target.persisted.saveTail = operation.then(() => void 0, () => void 0);
|
|
184087
|
+
await operation;
|
|
184088
|
+
return alreadyPersisted();
|
|
183314
184089
|
}, []);
|
|
183315
184090
|
const persistRecordReeditBeforeContextExit = (0, react.useCallback)((target, shouldClose) => {
|
|
183316
184091
|
recordReeditGenerationRef.current += 1;
|
|
183317
|
-
if (target.snapshot === void 0
|
|
183318
|
-
|
|
184092
|
+
if (target.snapshot === void 0) {
|
|
184093
|
+
updateRecordReeditCandidate(target, (current) => sameArkmeRecordReeditSession(current, target) ? void 0 : current);
|
|
183319
184094
|
return;
|
|
183320
184095
|
}
|
|
183321
|
-
|
|
183322
|
-
|
|
184096
|
+
if (target.busy) return;
|
|
184097
|
+
persistRecordReeditDraft(target).then((saved) => {
|
|
184098
|
+
if (!saved) return;
|
|
184099
|
+
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
184100
|
}).catch((caught) => {
|
|
183324
|
-
|
|
184101
|
+
updateRecordReeditCandidate(target, (current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
183325
184102
|
...current,
|
|
183326
184103
|
busy: false,
|
|
183327
|
-
|
|
184104
|
+
...arkmeRecordReeditFailure(caught)
|
|
183328
184105
|
} : current);
|
|
183329
184106
|
});
|
|
183330
|
-
}, [persistRecordReeditDraft]);
|
|
184107
|
+
}, [persistRecordReeditDraft, updateRecordReeditCandidate]);
|
|
183331
184108
|
(0, react.useEffect)(() => {
|
|
183332
184109
|
if (composerExtensionTarget !== void 0 && composerExtensionTarget.sourceRef !== source?.sourceRef) setComposerExtensionTarget(void 0);
|
|
183333
184110
|
}, [composerExtensionTarget, source?.sourceRef]);
|
|
@@ -183338,9 +184115,40 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183338
184115
|
}
|
|
183339
184116
|
setRecordReeditHighlightUid("");
|
|
183340
184117
|
const target = recordReeditComposerRef.current;
|
|
183341
|
-
|
|
183342
|
-
|
|
183343
|
-
|
|
184118
|
+
const nextScope = {
|
|
184119
|
+
accountKey: authenticatedAccountKey,
|
|
184120
|
+
sourceKey: conversationKey,
|
|
184121
|
+
sourceRef: source?.sourceRef ?? ""
|
|
184122
|
+
};
|
|
184123
|
+
if (target === void 0 || target.accountKey !== authenticatedAccountKey) {
|
|
184124
|
+
if (target !== void 0 && target.snapshot === void 0) updateRecordReeditCandidate(target, () => void 0);
|
|
184125
|
+
activateRecordReeditScope(nextScope, ++recordReeditGenerationRef.current);
|
|
184126
|
+
return;
|
|
184127
|
+
}
|
|
184128
|
+
if (target.sourceKey === conversationKey) {
|
|
184129
|
+
if (activeConversation && target.generation !== recordReeditGenerationRef.current) {
|
|
184130
|
+
const generation = ++recordReeditGenerationRef.current;
|
|
184131
|
+
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
184132
|
+
...current,
|
|
184133
|
+
generation
|
|
184134
|
+
} : current);
|
|
184135
|
+
}
|
|
184136
|
+
return;
|
|
184137
|
+
}
|
|
184138
|
+
persistRecordReeditBeforeContextExit(target, () => {
|
|
184139
|
+
const selected = arkmeUi.getSnapshot().selectedSource;
|
|
184140
|
+
return selected === void 0 || arkmeSourceIdentityKey(selected) !== target.sourceKey;
|
|
184141
|
+
});
|
|
184142
|
+
activateRecordReeditScope(nextScope, ++recordReeditGenerationRef.current);
|
|
184143
|
+
}, [
|
|
184144
|
+
activeConversation,
|
|
184145
|
+
authenticatedAccountKey,
|
|
184146
|
+
conversationKey,
|
|
184147
|
+
persistRecordReeditBeforeContextExit,
|
|
184148
|
+
source?.sourceRef,
|
|
184149
|
+
activateRecordReeditScope,
|
|
184150
|
+
updateRecordReeditCandidate
|
|
184151
|
+
]);
|
|
183344
184152
|
(0, react.useEffect)(() => {
|
|
183345
184153
|
if (activeRecordReeditComposer?.snapshot === void 0) return;
|
|
183346
184154
|
const generation = activeRecordReeditComposer.generation;
|
|
@@ -183380,18 +184188,26 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183380
184188
|
};
|
|
183381
184189
|
}, [recordInputCaptureOwner]);
|
|
183382
184190
|
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;
|
|
184191
|
+
const visibleComposerText = activeRecordReeditComposer?.textContent ?? (directAdmission.blocked ? "" : draft);
|
|
184192
|
+
const visibleComposerAttachments = activeRecordReeditComposer === void 0 ? attachments : activeRecordReeditComposer.attachments.map((attachment) => {
|
|
184193
|
+
const block = arkmeRecordReeditAttachmentBlock(attachment);
|
|
184194
|
+
return block === void 0 ? attachment : {
|
|
184195
|
+
...attachment,
|
|
184196
|
+
previewUrl: arkmeContentMediaUrl(block)
|
|
184197
|
+
};
|
|
184198
|
+
});
|
|
183384
184199
|
const composerTextLength = Array.from(visibleComposerText).length;
|
|
183385
|
-
const composerHasUserContent = composerTextLength > 0 ||
|
|
184200
|
+
const composerHasUserContent = composerTextLength > 0 || visibleComposerAttachments.length > 0;
|
|
183386
184201
|
const composerStatsVisible = composerInputFocused || composerHasUserContent;
|
|
183387
184202
|
const composerInputStartedAtMillis = recordInputCaptureOwner.getStartedAtMillis(composerDraftKey);
|
|
183388
184203
|
(0, react.useEffect)(() => {
|
|
183389
184204
|
recordInputCaptureOwner.sync({
|
|
183390
184205
|
draftKey: composerDraftKey,
|
|
183391
|
-
isActive: activeRecordReeditComposer === void 0 && activeConversation && backgroundSoundSupported && backgroundSoundEligibilityReason === "eligible" && composerInputFocused && arkmeSourceSupportsRecordInputCapture(source?.kind),
|
|
184206
|
+
isActive: !directAdmission.blocked && activeRecordReeditComposer === void 0 && activeConversation && backgroundSoundSupported && backgroundSoundEligibilityReason === "eligible" && composerInputFocused && arkmeSourceSupportsRecordInputCapture(source?.kind),
|
|
183392
184207
|
hasUserContent: composerHasUserContent
|
|
183393
184208
|
});
|
|
183394
184209
|
}, [
|
|
184210
|
+
directAdmission.blocked,
|
|
183395
184211
|
activeConversation,
|
|
183396
184212
|
activeRecordReeditComposer,
|
|
183397
184213
|
backgroundSoundEligibilityReason,
|
|
@@ -183405,11 +184221,12 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183405
184221
|
const syncComposerUserInput = (0, react.useCallback)((hasUserContent) => {
|
|
183406
184222
|
recordInputCaptureOwner.sync({
|
|
183407
184223
|
draftKey: composerDraftKey,
|
|
183408
|
-
isActive: activeConversation && backgroundSoundSupported && backgroundSoundEligibilityReason === "eligible" && composerInputFocused && arkmeSourceSupportsRecordInputCapture(source?.kind),
|
|
184224
|
+
isActive: !directAdmission.blocked && activeConversation && backgroundSoundSupported && backgroundSoundEligibilityReason === "eligible" && composerInputFocused && arkmeSourceSupportsRecordInputCapture(source?.kind),
|
|
183409
184225
|
hasUserContent
|
|
183410
184226
|
});
|
|
183411
184227
|
if (hasUserContent) recordInputCaptureOwner.beginUserInput(composerDraftKey);
|
|
183412
184228
|
}, [
|
|
184229
|
+
directAdmission.blocked,
|
|
183413
184230
|
activeConversation,
|
|
183414
184231
|
backgroundSoundEligibilityReason,
|
|
183415
184232
|
backgroundSoundSupported,
|
|
@@ -183599,17 +184416,25 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183599
184416
|
}, [authenticatedUserId]);
|
|
183600
184417
|
const [busy, setBusy] = (0, react.useState)(false);
|
|
183601
184418
|
const preparingFiles = composerDraftKey !== void 0 && preparingKeys.has(composerDraftKey);
|
|
184419
|
+
const preparingReeditFiles = activeRecordReeditComposer !== void 0 && preparingKeys.has(arkmeRecordReeditPreparationKey(activeRecordReeditComposer));
|
|
184420
|
+
const composerFilesDisabled = activeRecordReeditComposer === void 0 ? preparingFiles || directAdmission.blocked : activeRecordReeditComposer.snapshot === void 0 || preparingReeditFiles || activeRecordReeditComposer.loading || activeRecordReeditComposer.busy;
|
|
184421
|
+
const composerFileAddingDisabled = composerFilesDisabled || activeRecordReeditComposer?.snapshot?.maxAttachments === 0;
|
|
183602
184422
|
const messagePreparing = useMessagePreparing({
|
|
183603
184423
|
source,
|
|
183604
184424
|
accountScope: authenticatedAccountKey,
|
|
183605
|
-
enabled: activeConversation && activeRecordReeditComposer === void 0 && !preparingFiles,
|
|
184425
|
+
enabled: activeConversation && activeRecordReeditComposer === void 0 && !preparingFiles && !directAdmission.blocked,
|
|
183606
184426
|
focused: composerInputFocused
|
|
183607
184427
|
});
|
|
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() !== "";
|
|
184428
|
+
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
184429
|
const pendingComposerFocusDraftKeyRef = (0, react.useRef)();
|
|
183610
184430
|
const [compactNavigation, setCompactNavigation] = (0, react.useState)(false);
|
|
183611
184431
|
const [submitBusy, setSubmitBusy] = (0, react.useState)(false);
|
|
183612
184432
|
const [loadingOlder, setLoadingOlder] = (0, react.useState)(false);
|
|
184433
|
+
const olderLoadRef = (0, react.useRef)({
|
|
184434
|
+
armed: true,
|
|
184435
|
+
error: ""
|
|
184436
|
+
});
|
|
184437
|
+
const olderLoadError = olderLoadRef.current.error;
|
|
183613
184438
|
const [loadingNewer, setLoadingNewer] = (0, react.useState)(false);
|
|
183614
184439
|
const newerSentinelArmedRef = (0, react.useRef)(true);
|
|
183615
184440
|
const [highlightedTargetUid, setHighlightedTargetUid] = (0, react.useState)("");
|
|
@@ -183916,6 +184741,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183916
184741
|
const cacheAccountKeyRef = (0, react.useRef)();
|
|
183917
184742
|
const timelineGenerationRef = (0, react.useRef)(0);
|
|
183918
184743
|
const timelineWindowRevisionRef = (0, react.useRef)(0);
|
|
184744
|
+
const appliedTimelineInvalidationsRef = (0, react.useRef)(/* @__PURE__ */ new Map());
|
|
183919
184745
|
const timelineRequestsRef = (0, react.useRef)(/* @__PURE__ */ new Map());
|
|
183920
184746
|
const pendingViewportRestoreRef = (0, react.useRef)();
|
|
183921
184747
|
const pendingConversationTargetLocateRef = (0, react.useRef)();
|
|
@@ -183937,6 +184763,11 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
183937
184763
|
if (activeConversation) return;
|
|
183938
184764
|
timelineGenerationRef.current += 1;
|
|
183939
184765
|
timelineWindowRevisionRef.current += 1;
|
|
184766
|
+
olderLoadRef.current = {
|
|
184767
|
+
armed: true,
|
|
184768
|
+
error: ""
|
|
184769
|
+
};
|
|
184770
|
+
setLoadingOlder(false);
|
|
183940
184771
|
for (const request of timelineRequestsRef.current.values()) request.controller.abort();
|
|
183941
184772
|
timelineRequestsRef.current.clear();
|
|
183942
184773
|
conversationTargetAbortRef.current?.abort();
|
|
@@ -184430,7 +185261,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184430
185261
|
const hostRect = host.getBoundingClientRect();
|
|
184431
185262
|
const buttonRect = button.getBoundingClientRect();
|
|
184432
185263
|
const menuWidth = 248;
|
|
184433
|
-
const menuHeight = canManageUserBan ? 88 : 44;
|
|
185264
|
+
const menuHeight = (canManageUserBan ? 88 : 44) + (directAdmission.applicable ? 88 : 0);
|
|
184434
185265
|
setRelatedMenuPosition({
|
|
184435
185266
|
left: Math.max(12, Math.min(hostRect.width - menuWidth - 12, buttonRect.right - hostRect.left - menuWidth)),
|
|
184436
185267
|
top: Math.max(8, Math.min(hostRect.height - menuHeight - 12, buttonRect.bottom - hostRect.top + 8))
|
|
@@ -184441,6 +185272,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184441
185272
|
ensureUserBanStatus();
|
|
184442
185273
|
}, [
|
|
184443
185274
|
canManageUserBan,
|
|
185275
|
+
directAdmission.applicable,
|
|
184444
185276
|
ensureRelatedEligibility,
|
|
184445
185277
|
ensureUserBanStatus,
|
|
184446
185278
|
relatedMenuOpen,
|
|
@@ -184453,7 +185285,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184453
185285
|
const readAckKey = `${source.sourceRef}:${String(readSequence)}`;
|
|
184454
185286
|
if (readSequence <= 0 || lastReadAckRef.current === readAckKey) return;
|
|
184455
185287
|
if (!(source.unreadCount > 0 || arkmeChatDirectory.hasOptimisticRead(source.sourceRef, source.sourceKey, source.latestSequence ?? readSequence))) return;
|
|
185288
|
+
const generation = timelineGenerationRef.current;
|
|
184456
185289
|
if (!await arkmeAwaitVisibleReadIntent()) return;
|
|
185290
|
+
if (!activeConversationRef.current || generation !== timelineGenerationRef.current) return;
|
|
184457
185291
|
if (lastReadAckRef.current === readAckKey) return;
|
|
184458
185292
|
lastReadAckRef.current = readAckKey;
|
|
184459
185293
|
try {
|
|
@@ -184473,13 +185307,22 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184473
185307
|
const sourceRef = source.sourceRef;
|
|
184474
185308
|
const sourceKey = arkmeSourceIdentityKey(source);
|
|
184475
185309
|
const generation = timelineGenerationRef.current;
|
|
185310
|
+
const invalidationRevision = arkmeChatTimelineDelta.getSnapshotForSource(sourceKey).invalidationRevision;
|
|
185311
|
+
const refreshWindow = intent === "refresh" || intent === "background" ? conversationCacheRef.current.getTimeline(sourceKey) : void 0;
|
|
185312
|
+
if (intent === "refresh" && conversationTargetAbortRef.current !== void 0 && !conversationTargetAbortRef.current.signal.aborted) return;
|
|
184476
185313
|
if (intent === "background" && (conversationCacheRef.current.getTimeline(sourceKey)?.mode === "around" || conversationTargetAbortRef.current !== void 0 && !conversationTargetAbortRef.current.signal.aborted)) return;
|
|
184477
|
-
|
|
184478
|
-
const
|
|
185314
|
+
if (refreshWindow !== void 0 && timelineRequestsRef.current.get("initial")?.controller.signal.aborted === false) return;
|
|
185315
|
+
const direction = refreshWindow === void 0 ? cursor === void 0 ? "initial" : (cursor.afterSequence ?? 0) > 0 ? "newer" : "older" : "refresh";
|
|
185316
|
+
const requestKey = refreshWindow === void 0 ? `${sourceKey}:${cursor === void 0 ? "initial" : JSON.stringify(cursor)}` : `${sourceKey}:refresh:${invalidationRevision}`;
|
|
184479
185317
|
const activeRequest = timelineRequestsRef.current.get(direction);
|
|
184480
185318
|
if (activeRequest !== void 0 && !activeRequest.controller.signal.aborted && activeRequest.requestKey === requestKey) return;
|
|
184481
185319
|
if (intent === "latest") {
|
|
184482
185320
|
timelineWindowRevisionRef.current += 1;
|
|
185321
|
+
olderLoadRef.current = {
|
|
185322
|
+
armed: true,
|
|
185323
|
+
error: ""
|
|
185324
|
+
};
|
|
185325
|
+
setLoadingOlder(false);
|
|
184483
185326
|
for (const [activeDirection, request] of timelineRequestsRef.current) if (activeDirection !== direction) request.controller.abort();
|
|
184484
185327
|
}
|
|
184485
185328
|
const windowRevision = timelineWindowRevisionRef.current;
|
|
@@ -184490,31 +185333,51 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184490
185333
|
controller,
|
|
184491
185334
|
requestKey
|
|
184492
185335
|
});
|
|
185336
|
+
const readStartDeltas = /* @__PURE__ */ new Map();
|
|
184493
185337
|
let page;
|
|
184494
185338
|
try {
|
|
184495
|
-
|
|
184496
|
-
|
|
184497
|
-
|
|
184498
|
-
|
|
184499
|
-
|
|
185339
|
+
const readPage = (pageCursor) => retryArkmeRead(async () => {
|
|
185340
|
+
const start = new Map((sourceIsChat ? arkmeChatTimelineDelta.getSnapshotForSource(sourceKey).items : []).map((item) => [item.itemUid, item]));
|
|
185341
|
+
const result = await callArkme("source.timeline", {
|
|
185342
|
+
sourceRef,
|
|
185343
|
+
limit: refreshWindow === void 0 ? limit : 100,
|
|
185344
|
+
...pageCursor === void 0 ? {} : { cursor: pageCursor }
|
|
185345
|
+
}, controller.signal);
|
|
185346
|
+
for (const item of result.items) readStartDeltas.set(item.itemUid, start.get(item.itemUid));
|
|
185347
|
+
return result;
|
|
185348
|
+
}, { signal: controller.signal });
|
|
185349
|
+
page = refreshWindow === void 0 ? await readPage(cursor) : await readConversationTimelineWindow(refreshWindow, readPage, controller.signal);
|
|
184500
185350
|
} catch (caught) {
|
|
184501
185351
|
if (isArkmeRequestAbort(caught, controller.signal)) return;
|
|
184502
185352
|
throw caught;
|
|
184503
185353
|
} finally {
|
|
184504
185354
|
if (timelineRequestsRef.current.get(direction)?.controller === controller) timelineRequestsRef.current.delete(direction);
|
|
184505
185355
|
}
|
|
184506
|
-
if (generation !== timelineGenerationRef.current || windowRevision !== timelineWindowRevisionRef.current) return;
|
|
185356
|
+
if (controller.signal.aborted || generation !== timelineGenerationRef.current || windowRevision !== timelineWindowRevisionRef.current) return;
|
|
185357
|
+
if (direction === "older" && page.hasMore && (page.nextCursor === void 0 || sameStateValue(page.nextCursor, cursor))) throw new Error("暂时无法继续加载,请重试");
|
|
184507
185358
|
const cached = conversationCacheRef.current.getTimeline(sourceKey);
|
|
184508
185359
|
const loadingNewerPage = (cursor?.afterSequence ?? 0) > 0;
|
|
184509
185360
|
const cachedItemUids = new Set((cached?.items ?? []).map((item) => item.itemUid));
|
|
184510
185361
|
const newerPageStartItemUid = loadingNewerPage ? mergeItems([], page.items.filter((item) => !cachedItemUids.has(item.itemUid)))[0]?.itemUid : void 0;
|
|
184511
185362
|
const nextAroundSequenceRange = !(cursor === void 0 || loadingNewerPage && !page.hasMore) && (cached?.mode ?? "latest") === "around" ? arkmeConversationTimelineSequenceRange(page.items, cached?.aroundSequenceRange) : void 0;
|
|
184512
185363
|
const nextAiPolishSettings = cursor === void 0 ? page.aiPolishSettings : cached?.aiPolishSettings;
|
|
184513
|
-
const
|
|
184514
|
-
const
|
|
185364
|
+
const pendingProjectionItems = cursor === void 0 ? (cached?.items ?? []).filter((item) => item.awaitingTimelineProjection === true && !page.items.some((projected) => projected.itemUid === item.itemUid)) : [];
|
|
185365
|
+
const delta = sourceIsChat ? arkmeChatTimelineDelta.getSnapshotForSource(sourceKey) : void 0;
|
|
185366
|
+
const removedKeys = new Set(delta?.removedItemKeys ?? []);
|
|
185367
|
+
const authoritativeItems = mergeItems(pendingProjectionItems, reconcileTimelinePage(cached?.items ?? [], delta, page.items, readStartDeltas));
|
|
185368
|
+
const refreshRange = refreshWindow?.mode === "around" ? refreshWindow.aroundSequenceRange : void 0;
|
|
185369
|
+
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));
|
|
185370
|
+
const snapshot = refreshWindow !== void 0 && cached !== void 0 ? {
|
|
185371
|
+
...cached,
|
|
185372
|
+
items: confirmedSendRetention.merge(sourceKey, mergeItems(cached.items.filter((item) => !refreshedIds.has(item.itemUid) && !removedKeys.has(item.timelineItemKey ?? "")), authoritativeItems)),
|
|
185373
|
+
fetchedAtMillis: Date.now(),
|
|
185374
|
+
aiPolishNotices: page.aiPolishNotices ?? cached.aiPolishNotices,
|
|
185375
|
+
...page.aiPolishSettings === void 0 ? {} : { aiPolishSettings: page.aiPolishSettings },
|
|
185376
|
+
...sourceIsChat ? { latestSequence: Math.max(cached.latestSequence ?? 0, source.latestSequence ?? 0, ...page.items.map((item) => item.sequence ?? 0)) } : { recordRevision: sourceProjectionRevision }
|
|
185377
|
+
} : {
|
|
184515
185378
|
mode: cursor === void 0 ? "latest" : loadingNewerPage && !page.hasMore ? "latest" : cached?.mode ?? "latest",
|
|
184516
185379
|
...nextAroundSequenceRange === void 0 ? {} : { aroundSequenceRange: nextAroundSequenceRange },
|
|
184517
|
-
items: cursor === void 0 ? confirmedSendRetention.merge(sourceKey, authoritativeItems) : mergeItems(cached?.items ?? [],
|
|
185380
|
+
items: cursor === void 0 ? confirmedSendRetention.merge(sourceKey, authoritativeItems) : mergeItems(cached?.items ?? [], authoritativeItems),
|
|
184518
185381
|
aiPolishNotices: cursor === void 0 ? page.aiPolishNotices ?? [] : cached?.aiPolishNotices ?? [],
|
|
184519
185382
|
hasMore: loadingNewerPage ? cached?.hasMore ?? false : page.hasMore,
|
|
184520
185383
|
newerHasMore: loadingNewerPage ? page.hasMore : cursor === void 0 ? false : cached?.newerHasMore ?? false,
|
|
@@ -184526,12 +185389,15 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184526
185389
|
};
|
|
184527
185390
|
const contentChanged = !arkmeConversationTimelineContentEqual(cached, snapshot);
|
|
184528
185391
|
const releasedMoments = conversationCacheRef.current.storeTimeline(sourceKey, snapshot);
|
|
185392
|
+
const readIds = new Set(page.items.map((item) => item.itemUid));
|
|
185393
|
+
conversationCacheRef.current.consumeTimelineDeltaItems(sourceKey, (delta?.items ?? []).filter((item) => readIds.has(item.itemUid)));
|
|
185394
|
+
if (cursor === void 0) appliedTimelineInvalidationsRef.current.set(sourceKey, Math.max(appliedTimelineInvalidationsRef.current.get(sourceKey) ?? 0, invalidationRevision));
|
|
184529
185395
|
const releasedMomentsChanged = releasedMoments !== void 0 && JSON.stringify(releasedMoments) !== JSON.stringify(interwovenMoments);
|
|
184530
185396
|
if (contentChanged || releasedMomentsChanged) {
|
|
184531
185397
|
const body = bodyRef.current;
|
|
184532
185398
|
pendingViewportRestoreRef.current = {
|
|
184533
185399
|
sourceKey,
|
|
184534
|
-
viewport: preserve || hadCachedTimeline ? body === null ? conversationCacheRef.current.getViewport(sourceKey) : arkmeConversationViewport(body) : void 0,
|
|
185400
|
+
viewport: preserve || hadCachedTimeline ? body === null ? conversationCacheRef.current.getViewport(sourceKey) : arkmeConversationViewport(body, intent === "history") : void 0,
|
|
184535
185401
|
...newerPageStartItemUid === void 0 ? {} : { newerPageStartAnchorId: `message:${newerPageStartItemUid}` }
|
|
184536
185402
|
};
|
|
184537
185403
|
if (contentChanged) setTimelineView({
|
|
@@ -184554,6 +185420,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184554
185420
|
if (!hadCachedTimeline && snapshot.items.length > 0) setTimelineRevealKey(sourceKey);
|
|
184555
185421
|
await acknowledgeRead(snapshot.items);
|
|
184556
185422
|
}
|
|
185423
|
+
if (generation === timelineGenerationRef.current && windowRevision === timelineWindowRevisionRef.current && arkmeChatTimelineDelta.getSnapshotForSource(sourceKey).invalidationRevision > invalidationRevision) await loadTimeline(void 0, true, 40, "refresh");
|
|
184557
185424
|
}, [
|
|
184558
185425
|
acknowledgeRead,
|
|
184559
185426
|
confirmedSendRetention,
|
|
@@ -184660,24 +185527,35 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184660
185527
|
const controller = new AbortController();
|
|
184661
185528
|
conversationTargetAbortRef.current?.abort();
|
|
184662
185529
|
conversationTargetAbortRef.current = controller;
|
|
184663
|
-
|
|
184664
|
-
|
|
184665
|
-
|
|
184666
|
-
|
|
184667
|
-
|
|
184668
|
-
|
|
184669
|
-
|
|
185530
|
+
let readStartDeltas = /* @__PURE__ */ new Map();
|
|
185531
|
+
retryArkmeRead(() => {
|
|
185532
|
+
readStartDeltas = new Map(arkmeChatTimelineDelta.getSnapshotForSource(conversationKey).items.map((item) => [item.itemUid, item]));
|
|
185533
|
+
return callArkme("source.timeline-around", {
|
|
185534
|
+
sourceRef: source.sourceRef,
|
|
185535
|
+
itemUid: target.itemUid,
|
|
185536
|
+
recordOwnerUserId: target.recordOwnerUserId,
|
|
185537
|
+
beforeLimit: 20,
|
|
185538
|
+
afterLimit: 20
|
|
185539
|
+
}, controller.signal);
|
|
185540
|
+
}, { signal: controller.signal }).then((page) => {
|
|
184670
185541
|
if (controller.signal.aborted || generation !== timelineGenerationRef.current || windowRevision !== timelineWindowRevisionRef.current || arkmeUi.getSnapshot().conversationTarget?.revision !== target.revision) return;
|
|
184671
|
-
|
|
185542
|
+
const cached = conversationCacheRef.current.getTimeline(conversationKey);
|
|
185543
|
+
const delta = sourceIsChat ? arkmeChatTimelineDelta.getSnapshotForSource(conversationKey) : void 0;
|
|
185544
|
+
const items = reconcileTimelinePage(cached?.items ?? [], delta, page.items, readStartDeltas);
|
|
185545
|
+
if (!items.some((item) => item.itemUid === target.itemUid)) throw new Error("未找到要定位的快记");
|
|
184672
185546
|
timelineRequestsRef.current.get("initial")?.controller.abort();
|
|
184673
185547
|
timelineRequestsRef.current.delete("initial");
|
|
184674
185548
|
timelineWindowRevisionRef.current += 1;
|
|
184675
|
-
|
|
185549
|
+
olderLoadRef.current = {
|
|
185550
|
+
armed: true,
|
|
185551
|
+
error: ""
|
|
185552
|
+
};
|
|
185553
|
+
setLoadingOlder(false);
|
|
184676
185554
|
const nextAroundSequenceRange = arkmeConversationTimelineSequenceRange(page.items);
|
|
184677
185555
|
const snapshot = {
|
|
184678
185556
|
mode: "around",
|
|
184679
185557
|
...nextAroundSequenceRange === void 0 ? {} : { aroundSequenceRange: nextAroundSequenceRange },
|
|
184680
|
-
items
|
|
185558
|
+
items,
|
|
184681
185559
|
aiPolishNotices: cached?.aiPolishNotices ?? [],
|
|
184682
185560
|
hasMore: page.olderHasMore,
|
|
184683
185561
|
newerHasMore: page.newerHasMore,
|
|
@@ -184688,6 +185566,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184688
185566
|
...page.newerCursor === void 0 ? {} : { newerCursor: page.newerCursor }
|
|
184689
185567
|
};
|
|
184690
185568
|
conversationCacheRef.current.storeTimeline(conversationKey, snapshot);
|
|
185569
|
+
const readIds = new Set(page.items.map((item) => item.itemUid));
|
|
185570
|
+
conversationCacheRef.current.consumeTimelineDeltaItems(conversationKey, (delta?.items ?? []).filter((item) => readIds.has(item.itemUid)));
|
|
185571
|
+
conversationTargetAbortRef.current = void 0;
|
|
184691
185572
|
pendingViewportRestoreRef.current = void 0;
|
|
184692
185573
|
setMemberEventWindowRevision((value) => value + 1);
|
|
184693
185574
|
pendingConversationTargetLocateRef.current = {
|
|
@@ -184707,8 +185588,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184707
185588
|
newerCursor: snapshot.newerCursor,
|
|
184708
185589
|
newerHasMore: snapshot.newerHasMore ?? false
|
|
184709
185590
|
});
|
|
185591
|
+
if (arkmeChatTimelineDelta.getSnapshotForSource(conversationKey).invalidationRevision > (appliedTimelineInvalidationsRef.current.get(conversationKey) ?? 0)) loadTimeline(void 0, true, 40, "refresh").catch((caught) => {
|
|
185592
|
+
setError(errorMessage$2(caught));
|
|
185593
|
+
});
|
|
184710
185594
|
}).catch((caught) => {
|
|
184711
185595
|
if (isArkmeRequestAbort(caught, controller.signal)) return;
|
|
185596
|
+
if (generation !== timelineGenerationRef.current || windowRevision !== timelineWindowRevisionRef.current) return;
|
|
185597
|
+
conversationTargetAbortRef.current = void 0;
|
|
184712
185598
|
if (pendingConversationTargetLocateRef.current?.revision === target.revision) pendingConversationTargetLocateRef.current = void 0;
|
|
184713
185599
|
const message = errorMessage$2(caught) || "暂时无法定位这条快记";
|
|
184714
185600
|
if (messageActionStatusTimerRef.current !== void 0) window.clearTimeout(messageActionStatusTimerRef.current);
|
|
@@ -184718,6 +185604,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184718
185604
|
messageActionStatusTimerRef.current = void 0;
|
|
184719
185605
|
}, MESSAGE_ACTION_NOTICE_MS);
|
|
184720
185606
|
arkmeUi.consumeConversationTarget(target.revision);
|
|
185607
|
+
if (arkmeChatTimelineDelta.getSnapshotForSource(conversationKey).invalidationRevision > (appliedTimelineInvalidationsRef.current.get(conversationKey) ?? 0)) loadTimeline(void 0, true, 40, "refresh").catch((error) => {
|
|
185608
|
+
setError(errorMessage$2(error));
|
|
185609
|
+
});
|
|
184721
185610
|
}).finally(() => {
|
|
184722
185611
|
if (conversationTargetAbortRef.current === controller) conversationTargetAbortRef.current = void 0;
|
|
184723
185612
|
});
|
|
@@ -184764,6 +185653,11 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184764
185653
|
timelineGenerationRef.current += 1;
|
|
184765
185654
|
timelineWindowRevisionRef.current += 1;
|
|
184766
185655
|
newerSentinelArmedRef.current = true;
|
|
185656
|
+
olderLoadRef.current = {
|
|
185657
|
+
armed: true,
|
|
185658
|
+
error: ""
|
|
185659
|
+
};
|
|
185660
|
+
setLoadingOlder(false);
|
|
184767
185661
|
for (const request of timelineRequestsRef.current.values()) request.controller.abort();
|
|
184768
185662
|
timelineRequestsRef.current.clear();
|
|
184769
185663
|
conversationTargetAbortRef.current?.abort();
|
|
@@ -184774,6 +185668,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184774
185668
|
if (!accountChanged && timelineStateKey !== "" && bodyRef.current !== null) conversationCacheRef.current.storeViewport(timelineStateKey, arkmeConversationViewport(bodyRef.current));
|
|
184775
185669
|
if (accountChanged) {
|
|
184776
185670
|
conversationCacheRef.current.clear();
|
|
185671
|
+
appliedTimelineInvalidationsRef.current.clear();
|
|
184777
185672
|
cacheAccountKeyRef.current = authenticatedAccountKey;
|
|
184778
185673
|
}
|
|
184779
185674
|
const sourceKey = authenticated && conversationKey !== "" ? conversationKey : void 0;
|
|
@@ -184904,6 +185799,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
184904
185799
|
authenticated,
|
|
184905
185800
|
chatDelta.items,
|
|
184906
185801
|
conversationKey,
|
|
185802
|
+
foregroundReadRevision,
|
|
184907
185803
|
loadTimeline,
|
|
184908
185804
|
notificationActivationRevision,
|
|
184909
185805
|
source,
|
|
@@ -185013,13 +185909,14 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185013
185909
|
};
|
|
185014
185910
|
}, [activeConversation, authenticated]);
|
|
185015
185911
|
(0, react.useEffect)(() => {
|
|
185016
|
-
if (!activeConversation || !authenticated || source === void 0) return;
|
|
185017
|
-
const deltaItems = chatDelta.items;
|
|
185912
|
+
if (!activeConversation || !authenticated || source === void 0 || timelineStateKey !== conversationKey) return;
|
|
185913
|
+
const deltaItems = conversationCacheRef.current.unappliedTimelineDeltaItems(conversationKey, chatDelta.items);
|
|
185018
185914
|
const removedItemKeys = new Set(chatDelta.removedItemKeys);
|
|
185019
185915
|
const retainedItems = removedItemKeys.size === 0 ? items : items.filter((item) => !removedItemKeys.has(item.timelineItemKey ?? ""));
|
|
185020
185916
|
const applicableDeltaItems = arkmeConversationTimelineDeltaItems(timelineMode, aroundSequenceRange, retainedItems, deltaItems);
|
|
185021
185917
|
if (applicableDeltaItems.length === 0 && retainedItems.length === items.length) return;
|
|
185022
185918
|
const nextItems = mergeItems(retainedItems, applicableDeltaItems);
|
|
185919
|
+
conversationCacheRef.current.consumeTimelineDeltaItems(conversationKey, applicableDeltaItems);
|
|
185023
185920
|
if (JSON.stringify(nextItems) === JSON.stringify(items)) return;
|
|
185024
185921
|
const body = bodyRef.current;
|
|
185025
185922
|
const viewport = body === null ? void 0 : arkmeConversationViewport(body);
|
|
@@ -185049,15 +185946,14 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185049
185946
|
conversationKey,
|
|
185050
185947
|
items,
|
|
185051
185948
|
source,
|
|
185052
|
-
timelineMode
|
|
185949
|
+
timelineMode,
|
|
185950
|
+
timelineStateKey
|
|
185053
185951
|
]);
|
|
185054
|
-
const appliedTimelineInvalidationsRef = (0, react.useRef)(/* @__PURE__ */ new Map());
|
|
185055
185952
|
(0, react.useEffect)(() => {
|
|
185056
185953
|
if (!activeConversation || !authenticated || source === void 0 || chatDelta.invalidationRevision <= 0) return;
|
|
185057
185954
|
const applied = appliedTimelineInvalidationsRef.current.get(conversationKey) ?? 0;
|
|
185058
185955
|
if (chatDelta.invalidationRevision <= applied) return;
|
|
185059
|
-
|
|
185060
|
-
loadTimeline(void 0, true).catch((caught) => {
|
|
185956
|
+
loadTimeline(void 0, true, 40, "refresh").catch((caught) => {
|
|
185061
185957
|
setError(errorMessage$2(caught));
|
|
185062
185958
|
});
|
|
185063
185959
|
}, [
|
|
@@ -185130,33 +186026,61 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185130
186026
|
source?.kind,
|
|
185131
186027
|
source?.sourceRef
|
|
185132
186028
|
]);
|
|
186029
|
+
const loadOlderHistory = (0, react.useCallback)(async () => {
|
|
186030
|
+
const state = olderLoadRef.current;
|
|
186031
|
+
if (!activeConversation || !authenticated || !hasMore || nextCursor === void 0 || ui.conversationTarget !== void 0 || loadingOlder || timelineRequestsRef.current.has("older")) return;
|
|
186032
|
+
const generation = timelineGenerationRef.current;
|
|
186033
|
+
const windowRevision = timelineWindowRevisionRef.current;
|
|
186034
|
+
state.armed = false;
|
|
186035
|
+
state.error = "";
|
|
186036
|
+
setLoadingOlder(true);
|
|
186037
|
+
const current = () => state === olderLoadRef.current && generation === timelineGenerationRef.current && windowRevision === timelineWindowRevisionRef.current;
|
|
186038
|
+
try {
|
|
186039
|
+
await loadTimeline(nextCursor, true, 40, "history");
|
|
186040
|
+
} catch (caught) {
|
|
186041
|
+
if (current()) state.error = errorMessage$2(caught);
|
|
186042
|
+
} finally {
|
|
186043
|
+
if (state === olderLoadRef.current && generation === timelineGenerationRef.current) setLoadingOlder(false);
|
|
186044
|
+
}
|
|
186045
|
+
}, [
|
|
186046
|
+
activeConversation,
|
|
186047
|
+
authenticated,
|
|
186048
|
+
hasMore,
|
|
186049
|
+
nextCursor,
|
|
186050
|
+
loadingOlder,
|
|
186051
|
+
loadTimeline,
|
|
186052
|
+
ui.conversationTarget
|
|
186053
|
+
]);
|
|
185133
186054
|
(0, react.useEffect)(() => {
|
|
185134
186055
|
const root = bodyRef.current;
|
|
185135
186056
|
const sentinel = sentinelRef.current;
|
|
185136
|
-
if (!activeConversation || !authenticated || root === null || sentinel === null || !hasMore || nextCursor === void 0) return;
|
|
186057
|
+
if (!activeConversation || !authenticated || ui.conversationTarget !== void 0 || root === null || sentinel === null || !hasMore || nextCursor === void 0) return;
|
|
186058
|
+
let active = true;
|
|
185137
186059
|
const observer = new IntersectionObserver((entries) => {
|
|
185138
|
-
|
|
185139
|
-
|
|
185140
|
-
|
|
185141
|
-
|
|
185142
|
-
|
|
185143
|
-
|
|
185144
|
-
|
|
186060
|
+
const state = olderLoadRef.current;
|
|
186061
|
+
if (!active || loadingOlder || state.error !== "") return;
|
|
186062
|
+
if (entries[0]?.isIntersecting !== true) {
|
|
186063
|
+
state.armed = true;
|
|
186064
|
+
return;
|
|
186065
|
+
}
|
|
186066
|
+
if (state.armed) loadOlderHistory();
|
|
185145
186067
|
}, {
|
|
185146
186068
|
root,
|
|
185147
186069
|
rootMargin: "120px 0px 0px"
|
|
185148
186070
|
});
|
|
185149
186071
|
observer.observe(sentinel);
|
|
185150
186072
|
return () => {
|
|
186073
|
+
active = false;
|
|
185151
186074
|
observer.disconnect();
|
|
185152
186075
|
};
|
|
185153
186076
|
}, [
|
|
185154
186077
|
activeConversation,
|
|
185155
186078
|
authenticated,
|
|
185156
186079
|
hasMore,
|
|
185157
|
-
|
|
186080
|
+
loadOlderHistory,
|
|
185158
186081
|
loadingOlder,
|
|
185159
|
-
nextCursor
|
|
186082
|
+
nextCursor,
|
|
186083
|
+
ui.conversationTarget
|
|
185160
186084
|
]);
|
|
185161
186085
|
(0, react.useEffect)(() => {
|
|
185162
186086
|
const root = bodyRef.current;
|
|
@@ -185430,28 +186354,45 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185430
186354
|
request.send(file);
|
|
185431
186355
|
});
|
|
185432
186356
|
const selectFiles = async (files) => {
|
|
186357
|
+
if (activeRecordReeditComposer === void 0 && directAdmission.blocked) return;
|
|
185433
186358
|
if (files === null || files.length === 0) return;
|
|
186359
|
+
const reeditTarget = activeRecordReeditComposer;
|
|
186360
|
+
if (reeditTarget?.snapshot?.maxAttachments === 0) return;
|
|
185434
186361
|
const targetDraftKey = composerDraftKey;
|
|
185435
186362
|
const targetUserId = authenticatedUserId;
|
|
185436
186363
|
if (targetDraftKey === void 0 || targetUserId === void 0) return;
|
|
185437
|
-
|
|
186364
|
+
const preparationKey = reeditTarget === void 0 ? targetDraftKey : arkmeRecordReeditPreparationKey(reeditTarget);
|
|
186365
|
+
if (reeditTarget !== void 0 && (reeditTarget.snapshot === void 0 || reeditTarget.loading || reeditTarget.busy || preparationJobs.current.has(preparationKey))) return;
|
|
186366
|
+
const scope = captureComposerAsyncScope();
|
|
186367
|
+
const sameReeditTarget = () => reeditTarget !== void 0 && sameComposerAsyncScope(scope) && recordReeditGenerationRef.current === reeditTarget.generation && sameArkmeRecordReeditSession(recordReeditComposerRef.current, reeditTarget);
|
|
186368
|
+
const showPreparationError = (message) => {
|
|
186369
|
+
if (reeditTarget === void 0) setError(message);
|
|
186370
|
+
else if (sameReeditTarget()) setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, reeditTarget) ? {
|
|
186371
|
+
...current,
|
|
186372
|
+
error: message
|
|
186373
|
+
} : current);
|
|
186374
|
+
};
|
|
186375
|
+
if (reeditTarget === void 0) syncComposerUserInput(true);
|
|
185438
186376
|
const picked = Array.from(files);
|
|
185439
186377
|
const controller = new AbortController();
|
|
185440
186378
|
stageControllers.current.add(controller);
|
|
185441
186379
|
setAddMenuOpen(false);
|
|
185442
|
-
|
|
185443
|
-
setPreparingKeys((current) => /* @__PURE__ */ new Set([...current,
|
|
186380
|
+
showPreparationError("");
|
|
186381
|
+
setPreparingKeys((current) => /* @__PURE__ */ new Set([...current, preparationKey]));
|
|
185444
186382
|
if (fileInputRef.current !== null) fileInputRef.current.value = "";
|
|
185445
|
-
const job = (preparationJobs.current.get(
|
|
186383
|
+
const job = (preparationJobs.current.get(preparationKey) ?? Promise.resolve(true)).catch(() => false).then(async () => {
|
|
185446
186384
|
const sdk = createArkmeSdk();
|
|
185447
186385
|
const policy = await sdk.fileCapabilities();
|
|
186386
|
+
const maxAttachments = Math.min(policy.maxAttachments, reeditTarget?.snapshot?.maxAttachments ?? policy.maxAttachments);
|
|
185448
186387
|
const errors = [];
|
|
186388
|
+
let reeditAttachmentCount = reeditTarget?.attachments.length ?? 0;
|
|
185449
186389
|
let added = false;
|
|
185450
186390
|
for (const file of picked) {
|
|
185451
186391
|
controller.signal.throwIfAborted();
|
|
186392
|
+
if (reeditTarget !== void 0 && !sameReeditTarget()) return false;
|
|
185452
186393
|
const limit = file.type.startsWith("image/") ? policy.maxImageBytes : policy.maxFileBytes;
|
|
185453
|
-
if (arkmeComposerDraftStore.get(targetDraftKey).attachments.length >=
|
|
185454
|
-
errors.push(`最多添加 ${
|
|
186394
|
+
if ((reeditTarget === void 0 ? arkmeComposerDraftStore.get(targetDraftKey).attachments.length : reeditAttachmentCount) >= maxAttachments) {
|
|
186395
|
+
errors.push(`最多添加 ${maxAttachments} 个附件:${file.name}`);
|
|
185455
186396
|
continue;
|
|
185456
186397
|
}
|
|
185457
186398
|
if (file.size === 0 || file.size > limit) {
|
|
@@ -185459,34 +186400,52 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185459
186400
|
continue;
|
|
185460
186401
|
}
|
|
185461
186402
|
try {
|
|
185462
|
-
const localFile = await sdk.stageFile(file, {
|
|
186403
|
+
const localFile = await sdk.stageFile(file, {
|
|
186404
|
+
signal: controller.signal,
|
|
186405
|
+
expectedUserId: targetUserId,
|
|
186406
|
+
...reeditTarget ? { retention: "references" } : {}
|
|
186407
|
+
});
|
|
185463
186408
|
const currentAuth = arkmeAuthStore.getSnapshot().auth;
|
|
185464
186409
|
if (currentAuth?.status !== "authenticated" || currentAuth.userId !== targetUserId) return false;
|
|
185465
|
-
arkmeComposerDraftStore.appendAttachments(targetDraftKey, [{ localFile }], policy.maxAttachments);
|
|
186410
|
+
if (reeditTarget === void 0) arkmeComposerDraftStore.appendAttachments(targetDraftKey, [{ localFile }], policy.maxAttachments);
|
|
186411
|
+
else {
|
|
186412
|
+
if (!sameReeditTarget()) return false;
|
|
186413
|
+
reeditAttachmentCount += 1;
|
|
186414
|
+
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, reeditTarget) ? {
|
|
186415
|
+
...current,
|
|
186416
|
+
attachments: [...current.attachments, {
|
|
186417
|
+
localFile,
|
|
186418
|
+
selection: { fileRef: localFile.fileRef }
|
|
186419
|
+
}]
|
|
186420
|
+
} : current);
|
|
186421
|
+
}
|
|
185466
186422
|
added = true;
|
|
185467
186423
|
} catch (caught) {
|
|
185468
186424
|
if (controller.signal.aborted) throw caught;
|
|
185469
186425
|
errors.push(`${file.name}:${errorMessage$2(caught)}`);
|
|
185470
186426
|
}
|
|
185471
186427
|
}
|
|
185472
|
-
if (errors.length > 0)
|
|
186428
|
+
if (errors.length > 0) showPreparationError(errors.join(";"));
|
|
185473
186429
|
return added;
|
|
185474
186430
|
}).catch((caught) => {
|
|
185475
|
-
if (!controller.signal.aborted)
|
|
186431
|
+
if (!controller.signal.aborted) showPreparationError(errorMessage$2(caught));
|
|
185476
186432
|
return false;
|
|
185477
186433
|
}).finally(() => {
|
|
185478
186434
|
stageControllers.current.delete(controller);
|
|
185479
|
-
if (preparationJobs.current.get(
|
|
185480
|
-
preparationJobs.current.delete(
|
|
186435
|
+
if (preparationJobs.current.get(preparationKey) === job) {
|
|
186436
|
+
preparationJobs.current.delete(preparationKey);
|
|
185481
186437
|
setPreparingKeys((current) => {
|
|
185482
186438
|
const next = new Set(current);
|
|
185483
|
-
next.delete(
|
|
186439
|
+
next.delete(preparationKey);
|
|
185484
186440
|
return next;
|
|
185485
186441
|
});
|
|
185486
186442
|
}
|
|
185487
|
-
pendingComposerFocusDraftKeyRef.current = targetDraftKey;
|
|
186443
|
+
if (reeditTarget === void 0) pendingComposerFocusDraftKeyRef.current = targetDraftKey;
|
|
186444
|
+
else if (sameReeditTarget()) requestAnimationFrame(() => {
|
|
186445
|
+
textareaRef.current?.focus();
|
|
186446
|
+
});
|
|
185488
186447
|
});
|
|
185489
|
-
preparationJobs.current.set(
|
|
186448
|
+
preparationJobs.current.set(preparationKey, job);
|
|
185490
186449
|
await job;
|
|
185491
186450
|
};
|
|
185492
186451
|
const rememberSentHashTags = (0, react.useCallback)((accountKey, itemUid, textContent, sendAtMillis, textFormat) => {
|
|
@@ -185499,6 +186458,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185499
186458
|
}]));
|
|
185500
186459
|
}, []);
|
|
185501
186460
|
const send = async () => {
|
|
186461
|
+
if (activeRecordReeditComposer === void 0 && directAdmission.blocked) return;
|
|
185502
186462
|
if (activeRecordReeditComposer !== void 0) {
|
|
185503
186463
|
await commitRecordReedit();
|
|
185504
186464
|
return;
|
|
@@ -185908,6 +186868,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185908
186868
|
if (pendingAssets.length > 0) await loadTimeline();
|
|
185909
186869
|
} catch (caught) {
|
|
185910
186870
|
if (sameTargetComposer()) setItems((current) => current.filter((item) => item.itemUid !== recordUid));
|
|
186871
|
+
if (caught instanceof ArkmeClientError && caught.body.directMessageAdmission !== void 0) invalidateDirectMessageAdmission();
|
|
185911
186872
|
if (sameTargetAccount()) if (!durableFileSendUncertain) {
|
|
185912
186873
|
arkmeComposerDraftStore.restore(targetDraftKey, pendingDraft);
|
|
185913
186874
|
recordInputCaptureOwner.restoreForRetry(targetDraftKey, inputCapture);
|
|
@@ -185917,7 +186878,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
185917
186878
|
}
|
|
185918
186879
|
};
|
|
185919
186880
|
const updateComposerText = (text) => {
|
|
186881
|
+
if (activeRecordReeditComposer === void 0 && directAdmission.blocked) return;
|
|
185920
186882
|
if (activeRecordReeditComposer !== void 0) {
|
|
186883
|
+
if (activeRecordReeditComposer.snapshot === void 0 || activeRecordReeditComposer.loading || activeRecordReeditComposer.busy || preparationJobs.current.has(arkmeRecordReeditPreparationKey(activeRecordReeditComposer))) return;
|
|
185921
186884
|
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, activeRecordReeditComposer) ? {
|
|
185922
186885
|
...current,
|
|
185923
186886
|
textContent: text,
|
|
@@ -186455,10 +187418,39 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186455
187418
|
}
|
|
186456
187419
|
setMomentRelatedView(relatedDrawerBackTarget(momentRelatedView));
|
|
186457
187420
|
};
|
|
186458
|
-
const
|
|
187421
|
+
const refreshCurrentWindow = (0, react.useCallback)(() => loadTimeline(void 0, true, 40, "refresh"), [loadTimeline]);
|
|
187422
|
+
const reeditSubmissions = useRecordReeditSubmissions(source?.sourceRef, authenticatedAccountKey, activeConversation, timelineStateKey === conversationKey ? items : [], refreshCurrentWindow, conversationKey);
|
|
187423
|
+
const { displayItems, reeditItems } = (0, react.useMemo)(() => {
|
|
186459
187424
|
const remoteIds = new Set(items.map((item) => item.itemUid));
|
|
186460
|
-
|
|
186461
|
-
|
|
187425
|
+
const reeditItems = /* @__PURE__ */ new Set();
|
|
187426
|
+
return {
|
|
187427
|
+
displayItems: [...items.map((item) => {
|
|
187428
|
+
const bound = bindSentFileTaskLocals(item, fileTasks.tasks);
|
|
187429
|
+
const projected = projectRecordReedit(bound, reeditSubmissions.jobs);
|
|
187430
|
+
if (projected !== bound) reeditItems.add(projected);
|
|
187431
|
+
return projected;
|
|
187432
|
+
}), ...fileTasks.tasks.filter((task) => !remoteIds.has(task.result?.itemUid ?? task.recordUid)).map(fileTaskTimelineItem)].sort((a, b) => a.sendAtMillis - b.sendAtMillis),
|
|
187433
|
+
reeditItems
|
|
187434
|
+
};
|
|
187435
|
+
}, [
|
|
187436
|
+
items,
|
|
187437
|
+
fileTasks.tasks,
|
|
187438
|
+
reeditSubmissions.jobs
|
|
187439
|
+
]);
|
|
187440
|
+
(0, react.useEffect)(() => {
|
|
187441
|
+
for (const job of reeditSubmissions.jobs) if (job.state === "pending" || job.state === "committing") pendingReeditHighlights.current.add(job.submissionId);
|
|
187442
|
+
const committed = reeditSubmissions.jobs.filter((job) => job.state === "committed" && pendingReeditHighlights.current.has(job.submissionId) && !seenReeditCommits.current.has(job.submissionId));
|
|
187443
|
+
if (committed.length === 0) return;
|
|
187444
|
+
for (const job of committed) seenReeditCommits.current.add(job.submissionId);
|
|
187445
|
+
const latest = committed[committed.length - 1];
|
|
187446
|
+
if (recordReeditHighlightTimerRef.current !== void 0) window.clearTimeout(recordReeditHighlightTimerRef.current);
|
|
187447
|
+
setHighlightedTargetUid("");
|
|
187448
|
+
setRecordReeditHighlightUid(latest.itemUid);
|
|
187449
|
+
recordReeditHighlightTimerRef.current = window.setTimeout(() => {
|
|
187450
|
+
recordReeditHighlightTimerRef.current = void 0;
|
|
187451
|
+
setRecordReeditHighlightUid("");
|
|
187452
|
+
}, ARKME_RECORD_REEDIT_HIGHLIGHT_MILLIS);
|
|
187453
|
+
}, [reeditSubmissions.jobs]);
|
|
186462
187454
|
const visibleConversationJoinEvents = (0, react.useMemo)(() => source?.kind === "group_chat" ? arkmeConversationJoinEventsInLoadedWindow(conversationJoinEvents, displayItems, hasMore) : [], [
|
|
186463
187455
|
conversationJoinEvents,
|
|
186464
187456
|
displayItems,
|
|
@@ -186511,8 +187503,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186511
187503
|
event
|
|
186512
187504
|
});
|
|
186513
187505
|
};
|
|
187506
|
+
const interwovenWindow = (0, react.useMemo)(() => projectInterwovenWindow(displayItems, interwovenMoments, hasMore), [
|
|
187507
|
+
displayItems,
|
|
187508
|
+
interwovenMoments,
|
|
187509
|
+
hasMore
|
|
187510
|
+
]);
|
|
186514
187511
|
const displayRows = (0, react.useMemo)(() => [
|
|
186515
|
-
...mergeConversationRows(displayItems,
|
|
187512
|
+
...mergeConversationRows(displayItems, interwovenWindow.inline, memberEventTimeline.events),
|
|
186516
187513
|
...memberEventTimeline.gaps.map((gap) => ({
|
|
186517
187514
|
kind: "member-event-gap",
|
|
186518
187515
|
id: `member-event-gap:${gap.id}`,
|
|
@@ -186534,7 +187531,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186534
187531
|
].sort((left, right) => left.occurredAtMillis - right.occurredAtMillis || left.id.localeCompare(right.id)), [
|
|
186535
187532
|
aiPolishNotices,
|
|
186536
187533
|
displayItems,
|
|
186537
|
-
|
|
187534
|
+
interwovenWindow,
|
|
186538
187535
|
visibleConversationJoinEvents,
|
|
186539
187536
|
memberEventTimeline.events,
|
|
186540
187537
|
memberEventTimeline.gaps
|
|
@@ -186676,7 +187673,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186676
187673
|
const actionRef = arkmeTimelineMessageActionRef(item);
|
|
186677
187674
|
closeMessageMenu();
|
|
186678
187675
|
if (source === void 0 || actionRef === "") return;
|
|
186679
|
-
if (
|
|
187676
|
+
if (activeRecordReeditComposer !== void 0) {
|
|
186680
187677
|
showMessageActionStatus("请先完成编辑后再进行延展");
|
|
186681
187678
|
return;
|
|
186682
187679
|
}
|
|
@@ -186689,42 +187686,51 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186689
187686
|
textareaRef.current?.focus();
|
|
186690
187687
|
});
|
|
186691
187688
|
}, [
|
|
187689
|
+
activeRecordReeditComposer,
|
|
186692
187690
|
closeMessageMenu,
|
|
186693
187691
|
showMessageActionStatus,
|
|
186694
187692
|
source
|
|
186695
187693
|
]);
|
|
186696
187694
|
const closeRecordReedit = (0, react.useCallback)(async () => {
|
|
186697
187695
|
const target = recordReeditComposerRef.current;
|
|
186698
|
-
if (target === void 0 || target.busy) return;
|
|
187696
|
+
if (target === void 0 || target.busy || preparationJobs.current.has(arkmeRecordReeditPreparationKey(target))) return;
|
|
186699
187697
|
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
186700
187698
|
...current,
|
|
186701
187699
|
busy: true,
|
|
186702
187700
|
error: ""
|
|
186703
187701
|
} : current);
|
|
186704
187702
|
try {
|
|
186705
|
-
await persistRecordReeditDraft(target)
|
|
186706
|
-
|
|
186707
|
-
|
|
186708
|
-
|
|
186709
|
-
|
|
186710
|
-
|
|
186711
|
-
}
|
|
187703
|
+
if (target.snapshot !== void 0 && !await persistRecordReeditDraft(target)) {
|
|
187704
|
+
updateRecordReeditCandidate(target, (current) => ({
|
|
187705
|
+
...current,
|
|
187706
|
+
busy: false
|
|
187707
|
+
}));
|
|
187708
|
+
return;
|
|
187709
|
+
}
|
|
187710
|
+
const active = sameArkmeRecordReeditSession(recordReeditComposerRef.current, target);
|
|
187711
|
+
updateRecordReeditCandidate(target, () => void 0);
|
|
187712
|
+
if (active) {
|
|
187713
|
+
recordReeditGenerationRef.current += 1;
|
|
187714
|
+
requestAnimationFrame(() => {
|
|
187715
|
+
textareaRef.current?.focus();
|
|
187716
|
+
});
|
|
187717
|
+
}
|
|
186712
187718
|
} catch (caught) {
|
|
186713
|
-
|
|
187719
|
+
updateRecordReeditCandidate(target, (current) => ({
|
|
186714
187720
|
...current,
|
|
186715
187721
|
busy: false,
|
|
186716
|
-
|
|
186717
|
-
}
|
|
187722
|
+
...arkmeRecordReeditFailure(caught)
|
|
187723
|
+
}));
|
|
186718
187724
|
}
|
|
186719
|
-
}, [persistRecordReeditDraft]);
|
|
187725
|
+
}, [persistRecordReeditDraft, updateRecordReeditCandidate]);
|
|
186720
187726
|
const commitRecordReedit = (0, react.useCallback)(async () => {
|
|
186721
187727
|
const target = recordReeditComposerRef.current;
|
|
186722
187728
|
const targetSource = source;
|
|
186723
|
-
if (target === void 0 || target.snapshot === void 0 || target.loading || target.busy || targetSource === void 0) return;
|
|
187729
|
+
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
187730
|
const nextTitle = target.title.trim();
|
|
186725
187731
|
const nextText = (target.snapshot.textFormat ?? target.item.textFormat) === "markdown" ? target.textContent : target.textContent.trim();
|
|
186726
187732
|
const supportsTitle = target.snapshot.displayKind === 1;
|
|
186727
|
-
if (nextText.trim() === "" || supportsTitle && nextTitle === "") {
|
|
187733
|
+
if (nextText.trim() === "" && target.attachments.length === 0 && !target.snapshot.hasVoice || supportsTitle && nextTitle === "") {
|
|
186728
187734
|
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
186729
187735
|
...current,
|
|
186730
187736
|
error: "请输入完整内容"
|
|
@@ -186738,94 +187744,172 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186738
187744
|
} : current);
|
|
186739
187745
|
return;
|
|
186740
187746
|
}
|
|
186741
|
-
|
|
187747
|
+
target.persisted.exclusive = true;
|
|
186742
187748
|
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
186743
187749
|
...current,
|
|
186744
187750
|
busy: true,
|
|
186745
187751
|
error: ""
|
|
186746
187752
|
} : current);
|
|
186747
187753
|
try {
|
|
186748
|
-
await
|
|
186749
|
-
|
|
187754
|
+
await persistRecordReeditDraft(target, true);
|
|
187755
|
+
await target.persisted.saveTail;
|
|
187756
|
+
if (target.accountKey !== arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth)) return;
|
|
187757
|
+
const result = await callArkme("source.record-reedit.submit", {
|
|
186750
187758
|
sourceRef: target.sourceRef,
|
|
186751
187759
|
itemUid: target.item.itemUid,
|
|
186752
187760
|
newText: nextText,
|
|
186753
|
-
expectedVersion: target.snapshot.version,
|
|
187761
|
+
expectedVersion: target.snapshot.draft?.baseVersion ?? target.snapshot.version,
|
|
187762
|
+
expectedDraftRevision: target.persisted.draftRevision,
|
|
187763
|
+
attachments: target.attachments.map((attachment) => attachment.selection),
|
|
186754
187764
|
...supportsTitle ? { newTitle: nextTitle } : {}
|
|
186755
187765
|
});
|
|
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
|
-
});
|
|
187766
|
+
const active = sameArkmeRecordReeditSession(recordReeditComposerRef.current, target) && target.accountKey === arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth) && recordReeditGenerationRef.current === target.generation;
|
|
187767
|
+
reeditSubmissions.accepted(result);
|
|
187768
|
+
updateRecordReeditCandidate(target, () => void 0);
|
|
187769
|
+
if (active) {
|
|
187770
|
+
recordReeditGenerationRef.current += 1;
|
|
187771
|
+
requestAnimationFrame(() => {
|
|
187772
|
+
textareaRef.current?.focus();
|
|
187773
|
+
});
|
|
187774
|
+
}
|
|
186778
187775
|
} catch (caught) {
|
|
187776
|
+
updateRecordReeditCandidate(target, (current) => ({
|
|
187777
|
+
...current,
|
|
187778
|
+
busy: false,
|
|
187779
|
+
...arkmeRecordReeditFailure(caught)
|
|
187780
|
+
}));
|
|
187781
|
+
} finally {
|
|
187782
|
+
target.persisted.exclusive = false;
|
|
187783
|
+
updateRecordReeditCandidate(target, (current) => current.busy ? {
|
|
187784
|
+
...current,
|
|
187785
|
+
busy: false
|
|
187786
|
+
} : current);
|
|
187787
|
+
}
|
|
187788
|
+
}, [
|
|
187789
|
+
persistRecordReeditDraft,
|
|
187790
|
+
source,
|
|
187791
|
+
reeditSubmissions.accepted,
|
|
187792
|
+
updateRecordReeditCandidate
|
|
187793
|
+
]);
|
|
187794
|
+
const recoverRecordReedit = (0, react.useCallback)(async () => {
|
|
187795
|
+
const target = recordReeditComposerRef.current;
|
|
187796
|
+
if (target === void 0 || target.busy || !target.recoveryConfirmation || preparationJobs.current.has(arkmeRecordReeditPreparationKey(target)) || target.persisted.exclusive) return;
|
|
187797
|
+
const sameTarget = () => {
|
|
187798
|
+
const selected = arkmeUi.getSnapshot().selectedSource;
|
|
187799
|
+
return selected !== void 0 && arkmeSourceIdentityKey(selected) === target.sourceKey && arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth) === target.accountKey && sameArkmeRecordReeditSession(recordReeditComposerRef.current, target) && recordReeditGenerationRef.current === target.generation;
|
|
187800
|
+
};
|
|
187801
|
+
if (!sameTarget()) return;
|
|
187802
|
+
target.persisted.exclusive = true;
|
|
187803
|
+
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
187804
|
+
...current,
|
|
187805
|
+
busy: true,
|
|
187806
|
+
error: ""
|
|
187807
|
+
} : current);
|
|
187808
|
+
try {
|
|
187809
|
+
await target.persisted.saveTail;
|
|
187810
|
+
if (!sameTarget()) return;
|
|
187811
|
+
let snapshot = await callArkme("source.record-reedit.detail", {
|
|
187812
|
+
sourceRef: target.sourceRef,
|
|
187813
|
+
itemUid: target.item.itemUid
|
|
187814
|
+
});
|
|
187815
|
+
if (!sameTarget()) return;
|
|
187816
|
+
const draftChanged = (snapshot.draft?.draftRevision ?? 0) !== target.persisted.draftRevision;
|
|
187817
|
+
if (target.conflict !== "draft" && !draftChanged && snapshot.draft !== void 0) {
|
|
187818
|
+
await callArkme("source.record-reedit.draft.delete", {
|
|
187819
|
+
sourceRef: target.sourceRef,
|
|
187820
|
+
itemUid: target.item.itemUid,
|
|
187821
|
+
expectedDraftRevision: target.persisted.draftRevision
|
|
187822
|
+
});
|
|
187823
|
+
if (!sameTarget()) return;
|
|
187824
|
+
snapshot = await callArkme("source.record-reedit.detail", {
|
|
187825
|
+
sourceRef: target.sourceRef,
|
|
187826
|
+
itemUid: target.item.itemUid
|
|
187827
|
+
});
|
|
187828
|
+
}
|
|
187829
|
+
if (!sameTarget()) return;
|
|
187830
|
+
const title = snapshot.draft?.title ?? snapshot.title;
|
|
187831
|
+
const textContent = snapshot.draft?.textContent ?? snapshot.textContent;
|
|
187832
|
+
const attachments = snapshot.draft?.attachments ?? snapshot.attachments ?? [];
|
|
186779
187833
|
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
186780
187834
|
...current,
|
|
187835
|
+
snapshot,
|
|
187836
|
+
title,
|
|
187837
|
+
textContent,
|
|
187838
|
+
attachments,
|
|
187839
|
+
persisted: {
|
|
187840
|
+
candidateKey: arkmeRecordReeditCandidateKey(title, textContent, attachments, snapshot.textFormat ?? current.item.textFormat),
|
|
187841
|
+
draftRevision: snapshot.draft?.draftRevision ?? 0,
|
|
187842
|
+
saveTail: Promise.resolve()
|
|
187843
|
+
},
|
|
186781
187844
|
busy: false,
|
|
186782
|
-
|
|
187845
|
+
conflict: void 0,
|
|
187846
|
+
recoveryConfirmation: false,
|
|
187847
|
+
error: draftChanged ? "已重新载入其他入口更新的草稿,请检查后再决定是否放弃" : ""
|
|
187848
|
+
} : current);
|
|
187849
|
+
setDraftPreview(void 0);
|
|
187850
|
+
} catch (caught) {
|
|
187851
|
+
if (sameTarget()) setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
187852
|
+
...current,
|
|
187853
|
+
busy: false,
|
|
187854
|
+
...arkmeRecordReeditFailure(caught)
|
|
186783
187855
|
} : current);
|
|
186784
187856
|
} finally {
|
|
186785
|
-
|
|
187857
|
+
target.persisted.exclusive = false;
|
|
187858
|
+
updateRecordReeditCandidate(target, (current) => current.busy ? {
|
|
187859
|
+
...current,
|
|
187860
|
+
busy: false
|
|
187861
|
+
} : current);
|
|
186786
187862
|
}
|
|
186787
|
-
}, [
|
|
187863
|
+
}, [updateRecordReeditCandidate]);
|
|
186788
187864
|
const openRecordReedit = (0, react.useCallback)(async (item) => {
|
|
186789
187865
|
closeMessageMenu();
|
|
186790
187866
|
if (source === void 0 || !arkmeCanReeditTimelineMessage(item)) return;
|
|
187867
|
+
const submission = reeditSubmissions.jobs.find((job) => job.itemUid === item.itemUid);
|
|
187868
|
+
if (submission && [
|
|
187869
|
+
"pending",
|
|
187870
|
+
"committing",
|
|
187871
|
+
"uncertain"
|
|
187872
|
+
].includes(submission.state)) {
|
|
187873
|
+
showMessageActionStatus("这条快记仍在保存或核对,请稍后再编辑;其他消息不受影响");
|
|
187874
|
+
return;
|
|
187875
|
+
}
|
|
186791
187876
|
const previous = recordReeditComposerRef.current;
|
|
186792
187877
|
if (previous !== void 0) {
|
|
186793
|
-
if (previous.
|
|
186794
|
-
if (previous.sourceRef === source.sourceRef && previous.item.itemUid === item.itemUid) {
|
|
187878
|
+
if (previous.accountKey === authenticatedAccountKey && previous.sourceKey === arkmeSourceIdentityKey(source) && previous.item.itemUid === item.itemUid) {
|
|
186795
187879
|
requestAnimationFrame(() => {
|
|
186796
187880
|
textareaRef.current?.focus();
|
|
186797
187881
|
});
|
|
186798
187882
|
return;
|
|
186799
187883
|
}
|
|
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;
|
|
187884
|
+
persistRecordReeditBeforeContextExit(previous, () => true);
|
|
186816
187885
|
}
|
|
186817
187886
|
const generation = ++recordReeditGenerationRef.current;
|
|
186818
|
-
const
|
|
187887
|
+
const retained = findRecordReeditCandidate({
|
|
187888
|
+
accountKey: authenticatedAccountKey,
|
|
187889
|
+
sourceKey: arkmeSourceIdentityKey(source),
|
|
187890
|
+
sourceRef: source.sourceRef
|
|
187891
|
+
}, item.itemUid);
|
|
187892
|
+
const target = retained === void 0 ? {
|
|
186819
187893
|
generation,
|
|
187894
|
+
accountKey: authenticatedAccountKey,
|
|
187895
|
+
sourceKey: arkmeSourceIdentityKey(source),
|
|
186820
187896
|
sourceRef: source.sourceRef,
|
|
186821
187897
|
item,
|
|
186822
187898
|
snapshot: void 0,
|
|
186823
187899
|
title: item.title,
|
|
186824
187900
|
textContent: item.textContent,
|
|
186825
|
-
|
|
187901
|
+
attachments: [],
|
|
187902
|
+
persisted: {
|
|
187903
|
+
candidateKey: arkmeRecordReeditCandidateKey(item.title, item.textContent, [], item.textFormat),
|
|
187904
|
+
draftRevision: 0,
|
|
187905
|
+
saveTail: Promise.resolve()
|
|
187906
|
+
},
|
|
186826
187907
|
loading: true,
|
|
186827
187908
|
busy: false,
|
|
186828
187909
|
error: ""
|
|
187910
|
+
} : {
|
|
187911
|
+
...retained,
|
|
187912
|
+
generation
|
|
186829
187913
|
};
|
|
186830
187914
|
setComposerExtensionTarget(void 0);
|
|
186831
187915
|
setAddMenuOpen(false);
|
|
@@ -186836,6 +187920,12 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186836
187920
|
setDraftPreview(void 0);
|
|
186837
187921
|
setDrawer(void 0);
|
|
186838
187922
|
setRecordReeditComposer(target);
|
|
187923
|
+
if (retained !== void 0) {
|
|
187924
|
+
requestAnimationFrame(() => {
|
|
187925
|
+
textareaRef.current?.focus();
|
|
187926
|
+
});
|
|
187927
|
+
return;
|
|
187928
|
+
}
|
|
186839
187929
|
try {
|
|
186840
187930
|
const snapshot = await callArkme("source.record-reedit.detail", {
|
|
186841
187931
|
sourceRef: source.sourceRef,
|
|
@@ -186844,12 +187934,18 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186844
187934
|
if (recordReeditGenerationRef.current !== generation) return;
|
|
186845
187935
|
const title = snapshot.draft?.title ?? snapshot.title;
|
|
186846
187936
|
const textContent = snapshot.draft?.textContent ?? snapshot.textContent;
|
|
187937
|
+
const attachments = snapshot.draft?.attachments ?? snapshot.attachments ?? [];
|
|
186847
187938
|
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
|
|
186848
187939
|
...current,
|
|
186849
187940
|
snapshot,
|
|
186850
187941
|
title,
|
|
186851
187942
|
textContent,
|
|
186852
|
-
|
|
187943
|
+
attachments,
|
|
187944
|
+
persisted: {
|
|
187945
|
+
candidateKey: arkmeRecordReeditCandidateKey(title, textContent, attachments, snapshot.textFormat ?? item.textFormat),
|
|
187946
|
+
draftRevision: snapshot.draft?.draftRevision ?? 0,
|
|
187947
|
+
saveTail: Promise.resolve()
|
|
187948
|
+
},
|
|
186853
187949
|
loading: false
|
|
186854
187950
|
} : current);
|
|
186855
187951
|
if (snapshot.draft !== void 0) showMessageActionStatus("已恢复本机重新编辑草稿");
|
|
@@ -186865,10 +187961,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
186865
187961
|
} : current);
|
|
186866
187962
|
}
|
|
186867
187963
|
}, [
|
|
187964
|
+
authenticatedAccountKey,
|
|
186868
187965
|
closeMessageMenu,
|
|
186869
|
-
|
|
187966
|
+
persistRecordReeditBeforeContextExit,
|
|
187967
|
+
findRecordReeditCandidate,
|
|
186870
187968
|
showMessageActionStatus,
|
|
186871
|
-
source
|
|
187969
|
+
source,
|
|
187970
|
+
reeditSubmissions.jobs
|
|
186872
187971
|
]);
|
|
186873
187972
|
const closeMessageSnapshot = (0, react.useCallback)(() => {
|
|
186874
187973
|
snapshotRequestRef.current?.abort();
|
|
@@ -187189,7 +188288,11 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187189
188288
|
const openForwardTargetPicker = (0, react.useCallback)((itemsToForward = selectedMessageItems) => {
|
|
187190
188289
|
if (!activeConversationRef.current) return;
|
|
187191
188290
|
closeMessageMenu();
|
|
187192
|
-
const
|
|
188291
|
+
const savedItems = itemsToForward.map((item) => {
|
|
188292
|
+
const saved = items.find((value) => arkmeTimelineOccurrenceKey(value) === arkmeTimelineOccurrenceKey(item));
|
|
188293
|
+
return saved && projectRecordReedit(saved, reeditSubmissions.jobs) !== saved ? saved : item;
|
|
188294
|
+
});
|
|
188295
|
+
const forwardableItems = savedItems.filter((item) => arkmeTimelineMessageActionRef(item) !== "");
|
|
187193
188296
|
if (source === void 0 || forwardableItems.length === 0) {
|
|
187194
188297
|
showMessageActionStatus("请选择要转发的快记");
|
|
187195
188298
|
return;
|
|
@@ -187198,6 +188301,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187198
188301
|
showMessageActionStatus("最多选择 100 条快记");
|
|
187199
188302
|
return;
|
|
187200
188303
|
}
|
|
188304
|
+
if (savedItems.some((saved, index) => saved !== itemsToForward[index])) showMessageActionStatus("转发使用已保存内容,请核对预览;尚未同步的编辑不参与转发");
|
|
187201
188305
|
const initialTargets = arkmeForwardableTargetSources(arkmeChatDirectory.getSnapshot().sources, selfSources, aggregateSource);
|
|
187202
188306
|
const sourceKey = conversationKey;
|
|
187203
188307
|
setForwardTargetPicker({
|
|
@@ -187250,19 +188354,27 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187250
188354
|
aggregateSource,
|
|
187251
188355
|
closeMessageMenu,
|
|
187252
188356
|
conversationKey,
|
|
188357
|
+
items,
|
|
188358
|
+
reeditSubmissions.jobs,
|
|
187253
188359
|
selectedMessageItems,
|
|
187254
188360
|
selfSources,
|
|
187255
188361
|
showMessageActionStatus,
|
|
187256
188362
|
source
|
|
187257
188363
|
]);
|
|
187258
|
-
const toggleForwardTarget = (0, react.useCallback)((target) => {
|
|
188364
|
+
const toggleForwardTarget = (0, react.useCallback)(async (target) => {
|
|
187259
188365
|
if (forwardTargetPicker === void 0 || messageActionBusy === "forward") return;
|
|
187260
188366
|
const selected = forwardTargetPicker.selectedSourceRefs.includes(target.sourceRef);
|
|
188367
|
+
if (!selected && target.directMessageAdmissionApplicable === true) try {
|
|
188368
|
+
await requireDirectMessageSendAllowed(target);
|
|
188369
|
+
} catch (error) {
|
|
188370
|
+
showMessageActionStatus(errorMessage$2(error));
|
|
188371
|
+
return;
|
|
188372
|
+
}
|
|
187261
188373
|
if (!selected && forwardTargetPicker.selectedSourceRefs.length >= MAX_FORWARD_TARGET_SELECTION) {
|
|
187262
188374
|
showMessageActionStatus(`最多选择 ${String(MAX_FORWARD_TARGET_SELECTION)} 个转发对象`);
|
|
187263
188375
|
return;
|
|
187264
188376
|
}
|
|
187265
|
-
setForwardTargetPicker({
|
|
188377
|
+
setForwardTargetPicker((current) => current !== forwardTargetPicker ? current : {
|
|
187266
188378
|
...forwardTargetPicker,
|
|
187267
188379
|
selectedSourceRefs: selected ? forwardTargetPicker.selectedSourceRefs.filter((sourceRef) => sourceRef !== target.sourceRef) : [...forwardTargetPicker.selectedSourceRefs, target.sourceRef]
|
|
187268
188380
|
});
|
|
@@ -187290,17 +188402,20 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187290
188402
|
sendError: ""
|
|
187291
188403
|
});
|
|
187292
188404
|
try {
|
|
187293
|
-
const results = await Promise.allSettled(targetSources.map(async (targetSource) =>
|
|
187294
|
-
targetSource,
|
|
187295
|
-
|
|
187296
|
-
|
|
187297
|
-
|
|
187298
|
-
|
|
187299
|
-
|
|
187300
|
-
|
|
187301
|
-
|
|
187302
|
-
|
|
187303
|
-
|
|
188405
|
+
const results = await Promise.allSettled(targetSources.map(async (targetSource) => {
|
|
188406
|
+
await requireDirectMessageSendAllowed(targetSource, controller.signal);
|
|
188407
|
+
return {
|
|
188408
|
+
targetSource,
|
|
188409
|
+
result: await callArkme("source.forward-messages", {
|
|
188410
|
+
sourceRef,
|
|
188411
|
+
targetSourceRef: targetSource.sourceRef,
|
|
188412
|
+
actionRefs,
|
|
188413
|
+
recordUid: crypto.randomUUID(),
|
|
188414
|
+
relationUid: crypto.randomUUID(),
|
|
188415
|
+
...normalizedCommentText === "" ? {} : { commentText: normalizedCommentText }
|
|
188416
|
+
}, controller.signal)
|
|
188417
|
+
};
|
|
188418
|
+
}));
|
|
187304
188419
|
if (activeSourceKeyRef.current !== sourceKey) return;
|
|
187305
188420
|
let successCount = 0;
|
|
187306
188421
|
let failureCount = 0;
|
|
@@ -187436,7 +188551,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187436
188551
|
const utilityContentVisible = authView === "content" && (ui.mode === "recordings" || ui.mode === "world" || ui.mode === "search" || ui.mode === "extensions" || ui.mode === "voiceprint" || ui.mode === "calls");
|
|
187437
188552
|
const conversationOverlayHost = panelRef.current;
|
|
187438
188553
|
const composerPlaceholder = arkmeComposerPlaceholderText(arkmeComposerPlaceholderTargetForSource(selectedSource, conversationMembers.length));
|
|
187439
|
-
const effectiveComposerPlaceholder = activeRecordReeditComposer !== void 0 ? activeRecordReeditComposer.loading ? "正在读取快记和草稿…" : "重新编辑快记…" : activeComposerExtensionTarget === void 0 ? composerPlaceholder : `发送到「${source?.displayName ?? ""}」…`;
|
|
188554
|
+
const effectiveComposerPlaceholder = activeRecordReeditComposer !== void 0 ? activeRecordReeditComposer.loading ? "正在读取快记和草稿…" : "重新编辑快记…" : directAdmission.blocked ? directAdmission.message : activeComposerExtensionTarget === void 0 ? composerPlaceholder : `发送到「${source?.displayName ?? ""}」…`;
|
|
187440
188555
|
const activeComposerTargetItem = activeRecordReeditComposer === void 0 ? activeComposerExtensionTarget?.item : {
|
|
187441
188556
|
...activeRecordReeditComposer.item,
|
|
187442
188557
|
title: activeRecordReeditComposer.snapshot?.title ?? activeRecordReeditComposer.item.title,
|
|
@@ -187718,81 +188833,119 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187718
188833
|
onMouseDown: (event) => {
|
|
187719
188834
|
event.stopPropagation();
|
|
187720
188835
|
},
|
|
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
|
-
|
|
188836
|
+
children: [
|
|
188837
|
+
shouldShowRelatedRecordingsEntry(authenticated, source?.kind, relatedEligibility, relatedPanelOpen) ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
188838
|
+
type: "button",
|
|
188839
|
+
role: "menuitem",
|
|
188840
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
|
|
188841
|
+
onMouseEnter: (event) => {
|
|
188842
|
+
event.currentTarget.style.background = arkmeTheme.subtle;
|
|
188843
|
+
},
|
|
188844
|
+
onMouseLeave: (event) => {
|
|
188845
|
+
event.currentTarget.style.background = "transparent";
|
|
188846
|
+
},
|
|
188847
|
+
onClick: openRelatedPanel,
|
|
188848
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$7, {
|
|
188849
|
+
size: 20,
|
|
188850
|
+
"aria-hidden": true
|
|
188851
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "相关录音" })]
|
|
188852
|
+
}) : relatedEligibility === "error" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
188853
|
+
type: "button",
|
|
188854
|
+
role: "menuitem",
|
|
188855
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
|
|
188856
|
+
onMouseEnter: (event) => {
|
|
188857
|
+
event.currentTarget.style.background = arkmeTheme.subtle;
|
|
188858
|
+
},
|
|
188859
|
+
onMouseLeave: (event) => {
|
|
188860
|
+
event.currentTarget.style.background = "transparent";
|
|
188861
|
+
},
|
|
188862
|
+
onClick: ensureRelatedEligibility,
|
|
188863
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$7, {
|
|
188864
|
+
size: 20,
|
|
188865
|
+
"aria-hidden": true
|
|
188866
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "重新检查相关录音" })]
|
|
188867
|
+
}) : relatedEligibility === "denied" && (canManageUserBan || directAdmission.applicable) ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
188868
|
+
role: "status",
|
|
188869
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_STATUS_STYLE,
|
|
188870
|
+
children: relatedEligibility === "denied" ? "当前没有可用操作" : "正在检查相关录音…"
|
|
188871
|
+
}),
|
|
188872
|
+
directAdmission.applicable && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
188873
|
+
type: "button",
|
|
188874
|
+
role: "menuitemcheckbox",
|
|
188875
|
+
"aria-checked": directAdmission.admission === void 0 ? "mixed" : directAdmission.admission.ownRefused,
|
|
188876
|
+
"aria-busy": directAdmission.busy,
|
|
188877
|
+
title: directAdmission.error || void 0,
|
|
188878
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
|
|
188879
|
+
disabled: directAdmission.busy || directAdmission.admission !== void 0 && !directAdmission.admission.ownRefused && !directAdmission.admission.refusalCreationEnabled,
|
|
188880
|
+
onMouseEnter: (event) => {
|
|
188881
|
+
event.currentTarget.style.background = arkmeTheme.subtle;
|
|
188882
|
+
},
|
|
188883
|
+
onMouseLeave: (event) => {
|
|
188884
|
+
event.currentTarget.style.background = "transparent";
|
|
188885
|
+
},
|
|
188886
|
+
onClick: () => {
|
|
188887
|
+
directAdmission.toggle(() => window.confirm("拒收对方消息?\n拒收后你们都无法发送新消息;聊天记录保留,你可以随时解除拒收。"));
|
|
188888
|
+
},
|
|
188889
|
+
children: [
|
|
188890
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$5, {
|
|
188891
|
+
size: 20,
|
|
188892
|
+
"aria-hidden": true
|
|
188893
|
+
}),
|
|
188894
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "拒收对方消息" }),
|
|
188895
|
+
directAdmission.admission?.ownRefused === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$6, {
|
|
188896
|
+
size: 16,
|
|
188897
|
+
style: { marginLeft: "auto" },
|
|
188898
|
+
"aria-hidden": true
|
|
188899
|
+
})
|
|
188900
|
+
]
|
|
188901
|
+
}),
|
|
188902
|
+
directAdmission.applicable && directAdmission.error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
188903
|
+
role: "status",
|
|
188904
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_STATUS_STYLE,
|
|
188905
|
+
children: directAdmission.error
|
|
188906
|
+
}),
|
|
188907
|
+
canManageUserBan && userBanState === "ready" && userBanSnapshot !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
188908
|
+
type: "button",
|
|
188909
|
+
role: "menuitem",
|
|
188910
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
|
|
188911
|
+
disabled: userBanBusy,
|
|
188912
|
+
onMouseEnter: (event) => {
|
|
188913
|
+
event.currentTarget.style.background = arkmeTheme.subtle;
|
|
188914
|
+
},
|
|
188915
|
+
onMouseLeave: (event) => {
|
|
188916
|
+
event.currentTarget.style.background = "transparent";
|
|
188917
|
+
},
|
|
188918
|
+
onClick: () => {
|
|
188919
|
+
changeUserBanState();
|
|
188920
|
+
},
|
|
188921
|
+
children: [userBanSnapshot.banned ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$5, {
|
|
188922
|
+
size: 20,
|
|
188923
|
+
"aria-hidden": true
|
|
188924
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(m$5, {
|
|
188925
|
+
size: 20,
|
|
188926
|
+
"aria-hidden": true
|
|
188927
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: userBanSnapshot.banned ? "解封用户" : "封禁用户" })]
|
|
188928
|
+
}) : canManageUserBan && userBanState === "error" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
188929
|
+
type: "button",
|
|
188930
|
+
role: "menuitem",
|
|
188931
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
|
|
188932
|
+
onMouseEnter: (event) => {
|
|
188933
|
+
event.currentTarget.style.background = arkmeTheme.subtle;
|
|
188934
|
+
},
|
|
188935
|
+
onMouseLeave: (event) => {
|
|
188936
|
+
event.currentTarget.style.background = "transparent";
|
|
188937
|
+
},
|
|
188938
|
+
onClick: ensureUserBanStatus,
|
|
188939
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(m$5, {
|
|
188940
|
+
size: 20,
|
|
188941
|
+
"aria-hidden": true
|
|
188942
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "重新检查封禁状态" })]
|
|
188943
|
+
}) : canManageUserBan ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
188944
|
+
role: "status",
|
|
188945
|
+
style: ARKME_CONVERSATION_SETTINGS_MENU_STATUS_STYLE,
|
|
188946
|
+
children: "正在检查封禁状态…"
|
|
188947
|
+
}) : null
|
|
188948
|
+
]
|
|
187796
188949
|
})
|
|
187797
188950
|
}), conversationOverlayHost)
|
|
187798
188951
|
]
|
|
@@ -187910,7 +189063,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187910
189063
|
ref: bodyRef,
|
|
187911
189064
|
style: {
|
|
187912
189065
|
...styles$6.body,
|
|
187913
|
-
...displayRows.length === 0 ? {
|
|
189066
|
+
...displayRows.length === 0 && interwovenWindow.prelude.length === 0 ? {
|
|
187914
189067
|
display: "flex",
|
|
187915
189068
|
flexDirection: "column"
|
|
187916
189069
|
} : {},
|
|
@@ -187922,13 +189075,28 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
187922
189075
|
style: styles$6.error,
|
|
187923
189076
|
children: error
|
|
187924
189077
|
}),
|
|
189078
|
+
interwovenWindow.prelude.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeInterwovenPrelude, {
|
|
189079
|
+
moments: interwovenWindow.prelude,
|
|
189080
|
+
onOpen: openMomentDetail
|
|
189081
|
+
}, conversationKey),
|
|
187925
189082
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
187926
189083
|
ref: sentinelRef,
|
|
187927
189084
|
style: styles$6.sentinel
|
|
187928
189085
|
}),
|
|
187929
|
-
|
|
189086
|
+
hasMore && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
187930
189087
|
style: styles$6.loading,
|
|
187931
|
-
children: "
|
|
189088
|
+
children: [(olderLoadError !== "" || nextCursor === void 0) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
189089
|
+
role: "alert",
|
|
189090
|
+
children: olderLoadError || "暂时无法继续加载,请刷新会话后重试"
|
|
189091
|
+
}), nextCursor !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
189092
|
+
type: "button",
|
|
189093
|
+
style: styles$6.retry,
|
|
189094
|
+
disabled: loadingOlder,
|
|
189095
|
+
onClick: () => {
|
|
189096
|
+
loadOlderHistory();
|
|
189097
|
+
},
|
|
189098
|
+
children: loadingOlder ? "正在加载更早内容…" : olderLoadError === "" ? "继续加载更早消息" : "重试加载更早消息"
|
|
189099
|
+
})]
|
|
187932
189100
|
}),
|
|
187933
189101
|
timelineSkeletonKey === conversationKey && displayRows.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
187934
189102
|
role: "status",
|
|
@@ -188108,6 +189276,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188108
189276
|
}),
|
|
188109
189277
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeMessageContent, {
|
|
188110
189278
|
item,
|
|
189279
|
+
mediaSelectionIsExplicit: reeditItems.has(item),
|
|
188111
189280
|
sourceRef: source.sourceRef,
|
|
188112
189281
|
highlightMentions: true,
|
|
188113
189282
|
shareWebsite,
|
|
@@ -188129,6 +189298,32 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188129
189298
|
}
|
|
188130
189299
|
}, `message-content:${conversationOverlayKey}`),
|
|
188131
189300
|
!isSharedRecordingCard && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeTimelineAgentSourceBadge, { item }),
|
|
189301
|
+
reeditSubmissions.jobs.filter((job) => job.itemUid === item.itemUid && (job.state === "failed" || job.state === "uncertain")).map((job) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
189302
|
+
role: "status",
|
|
189303
|
+
"aria-label": "重新编辑保存状态",
|
|
189304
|
+
style: styles$6.polishMeta,
|
|
189305
|
+
children: [
|
|
189306
|
+
job.state === "failed" ? `保存失败:${job.error ?? "请恢复编辑后重试"}` : "保存结果待确认",
|
|
189307
|
+
job.state === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
189308
|
+
type: "button",
|
|
189309
|
+
style: styles$6.retry,
|
|
189310
|
+
onClick: (event) => {
|
|
189311
|
+
event.stopPropagation();
|
|
189312
|
+
openRecordReedit(item);
|
|
189313
|
+
},
|
|
189314
|
+
children: "恢复编辑"
|
|
189315
|
+
}),
|
|
189316
|
+
job.state === "uncertain" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
189317
|
+
type: "button",
|
|
189318
|
+
style: styles$6.retry,
|
|
189319
|
+
onClick: (event) => {
|
|
189320
|
+
event.stopPropagation();
|
|
189321
|
+
reeditSubmissions.refresh(true).catch((caught) => setError(errorMessage$2(caught)));
|
|
189322
|
+
},
|
|
189323
|
+
children: "核对结果"
|
|
189324
|
+
})
|
|
189325
|
+
]
|
|
189326
|
+
}, job.submissionId)),
|
|
188132
189327
|
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
189328
|
role: "status",
|
|
188134
189329
|
style: {
|
|
@@ -188137,7 +189332,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188137
189332
|
},
|
|
188138
189333
|
children: [
|
|
188139
189334
|
task.error ?? (task.state === "sending" ? "正在发送…" : task.state === "queued" ? "等待上传" : "正在上传"),
|
|
188140
|
-
task.state === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
189335
|
+
task.state === "failed" && task.retryable !== false && !directAdmission.blocked && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
188141
189336
|
type: "button",
|
|
188142
189337
|
onClick: (event) => {
|
|
188143
189338
|
event.stopPropagation();
|
|
@@ -188385,13 +189580,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188385
189580
|
className: "arkme-conversation-composer",
|
|
188386
189581
|
style: styles$6.composer,
|
|
188387
189582
|
onDragOver: (event) => {
|
|
188388
|
-
if (!
|
|
189583
|
+
if (!composerFileAddingDisabled && Array.from(event.dataTransfer.types).includes("Files")) {
|
|
188389
189584
|
event.preventDefault();
|
|
188390
189585
|
event.dataTransfer.dropEffect = "copy";
|
|
188391
189586
|
}
|
|
188392
189587
|
},
|
|
188393
189588
|
onDrop: (event) => {
|
|
188394
|
-
if (!
|
|
189589
|
+
if (!composerFileAddingDisabled && event.dataTransfer.files.length > 0) {
|
|
188395
189590
|
event.preventDefault();
|
|
188396
189591
|
selectFiles(event.dataTransfer.files);
|
|
188397
189592
|
}
|
|
@@ -188421,6 +189616,34 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188421
189616
|
style: styles$6.error,
|
|
188422
189617
|
children: activeRecordReeditComposer.error
|
|
188423
189618
|
}),
|
|
189619
|
+
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", {
|
|
189620
|
+
type: "button",
|
|
189621
|
+
style: styles$6.retry,
|
|
189622
|
+
disabled: composerFilesDisabled,
|
|
189623
|
+
"aria-label": activeRecordReeditComposer.conflict === "draft" ? "重新载入草稿" : "放弃草稿并重新载入",
|
|
189624
|
+
onClick: () => setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, activeRecordReeditComposer) ? {
|
|
189625
|
+
...current,
|
|
189626
|
+
recoveryConfirmation: true
|
|
189627
|
+
} : current),
|
|
189628
|
+
children: activeRecordReeditComposer.conflict === "draft" ? "重新载入草稿" : "放弃草稿并重新载入"
|
|
189629
|
+
}),
|
|
189630
|
+
activeRecordReeditComposer?.recoveryConfirmation && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeConfirmDialog, {
|
|
189631
|
+
titleId: "arkme-reedit-recovery-title",
|
|
189632
|
+
title: activeRecordReeditComposer.conflict === "draft" ? "重新载入最新草稿?" : "放弃草稿并重新载入?",
|
|
189633
|
+
description: activeRecordReeditComposer.conflict === "draft" ? "当前输入区将替换为其他入口保存的最新草稿。不会删除草稿或修改已保存的快记。" : "本机这份重新编辑草稿中的正文和附件改动将被放弃,重新载入已保存的快记。此操作不会删除线上附件。",
|
|
189634
|
+
busy: activeRecordReeditComposer.busy,
|
|
189635
|
+
error: activeRecordReeditComposer.error,
|
|
189636
|
+
confirmTone: activeRecordReeditComposer.conflict === "draft" ? "primary" : "danger",
|
|
189637
|
+
confirmLabel: activeRecordReeditComposer.conflict === "draft" ? "重新载入" : "放弃并重新载入",
|
|
189638
|
+
busyLabel: "正在重新载入…",
|
|
189639
|
+
onClose: () => setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, activeRecordReeditComposer) && !current.busy ? {
|
|
189640
|
+
...current,
|
|
189641
|
+
recoveryConfirmation: false
|
|
189642
|
+
} : current),
|
|
189643
|
+
onConfirm: () => {
|
|
189644
|
+
recoverRecordReedit();
|
|
189645
|
+
}
|
|
189646
|
+
}),
|
|
188424
189647
|
activeComposerTargetItem !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
188425
189648
|
style: styles$6.composerExtensionTarget,
|
|
188426
189649
|
...activeRecordReeditComposer === void 0 ? { "data-arkme-composer-extension-target": "true" } : { "data-arkme-composer-reedit-target": "true" },
|
|
@@ -188458,7 +189681,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188458
189681
|
type: "button",
|
|
188459
189682
|
style: styles$6.composerExtensionTargetCancel,
|
|
188460
189683
|
"aria-label": activeRecordReeditComposer === void 0 ? "取消延展" : "关闭重新编辑",
|
|
188461
|
-
disabled: activeRecordReeditComposer?.busy === true,
|
|
189684
|
+
disabled: activeRecordReeditComposer?.busy === true || preparingReeditFiles,
|
|
188462
189685
|
onClick: () => {
|
|
188463
189686
|
if (activeRecordReeditComposer === void 0) {
|
|
188464
189687
|
setComposerExtensionTarget(void 0);
|
|
@@ -188488,35 +189711,31 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188488
189711
|
ref: addMenuRef,
|
|
188489
189712
|
style: styles$6.addMenu,
|
|
188490
189713
|
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
|
-
]
|
|
189714
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
189715
|
+
type: "button",
|
|
189716
|
+
role: "menuitem",
|
|
189717
|
+
style: styles$6.addMenuItem,
|
|
189718
|
+
onClick: () => {
|
|
189719
|
+
setAddMenuOpen(false);
|
|
189720
|
+
fileInputRef.current?.click();
|
|
189721
|
+
},
|
|
189722
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
189723
|
+
"aria-hidden": true,
|
|
189724
|
+
children: "📎"
|
|
189725
|
+
}), "添加照片和文件"]
|
|
189726
|
+
}), 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", {
|
|
189727
|
+
type: "button",
|
|
189728
|
+
role: "menuitem",
|
|
189729
|
+
style: styles$6.addMenuItem,
|
|
189730
|
+
onClick: () => {
|
|
189731
|
+
setLongArticleCreating(true);
|
|
189732
|
+
setAddMenuOpen(false);
|
|
189733
|
+
},
|
|
189734
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
189735
|
+
"aria-hidden": true,
|
|
189736
|
+
children: "✎"
|
|
189737
|
+
}), "写长文"]
|
|
189738
|
+
})] })]
|
|
188520
189739
|
}),
|
|
188521
189740
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
188522
189741
|
ref: fileInputRef,
|
|
@@ -188530,21 +189749,61 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188530
189749
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
188531
189750
|
className: "arkme-conversation-input-card",
|
|
188532
189751
|
children: [
|
|
188533
|
-
|
|
188534
|
-
attachments,
|
|
188535
|
-
disabled:
|
|
188536
|
-
onMove: (from, to) =>
|
|
189752
|
+
visibleComposerAttachments.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeAttachmentStrip, {
|
|
189753
|
+
attachments: visibleComposerAttachments,
|
|
189754
|
+
disabled: composerFilesDisabled,
|
|
189755
|
+
onMove: (from, to) => {
|
|
189756
|
+
if (composerFilesDisabled) return;
|
|
189757
|
+
if (activeRecordReeditComposer === void 0) arkmeComposerDraftStore.moveAttachment(composerDraftKey, from, to);
|
|
189758
|
+
else setRecordReeditComposer((current) => {
|
|
189759
|
+
if (!sameArkmeRecordReeditSession(current, activeRecordReeditComposer)) return current;
|
|
189760
|
+
const next = [...current.attachments];
|
|
189761
|
+
const attachment = next[from];
|
|
189762
|
+
if (attachment === void 0 || to < 0 || to >= next.length) return current;
|
|
189763
|
+
next.splice(from, 1);
|
|
189764
|
+
next.splice(to, 0, attachment);
|
|
189765
|
+
return {
|
|
189766
|
+
...current,
|
|
189767
|
+
attachments: next,
|
|
189768
|
+
error: ""
|
|
189769
|
+
};
|
|
189770
|
+
});
|
|
189771
|
+
},
|
|
189772
|
+
canPreview: (attachment) => activeRecordReeditComposer === void 0 ? attachment.localFile !== void 0 : activeRecordReeditComposer.attachments.some((view) => arkmeAttachmentId(view) === arkmeAttachmentId(attachment) && arkmeRecordReeditAttachmentBlock(view) !== void 0),
|
|
188537
189773
|
onPreview: (attachment) => {
|
|
188538
|
-
if (
|
|
189774
|
+
if (activeRecordReeditComposer === void 0) {
|
|
189775
|
+
if (attachment.localFile !== void 0) setDraftPreview(localFileBlock(attachment.localFile));
|
|
189776
|
+
} else {
|
|
189777
|
+
const view = activeRecordReeditComposer.attachments.find((view) => arkmeAttachmentId(view) === arkmeAttachmentId(attachment));
|
|
189778
|
+
if (view !== void 0) setDraftPreview(arkmeRecordReeditAttachmentBlock(view));
|
|
189779
|
+
}
|
|
188539
189780
|
},
|
|
188540
189781
|
onRemove: (attachment) => {
|
|
189782
|
+
if (composerFilesDisabled) return;
|
|
189783
|
+
if (activeRecordReeditComposer !== void 0) {
|
|
189784
|
+
setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, activeRecordReeditComposer) ? {
|
|
189785
|
+
...current,
|
|
189786
|
+
attachments: current.attachments.filter((view) => arkmeAttachmentId(view) !== arkmeAttachmentId(attachment)),
|
|
189787
|
+
error: ""
|
|
189788
|
+
} : current);
|
|
189789
|
+
setDraftPreview(void 0);
|
|
189790
|
+
return;
|
|
189791
|
+
}
|
|
188541
189792
|
arkmeComposerDraftStore.removeAttachment(composerDraftKey, arkmeAttachmentId(attachment));
|
|
188542
189793
|
if (attachment.localFile !== void 0) callArkme("files.local.remove", { fileRef: attachment.localFile.fileRef }).catch((caught) => setError(errorMessage$2(caught)));
|
|
188543
189794
|
}
|
|
188544
189795
|
}),
|
|
189796
|
+
activeRecordReeditComposer?.attachments.some((attachment) => attachment.unavailable) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
189797
|
+
role: "status",
|
|
189798
|
+
style: styles$6.error,
|
|
189799
|
+
children: "部分附件不可用,请移除后重新添加"
|
|
189800
|
+
}),
|
|
188545
189801
|
activeConversation && draftPreview !== void 0 && typeof document !== "undefined" && (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeMediaPreview, {
|
|
188546
189802
|
selected: draftPreview,
|
|
188547
|
-
blocks: attachments.flatMap((attachment) => attachment.localFile === void 0 ? [] : [localFileBlock(attachment.localFile)])
|
|
189803
|
+
blocks: activeRecordReeditComposer === void 0 ? attachments.flatMap((attachment) => attachment.localFile === void 0 ? [] : [localFileBlock(attachment.localFile)]) : activeRecordReeditComposer.attachments.flatMap((attachment) => {
|
|
189804
|
+
const block = arkmeRecordReeditAttachmentBlock(attachment);
|
|
189805
|
+
return block === void 0 ? [] : [block];
|
|
189806
|
+
}),
|
|
188548
189807
|
onSelect: setDraftPreview,
|
|
188549
189808
|
onClose: () => setDraftPreview(void 0),
|
|
188550
189809
|
openLocalFile: false
|
|
@@ -188666,10 +189925,10 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188666
189925
|
maxLength: activeRecordReeditComposer?.snapshot?.maxTextLength ?? 2e4,
|
|
188667
189926
|
placeholder: effectiveComposerPlaceholder,
|
|
188668
189927
|
ariaLabel: activeRecordReeditComposer === void 0 ? effectiveComposerPlaceholder : "重新编辑快记",
|
|
188669
|
-
disabled:
|
|
188670
|
-
markdown: activeRecordReeditComposer === void 0 ? composerDraft.markdown : void 0,
|
|
189928
|
+
disabled: composerFilesDisabled,
|
|
189929
|
+
markdown: activeRecordReeditComposer === void 0 && !directAdmission.blocked ? composerDraft.markdown : void 0,
|
|
188671
189930
|
onMarkdownChange: (markdown, text, mentions, emojis) => {
|
|
188672
|
-
if (activeRecordReeditComposer === void 0) arkmeComposerDraftStore.setMarkdown(composerDraftKey, markdown, text, mentions, emojis);
|
|
189931
|
+
if (activeRecordReeditComposer === void 0 && !directAdmission.blocked) arkmeComposerDraftStore.setMarkdown(composerDraftKey, markdown, text, mentions, emojis);
|
|
188673
189932
|
},
|
|
188674
189933
|
onTextChange: updateComposerText,
|
|
188675
189934
|
onInputActivity: messagePreparing.input,
|
|
@@ -188683,7 +189942,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188683
189942
|
},
|
|
188684
189943
|
onSelectionChange: updateComposerRichTrigger,
|
|
188685
189944
|
onPaste: (event) => {
|
|
188686
|
-
if (
|
|
189945
|
+
if (composerFileAddingDisabled) return;
|
|
188687
189946
|
const files = arkmeClipboardFiles(event.clipboardData);
|
|
188688
189947
|
if (files.length === 0) return;
|
|
188689
189948
|
event.preventDefault();
|
|
@@ -188764,13 +190023,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
188764
190023
|
"aria-label": "添加内容",
|
|
188765
190024
|
"aria-haspopup": "menu",
|
|
188766
190025
|
"aria-expanded": addMenuOpen,
|
|
188767
|
-
disabled:
|
|
190026
|
+
disabled: composerFileAddingDisabled,
|
|
188768
190027
|
onClick: () => {
|
|
188769
190028
|
setAddMenuOpen((value) => !value);
|
|
188770
190029
|
},
|
|
188771
|
-
children: preparingFiles ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeFilePreparingIndicator, {}) : "+"
|
|
190030
|
+
children: (activeRecordReeditComposer === void 0 ? preparingFiles : preparingReeditFiles) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeFilePreparingIndicator, {}) : "+"
|
|
188772
190031
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeEmojiPicker, {
|
|
188773
|
-
disabled: preparingFiles || activeRecordReeditComposer !== void 0,
|
|
190032
|
+
disabled: preparingFiles || directAdmission.blocked || activeRecordReeditComposer !== void 0,
|
|
188774
190033
|
scopeKey: composerDraftKey,
|
|
188775
190034
|
...source?.kind === "private_chat" || source?.kind === "group_chat" ? { sourceRef: source.sourceRef } : {},
|
|
188776
190035
|
getCaretGeometry: () => textareaRef.current?.getCaretGeometry(),
|
|
@@ -189390,6 +190649,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
189390
190649
|
shareWebsite,
|
|
189391
190650
|
onMessageCopyLinkOpen: openMessageCopyLinkDetail,
|
|
189392
190651
|
onExtensionSent: acceptDetailExtension,
|
|
190652
|
+
messageCreationBlocked: directAdmission.blocked,
|
|
190653
|
+
messageCreationRestriction: directAdmission.blocked ? directAdmission.message : "",
|
|
189393
190654
|
onToast: showMessageActionStatus
|
|
189394
190655
|
}, detailItem.itemUid),
|
|
189395
190656
|
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 +192865,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
191604
192865
|
onClick: () => {
|
|
191605
192866
|
playback.toggle(item.segmentRef, mediaRef);
|
|
191606
192867
|
},
|
|
191607
|
-
children: controlState === "pause" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
192868
|
+
children: controlState === "pause" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, {
|
|
191608
192869
|
"aria-hidden": true,
|
|
191609
192870
|
"data-audio-state-icon": "pause",
|
|
191610
192871
|
size: 18,
|
|
@@ -191615,7 +192876,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
191615
192876
|
"data-audio-state-icon": "loading",
|
|
191616
192877
|
size: 18,
|
|
191617
192878
|
weight: "bold"
|
|
191618
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$
|
|
192879
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
|
|
191619
192880
|
"aria-hidden": true,
|
|
191620
192881
|
"data-audio-state-icon": controlState,
|
|
191621
192882
|
size: 18,
|
|
@@ -192295,6 +193556,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
192295
193556
|
if (stopped) return;
|
|
192296
193557
|
if (ownsMessagePreparing) arkmeMessagePreparing.reset();
|
|
192297
193558
|
reconcileReceipts();
|
|
193559
|
+
invalidateDirectMessageAdmission();
|
|
192298
193560
|
reconcileArkmeProviderInstance().then(async (changed) => {
|
|
192299
193561
|
if (!changed || stopped) return;
|
|
192300
193562
|
try {
|
|
@@ -192346,6 +193608,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
192346
193608
|
if (update.attentionSummary !== void 0) arkmeAttentionSummary.apply(update.attentionSummary);
|
|
192347
193609
|
arkmeInterwovenInvalidation.invalidate();
|
|
192348
193610
|
reconcileReceipts();
|
|
193611
|
+
invalidateDirectMessageAdmission();
|
|
192349
193612
|
if (update.refresh === "none") return;
|
|
192350
193613
|
refreshUnread(update.refresh === "force").then(() => {
|
|
192351
193614
|
if (stopped) return;
|
|
@@ -192367,6 +193630,10 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
192367
193630
|
return;
|
|
192368
193631
|
}
|
|
192369
193632
|
if (update.type === "projection-invalidated") {
|
|
193633
|
+
if (update.projection === "chat.direct_message_admission") {
|
|
193634
|
+
invalidateDirectMessageAdmission();
|
|
193635
|
+
return;
|
|
193636
|
+
}
|
|
192370
193637
|
if (update.projection !== "record") return;
|
|
192371
193638
|
arkmeInterwovenInvalidation.invalidate();
|
|
192372
193639
|
arkmeCalendarInvalidations.publishAll();
|
|
@@ -192383,6 +193650,18 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
192383
193650
|
arkmeCalendarInvalidations.publishAll();
|
|
192384
193651
|
return;
|
|
192385
193652
|
}
|
|
193653
|
+
if (update.type === "chat-pins-reconciled") {
|
|
193654
|
+
arkmeChatDirectory.reconcilePins(update.pins);
|
|
193655
|
+
return;
|
|
193656
|
+
}
|
|
193657
|
+
if (update.type === "chat-policy-invalidated") {
|
|
193658
|
+
arkmeChatDirectory.invalidateRoot();
|
|
193659
|
+
arkmeChatDirectory.refreshRoot({
|
|
193660
|
+
force: true,
|
|
193661
|
+
silent: true
|
|
193662
|
+
}).catch(() => void 0);
|
|
193663
|
+
return;
|
|
193664
|
+
}
|
|
192386
193665
|
if (update.type === "conversation-list-preference-invalidated") {
|
|
192387
193666
|
arkmeUi.chatChanged();
|
|
192388
193667
|
return;
|
|
@@ -193273,7 +194552,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
|
|
|
193273
194552
|
}
|
|
193274
194553
|
//#endregion
|
|
193275
194554
|
//#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";
|
|
194555
|
+
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-conversation-composer-inner[data-arkme-primary-composer=\"true\"] {\n --arkme-primary-composer-idle: #f6f6f6;\n --arkme-primary-composer-focused: #fff;\n background: var(--arkme-primary-composer-idle, #f6f6f6) !important;\n box-shadow: none !important;\n}\n\n.arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"][data-arkme-composer-focused=\"true\"] {\n background: var(--arkme-primary-composer-focused, #fff) !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-conversation-composer-inner[data-arkme-primary-composer=\"true\"] {\n --arkme-primary-composer-idle: #151515;\n --arkme-primary-composer-focused: #000;\n background: var(--arkme-primary-composer-idle, #f6f6f6) !important;\n box-shadow: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"][data-arkme-composer-focused=\"true\"] {\n background: var(--arkme-primary-composer-focused, #fff) !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
194556
|
//#endregion
|
|
193278
194557
|
//#region src/client/redesign/styles.ts
|
|
193279
194558
|
const REDESIGN_STYLE_ID = "@senguoyun/dsh-arkme/redesign";
|