@agentaily/design-system 0.4.0 → 0.6.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/DESIGN.md +4 -4
- package/README.md +2 -2
- package/dist/components/auth/SignInPage.d.ts +19 -2
- package/dist/components/auth/SignInPage.js +24 -2
- package/dist/components/auth/SignInPage.js.map +1 -1
- package/dist/components/layout/DesignerShell.d.ts +1 -1
- package/dist/components/layout/DesignerShell.js.map +1 -1
- package/dist/components/settings/DeepSeekCard.d.ts +65 -0
- package/dist/components/settings/DeepSeekCard.js +197 -0
- package/dist/components/settings/DeepSeekCard.js.map +1 -0
- package/dist/components/settings/FeishuCard.d.ts +65 -0
- package/dist/components/settings/FeishuCard.js +271 -0
- package/dist/components/settings/FeishuCard.js.map +1 -0
- package/dist/components/utilities/BrandMark.d.ts +1 -1
- package/dist/components/utilities/BrandMark.js +1 -1
- package/dist/components/utilities/BrandMark.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/components/settings/IntegrationSettings.d.ts +0 -15
- package/dist/components/settings/IntegrationSettings.js +0 -630
- package/dist/components/settings/IntegrationSettings.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IntegrationSettings.js","sources":["../../../src/components/settings/IntegrationSettings.jsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from \"react\";\nimport { Alert } from \"../feedback/Alert.jsx\";\nimport { Badge } from \"../display/Badge.jsx\";\nimport { BrandMark } from \"../utilities/BrandMark.jsx\";\nimport { Button } from \"../buttons/Button.jsx\";\nimport { HelpSteps } from \"./HelpSteps.jsx\";\nimport { Icon } from \"../utilities/Icon.jsx\";\nimport { IconButton } from \"../buttons/IconButton.jsx\";\nimport { SecretField } from \"../inputs/SecretField.jsx\";\nimport { Select } from \"../inputs/Select.jsx\";\nimport { StatusPill } from \"../display/StatusPill.jsx\";\nimport { Switch } from \"../inputs/Switch.jsx\";\nimport { TestRow } from \"./TestRow.jsx\";\n\n// IntegrationSettings — fullscreen modal for connecting the two services an\n// Agentaily designer needs to run: a DeepSeek key (drives the conversation) and\n// a Feishu Bitable (receives the data). Self-persisting to localStorage; reports\n// readiness; gated save. The one cross-app difference (a monthly usage cap) is\n// behind `showUsageCap`. Composes SecretField / StatusPill / TestRow / HelpSteps.\nconst AX_INTEGRATION_CSS = `\n.s-overlay { position: fixed; inset: 0; z-index: 100; display: flex; animation: s-fade var(--dur-2) var(--ease-out) both; }\n.s-modal { position: relative; flex: 1; display: flex; flex-direction: column; min-height: 0;\n background: var(--surface-page); animation: s-rise var(--dur-3) var(--ease-out) both; }\n@keyframes s-fade { from { opacity: 0; } to { opacity: 1; } }\n@keyframes s-rise { from { opacity: 0; transform: translateY(10px) scale(0.994); } to { opacity: 1; transform: none; } }\n@media (prefers-reduced-motion: reduce) { .s-overlay, .s-modal { animation: none; } }\n\n.s-modal__bar { flex: none; display: flex; align-items: center; gap: 16px; height: 52px;\n padding: 0 12px 0 18px; border-bottom: 1px solid var(--border-default); background: var(--surface-panel); }\n.s-modal__brand { display: flex; align-items: center; gap: 8px; }\n.s-modal__word { font-family: var(--font-mono); font-size: 15px; font-weight: 500; letter-spacing: -0.02em; color: var(--text-body); }\n.s-modal__div { color: var(--text-faint); }\n.s-modal__crumb { font-family: var(--font-mono); font-size: 13px; color: var(--text-body); }\n.s-modal__baractions { margin-left: auto; display: flex; align-items: center; gap: 12px; flex: none; }\n\n.s-modal__body { flex: 1; overflow-y: auto; min-height: 0; }\n.s-wrap { max-width: 768px; margin: 0 auto; padding: 40px 24px 48px; }\n\n.s-hero { margin-bottom: 28px; }\n.s-hero__kicker { color: var(--text-faint); margin-bottom: 12px; }\n.s-hero__h { font-family: var(--font-display); font-size: var(--text-2xl); font-weight: 500;\n letter-spacing: var(--tracking-tight); line-height: var(--leading-tight); color: var(--text-body); margin: 0 0 10px; }\n.s-hero__p { font-size: var(--text-md); color: var(--text-muted); line-height: var(--leading-body); margin: 0; max-width: 62ch; }\n\n.s-ready { display: flex; align-items: center; gap: 14px; padding: 13px 16px; margin-bottom: 26px;\n border: 1px solid var(--border-default); border-radius: var(--radius-3); background: var(--surface-panel); }\n.s-ready__steps { display: flex; align-items: center; gap: 7px; flex: none; }\n.s-ready__dot { width: 9px; height: 9px; border-radius: var(--radius-1); border: 1px solid var(--border-strong);\n background: transparent; transition: background var(--dur-2) var(--ease-out), border-color var(--dur-2) var(--ease-out); }\n.s-ready__dot.is-on { background: var(--ok); border-color: var(--ok); }\n.s-ready__txt { flex: 1; min-width: 0; font-size: var(--text-sm); color: var(--text-muted); }\n.s-ready__txt strong { color: var(--text-body); font-weight: 500; }\n.s-ready__count { font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-faint); letter-spacing: 0.04em; flex: none; }\n\n.s-cards { display: flex; flex-direction: column; gap: 18px; }\n.s-card { position: relative; background: var(--surface-card); border: 1px solid var(--border-default);\n border-radius: var(--radius-3); overflow: hidden; transition: border-color var(--dur-2) var(--ease-out); }\n.s-card.is-ok { border-color: rgba(62, 207, 142, 0.4); }\n.s-card.is-error { border-color: rgba(229, 72, 77, 0.4); }\n.s-card__head { padding: 20px 24px 18px; }\n.s-card__toprow { display: flex; align-items: center; gap: 11px; margin-bottom: 15px; }\n.s-card__icon { flex: none; width: 30px; height: 30px; border-radius: var(--radius-2);\n border: 1px solid var(--border-strong); background: var(--surface-raised); color: var(--text-body);\n display: flex; align-items: center; justify-content: center; }\n.s-card__eyebrow { color: var(--text-faint); }\n.s-card__status { margin-left: auto; flex: none; }\n.s-card__title { font-family: var(--font-display); font-size: var(--text-xl); font-weight: 500;\n letter-spacing: var(--tracking-tight); line-height: var(--leading-tight); color: var(--text-body); margin: 0; }\n.s-card__desc { font-size: var(--text-sm); color: var(--text-muted); line-height: var(--leading-snug); margin: 9px 0 0; max-width: 58ch; }\n.s-card__body { padding: 4px 24px 22px; display: flex; flex-direction: column; gap: 18px; }\n\n.s-row2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n@media (max-width: 560px) { .s-row2 { grid-template-columns: 1fr; } }\n\n.s-lock { display: flex; align-items: flex-start; gap: 8px; font-size: var(--text-xs); color: var(--text-faint); line-height: var(--leading-snug); }\n.s-lock svg { flex: none; margin-top: 1px; color: var(--text-muted); }\n.s-lock strong { color: var(--text-muted); font-weight: 500; }\n\n.s-detect { display: flex; flex-direction: column; gap: 9px; padding: 13px 14px; border: 1px solid var(--border-default);\n border-radius: var(--radius-2); background: var(--surface-page); }\n.s-detect__row { display: flex; align-items: center; gap: 10px; }\n.s-detect__k { font-family: var(--font-mono); font-size: 10px; letter-spacing: var(--tracking-label); text-transform: uppercase;\n color: var(--text-faint); width: 84px; flex: none; }\n.s-detect__v { font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-body); word-break: break-all; flex: 1; }\n.s-detect__ok { color: var(--ok); display: flex; align-items: center; gap: 5px; font-family: var(--font-mono); font-size: 10px;\n letter-spacing: var(--tracking-label); text-transform: uppercase; flex: none; }\n\n.s-cap { display: flex; align-items: center; gap: 12px; padding-top: 4px; }\n.s-cap__field { display: flex; align-items: center; gap: 8px; }\n.s-cap__field .ax-input { width: 132px; }\n.s-cap.is-off { opacity: 0.5; }\n\n.s-map { width: 100%; border-collapse: collapse; font-size: var(--text-xs); }\n.s-map th { text-align: left; font-family: var(--font-mono); font-size: 10px; letter-spacing: var(--tracking-label);\n text-transform: uppercase; color: var(--text-faint); font-weight: 500; padding: 0 0 8px; }\n.s-map td { padding: 7px 0; border-top: 1px solid var(--border-default); color: var(--text-body); vertical-align: middle; }\n.s-map__from { color: var(--text-muted); }\n.s-map__arrow { width: 36px; color: var(--text-faint); }\n.s-map__col { font-family: var(--font-mono); }\n.s-map__tag { font-family: var(--font-mono); font-size: 9px; letter-spacing: var(--tracking-label); text-transform: uppercase;\n color: var(--text-faint); border: 1px solid var(--border-default); border-radius: var(--radius-1); padding: 2px 5px; margin-left: 7px; }\n\n.s-sub { display: flex; align-items: center; gap: 8px; }\n.s-sub__line { flex: 1; height: 1px; background: var(--border-default); }\n\n.s-save { flex: none; border-top: 1px solid var(--border-default); background: var(--surface-panel); }\n.s-save__inner { max-width: 768px; margin: 0 auto; padding: 12px 24px; display: flex; align-items: center; gap: 16px; }\n.s-save__status { flex: 1; min-width: 0; display: flex; align-items: center; gap: 9px; font-size: var(--text-sm); color: var(--text-muted); }\n.s-save__status svg { flex: none; }\n.s-save__actions { display: flex; align-items: center; gap: 8px; flex: none; }\n@media (max-width: 520px) { .s-wrap { padding: 24px 16px 36px; } .s-modal__baractions { gap: 6px; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-integration-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-integration-css\";\n s.textContent = AX_INTEGRATION_CSS;\n document.head.appendChild(s);\n}\n\nconst S_LS_KEY = \"agentaily.integrations.v1\";\nconst s_sleep = (ms) => new Promise((r) => setTimeout(r, ms));\n\nfunction s_parseFeishu(url) {\n if (!url) return null;\n const tokenM = url.match(/\\/base\\/([A-Za-z0-9]+)/) || url.match(/[?&]app_token=([A-Za-z0-9]+)/);\n const tableM = url.match(/[?&]table=([A-Za-z0-9]+)/);\n if (!tokenM) return null;\n return { token: tokenM[1], table: tableM ? tableM[1] : \"\" };\n}\n\nconst S_FIELD_MAP = [\n { from: \"姓名\", to: \"姓名\", tag: null },\n { from: \"手机号\", to: \"手机号\", tag: null },\n { from: \"邮箱\", to: \"邮箱\", tag: null },\n { from: \"报名场次\", to: \"场次\", tag: \"单选\" },\n { from: \"备注\", to: \"备注\", tag: null },\n { from: null, to: \"提交时间\", tag: \"自动\" },\n { from: null, to: \"来源链接\", tag: \"自动\" },\n];\n\nfunction s_load() {\n try {\n return JSON.parse(localStorage.getItem(S_LS_KEY)) || {};\n } catch (e) {\n return {};\n }\n}\n\nexport function IntegrationSettings({ onClose, showUsageCap = true, storageKey = S_LS_KEY }) {\n const load = () => {\n try {\n return JSON.parse(localStorage.getItem(storageKey)) || {};\n } catch (e) {\n return {};\n }\n };\n const boot = useRef(load()).current;\n\n const [dsKey, setDsKey] = useState(boot.dsKey || \"\");\n const [dsModel, setDsModel] = useState(boot.dsModel || \"deepseek-chat\");\n const [capOn, setCapOn] = useState(!!boot.capOn);\n const [cap, setCap] = useState(boot.cap || \"200\");\n const [dsStatus, setDsStatus] = useState(boot.dsStatus === \"ok\" ? \"ok\" : \"idle\");\n const [dsResult, setDsResult] = useState(boot.dsResult || \"\");\n\n const [appId, setAppId] = useState(boot.appId || \"\");\n const [secret, setSecret] = useState(boot.secret || \"\");\n const [link, setLink] = useState(boot.link || \"\");\n const [fsStatus, setFsStatus] = useState(boot.fsStatus === \"ok\" ? \"ok\" : \"idle\");\n const [fsResult, setFsResult] = useState(boot.fsResult || \"\");\n\n const [dirty, setDirty] = useState(false);\n const [saved, setSaved] = useState(!!boot.saved);\n\n useEffect(() => {\n const onKey = (e) => {\n if (e.key === \"Escape\") onClose && onClose();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n const parsed = s_parseFeishu(link);\n const dsConnected = dsStatus === \"ok\";\n const fsConnected = fsStatus === \"ok\";\n const readyCount = (dsConnected ? 1 : 0) + (fsConnected ? 1 : 0);\n const allReady = dsConnected && fsConnected;\n\n useEffect(() => {\n const snap = {\n dsKey,\n dsModel,\n capOn,\n cap,\n dsStatus,\n dsResult,\n appId,\n secret,\n link,\n fsStatus,\n fsResult,\n saved,\n };\n try {\n localStorage.setItem(storageKey, JSON.stringify(snap));\n } catch (e) {}\n }, [\n dsKey,\n dsModel,\n capOn,\n cap,\n dsStatus,\n dsResult,\n appId,\n secret,\n link,\n fsStatus,\n fsResult,\n saved,\n storageKey,\n ]);\n\n const touch = () => {\n setDirty(true);\n setSaved(false);\n };\n const editDs = (setter) => (v) => {\n setter(v);\n if (dsStatus !== \"idle\") {\n setDsStatus(\"idle\");\n setDsResult(\"\");\n }\n touch();\n };\n const editFs = (setter) => (v) => {\n setter(v);\n if (fsStatus !== \"idle\") {\n setFsStatus(\"idle\");\n setFsResult(\"\");\n }\n touch();\n };\n\n const testDeepSeek = async () => {\n setDsStatus(\"testing\");\n setDsResult(\"\");\n await s_sleep(1300);\n const k = dsKey.trim();\n if (k.startsWith(\"sk-\") && k.length >= 20) {\n setDsStatus(\"ok\");\n setDsResult(`连接正常 · 延迟 0.4s · ${dsModel}`);\n } else {\n setDsStatus(\"error\");\n setDsResult(k ? \"密钥无效或额度不足,请核对后重试\" : \"请先填写 API Key\");\n }\n touch();\n };\n\n const testFeishu = async () => {\n setFsStatus(\"testing\");\n setFsResult(\"\");\n await s_sleep(1500);\n if (!appId.trim() || !secret.trim()) {\n setFsStatus(\"error\");\n setFsResult(\"缺少 App ID 或 App Secret\");\n touch();\n return;\n }\n if (!parsed) {\n setFsStatus(\"error\");\n setFsResult(\"无法识别多维表格链接,请粘贴完整 URL\");\n touch();\n return;\n }\n if (!parsed.table) {\n setFsStatus(\"error\");\n setFsResult(\"链接缺少数据表 (table) 参数\");\n touch();\n return;\n }\n setFsStatus(\"ok\");\n setFsResult(\"已连接 ·「报名登记表」· 检测到 6 个字段\");\n touch();\n };\n\n const onSave = () => {\n setSaved(true);\n setDirty(false);\n };\n const onDiscard = () => {\n const b = load();\n setDsKey(b.dsKey || \"\");\n setDsModel(b.dsModel || \"deepseek-chat\");\n setCapOn(!!b.capOn);\n setCap(b.cap || \"200\");\n setDsStatus(b.dsStatus === \"ok\" ? \"ok\" : \"idle\");\n setDsResult(b.dsResult || \"\");\n setAppId(b.appId || \"\");\n setSecret(b.secret || \"\");\n setLink(b.link || \"\");\n setFsStatus(b.fsStatus === \"ok\" ? \"ok\" : \"idle\");\n setFsResult(b.fsResult || \"\");\n setSaved(!!b.saved);\n setDirty(false);\n };\n\n return (\n <div className=\"s-overlay\" role=\"dialog\" aria-modal=\"true\" aria-label=\"集成设置\">\n <div className=\"s-modal\">\n <header className=\"s-modal__bar\">\n <div className=\"s-modal__brand\">\n <BrandMark size={16} />\n <span className=\"s-modal__word\">agentaily</span>\n <span className=\"s-modal__div\">/</span>\n <span className=\"s-modal__crumb\">集成设置</span>\n </div>\n <div className=\"s-modal__baractions\">\n <Badge variant={allReady ? \"ok\" : \"neutral\"} dot={allReady}>\n {allReady ? \"就绪\" : \"未就绪\"}\n </Badge>\n <IconButton label=\"关闭\" onClick={() => onClose && onClose()}>\n <Icon name=\"x\" size={16} />\n </IconButton>\n </div>\n </header>\n\n <main className=\"s-modal__body\">\n <div className=\"s-wrap\">\n <div className=\"s-hero\">\n <div className=\"ax-label s-hero__kicker\">集成 · INTEGRATIONS</div>\n <h1 className=\"s-hero__h\">连接你的服务</h1>\n <p className=\"s-hero__p\">\n 运行需要两条连接:一把驱动对话的 DeepSeek\n 密钥,和一张接收数据的飞书多维表格。两项都连通后即可发布。\n </p>\n </div>\n\n <div className=\"s-ready\">\n <div className=\"s-ready__steps\">\n <span className={\"s-ready__dot\" + (dsConnected ? \" is-on\" : \"\")}></span>\n <span className={\"s-ready__dot\" + (fsConnected ? \" is-on\" : \"\")}></span>\n </div>\n <div className=\"s-ready__txt\">\n {allReady ? (\n <span>\n <strong>两项连接均已就绪。</strong>保存后即可开始运行。\n </span>\n ) : (\n <span>\n 完成下方 <strong>2 项</strong> 连接后才能发布运行。\n </span>\n )}\n </div>\n <span className=\"s-ready__count\">{readyCount} / 2</span>\n </div>\n\n <div className=\"s-cards\">\n {/* ── Card 1 · DeepSeek ── */}\n <section\n className={\n \"s-card\" +\n (dsStatus === \"ok\" ? \" is-ok\" : dsStatus === \"error\" ? \" is-error\" : \"\")\n }\n >\n <div className=\"s-card__head\">\n <div className=\"s-card__toprow\">\n <div className=\"s-card__icon\">\n <Icon name=\"key\" size={16} />\n </div>\n <span className=\"ax-label s-card__eyebrow\">对话引擎 · LLM</span>\n <span className=\"s-card__status\">\n <StatusPill status={dsStatus} />\n </span>\n </div>\n <h2 className=\"s-card__title\">DeepSeek</h2>\n <p className=\"s-card__desc\">\n 驱动对话式交互。用户发送的每一条消息,都通过这把密钥调用 DeepSeek 补全。\n </p>\n </div>\n\n <div className=\"s-card__body\">\n <SecretField\n label=\"API KEY\"\n value={dsKey}\n onChange={editDs(setDsKey)}\n placeholder=\"sk-xxxxxxxxxxxxxxxxxxxxxxxx\"\n error={dsStatus === \"error\" && !dsKey.trim() ? \"此项必填\" : undefined}\n />\n\n <div className=\"s-lock\">\n <Icon name=\"lock\" size={14} />\n <span>\n <strong>密钥加密存储</strong>,仅在服务端发起调用。用户\n <strong>永远看不到、也拿不到这把密钥。</strong>\n </span>\n </div>\n\n <div className=\"s-row2\">\n <div>\n <label className=\"s-field__label ax-label\">对话模型</label>\n <Select\n value={dsModel}\n onChange={(e) => editDs(setDsModel)(e.target.value)}\n options={[\n { value: \"deepseek-chat\", label: \"deepseek-chat · 通用 · 快\" },\n { value: \"deepseek-reasoner\", label: \"deepseek-reasoner · 深度推理\" },\n ]}\n />\n </div>\n </div>\n\n {showUsageCap ? (\n <React.Fragment>\n <Alert\n variant=\"warn\"\n icon={<Icon name=\"zap\" size={15} />}\n title=\"用量由你承担\"\n >\n 每一轮对话消耗的都是你自己 DeepSeek\n 账户的额度。用得越多,调用越多——建议设置每月上限以防意外超支。\n </Alert>\n <div className={\"s-cap\" + (capOn ? \"\" : \" is-off\")}>\n <Switch\n label=\"启用每月用量上限\"\n checked={capOn}\n onChange={(e) => {\n setCapOn(e.target.checked);\n touch();\n }}\n />\n <div className=\"s-cap__field\" style={{ display: capOn ? \"flex\" : \"none\" }}>\n <input\n className=\"ax-input ax-input--mono\"\n type=\"text\"\n inputMode=\"numeric\"\n value={cap}\n onChange={(e) => {\n setCap(e.target.value.replace(/[^0-9]/g, \"\"));\n touch();\n }}\n aria-label=\"每月上限(元)\"\n />\n <span className=\"s-field__hint\" style={{ margin: 0 }}>\n 元 / 月,达到后暂停对话\n </span>\n </div>\n </div>\n </React.Fragment>\n ) : null}\n\n <HelpSteps\n title=\"如何获取 DeepSeek API Key?\"\n steps={[\n <>\n 登录 <code>platform.deepseek.com</code>,进入「API Keys」页面。\n </>,\n <>点击「创建 API Key」,命名后立即复制——密钥只在创建时完整显示一次。</>,\n <>在「充值」中确认账户余额充足,对话才能持续调用。</>,\n <>\n 把以 <code>sk-</code> 开头的密钥粘贴到上方输入框。\n </>,\n ]}\n link={{\n href: \"https://platform.deepseek.com\",\n label: \"打开 DeepSeek 开放平台\",\n }}\n />\n </div>\n\n <TestRow\n status={dsStatus}\n result={dsResult}\n onTest={testDeepSeek}\n disabled={!dsKey.trim()}\n idleHint=\"填写密钥后测试连通性\"\n />\n </section>\n\n {/* ── Card 2 · Feishu Bitable ── */}\n <section\n className={\n \"s-card\" +\n (fsStatus === \"ok\" ? \" is-ok\" : fsStatus === \"error\" ? \" is-error\" : \"\")\n }\n >\n <div className=\"s-card__head\">\n <div className=\"s-card__toprow\">\n <div className=\"s-card__icon\">\n <Icon name=\"table\" size={16} />\n </div>\n <span className=\"ax-label s-card__eyebrow\">数据写入 · FEISHU BITABLE</span>\n <span className=\"s-card__status\">\n <StatusPill status={fsStatus} />\n </span>\n </div>\n <h2 className=\"s-card__title\">飞书多维表格</h2>\n <p className=\"s-card__desc\">\n 每次提交后,数据自动写入指定多维表格的一行。需要一个飞书自建应用的凭证,以及目标表格的链接。\n </p>\n </div>\n\n <div className=\"s-card__body\">\n <div className=\"s-row2\">\n <div>\n <label className=\"s-field__label ax-label\">App ID</label>\n <input\n className=\"ax-input ax-input--mono\"\n type=\"text\"\n value={appId}\n spellCheck=\"false\"\n placeholder=\"cli_xxxxxxxxxxxx\"\n onChange={(e) => editFs(setAppId)(e.target.value)}\n />\n <p className=\"s-field__hint\">应用标识,可公开。</p>\n </div>\n <SecretField\n label=\"App Secret\"\n value={secret}\n onChange={editFs(setSecret)}\n placeholder=\"••••••••••••••••\"\n hint=\"应用密钥,加密存储。\"\n />\n </div>\n\n <div>\n <label className=\"s-field__label ax-label\">多维表格链接</label>\n <input\n className=\"ax-input\"\n type=\"text\"\n value={link}\n spellCheck=\"false\"\n placeholder=\"https://your-team.feishu.cn/base/bascn…?table=tbl…\"\n onChange={(e) => editFs(setLink)(e.target.value)}\n />\n <p className=\"s-field__hint\">\n 在多维表格右上角「分享」中复制链接粘贴即可,App Token 与数据表会自动识别。\n </p>\n </div>\n\n {parsed ? (\n <div className=\"s-detect\">\n <div className=\"s-detect__row\">\n <span className=\"s-detect__k\">App Token</span>\n <span className=\"s-detect__v\">{parsed.token}</span>\n <span className=\"s-detect__ok\">\n <Icon name=\"check\" size={12} />\n 已识别\n </span>\n </div>\n <div className=\"s-detect__row\">\n <span className=\"s-detect__k\">数据表</span>\n <span className=\"s-detect__v\">{parsed.table || \"—\"}</span>\n {parsed.table ? (\n <span className=\"s-detect__ok\">\n <Icon name=\"check\" size={12} />\n 已识别\n </span>\n ) : (\n <span className=\"s-detect__ok\" style={{ color: \"var(--warn)\" }}>\n <Icon name=\"warn\" size={12} />\n 缺失\n </span>\n )}\n </div>\n </div>\n ) : null}\n\n <div className=\"s-lock\">\n <Icon name=\"shield\" size={14} />\n <span>\n <strong>凭证加密存储</strong>,仅服务端用于写入数据。用户\n <strong>无法接触你的飞书凭证或表格权限。</strong>\n </span>\n </div>\n\n {fsConnected ? (\n <div>\n <div className=\"s-sub\" style={{ marginBottom: 12 }}>\n <span className=\"ax-label\">字段映射 · 自动</span>\n <span className=\"s-sub__line\"></span>\n </div>\n <table className=\"s-map\">\n <thead>\n <tr>\n <th>字段</th>\n <th className=\"s-map__arrow\"></th>\n <th>表格列</th>\n </tr>\n </thead>\n <tbody>\n {S_FIELD_MAP.map((m, i) => (\n <tr key={i}>\n <td className=\"s-map__from\">\n {m.from || <span style={{ color: \"var(--text-faint)\" }}>—</span>}\n </td>\n <td className=\"s-map__arrow\">\n <Icon name=\"arrow\" size={14} />\n </td>\n <td>\n <span className=\"s-map__col\">{m.to}</span>\n {m.tag ? <span className=\"s-map__tag\">{m.tag}</span> : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : null}\n\n <HelpSteps\n title=\"如何获取飞书应用凭证?\"\n steps={[\n <>\n 打开飞书开放平台 <code>open.feishu.cn</code>,创建一个「企业自建应用」。\n </>,\n <>\n 在「凭证与基础信息」中复制 <code>App ID</code> 与 <code>App Secret</code>。\n </>,\n <>\n 到「权限管理」开通多维表格读写权限 <code>bitable:app</code>,并发布版本。\n </>,\n <>\n 在目标多维表格里,把这个应用添加为<strong>可编辑协作者</strong>。\n </>,\n <>复制该多维表格的分享链接,粘贴到上方「多维表格链接」。</>,\n ]}\n link={{ href: \"https://open.feishu.cn\", label: \"打开飞书开放平台\" }}\n />\n </div>\n\n <TestRow\n status={fsStatus}\n result={fsResult}\n onTest={testFeishu}\n disabled={!appId.trim() || !secret.trim() || !parsed}\n idleHint=\"填写凭证与链接后测试写入权限\"\n />\n </section>\n </div>\n </div>\n </main>\n\n <footer className=\"s-save\">\n <div className=\"s-save__inner\">\n <div className=\"s-save__status\">\n {!allReady ? (\n <>\n <Icon name=\"info\" size={15} style={{ color: \"var(--text-faint)\" }} />\n <span>完成两项连接后即可保存并启用。</span>\n </>\n ) : saved ? (\n <>\n <Icon name=\"check\" size={15} style={{ color: \"var(--ok)\" }} />\n <span>已保存 · 已启用对话与数据写入。</span>\n </>\n ) : (\n <>\n <Icon name=\"zap\" size={15} style={{ color: \"var(--text-muted)\" }} />\n <span>配置已就绪,保存后立即生效。</span>\n </>\n )}\n </div>\n <div className=\"s-save__actions\">\n <Button variant=\"ghost\" size=\"md\" disabled={!dirty} onClick={onDiscard}>\n 放弃更改\n </Button>\n <Button\n variant=\"primary\"\n size=\"md\"\n icon={<Icon name=\"save\" size={14} />}\n disabled={!allReady || !dirty}\n onClick={onSave}\n >\n 保存配置\n </Button>\n </div>\n </div>\n </footer>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAmBA,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8F3B,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,oBAAoB,GAAG;AACrF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEA,MAAM,WAAW;AACjB,MAAM,UAAU,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAE5D,SAAS,cAAc,KAAK;AAC1B,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,IAAI,MAAM,wBAAwB,KAAK,IAAI,MAAM,8BAA8B;AAC9F,QAAM,SAAS,IAAI,MAAM,0BAA0B;AACnD,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,EAAE,OAAO,OAAO,CAAC,GAAG,OAAO,SAAS,OAAO,CAAC,IAAI,GAAA;AACzD;AAEA,MAAM,cAAc;AAAA,EAClB,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,KAAA;AAAA,EAC7B,EAAE,MAAM,OAAO,IAAI,OAAO,KAAK,KAAA;AAAA,EAC/B,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,KAAA;AAAA,EAC7B,EAAE,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAA;AAAA,EAC/B,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,KAAA;AAAA,EAC7B,EAAE,MAAM,MAAM,IAAI,QAAQ,KAAK,KAAA;AAAA,EAC/B,EAAE,MAAM,MAAM,IAAI,QAAQ,KAAK,KAAA;AACjC;AAUO,SAAS,oBAAoB,EAAE,SAAS,eAAe,MAAM,aAAa,YAAY;AAC3F,QAAM,OAAO,MAAM;AACjB,QAAI;AACF,aAAO,KAAK,MAAM,aAAa,QAAQ,UAAU,CAAC,KAAK,CAAA;AAAA,IACzD,SAAS,GAAG;AACV,aAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,QAAM,OAAO,OAAO,KAAA,CAAM,EAAE;AAE5B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,KAAK,SAAS,EAAE;AACnD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK,WAAW,eAAe;AACtE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,CAAC,CAAC,KAAK,KAAK;AAC/C,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO,KAAK;AAChD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK,aAAa,OAAO,OAAO,MAAM;AAC/E,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK,YAAY,EAAE;AAE5D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,KAAK,SAAS,EAAE;AACnD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK,UAAU,EAAE;AACtD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK,QAAQ,EAAE;AAChD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK,aAAa,OAAO,OAAO,MAAM;AAC/E,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK,YAAY,EAAE;AAE5D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,KAAK;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,CAAC,CAAC,KAAK,KAAK;AAE/C,YAAU,MAAM;AACd,UAAM,QAAQ,CAAC,MAAM;AACnB,UAAI,EAAE,QAAQ,SAAU,YAAW,QAAA;AAAA,IACrC;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,SAAS,cAAc,IAAI;AACjC,QAAM,cAAc,aAAa;AACjC,QAAM,cAAc,aAAa;AACjC,QAAM,cAAc,cAAc,IAAI,MAAM,cAAc,IAAI;AAC9D,QAAM,WAAW,eAAe;AAEhC,YAAU,MAAM;AACd,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,QAAI;AACF,mBAAa,QAAQ,YAAY,KAAK,UAAU,IAAI,CAAC;AAAA,IACvD,SAAS,GAAG;AAAA,IAAC;AAAA,EACf,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,QAAQ,MAAM;AAClB,aAAS,IAAI;AACb,aAAS,KAAK;AAAA,EAChB;AACA,QAAM,SAAS,CAAC,WAAW,CAAC,MAAM;AAChC,WAAO,CAAC;AACR,QAAI,aAAa,QAAQ;AACvB,kBAAY,MAAM;AAClB,kBAAY,EAAE;AAAA,IAChB;AACA,UAAA;AAAA,EACF;AACA,QAAM,SAAS,CAAC,WAAW,CAAC,MAAM;AAChC,WAAO,CAAC;AACR,QAAI,aAAa,QAAQ;AACvB,kBAAY,MAAM;AAClB,kBAAY,EAAE;AAAA,IAChB;AACA,UAAA;AAAA,EACF;AAEA,QAAM,eAAe,YAAY;AAC/B,gBAAY,SAAS;AACrB,gBAAY,EAAE;AACd,UAAM,QAAQ,IAAI;AAClB,UAAM,IAAI,MAAM,KAAA;AAChB,QAAI,EAAE,WAAW,KAAK,KAAK,EAAE,UAAU,IAAI;AACzC,kBAAY,IAAI;AAChB,kBAAY,oBAAoB,OAAO,EAAE;AAAA,IAC3C,OAAO;AACL,kBAAY,OAAO;AACnB,kBAAY,IAAI,qBAAqB,cAAc;AAAA,IACrD;AACA,UAAA;AAAA,EACF;AAEA,QAAM,aAAa,YAAY;AAC7B,gBAAY,SAAS;AACrB,gBAAY,EAAE;AACd,UAAM,QAAQ,IAAI;AAClB,QAAI,CAAC,MAAM,KAAA,KAAU,CAAC,OAAO,QAAQ;AACnC,kBAAY,OAAO;AACnB,kBAAY,wBAAwB;AACpC,YAAA;AACA;AAAA,IACF;AACA,QAAI,CAAC,QAAQ;AACX,kBAAY,OAAO;AACnB,kBAAY,sBAAsB;AAClC,YAAA;AACA;AAAA,IACF;AACA,QAAI,CAAC,OAAO,OAAO;AACjB,kBAAY,OAAO;AACnB,kBAAY,oBAAoB;AAChC,YAAA;AACA;AAAA,IACF;AACA,gBAAY,IAAI;AAChB,gBAAY,yBAAyB;AACrC,UAAA;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AACnB,aAAS,IAAI;AACb,aAAS,KAAK;AAAA,EAChB;AACA,QAAM,YAAY,MAAM;AACtB,UAAM,IAAI,KAAA;AACV,aAAS,EAAE,SAAS,EAAE;AACtB,eAAW,EAAE,WAAW,eAAe;AACvC,aAAS,CAAC,CAAC,EAAE,KAAK;AAClB,WAAO,EAAE,OAAO,KAAK;AACrB,gBAAY,EAAE,aAAa,OAAO,OAAO,MAAM;AAC/C,gBAAY,EAAE,YAAY,EAAE;AAC5B,aAAS,EAAE,SAAS,EAAE;AACtB,cAAU,EAAE,UAAU,EAAE;AACxB,YAAQ,EAAE,QAAQ,EAAE;AACpB,gBAAY,EAAE,aAAa,OAAO,OAAO,MAAM;AAC/C,gBAAY,EAAE,YAAY,EAAE;AAC5B,aAAS,CAAC,CAAC,EAAE,KAAK;AAClB,aAAS,KAAK;AAAA,EAChB;AAEA,SACE,oBAAC,OAAA,EAAI,WAAU,aAAY,MAAK,UAAS,cAAW,QAAO,cAAW,QACpE,UAAA,qBAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,IAAA,qBAAC,UAAA,EAAO,WAAU,gBAChB,UAAA;AAAA,MAAA,qBAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,QAAA,oBAAC,WAAA,EAAU,MAAM,GAAA,CAAI;AAAA,QACrB,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,aAAS;AAAA,QACzC,oBAAC,QAAA,EAAK,WAAU,gBAAe,UAAA,KAAC;AAAA,QAChC,oBAAC,QAAA,EAAK,WAAU,kBAAiB,UAAA,OAAA,CAAI;AAAA,MAAA,GACvC;AAAA,MACA,qBAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,QAAA,oBAAC,OAAA,EAAM,SAAS,WAAW,OAAO,WAAW,KAAK,UAC/C,UAAA,WAAW,OAAO,MAAA,CACrB;AAAA,QACA,oBAAC,YAAA,EAAW,OAAM,MAAK,SAAS,MAAM,WAAW,QAAA,GAC/C,8BAAC,MAAA,EAAK,MAAK,KAAI,MAAM,IAAI,EAAA,CAC3B;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,wBAEC,QAAA,EAAK,WAAU,iBACd,UAAA,qBAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,MAAA,qBAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,QAAA,oBAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA,qBAAiB;AAAA,QAC1D,oBAAC,MAAA,EAAG,WAAU,aAAY,UAAA,UAAM;AAAA,QAChC,oBAAC,KAAA,EAAE,WAAU,aAAY,UAAA,0DAAA,CAGzB;AAAA,MAAA,GACF;AAAA,MAEA,qBAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAW,kBAAkB,cAAc,WAAW,KAAK;AAAA,8BAChE,QAAA,EAAK,WAAW,kBAAkB,cAAc,WAAW,IAAA,CAAK;AAAA,QAAA,GACnE;AAAA,4BACC,OAAA,EAAI,WAAU,gBACZ,UAAA,gCACE,QAAA,EACC,UAAA;AAAA,UAAA,oBAAC,YAAO,UAAA,YAAA,CAAS;AAAA,UAAS;AAAA,QAAA,EAAA,CAC5B,yBAEC,QAAA,EAAK,UAAA;AAAA,UAAA;AAAA,UACC,oBAAC,YAAO,UAAA,MAAA,CAAG;AAAA,UAAS;AAAA,QAAA,EAAA,CAC3B,EAAA,CAEJ;AAAA,QACA,qBAAC,QAAA,EAAK,WAAU,kBAAkB,UAAA;AAAA,UAAA;AAAA,UAAW;AAAA,QAAA,EAAA,CAAI;AAAA,MAAA,GACnD;AAAA,MAEA,qBAAC,OAAA,EAAI,WAAU,WAEb,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WACE,YACC,aAAa,OAAO,WAAW,aAAa,UAAU,cAAc;AAAA,YAGvE,UAAA;AAAA,cAAA,qBAAC,OAAA,EAAI,WAAU,gBACb,UAAA;AAAA,gBAAA,qBAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,kBAAA,oBAAC,OAAA,EAAI,WAAU,gBACb,UAAA,oBAAC,QAAK,MAAK,OAAM,MAAM,GAAA,CAAI,EAAA,CAC7B;AAAA,kBACA,oBAAC,QAAA,EAAK,WAAU,4BAA2B,UAAA,cAAU;AAAA,kBACrD,oBAAC,UAAK,WAAU,kBACd,8BAAC,YAAA,EAAW,QAAQ,UAAU,EAAA,CAChC;AAAA,gBAAA,GACF;AAAA,gBACA,oBAAC,MAAA,EAAG,WAAU,iBAAgB,UAAA,YAAQ;AAAA,gBACtC,oBAAC,KAAA,EAAE,WAAU,gBAAe,UAAA,4CAAA,CAE5B;AAAA,cAAA,GACF;AAAA,cAEA,qBAAC,OAAA,EAAI,WAAU,gBACb,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAM;AAAA,oBACN,OAAO;AAAA,oBACP,UAAU,OAAO,QAAQ;AAAA,oBACzB,aAAY;AAAA,oBACZ,OAAO,aAAa,WAAW,CAAC,MAAM,KAAA,IAAS,SAAS;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAG1D,qBAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,kBAAA,oBAAC,MAAA,EAAK,MAAK,QAAO,MAAM,IAAI;AAAA,uCAC3B,QAAA,EACC,UAAA;AAAA,oBAAA,oBAAC,YAAO,UAAA,SAAA,CAAM;AAAA,oBAAS;AAAA,oBACvB,oBAAC,YAAO,UAAA,kBAAA,CAAe;AAAA,kBAAA,EAAA,CACzB;AAAA,gBAAA,GACF;AAAA,gBAEA,oBAAC,OAAA,EAAI,WAAU,UACb,+BAAC,OAAA,EACC,UAAA;AAAA,kBAAA,oBAAC,SAAA,EAAM,WAAU,2BAA0B,UAAA,QAAI;AAAA,kBAC/C;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM,OAAO,UAAU,EAAE,EAAE,OAAO,KAAK;AAAA,sBAClD,SAAS;AAAA,wBACP,EAAE,OAAO,iBAAiB,OAAO,yBAAA;AAAA,wBACjC,EAAE,OAAO,qBAAqB,OAAO,2BAAA;AAAA,sBAA2B;AAAA,oBAClE;AAAA,kBAAA;AAAA,gBACF,EAAA,CACF,EAAA,CACF;AAAA,gBAEC,eACC,qBAAC,MAAM,UAAN,EACC,UAAA;AAAA,kBAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,MAAM,oBAAC,MAAA,EAAK,MAAK,OAAM,MAAM,IAAI;AAAA,sBACjC,OAAM;AAAA,sBACP,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,uCAIA,OAAA,EAAI,WAAW,WAAW,QAAQ,KAAK,YACtC,UAAA;AAAA,oBAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,OAAM;AAAA,wBACN,SAAS;AAAA,wBACT,UAAU,CAAC,MAAM;AACf,mCAAS,EAAE,OAAO,OAAO;AACzB,gCAAA;AAAA,wBACF;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAEF,qBAAC,OAAA,EAAI,WAAU,gBAAe,OAAO,EAAE,SAAS,QAAQ,SAAS,OAAA,GAC/D,UAAA;AAAA,sBAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,WAAU;AAAA,0BACV,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM;AACf,mCAAO,EAAE,OAAO,MAAM,QAAQ,WAAW,EAAE,CAAC;AAC5C,kCAAA;AAAA,0BACF;AAAA,0BACA,cAAW;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEb,oBAAC,UAAK,WAAU,iBAAgB,OAAO,EAAE,QAAQ,EAAA,GAAK,UAAA,gBAAA,CAEtD;AAAA,oBAAA,EAAA,CACF;AAAA,kBAAA,EAAA,CACF;AAAA,gBAAA,EAAA,CACF,IACE;AAAA,gBAEJ;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAM;AAAA,oBACN,OAAO;AAAA,sBACL,qBAAA,UAAA,EAAE,UAAA;AAAA,wBAAA;AAAA,wBACG,oBAAC,UAAK,UAAA,wBAAA,CAAqB;AAAA,wBAAO;AAAA,sBAAA,GACvC;AAAA,sDACE,UAAA,yCAAA,CAAsC;AAAA,sDACtC,UAAA,2BAAA,CAAwB;AAAA,sBAC1B,qBAAA,UAAA,EAAE,UAAA;AAAA,wBAAA;AAAA,wBACG,oBAAC,UAAK,UAAA,MAAA,CAAG;AAAA,wBAAO;AAAA,sBAAA,EAAA,CACrB;AAAA,oBAAA;AAAA,oBAEF,MAAM;AAAA,sBACJ,MAAM;AAAA,sBACN,OAAO;AAAA,oBAAA;AAAA,kBACT;AAAA,gBAAA;AAAA,cACF,GACF;AAAA,cAEA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,UAAU,CAAC,MAAM,KAAA;AAAA,kBACjB,UAAS;AAAA,gBAAA;AAAA,cAAA;AAAA,YACX;AAAA,UAAA;AAAA,QAAA;AAAA,QAIF;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WACE,YACC,aAAa,OAAO,WAAW,aAAa,UAAU,cAAc;AAAA,YAGvE,UAAA;AAAA,cAAA,qBAAC,OAAA,EAAI,WAAU,gBACb,UAAA;AAAA,gBAAA,qBAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,kBAAA,oBAAC,OAAA,EAAI,WAAU,gBACb,UAAA,oBAAC,QAAK,MAAK,SAAQ,MAAM,GAAA,CAAI,EAAA,CAC/B;AAAA,kBACA,oBAAC,QAAA,EAAK,WAAU,4BAA2B,UAAA,yBAAqB;AAAA,kBAChE,oBAAC,UAAK,WAAU,kBACd,8BAAC,YAAA,EAAW,QAAQ,UAAU,EAAA,CAChC;AAAA,gBAAA,GACF;AAAA,gBACA,oBAAC,MAAA,EAAG,WAAU,iBAAgB,UAAA,UAAM;AAAA,gBACpC,oBAAC,KAAA,EAAE,WAAU,gBAAe,UAAA,iDAAA,CAE5B;AAAA,cAAA,GACF;AAAA,cAEA,qBAAC,OAAA,EAAI,WAAU,gBACb,UAAA;AAAA,gBAAA,qBAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,kBAAA,qBAAC,OAAA,EACC,UAAA;AAAA,oBAAA,oBAAC,SAAA,EAAM,WAAU,2BAA0B,UAAA,UAAM;AAAA,oBACjD;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,MAAK;AAAA,wBACL,OAAO;AAAA,wBACP,YAAW;AAAA,wBACX,aAAY;AAAA,wBACZ,UAAU,CAAC,MAAM,OAAO,QAAQ,EAAE,EAAE,OAAO,KAAK;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAElD,oBAAC,KAAA,EAAE,WAAU,iBAAgB,UAAA,YAAA,CAAS;AAAA,kBAAA,GACxC;AAAA,kBACA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAM;AAAA,sBACN,OAAO;AAAA,sBACP,UAAU,OAAO,SAAS;AAAA,sBAC1B,aAAY;AAAA,sBACZ,MAAK;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACP,GACF;AAAA,qCAEC,OAAA,EACC,UAAA;AAAA,kBAAA,oBAAC,SAAA,EAAM,WAAU,2BAA0B,UAAA,UAAM;AAAA,kBACjD;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,MAAK;AAAA,sBACL,OAAO;AAAA,sBACP,YAAW;AAAA,sBACX,aAAY;AAAA,sBACZ,UAAU,CAAC,MAAM,OAAO,OAAO,EAAE,EAAE,OAAO,KAAK;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEjD,oBAAC,KAAA,EAAE,WAAU,iBAAgB,UAAA,6CAAA,CAE7B;AAAA,gBAAA,GACF;AAAA,gBAEC,SACC,qBAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,kBAAA,qBAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,oBAAA,oBAAC,QAAA,EAAK,WAAU,eAAc,UAAA,aAAS;AAAA,oBACvC,oBAAC,QAAA,EAAK,WAAU,eAAe,iBAAO,OAAM;AAAA,oBAC5C,qBAAC,QAAA,EAAK,WAAU,gBACd,UAAA;AAAA,sBAAA,oBAAC,MAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA,sBAAE;AAAA,oBAAA,EAAA,CAEjC;AAAA,kBAAA,GACF;AAAA,kBACA,qBAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,oBAAA,oBAAC,QAAA,EAAK,WAAU,eAAc,UAAA,OAAG;AAAA,wCAChC,QAAA,EAAK,WAAU,eAAe,UAAA,OAAO,SAAS,KAAI;AAAA,oBAClD,OAAO,QACN,qBAAC,QAAA,EAAK,WAAU,gBACd,UAAA;AAAA,sBAAA,oBAAC,MAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA,sBAAE;AAAA,oBAAA,EAAA,CAEjC,yBAEC,QAAA,EAAK,WAAU,gBAAe,OAAO,EAAE,OAAO,cAAA,GAC7C,UAAA;AAAA,sBAAA,oBAAC,MAAA,EAAK,MAAK,QAAO,MAAM,IAAI;AAAA,sBAAE;AAAA,oBAAA,EAAA,CAEhC;AAAA,kBAAA,EAAA,CAEJ;AAAA,gBAAA,EAAA,CACF,IACE;AAAA,gBAEJ,qBAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,kBAAA,oBAAC,MAAA,EAAK,MAAK,UAAS,MAAM,IAAI;AAAA,uCAC7B,QAAA,EACC,UAAA;AAAA,oBAAA,oBAAC,YAAO,UAAA,SAAA,CAAM;AAAA,oBAAS;AAAA,oBACvB,oBAAC,YAAO,UAAA,mBAAA,CAAgB;AAAA,kBAAA,EAAA,CAC1B;AAAA,gBAAA,GACF;AAAA,gBAEC,mCACE,OAAA,EACC,UAAA;AAAA,kBAAA,qBAAC,SAAI,WAAU,SAAQ,OAAO,EAAE,cAAc,MAC5C,UAAA;AAAA,oBAAA,oBAAC,QAAA,EAAK,WAAU,YAAW,UAAA,aAAS;AAAA,oBACpC,oBAAC,QAAA,EAAK,WAAU,cAAA,CAAc;AAAA,kBAAA,GAChC;AAAA,kBACA,qBAAC,SAAA,EAAM,WAAU,SACf,UAAA;AAAA,oBAAA,oBAAC,SAAA,EACC,+BAAC,MAAA,EACC,UAAA;AAAA,sBAAA,oBAAC,QAAG,UAAA,KAAA,CAAE;AAAA,sBACN,oBAAC,MAAA,EAAG,WAAU,eAAA,CAAe;AAAA,sBAC7B,oBAAC,QAAG,UAAA,MAAA,CAAG;AAAA,oBAAA,EAAA,CACT,EAAA,CACF;AAAA,oBACA,oBAAC,WACE,UAAA,YAAY,IAAI,CAAC,GAAG,2BAClB,MAAA,EACC,UAAA;AAAA,sBAAA,oBAAC,MAAA,EAAG,WAAU,eACX,UAAA,EAAE,QAAQ,oBAAC,QAAA,EAAK,OAAO,EAAE,OAAO,oBAAA,GAAuB,eAAC,GAC3D;AAAA,sBACA,oBAAC,MAAA,EAAG,WAAU,gBACZ,UAAA,oBAAC,QAAK,MAAK,SAAQ,MAAM,GAAA,CAAI,EAAA,CAC/B;AAAA,2CACC,MAAA,EACC,UAAA;AAAA,wBAAA,oBAAC,QAAA,EAAK,WAAU,cAAc,UAAA,EAAE,IAAG;AAAA,wBAClC,EAAE,MAAM,oBAAC,QAAA,EAAK,WAAU,cAAc,UAAA,EAAE,KAAI,IAAU;AAAA,sBAAA,EAAA,CACzD;AAAA,oBAAA,EAAA,GAVO,CAWT,CACD,EAAA,CACH;AAAA,kBAAA,EAAA,CACF;AAAA,gBAAA,EAAA,CACF,IACE;AAAA,gBAEJ;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAM;AAAA,oBACN,OAAO;AAAA,sBACL,qBAAA,UAAA,EAAE,UAAA;AAAA,wBAAA;AAAA,wBACS,oBAAC,UAAK,UAAA,iBAAA,CAAc;AAAA,wBAAO;AAAA,sBAAA,GACtC;AAAA,sBACA,qBAAA,UAAA,EAAE,UAAA;AAAA,wBAAA;AAAA,wBACc,oBAAC,UAAK,UAAA,SAAA,CAAM;AAAA,wBAAO;AAAA,wBAAG,oBAAC,UAAK,UAAA,aAAA,CAAU;AAAA,wBAAO;AAAA,sBAAA,GAC7D;AAAA,sBACA,qBAAA,UAAA,EAAE,UAAA;AAAA,wBAAA;AAAA,wBACkB,oBAAC,UAAK,UAAA,cAAA,CAAW;AAAA,wBAAO;AAAA,sBAAA,GAC5C;AAAA,sBACA,qBAAA,UAAA,EAAE,UAAA;AAAA,wBAAA;AAAA,wBACiB,oBAAC,YAAO,UAAA,SAAA,CAAM;AAAA,wBAAS;AAAA,sBAAA,GAC1C;AAAA,sDACE,UAAA,8BAAA,CAA2B;AAAA,oBAAA;AAAA,oBAE/B,MAAM,EAAE,MAAM,0BAA0B,OAAO,WAAA;AAAA,kBAAW;AAAA,gBAAA;AAAA,cAC5D,GACF;AAAA,cAEA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,UAAU,CAAC,MAAM,KAAA,KAAU,CAAC,OAAO,KAAA,KAAU,CAAC;AAAA,kBAC9C,UAAS;AAAA,gBAAA;AAAA,cAAA;AAAA,YACX;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,wBAEC,UAAA,EAAO,WAAU,UAChB,UAAA,qBAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,MAAA,oBAAC,OAAA,EAAI,WAAU,kBACZ,UAAA,CAAC,WACA,qBAAA,UAAA,EACE,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAK,MAAK,QAAO,MAAM,IAAI,OAAO,EAAE,OAAO,oBAAA,EAAoB,CAAG;AAAA,QACnE,oBAAC,UAAK,UAAA,kBAAA,CAAe;AAAA,MAAA,EAAA,CACvB,IACE,QACF,qBAAA,UAAA,EACE,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAK,MAAK,SAAQ,MAAM,IAAI,OAAO,EAAE,OAAO,YAAA,EAAY,CAAG;AAAA,QAC5D,oBAAC,UAAK,UAAA,oBAAA,CAAiB;AAAA,MAAA,EAAA,CACzB,IAEA,qBAAA,UAAA,EACE,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAK,MAAK,OAAM,MAAM,IAAI,OAAO,EAAE,OAAO,oBAAA,EAAoB,CAAG;AAAA,QAClE,oBAAC,UAAK,UAAA,iBAAA,CAAc;AAAA,MAAA,EAAA,CACtB,EAAA,CAEJ;AAAA,MACA,qBAAC,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAO,SAAQ,SAAQ,MAAK,MAAK,UAAU,CAAC,OAAO,SAAS,WAAW,UAAA,OAAA,CAExE;AAAA,QACA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,MAAM,oBAAC,MAAA,EAAK,MAAK,QAAO,MAAM,IAAI;AAAA,YAClC,UAAU,CAAC,YAAY,CAAC;AAAA,YACxB,SAAS;AAAA,YACV,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;"}
|