@zaclinley/dsh-mailharbor 0.2.1 → 0.3.0
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/CHANGELOG.md +15 -0
- package/README.md +38 -21
- package/README.zh.md +31 -15
- package/lib/client.js +649 -80
- package/lib/client.js.map +3 -3
- package/lib/index.js +519 -64
- package/lib/index.js.map +4 -4
- package/package.json +3 -2
- package/scripts/migrate-legacy.mjs +2 -1
package/lib/client.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/client/index.tsx", "../src/client/styles.css", "../src/client/icon.tsx", "../src/client/api.ts", "../src/client/panel.tsx", "../src/client/account-form.tsx", "../src/client/components.tsx", "../src/client/composer.tsx", "../src/client/icons.tsx", "../src/client/reader.tsx", "../src/client/settings.tsx"],
|
|
4
|
-
"sourcesContent": ["import styles from './styles.css'\nimport { MailIcon } from './icon.js'\nimport { MailPanel } from './panel.js'\nimport { MailSettings } from './settings.js'\nimport type { ClientContext } from './dsh.js'\n\n/** Keep in sync with package.json (`npm run version` does this). */\nexport const VERSION = '0.2.1'\n\n/** Services required by this browser plugin. */\nexport const inject = ['slots']\n\nconst PANEL_ID = 'mailharbor'\nconst STYLE_ID = 'mailharbor-style'\n\nfunction ensureStyles(): void {\n if (document.getElementById(STYLE_ID) !== null) return\n const element = document.createElement('style')\n element.id = STYLE_ID\n element.textContent = styles\n document.head.append(element)\n}\n\n/**\n * MailHarbor browser half: a sidebar panel, the panel page in the main slot,\n * and a settings section. All three read the same same-origin HTTP API.\n */\nexport function apply(ctx: ClientContext): void {\n ensureStyles()\n ctx.slots.inject('main', () => ctx.slots.register({ name: 'main', key: PANEL_ID }, MailPanel))\n ctx.slots.inject('settings.section', () =>\n ctx.slots.register(\n {\n name: 'settings.section',\n id: PANEL_ID,\n order: 35,\n label: () => 'MailHarbor',\n },\n MailSettings,\n ),\n )\n ctx.slots.inject('sidebar.panellist', () =>\n ctx.slots.register(\n {\n name: 'sidebar.panellist',\n id: PANEL_ID,\n order: 20,\n label: 'MailHarbor',\n },\n MailIcon,\n ),\n )\n}\n\nexport { PANEL_ID }\n", "/* MailHarbor panel + settings.\n Tokens come from the DSH shell (dark by default); fallbacks match the\n default dark theme so the panel also renders in a bare host page.\n Component rules are all scoped under `.mailharbor` and the generic element\n reset lives in `:where()` so it cannot outrank a component class. */\n\n.mailharbor {\n --m-bg: var(--dsw-alias-bg-base, #151517);\n --m-bg-1: var(--dsw-alias-bg-layer-1, #232324);\n --m-bg-2: var(--dsw-alias-bg-layer-2, #2c2c2e);\n --m-bg-3: var(--dsw-alias-bg-layer-3, #353638);\n --m-line: var(--dsw-alias-border-l2, #ffffff1f);\n --m-line-soft: var(--dsw-alias-border-l1, #ffffff0f);\n --m-line-strong: var(--dsw-alias-border-l3, #ffffff29);\n --m-text: var(--dsw-alias-label-primary, #f9fafb);\n --m-text-2: var(--dsw-alias-label-secondary, #cfd3d6);\n --m-text-3: var(--dsw-alias-label-tertiary, #adb2b8);\n --m-caption: var(--dsw-alias-label-caption, #81858c);\n --m-accent: #5686fe;\n --m-accent-soft: rgba(86, 134, 254, 0.14);\n --m-primary-bg: var(--dsw-alias-brand-primary, #f9fafb);\n --m-primary-fg: var(--dsw-alias-label-primary-foreground, #0f1115);\n --m-hover: var(--dsw-alias-interactive-bg-hover, #ffffff14);\n --m-danger: #f25a5a;\n --m-ok: #3fbf7f;\n --m-warn: var(--dsw-alias-state-warn-label, #dd8629);\n --m-radius: 8px;\n --m-shadow: 0 18px 60px rgba(0, 0, 0, 0.5);\n\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--m-bg);\n color: var(--m-text);\n font-size: 13px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n}\n\n.mailharbor *,\n.mailharbor *::before,\n.mailharbor *::after {\n box-sizing: border-box;\n}\n\n/* ---------- base controls ---------- */\n\n.mailharbor :where(button) {\n font: inherit;\n color: inherit;\n background: transparent;\n border: 0;\n margin: 0;\n cursor: pointer;\n}\n\n.mailharbor button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 30px;\n padding: 0 12px;\n border-radius: var(--m-radius);\n border: 1px solid transparent;\n color: var(--m-text-2);\n font-size: 12.5px;\n font-weight: 500;\n white-space: nowrap;\n transition:\n background 120ms ease,\n color 120ms ease,\n border-color 120ms ease;\n}\n\n.mailharbor button:hover:not(:disabled) {\n background: var(--m-hover);\n color: var(--m-text);\n}\n\n.mailharbor button:disabled {\n opacity: 0.45;\n cursor: default;\n}\n\n.mailharbor button.primary {\n background: var(--m-primary-bg);\n color: var(--m-primary-fg);\n border-color: transparent;\n}\n\n.mailharbor button.primary:hover:not(:disabled) {\n background: var(--m-primary-bg);\n filter: brightness(0.94);\n color: var(--m-primary-fg);\n}\n\n.mailharbor button.ghost {\n border-color: var(--m-line);\n color: var(--m-text-2);\n}\n\n.mailharbor button.ghost:hover:not(:disabled) {\n border-color: var(--m-line-strong);\n color: var(--m-text);\n}\n\n.mailharbor button.subtle {\n color: var(--m-text-3);\n padding: 0 8px;\n}\n\n.mailharbor button.icon {\n width: 30px;\n padding: 0;\n}\n\n.mailharbor button.danger {\n color: var(--m-danger);\n}\n\n.mailharbor input,\n.mailharbor select,\n.mailharbor textarea {\n font: inherit;\n color: var(--m-text);\n background: var(--m-bg-1);\n border: 1px solid var(--m-line);\n border-radius: var(--m-radius);\n padding: 0 10px;\n height: 32px;\n min-width: 0;\n}\n\n.mailharbor textarea {\n height: auto;\n padding: 8px 10px;\n resize: vertical;\n line-height: 1.6;\n}\n\n.mailharbor select {\n padding-right: 26px;\n appearance: none;\n background-image:\n linear-gradient(45deg, transparent 50%, var(--m-text-3) 50%),\n linear-gradient(135deg, var(--m-text-3) 50%, transparent 50%);\n background-position:\n calc(100% - 15px) 14px,\n calc(100% - 10px) 14px;\n background-size:\n 5px 5px,\n 5px 5px;\n background-repeat: no-repeat;\n}\n\n.mailharbor ::placeholder {\n color: var(--m-caption);\n}\n\n.mailharbor input:focus-visible,\n.mailharbor select:focus-visible,\n.mailharbor textarea:focus-visible,\n.mailharbor button:focus-visible,\n.mailharbor [contenteditable='true']:focus-visible {\n outline: 2px solid rgba(86, 134, 254, 0.55);\n outline-offset: -1px;\n}\n\n.mailharbor .spacer {\n flex: 1;\n}\n\n.mailharbor .muted {\n color: var(--m-text-3);\n}\n\n.mailharbor .small {\n font-size: 12px;\n}\n\n.mailharbor .badge {\n display: inline-flex;\n align-items: center;\n height: 18px;\n padding: 0 6px;\n border-radius: 999px;\n font-size: 10.5px;\n font-weight: 500;\n background: var(--m-bg-3);\n color: var(--m-text-2);\n}\n\n.mailharbor .badge.ok {\n background: rgba(63, 191, 127, 0.16);\n color: var(--m-ok);\n}\n\n.mailharbor .badge.warn {\n background: rgba(221, 134, 41, 0.16);\n color: var(--m-warn);\n}\n\n.mailharbor .error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n color: var(--m-danger);\n background: rgba(242, 90, 90, 0.1);\n border-bottom: 1px solid rgba(242, 90, 90, 0.2);\n font-size: 12.5px;\n}\n\n/* ---------- shell ---------- */\n\n.mailharbor-topbar {\n display: flex;\n align-items: center;\n gap: 10px;\n height: 52px;\n padding: 0 14px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-account {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n max-width: 220px;\n padding: 4px 8px 4px 4px;\n border-radius: 999px;\n border: 1px solid transparent;\n cursor: default;\n}\n\n.mailharbor-account:hover {\n background: var(--m-hover);\n}\n\n.mailharbor-account .name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.mailharbor-account select {\n height: 26px;\n background: transparent;\n border-color: transparent;\n font-weight: 500;\n}\n\n.mailharbor-body {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.mailharbor-list {\n display: flex;\n flex-direction: column;\n width: 360px;\n flex: none;\n border-right: 1px solid var(--m-line-soft);\n min-height: 0;\n}\n\n.mailharbor-reader {\n flex: 1;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n@media (max-width: 1000px) {\n .mailharbor-list {\n width: 300px;\n }\n}\n\n.mailharbor-narrow .mailharbor-body[data-mode='reader'] .mailharbor-list {\n display: none;\n}\n\n.mailharbor-narrow .mailharbor-body[data-mode='list'] .mailharbor-reader {\n display: none;\n}\n\n/* ---------- segmented control ---------- */\n\n.mailharbor-segment {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 2px;\n border-radius: 9px;\n background: var(--m-bg-2);\n}\n\n.mailharbor-segment button {\n height: 26px;\n padding: 0 12px;\n border-radius: 7px;\n color: var(--m-text-3);\n font-size: 12px;\n}\n\n.mailharbor-segment button:hover:not(.active) {\n color: var(--m-text-2);\n background: transparent;\n}\n\n.mailharbor-segment button.active {\n background: var(--m-bg-3);\n color: var(--m-text);\n}\n\n/* ---------- list ---------- */\n\n.mailharbor-filters {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-filters select {\n width: 128px;\n flex: none;\n font-size: 12px;\n}\n\n.mailharbor-filters input[type='search'] {\n flex: 1;\n height: 30px;\n font-size: 12.5px;\n}\n\n.mailharbor-rows {\n flex: 1;\n overflow: auto;\n min-height: 0;\n}\n\n.mailharbor-row {\n display: flex;\n flex-direction: column;\n gap: 3px;\n width: 100%;\n padding: 10px 14px;\n border: 0;\n border-bottom: 1px solid var(--m-line-soft);\n border-left: 2px solid transparent;\n border-radius: 0;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}\n\n.mailharbor-row:hover {\n background: var(--m-hover);\n}\n\n.mailharbor-row.selected {\n background: var(--m-accent-soft);\n border-left-color: var(--m-accent);\n}\n\n.mailharbor-row .line-1,\n.mailharbor-row .line-2 {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n width: 100%;\n}\n\n.mailharbor-row .from {\n font-weight: 600;\n font-size: 12.5px;\n color: var(--m-text-2);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mailharbor-row .date {\n margin-left: auto;\n color: var(--m-caption);\n font-size: 11px;\n flex: none;\n}\n\n.mailharbor-row .subject {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--m-text-2);\n font-size: 12.5px;\n}\n\n.mailharbor-row .snippet {\n color: var(--m-caption);\n font-size: 11.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n}\n\n.mailharbor-row.unread .from,\n.mailharbor-row.unread .subject {\n color: var(--m-text);\n}\n\n.mailharbor-row .dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--m-accent);\n flex: none;\n}\n\n.mailharbor-row .paperclip {\n color: var(--m-caption);\n flex: none;\n display: inline-flex;\n}\n\n.mailharbor-list-foot {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-top: 1px solid var(--m-line-soft);\n color: var(--m-text-3);\n font-size: 11.5px;\n flex: none;\n}\n\n.mailharbor-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 48px 24px;\n color: var(--m-text-3);\n text-align: center;\n}\n\n.mailharbor-empty svg {\n opacity: 0.5;\n}\n\n.mailharbor-empty .title {\n color: var(--m-text-2);\n font-size: 13px;\n font-weight: 500;\n}\n\n/* ---------- reader ---------- */\n\n.mailharbor-reader-head {\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.mailharbor-reader-title {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.mailharbor-reader-title h2 {\n margin: 0;\n font-size: 17px;\n line-height: 1.35;\n font-weight: 600;\n letter-spacing: -0.01em;\n word-break: break-word;\n}\n\n.mailharbor-reader-meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px 10px;\n color: var(--m-text-3);\n font-size: 12px;\n}\n\n.mailharbor-reader-meta .who {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: var(--m-text-2);\n}\n\n.mailharbor-reader-meta .who strong {\n color: var(--m-text);\n font-weight: 600;\n}\n\n.mailharbor-reader-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.mailharbor-reader-body {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n padding: 14px 18px 18px;\n background: var(--m-bg-2);\n}\n\n.mailharbor-reader-body iframe {\n flex: 1;\n width: 100%;\n border: 0;\n border-radius: 10px;\n background: #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n\n.mailharbor-reader-body pre {\n flex: 1;\n overflow: auto;\n margin: 0;\n padding: 20px 22px;\n white-space: pre-wrap;\n word-break: break-word;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n color: #171a21;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12.5px;\n line-height: 1.7;\n}\n\n.mailharbor-attachments {\n padding: 10px 18px;\n border-top: 1px solid var(--m-line-soft);\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n flex: none;\n background: var(--m-bg);\n}\n\n.mailharbor-attachment {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n height: 30px;\n padding: 0 10px;\n border: 1px solid var(--m-line);\n border-radius: var(--m-radius);\n font-size: 12px;\n text-decoration: none;\n color: var(--m-text-2);\n max-width: 260px;\n background: var(--m-bg-1);\n}\n\n.mailharbor-attachment:hover {\n border-color: var(--m-line-strong);\n color: var(--m-text);\n}\n\n.mailharbor-attachment .name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ---------- modal / forms ---------- */\n\n.mailharbor-portal {\n position: fixed;\n inset: 0;\n z-index: 80;\n height: auto;\n background: transparent;\n pointer-events: none;\n}\n\n.mailharbor-portal .mailharbor-modal-mask {\n pointer-events: auto;\n}\n\n.mailharbor-modal-mask {\n position: fixed;\n inset: 0;\n z-index: 60;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: rgba(0, 0, 0, 0.55);\n backdrop-filter: blur(2px);\n}\n\n.mailharbor-modal {\n display: flex;\n flex-direction: column;\n width: min(720px, 100%);\n max-height: 86vh;\n overflow: hidden;\n border: 1px solid var(--m-line);\n border-radius: 14px;\n background: var(--m-bg-1);\n color: var(--m-text);\n box-shadow: var(--m-shadow);\n}\n\n.mailharbor-modal > header {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 52px;\n padding: 0 14px 0 18px;\n border-bottom: 1px solid var(--m-line-soft);\n font-size: 14px;\n font-weight: 600;\n}\n\n.mailharbor-modal .content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 18px;\n overflow: auto;\n}\n\n.mailharbor-modal > footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 18px;\n border-top: 1px solid var(--m-line-soft);\n}\n\n.mailharbor-field {\n display: flex;\n flex-direction: column;\n gap: 5px;\n min-width: 0;\n}\n\n.mailharbor-field > label {\n font-size: 11.5px;\n color: var(--m-text-3);\n}\n\n.mailharbor-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n\n.mailharbor-grid.three {\n grid-template-columns: 2fr 90px auto;\n align-items: end;\n}\n\n.mailharbor-toggle {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n color: var(--m-text-2);\n font-size: 12.5px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.mailharbor-toggle input[type='checkbox'] {\n width: 14px;\n height: 14px;\n accent-color: var(--m-accent);\n}\n\n/* ---------- composer ---------- */\n\n.mailharbor-toolbar {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-wrap: wrap;\n padding: 6px;\n border: 1px solid var(--m-line-soft);\n border-bottom: 0;\n border-radius: 10px 10px 0 0;\n background: var(--m-bg-2);\n}\n\n.mailharbor-toolbar button {\n height: 26px;\n padding: 0 9px;\n border-radius: 6px;\n color: var(--m-text-2);\n font-size: 12px;\n}\n\n.mailharbor-toolbar button:hover {\n background: var(--m-bg-3);\n color: var(--m-text);\n}\n\n.mailharbor-editor {\n min-height: 240px;\n max-height: 44vh;\n overflow: auto;\n padding: 14px 16px;\n border: 1px solid var(--m-line-soft);\n border-radius: 0 0 10px 10px;\n background: #fff;\n color: #171a21;\n outline: none;\n font-size: 13.5px;\n line-height: 1.7;\n}\n\n.mailharbor-editor:empty::before {\n content: attr(data-placeholder);\n color: #9aa0ab;\n}\n\n/* ---------- settings ---------- */\n\n.mailharbor-settings {\n padding: 20px 24px 48px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n max-width: 880px;\n}\n\n.mailharbor-settings h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n letter-spacing: -0.01em;\n}\n\n.mailharbor-settings h3 {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--m-text-3);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n\n.mailharbor-card {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n border: 1px solid var(--m-line-soft);\n border-radius: 12px;\n background: var(--m-bg-1);\n}\n\n.mailharbor-account-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.mailharbor-account-row .meta {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.mailharbor-account-row .meta strong {\n font-weight: 600;\n}\n\n.mailharbor-account-row .meta span {\n color: var(--m-text-3);\n font-size: 11.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mailharbor .avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n border-radius: 50%;\n background: var(--m-accent-soft);\n color: var(--m-accent);\n font-weight: 600;\n}\n\n.mailharbor-log {\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--m-bg);\n border: 1px solid var(--m-line-soft);\n color: var(--m-text-2);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n line-height: 1.6;\n max-height: 220px;\n overflow: auto;\n white-space: pre-wrap;\n}\n\n.mailharbor-kv {\n display: grid;\n grid-template-columns: minmax(120px, 170px) 1fr;\n gap: 6px 14px;\n font-size: 12px;\n margin: 0;\n}\n\n.mailharbor-kv dt {\n color: var(--m-text-3);\n}\n\n.mailharbor-kv dd {\n margin: 0;\n color: var(--m-text-2);\n word-break: break-all;\n}\n\n.mailharbor hr {\n border: 0;\n border-top: 1px solid var(--m-line-soft);\n margin: 2px 0;\n}\n", "import { createElement as h, useEffect, useState, type ReactNode } from 'react'\nimport { api } from './api.js'\n\n/**\n * Sidebar entry: an envelope plus an unread count.\n *\n * The shell renders this inside an 18\u00D718 glyph slot and hides it from\n * assistive tech, so the badge must stay compact and must not add layout.\n * It uses the accent blue rather than `--dsw-alias-brand-primary`, which is\n * near-white in the dark theme and would render as an empty white blob.\n */\nexport function MailIcon(): ReactNode {\n const [unread, setUnread] = useState(0)\n\n useEffect(() => {\n let cancelled = false\n let timer: number | undefined\n const poll = async (): Promise<void> => {\n try {\n const result = await api.unread()\n if (!cancelled) setUnread(result.unread)\n } catch {\n // A logged-out or offline account simply shows no badge.\n }\n }\n void poll()\n const schedule = (): void => {\n if (cancelled) return\n timer = window.setTimeout(() => {\n void poll().finally(schedule)\n }, 60_000)\n }\n schedule()\n return () => {\n cancelled = true\n if (timer !== undefined) window.clearTimeout(timer)\n }\n }, [])\n\n return h(\n 'span',\n {\n style: {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '18px',\n height: '18px',\n boxSizing: 'border-box',\n },\n },\n h(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': 'true' },\n h('rect', { x: 2.5, y: 5, width: 19, height: 14, rx: 2.5, stroke: 'currentColor', strokeWidth: 1.7 }),\n h('path', {\n d: 'M3.5 7l7.6 5.4a1.6 1.6 0 0 0 1.8 0L20.5 7',\n stroke: 'currentColor',\n strokeWidth: 1.7,\n strokeLinecap: 'round',\n }),\n ),\n unread > 0\n ? h(\n 'span',\n {\n style: {\n position: 'absolute',\n right: '-5px',\n bottom: '-3px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxSizing: 'border-box',\n minWidth: '13px',\n height: '13px',\n padding: '0 3px',\n borderRadius: '999px',\n background: '#5686fe',\n color: '#fff',\n fontSize: '9px',\n fontWeight: 600,\n lineHeight: '13px',\n zIndex: 1,\n letterSpacing: '-0.01em',\n fontVariantNumeric: 'tabular-nums',\n boxShadow: '0 0 0 2px var(--dsw-alias-bg-base, #151517)',\n pointerEvents: 'none',\n },\n },\n unread > 99 ? '99+' : String(unread),\n )\n : null,\n )\n}\n", "import type {\n Account,\n AppState,\n AttachmentMeta,\n BackupStatus,\n Draft,\n MessageDetail,\n MessageSummary,\n NewAccountInput,\n Page,\n SendResult,\n SettingsView,\n} from '../shared/types.js'\n\n/** Same-origin API root: works in the Web GUI and through the desktop shell. */\nconst BASE = new URL('mail-plugin/api/', document.baseURI).href\n\nexport class ApiError extends Error {\n readonly status: number\n\n constructor(message: string, status: number) {\n super(message)\n this.status = status\n this.name = 'ApiError'\n }\n}\n\nasync function request<T>(path: string, init: RequestInit = {}): Promise<T> {\n const response = await fetch(new URL(path, BASE), {\n credentials: 'same-origin',\n ...init,\n headers: {\n accept: 'application/json',\n ...(init.body === undefined ? {} : { 'content-type': 'application/json' }),\n ...(init.headers ?? {}),\n },\n })\n if (!response.ok) {\n let message = response.statusText\n try {\n const body: unknown = await response.json()\n if (\n body !== null &&\n typeof body === 'object' &&\n typeof (body as { error?: unknown }).error === 'string'\n ) {\n message = (body as { error: string }).error\n }\n } catch {\n // Keep the status text.\n }\n throw new ApiError(message, response.status)\n }\n return (await response.json()) as T\n}\n\nfunction query(params: Record<string, string | number | undefined | null>): string {\n const search = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null && value !== '') search.set(key, String(value))\n }\n const text = search.toString()\n return text === '' ? '' : `?${text}`\n}\n\nexport interface ListParams {\n accountId?: string | null\n source: 'local' | 'server'\n mailbox: string\n query?: string\n offset?: number\n limit?: number\n}\n\nexport const api = {\n state: (): Promise<AppState> => request<AppState>('state'),\n\n folders: (params: { accountId?: string | null; source: 'local' | 'server' }) =>\n request<{ items: { name: string; label?: string; count: number }[] }>(`folders${query(params)}`),\n\n messages: (params: ListParams) => request<Page<MessageSummary>>(`messages${query({ ...params })}`),\n\n message: (params: { id: string; accountId?: string | null; source: 'local' | 'server'; mailbox: string }) =>\n request<MessageDetail>(`messages/${encodeURIComponent(params.id)}${query({ ...params })}`),\n\n setRead: (params: {\n id: string\n accountId?: string | null\n source: 'local' | 'server'\n mailbox: string\n read: boolean\n }) =>\n request<{ ok: true; read: boolean }>(\n `messages/${encodeURIComponent(params.id)}/read${query({\n accountId: params.accountId ?? null,\n source: params.source,\n mailbox: params.mailbox,\n })}`,\n { method: 'POST', body: JSON.stringify({ read: params.read }) },\n ),\n\n attachmentUrl: (params: Record<string, string | number | undefined | null>) =>\n new URL(`attachment${query(params)}`, BASE).href,\n\n drafts: (accountId?: string | null) =>\n request<{ items: Draft[] }>(`drafts${query({ accountId: accountId ?? null })}`),\n\n saveDraft: (accountId: string | null, draft: Partial<Draft>) =>\n request<{ draft: Draft }>(`drafts${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n body: JSON.stringify(draft),\n }),\n\n deleteDraft: (id: string, accountId?: string | null) =>\n request<{ ok: true }>(`drafts/${encodeURIComponent(id)}${query({ accountId: accountId ?? null })}`, {\n method: 'DELETE',\n }),\n\n send: (accountId: string | null, payload: Record<string, unknown>) =>\n request<{ ok: true; result: SendResult }>(`send${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n unread: (accountId?: string | null) =>\n request<{ unread: number; source: string }>(`unread${query({ accountId: accountId ?? null })}`),\n\n addAccount: (input: NewAccountInput & { connect?: boolean; remember?: boolean }) =>\n request<{ account: Account; state: AppState }>('accounts', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n\n updateAccount: (id: string, patch: Record<string, unknown>) =>\n request<{ account: Account }>(`accounts/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(patch),\n }),\n\n deleteAccount: (id: string) =>\n request<{ ok: true }>(`accounts/${encodeURIComponent(id)}`, { method: 'DELETE' }),\n\n activateAccount: (id: string) =>\n request<{ ok: true }>(`accounts/${encodeURIComponent(id)}/activate`, { method: 'POST' }),\n\n login: (id: string, password: string, remember: boolean) =>\n request<{ ok: true; stored: boolean }>(`accounts/${encodeURIComponent(id)}/login`, {\n method: 'POST',\n body: JSON.stringify({ password, remember }),\n }),\n\n logout: (id: string) =>\n request<{ ok: true }>(`accounts/${encodeURIComponent(id)}/logout`, { method: 'POST' }),\n\n check: (id: string) =>\n request<{\n ok: true\n imap: { ok: true; mailboxes: { name: string; count: number }[] }\n smtp: { ok: boolean; error?: string }\n }>(`accounts/${encodeURIComponent(id)}/check`, { method: 'POST' }),\n\n settings: () => request<SettingsView>('settings'),\n\n saveSettings: (patch: Record<string, unknown>) =>\n request<{ settings: SettingsView }>('settings', { method: 'PATCH', body: JSON.stringify(patch) }),\n\n backupStatus: (accountId?: string | null) =>\n request<BackupStatus>(`backup/status${query({ accountId: accountId ?? null })}`),\n\n startBackup: (accountId?: string | null) =>\n request<{ ok: true; status: BackupStatus }>(`backup/start${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n }),\n\n stopBackup: (accountId?: string | null) =>\n request<{ ok: boolean; status: BackupStatus }>(`backup/stop${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n }),\n}\n\nexport type { AttachmentMeta }\n", "import { createElement as h, useCallback, useEffect, useMemo, useState, type ReactNode } from 'react'\nimport type { AppState, BackupStatus, MessageDetail, MessageSummary, Page } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { AddAccountForm, AddAccountModal, LoginForm } from './account-form.js'\nimport { Avatar, ErrorBar, Modal, shortDate } from './components.js'\nimport { Composer, type ComposeInit } from './composer.js'\nimport { Icon } from './icons.js'\nimport { Reader } from './reader.js'\n\ninterface Folder {\n name: string\n label?: string\n count: number\n}\n\nconst EMPTY_PAGE: Page<MessageSummary> = { items: [], total: 0, offset: 0, limit: 40 }\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nfunction matchesNarrow(): boolean {\n return typeof window.matchMedia === 'function' ? window.matchMedia('(max-width: 900px)').matches : false\n}\n\nfunction quoteForReply(detail: MessageDetail): string {\n const body = detail.html ?? `<pre>${detail.text.replaceAll('&', '&').replaceAll('<', '<')}</pre>`\n return `<p><br></p><p>------------------ \u539F\u59CB\u90AE\u4EF6 ------------------</p><blockquote style=\"margin:0 0 0 12px;padding-left:12px;border-left:2px solid #d7dbe3;color:#565c67\">${body}</blockquote>`\n}\n\nexport function MailPanel(): ReactNode {\n const [state, setState] = useState<AppState | null>(null)\n const [error, setError] = useState('')\n const [source, setSource] = useState<'local' | 'server'>('local')\n const [mailbox, setMailbox] = useState('all')\n const [folders, setFolders] = useState<Folder[]>([])\n const [query, setQuery] = useState('')\n const [search, setSearch] = useState('')\n const [page, setPage] = useState<Page<MessageSummary>>(EMPTY_PAGE)\n const [limit, setLimit] = useState(40)\n const [loading, setLoading] = useState(false)\n const [selected, setSelected] = useState<MessageDetail | null>(null)\n const [compose, setCompose] = useState<ComposeInit | null>(null)\n const [showAdd, setShowAdd] = useState(false)\n const [showBackup, setShowBackup] = useState(false)\n const [backup, setBackup] = useState<BackupStatus | null>(null)\n const [toast, setToast] = useState('')\n const [narrow, setNarrow] = useState(() => matchesNarrow())\n const [tick, setTick] = useState(0)\n const account = state?.accounts.find((item) => item.id === state.activeAccountId) ?? null\n const accountId = account?.id ?? null\n\n const refresh = useCallback((): void => {\n setTick((value) => value + 1)\n }, [])\n\n const notice = useCallback((message: string): void => {\n setToast(message)\n window.setTimeout(() => {\n setToast('')\n }, 3200)\n }, [])\n\n // App state: load once and after mutations.\n useEffect(() => {\n let cancelled = false\n api\n .state()\n .then((next) => {\n if (!cancelled) {\n setState(next)\n if (next.settings.render.listLimit > 0) setLimit(next.settings.render.listLimit)\n }\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n return () => {\n cancelled = true\n }\n }, [tick])\n\n // Folders follow the account and the source.\n useEffect(() => {\n if (accountId === null) return\n let cancelled = false\n api\n .folders({ accountId, source })\n .then((result) => {\n if (cancelled) return\n const items: Folder[] =\n source === 'local'\n ? [\n {\n name: 'all',\n label: '\u5168\u90E8\u90AE\u4EF6',\n count: result.items.reduce((sum, item) => sum + item.count, 0),\n },\n ...result.items.map((item) => ({ ...item, label: item.label ?? item.name })),\n ]\n : result.items.map((item) => ({ ...item, label: item.label ?? item.name }))\n setFolders(items)\n })\n .catch(() => {\n if (!cancelled) setFolders([])\n })\n return () => {\n cancelled = true\n }\n }, [accountId, source, tick])\n\n // Selecting a source resets the folder to that source's natural default.\n useEffect(() => {\n setMailbox(source === 'local' ? 'all' : 'INBOX')\n setSelected(null)\n }, [source])\n\n // Message page.\n useEffect(() => {\n if (accountId === null) return\n let cancelled = false\n setLoading(true)\n api\n .messages({ accountId, source, mailbox, query: search, limit })\n .then((result) => {\n if (!cancelled) setPage(result)\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [accountId, source, mailbox, search, limit, tick])\n\n // Narrow layout follows the viewport.\n useEffect(() => {\n if (typeof window.matchMedia !== 'function') return\n const media = window.matchMedia('(max-width: 900px)')\n const onChange = (): void => setNarrow(media.matches)\n media.addEventListener('change', onChange)\n return () => {\n media.removeEventListener('change', onChange)\n }\n }, [])\n\n // Backup progress polling while the dialog is open.\n useEffect(() => {\n if (!showBackup || accountId === null) return\n let cancelled = false\n const poll = async (): Promise<void> => {\n try {\n const status = await api.backupStatus(accountId)\n if (!cancelled) setBackup(status)\n } catch {\n // Keep the last status.\n }\n }\n void poll()\n const timer = window.setInterval(() => {\n void poll()\n }, 1000)\n return () => {\n cancelled = true\n window.clearInterval(timer)\n }\n }, [showBackup, accountId])\n\n const openMessage = async (item: MessageSummary): Promise<void> => {\n if (account === null) return\n setError('')\n try {\n const detail = await api.message({ id: item.id, accountId: account.id, source, mailbox })\n setSelected(detail)\n if (detail.unread && state?.settings.read.markOnOpen === true) {\n try {\n await api.setRead({ id: detail.id, accountId: account.id, source, mailbox, read: true })\n setSelected({ ...detail, unread: false })\n setPage((current) => ({\n ...current,\n items: current.items.map((row) => (row.id === item.id ? { ...row, unread: false } : row)),\n }))\n } catch {\n // Reading must not fail because the server refused a flag write.\n }\n }\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const startCompose = (mode: ComposeInit['mode']): void => {\n if (account === null) return\n const detail = selected\n if (mode === 'new' || detail === null) {\n setCompose({ mode: 'new', to: '', cc: '', bcc: '', subject: '', html: '' })\n return\n }\n const subjectPrefix = mode === 'forward' ? 'Fwd: ' : 'Re: '\n const subject = /^(re|fwd):/i.test(detail.subject) ? detail.subject : `${subjectPrefix}${detail.subject}`\n if (mode === 'forward') {\n setCompose({\n mode,\n to: '',\n cc: '',\n bcc: '',\n subject,\n html: quoteForReply(detail),\n references: detail.references.join(' '),\n })\n return\n }\n const to = detail.from.address\n const cc =\n mode === 'replyAll'\n ? [...detail.to, ...detail.cc]\n .map((item) => item.address)\n .filter((address) => address !== account.email && address !== to)\n .join(', ')\n : ''\n setCompose({\n mode,\n to,\n cc,\n bcc: '',\n subject,\n html: quoteForReply(detail),\n ...(detail.messageId === ''\n ? {}\n : { inReplyTo: detail.messageId, references: [...detail.references, detail.messageId].join(' ') }),\n })\n }\n\n const switchAccount = async (id: string): Promise<void> => {\n try {\n await api.activateAccount(id)\n setSelected(null)\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const startBackup = async (): Promise<void> => {\n if (accountId === null) return\n try {\n const result = await api.startBackup(accountId)\n setBackup(result.status)\n setShowBackup(true)\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const stopBackup = async (): Promise<void> => {\n if (accountId === null) return\n try {\n const result = await api.stopBackup(accountId)\n setBackup(result.status)\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const folderOptions = useMemo(\n () =>\n folders.map((folder) => ({\n value: folder.name,\n label: `${folder.label ?? folder.name}${folder.count > 0 ? ` (${String(folder.count)})` : ''}`,\n })),\n [folders],\n )\n\n if (state === null) {\n return h(\n 'div',\n { className: 'mailharbor' },\n h('div', { className: 'mailharbor-empty' }, error === '' ? '\u6B63\u5728\u52A0\u8F7D\u90AE\u7BB1\u2026' : error),\n )\n }\n\n if (account === null) {\n return h(\n 'div',\n { className: 'mailharbor' },\n h(\n 'div',\n { className: 'mailharbor-settings' },\n h('h2', null, '\u6B22\u8FCE\u4F7F\u7528 MailHarbor'),\n h(\n 'p',\n { className: 'muted small' },\n '\u628A\u4EFB\u610F IMAP/SMTP \u90AE\u7BB1\u63A5\u8FDB DeepSeek Harness\uFF1A\u672C\u5730\u5907\u4EFD\u3001\u5B9E\u65F6\u8BFB\u4FE1\u3001\u5199\u90AE\u4EF6\u4E0E Agent \u5DE5\u5177\u3002',\n ),\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(AddAccountForm, {\n onDone: (next) => {\n setState(next)\n setSource('local')\n },\n }),\n ),\n )\n }\n\n const needsLogin = source === 'server' && state.loggedIn === false\n const items = page.items\n\n return h(\n 'div',\n { className: narrow ? 'mailharbor mailharbor-narrow' : 'mailharbor' },\n h(\n 'div',\n { className: 'mailharbor-topbar' },\n h(\n 'div',\n { className: 'mailharbor-account' },\n h(Avatar, { email: account.email, size: 26 }),\n state.accounts.length > 1\n ? h(\n 'select',\n {\n value: account.id,\n onChange: (event: { target: { value: string } }) => void switchAccount(event.target.value),\n 'aria-label': '\u8D26\u53F7',\n },\n state.accounts.map((item) => h('option', { key: item.id, value: item.id }, item.label)),\n )\n : h('span', { className: 'name' }, account.label),\n state.loggedIn === false ? h('span', { className: 'badge warn' }, '\u672A\u767B\u5F55') : null,\n ),\n h(\n 'div',\n { className: 'mailharbor-segment', role: 'tablist' },\n h(\n 'button',\n { className: source === 'local' ? 'active' : '', onClick: () => setSource('local'), role: 'tab' },\n '\u672C\u5730\u5907\u4EFD',\n ),\n h(\n 'button',\n { className: source === 'server' ? 'active' : '', onClick: () => setSource('server'), role: 'tab' },\n '\u670D\u52A1\u5668\u5B9E\u65F6',\n ),\n ),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n {\n className: 'ghost icon',\n title: '\u6DFB\u52A0\u8D26\u53F7',\n 'aria-label': '\u6DFB\u52A0\u8D26\u53F7',\n onClick: () => setShowAdd(true),\n },\n h(Icon, { name: 'plus' }),\n ),\n h(\n 'button',\n { className: 'ghost icon', title: '\u5237\u65B0\u5217\u8868', 'aria-label': '\u5237\u65B0\u5217\u8868', onClick: refresh },\n h(Icon, { name: 'refresh' }),\n ),\n h(\n 'button',\n { className: 'ghost', onClick: () => void startBackup() },\n h(Icon, { name: 'archive' }),\n '\u5907\u4EFD',\n ),\n h(\n 'button',\n { className: 'primary', onClick: () => startCompose('new') },\n h(Icon, { name: 'compose' }),\n '\u5199\u90AE\u4EF6',\n ),\n ),\n toast === ''\n ? null\n : h('div', { className: 'small', style: { padding: '6px 14px', color: 'var(--m-ok)' } }, toast),\n error === '' ? null : h(ErrorBar, { message: error, onDismiss: () => setError('') }),\n needsLogin\n ? h('div', { className: 'mailharbor-settings' }, h(LoginForm, { account, onDone: refresh }))\n : h(\n 'div',\n { className: 'mailharbor-body', 'data-mode': narrow && selected !== null ? 'reader' : 'list' },\n h(\n 'div',\n { className: 'mailharbor-list' },\n h(\n 'div',\n { className: 'mailharbor-filters' },\n h(\n 'select',\n {\n value: mailbox,\n onChange: (event: { target: { value: string } }) => {\n setMailbox(event.target.value)\n setSelected(null)\n },\n 'aria-label': '\u90AE\u7BB1\u6587\u4EF6\u5939',\n },\n folderOptions.map((option) =>\n h('option', { key: option.value, value: option.value }, option.label),\n ),\n ),\n h('input', {\n type: 'search',\n placeholder: '\u641C\u7D22\u90AE\u4EF6',\n 'aria-label': '\u641C\u7D22\u90AE\u4EF6',\n value: query,\n onChange: (event: { target: { value: string } }) => setQuery(event.target.value),\n onKeyDown: (event: { key: string }) => {\n if (event.key === 'Enter') setSearch(query)\n if (event.key === 'Escape') {\n setQuery('')\n setSearch('')\n }\n },\n }),\n query !== search || search !== ''\n ? h(\n 'button',\n {\n className: 'subtle',\n title: '\u6E05\u9664\u641C\u7D22',\n onClick: () => {\n setQuery('')\n setSearch('')\n },\n },\n h(Icon, { name: 'close', size: 14 }),\n )\n : null,\n ),\n h(\n 'div',\n { className: 'mailharbor-rows' },\n loading && items.length === 0\n ? h('div', { className: 'mailharbor-empty' }, '\u6B63\u5728\u8BFB\u53D6\u2026')\n : items.length === 0\n ? h(\n 'div',\n { className: 'mailharbor-empty' },\n h(Icon, { name: 'mail', size: 28 }),\n h(\n 'div',\n { className: 'title' },\n source === 'local' ? '\u672C\u5730\u5907\u4EFD\u91CC\u8FD8\u6CA1\u6709\u90AE\u4EF6' : '\u670D\u52A1\u5668\u4E0A\u6CA1\u6709\u90AE\u4EF6',\n ),\n h(\n 'div',\n { className: 'small' },\n source === 'local'\n ? '\u70B9\u9876\u90E8\u300C\u5907\u4EFD\u300D\u628A\u670D\u52A1\u5668\u90AE\u4EF6\u540C\u6B65\u4E0B\u6765\u3002'\n : '\u6362\u4E00\u4E2A\u6587\u4EF6\u5939\u6216\u7A0D\u540E\u5237\u65B0\u3002',\n ),\n )\n : items.map((item) =>\n h(\n 'div',\n {\n key: item.id,\n className: `mailharbor-row${item.unread ? ' unread' : ''}${selected?.id === item.id ? ' selected' : ''}`,\n role: 'button',\n tabIndex: 0,\n onClick: () => void openMessage(item),\n onKeyDown: (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n void openMessage(item)\n }\n },\n },\n h(\n 'span',\n { className: 'line-1' },\n item.unread ? h('span', { className: 'dot' }) : null,\n h(\n 'span',\n { className: 'from' },\n item.from.name !== '' ? item.from.name : item.from.address,\n ),\n item.hasAttachments ? h(Icon, { name: 'paperclip', size: 13 }) : null,\n item.backedUp === false ? h('span', { className: 'badge warn' }, '\u672A\u5907\u4EFD') : null,\n h('span', { className: 'date' }, shortDate(item.date)),\n ),\n h('span', { className: 'line-2' }, h('span', { className: 'subject' }, item.subject)),\n item.snippet === '' ? null : h('span', { className: 'snippet' }, item.snippet),\n ),\n ),\n ),\n items.length > 0\n ? h(\n 'div',\n { className: 'mailharbor-list-foot' },\n h('span', null, `${String(items.length)} / ${String(page.total)} \u5C01`),\n h('span', { className: 'spacer' }),\n page.total > items.length\n ? h(\n 'button',\n { className: 'subtle', onClick: () => setLimit((current) => current + 40) },\n '\u52A0\u8F7D\u66F4\u591A',\n )\n : null,\n )\n : null,\n ),\n h(\n 'div',\n { className: 'mailharbor-reader' },\n selected === null\n ? h(\n 'div',\n { className: 'mailharbor-empty' },\n h(Icon, { name: 'mail', size: 34 }),\n h('div', { className: 'title' }, '\u9009\u62E9\u4E00\u5C01\u90AE\u4EF6\u5F00\u59CB\u9605\u8BFB'),\n h(\n 'div',\n { className: 'small' },\n state.loggedIn\n ? '\u5DF2\u767B\u5F55\uFF0C\u53EF\u5207\u6362\u300C\u670D\u52A1\u5668\u5B9E\u65F6\u300D\u67E5\u770B\u6700\u65B0\u90AE\u4EF6\u3002'\n : '\u6D4F\u89C8\u672C\u5730\u5907\u4EFD\u4E0D\u9700\u8981\u767B\u5F55\u3002',\n ),\n )\n : h(Reader, {\n detail: selected,\n account,\n source,\n mailbox,\n onChanged: (patch) => setSelected({ ...selected, ...patch }),\n onReply: (mode) => startCompose(mode),\n onClose: narrow ? () => setSelected(null) : undefined,\n }),\n ),\n ),\n showBackup && backup !== null\n ? h(\n Modal,\n {\n title: '\u5907\u4EFD',\n onClose: () => setShowBackup(false),\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', width: '100%', alignItems: 'center' } },\n h('span', { className: 'small muted' }, backup.running ? '\u5907\u4EFD\u8FDB\u884C\u4E2D\u2026' : backup.message),\n h('span', { className: 'spacer' }),\n backup.running\n ? h('button', { className: 'ghost danger', onClick: () => void stopBackup() }, '\u505C\u6B62\u5907\u4EFD')\n : h('button', { className: 'primary', onClick: () => void startBackup() }, '\u5F00\u59CB\u5907\u4EFD'),\n h('button', { className: 'ghost', onClick: () => setShowBackup(false) }, '\u5173\u95ED'),\n ),\n },\n h(\n 'div',\n { className: 'mailharbor-kv' },\n h('dt', null, '\u5F00\u59CB\u65F6\u95F4'),\n h('dd', null, backup.startedAt ?? '\u2014'),\n h('dt', null, '\u4E0A\u6B21\u6210\u529F'),\n h('dd', null, backup.lastSuccessAt ?? '\u2014'),\n h('dt', null, '\u65B0\u589E'),\n h('dd', null, String(backup.added)),\n h('dt', null, '\u603B\u6570'),\n h('dd', null, String(backup.total)),\n ),\n h(\n 'div',\n { className: 'mailharbor-log' },\n backup.output.length === 0 ? '\uFF08\u7B49\u5F85\u8F93\u51FA\u2026\uFF09' : backup.output.join('\\n'),\n ),\n )\n : null,\n compose !== null\n ? h(Composer, {\n account,\n initial: compose,\n onClose: () => setCompose(null),\n onSent: (message) => notice(message),\n })\n : null,\n showAdd\n ? h(AddAccountModal, {\n onClose: () => setShowAdd(false),\n onDone: (next) => {\n setState(next)\n refresh()\n },\n })\n : null,\n )\n}\n", "import { createElement as h, useState, type ReactNode } from 'react'\nimport type { Account, AppState } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { Field, Modal, Toggle } from './components.js'\n\nfunction domainOf(email: string): string {\n return email.split('@')[1] ?? 'example.com'\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nexport function AddAccountForm({\n onDone,\n onCancel,\n}: {\n onDone: (state: AppState) => void\n onCancel?: () => void\n}): ReactNode {\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [label, setLabel] = useState('')\n const [remember, setRemember] = useState(true)\n const [advanced, setAdvanced] = useState(false)\n const [imapHost, setImapHost] = useState('')\n const [imapPort, setImapPort] = useState('993')\n const [imapSecure, setImapSecure] = useState(true)\n const [smtpHost, setSmtpHost] = useState('')\n const [smtpPort, setSmtpPort] = useState('465')\n const [smtpSecure, setSmtpSecure] = useState(true)\n const [fromName, setFromName] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n const submit = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const domain = domainOf(email)\n const { state } = await api.addAccount({\n email: email.trim(),\n password,\n remember,\n ...(label.trim() === '' ? {} : { label: label.trim() }),\n ...(advanced\n ? {\n imap: {\n host: imapHost.trim() === '' ? `imap.${domain}` : imapHost.trim(),\n port: Number(imapPort) || 993,\n secure: imapSecure,\n },\n smtp: {\n host: smtpHost.trim() === '' ? `smtp.${domain}` : smtpHost.trim(),\n port: Number(smtpPort) || 465,\n secure: smtpSecure,\n ...(fromName.trim() === '' ? {} : { fromName: fromName.trim() }),\n },\n }\n : {}),\n })\n onDone(state)\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u6DFB\u52A0\u90AE\u7BB1\u8D26\u53F7'),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u90AE\u7BB1\u5730\u5740' },\n h('input', {\n type: 'email',\n value: email,\n placeholder: 'you@example.com',\n onChange: (event: { target: { value: string } }) => setEmail(event.target.value),\n autoFocus: true,\n }),\n ),\n h(\n Field,\n { label: '\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801' },\n h('input', {\n type: 'password',\n value: password,\n onChange: (event: { target: { value: string } }) => setPassword(event.target.value),\n }),\n ),\n ),\n h(\n Field,\n { label: '\u663E\u793A\u540D\u79F0\uFF08\u53EF\u9009\uFF09' },\n h('input', {\n value: label,\n placeholder: '\u5DE5\u4F5C\u90AE\u7BB1',\n onChange: (event: { target: { value: string } }) => setLabel(event.target.value),\n }),\n ),\n h(Toggle, { checked: remember, onChange: setRemember, label: '\u8BB0\u4F4F\u5BC6\u7801\uFF08\u5199\u5165\u7CFB\u7EDF\u94A5\u5319\u4E32\uFF09' }),\n h(\n 'button',\n { className: 'ghost', onClick: () => setAdvanced(!advanced) },\n advanced ? '\u9690\u85CF\u9AD8\u7EA7\u8BBE\u7F6E' : '\u9AD8\u7EA7\u8BBE\u7F6E\uFF08\u670D\u52A1\u5668\u4E0E\u7AEF\u53E3\uFF09',\n ),\n advanced\n ? h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'IMAP \u4E3B\u673A' },\n h('input', {\n value: imapHost,\n placeholder: `imap.${domainOf(email)}`,\n onChange: (event: { target: { value: string } }) => setImapHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: imapPort,\n inputMode: 'numeric',\n onChange: (event: { target: { value: string } }) => setImapPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: imapSecure, onChange: setImapSecure, label: 'TLS' }),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'SMTP \u4E3B\u673A' },\n h('input', {\n value: smtpHost,\n placeholder: `smtp.${domainOf(email)}`,\n onChange: (event: { target: { value: string } }) => setSmtpHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: smtpPort,\n inputMode: 'numeric',\n onChange: (event: { target: { value: string } }) => setSmtpPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: smtpSecure, onChange: setSmtpSecure, label: 'TLS' }),\n ),\n h(\n Field,\n { label: '\u53D1\u4EF6\u4EBA\u540D\u79F0\uFF08\u53EF\u9009\uFF09' },\n h('input', {\n value: fromName,\n onChange: (event: { target: { value: string } }) => setFromName(event.target.value),\n }),\n ),\n )\n : null,\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', justifyContent: 'flex-end' } },\n onCancel === undefined ? null : h('button', { className: 'ghost', onClick: onCancel }, '\u53D6\u6D88'),\n h(\n 'button',\n {\n className: 'primary',\n onClick: () => void submit(),\n disabled: busy || email.trim() === '' || password === '',\n },\n busy ? '\u8FDE\u63A5\u4E2D\u2026' : '\u6DFB\u52A0\u5E76\u8FDE\u63A5',\n ),\n ),\n )\n}\n\nexport function LoginForm({ account, onDone }: { account: Account; onDone: () => void }): ReactNode {\n const [password, setPassword] = useState('')\n const [remember, setRemember] = useState(true)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const submit = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.login(account.id, password, remember)\n onDone()\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n return h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, `\u767B\u5F55 ${account.email}`),\n h(\n 'p',\n { className: 'small muted' },\n `${account.imap.host}:${String(account.imap.port)} \u00B7 ${account.smtp.host}:${String(account.smtp.port)}`,\n ),\n h(\n Field,\n { label: '\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801' },\n h('input', {\n type: 'password',\n value: password,\n onChange: (event: { target: { value: string } }) => setPassword(event.target.value),\n onKeyDown: (event: { key: string }) => {\n if (event.key === 'Enter') void submit()\n },\n autoFocus: true,\n }),\n ),\n h(Toggle, { checked: remember, onChange: setRemember, label: '\u8BB0\u4F4F\u5BC6\u7801\uFF08\u5199\u5165\u7CFB\u7EDF\u94A5\u5319\u4E32\uFF09' }),\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(\n 'button',\n { className: 'primary', onClick: () => void submit(), disabled: busy || password === '' },\n busy ? '\u767B\u5F55\u4E2D\u2026' : '\u767B\u5F55',\n ),\n )\n}\n\nexport function AddAccountModal({\n onClose,\n onDone,\n}: {\n onClose: () => void\n onDone: (state: AppState) => void\n}): ReactNode {\n return h(\n Modal,\n { title: '\u6DFB\u52A0\u90AE\u7BB1\u8D26\u53F7', onClose },\n h(AddAccountForm, {\n onDone: (state) => {\n onDone(state)\n onClose()\n },\n onCancel: onClose,\n }),\n )\n}\n\nexport { errorText }\n", "import { createElement as h, useEffect, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport function Avatar({ email, size = 26 }: { email: string; size?: number }): ReactNode {\n const letter = (email.trim()[0] ?? '?').toUpperCase()\n return h(\n 'span',\n {\n className: 'avatar',\n style: {\n width: `${String(size)}px`,\n height: `${String(size)}px`,\n fontSize: `${String(Math.round(size * 0.42))}px`,\n },\n 'aria-hidden': 'true',\n },\n letter,\n )\n}\n\nexport function Field({\n label,\n children,\n hint,\n}: {\n label: string\n children?: ReactNode\n hint?: string\n}): ReactNode {\n return h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, label),\n children,\n hint === undefined ? null : h('span', { className: 'small muted' }, hint),\n )\n}\n\nexport function Toggle({\n checked,\n onChange,\n label,\n}: {\n checked: boolean\n onChange: (value: boolean) => void\n label: string\n}): ReactNode {\n return h(\n 'label',\n { className: 'mailharbor-toggle' },\n h('input', {\n type: 'checkbox',\n checked,\n onChange: (event: { target: { checked: boolean } }) => {\n onChange(event.target.checked)\n },\n }),\n label,\n )\n}\n\n/** Portal root that keeps the shell's theme variables in scope. */\nfunction portalRoot(): HTMLElement {\n const existing = document.getElementById('mailharbor-portal')\n if (existing !== null) return existing\n const element = document.createElement('div')\n element.id = 'mailharbor-portal'\n element.className = 'mailharbor mailharbor-portal'\n document.body.append(element)\n return element\n}\n\nexport function Modal({\n title,\n children,\n footer,\n onClose,\n wide = false,\n}: {\n title: string\n children?: ReactNode\n footer?: ReactNode\n onClose: () => void\n wide?: boolean\n}): ReactNode {\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => {\n window.removeEventListener('keydown', onKey)\n }\n }, [onClose])\n return createPortal(\n h(\n 'div',\n {\n className: 'mailharbor-modal-mask',\n onMouseDown: (event: { target: unknown; currentTarget: unknown }) => {\n if (event.target === event.currentTarget) onClose()\n },\n },\n h(\n 'div',\n {\n className: 'mailharbor-modal',\n style: wide ? { width: 'min(920px, 100%)' } : undefined,\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-label': title,\n },\n h(\n 'header',\n null,\n title,\n h('span', { className: 'spacer' }),\n h('button', { className: 'subtle', onClick: onClose, 'aria-label': '\u5173\u95ED' }, '\u2715'),\n ),\n h('div', { className: 'content' }, children),\n footer === undefined ? null : h('footer', null, footer),\n ),\n ),\n portalRoot(),\n )\n}\n\nexport function ErrorBar({ message, onDismiss }: { message: string; onDismiss: () => void }): ReactNode {\n return h(\n 'div',\n { className: 'error', role: 'alert' },\n h('span', null, message),\n h('span', { className: 'spacer' }),\n h('button', { className: 'subtle', onClick: onDismiss }, '\u5173\u95ED'),\n )\n}\n\nconst DAY = 86_400_000\n\n/** Compact list timestamp: time today, month-day this year, else the date. */\nexport function shortDate(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso.slice(0, 16)\n const now = new Date()\n const sameDay =\n date.getFullYear() === now.getFullYear() &&\n date.getMonth() === now.getMonth() &&\n date.getDate() === now.getDate()\n const pad = (value: number): string => String(value).padStart(2, '0')\n if (sameDay) return `${pad(date.getHours())}:${pad(date.getMinutes())}`\n if (date.getFullYear() === now.getFullYear()) return `${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n return `${String(date.getFullYear())}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n}\n\n/** Full timestamp for the reader header. */\nexport function longDate(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso\n return date.toLocaleString(undefined, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nexport function isFresh(iso: string, windowMs = DAY): boolean {\n const time = new Date(iso).getTime()\n return !Number.isNaN(time) && Date.now() - time < windowMs\n}\n\nexport function formatBytes(size: number): string {\n if (!Number.isFinite(size) || size <= 0) return ''\n if (size < 1024) return `${String(size)} B`\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`\n return `${(size / 1024 / 1024).toFixed(1)} MB`\n}\n", "import { createElement as h, useEffect, useRef, useState, type ReactNode } from 'react'\nimport type { Account, DraftAttachment } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { Field, Modal } from './components.js'\n\nexport interface ComposeInit {\n mode: 'new' | 'reply' | 'replyAll' | 'forward'\n to: string\n cc: string\n bcc: string\n subject: string\n html: string\n inReplyTo?: string\n references?: string\n draftId?: string\n attachments?: DraftAttachment[]\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nfunction readFileBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => {\n const result = String(reader.result ?? '')\n resolve(result.slice(result.indexOf(',') + 1))\n }\n reader.onerror = () => reject(new Error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${file.name}`))\n reader.readAsDataURL(file)\n })\n}\n\nexport function Composer({\n account,\n initial,\n onClose,\n onSent,\n}: {\n account: Account\n initial: ComposeInit\n onClose: () => void\n onSent: (message: string) => void\n}): ReactNode {\n const [to, setTo] = useState(initial.to)\n const [cc, setCc] = useState(initial.cc)\n const [bcc, setBcc] = useState(initial.bcc)\n const [subject, setSubject] = useState(initial.subject)\n const [showCc, setShowCc] = useState(initial.cc !== '' || initial.bcc !== '')\n const [attachments, setAttachments] = useState<DraftAttachment[]>(initial.attachments ?? [])\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [confirming, setConfirming] = useState(false)\n const [draftId, setDraftId] = useState(initial.draftId)\n const editor = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (editor.current !== null) editor.current.innerHTML = initial.html\n // The initial body is applied once; later edits own the DOM.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const html = (): string => editor.current?.innerHTML ?? ''\n const text = (): string => editor.current?.innerText ?? ''\n\n const exec = (command: string, value?: string): void => {\n editor.current?.focus()\n document.execCommand(command, false, value)\n }\n\n const addFiles = async (files: FileList | null): Promise<void> => {\n if (files === null || files.length === 0) return\n setError('')\n const next = [...attachments]\n let total = next.reduce((sum, file) => sum + file.data.length, 0)\n for (const file of Array.from(files)) {\n if (total + file.size > 8 * 1024 * 1024) {\n setError('\u9644\u4EF6\u5408\u8BA1\u4E0D\u80FD\u8D85\u8FC7 8 MB')\n break\n }\n const data = await readFileBase64(file)\n next.push({ filename: file.name, contentType: file.type || 'application/octet-stream', data })\n total += file.size\n }\n setAttachments(next)\n }\n\n const saveDraft = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const { draft } = await api.saveDraft(account.id, {\n ...(draftId === undefined ? {} : { id: draftId }),\n to,\n cc,\n bcc,\n subject,\n html: html(),\n attachments,\n ...(initial.inReplyTo === undefined ? {} : { inReplyTo: initial.inReplyTo }),\n ...(initial.references === undefined ? {} : { references: initial.references }),\n })\n setDraftId(draft.id)\n onSent('\u8349\u7A3F\u5DF2\u4FDD\u5B58')\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n\n const send = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.send(account.id, {\n to,\n cc,\n bcc,\n subject,\n html: html(),\n text: text(),\n attachments,\n ...(initial.inReplyTo === undefined ? {} : { inReplyTo: initial.inReplyTo }),\n ...(initial.references === undefined ? {} : { references: initial.references }),\n })\n if (draftId !== undefined) {\n try {\n await api.deleteDraft(draftId, account.id)\n } catch {\n // The sent message matters more than removing its draft.\n }\n }\n onSent('\u90AE\u4EF6\u5DF2\u53D1\u9001')\n onClose()\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n setConfirming(false)\n }\n }\n\n return h(\n Modal,\n {\n title:\n initial.mode === 'reply'\n ? '\u56DE\u590D'\n : initial.mode === 'replyAll'\n ? '\u5168\u90E8\u56DE\u590D'\n : initial.mode === 'forward'\n ? '\u8F6C\u53D1'\n : '\u5199\u90AE\u4EF6',\n onClose,\n wide: true,\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', alignItems: 'center', width: '100%' } },\n h('span', { className: 'small muted' }, `\u53D1\u4EF6\u4EBA ${account.email}`),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => void saveDraft(), disabled: busy }, '\u5B58\u8349\u7A3F'),\n confirming\n ? h(\n 'span',\n { style: { display: 'inline-flex', gap: '6px', alignItems: 'center' } },\n h('span', { className: 'small' }, '\u786E\u5B9A\u53D1\u9001\uFF1F'),\n h(\n 'button',\n { className: 'primary', onClick: () => void send(), disabled: busy },\n busy ? '\u53D1\u9001\u4E2D\u2026' : '\u786E\u5B9A',\n ),\n h('button', { className: 'ghost', onClick: () => setConfirming(false) }, '\u53D6\u6D88'),\n )\n : h(\n 'button',\n {\n className: 'primary',\n onClick: () => setConfirming(true),\n disabled: busy || to.trim() === '',\n },\n '\u53D1\u9001',\n ),\n ),\n },\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u6536\u4EF6\u4EBA' },\n h('input', {\n value: to,\n onChange: (event: { target: { value: string } }) => setTo(event.target.value),\n placeholder: 'a@example.com, b@example.com',\n }),\n ),\n h(\n Field,\n { label: '\u4E3B\u9898' },\n h('input', {\n value: subject,\n onChange: (event: { target: { value: string } }) => setSubject(event.target.value),\n }),\n ),\n ),\n showCc\n ? h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u6284\u9001' },\n h('input', {\n value: cc,\n onChange: (event: { target: { value: string } }) => setCc(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u5BC6\u9001' },\n h('input', {\n value: bcc,\n onChange: (event: { target: { value: string } }) => setBcc(event.target.value),\n }),\n ),\n )\n : h(\n 'button',\n { className: 'subtle small', style: { alignSelf: 'flex-start' }, onClick: () => setShowCc(true) },\n '\u6DFB\u52A0\u6284\u9001 / \u5BC6\u9001',\n ),\n h(\n 'div',\n { className: 'mailharbor-toolbar' },\n h('button', { onClick: () => exec('bold'), title: '\u52A0\u7C97' }, 'B'),\n h('button', { onClick: () => exec('italic'), title: '\u659C\u4F53' }, 'I'),\n h('button', { onClick: () => exec('underline'), title: '\u4E0B\u5212\u7EBF' }, 'U'),\n h('button', { onClick: () => exec('insertUnorderedList'), title: '\u65E0\u5E8F\u5217\u8868' }, '\u2022 \u5217\u8868'),\n h('button', { onClick: () => exec('insertOrderedList'), title: '\u6709\u5E8F\u5217\u8868' }, '1. \u5217\u8868'),\n h('button', { onClick: () => exec('formatBlock', 'blockquote'), title: '\u5F15\u7528' }, '\u5F15\u7528'),\n h(\n 'button',\n {\n onClick: () => {\n const url = window.prompt('\u94FE\u63A5\u5730\u5740\uFF08https://\u2026\uFF09')\n if (url !== null && /^https?:\\/\\//i.test(url)) exec('createLink', url)\n },\n title: '\u94FE\u63A5',\n },\n '\u94FE\u63A5',\n ),\n h('button', { onClick: () => exec('removeFormat'), title: '\u6E05\u9664\u683C\u5F0F' }, '\u6E05\u9664'),\n h('span', { className: 'spacer' }),\n h(\n 'label',\n { className: 'mailharbor-toggle small' },\n '\u9644\u4EF6',\n h('input', {\n type: 'file',\n multiple: true,\n style: { display: 'none' },\n onChange: (event: { target: { files: FileList | null; value: string } }) => {\n void addFiles(event.target.files)\n event.target.value = ''\n },\n }),\n ),\n ),\n attachments.length === 0\n ? null\n : h(\n 'div',\n { className: 'mailharbor-attachments', style: { padding: 0, border: 0 } },\n attachments.map((file, index) =>\n h(\n 'span',\n { className: 'mailharbor-attachment', key: `${file.filename}:${String(index)}` },\n h('span', { className: 'name' }, file.filename),\n h(\n 'button',\n {\n className: 'subtle',\n onClick: () => setAttachments(attachments.filter((_item, position) => position !== index)),\n },\n '\u2715',\n ),\n ),\n ),\n ),\n h('div', {\n className: 'mailharbor-editor',\n ref: editor,\n contentEditable: true,\n suppressContentEditableWarning: true,\n 'data-placeholder': '\u5199\u70B9\u4EC0\u4E48\u2026',\n spellCheck: true,\n }),\n )\n}\n", "import { createElement as h, type ReactNode } from 'react'\n\nconst PATHS: Record<string, ReactNode> = {\n refresh: h('path', { d: 'M20 11a8 8 0 1 0-2.3 5.7M20 5v6h-6' }),\n plus: h('path', { d: 'M12 5v14M5 12h14' }),\n compose: h('path', { d: 'M4 20h4l10.5-10.5a2.1 2.1 0 0 0-3-3L5 17v3zM13.5 6.5l3 3' }),\n archive: h(\n 'g',\n null,\n h('rect', { x: 3, y: 4, width: 18, height: 5, rx: 1.5 }),\n h('path', { d: 'M5 9v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V9M10 13h4' }),\n ),\n paperclip: h('path', {\n d: 'M20 11.5 12 19.5a5 5 0 0 1-7-7l8-8a3.3 3.3 0 0 1 4.7 4.7l-8 8a1.7 1.7 0 0 1-2.4-2.4l7.3-7.3',\n }),\n mail: h(\n 'g',\n null,\n h('rect', { x: 3, y: 5, width: 18, height: 14, rx: 2.5 }),\n h('path', { d: 'm4 7 7.1 5a1.6 1.6 0 0 0 1.8 0L20 7' }),\n ),\n search: h('path', { d: 'M11 18a7 7 0 1 0 0-14 7 7 0 0 0 0 14zM20 20l-4-4' }),\n reply: h('path', { d: 'M9 7 4 12l5 5M4 12h9a6 6 0 0 1 6 6v1' }),\n replyAll: h('path', { d: 'm9 7-5 5 5 5M14 7l-5 5 5 5M13 12h5a5 5 0 0 1 5 5' }),\n forward: h('path', { d: 'm15 7 5 5-5 5M20 12h-9a6 6 0 0 0-6 6v1' }),\n check: h('path', { d: 'm5 13 4 4L19 7' }),\n image: h(\n 'g',\n null,\n h('rect', { x: 3, y: 4, width: 18, height: 16, rx: 2 }),\n h('circle', { cx: 8.5, cy: 9.5, r: 1.5 }),\n h('path', { d: 'm4 18 5-5 4 4 3-3 4 4' }),\n ),\n close: h('path', { d: 'M6 6l12 12M18 6 6 18' }),\n chevronLeft: h('path', { d: 'm14 6-6 6 6 6' }),\n}\n\nexport function Icon({ name, size = 16 }: { name: keyof typeof PATHS | string; size?: number }): ReactNode {\n return h(\n 'svg',\n {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.7,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n 'aria-hidden': 'true',\n focusable: 'false',\n },\n PATHS[name] ?? null,\n )\n}\n", "import { createElement as h, useMemo, useState, type ReactNode } from 'react'\nimport type { Account, MessageDetail } from '../shared/types.js'\nimport { api } from './api.js'\nimport { Avatar, formatBytes, longDate } from './components.js'\nimport { Icon } from './icons.js'\n\nconst IFRAME_STYLE = `\n html, body { margin: 0; padding: 0; }\n body {\n font: 15px/1.75 -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n color: #171a21; background: #fff; padding: 20px 22px;\n overflow-wrap: anywhere;\n }\n img { max-width: 100%; height: auto; }\n table { max-width: 100%; border-collapse: collapse; }\n td, th { padding: 2px 6px; }\n a { color: #2f5bd3; }\n blockquote { margin: 0 0 0 12px; padding-left: 12px; border-left: 2px solid #d7dbe3; color: #565c67; }\n pre { white-space: pre-wrap; }\n`\n\nfunction csp(allowRemoteImages: boolean): string {\n return [\n \"default-src 'none'\",\n \"style-src 'unsafe-inline'\",\n 'font-src data:',\n `img-src data:${allowRemoteImages ? ' https: http:' : ''}`,\n \"form-action 'none'\",\n \"base-uri 'none'\",\n ].join('; ')\n}\n\nfunction srcDoc(detail: MessageDetail, allowRemoteImages: boolean): string {\n const html =\n detail.html !== null && detail.html !== '' ? detail.html : `<pre>${escapeHtml(detail.text)}</pre>`\n return `<!doctype html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"Content-Security-Policy\" content=\"${csp(allowRemoteImages)}\"><style>${IFRAME_STYLE}</style></head><body>${html}</body></html>`\n}\n\nfunction escapeHtml(value: string): string {\n return value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>')\n}\n\nfunction hasRemoteImages(detail: MessageDetail): boolean {\n return detail.html !== null && /<img[^>]+src=[\"']https?:/i.test(detail.html)\n}\n\nfunction addressLine(list: { name: string; address: string }[]): string {\n return list.map((item) => (item.name !== '' ? `${item.name} <${item.address}>` : item.address)).join('\u3001')\n}\n\nexport function Reader({\n detail,\n account,\n source,\n mailbox,\n onChanged,\n onReply,\n onClose,\n}: {\n detail: MessageDetail\n account: Account\n source: 'local' | 'server'\n mailbox: string\n onChanged: (patch: Partial<MessageDetail>) => void\n onReply: (mode: 'reply' | 'replyAll' | 'forward') => void\n onClose?: () => void\n}): ReactNode {\n const [plain, setPlain] = useState(false)\n const [loadImages, setLoadImages] = useState(false)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n const remoteImages = useMemo(() => hasRemoteImages(detail), [detail])\n const html = detail.html !== null && detail.html !== ''\n\n const toggleRead = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.setRead({\n id: detail.id,\n accountId: account.id,\n source,\n mailbox,\n read: detail.unread,\n })\n onChanged({ unread: !result.read })\n } catch (caught) {\n setError(caught instanceof Error ? caught.message : String(caught))\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor-reader' },\n h(\n 'div',\n { className: 'mailharbor-reader-head' },\n h(\n 'div',\n { className: 'mailharbor-reader-title' },\n onClose === undefined\n ? null\n : h(\n 'button',\n { className: 'ghost icon', onClick: onClose, 'aria-label': '\u8FD4\u56DE\u5217\u8868', title: '\u8FD4\u56DE\u5217\u8868' },\n h(Icon, { name: 'chevronLeft' }),\n ),\n h('h2', { style: { flex: 1 } }, detail.subject),\n h(\n 'button',\n {\n className: 'ghost icon',\n onClick: () => void toggleRead(),\n disabled: busy,\n title: detail.unread ? '\u6807\u4E3A\u5DF2\u8BFB' : '\u6807\u4E3A\u672A\u8BFB',\n 'aria-label': detail.unread ? '\u6807\u4E3A\u5DF2\u8BFB' : '\u6807\u4E3A\u672A\u8BFB',\n },\n h(Icon, { name: 'check' }),\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-meta' },\n h(\n 'span',\n { className: 'who' },\n h(Avatar, { email: detail.from.address, size: 22 }),\n h('strong', null, detail.from.name !== '' ? detail.from.name : detail.from.address),\n detail.from.name !== '' ? h('span', null, `<${detail.from.address}>`) : null,\n ),\n h('span', null, longDate(detail.date)),\n detail.backedUp === false ? h('span', { className: 'badge warn' }, '\u672A\u5907\u4EFD') : null,\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-meta' },\n h('span', null, `\u6536\u4EF6\u4EBA: ${addressLine(detail.to) || '\u2014'}`),\n detail.cc.length === 0 ? null : h('span', null, `\u6284\u9001: ${addressLine(detail.cc)}`),\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-actions' },\n h(\n 'button',\n { className: 'ghost', onClick: () => onReply('reply') },\n h(Icon, { name: 'reply' }),\n '\u56DE\u590D',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: () => onReply('replyAll') },\n h(Icon, { name: 'replyAll' }),\n '\u5168\u90E8\u56DE\u590D',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: () => onReply('forward') },\n h(Icon, { name: 'forward' }),\n '\u8F6C\u53D1',\n ),\n h('span', { className: 'spacer' }),\n html\n ? h(\n 'button',\n { className: 'subtle', onClick: () => setPlain(!plain) },\n plain ? '\u663E\u793A HTML' : '\u7EAF\u6587\u672C',\n )\n : null,\n remoteImages && !loadImages\n ? h(\n 'button',\n { className: 'subtle', onClick: () => setLoadImages(true) },\n h(Icon, { name: 'image', size: 14 }),\n '\u663E\u793A\u56FE\u7247',\n )\n : null,\n ),\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-body' },\n html && !plain\n ? h('iframe', {\n title: '\u90AE\u4EF6\u6B63\u6587',\n sandbox: '',\n srcDoc: srcDoc(detail, loadImages),\n referrerPolicy: 'no-referrer',\n })\n : h('pre', null, detail.text !== '' ? detail.text : '\uFF08\u65E0\u6B63\u6587\uFF09'),\n ),\n detail.attachments.length === 0\n ? null\n : h(\n 'div',\n { className: 'mailharbor-attachments' },\n detail.attachments.map((file) =>\n h(\n 'a',\n {\n className: 'mailharbor-attachment',\n key: file.id,\n href:\n source === 'server'\n ? api.attachmentUrl({\n accountId: account.id,\n source: 'server',\n mailbox,\n uid: detail.uid ?? '',\n part: file.id,\n })\n : api.attachmentUrl({\n accountId: account.id,\n source: 'local',\n emailId: detail.id,\n attachmentId: file.id,\n }),\n download: file.filename,\n title: file.filename,\n },\n h(Icon, { name: 'paperclip', size: 14 }),\n h('span', { className: 'name' }, file.filename),\n h('span', { className: 'muted small' }, formatBytes(file.size)),\n ),\n ),\n ),\n )\n}\n", "import { createElement as h, useEffect, useState, type ReactNode } from 'react'\nimport type { Account, AppState, SettingsView } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { AddAccountForm } from './account-form.js'\nimport { Avatar, ErrorBar, Field, Toggle } from './components.js'\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nexport function MailSettings(): ReactNode {\n const [state, setState] = useState<AppState | null>(null)\n const [settings, setSettings] = useState<SettingsView | null>(null)\n const [error, setError] = useState('')\n const [toast, setToast] = useState('')\n const [signature, setSignature] = useState('')\n const [markOnOpen, setMarkOnOpen] = useState(true)\n const [pollSeconds, setPollSeconds] = useState(60)\n const [listLimit, setListLimit] = useState(40)\n const [aiEnabled, setAiEnabled] = useState(true)\n const [aiProvider, setAiProvider] = useState('deepseek-account')\n const [aiModel, setAiModel] = useState('deepseek-flash')\n const [editing, setEditing] = useState<string | null>(null)\n const [checkResult, setCheckResult] = useState<string>('')\n const [adding, setAdding] = useState(false)\n const [tick, setTick] = useState(0)\n\n useEffect(() => {\n let cancelled = false\n Promise.all([api.state(), api.settings()])\n .then(([appState, view]) => {\n if (cancelled) return\n setState(appState)\n setSettings(view)\n setSignature(appState.settings.signature)\n setMarkOnOpen(view.read.markOnOpen)\n setPollSeconds(view.read.pollSeconds)\n setListLimit(view.render.listLimit)\n setAiEnabled(view.ai.enabled)\n setAiProvider(view.ai.provider)\n setAiModel(view.ai.model)\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n return () => {\n cancelled = true\n }\n }, [tick])\n\n const reload = (): void => setTick((value) => value + 1)\n\n const notify = (message: string): void => {\n setToast(message)\n window.setTimeout(() => {\n setToast('')\n }, 3000)\n }\n\n const saveGeneral = async (patch: Record<string, unknown>): Promise<void> => {\n try {\n const result = await api.saveSettings(patch)\n setSettings(result.settings)\n notify('\u8BBE\u7F6E\u5DF2\u4FDD\u5B58')\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const account = settings?.accounts.find((item) => item.id === settings.activeAccountId) ?? null\n\n if (state === null || settings === null) {\n return h('div', { className: 'mailharbor mailharbor-settings' }, error === '' ? '\u6B63\u5728\u52A0\u8F7D\u8BBE\u7F6E\u2026' : error)\n }\n\n return h(\n 'div',\n { className: 'mailharbor' },\n h(\n 'div',\n { className: 'mailharbor-settings' },\n h('h2', null, 'MailHarbor'),\n h('p', { className: 'small muted' }, '\u591A\u8D26\u53F7 IMAP/SMTP \u90AE\u7BB1\u3001\u672C\u5730\u5907\u4EFD\u3001AI \u4E0E\u4EFB\u52A1\u3002\u8BBE\u7F6E\u4F1A\u7ACB\u5373\u751F\u6548\u3002'),\n toast === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-ok)' } }, toast),\n error === '' ? null : h(ErrorBar, { message: error, onDismiss: () => setError('') }),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u8D26\u53F7'),\n settings.accounts.length === 0\n ? h(AddAccountForm, { onDone: () => reload() })\n : settings.accounts.map((item) =>\n h(AccountRow, {\n key: item.id,\n account: item,\n active: item.id === settings.activeAccountId,\n loggedIn: item.id === settings.activeAccountId ? state.loggedIn : undefined,\n editing: editing === item.id,\n checkResult: editing === item.id ? checkResult : '',\n onToggleEdit: () => {\n setEditing(editing === item.id ? null : item.id)\n setCheckResult('')\n },\n onActivate: async () => {\n await api.activateAccount(item.id)\n reload()\n },\n onLogin: async (password, remember) => {\n await api.login(item.id, password, remember)\n reload()\n },\n onLogout: async () => {\n await api.logout(item.id)\n reload()\n },\n onCheck: async () => {\n try {\n const result = await api.check(item.id)\n setCheckResult(\n `IMAP \u6B63\u5E38\uFF08${String(result.imap.mailboxes.length)} \u4E2A\u6587\u4EF6\u5939\uFF09\u00B7 SMTP ${result.smtp.ok ? '\u6B63\u5E38' : `\u5931\u8D25: ${result.smtp.error ?? ''}`}`,\n )\n } catch (caught) {\n setCheckResult(`\u5931\u8D25: ${errorText(caught)}`)\n }\n },\n onSave: async (patch) => {\n await api.updateAccount(item.id, patch)\n reload()\n },\n onRemove: async () => {\n if (!window.confirm(`\u79FB\u9664\u8D26\u53F7 ${item.email}\uFF1F\u672C\u5730\u6570\u636E\u76EE\u5F55\u4F1A\u4FDD\u7559\u3002`)) return\n await api.deleteAccount(item.id)\n reload()\n },\n }),\n ),\n adding\n ? h(AddAccountForm, {\n onDone: () => {\n setAdding(false)\n reload()\n },\n onCancel: () => setAdding(false),\n })\n : h('button', { className: 'ghost', onClick: () => setAdding(true) }, '+ \u6DFB\u52A0\u8D26\u53F7'),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u5199\u4FE1\u4E0E\u9605\u8BFB'),\n h(\n Field,\n { label: '\u7B7E\u540D\uFF08\u7EAF\u6587\u672C\uFF0C\u53D1\u9001\u65F6\u8FFD\u52A0\u5230\u6B63\u6587\u672B\u5C3E\uFF09' },\n h('textarea', {\n rows: 4,\n value: signature,\n onChange: (event: { target: { value: string } }) => setSignature(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '10px', alignItems: 'center', flexWrap: 'wrap' } },\n h('button', { className: 'ghost', onClick: () => void saveGeneral({ signature }) }, '\u4FDD\u5B58\u7B7E\u540D'),\n h(Toggle, {\n checked: markOnOpen,\n onChange: (value) => {\n setMarkOnOpen(value)\n void saveGeneral({ read: { markOnOpen: value } })\n },\n label: '\u6253\u5F00\u90AE\u4EF6\u65F6\u6807\u4E3A\u5DF2\u8BFB',\n }),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u5217\u8868\u6BCF\u9875\u6570\u91CF' },\n h('input', {\n type: 'number',\n min: 10,\n max: 200,\n value: listLimit,\n onChange: (event: { target: { value: string } }) => setListLimit(Number(event.target.value)),\n onBlur: () => void saveGeneral({ render: { listLimit } }),\n }),\n ),\n h(\n Field,\n { label: '\u672A\u8BFB\u89D2\u6807\u8F6E\u8BE2\uFF08\u79D2\uFF09' },\n h('input', {\n type: 'number',\n min: 15,\n max: 3600,\n value: pollSeconds,\n onChange: (event: { target: { value: string } }) => setPollSeconds(Number(event.target.value)),\n onBlur: () => void saveGeneral({ read: { pollSeconds } }),\n }),\n ),\n ),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, 'AI'),\n h(Toggle, {\n checked: aiEnabled,\n onChange: (value) => {\n setAiEnabled(value)\n void saveGeneral({ ai: { enabled: value } })\n },\n label: '\u542F\u7528 AI\uFF08\u6458\u8981\u3001\u8D77\u8349\u3001\u6DA6\u8272\u3001\u81EA\u7136\u8BED\u8A00\u641C\u7D22\uFF09',\n }),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: 'Provider' },\n h('input', {\n value: aiProvider,\n onChange: (event: { target: { value: string } }) => setAiProvider(event.target.value),\n onBlur: () => void saveGeneral({ ai: { provider: aiProvider } }),\n }),\n ),\n h(\n Field,\n { label: '\u6A21\u578B' },\n h('input', {\n value: aiModel,\n onChange: (event: { target: { value: string } }) => setAiModel(event.target.value),\n onBlur: () => void saveGeneral({ ai: { model: aiModel } }),\n }),\n ),\n ),\n h(\n 'p',\n { className: 'small muted' },\n 'AI \u8C03\u7528\u8D70 DSH \u81EA\u5DF1\u7684\u6A21\u578B\u670D\u52A1\uFF0C\u4E0D\u989D\u5916\u4FDD\u5B58\u5BC6\u94A5\u3002AI \u9762\u677F\u529F\u80FD\u5C06\u5728 v0.2 \u63D0\u4F9B\u3002',\n ),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u6570\u636E'),\n h(\n 'dl',\n { className: 'mailharbor-kv' },\n h('dt', null, '\u6570\u636E\u76EE\u5F55'),\n h('dd', null, settings.dataDir),\n h('dt', null, '\u914D\u7F6E\u6587\u4EF6'),\n h('dd', null, settings.configFile),\n h('dt', null, '\u5F53\u524D\u8D26\u53F7\u6570\u636E\u5E93'),\n h('dd', null, account === null ? '\u2014' : `${settings.dataDir}/accounts/${account.id}/mail.db`),\n h('dt', null, '\u63D2\u4EF6\u7248\u672C'),\n h('dd', null, state.version),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', flexWrap: 'wrap' } },\n account === null\n ? null\n : h(\n 'button',\n {\n className: 'ghost',\n onClick: async () => {\n try {\n const status = await api.startBackup(account.id)\n notify(status.status.message === '' ? '\u5907\u4EFD\u5DF2\u5F00\u59CB' : status.status.message)\n reload()\n } catch (caught) {\n setError(errorText(caught))\n }\n },\n },\n '\u7ACB\u5373\u5907\u4EFD\u5F53\u524D\u8D26\u53F7',\n ),\n ),\n ),\n ),\n )\n}\n\nfunction AccountRow({\n account,\n active,\n loggedIn,\n editing,\n checkResult,\n onToggleEdit,\n onActivate,\n onLogin,\n onLogout,\n onCheck,\n onSave,\n onRemove,\n}: {\n account: Account\n active: boolean\n loggedIn: boolean | undefined\n editing: boolean\n checkResult: string\n onToggleEdit: () => void\n onActivate: () => Promise<void>\n onLogin: (password: string, remember: boolean) => Promise<void>\n onLogout: () => Promise<void>\n onCheck: () => Promise<void>\n onSave: (patch: Record<string, unknown>) => Promise<void>\n onRemove: () => Promise<void>\n}): ReactNode {\n const [password, setPassword] = useState('')\n const [remember, setRemember] = useState(true)\n const [label, setLabel] = useState(account.label)\n const [username, setUsername] = useState(account.username)\n const [imapHost, setImapHost] = useState(account.imap.host)\n const [imapPort, setImapPort] = useState(String(account.imap.port))\n const [imapSecure, setImapSecure] = useState(account.imap.secure)\n const [smtpHost, setSmtpHost] = useState(account.smtp.host)\n const [smtpPort, setSmtpPort] = useState(String(account.smtp.port))\n const [smtpSecure, setSmtpSecure] = useState(account.smtp.secure)\n const [fromName, setFromName] = useState(account.smtp.fromName)\n const [busy, setBusy] = useState(false)\n\n useEffect(() => {\n setLabel(account.label)\n setUsername(account.username)\n setImapHost(account.imap.host)\n setImapPort(String(account.imap.port))\n setImapSecure(account.imap.secure)\n setSmtpHost(account.smtp.host)\n setSmtpPort(String(account.smtp.port))\n setSmtpSecure(account.smtp.secure)\n setFromName(account.smtp.fromName)\n }, [account])\n\n const wrap = async (operation: () => Promise<void>): Promise<void> => {\n setBusy(true)\n try {\n await operation()\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor-card', style: { background: 'var(--m-bg-1)' } },\n h(\n 'div',\n { className: 'mailharbor-account-row' },\n h(Avatar, { email: account.email, size: 30 }),\n h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', minWidth: 0 } },\n h('strong', null, account.label),\n h('span', { className: 'small muted' }, account.email),\n ),\n active ? h('span', { className: 'badge ok' }, '\u5F53\u524D\u8D26\u53F7') : null,\n loggedIn === false ? h('span', { className: 'badge warn' }, '\u672A\u767B\u5F55') : null,\n h('span', { className: 'spacer' }),\n active\n ? null\n : h('button', { className: 'ghost small', onClick: () => void wrap(onActivate) }, '\u8BBE\u4E3A\u5F53\u524D'),\n h('button', { className: 'ghost small', onClick: () => void wrap(onCheck) }, '\u68C0\u67E5\u8FDE\u63A5'),\n h('button', { className: 'ghost small', onClick: onToggleEdit }, editing ? '\u6536\u8D77' : '\u7F16\u8F91'),\n ),\n editing\n ? h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u663E\u793A\u540D\u79F0' },\n h('input', {\n value: label,\n onChange: (event: { target: { value: string } }) => setLabel(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u767B\u5F55\u7528\u6237\u540D' },\n h('input', {\n value: username,\n onChange: (event: { target: { value: string } }) => setUsername(event.target.value),\n }),\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'IMAP \u4E3B\u673A' },\n h('input', {\n value: imapHost,\n onChange: (event: { target: { value: string } }) => setImapHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: imapPort,\n onChange: (event: { target: { value: string } }) => setImapPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: imapSecure, onChange: setImapSecure, label: 'TLS' }),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'SMTP \u4E3B\u673A' },\n h('input', {\n value: smtpHost,\n onChange: (event: { target: { value: string } }) => setSmtpHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: smtpPort,\n onChange: (event: { target: { value: string } }) => setSmtpPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: smtpSecure, onChange: setSmtpSecure, label: 'TLS' }),\n ),\n h(\n Field,\n { label: '\u53D1\u4EF6\u4EBA\u540D\u79F0' },\n h('input', {\n value: fromName,\n onChange: (event: { target: { value: string } }) => setFromName(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', alignItems: 'center', flexWrap: 'wrap' } },\n h(\n 'button',\n {\n className: 'primary small',\n disabled: busy,\n onClick: () =>\n void wrap(async () => {\n await onSave({\n label,\n username,\n imap: { host: imapHost, port: Number(imapPort) || 993, secure: imapSecure },\n smtp: { host: smtpHost, port: Number(smtpPort) || 465, secure: smtpSecure, fromName },\n })\n }),\n },\n '\u4FDD\u5B58\u8D26\u53F7',\n ),\n h(\n 'button',\n {\n className: 'ghost small danger',\n onClick: () => void wrap(onRemove),\n },\n '\u79FB\u9664\u8D26\u53F7',\n ),\n ),\n h('hr', { style: { border: 0, borderTop: '1px solid var(--m-line)', width: '100%' } }),\n h(\n Field,\n { label: '\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801\uFF08\u4E0D\u5199\u5165\u914D\u7F6E\u6587\u4EF6\uFF09' },\n h('input', {\n type: 'password',\n value: password,\n onChange: (event: { target: { value: string } }) => setPassword(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', alignItems: 'center' } },\n h(Toggle, { checked: remember, onChange: setRemember, label: '\u8BB0\u4F4F\u5BC6\u7801' }),\n h(\n 'button',\n {\n className: 'primary small',\n disabled: busy || password === '',\n onClick: () =>\n void wrap(async () => {\n await onLogin(password, remember)\n setPassword('')\n }),\n },\n '\u767B\u5F55',\n ),\n h('button', { className: 'ghost small', onClick: () => void wrap(onLogout) }, '\u9000\u51FA\u767B\u5F55'),\n ),\n checkResult === '' ? null : h('div', { className: 'small muted' }, checkResult),\n )\n : null,\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["h", "import_react", "import_react", "import_react", "h", "h", "import_react", "errorText", "h", "import_react", "h", "import_react", "h", "errorText", "query", "items", "h", "import_react", "errorText", "h"]
|
|
4
|
+
"sourcesContent": ["import styles from './styles.css'\nimport { MailIcon } from './icon.js'\nimport { MailPanel } from './panel.js'\nimport { MailSettings } from './settings.js'\nimport type { ClientContext } from './dsh.js'\n\n/** Keep in sync with package.json (`npm run version` does this). */\nexport const VERSION = '0.3.0'\n\n/** Services required by this browser plugin. */\nexport const inject = ['slots']\n\nconst PANEL_ID = 'mailharbor'\nconst STYLE_ID = 'mailharbor-style'\n\nfunction ensureStyles(): void {\n if (document.getElementById(STYLE_ID) !== null) return\n const element = document.createElement('style')\n element.id = STYLE_ID\n element.textContent = styles\n document.head.append(element)\n}\n\n/**\n * MailHarbor browser half: a sidebar panel, the panel page in the main slot,\n * and a settings section. All three read the same same-origin HTTP API.\n */\nexport function apply(ctx: ClientContext): void {\n ensureStyles()\n ctx.slots.inject('main', () => ctx.slots.register({ name: 'main', key: PANEL_ID }, MailPanel))\n ctx.slots.inject('settings.section', () =>\n ctx.slots.register(\n {\n name: 'settings.section',\n id: PANEL_ID,\n order: 35,\n label: () => 'MailHarbor',\n },\n MailSettings,\n ),\n )\n ctx.slots.inject('sidebar.panellist', () =>\n ctx.slots.register(\n {\n name: 'sidebar.panellist',\n id: PANEL_ID,\n order: 20,\n label: 'MailHarbor',\n },\n MailIcon,\n ),\n )\n}\n\nexport { PANEL_ID }\n", "/* MailHarbor panel + settings.\n Tokens come from the DSH shell (dark by default); fallbacks match the\n default dark theme so the panel also renders in a bare host page.\n Component rules are all scoped under `.mailharbor` and the generic element\n reset lives in `:where()` so it cannot outrank a component class. */\n\n.mailharbor {\n --m-bg: var(--dsw-alias-bg-base, #151517);\n --m-bg-1: var(--dsw-alias-bg-layer-1, #232324);\n --m-bg-2: var(--dsw-alias-bg-layer-2, #2c2c2e);\n --m-bg-3: var(--dsw-alias-bg-layer-3, #353638);\n --m-line: var(--dsw-alias-border-l2, #ffffff1f);\n --m-line-soft: var(--dsw-alias-border-l1, #ffffff0f);\n --m-line-strong: var(--dsw-alias-border-l3, #ffffff29);\n --m-text: var(--dsw-alias-label-primary, #f9fafb);\n --m-text-2: var(--dsw-alias-label-secondary, #cfd3d6);\n --m-text-3: var(--dsw-alias-label-tertiary, #adb2b8);\n --m-caption: var(--dsw-alias-label-caption, #81858c);\n --m-accent: #5686fe;\n --m-accent-soft: rgba(86, 134, 254, 0.14);\n --m-primary-bg: var(--dsw-alias-brand-primary, #f9fafb);\n --m-primary-fg: var(--dsw-alias-label-primary-foreground, #0f1115);\n --m-hover: var(--dsw-alias-interactive-bg-hover, #ffffff14);\n --m-danger: #f25a5a;\n --m-ok: #3fbf7f;\n --m-warn: var(--dsw-alias-state-warn-label, #dd8629);\n --m-radius: 8px;\n --m-shadow: 0 18px 60px rgba(0, 0, 0, 0.5);\n\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--m-bg);\n color: var(--m-text);\n font-size: 13px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n}\n\n.mailharbor *,\n.mailharbor *::before,\n.mailharbor *::after {\n box-sizing: border-box;\n}\n\n/* ---------- base controls ---------- */\n\n.mailharbor :where(button) {\n font: inherit;\n color: inherit;\n background: transparent;\n border: 0;\n margin: 0;\n cursor: pointer;\n}\n\n.mailharbor button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 30px;\n padding: 0 12px;\n border-radius: var(--m-radius);\n border: 1px solid transparent;\n color: var(--m-text-2);\n font-size: 12.5px;\n font-weight: 500;\n white-space: nowrap;\n transition:\n background 120ms ease,\n color 120ms ease,\n border-color 120ms ease;\n}\n\n.mailharbor button:hover:not(:disabled) {\n background: var(--m-hover);\n color: var(--m-text);\n}\n\n.mailharbor button:disabled {\n opacity: 0.45;\n cursor: default;\n}\n\n.mailharbor button.primary {\n background: var(--m-primary-bg);\n color: var(--m-primary-fg);\n border-color: transparent;\n}\n\n.mailharbor button.primary:hover:not(:disabled) {\n background: var(--m-primary-bg);\n filter: brightness(0.94);\n color: var(--m-primary-fg);\n}\n\n.mailharbor button.ghost {\n border-color: var(--m-line);\n color: var(--m-text-2);\n}\n\n.mailharbor button.ghost:hover:not(:disabled) {\n border-color: var(--m-line-strong);\n color: var(--m-text);\n}\n\n.mailharbor button.subtle {\n color: var(--m-text-3);\n padding: 0 8px;\n}\n\n.mailharbor button.icon {\n width: 30px;\n padding: 0;\n}\n\n.mailharbor button.danger {\n color: var(--m-danger);\n}\n\n.mailharbor input,\n.mailharbor select,\n.mailharbor textarea {\n font: inherit;\n color: var(--m-text);\n background: var(--m-bg-1);\n border: 1px solid var(--m-line);\n border-radius: var(--m-radius);\n padding: 0 10px;\n height: 32px;\n min-width: 0;\n}\n\n.mailharbor textarea {\n height: auto;\n padding: 8px 10px;\n resize: vertical;\n line-height: 1.6;\n}\n\n.mailharbor select {\n padding-right: 26px;\n appearance: none;\n background-image:\n linear-gradient(45deg, transparent 50%, var(--m-text-3) 50%),\n linear-gradient(135deg, var(--m-text-3) 50%, transparent 50%);\n background-position:\n calc(100% - 15px) 14px,\n calc(100% - 10px) 14px;\n background-size:\n 5px 5px,\n 5px 5px;\n background-repeat: no-repeat;\n}\n\n.mailharbor ::placeholder {\n color: var(--m-caption);\n}\n\n.mailharbor input:focus-visible,\n.mailharbor select:focus-visible,\n.mailharbor textarea:focus-visible,\n.mailharbor button:focus-visible,\n.mailharbor [contenteditable='true']:focus-visible {\n outline: 2px solid rgba(86, 134, 254, 0.55);\n outline-offset: -1px;\n}\n\n.mailharbor .spacer {\n flex: 1;\n}\n\n.mailharbor .muted {\n color: var(--m-text-3);\n}\n\n.mailharbor .small {\n font-size: 12px;\n}\n\n.mailharbor .badge {\n display: inline-flex;\n align-items: center;\n height: 18px;\n padding: 0 6px;\n border-radius: 999px;\n font-size: 10.5px;\n font-weight: 500;\n background: var(--m-bg-3);\n color: var(--m-text-2);\n}\n\n.mailharbor .badge.ok {\n background: rgba(63, 191, 127, 0.16);\n color: var(--m-ok);\n}\n\n.mailharbor .badge.warn {\n background: rgba(221, 134, 41, 0.16);\n color: var(--m-warn);\n}\n\n.mailharbor .error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n color: var(--m-danger);\n background: rgba(242, 90, 90, 0.1);\n border-bottom: 1px solid rgba(242, 90, 90, 0.2);\n font-size: 12.5px;\n}\n\n/* ---------- shell ---------- */\n\n.mailharbor-topbar {\n display: flex;\n align-items: center;\n gap: 10px;\n height: 52px;\n padding: 0 14px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-account {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n max-width: 220px;\n padding: 4px 8px 4px 4px;\n border-radius: 999px;\n border: 1px solid transparent;\n cursor: default;\n}\n\n.mailharbor-account:hover {\n background: var(--m-hover);\n}\n\n.mailharbor-account .name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.mailharbor-account select {\n height: 26px;\n background: transparent;\n border-color: transparent;\n font-weight: 500;\n}\n\n.mailharbor-body {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.mailharbor-list {\n display: flex;\n flex-direction: column;\n width: 360px;\n flex: none;\n border-right: 1px solid var(--m-line-soft);\n min-height: 0;\n}\n\n.mailharbor-reader {\n flex: 1;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n@media (max-width: 1000px) {\n .mailharbor-list {\n width: 300px;\n }\n}\n\n.mailharbor-narrow .mailharbor-body[data-mode='reader'] .mailharbor-list {\n display: none;\n}\n\n.mailharbor-narrow .mailharbor-body[data-mode='list'] .mailharbor-reader {\n display: none;\n}\n\n/* ---------- segmented control ---------- */\n\n.mailharbor-segment {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 2px;\n border-radius: 9px;\n background: var(--m-bg-2);\n}\n\n.mailharbor-segment button {\n height: 26px;\n padding: 0 12px;\n border-radius: 7px;\n color: var(--m-text-3);\n font-size: 12px;\n}\n\n.mailharbor-segment button:hover:not(.active) {\n color: var(--m-text-2);\n background: transparent;\n}\n\n.mailharbor-segment button.active {\n background: var(--m-bg-3);\n color: var(--m-text);\n}\n\n/* ---------- list ---------- */\n\n.mailharbor-filters {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-filters select {\n width: 128px;\n flex: none;\n font-size: 12px;\n}\n\n.mailharbor-filters input[type='search'] {\n flex: 1;\n height: 30px;\n font-size: 12.5px;\n}\n\n.mailharbor-rows {\n flex: 1;\n overflow: auto;\n min-height: 0;\n}\n\n.mailharbor-row {\n display: flex;\n flex-direction: column;\n gap: 3px;\n width: 100%;\n padding: 10px 14px;\n border: 0;\n border-bottom: 1px solid var(--m-line-soft);\n border-left: 2px solid transparent;\n border-radius: 0;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}\n\n.mailharbor-row:hover {\n background: var(--m-hover);\n}\n\n.mailharbor-row.selected {\n background: var(--m-accent-soft);\n border-left-color: var(--m-accent);\n}\n\n.mailharbor-row .line-1,\n.mailharbor-row .line-2 {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n width: 100%;\n}\n\n.mailharbor-row .from {\n font-weight: 600;\n font-size: 12.5px;\n color: var(--m-text-2);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mailharbor-row .date {\n margin-left: auto;\n color: var(--m-caption);\n font-size: 11px;\n flex: none;\n}\n\n.mailharbor-row .subject {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--m-text-2);\n font-size: 12.5px;\n}\n\n.mailharbor-row .snippet {\n color: var(--m-caption);\n font-size: 11.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n}\n\n.mailharbor-row.unread .from,\n.mailharbor-row.unread .subject {\n color: var(--m-text);\n}\n\n.mailharbor-row .dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--m-accent);\n flex: none;\n}\n\n.mailharbor-row .paperclip {\n color: var(--m-caption);\n flex: none;\n display: inline-flex;\n}\n\n.mailharbor-list-foot {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-top: 1px solid var(--m-line-soft);\n color: var(--m-text-3);\n font-size: 11.5px;\n flex: none;\n}\n\n.mailharbor-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 48px 24px;\n color: var(--m-text-3);\n text-align: center;\n}\n\n.mailharbor-empty svg {\n opacity: 0.5;\n}\n\n.mailharbor-empty .title {\n color: var(--m-text-2);\n font-size: 13px;\n font-weight: 500;\n}\n\n/* ---------- reader ---------- */\n\n.mailharbor-reader-head {\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.mailharbor-reader-title {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.mailharbor-reader-title h2 {\n margin: 0;\n font-size: 17px;\n line-height: 1.35;\n font-weight: 600;\n letter-spacing: -0.01em;\n word-break: break-word;\n}\n\n.mailharbor-reader-meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px 10px;\n color: var(--m-text-3);\n font-size: 12px;\n}\n\n.mailharbor-reader-meta .who {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: var(--m-text-2);\n}\n\n.mailharbor-reader-meta .who strong {\n color: var(--m-text);\n font-weight: 600;\n}\n\n.mailharbor-reader-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.mailharbor-reader-body {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n padding: 14px 18px 18px;\n background: var(--m-bg-2);\n}\n\n.mailharbor-reader-body iframe {\n flex: 1;\n width: 100%;\n border: 0;\n border-radius: 10px;\n background: #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n\n.mailharbor-reader-body pre {\n flex: 1;\n overflow: auto;\n margin: 0;\n padding: 20px 22px;\n white-space: pre-wrap;\n word-break: break-word;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n color: #171a21;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12.5px;\n line-height: 1.7;\n}\n\n.mailharbor-attachments {\n padding: 10px 18px;\n border-top: 1px solid var(--m-line-soft);\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n flex: none;\n background: var(--m-bg);\n}\n\n.mailharbor-attachment {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n height: 30px;\n padding: 0 10px;\n border: 1px solid var(--m-line);\n border-radius: var(--m-radius);\n font-size: 12px;\n text-decoration: none;\n color: var(--m-text-2);\n max-width: 260px;\n background: var(--m-bg-1);\n}\n\n.mailharbor-attachment:hover {\n border-color: var(--m-line-strong);\n color: var(--m-text);\n}\n\n.mailharbor-attachment .name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ---------- AI summary ---------- */\n\n.mailharbor-divider {\n width: 1px;\n height: 18px;\n margin: 0 4px;\n background: var(--m-line);\n}\n\n.mailharbor-summary {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.mailharbor-summary section h4 {\n margin: 0 0 6px;\n font-size: 11.5px;\n font-weight: 600;\n color: var(--m-text-3);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n\n.mailharbor-summary section p {\n margin: 0;\n white-space: pre-wrap;\n line-height: 1.75;\n color: var(--m-text);\n}\n\n/* ---------- modal / forms ---------- */\n\n.mailharbor-portal {\n position: fixed;\n inset: 0;\n z-index: 80;\n height: auto;\n background: transparent;\n pointer-events: none;\n}\n\n.mailharbor-portal .mailharbor-modal-mask {\n pointer-events: auto;\n}\n\n.mailharbor-modal-mask {\n position: fixed;\n inset: 0;\n z-index: 60;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: rgba(0, 0, 0, 0.55);\n backdrop-filter: blur(2px);\n}\n\n.mailharbor-modal {\n display: flex;\n flex-direction: column;\n width: min(720px, 100%);\n max-height: 86vh;\n overflow: hidden;\n border: 1px solid var(--m-line);\n border-radius: 14px;\n background: var(--m-bg-1);\n color: var(--m-text);\n box-shadow: var(--m-shadow);\n}\n\n.mailharbor-modal > header {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 52px;\n padding: 0 14px 0 18px;\n border-bottom: 1px solid var(--m-line-soft);\n font-size: 14px;\n font-weight: 600;\n}\n\n.mailharbor-modal .content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 18px;\n overflow: auto;\n}\n\n.mailharbor-modal > footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 18px;\n border-top: 1px solid var(--m-line-soft);\n}\n\n.mailharbor-field {\n display: flex;\n flex-direction: column;\n gap: 5px;\n min-width: 0;\n}\n\n.mailharbor-field > label {\n font-size: 11.5px;\n color: var(--m-text-3);\n}\n\n.mailharbor-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n\n.mailharbor-grid.three {\n grid-template-columns: 2fr 90px auto;\n align-items: end;\n}\n\n.mailharbor-toggle {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n color: var(--m-text-2);\n font-size: 12.5px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.mailharbor-toggle input[type='checkbox'] {\n width: 14px;\n height: 14px;\n accent-color: var(--m-accent);\n}\n\n/* ---------- composer ---------- */\n\n.mailharbor-toolbar {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-wrap: wrap;\n padding: 6px;\n border: 1px solid var(--m-line-soft);\n border-bottom: 0;\n border-radius: 10px 10px 0 0;\n background: var(--m-bg-2);\n}\n\n.mailharbor-toolbar button {\n height: 26px;\n padding: 0 9px;\n border-radius: 6px;\n color: var(--m-text-2);\n font-size: 12px;\n}\n\n.mailharbor-toolbar button:hover {\n background: var(--m-bg-3);\n color: var(--m-text);\n}\n\n.mailharbor-editor {\n min-height: 240px;\n max-height: 44vh;\n overflow: auto;\n padding: 14px 16px;\n border: 1px solid var(--m-line-soft);\n border-radius: 0 0 10px 10px;\n background: #fff;\n color: #171a21;\n outline: none;\n font-size: 13.5px;\n line-height: 1.7;\n}\n\n.mailharbor-editor:empty::before {\n content: attr(data-placeholder);\n color: #9aa0ab;\n}\n\n/* ---------- inline confirm ---------- */\n\n.mailharbor-confirm {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 8px;\n border: 1px solid var(--m-line);\n background: var(--m-bg-2);\n color: var(--m-text-2);\n font-size: 12.5px;\n}\n\n/* ---------- settings ---------- */\n\n.mailharbor-settings {\n padding: 20px 24px 48px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n max-width: 880px;\n}\n\n.mailharbor-settings h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n letter-spacing: -0.01em;\n}\n\n.mailharbor-settings h3 {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--m-text-3);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n\n.mailharbor-card {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n border: 1px solid var(--m-line-soft);\n border-radius: 12px;\n background: var(--m-bg-1);\n}\n\n.mailharbor-account-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.mailharbor-account-row .meta {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.mailharbor-account-row .meta strong {\n font-weight: 600;\n}\n\n.mailharbor-account-row .meta span {\n color: var(--m-text-3);\n font-size: 11.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mailharbor .avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n border-radius: 50%;\n background: var(--m-accent-soft);\n color: var(--m-accent);\n font-weight: 600;\n}\n\n.mailharbor-log {\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--m-bg);\n border: 1px solid var(--m-line-soft);\n color: var(--m-text-2);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n line-height: 1.6;\n max-height: 220px;\n overflow: auto;\n white-space: pre-wrap;\n}\n\n.mailharbor-kv {\n display: grid;\n grid-template-columns: minmax(120px, 170px) 1fr;\n gap: 6px 14px;\n font-size: 12px;\n margin: 0;\n}\n\n.mailharbor-kv dt {\n color: var(--m-text-3);\n}\n\n.mailharbor-kv dd {\n margin: 0;\n color: var(--m-text-2);\n word-break: break-all;\n}\n\n.mailharbor hr {\n border: 0;\n border-top: 1px solid var(--m-line-soft);\n margin: 2px 0;\n}\n", "import { createElement as h, useEffect, useState, type ReactNode } from 'react'\nimport { api } from './api.js'\n\n/**\n * Sidebar entry: an envelope plus an unread count.\n *\n * The shell renders this inside an 18\u00D718 glyph slot and hides it from\n * assistive tech, so the badge must stay compact and must not add layout.\n * It uses the accent blue rather than `--dsw-alias-brand-primary`, which is\n * near-white in the dark theme and would render as an empty white blob.\n */\nexport function MailIcon(): ReactNode {\n const [unread, setUnread] = useState(0)\n\n useEffect(() => {\n let cancelled = false\n let timer: number | undefined\n const poll = async (): Promise<void> => {\n try {\n const result = await api.unread()\n if (!cancelled) setUnread(result.unread)\n } catch {\n // A logged-out or offline account simply shows no badge.\n }\n }\n void poll()\n const schedule = (): void => {\n if (cancelled) return\n timer = window.setTimeout(() => {\n void poll().finally(schedule)\n }, 60_000)\n }\n schedule()\n return () => {\n cancelled = true\n if (timer !== undefined) window.clearTimeout(timer)\n }\n }, [])\n\n return h(\n 'span',\n {\n style: {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '18px',\n height: '18px',\n boxSizing: 'border-box',\n },\n },\n h(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': 'true' },\n h('rect', { x: 2.5, y: 5, width: 19, height: 14, rx: 2.5, stroke: 'currentColor', strokeWidth: 1.7 }),\n h('path', {\n d: 'M3.5 7l7.6 5.4a1.6 1.6 0 0 0 1.8 0L20.5 7',\n stroke: 'currentColor',\n strokeWidth: 1.7,\n strokeLinecap: 'round',\n }),\n ),\n unread > 0\n ? h(\n 'span',\n {\n style: {\n position: 'absolute',\n right: '-5px',\n bottom: '-3px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxSizing: 'border-box',\n minWidth: '13px',\n height: '13px',\n padding: '0 3px',\n borderRadius: '999px',\n background: '#5686fe',\n color: '#fff',\n fontSize: '9px',\n fontWeight: 600,\n lineHeight: '13px',\n zIndex: 1,\n letterSpacing: '-0.01em',\n fontVariantNumeric: 'tabular-nums',\n boxShadow: '0 0 0 2px var(--dsw-alias-bg-base, #151517)',\n pointerEvents: 'none',\n },\n },\n unread > 99 ? '99+' : String(unread),\n )\n : null,\n )\n}\n", "import type {\n Account,\n AppState,\n AttachmentMeta,\n BackupStatus,\n Draft,\n MessageDetail,\n MessageSummary,\n NewAccountInput,\n Page,\n SendResult,\n SettingsView,\n} from '../shared/types.js'\n\n/** Same-origin API root: works in the Web GUI and through the desktop shell. */\nconst BASE = new URL('mail-plugin/api/', document.baseURI).href\n\nexport class ApiError extends Error {\n readonly status: number\n\n constructor(message: string, status: number) {\n super(message)\n this.status = status\n this.name = 'ApiError'\n }\n}\n\nasync function request<T>(path: string, init: RequestInit = {}): Promise<T> {\n const response = await fetch(new URL(path, BASE), {\n credentials: 'same-origin',\n ...init,\n headers: {\n accept: 'application/json',\n ...(init.body === undefined ? {} : { 'content-type': 'application/json' }),\n ...(init.headers ?? {}),\n },\n })\n if (!response.ok) {\n let message = response.statusText\n try {\n const body: unknown = await response.json()\n if (\n body !== null &&\n typeof body === 'object' &&\n typeof (body as { error?: unknown }).error === 'string'\n ) {\n message = (body as { error: string }).error\n }\n } catch {\n // Keep the status text.\n }\n throw new ApiError(message, response.status)\n }\n return (await response.json()) as T\n}\n\nfunction query(params: Record<string, string | number | undefined | null>): string {\n const search = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null && value !== '') search.set(key, String(value))\n }\n const text = search.toString()\n return text === '' ? '' : `?${text}`\n}\n\nexport interface AiStatus {\n available: boolean\n enabled: boolean\n provider: string\n model: string\n styleUpdatedAt: string\n styleSampleCount: number\n error?: string\n}\n\nexport interface StyleProfile {\n profile: string\n updatedAt: string\n sampleCount: number\n}\n\nexport interface AiModels {\n providers: { provider: string; name: string; models: { id: string; name: string }[] }[]\n}\n\nexport interface SummaryBlock {\n title: string\n body: string\n}\n\nexport interface ListParams {\n accountId?: string | null\n source: 'local' | 'server'\n mailbox: string\n query?: string\n offset?: number\n limit?: number\n}\n\nexport const api = {\n state: (): Promise<AppState> => request<AppState>('state'),\n\n folders: (params: { accountId?: string | null; source: 'local' | 'server' }) =>\n request<{ items: { name: string; label?: string; count: number }[] }>(`folders${query(params)}`),\n\n messages: (params: ListParams) => request<Page<MessageSummary>>(`messages${query({ ...params })}`),\n\n message: (params: { id: string; accountId?: string | null; source: 'local' | 'server'; mailbox: string }) =>\n request<MessageDetail>(`messages/${encodeURIComponent(params.id)}${query({ ...params })}`),\n\n setRead: (params: {\n id: string\n accountId?: string | null\n source: 'local' | 'server'\n mailbox: string\n read: boolean\n }) =>\n request<{ ok: true; read: boolean }>(\n `messages/${encodeURIComponent(params.id)}/read${query({\n accountId: params.accountId ?? null,\n source: params.source,\n mailbox: params.mailbox,\n })}`,\n { method: 'POST', body: JSON.stringify({ read: params.read }) },\n ),\n\n attachmentUrl: (params: Record<string, string | number | undefined | null>) =>\n new URL(`attachment${query(params)}`, BASE).href,\n\n drafts: (accountId?: string | null) =>\n request<{ items: Draft[] }>(`drafts${query({ accountId: accountId ?? null })}`),\n\n saveDraft: (accountId: string | null, draft: Partial<Draft>) =>\n request<{ draft: Draft }>(`drafts${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n body: JSON.stringify(draft),\n }),\n\n deleteDraft: (id: string, accountId?: string | null) =>\n request<{ ok: true }>(`drafts/${encodeURIComponent(id)}${query({ accountId: accountId ?? null })}`, {\n method: 'DELETE',\n }),\n\n send: (accountId: string | null, payload: Record<string, unknown>) =>\n request<{ ok: true; result: SendResult }>(`send${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n unread: (accountId?: string | null) =>\n request<{ unread: number; source: string }>(`unread${query({ accountId: accountId ?? null })}`),\n\n addAccount: (input: NewAccountInput & { connect?: boolean; remember?: boolean }) =>\n request<{ account: Account; state: AppState }>('accounts', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n\n updateAccount: (id: string, patch: Record<string, unknown>) =>\n request<{ account: Account }>(`accounts/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(patch),\n }),\n\n deleteAccount: (id: string) =>\n request<{ ok: true }>(`accounts/${encodeURIComponent(id)}`, { method: 'DELETE' }),\n\n activateAccount: (id: string) =>\n request<{ ok: true }>(`accounts/${encodeURIComponent(id)}/activate`, { method: 'POST' }),\n\n login: (id: string, password: string, remember: boolean) =>\n request<{ ok: true; stored: boolean }>(`accounts/${encodeURIComponent(id)}/login`, {\n method: 'POST',\n body: JSON.stringify({ password, remember }),\n }),\n\n logout: (id: string) =>\n request<{ ok: true }>(`accounts/${encodeURIComponent(id)}/logout`, { method: 'POST' }),\n\n check: (id: string) =>\n request<{\n ok: true\n imap: { ok: true; mailboxes: { name: string; count: number }[] }\n smtp: { ok: boolean; error?: string }\n }>(`accounts/${encodeURIComponent(id)}/check`, { method: 'POST' }),\n\n aiStatus: (accountId?: string | null) =>\n request<AiStatus>(`ai/status${query({ accountId: accountId ?? null })}`),\n\n aiModels: () => request<AiModels>('ai/models'),\n\n aiSummary: (payload: {\n accountId?: string | null\n source: 'local' | 'server'\n id: string\n mailbox: string\n }) =>\n request<{ summary: string; blocks: SummaryBlock[] }>('ai/summary', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiReply: (payload: {\n accountId?: string | null\n source: 'local' | 'server'\n id: string\n mailbox: string\n instruction?: string\n language?: 'zh' | 'en'\n }) =>\n request<{ text: string; html: string }>('ai/reply', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiTranslate: (payload: { accountId?: string | null; html: string; target: 'zh' | 'en' }) =>\n request<{ text: string; html: string }>('ai/translate', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiStyle: (accountId?: string | null) =>\n request<{ style: StyleProfile | null }>(`ai/style${query({ accountId: accountId ?? null })}`),\n\n aiSaveStyle: (accountId: string | null, profile: string) =>\n request<{ style: StyleProfile }>(`ai/style${query({ accountId: accountId ?? null })}`, {\n method: 'PUT',\n body: JSON.stringify({ accountId, profile }),\n }),\n\n aiLearnStyle: (accountId?: string | null) =>\n request<{ style: StyleProfile }>(`ai/style/learn${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n body: JSON.stringify({ accountId: accountId ?? null }),\n }),\n\n settings: () => request<SettingsView>('settings'),\n\n saveSettings: (patch: Record<string, unknown>) =>\n request<{ settings: SettingsView }>('settings', { method: 'PATCH', body: JSON.stringify(patch) }),\n\n backupStatus: (accountId?: string | null) =>\n request<BackupStatus>(`backup/status${query({ accountId: accountId ?? null })}`),\n\n startBackup: (accountId?: string | null) =>\n request<{ ok: true; status: BackupStatus }>(`backup/start${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n }),\n\n stopBackup: (accountId?: string | null) =>\n request<{ ok: boolean; status: BackupStatus }>(`backup/stop${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n }),\n}\n\nexport type { AttachmentMeta }\n", "import { createElement as h, useCallback, useEffect, useMemo, useState, type ReactNode } from 'react'\nimport type { AppState, BackupStatus, Draft, MessageDetail, MessageSummary, Page } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { AddAccountForm, AddAccountModal, LoginForm } from './account-form.js'\nimport { Avatar, ErrorBar, Modal, shortDate } from './components.js'\nimport { Composer, type ComposeInit } from './composer.js'\nimport { Icon } from './icons.js'\nimport { Reader } from './reader.js'\n\ninterface Folder {\n name: string\n label?: string\n count: number\n}\n\nconst EMPTY_PAGE: Page<MessageSummary> = { items: [], total: 0, offset: 0, limit: 40 }\nconst DRAFTS = '__drafts'\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nfunction matchesNarrow(): boolean {\n return typeof window.matchMedia === 'function' ? window.matchMedia('(max-width: 900px)').matches : false\n}\n\nfunction quoteForReply(detail: MessageDetail): string {\n const body = detail.html ?? `<pre>${detail.text.replaceAll('&', '&').replaceAll('<', '<')}</pre>`\n return `<p><br></p><p>------------------ \u539F\u59CB\u90AE\u4EF6 ------------------</p><blockquote style=\"margin:0 0 0 12px;padding-left:12px;border-left:2px solid #d7dbe3;color:#565c67\">${body}</blockquote>`\n}\n\nexport function MailPanel(): ReactNode {\n const [state, setState] = useState<AppState | null>(null)\n const [error, setError] = useState('')\n const [accountScope, setAccountScope] = useState<string | null>(null)\n const [source, setSource] = useState<'local' | 'server'>('local')\n const [mailbox, setMailbox] = useState('all')\n const [folders, setFolders] = useState<Folder[]>([])\n const [query, setQuery] = useState('')\n const [search, setSearch] = useState('')\n const [page, setPage] = useState<Page<MessageSummary>>(EMPTY_PAGE)\n const [drafts, setDrafts] = useState<Draft[]>([])\n const [limit, setLimit] = useState(40)\n const [loading, setLoading] = useState(false)\n const [selected, setSelected] = useState<MessageDetail | null>(null)\n const [compose, setCompose] = useState<ComposeInit | null>(null)\n const [showAdd, setShowAdd] = useState(false)\n const [showBackup, setShowBackup] = useState(false)\n const [backup, setBackup] = useState<BackupStatus | null>(null)\n const [toast, setToast] = useState('')\n const [narrow, setNarrow] = useState(() => matchesNarrow())\n const [tick, setTick] = useState(0)\n\n const accounts = state?.accounts ?? []\n const isAll = accountScope === 'all'\n const account = accounts.find((item) => item.id === accountScope) ?? null\n const composeAccount =\n accounts.find((item) => item.id === compose?.accountId) ?? account ?? accounts[0] ?? null\n const showingDrafts = mailbox === DRAFTS && source === 'local'\n\n const refresh = useCallback((): void => {\n setTick((value) => value + 1)\n }, [])\n\n const notice = useCallback((message: string): void => {\n setToast(message)\n window.setTimeout(() => {\n setToast('')\n }, 3200)\n }, [])\n\n // App state: load once and after mutations.\n useEffect(() => {\n let cancelled = false\n api\n .state()\n .then((next) => {\n if (cancelled) return\n setState(next)\n if (next.settings.render.listLimit > 0) setLimit(next.settings.render.listLimit)\n setAccountScope((current) => current ?? next.activeAccountId)\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n return () => {\n cancelled = true\n }\n }, [tick])\n\n // Folders follow the account scope and the source.\n useEffect(() => {\n if (accountScope === null) return\n let cancelled = false\n api\n .folders({ accountId: accountScope, source })\n .then((result) => {\n if (cancelled) return\n const items: Folder[] =\n source === 'local'\n ? [\n {\n name: 'all',\n label: '\u5168\u90E8\u90AE\u4EF6',\n count: result.items\n .filter((item) => item.name !== DRAFTS)\n .reduce((sum, item) => sum + item.count, 0),\n },\n ...result.items.map((item) => ({\n ...item,\n label: item.name === DRAFTS ? '\u8349\u7A3F' : (item.label ?? item.name),\n })),\n ]\n : result.items.map((item) => ({ ...item, label: item.label ?? item.name }))\n setFolders(items)\n })\n .catch(() => {\n if (!cancelled) setFolders([])\n })\n return () => {\n cancelled = true\n }\n }, [accountScope, source, tick])\n\n // A source or account switch resets the folder; unified inbox is local-only.\n useEffect(() => {\n setMailbox(source === 'local' ? 'all' : 'INBOX')\n setSelected(null)\n setLimit(state?.settings.render.listLimit ?? 40)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [source])\n\n useEffect(() => {\n if (accountScope === 'all' && source === 'server') setSource('local')\n setSelected(null)\n }, [accountScope, source])\n\n // Message page (or drafts list).\n useEffect(() => {\n if (accountScope === null) return\n let cancelled = false\n setLoading(true)\n if (showingDrafts) {\n const targets = isAll ? accounts : account === null ? [] : [account]\n Promise.all(\n targets.map(async (target) => {\n try {\n const result = await api.drafts(target.id)\n return result.items.map((draft) => ({ ...draft, accountId: target.id }))\n } catch {\n return []\n }\n }),\n )\n .then((groups) => {\n if (cancelled) return\n setDrafts(groups.flat().sort((left, right) => right.updatedAt.localeCompare(left.updatedAt)))\n setPage(EMPTY_PAGE)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }\n api\n .messages({ accountId: accountScope, source, mailbox, query: search, limit })\n .then((result) => {\n if (!cancelled) {\n setPage(result)\n setDrafts([])\n }\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [accountScope, source, mailbox, search, limit, tick])\n\n // Narrow layout follows the viewport.\n useEffect(() => {\n if (typeof window.matchMedia !== 'function') return\n const media = window.matchMedia('(max-width: 900px)')\n const onChange = (): void => setNarrow(media.matches)\n media.addEventListener('change', onChange)\n return () => {\n media.removeEventListener('change', onChange)\n }\n }, [])\n\n // Backup progress polling while the dialog is open.\n useEffect(() => {\n if (!showBackup || accountScope === null || isAll) return\n let cancelled = false\n const poll = async (): Promise<void> => {\n try {\n const status = await api.backupStatus(accountScope)\n if (!cancelled) setBackup(status)\n } catch {\n // Keep the last status.\n }\n }\n void poll()\n const timer = window.setInterval(() => {\n void poll()\n }, 1000)\n return () => {\n cancelled = true\n window.clearInterval(timer)\n }\n }, [showBackup, accountScope, isAll])\n\n const openMessage = async (item: MessageSummary): Promise<void> => {\n const owner = item.accountId\n const ownerSource = source\n setError('')\n try {\n const detail = await api.message({ id: item.id, accountId: owner, source: ownerSource, mailbox })\n setSelected(detail)\n if (detail.unread && state?.settings.read.markOnOpen === true) {\n try {\n await api.setRead({ id: detail.id, accountId: owner, source: ownerSource, mailbox, read: true })\n setSelected({ ...detail, unread: false })\n setPage((current) => ({\n ...current,\n items: current.items.map((row) => (row.id === item.id ? { ...row, unread: false } : row)),\n }))\n } catch {\n // Reading must not fail because the server refused a flag write.\n }\n }\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const startCompose = (mode: ComposeInit['mode']): void => {\n const owner = account ?? accounts.find((item) => item.id === state?.activeAccountId) ?? accounts[0]\n if (owner === undefined) return\n const detail = selected\n if (mode === 'new' || detail === null) {\n setCompose({ mode: 'new', accountId: owner.id, to: '', cc: '', bcc: '', subject: '', html: '' })\n return\n }\n const subjectPrefix = mode === 'forward' ? 'Fwd: ' : 'Re: '\n const subject = /^(re|fwd):/i.test(detail.subject) ? detail.subject : `${subjectPrefix}${detail.subject}`\n if (mode === 'forward') {\n setCompose({\n mode,\n accountId: detail.accountId,\n to: '',\n cc: '',\n bcc: '',\n subject,\n html: quoteForReply(detail),\n references: detail.references.join(' '),\n })\n return\n }\n const to = detail.from.address\n const cc =\n mode === 'replyAll'\n ? [...detail.to, ...detail.cc]\n .map((item) => item.address)\n .filter((address) => address !== owner.email && address !== to)\n .join(', ')\n : ''\n setCompose({\n mode,\n accountId: detail.accountId,\n to,\n cc,\n bcc: '',\n subject,\n html: quoteForReply(detail),\n ...(detail.messageId === ''\n ? {}\n : { inReplyTo: detail.messageId, references: [...detail.references, detail.messageId].join(' ') }),\n })\n }\n\n const openDraft = (draft: Draft): void => {\n setCompose({\n mode: 'new',\n accountId: draft.accountId,\n to: draft.to,\n cc: draft.cc,\n bcc: draft.bcc,\n subject: draft.subject,\n html: draft.html,\n attachments: draft.attachments,\n draftId: draft.id,\n })\n }\n\n const removeDraft = async (id: string, accountId: string): Promise<void> => {\n try {\n await api.deleteDraft(id, accountId)\n setDrafts((current) => current.filter((draft) => draft.id !== id))\n notice('\u8349\u7A3F\u5DF2\u5220\u9664')\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const switchAccount = async (id: string): Promise<void> => {\n try {\n if (id !== 'all') await api.activateAccount(id)\n setAccountScope(id)\n setSelected(null)\n if (id === 'all') setSource('local')\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const startBackup = async (): Promise<void> => {\n const owner =\n accountScope === null || isAll ? accounts[0] : accounts.find((item) => item.id === accountScope)\n if (owner === undefined) return\n try {\n const result = await api.startBackup(owner.id)\n setBackup(result.status)\n setShowBackup(true)\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const stopBackup = async (): Promise<void> => {\n if (accountScope === null || isAll) return\n try {\n const result = await api.stopBackup(accountScope)\n setBackup(result.status)\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const folderOptions = useMemo(\n () =>\n folders.map((folder) => ({\n value: folder.name,\n label: `${folder.label ?? folder.name}${folder.count > 0 ? ` (${String(folder.count)})` : ''}`,\n })),\n [folders],\n )\n\n if (state === null) {\n return h(\n 'div',\n { className: 'mailharbor' },\n h('div', { className: 'mailharbor-empty' }, error === '' ? '\u6B63\u5728\u52A0\u8F7D\u90AE\u7BB1\u2026' : error),\n )\n }\n\n if (accounts.length === 0) {\n return h(\n 'div',\n { className: 'mailharbor' },\n h(\n 'div',\n { className: 'mailharbor-settings' },\n h('h2', null, '\u6B22\u8FCE\u4F7F\u7528 MailHarbor'),\n h(\n 'p',\n { className: 'muted small' },\n '\u628A\u4EFB\u610F IMAP/SMTP \u90AE\u7BB1\u63A5\u8FDB DeepSeek Harness\uFF1A\u672C\u5730\u5907\u4EFD\u3001\u5B9E\u65F6\u8BFB\u4FE1\u3001\u5199\u90AE\u4EF6\u4E0E Agent \u5DE5\u5177\u3002',\n ),\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(AddAccountForm, {\n onDone: (next) => {\n setState(next)\n setAccountScope(next.activeAccountId)\n setSource('local')\n },\n }),\n ),\n )\n }\n\n const currentAccount = account ?? accounts[0] ?? null\n const loggedIn = isAll ? accounts.some((item) => item.id === state.activeAccountId) : state.loggedIn\n const needsLogin = source === 'server' && !isAll && state.loggedIn === false\n const items = page.items\n\n return h(\n 'div',\n { className: narrow ? 'mailharbor mailharbor-narrow' : 'mailharbor' },\n h(\n 'div',\n { className: 'mailharbor-topbar' },\n h(\n 'div',\n { className: 'mailharbor-account' },\n h(Avatar, { email: isAll ? 'all' : (currentAccount?.email ?? '?'), size: 26 }),\n accounts.length > 1\n ? h(\n 'select',\n {\n value: accountScope ?? '',\n onChange: (event: { target: { value: string } }) => void switchAccount(event.target.value),\n 'aria-label': '\u8D26\u53F7',\n },\n h('option', { key: 'all', value: 'all' }, '\u5168\u90E8\u8D26\u53F7'),\n accounts.map((item) => h('option', { key: item.id, value: item.id }, item.label)),\n )\n : h('span', { className: 'name' }, currentAccount?.label ?? ''),\n isAll ? h('span', { className: 'badge' }, `${String(accounts.length)} \u4E2A\u8D26\u53F7`) : null,\n !isAll && state.loggedIn === false ? h('span', { className: 'badge warn' }, '\u672A\u767B\u5F55') : null,\n ),\n h(\n 'div',\n { className: 'mailharbor-segment', role: 'tablist' },\n h(\n 'button',\n { className: source === 'local' ? 'active' : '', onClick: () => setSource('local'), role: 'tab' },\n '\u672C\u5730\u5907\u4EFD',\n ),\n h(\n 'button',\n {\n className: source === 'server' ? 'active' : '',\n onClick: () => {\n if (isAll) {\n notice('\u7EDF\u4E00\u6536\u4EF6\u7BB1\u53EA\u652F\u6301\u672C\u5730\u5907\u4EFD\uFF0C\u5207\u6362\u5230\u5355\u4E2A\u8D26\u53F7\u53EF\u4F7F\u7528\u670D\u52A1\u5668\u5B9E\u65F6')\n return\n }\n setSource('server')\n },\n role: 'tab',\n title: isAll ? '\u7EDF\u4E00\u6536\u4EF6\u7BB1\u53EA\u652F\u6301\u672C\u5730\u5907\u4EFD' : '\u8BFB\u53D6\u670D\u52A1\u5668\u4E0A\u7684\u6700\u65B0\u90AE\u4EF6',\n },\n '\u670D\u52A1\u5668\u5B9E\u65F6',\n ),\n ),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n {\n className: 'ghost icon',\n title: '\u6DFB\u52A0\u8D26\u53F7',\n 'aria-label': '\u6DFB\u52A0\u8D26\u53F7',\n onClick: () => setShowAdd(true),\n },\n h(Icon, { name: 'plus' }),\n ),\n h(\n 'button',\n { className: 'ghost icon', title: '\u5237\u65B0\u5217\u8868', 'aria-label': '\u5237\u65B0\u5217\u8868', onClick: refresh },\n h(Icon, { name: 'refresh' }),\n ),\n h(\n 'button',\n {\n className: 'ghost',\n onClick: () => void startBackup(),\n title: isAll ? '\u5907\u4EFD\u5F53\u524D\u6D3B\u52A8\u8D26\u53F7' : '\u5907\u4EFD\u8FD9\u4E2A\u8D26\u53F7',\n },\n h(Icon, { name: 'archive' }),\n '\u5907\u4EFD',\n ),\n h(\n 'button',\n { className: 'primary', onClick: () => startCompose('new') },\n h(Icon, { name: 'compose' }),\n '\u5199\u90AE\u4EF6',\n ),\n ),\n toast === ''\n ? null\n : h('div', { className: 'small', style: { padding: '6px 14px', color: 'var(--m-ok)' } }, toast),\n error === '' ? null : h(ErrorBar, { message: error, onDismiss: () => setError('') }),\n needsLogin\n ? h(\n 'div',\n { className: 'mailharbor-settings' },\n h(LoginForm, { account: currentAccount!, onDone: refresh }),\n )\n : h(\n 'div',\n { className: 'mailharbor-body', 'data-mode': narrow && selected !== null ? 'reader' : 'list' },\n h(\n 'div',\n { className: 'mailharbor-list' },\n h(\n 'div',\n { className: 'mailharbor-filters' },\n h(\n 'select',\n {\n value: mailbox,\n onChange: (event: { target: { value: string } }) => {\n setMailbox(event.target.value)\n setSelected(null)\n },\n 'aria-label': '\u90AE\u7BB1\u6587\u4EF6\u5939',\n },\n folderOptions.map((option) =>\n h('option', { key: option.value, value: option.value }, option.label),\n ),\n ),\n h('input', {\n type: 'search',\n placeholder: showingDrafts ? '\u641C\u7D22\u8349\u7A3F' : '\u641C\u7D22\u90AE\u4EF6',\n 'aria-label': '\u641C\u7D22\u90AE\u4EF6',\n value: query,\n onChange: (event: { target: { value: string } }) => setQuery(event.target.value),\n onKeyDown: (event: { key: string }) => {\n if (event.key === 'Enter') setSearch(query)\n if (event.key === 'Escape') {\n setQuery('')\n setSearch('')\n }\n },\n }),\n query !== search || search !== ''\n ? h(\n 'button',\n {\n className: 'subtle',\n title: '\u6E05\u9664\u641C\u7D22',\n onClick: () => {\n setQuery('')\n setSearch('')\n },\n },\n h(Icon, { name: 'close', size: 14 }),\n )\n : null,\n ),\n h(\n 'div',\n { className: 'mailharbor-rows' },\n loading && items.length === 0 && drafts.length === 0\n ? h('div', { className: 'mailharbor-empty' }, '\u6B63\u5728\u8BFB\u53D6\u2026')\n : showingDrafts\n ? drafts.length === 0\n ? h(\n 'div',\n { className: 'mailharbor-empty' },\n h(Icon, { name: 'compose', size: 28 }),\n h('div', { className: 'title' }, '\u6CA1\u6709\u8349\u7A3F'),\n h('div', { className: 'small' }, '\u5199\u4FE1\u65F6\u70B9\u300C\u5B58\u8349\u7A3F\u300D\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002'),\n )\n : drafts\n .filter((draft) =>\n search === ''\n ? true\n : `${draft.subject} ${draft.to} ${draft.cc}`\n .toLowerCase()\n .includes(search.toLowerCase()),\n )\n .map((draft) =>\n h(\n 'div',\n {\n key: draft.id,\n className: 'mailharbor-row',\n role: 'button',\n tabIndex: 0,\n onClick: () => openDraft(draft),\n onKeyDown: (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n openDraft(draft)\n }\n },\n },\n h(\n 'span',\n { className: 'line-1' },\n h(\n 'span',\n { className: 'from' },\n `\u8349\u7A3F${draft.to === '' ? '' : ` \u00B7 \u6536\u4EF6\u4EBA ${draft.to}`}`,\n ),\n isAll\n ? h(\n 'span',\n { className: 'badge' },\n accounts.find((item) => item.id === draft.accountId)?.label ?? '',\n )\n : null,\n h('span', { className: 'date' }, shortDate(draft.updatedAt)),\n h(\n 'button',\n {\n className: 'subtle',\n title: '\u5220\u9664\u8349\u7A3F',\n onClick: (event: { stopPropagation: () => void }) => {\n event.stopPropagation()\n void removeDraft(draft.id, draft.accountId)\n },\n },\n h(Icon, { name: 'close', size: 13 }),\n ),\n ),\n h(\n 'span',\n { className: 'line-2' },\n h(\n 'span',\n { className: 'subject' },\n draft.subject === '' ? '(\u65E0\u4E3B\u9898)' : draft.subject,\n ),\n ),\n draft.html === ''\n ? null\n : h(\n 'span',\n { className: 'snippet' },\n draft.html\n .replace(/<[^>]+>/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .slice(0, 120),\n ),\n ),\n )\n : items.length === 0\n ? h(\n 'div',\n { className: 'mailharbor-empty' },\n h(Icon, { name: 'mail', size: 28 }),\n h(\n 'div',\n { className: 'title' },\n source === 'local' ? '\u672C\u5730\u5907\u4EFD\u91CC\u8FD8\u6CA1\u6709\u90AE\u4EF6' : '\u670D\u52A1\u5668\u4E0A\u6CA1\u6709\u90AE\u4EF6',\n ),\n h(\n 'div',\n { className: 'small' },\n source === 'local'\n ? '\u70B9\u9876\u90E8\u300C\u5907\u4EFD\u300D\u628A\u670D\u52A1\u5668\u90AE\u4EF6\u540C\u6B65\u4E0B\u6765\u3002'\n : '\u6362\u4E00\u4E2A\u6587\u4EF6\u5939\u6216\u7A0D\u540E\u5237\u65B0\u3002',\n ),\n )\n : items.map((item) =>\n h(\n 'div',\n {\n key: `${item.accountId}:${item.id}`,\n className: `mailharbor-row${item.unread ? ' unread' : ''}${selected?.id === item.id && selected?.accountId === item.accountId ? ' selected' : ''}`,\n role: 'button',\n tabIndex: 0,\n onClick: () => void openMessage(item),\n onKeyDown: (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n void openMessage(item)\n }\n },\n },\n h(\n 'span',\n { className: 'line-1' },\n item.unread ? h('span', { className: 'dot' }) : null,\n h(\n 'span',\n { className: 'from' },\n item.from.name !== '' ? item.from.name : item.from.address,\n ),\n item.hasAttachments ? h(Icon, { name: 'paperclip', size: 13 }) : null,\n isAll\n ? h(\n 'span',\n { className: 'badge' },\n accounts.find((entry) => entry.id === item.accountId)?.label ?? '',\n )\n : null,\n item.backedUp === false ? h('span', { className: 'badge warn' }, '\u672A\u5907\u4EFD') : null,\n h('span', { className: 'date' }, shortDate(item.date)),\n ),\n h(\n 'span',\n { className: 'line-2' },\n h('span', { className: 'subject' }, item.subject),\n ),\n item.snippet === '' ? null : h('span', { className: 'snippet' }, item.snippet),\n ),\n ),\n ),\n !showingDrafts && items.length > 0\n ? h(\n 'div',\n { className: 'mailharbor-list-foot' },\n h('span', null, `${String(items.length)} / ${String(page.total)} \u5C01`),\n h('span', { className: 'spacer' }),\n page.total > items.length\n ? h(\n 'button',\n { className: 'subtle', onClick: () => setLimit((current) => current + 40) },\n '\u52A0\u8F7D\u66F4\u591A',\n )\n : null,\n )\n : showingDrafts && drafts.length > 0\n ? h(\n 'div',\n { className: 'mailharbor-list-foot' },\n h('span', null, `${String(drafts.length)} \u5C01\u8349\u7A3F`),\n )\n : null,\n ),\n h(\n 'div',\n { className: 'mailharbor-reader' },\n selected === null\n ? h(\n 'div',\n { className: 'mailharbor-empty' },\n h(Icon, { name: 'mail', size: 34 }),\n h('div', { className: 'title' }, '\u9009\u62E9\u4E00\u5C01\u90AE\u4EF6\u5F00\u59CB\u9605\u8BFB'),\n h(\n 'div',\n { className: 'small' },\n loggedIn ? '\u5DF2\u767B\u5F55\uFF0C\u53EF\u5207\u6362\u300C\u670D\u52A1\u5668\u5B9E\u65F6\u300D\u67E5\u770B\u6700\u65B0\u90AE\u4EF6\u3002' : '\u6D4F\u89C8\u672C\u5730\u5907\u4EFD\u4E0D\u9700\u8981\u767B\u5F55\u3002',\n ),\n )\n : h(Reader, {\n detail: selected,\n source,\n mailbox,\n onChanged: (patch) => setSelected({ ...selected, ...patch }),\n onReply: (mode) => startCompose(mode),\n onAiReply: (init) =>\n setCompose({\n mode: 'reply',\n accountId: selected.accountId,\n to: init.to,\n cc: init.cc,\n bcc: '',\n subject: init.subject,\n html: init.html,\n inReplyTo: init.inReplyTo,\n references: init.references,\n }),\n onClose: narrow ? () => setSelected(null) : undefined,\n }),\n ),\n ),\n showBackup && backup !== null\n ? h(\n Modal,\n {\n title: '\u5907\u4EFD',\n onClose: () => setShowBackup(false),\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', width: '100%', alignItems: 'center' } },\n h('span', { className: 'small muted' }, backup.running ? '\u5907\u4EFD\u8FDB\u884C\u4E2D\u2026' : backup.message),\n h('span', { className: 'spacer' }),\n backup.running\n ? h('button', { className: 'ghost danger', onClick: () => void stopBackup() }, '\u505C\u6B62\u5907\u4EFD')\n : h('button', { className: 'primary', onClick: () => void startBackup() }, '\u5F00\u59CB\u5907\u4EFD'),\n h('button', { className: 'ghost', onClick: () => setShowBackup(false) }, '\u5173\u95ED'),\n ),\n },\n h(\n 'div',\n { className: 'mailharbor-kv' },\n h('dt', null, '\u5F00\u59CB\u65F6\u95F4'),\n h('dd', null, backup.startedAt ?? '\u2014'),\n h('dt', null, '\u4E0A\u6B21\u6210\u529F'),\n h('dd', null, backup.lastSuccessAt ?? '\u2014'),\n h('dt', null, '\u65B0\u589E'),\n h('dd', null, String(backup.added)),\n h('dt', null, '\u603B\u6570'),\n h('dd', null, String(backup.total)),\n ),\n h(\n 'div',\n { className: 'mailharbor-log' },\n backup.output.length === 0 ? '\uFF08\u7B49\u5F85\u8F93\u51FA\u2026\uFF09' : backup.output.join('\\n'),\n ),\n )\n : null,\n compose !== null && composeAccount !== null\n ? h(Composer, {\n account: composeAccount,\n initial: compose,\n onClose: () => setCompose(null),\n onSent: (message) => notice(message),\n })\n : null,\n showAdd\n ? h(AddAccountModal, {\n onClose: () => setShowAdd(false),\n onDone: (next) => {\n setState(next)\n setAccountScope(next.activeAccountId)\n refresh()\n },\n })\n : null,\n )\n}\n", "import { createElement as h, useState, type ReactNode } from 'react'\nimport type { Account, AppState } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { Field, Modal, Toggle } from './components.js'\n\nfunction domainOf(email: string): string {\n return email.split('@')[1] ?? 'example.com'\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nexport function AddAccountForm({\n onDone,\n onCancel,\n}: {\n onDone: (state: AppState) => void\n onCancel?: () => void\n}): ReactNode {\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [label, setLabel] = useState('')\n const [remember, setRemember] = useState(true)\n const [advanced, setAdvanced] = useState(false)\n const [imapHost, setImapHost] = useState('')\n const [imapPort, setImapPort] = useState('993')\n const [imapSecure, setImapSecure] = useState(true)\n const [smtpHost, setSmtpHost] = useState('')\n const [smtpPort, setSmtpPort] = useState('465')\n const [smtpSecure, setSmtpSecure] = useState(true)\n const [fromName, setFromName] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n const submit = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const domain = domainOf(email)\n const { state } = await api.addAccount({\n email: email.trim(),\n password,\n remember,\n ...(label.trim() === '' ? {} : { label: label.trim() }),\n ...(advanced\n ? {\n imap: {\n host: imapHost.trim() === '' ? `imap.${domain}` : imapHost.trim(),\n port: Number(imapPort) || 993,\n secure: imapSecure,\n },\n smtp: {\n host: smtpHost.trim() === '' ? `smtp.${domain}` : smtpHost.trim(),\n port: Number(smtpPort) || 465,\n secure: smtpSecure,\n ...(fromName.trim() === '' ? {} : { fromName: fromName.trim() }),\n },\n }\n : {}),\n })\n onDone(state)\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u6DFB\u52A0\u90AE\u7BB1\u8D26\u53F7'),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u90AE\u7BB1\u5730\u5740' },\n h('input', {\n type: 'email',\n value: email,\n placeholder: 'you@example.com',\n onChange: (event: { target: { value: string } }) => setEmail(event.target.value),\n autoFocus: true,\n }),\n ),\n h(\n Field,\n { label: '\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801' },\n h('input', {\n type: 'password',\n value: password,\n onChange: (event: { target: { value: string } }) => setPassword(event.target.value),\n }),\n ),\n ),\n h(\n Field,\n { label: '\u663E\u793A\u540D\u79F0\uFF08\u53EF\u9009\uFF09' },\n h('input', {\n value: label,\n placeholder: '\u5DE5\u4F5C\u90AE\u7BB1',\n onChange: (event: { target: { value: string } }) => setLabel(event.target.value),\n }),\n ),\n h(Toggle, { checked: remember, onChange: setRemember, label: '\u8BB0\u4F4F\u5BC6\u7801\uFF08\u5199\u5165\u7CFB\u7EDF\u94A5\u5319\u4E32\uFF09' }),\n h(\n 'button',\n { className: 'ghost', onClick: () => setAdvanced(!advanced) },\n advanced ? '\u9690\u85CF\u9AD8\u7EA7\u8BBE\u7F6E' : '\u9AD8\u7EA7\u8BBE\u7F6E\uFF08\u670D\u52A1\u5668\u4E0E\u7AEF\u53E3\uFF09',\n ),\n advanced\n ? h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'IMAP \u4E3B\u673A' },\n h('input', {\n value: imapHost,\n placeholder: `imap.${domainOf(email)}`,\n onChange: (event: { target: { value: string } }) => setImapHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: imapPort,\n inputMode: 'numeric',\n onChange: (event: { target: { value: string } }) => setImapPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: imapSecure, onChange: setImapSecure, label: 'TLS' }),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'SMTP \u4E3B\u673A' },\n h('input', {\n value: smtpHost,\n placeholder: `smtp.${domainOf(email)}`,\n onChange: (event: { target: { value: string } }) => setSmtpHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: smtpPort,\n inputMode: 'numeric',\n onChange: (event: { target: { value: string } }) => setSmtpPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: smtpSecure, onChange: setSmtpSecure, label: 'TLS' }),\n ),\n h(\n Field,\n { label: '\u53D1\u4EF6\u4EBA\u540D\u79F0\uFF08\u53EF\u9009\uFF09' },\n h('input', {\n value: fromName,\n onChange: (event: { target: { value: string } }) => setFromName(event.target.value),\n }),\n ),\n )\n : null,\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', justifyContent: 'flex-end' } },\n onCancel === undefined ? null : h('button', { className: 'ghost', onClick: onCancel }, '\u53D6\u6D88'),\n h(\n 'button',\n {\n className: 'primary',\n onClick: () => void submit(),\n disabled: busy || email.trim() === '' || password === '',\n },\n busy ? '\u8FDE\u63A5\u4E2D\u2026' : '\u6DFB\u52A0\u5E76\u8FDE\u63A5',\n ),\n ),\n )\n}\n\nexport function LoginForm({ account, onDone }: { account: Account; onDone: () => void }): ReactNode {\n const [password, setPassword] = useState('')\n const [remember, setRemember] = useState(true)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const submit = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.login(account.id, password, remember)\n onDone()\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n return h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, `\u767B\u5F55 ${account.email}`),\n h(\n 'p',\n { className: 'small muted' },\n `${account.imap.host}:${String(account.imap.port)} \u00B7 ${account.smtp.host}:${String(account.smtp.port)}`,\n ),\n h(\n Field,\n { label: '\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801' },\n h('input', {\n type: 'password',\n value: password,\n onChange: (event: { target: { value: string } }) => setPassword(event.target.value),\n onKeyDown: (event: { key: string }) => {\n if (event.key === 'Enter') void submit()\n },\n autoFocus: true,\n }),\n ),\n h(Toggle, { checked: remember, onChange: setRemember, label: '\u8BB0\u4F4F\u5BC6\u7801\uFF08\u5199\u5165\u7CFB\u7EDF\u94A5\u5319\u4E32\uFF09' }),\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(\n 'button',\n { className: 'primary', onClick: () => void submit(), disabled: busy || password === '' },\n busy ? '\u767B\u5F55\u4E2D\u2026' : '\u767B\u5F55',\n ),\n )\n}\n\nexport function AddAccountModal({\n onClose,\n onDone,\n}: {\n onClose: () => void\n onDone: (state: AppState) => void\n}): ReactNode {\n return h(\n Modal,\n { title: '\u6DFB\u52A0\u90AE\u7BB1\u8D26\u53F7', onClose },\n h(AddAccountForm, {\n onDone: (state) => {\n onDone(state)\n onClose()\n },\n onCancel: onClose,\n }),\n )\n}\n\nexport { errorText }\n", "import { createElement as h, useEffect, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport function Avatar({ email, size = 26 }: { email: string; size?: number }): ReactNode {\n const letter = (email.trim()[0] ?? '?').toUpperCase()\n return h(\n 'span',\n {\n className: 'avatar',\n style: {\n width: `${String(size)}px`,\n height: `${String(size)}px`,\n fontSize: `${String(Math.round(size * 0.42))}px`,\n },\n 'aria-hidden': 'true',\n },\n letter,\n )\n}\n\nexport function Field({\n label,\n children,\n hint,\n}: {\n label: string\n children?: ReactNode\n hint?: string\n}): ReactNode {\n return h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, label),\n children,\n hint === undefined ? null : h('span', { className: 'small muted' }, hint),\n )\n}\n\nexport function Toggle({\n checked,\n onChange,\n label,\n}: {\n checked: boolean\n onChange: (value: boolean) => void\n label: string\n}): ReactNode {\n return h(\n 'label',\n { className: 'mailharbor-toggle' },\n h('input', {\n type: 'checkbox',\n checked,\n onChange: (event: { target: { checked: boolean } }) => {\n onChange(event.target.checked)\n },\n }),\n label,\n )\n}\n\n/** Portal root that keeps the shell's theme variables in scope. */\nfunction portalRoot(): HTMLElement {\n const existing = document.getElementById('mailharbor-portal')\n if (existing !== null) return existing\n const element = document.createElement('div')\n element.id = 'mailharbor-portal'\n element.className = 'mailharbor mailharbor-portal'\n document.body.append(element)\n return element\n}\n\nexport function Modal({\n title,\n children,\n footer,\n onClose,\n wide = false,\n}: {\n title: string\n children?: ReactNode\n footer?: ReactNode\n onClose: () => void\n wide?: boolean\n}): ReactNode {\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => {\n window.removeEventListener('keydown', onKey)\n }\n }, [onClose])\n return createPortal(\n h(\n 'div',\n {\n className: 'mailharbor-modal-mask',\n onMouseDown: (event: { target: unknown; currentTarget: unknown }) => {\n if (event.target === event.currentTarget) onClose()\n },\n },\n h(\n 'div',\n {\n className: 'mailharbor-modal',\n style: wide ? { width: 'min(920px, 100%)' } : undefined,\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-label': title,\n },\n h(\n 'header',\n null,\n title,\n h('span', { className: 'spacer' }),\n h('button', { className: 'subtle', onClick: onClose, 'aria-label': '\u5173\u95ED' }, '\u2715'),\n ),\n h('div', { className: 'content' }, children),\n footer === undefined ? null : h('footer', null, footer),\n ),\n ),\n portalRoot(),\n )\n}\n\nexport function ErrorBar({ message, onDismiss }: { message: string; onDismiss: () => void }): ReactNode {\n return h(\n 'div',\n { className: 'error', role: 'alert' },\n h('span', null, message),\n h('span', { className: 'spacer' }),\n h('button', { className: 'subtle', onClick: onDismiss }, '\u5173\u95ED'),\n )\n}\n\nconst DAY = 86_400_000\n\n/** Compact list timestamp: time today, month-day this year, else the date. */\nexport function shortDate(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso.slice(0, 16)\n const now = new Date()\n const sameDay =\n date.getFullYear() === now.getFullYear() &&\n date.getMonth() === now.getMonth() &&\n date.getDate() === now.getDate()\n const pad = (value: number): string => String(value).padStart(2, '0')\n if (sameDay) return `${pad(date.getHours())}:${pad(date.getMinutes())}`\n if (date.getFullYear() === now.getFullYear()) return `${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n return `${String(date.getFullYear())}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n}\n\n/** Full timestamp for the reader header. */\nexport function longDate(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso\n return date.toLocaleString(undefined, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nexport function isFresh(iso: string, windowMs = DAY): boolean {\n const time = new Date(iso).getTime()\n return !Number.isNaN(time) && Date.now() - time < windowMs\n}\n\nexport function formatBytes(size: number): string {\n if (!Number.isFinite(size) || size <= 0) return ''\n if (size < 1024) return `${String(size)} B`\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`\n return `${(size / 1024 / 1024).toFixed(1)} MB`\n}\n", "import { createElement as h, useEffect, useRef, useState, type ReactNode } from 'react'\nimport type { Account, DraftAttachment } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { Field, Modal } from './components.js'\n\nexport interface ComposeInit {\n mode: 'new' | 'reply' | 'replyAll' | 'forward'\n accountId?: string\n to: string\n cc: string\n bcc: string\n subject: string\n html: string\n inReplyTo?: string\n references?: string\n draftId?: string\n attachments?: DraftAttachment[]\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nfunction readFileBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => {\n const result = String(reader.result ?? '')\n resolve(result.slice(result.indexOf(',') + 1))\n }\n reader.onerror = () => reject(new Error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${file.name}`))\n reader.readAsDataURL(file)\n })\n}\n\nexport function Composer({\n account,\n initial,\n onClose,\n onSent,\n}: {\n account: Account\n initial: ComposeInit\n onClose: () => void\n onSent: (message: string) => void\n}): ReactNode {\n const [to, setTo] = useState(initial.to)\n const [cc, setCc] = useState(initial.cc)\n const [bcc, setBcc] = useState(initial.bcc)\n const [subject, setSubject] = useState(initial.subject)\n const [showCc, setShowCc] = useState(initial.cc !== '' || initial.bcc !== '')\n const [attachments, setAttachments] = useState<DraftAttachment[]>(initial.attachments ?? [])\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [confirming, setConfirming] = useState(false)\n const [draftId, setDraftId] = useState(initial.draftId)\n const [translating, setTranslating] = useState<'zh' | 'en' | null>(null)\n const [pendingLang, setPendingLang] = useState<'zh' | 'en' | null>(null)\n const editor = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (editor.current !== null) editor.current.innerHTML = initial.html\n // The initial body is applied once; later edits own the DOM.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const html = (): string => editor.current?.innerHTML ?? ''\n const text = (): string => editor.current?.innerText ?? ''\n\n const exec = (command: string, value?: string): void => {\n editor.current?.focus()\n document.execCommand(command, false, value)\n }\n\n const translate = async (target: 'zh' | 'en'): Promise<void> => {\n if (editor.current === null) return\n if (html().trim() === '') {\n setError('\u6B63\u6587\u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u7FFB\u8BD1')\n return\n }\n setPendingLang(null)\n setTranslating(target)\n setError('')\n try {\n const result = await api.aiTranslate({ accountId: account.id, html: html(), target })\n editor.current.innerHTML = result.html\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setTranslating(null)\n }\n }\n\n const addFiles = async (files: FileList | null): Promise<void> => {\n if (files === null || files.length === 0) return\n setError('')\n const next = [...attachments]\n let total = next.reduce((sum, file) => sum + file.data.length, 0)\n for (const file of Array.from(files)) {\n if (total + file.size > 8 * 1024 * 1024) {\n setError('\u9644\u4EF6\u5408\u8BA1\u4E0D\u80FD\u8D85\u8FC7 8 MB')\n break\n }\n const data = await readFileBase64(file)\n next.push({ filename: file.name, contentType: file.type || 'application/octet-stream', data })\n total += file.size\n }\n setAttachments(next)\n }\n\n const saveDraft = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const { draft } = await api.saveDraft(account.id, {\n ...(draftId === undefined ? {} : { id: draftId }),\n to,\n cc,\n bcc,\n subject,\n html: html(),\n attachments,\n ...(initial.inReplyTo === undefined ? {} : { inReplyTo: initial.inReplyTo }),\n ...(initial.references === undefined ? {} : { references: initial.references }),\n })\n setDraftId(draft.id)\n onSent('\u8349\u7A3F\u5DF2\u4FDD\u5B58')\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n\n const send = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.send(account.id, {\n to,\n cc,\n bcc,\n subject,\n html: html(),\n text: text(),\n attachments,\n ...(initial.inReplyTo === undefined ? {} : { inReplyTo: initial.inReplyTo }),\n ...(initial.references === undefined ? {} : { references: initial.references }),\n })\n if (draftId !== undefined) {\n try {\n await api.deleteDraft(draftId, account.id)\n } catch {\n // The sent message matters more than removing its draft.\n }\n }\n onSent('\u90AE\u4EF6\u5DF2\u53D1\u9001')\n onClose()\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n setConfirming(false)\n }\n }\n\n return h(\n Modal,\n {\n title:\n initial.mode === 'reply'\n ? '\u56DE\u590D'\n : initial.mode === 'replyAll'\n ? '\u5168\u90E8\u56DE\u590D'\n : initial.mode === 'forward'\n ? '\u8F6C\u53D1'\n : '\u5199\u90AE\u4EF6',\n onClose,\n wide: true,\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', alignItems: 'center', width: '100%' } },\n h('span', { className: 'small muted' }, `\u53D1\u4EF6\u4EBA ${account.email}`),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => void saveDraft(), disabled: busy }, '\u5B58\u8349\u7A3F'),\n confirming\n ? h(\n 'span',\n { style: { display: 'inline-flex', gap: '6px', alignItems: 'center' } },\n h('span', { className: 'small' }, '\u786E\u5B9A\u53D1\u9001\uFF1F'),\n h(\n 'button',\n { className: 'primary', onClick: () => void send(), disabled: busy },\n busy ? '\u53D1\u9001\u4E2D\u2026' : '\u786E\u5B9A',\n ),\n h('button', { className: 'ghost', onClick: () => setConfirming(false) }, '\u53D6\u6D88'),\n )\n : h(\n 'button',\n {\n className: 'primary',\n onClick: () => setConfirming(true),\n disabled: busy || to.trim() === '',\n },\n '\u53D1\u9001',\n ),\n ),\n },\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u6536\u4EF6\u4EBA' },\n h('input', {\n value: to,\n onChange: (event: { target: { value: string } }) => setTo(event.target.value),\n placeholder: 'a@example.com, b@example.com',\n }),\n ),\n h(\n Field,\n { label: '\u4E3B\u9898' },\n h('input', {\n value: subject,\n onChange: (event: { target: { value: string } }) => setSubject(event.target.value),\n }),\n ),\n ),\n showCc\n ? h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u6284\u9001' },\n h('input', {\n value: cc,\n onChange: (event: { target: { value: string } }) => setCc(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u5BC6\u9001' },\n h('input', {\n value: bcc,\n onChange: (event: { target: { value: string } }) => setBcc(event.target.value),\n }),\n ),\n )\n : h(\n 'button',\n { className: 'subtle small', style: { alignSelf: 'flex-start' }, onClick: () => setShowCc(true) },\n '\u6DFB\u52A0\u6284\u9001 / \u5BC6\u9001',\n ),\n h(\n 'div',\n { className: 'mailharbor-toolbar' },\n h('button', { onClick: () => exec('bold'), title: '\u52A0\u7C97' }, 'B'),\n h('button', { onClick: () => exec('italic'), title: '\u659C\u4F53' }, 'I'),\n h('button', { onClick: () => exec('underline'), title: '\u4E0B\u5212\u7EBF' }, 'U'),\n h('button', { onClick: () => exec('insertUnorderedList'), title: '\u65E0\u5E8F\u5217\u8868' }, '\u2022 \u5217\u8868'),\n h('button', { onClick: () => exec('insertOrderedList'), title: '\u6709\u5E8F\u5217\u8868' }, '1. \u5217\u8868'),\n h('button', { onClick: () => exec('formatBlock', 'blockquote'), title: '\u5F15\u7528' }, '\u5F15\u7528'),\n h(\n 'button',\n {\n onClick: () => {\n const url = window.prompt('\u94FE\u63A5\u5730\u5740\uFF08https://\u2026\uFF09')\n if (url !== null && /^https?:\\/\\//i.test(url)) exec('createLink', url)\n },\n title: '\u94FE\u63A5',\n },\n '\u94FE\u63A5',\n ),\n h('button', { onClick: () => exec('removeFormat'), title: '\u6E05\u9664\u683C\u5F0F' }, '\u6E05\u9664'),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n { onClick: () => setPendingLang('zh'), disabled: translating !== null, title: 'AI \u7FFB\u8BD1\u6210\u4E2D\u6587' },\n translating === 'zh' ? '\u7FFB\u8BD1\u4E2D\u2026' : '\u4E2D',\n ),\n h(\n 'button',\n { onClick: () => setPendingLang('en'), disabled: translating !== null, title: 'AI \u7FFB\u8BD1\u6210\u82F1\u6587' },\n translating === 'en' ? '\u2026' : 'EN',\n ),\n h(\n 'label',\n { className: 'mailharbor-toggle small' },\n '\u9644\u4EF6',\n h('input', {\n type: 'file',\n multiple: true,\n style: { display: 'none' },\n onChange: (event: { target: { files: FileList | null; value: string } }) => {\n void addFiles(event.target.files)\n event.target.value = ''\n },\n }),\n ),\n ),\n pendingLang === null\n ? null\n : h(\n 'div',\n { className: 'mailharbor-confirm' },\n h('span', null, pendingLang === 'en' ? '\u628A\u6B63\u6587\u7FFB\u8BD1\u6210\u82F1\u6587\uFF1F' : '\u628A\u6B63\u6587\u7FFB\u8BD1\u6210\u4E2D\u6587\uFF1F'),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => setPendingLang(null) }, '\u53D6\u6D88'),\n h('button', { className: 'primary', onClick: () => void translate(pendingLang) }, '\u7FFB\u8BD1'),\n ),\n attachments.length === 0\n ? null\n : h(\n 'div',\n { className: 'mailharbor-attachments', style: { padding: 0, border: 0 } },\n attachments.map((file, index) =>\n h(\n 'span',\n { className: 'mailharbor-attachment', key: `${file.filename}:${String(index)}` },\n h('span', { className: 'name' }, file.filename),\n h(\n 'button',\n {\n className: 'subtle',\n onClick: () => setAttachments(attachments.filter((_item, position) => position !== index)),\n },\n '\u2715',\n ),\n ),\n ),\n ),\n h('div', {\n className: 'mailharbor-editor',\n ref: editor,\n contentEditable: true,\n suppressContentEditableWarning: true,\n 'data-placeholder': '\u5199\u70B9\u4EC0\u4E48\u2026',\n spellCheck: true,\n }),\n )\n}\n", "import { createElement as h, type ReactNode } from 'react'\n\nconst PATHS: Record<string, ReactNode> = {\n refresh: h('path', { d: 'M20 11a8 8 0 1 0-2.3 5.7M20 5v6h-6' }),\n plus: h('path', { d: 'M12 5v14M5 12h14' }),\n compose: h('path', { d: 'M4 20h4l10.5-10.5a2.1 2.1 0 0 0-3-3L5 17v3zM13.5 6.5l3 3' }),\n archive: h(\n 'g',\n null,\n h('rect', { x: 3, y: 4, width: 18, height: 5, rx: 1.5 }),\n h('path', { d: 'M5 9v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V9M10 13h4' }),\n ),\n paperclip: h('path', {\n d: 'M20 11.5 12 19.5a5 5 0 0 1-7-7l8-8a3.3 3.3 0 0 1 4.7 4.7l-8 8a1.7 1.7 0 0 1-2.4-2.4l7.3-7.3',\n }),\n mail: h(\n 'g',\n null,\n h('rect', { x: 3, y: 5, width: 18, height: 14, rx: 2.5 }),\n h('path', { d: 'm4 7 7.1 5a1.6 1.6 0 0 0 1.8 0L20 7' }),\n ),\n search: h('path', { d: 'M11 18a7 7 0 1 0 0-14 7 7 0 0 0 0 14zM20 20l-4-4' }),\n reply: h('path', { d: 'M9 7 4 12l5 5M4 12h9a6 6 0 0 1 6 6v1' }),\n replyAll: h('path', { d: 'm9 7-5 5 5 5M14 7l-5 5 5 5M13 12h5a5 5 0 0 1 5 5' }),\n forward: h('path', { d: 'm15 7 5 5-5 5M20 12h-9a6 6 0 0 0-6 6v1' }),\n check: h('path', { d: 'm5 13 4 4L19 7' }),\n image: h(\n 'g',\n null,\n h('rect', { x: 3, y: 4, width: 18, height: 16, rx: 2 }),\n h('circle', { cx: 8.5, cy: 9.5, r: 1.5 }),\n h('path', { d: 'm4 18 5-5 4 4 3-3 4 4' }),\n ),\n close: h('path', { d: 'M6 6l12 12M18 6 6 18' }),\n chevronLeft: h('path', { d: 'm14 6-6 6 6 6' }),\n}\n\nexport function Icon({ name, size = 16 }: { name: keyof typeof PATHS | string; size?: number }): ReactNode {\n return h(\n 'svg',\n {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.7,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n 'aria-hidden': 'true',\n focusable: 'false',\n },\n PATHS[name] ?? null,\n )\n}\n", "import { createElement as h, useMemo, useState, type ReactNode } from 'react'\nimport type { MessageDetail } from '../shared/types.js'\nimport { api, type SummaryBlock } from './api.js'\nimport { Avatar, formatBytes, longDate, Modal } from './components.js'\nimport { Icon } from './icons.js'\n\nexport interface AiReplyInit {\n to: string\n cc: string\n subject: string\n html: string\n inReplyTo?: string\n references?: string\n}\n\nconst IFRAME_STYLE = `\n html, body { margin: 0; padding: 0; }\n body {\n font: 15px/1.75 -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n color: #171a21; background: #fff; padding: 20px 22px;\n overflow-wrap: anywhere;\n }\n img { max-width: 100%; height: auto; }\n table { max-width: 100%; border-collapse: collapse; }\n td, th { padding: 2px 6px; }\n a { color: #2f5bd3; }\n blockquote { margin: 0 0 0 12px; padding-left: 12px; border-left: 2px solid #d7dbe3; color: #565c67; }\n pre { white-space: pre-wrap; }\n`\n\nfunction csp(allowRemoteImages: boolean): string {\n return [\n \"default-src 'none'\",\n \"style-src 'unsafe-inline'\",\n 'font-src data:',\n `img-src data:${allowRemoteImages ? ' https: http:' : ''}`,\n \"form-action 'none'\",\n \"base-uri 'none'\",\n ].join('; ')\n}\n\nfunction srcDoc(detail: MessageDetail, allowRemoteImages: boolean): string {\n const html =\n detail.html !== null && detail.html !== '' ? detail.html : `<pre>${escapeHtml(detail.text)}</pre>`\n return `<!doctype html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"Content-Security-Policy\" content=\"${csp(allowRemoteImages)}\"><style>${IFRAME_STYLE}</style></head><body>${html}</body></html>`\n}\n\nfunction escapeHtml(value: string): string {\n return value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>')\n}\n\nfunction textToHtml(text: string): string {\n return text\n .split(/\\n{2,}/)\n .map(\n (paragraph) =>\n `<p>${paragraph.trim().replaceAll('&', '&').replaceAll('<', '<').replaceAll('\\n', '<br>')}</p>`,\n )\n .join('')\n}\n\nfunction hasRemoteImages(detail: MessageDetail): boolean {\n return detail.html !== null && /<img[^>]+src=[\"']https?:/i.test(detail.html)\n}\n\nfunction addressLine(list: { name: string; address: string }[]): string {\n return list.map((item) => (item.name !== '' ? `${item.name} <${item.address}>` : item.address)).join('\u3001')\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nexport function Reader({\n detail,\n source,\n mailbox,\n onChanged,\n onReply,\n onAiReply,\n onClose,\n}: {\n detail: MessageDetail\n source: 'local' | 'server'\n mailbox: string\n onChanged: (patch: Partial<MessageDetail>) => void\n onReply: (mode: 'reply' | 'replyAll' | 'forward') => void\n onAiReply: (init: AiReplyInit) => void\n onClose?: () => void\n}): ReactNode {\n const [plain, setPlain] = useState(false)\n const [loadImages, setLoadImages] = useState(false)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n const [summaryOpen, setSummaryOpen] = useState(false)\n const [summaryBusy, setSummaryBusy] = useState(false)\n const [summaryError, setSummaryError] = useState('')\n const [summaryBlocks, setSummaryBlocks] = useState<SummaryBlock[]>([])\n\n const [replyOpen, setReplyOpen] = useState(false)\n const [replyBusy, setReplyBusy] = useState(false)\n const [replyError, setReplyError] = useState('')\n const [replyInstruction, setReplyInstruction] = useState('')\n const [replyLanguage, setReplyLanguage] = useState<'zh' | 'en'>('zh')\n const [replyText, setReplyText] = useState('')\n\n const remoteImages = useMemo(() => hasRemoteImages(detail), [detail])\n const html = detail.html !== null && detail.html !== ''\n\n const toggleRead = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.setRead({\n id: detail.id,\n accountId: detail.accountId,\n source,\n mailbox,\n read: detail.unread,\n })\n onChanged({ unread: !result.read })\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n\n const openSummary = async (): Promise<void> => {\n setSummaryOpen(true)\n setSummaryBusy(true)\n setSummaryError('')\n setSummaryBlocks([])\n try {\n const result = await api.aiSummary({\n accountId: detail.accountId,\n source,\n id: detail.id,\n mailbox,\n })\n setSummaryBlocks(result.blocks)\n } catch (caught) {\n setSummaryError(errorText(caught))\n } finally {\n setSummaryBusy(false)\n }\n }\n\n const openReply = (): void => {\n setReplyOpen(true)\n setReplyText('')\n setReplyError('')\n setReplyInstruction('')\n setReplyLanguage('zh')\n }\n\n const generateReply = async (): Promise<void> => {\n setReplyBusy(true)\n setReplyError('')\n try {\n const result = await api.aiReply({\n accountId: detail.accountId,\n source,\n id: detail.id,\n mailbox,\n instruction: replyInstruction,\n language: replyLanguage,\n })\n setReplyText(result.text)\n } catch (caught) {\n setReplyError(errorText(caught))\n } finally {\n setReplyBusy(false)\n }\n }\n\n const insertReply = (): void => {\n const subject = /^re:/i.test(detail.subject) ? detail.subject : `Re: ${detail.subject}`\n onAiReply({\n to: detail.from.address,\n cc: '',\n subject,\n html: textToHtml(replyText),\n ...(detail.messageId === ''\n ? {}\n : { inReplyTo: detail.messageId, references: [...detail.references, detail.messageId].join(' ') }),\n })\n setReplyOpen(false)\n }\n\n return h(\n 'div',\n { className: 'mailharbor-reader' },\n h(\n 'div',\n { className: 'mailharbor-reader-head' },\n h(\n 'div',\n { className: 'mailharbor-reader-title' },\n onClose === undefined\n ? null\n : h(\n 'button',\n { className: 'ghost icon', onClick: onClose, 'aria-label': '\u8FD4\u56DE\u5217\u8868', title: '\u8FD4\u56DE\u5217\u8868' },\n h(Icon, { name: 'chevronLeft' }),\n ),\n h('h2', { style: { flex: 1 } }, detail.subject),\n h(\n 'button',\n {\n className: 'ghost icon',\n onClick: () => void toggleRead(),\n disabled: busy,\n title: detail.unread ? '\u6807\u4E3A\u5DF2\u8BFB' : '\u6807\u4E3A\u672A\u8BFB',\n 'aria-label': detail.unread ? '\u6807\u4E3A\u5DF2\u8BFB' : '\u6807\u4E3A\u672A\u8BFB',\n },\n h(Icon, { name: 'check' }),\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-meta' },\n h(\n 'span',\n { className: 'who' },\n h(Avatar, { email: detail.from.address, size: 22 }),\n h('strong', null, detail.from.name !== '' ? detail.from.name : detail.from.address),\n detail.from.name !== '' ? h('span', null, `<${detail.from.address}>`) : null,\n ),\n h('span', null, longDate(detail.date)),\n detail.backedUp === false ? h('span', { className: 'badge warn' }, '\u672A\u5907\u4EFD') : null,\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-meta' },\n h('span', null, `\u6536\u4EF6\u4EBA: ${addressLine(detail.to) || '\u2014'}`),\n detail.cc.length === 0 ? null : h('span', null, `\u6284\u9001: ${addressLine(detail.cc)}`),\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-actions' },\n h(\n 'button',\n { className: 'ghost', onClick: () => onReply('reply') },\n h(Icon, { name: 'reply' }),\n '\u56DE\u590D',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: () => onReply('replyAll') },\n h(Icon, { name: 'replyAll' }),\n '\u5168\u90E8\u56DE\u590D',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: () => onReply('forward') },\n h(Icon, { name: 'forward' }),\n '\u8F6C\u53D1',\n ),\n h('span', { className: 'mailharbor-divider' }),\n h('button', { className: 'ghost', onClick: () => void openSummary() }, 'AI \u6458\u8981'),\n h('button', { className: 'ghost', onClick: openReply }, 'AI \u56DE\u590D'),\n h('span', { className: 'spacer' }),\n html\n ? h(\n 'button',\n { className: 'subtle', onClick: () => setPlain(!plain) },\n plain ? '\u663E\u793A HTML' : '\u7EAF\u6587\u672C',\n )\n : null,\n remoteImages && !loadImages\n ? h(\n 'button',\n { className: 'subtle', onClick: () => setLoadImages(true) },\n h(Icon, { name: 'image', size: 14 }),\n '\u663E\u793A\u56FE\u7247',\n )\n : null,\n ),\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-body' },\n html && !plain\n ? h('iframe', {\n title: '\u90AE\u4EF6\u6B63\u6587',\n sandbox: '',\n srcDoc: srcDoc(detail, loadImages),\n referrerPolicy: 'no-referrer',\n })\n : h('pre', null, detail.text !== '' ? detail.text : '\uFF08\u65E0\u6B63\u6587\uFF09'),\n ),\n detail.attachments.length === 0\n ? null\n : h(\n 'div',\n { className: 'mailharbor-attachments' },\n detail.attachments.map((file) =>\n h(\n 'a',\n {\n className: 'mailharbor-attachment',\n key: file.id,\n href:\n source === 'server'\n ? api.attachmentUrl({\n accountId: detail.accountId,\n source: 'server',\n mailbox,\n uid: detail.uid ?? '',\n part: file.id,\n })\n : api.attachmentUrl({\n accountId: detail.accountId,\n source: 'local',\n emailId: detail.id,\n attachmentId: file.id,\n }),\n download: file.filename,\n title: file.filename,\n },\n h(Icon, { name: 'paperclip', size: 14 }),\n h('span', { className: 'name' }, file.filename),\n h('span', { className: 'muted small' }, formatBytes(file.size)),\n ),\n ),\n ),\n summaryOpen\n ? h(\n Modal,\n {\n title: 'AI \u6458\u8981',\n onClose: () => setSummaryOpen(false),\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', width: '100%', justifyContent: 'flex-end' } },\n h('button', { className: 'ghost', onClick: () => setSummaryOpen(false) }, '\u5173\u95ED'),\n summaryBlocks.length === 0\n ? null\n : h(\n 'button',\n {\n className: 'primary',\n onClick: () => {\n void navigator.clipboard\n ?.writeText(\n summaryBlocks.map((block) => `${block.title}\\n${block.body}`).join('\\n\\n'),\n )\n .then(() => setSummaryOpen(false))\n },\n },\n '\u590D\u5236',\n ),\n ),\n },\n summaryBusy ? '\u6B63\u5728\u9605\u8BFB\u5E76\u603B\u7ED3\u2026' : null,\n summaryError === '' ? null : h('div', { style: { color: 'var(--m-danger)' } }, summaryError),\n summaryBlocks.length === 0\n ? null\n : h(\n 'div',\n { className: 'mailharbor-summary' },\n summaryBlocks.map((block, index) =>\n h(\n 'section',\n { key: `${block.title}:${String(index)}` },\n block.title === '' ? null : h('h4', null, block.title),\n h('p', null, block.body),\n ),\n ),\n ),\n )\n : null,\n replyOpen\n ? h(\n Modal,\n {\n title: 'AI \u56DE\u590D',\n onClose: () => setReplyOpen(false),\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', width: '100%', alignItems: 'center' } },\n h('span', { className: 'small muted' }, '\u751F\u6210\u540E\u53EF\u5728\u6B63\u6587\u91CC\u7EE7\u7EED\u4FEE\u6539\uFF0C\u53D1\u9001\u4ECD\u9700\u4F60\u786E\u8BA4'),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => setReplyOpen(false) }, '\u53D6\u6D88'),\n h(\n 'button',\n { className: 'ghost', onClick: () => void generateReply(), disabled: replyBusy },\n replyBusy ? '\u751F\u6210\u4E2D\u2026' : replyText === '' ? '\u751F\u6210\u56DE\u590D' : '\u91CD\u65B0\u751F\u6210',\n ),\n h(\n 'button',\n {\n className: 'primary',\n onClick: insertReply,\n disabled: replyBusy || replyText.trim() === '',\n },\n '\u63D2\u5165\u5230\u6B63\u6587',\n ),\n ),\n },\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, '\u60F3\u8BA9 AI \u600E\u4E48\u5199\uFF08\u53EF\u7559\u7A7A\uFF09'),\n h('input', {\n value: replyInstruction,\n placeholder: '\u4F8B\u5982\uFF1A\u786E\u8BA4\u6536\u5230\uFF0C\u8BF4\u660E\u5468\u4E94\u524D\u7ED9\u7B54\u590D',\n onChange: (event: { target: { value: string } }) => setReplyInstruction(event.target.value),\n }),\n ),\n h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, '\u8BED\u8A00'),\n h(\n 'div',\n { className: 'mailharbor-segment' },\n h(\n 'button',\n {\n className: replyLanguage === 'zh' ? 'active' : '',\n onClick: () => setReplyLanguage('zh'),\n },\n '\u4E2D\u6587',\n ),\n h(\n 'button',\n {\n className: replyLanguage === 'en' ? 'active' : '',\n onClick: () => setReplyLanguage('en'),\n },\n 'English',\n ),\n ),\n ),\n ),\n replyError === '' ? null : h('div', { style: { color: 'var(--m-danger)' } }, replyError),\n h('textarea', {\n rows: 12,\n value: replyText,\n placeholder: replyBusy ? '\u6B63\u5728\u751F\u6210\u2026' : '\u70B9\u300C\u751F\u6210\u56DE\u590D\u300D\u8BA9 AI \u8D77\u8349\uFF0C\u7ED3\u679C\u4F1A\u663E\u793A\u5728\u8FD9\u91CC',\n onChange: (event: { target: { value: string } }) => setReplyText(event.target.value),\n }),\n )\n : null,\n )\n}\n", "import { createElement as h, useEffect, useState, type ReactNode } from 'react'\nimport type { Account, AppState, SettingsView } from '../shared/types.js'\nimport { api, ApiError, type AiModels, type AiStatus } from './api.js'\nimport { AddAccountForm } from './account-form.js'\nimport { Avatar, ErrorBar, Field, Toggle } from './components.js'\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nexport function MailSettings(): ReactNode {\n const [state, setState] = useState<AppState | null>(null)\n const [settings, setSettings] = useState<SettingsView | null>(null)\n const [error, setError] = useState('')\n const [toast, setToast] = useState('')\n const [signature, setSignature] = useState('')\n const [markOnOpen, setMarkOnOpen] = useState(true)\n const [pollSeconds, setPollSeconds] = useState(60)\n const [listLimit, setListLimit] = useState(40)\n const [aiEnabled, setAiEnabled] = useState(true)\n const [aiProvider, setAiProvider] = useState('deepseek-account')\n const [aiModel, setAiModel] = useState('deepseek-flash')\n const [aiModels, setAiModels] = useState<AiModels>({ providers: [] })\n const [aiStatus, setAiStatus] = useState<AiStatus | null>(null)\n const [styleText, setStyleText] = useState('')\n const [styleMeta, setStyleMeta] = useState({ updatedAt: '', sampleCount: 0 })\n const [styleBusy, setStyleBusy] = useState<'save' | 'learn' | null>(null)\n const [editing, setEditing] = useState<string | null>(null)\n const [checkResult, setCheckResult] = useState<string>('')\n const [adding, setAdding] = useState(false)\n const [tick, setTick] = useState(0)\n\n useEffect(() => {\n let cancelled = false\n Promise.all([api.state(), api.settings()])\n .then(([appState, view]) => {\n if (cancelled) return\n setState(appState)\n setSettings(view)\n setSignature(appState.settings.signature)\n setMarkOnOpen(view.read.markOnOpen)\n setPollSeconds(view.read.pollSeconds)\n setListLimit(view.render.listLimit)\n setAiEnabled(view.ai.enabled)\n setAiProvider(view.ai.provider)\n setAiModel(view.ai.model)\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n return () => {\n cancelled = true\n }\n }, [tick])\n\n useEffect(() => {\n let cancelled = false\n const accountId = settings?.activeAccountId ?? state?.activeAccountId ?? null\n if (accountId === null) return\n Promise.all([api.aiStatus(accountId), api.aiModels(), api.aiStyle(accountId)])\n .then(([status, models, style]) => {\n if (cancelled) return\n setAiStatus(status)\n setAiModels(models)\n setStyleText(style.style?.profile ?? '')\n setStyleMeta({\n updatedAt: style.style?.updatedAt ?? '',\n sampleCount: style.style?.sampleCount ?? 0,\n })\n const preferred =\n models.providers.find((item) => item.provider === status.provider) ?? models.providers[0]\n if (preferred !== undefined && status.provider === '') {\n setAiProvider(preferred.provider)\n const firstModel = preferred.models[0]\n if (firstModel !== undefined) setAiModel(firstModel.id)\n }\n })\n .catch(() => {\n // AI status is optional; the panel still works without a model service.\n })\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tick, settings?.activeAccountId])\n\n const reload = (): void => setTick((value) => value + 1)\n\n const notify = (message: string): void => {\n setToast(message)\n window.setTimeout(() => {\n setToast('')\n }, 3000)\n }\n\n const saveGeneral = async (patch: Record<string, unknown>): Promise<void> => {\n try {\n const result = await api.saveSettings(patch)\n setSettings(result.settings)\n notify('\u8BBE\u7F6E\u5DF2\u4FDD\u5B58')\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const account = settings?.accounts.find((item) => item.id === settings.activeAccountId) ?? null\n\n if (state === null || settings === null) {\n return h('div', { className: 'mailharbor mailharbor-settings' }, error === '' ? '\u6B63\u5728\u52A0\u8F7D\u8BBE\u7F6E\u2026' : error)\n }\n\n return h(\n 'div',\n { className: 'mailharbor' },\n h(\n 'div',\n { className: 'mailharbor-settings' },\n h('h2', null, 'MailHarbor'),\n h('p', { className: 'small muted' }, '\u591A\u8D26\u53F7 IMAP/SMTP \u90AE\u7BB1\u3001\u672C\u5730\u5907\u4EFD\u3001AI \u4E0E\u4EFB\u52A1\u3002\u8BBE\u7F6E\u4F1A\u7ACB\u5373\u751F\u6548\u3002'),\n toast === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-ok)' } }, toast),\n error === '' ? null : h(ErrorBar, { message: error, onDismiss: () => setError('') }),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u8D26\u53F7'),\n settings.accounts.length === 0\n ? h(AddAccountForm, { onDone: () => reload() })\n : settings.accounts.map((item) =>\n h(AccountRow, {\n key: item.id,\n account: item,\n active: item.id === settings.activeAccountId,\n loggedIn: item.id === settings.activeAccountId ? state.loggedIn : undefined,\n editing: editing === item.id,\n checkResult: editing === item.id ? checkResult : '',\n onToggleEdit: () => {\n setEditing(editing === item.id ? null : item.id)\n setCheckResult('')\n },\n onActivate: async () => {\n await api.activateAccount(item.id)\n reload()\n },\n onLogin: async (password, remember) => {\n await api.login(item.id, password, remember)\n reload()\n },\n onLogout: async () => {\n await api.logout(item.id)\n reload()\n },\n onCheck: async () => {\n try {\n const result = await api.check(item.id)\n setCheckResult(\n `IMAP \u6B63\u5E38\uFF08${String(result.imap.mailboxes.length)} \u4E2A\u6587\u4EF6\u5939\uFF09\u00B7 SMTP ${result.smtp.ok ? '\u6B63\u5E38' : `\u5931\u8D25: ${result.smtp.error ?? ''}`}`,\n )\n } catch (caught) {\n setCheckResult(`\u5931\u8D25: ${errorText(caught)}`)\n }\n },\n onSave: async (patch) => {\n await api.updateAccount(item.id, patch)\n reload()\n },\n onRemove: async () => {\n if (!window.confirm(`\u79FB\u9664\u8D26\u53F7 ${item.email}\uFF1F\u672C\u5730\u6570\u636E\u76EE\u5F55\u4F1A\u4FDD\u7559\u3002`)) return\n await api.deleteAccount(item.id)\n reload()\n },\n }),\n ),\n adding\n ? h(AddAccountForm, {\n onDone: () => {\n setAdding(false)\n reload()\n },\n onCancel: () => setAdding(false),\n })\n : h('button', { className: 'ghost', onClick: () => setAdding(true) }, '+ \u6DFB\u52A0\u8D26\u53F7'),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u5199\u4FE1\u4E0E\u9605\u8BFB'),\n h(\n Field,\n { label: '\u7B7E\u540D\uFF08\u7EAF\u6587\u672C\uFF0C\u53D1\u9001\u65F6\u8FFD\u52A0\u5230\u6B63\u6587\u672B\u5C3E\uFF09' },\n h('textarea', {\n rows: 4,\n value: signature,\n onChange: (event: { target: { value: string } }) => setSignature(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '10px', alignItems: 'center', flexWrap: 'wrap' } },\n h('button', { className: 'ghost', onClick: () => void saveGeneral({ signature }) }, '\u4FDD\u5B58\u7B7E\u540D'),\n h(Toggle, {\n checked: markOnOpen,\n onChange: (value) => {\n setMarkOnOpen(value)\n void saveGeneral({ read: { markOnOpen: value } })\n },\n label: '\u6253\u5F00\u90AE\u4EF6\u65F6\u6807\u4E3A\u5DF2\u8BFB',\n }),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u5217\u8868\u6BCF\u9875\u6570\u91CF' },\n h('input', {\n type: 'number',\n min: 10,\n max: 200,\n value: listLimit,\n onChange: (event: { target: { value: string } }) => setListLimit(Number(event.target.value)),\n onBlur: () => void saveGeneral({ render: { listLimit } }),\n }),\n ),\n h(\n Field,\n { label: '\u672A\u8BFB\u89D2\u6807\u8F6E\u8BE2\uFF08\u79D2\uFF09' },\n h('input', {\n type: 'number',\n min: 15,\n max: 3600,\n value: pollSeconds,\n onChange: (event: { target: { value: string } }) => setPollSeconds(Number(event.target.value)),\n onBlur: () => void saveGeneral({ read: { pollSeconds } }),\n }),\n ),\n ),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, 'AI'),\n h(Toggle, {\n checked: aiEnabled,\n onChange: (value) => {\n setAiEnabled(value)\n void saveGeneral({ ai: { enabled: value } })\n },\n label: '\u542F\u7528 AI\uFF08\u6458\u8981\u3001AI \u56DE\u590D\u3001\u7FFB\u8BD1\u3001\u5199\u4F5C\u98CE\u683C\uFF09',\n }),\n aiStatus === null\n ? null\n : h(\n 'div',\n { className: 'small', style: { color: aiStatus.available ? 'var(--m-ok)' : 'var(--m-warn)' } },\n aiStatus.available\n ? `\u6A21\u578B\u670D\u52A1\u53EF\u7528 \u00B7 ${aiStatus.provider} / ${aiStatus.model}`\n : (aiStatus.error ?? '\u5F53\u524D DSH \u7EC4\u5408\u6CA1\u6709\u53EF\u7528\u7684\u6A21\u578B\u670D\u52A1'),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: 'Provider' },\n aiModels.providers.length === 0\n ? h('input', {\n value: aiProvider,\n onChange: (event: { target: { value: string } }) => setAiProvider(event.target.value),\n onBlur: () => void saveGeneral({ ai: { provider: aiProvider } }),\n })\n : h(\n 'select',\n {\n value: aiProvider,\n onChange: (event: { target: { value: string } }) => {\n setAiProvider(event.target.value)\n const provider = aiModels.providers.find((item) => item.provider === event.target.value)\n const first = provider?.models[0]\n if (first !== undefined) setAiModel(first.id)\n void saveGeneral({\n ai: {\n provider: event.target.value,\n ...(first === undefined ? {} : { model: first.id }),\n },\n })\n },\n },\n aiModels.providers.map((item) =>\n h('option', { key: item.provider, value: item.provider }, item.name),\n ),\n ),\n ),\n h(\n Field,\n { label: '\u6A21\u578B' },\n (() => {\n const provider = aiModels.providers.find((item) => item.provider === aiProvider)\n return provider === undefined || provider.models.length === 0\n ? h('input', {\n value: aiModel,\n onChange: (event: { target: { value: string } }) => setAiModel(event.target.value),\n onBlur: () => void saveGeneral({ ai: { model: aiModel } }),\n })\n : h(\n 'select',\n {\n value: aiModel,\n onChange: (event: { target: { value: string } }) => {\n setAiModel(event.target.value)\n void saveGeneral({ ai: { model: event.target.value } })\n },\n },\n provider.models.map((item) => h('option', { key: item.id, value: item.id }, item.name)),\n )\n })(),\n ),\n ),\n h('hr', null),\n h(\n 'div',\n { style: { display: 'flex', alignItems: 'center', gap: '8px' } },\n h('strong', { style: { fontSize: '12.5px' } }, '\u5199\u4F5C\u98CE\u683C'),\n h(\n 'span',\n { className: 'small muted' },\n styleMeta.updatedAt === ''\n ? '\u8FD8\u6CA1\u6709\u751F\u6210'\n : `${styleMeta.sampleCount} \u5C01\u5DF2\u53D1\u9001\u90AE\u4EF6 \u00B7 ${new Date(styleMeta.updatedAt).toLocaleString()}`,\n ),\n ),\n h(\n 'p',\n { className: 'small muted' },\n '\u4ECE\u5DF2\u53D1\u9001\u90AE\u4EF6\u5B66\u4E60\u4F60\u7684\u79F0\u547C\u3001\u7ED3\u5C3E\u3001\u8BED\u6C14\u548C\u5E38\u7528\u8868\u8FBE\uFF0CAI \u56DE\u590D\u65F6\u4F1A\u53C2\u8003\u5B83\u3002\u53EA\u4FDD\u5B58\u63D0\u70BC\u540E\u7684\u6863\u6848\uFF0C\u4E0D\u4FDD\u5B58\u90AE\u4EF6\u539F\u6587\u3002',\n ),\n h('textarea', {\n rows: 6,\n value: styleText,\n placeholder: '\u70B9\u300C\u4ECE\u5DF2\u53D1\u9001\u90AE\u4EF6\u5B66\u4E60\u300D\u751F\u6210\uFF0C\u6216\u76F4\u63A5\u5199\u4E00\u6BB5\u4F60\u7684\u5199\u4F5C\u98CE\u683C',\n onChange: (event: { target: { value: string } }) => setStyleText(event.target.value),\n }),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', flexWrap: 'wrap' } },\n h(\n 'button',\n {\n className: 'ghost',\n disabled: styleBusy !== null,\n onClick: () => {\n const accountId = settings.activeAccountId\n if (accountId === null) return\n setStyleBusy('learn')\n setError('')\n api\n .aiLearnStyle(accountId)\n .then((result) => {\n setStyleText(result.style.profile)\n setStyleMeta({ updatedAt: result.style.updatedAt, sampleCount: result.style.sampleCount })\n notify('\u5DF2\u6839\u636E\u5DF2\u53D1\u9001\u90AE\u4EF6\u751F\u6210\u5199\u4F5C\u98CE\u683C')\n })\n .catch((caught: unknown) => setError(errorText(caught)))\n .finally(() => setStyleBusy(null))\n },\n },\n styleBusy === 'learn' ? '\u5B66\u4E60\u4E2D\u2026' : '\u4ECE\u5DF2\u53D1\u9001\u90AE\u4EF6\u5B66\u4E60',\n ),\n h(\n 'button',\n {\n className: 'primary',\n disabled: styleBusy !== null || styleText.trim() === '',\n onClick: () => {\n const accountId = settings.activeAccountId\n if (accountId === null) return\n setStyleBusy('save')\n setError('')\n api\n .aiSaveStyle(accountId, styleText)\n .then((result) => {\n setStyleMeta({ updatedAt: result.style.updatedAt, sampleCount: result.style.sampleCount })\n notify('\u5199\u4F5C\u98CE\u683C\u5DF2\u4FDD\u5B58')\n })\n .catch((caught: unknown) => setError(errorText(caught)))\n .finally(() => setStyleBusy(null))\n },\n },\n '\u4FDD\u5B58\u98CE\u683C',\n ),\n ),\n h(\n 'p',\n { className: 'small muted' },\n 'AI \u8C03\u7528\u8D70 DSH \u81EA\u5DF1\u7684\u6A21\u578B\u670D\u52A1\uFF0C\u4E0D\u989D\u5916\u4FDD\u5B58\u5BC6\u94A5\uFF1B\u53D1\u9001\u4ECD\u7136\u53EA\u7531\u4F60\u786E\u8BA4\u3002',\n ),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u6570\u636E'),\n h(\n 'dl',\n { className: 'mailharbor-kv' },\n h('dt', null, '\u6570\u636E\u76EE\u5F55'),\n h('dd', null, settings.dataDir),\n h('dt', null, '\u914D\u7F6E\u6587\u4EF6'),\n h('dd', null, settings.configFile),\n h('dt', null, '\u5F53\u524D\u8D26\u53F7\u6570\u636E\u5E93'),\n h(\n 'dd',\n null,\n account === null\n ? '\u2014'\n : `${account.dataDir.startsWith('/') ? account.dataDir : `${settings.dataDir}/${account.dataDir}`}/mail.db`,\n ),\n h('dt', null, '\u63D2\u4EF6\u7248\u672C'),\n h('dd', null, state.version),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', flexWrap: 'wrap' } },\n account === null\n ? null\n : h(\n 'button',\n {\n className: 'ghost',\n onClick: async () => {\n try {\n const status = await api.startBackup(account.id)\n notify(status.status.message === '' ? '\u5907\u4EFD\u5DF2\u5F00\u59CB' : status.status.message)\n reload()\n } catch (caught) {\n setError(errorText(caught))\n }\n },\n },\n '\u7ACB\u5373\u5907\u4EFD\u5F53\u524D\u8D26\u53F7',\n ),\n ),\n ),\n ),\n )\n}\n\nfunction AccountRow({\n account,\n active,\n loggedIn,\n editing,\n checkResult,\n onToggleEdit,\n onActivate,\n onLogin,\n onLogout,\n onCheck,\n onSave,\n onRemove,\n}: {\n account: Account\n active: boolean\n loggedIn: boolean | undefined\n editing: boolean\n checkResult: string\n onToggleEdit: () => void\n onActivate: () => Promise<void>\n onLogin: (password: string, remember: boolean) => Promise<void>\n onLogout: () => Promise<void>\n onCheck: () => Promise<void>\n onSave: (patch: Record<string, unknown>) => Promise<void>\n onRemove: () => Promise<void>\n}): ReactNode {\n const [password, setPassword] = useState('')\n const [remember, setRemember] = useState(true)\n const [label, setLabel] = useState(account.label)\n const [username, setUsername] = useState(account.username)\n const [imapHost, setImapHost] = useState(account.imap.host)\n const [imapPort, setImapPort] = useState(String(account.imap.port))\n const [imapSecure, setImapSecure] = useState(account.imap.secure)\n const [smtpHost, setSmtpHost] = useState(account.smtp.host)\n const [smtpPort, setSmtpPort] = useState(String(account.smtp.port))\n const [smtpSecure, setSmtpSecure] = useState(account.smtp.secure)\n const [fromName, setFromName] = useState(account.smtp.fromName)\n const [busy, setBusy] = useState(false)\n\n useEffect(() => {\n setLabel(account.label)\n setUsername(account.username)\n setImapHost(account.imap.host)\n setImapPort(String(account.imap.port))\n setImapSecure(account.imap.secure)\n setSmtpHost(account.smtp.host)\n setSmtpPort(String(account.smtp.port))\n setSmtpSecure(account.smtp.secure)\n setFromName(account.smtp.fromName)\n }, [account])\n\n const wrap = async (operation: () => Promise<void>): Promise<void> => {\n setBusy(true)\n try {\n await operation()\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor-card', style: { background: 'var(--m-bg-1)' } },\n h(\n 'div',\n { className: 'mailharbor-account-row' },\n h(Avatar, { email: account.email, size: 30 }),\n h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', minWidth: 0 } },\n h('strong', null, account.label),\n h('span', { className: 'small muted' }, account.email),\n ),\n active ? h('span', { className: 'badge ok' }, '\u5F53\u524D\u8D26\u53F7') : null,\n loggedIn === false ? h('span', { className: 'badge warn' }, '\u672A\u767B\u5F55') : null,\n h('span', { className: 'spacer' }),\n active\n ? null\n : h('button', { className: 'ghost small', onClick: () => void wrap(onActivate) }, '\u8BBE\u4E3A\u5F53\u524D'),\n h('button', { className: 'ghost small', onClick: () => void wrap(onCheck) }, '\u68C0\u67E5\u8FDE\u63A5'),\n h('button', { className: 'ghost small', onClick: onToggleEdit }, editing ? '\u6536\u8D77' : '\u7F16\u8F91'),\n ),\n editing\n ? h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u663E\u793A\u540D\u79F0' },\n h('input', {\n value: label,\n onChange: (event: { target: { value: string } }) => setLabel(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u767B\u5F55\u7528\u6237\u540D' },\n h('input', {\n value: username,\n onChange: (event: { target: { value: string } }) => setUsername(event.target.value),\n }),\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'IMAP \u4E3B\u673A' },\n h('input', {\n value: imapHost,\n onChange: (event: { target: { value: string } }) => setImapHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: imapPort,\n onChange: (event: { target: { value: string } }) => setImapPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: imapSecure, onChange: setImapSecure, label: 'TLS' }),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'SMTP \u4E3B\u673A' },\n h('input', {\n value: smtpHost,\n onChange: (event: { target: { value: string } }) => setSmtpHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: smtpPort,\n onChange: (event: { target: { value: string } }) => setSmtpPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: smtpSecure, onChange: setSmtpSecure, label: 'TLS' }),\n ),\n h(\n Field,\n { label: '\u53D1\u4EF6\u4EBA\u540D\u79F0' },\n h('input', {\n value: fromName,\n onChange: (event: { target: { value: string } }) => setFromName(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', alignItems: 'center', flexWrap: 'wrap' } },\n h(\n 'button',\n {\n className: 'primary small',\n disabled: busy,\n onClick: () =>\n void wrap(async () => {\n await onSave({\n label,\n username,\n imap: { host: imapHost, port: Number(imapPort) || 993, secure: imapSecure },\n smtp: { host: smtpHost, port: Number(smtpPort) || 465, secure: smtpSecure, fromName },\n })\n }),\n },\n '\u4FDD\u5B58\u8D26\u53F7',\n ),\n h(\n 'button',\n {\n className: 'ghost small danger',\n onClick: () => void wrap(onRemove),\n },\n '\u79FB\u9664\u8D26\u53F7',\n ),\n ),\n h('hr', { style: { border: 0, borderTop: '1px solid var(--m-line)', width: '100%' } }),\n h(\n Field,\n { label: '\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801\uFF08\u4E0D\u5199\u5165\u914D\u7F6E\u6587\u4EF6\uFF09' },\n h('input', {\n type: 'password',\n value: password,\n onChange: (event: { target: { value: string } }) => setPassword(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', alignItems: 'center' } },\n h(Toggle, { checked: remember, onChange: setRemember, label: '\u8BB0\u4F4F\u5BC6\u7801' }),\n h(\n 'button',\n {\n className: 'primary small',\n disabled: busy || password === '',\n onClick: () =>\n void wrap(async () => {\n await onLogin(password, remember)\n setPassword('')\n }),\n },\n '\u767B\u5F55',\n ),\n h('button', { className: 'ghost small', onClick: () => void wrap(onLogout) }, '\u9000\u51FA\u767B\u5F55'),\n ),\n checkResult === '' ? null : h('div', { className: 'small muted' }, checkResult),\n )\n : null,\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["h", "import_react", "import_react", "import_react", "h", "h", "import_react", "errorText", "h", "import_react", "h", "import_react", "errorText", "h", "errorText", "query", "items", "h", "import_react", "errorText", "h"]
|
|
7
7
|
}
|