@zaclinley/dsh-mailharbor 0.0.0-stage → 0.2.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 +49 -0
- package/LICENSE +21 -0
- package/README.md +173 -2
- package/README.zh.md +164 -0
- package/cordis.patch.yml +5 -0
- package/lib/client.js +2104 -0
- package/lib/client.js.map +7 -0
- package/lib/index.js +2941 -0
- package/lib/index.js.map +7 -0
- package/package.json +113 -4
- package/scripts/migrate-legacy.mjs +318 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 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.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/* ---------- 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/** Sidebar entry: an envelope with an unread badge, polled at a low rate. */\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: { position: 'relative', display: 'inline-flex', alignItems: 'center', justifyContent: 'center' },\n },\n h(\n 'svg',\n { width: 18, height: 18, 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.6 }),\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.6,\n strokeLinecap: 'round',\n }),\n ),\n unread > 0\n ? h(\n 'span',\n {\n style: {\n position: 'absolute',\n top: '-4px',\n right: '-6px',\n minWidth: '14px',\n height: '14px',\n padding: '0 3px',\n borderRadius: '999px',\n background: 'var(--dsw-alias-brand-primary, #4d6bfe)',\n color: '#fff',\n fontSize: '9px',\n lineHeight: '14px',\n textAlign: 'center',\n fontWeight: 600,\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"]
|
|
7
|
+
}
|