@agentaily/design-system 0.2.0 → 0.4.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.
Files changed (79) hide show
  1. package/DESIGN.md +56 -7
  2. package/README.md +5 -5
  3. package/dist/components/ai/Confirmation.js +58 -22
  4. package/dist/components/ai/Confirmation.js.map +1 -1
  5. package/dist/components/ai/Queue.d.ts +23 -0
  6. package/dist/components/ai/Queue.js +52 -1
  7. package/dist/components/ai/Queue.js.map +1 -1
  8. package/dist/components/ai/ToolCall.js +69 -30
  9. package/dist/components/ai/ToolCall.js.map +1 -1
  10. package/dist/components/auth/AccountControl.d.ts +23 -0
  11. package/dist/components/auth/AccountControl.js +47 -0
  12. package/dist/components/auth/AccountControl.js.map +1 -0
  13. package/dist/components/auth/AuthDialog.d.ts +39 -0
  14. package/dist/components/auth/AuthDialog.js +327 -0
  15. package/dist/components/auth/AuthDialog.js.map +1 -0
  16. package/dist/components/auth/SignInPage.d.ts +69 -0
  17. package/dist/components/auth/SignInPage.js +239 -0
  18. package/dist/components/auth/SignInPage.js.map +1 -0
  19. package/dist/components/chat/CodeBlock.js +3 -2
  20. package/dist/components/chat/CodeBlock.js.map +1 -1
  21. package/dist/components/chat/ConversationThread.d.ts +67 -0
  22. package/dist/components/chat/ConversationThread.js +129 -0
  23. package/dist/components/chat/ConversationThread.js.map +1 -0
  24. package/dist/components/code/Artifact.js +44 -9
  25. package/dist/components/code/Artifact.js.map +1 -1
  26. package/dist/components/code/JSXPreview.js +19 -12
  27. package/dist/components/code/JSXPreview.js.map +1 -1
  28. package/dist/components/code/Snippet.js +2 -2
  29. package/dist/components/code/Snippet.js.map +1 -1
  30. package/dist/components/code/Terminal.js +24 -10
  31. package/dist/components/code/Terminal.js.map +1 -1
  32. package/dist/components/code/WebPreview.js +44 -10
  33. package/dist/components/code/WebPreview.js.map +1 -1
  34. package/dist/components/display/Skeleton.js +17 -4
  35. package/dist/components/display/Skeleton.js.map +1 -1
  36. package/dist/components/display/StatusPill.d.ts +12 -0
  37. package/dist/components/display/StatusPill.js +17 -0
  38. package/dist/components/display/StatusPill.js.map +1 -0
  39. package/dist/components/inputs/SecretField.d.ts +21 -0
  40. package/dist/components/inputs/SecretField.js +70 -0
  41. package/dist/components/inputs/SecretField.js.map +1 -0
  42. package/dist/components/layout/AppShell.d.ts +30 -0
  43. package/dist/components/layout/AppShell.js +117 -0
  44. package/dist/components/layout/AppShell.js.map +1 -0
  45. package/dist/components/layout/DesignerShell.d.ts +39 -0
  46. package/dist/components/layout/DesignerShell.js +146 -0
  47. package/dist/components/layout/DesignerShell.js.map +1 -0
  48. package/dist/components/layout/DocsLayout.d.ts +24 -0
  49. package/dist/components/layout/DocsLayout.js +113 -0
  50. package/dist/components/layout/DocsLayout.js.map +1 -0
  51. package/dist/components/layout/SettingsPage.d.ts +31 -0
  52. package/dist/components/layout/SettingsPage.js +92 -0
  53. package/dist/components/layout/SettingsPage.js.map +1 -0
  54. package/dist/components/review/MarkupLayer.d.ts +20 -0
  55. package/dist/components/review/MarkupLayer.js +237 -0
  56. package/dist/components/review/MarkupLayer.js.map +1 -0
  57. package/dist/components/settings/HelpSteps.d.ts +20 -0
  58. package/dist/components/settings/HelpSteps.js +40 -0
  59. package/dist/components/settings/HelpSteps.js.map +1 -0
  60. package/dist/components/settings/IntegrationSettings.d.ts +15 -0
  61. package/dist/components/settings/IntegrationSettings.js +630 -0
  62. package/dist/components/settings/IntegrationSettings.js.map +1 -0
  63. package/dist/components/settings/TestRow.d.ts +21 -0
  64. package/dist/components/settings/TestRow.js +66 -0
  65. package/dist/components/settings/TestRow.js.map +1 -0
  66. package/dist/components/utilities/BrandMark.d.ts +17 -0
  67. package/dist/components/utilities/BrandMark.js +43 -0
  68. package/dist/components/utilities/BrandMark.js.map +1 -0
  69. package/dist/components/utilities/Icon.d.ts +28 -0
  70. package/dist/components/utilities/Icon.js +196 -0
  71. package/dist/components/utilities/Icon.js.map +1 -0
  72. package/dist/components/utilities/RotatingTagline.d.ts +30 -0
  73. package/dist/components/utilities/RotatingTagline.js +90 -0
  74. package/dist/components/utilities/RotatingTagline.js.map +1 -0
  75. package/dist/index.d.ts +23 -0
  76. package/dist/index.js +34 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/styles.css +67 -64
  79. package/package.json +2 -2
@@ -0,0 +1 @@
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":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Test-connection footer for a connection card: an inline status result paired
3
+ * with a test/re-test button. Drives off a single `status` string with four
4
+ * states. Renders inside any card (it draws its own top border + panel fill).
5
+ */
6
+ export interface TestRowProps {
7
+ /** @default "idle" */
8
+ status?: "idle" | "testing" | "ok" | "error";
9
+ /** Result text shown for the ok / error states. */
10
+ result?: string;
11
+ onTest?: () => void;
12
+ /** Disable the button (e.g. required fields empty). Testing also disables it. */
13
+ disabled?: boolean;
14
+ /** Text shown in the idle state. @default "尚未测试" */
15
+ idleHint?: string;
16
+ /** @default "测试连接" */
17
+ testLabel?: string;
18
+ /** @default "重新测试" */
19
+ retestLabel?: string;
20
+ }
21
+ export declare function TestRow(props: TestRowProps): JSX.Element;
@@ -0,0 +1,66 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import "react";
3
+ import { Button } from "../buttons/Button.js";
4
+ import { Icon } from "../utilities/Icon.js";
5
+ import { Spinner } from "../feedback/Spinner.js";
6
+ const AX_TESTROW_CSS = `
7
+ .s-foot { display: flex; align-items: center; gap: 14px; padding: 14px 24px; border-top: 1px solid var(--border-default);
8
+ background: var(--surface-panel); }
9
+ .s-foot__result { flex: 1; min-width: 0; display: flex; align-items: center; gap: 8px; font-size: var(--text-sm);
10
+ font-family: var(--font-mono); }
11
+ .s-foot__result.is-idle { color: var(--text-faint); font-size: var(--text-xs); letter-spacing: 0.02em; }
12
+ .s-foot__result.is-testing { color: var(--text-muted); }
13
+ .s-foot__result.is-ok { color: var(--ok); }
14
+ .s-foot__result.is-error { color: var(--danger); }
15
+ .s-foot__result svg { flex: none; }
16
+ .s-spin-inline { display: inline-flex; }
17
+ @media (max-width: 520px) { .s-foot { flex-wrap: wrap; } }
18
+ `;
19
+ if (typeof document !== "undefined" && !document.getElementById("ax-testrow-css")) {
20
+ const s = document.createElement("style");
21
+ s.id = "ax-testrow-css";
22
+ s.textContent = AX_TESTROW_CSS;
23
+ document.head.appendChild(s);
24
+ }
25
+ function TestRow({
26
+ status = "idle",
27
+ result,
28
+ onTest,
29
+ disabled = false,
30
+ idleHint,
31
+ testLabel = "测试连接",
32
+ retestLabel = "重新测试"
33
+ }) {
34
+ return /* @__PURE__ */ jsxs("div", { className: "s-foot", children: [
35
+ /* @__PURE__ */ jsxs("div", { className: "s-foot__result is-" + status, children: [
36
+ status === "idle" && /* @__PURE__ */ jsx("span", { children: idleHint || "尚未测试" }),
37
+ status === "testing" && /* @__PURE__ */ jsxs(Fragment, { children: [
38
+ /* @__PURE__ */ jsx("span", { className: "s-spin-inline", children: /* @__PURE__ */ jsx(Spinner, { size: "sm" }) }),
39
+ /* @__PURE__ */ jsx("span", { children: "正在握手…" })
40
+ ] }),
41
+ status === "ok" && /* @__PURE__ */ jsxs(Fragment, { children: [
42
+ /* @__PURE__ */ jsx(Icon, { name: "check", size: 15 }),
43
+ /* @__PURE__ */ jsx("span", { children: result })
44
+ ] }),
45
+ status === "error" && /* @__PURE__ */ jsxs(Fragment, { children: [
46
+ /* @__PURE__ */ jsx(Icon, { name: "x", size: 15 }),
47
+ /* @__PURE__ */ jsx("span", { children: result })
48
+ ] })
49
+ ] }),
50
+ /* @__PURE__ */ jsx(
51
+ Button,
52
+ {
53
+ variant: "secondary",
54
+ size: "sm",
55
+ disabled: disabled || status === "testing",
56
+ icon: /* @__PURE__ */ jsx(Icon, { name: status === "ok" ? "refresh" : "plug", size: 14 }),
57
+ onClick: onTest,
58
+ children: status === "ok" ? retestLabel : testLabel
59
+ }
60
+ )
61
+ ] });
62
+ }
63
+ export {
64
+ TestRow
65
+ };
66
+ //# sourceMappingURL=TestRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestRow.js","sources":["../../../src/components/settings/TestRow.jsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"../buttons/Button.jsx\";\nimport { Icon } from \"../utilities/Icon.jsx\";\nimport { Spinner } from \"../feedback/Spinner.jsx\";\n\n// TestRow — the \"测试连接\" footer for a connection card: an inline result that\n// reflects four states (idle / testing / ok / error) next to a test button.\nconst AX_TESTROW_CSS = `\n.s-foot { display: flex; align-items: center; gap: 14px; padding: 14px 24px; border-top: 1px solid var(--border-default);\n background: var(--surface-panel); }\n.s-foot__result { flex: 1; min-width: 0; display: flex; align-items: center; gap: 8px; font-size: var(--text-sm);\n font-family: var(--font-mono); }\n.s-foot__result.is-idle { color: var(--text-faint); font-size: var(--text-xs); letter-spacing: 0.02em; }\n.s-foot__result.is-testing { color: var(--text-muted); }\n.s-foot__result.is-ok { color: var(--ok); }\n.s-foot__result.is-error { color: var(--danger); }\n.s-foot__result svg { flex: none; }\n.s-spin-inline { display: inline-flex; }\n@media (max-width: 520px) { .s-foot { flex-wrap: wrap; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-testrow-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-testrow-css\";\n s.textContent = AX_TESTROW_CSS;\n document.head.appendChild(s);\n}\n\nexport function TestRow({\n status = \"idle\",\n result,\n onTest,\n disabled = false,\n idleHint,\n testLabel = \"测试连接\",\n retestLabel = \"重新测试\",\n}) {\n return (\n <div className=\"s-foot\">\n <div className={\"s-foot__result is-\" + status}>\n {status === \"idle\" && <span>{idleHint || \"尚未测试\"}</span>}\n {status === \"testing\" && (\n <>\n <span className=\"s-spin-inline\">\n <Spinner size=\"sm\" />\n </span>\n <span>正在握手…</span>\n </>\n )}\n {status === \"ok\" && (\n <>\n <Icon name=\"check\" size={15} />\n <span>{result}</span>\n </>\n )}\n {status === \"error\" && (\n <>\n <Icon name=\"x\" size={15} />\n <span>{result}</span>\n </>\n )}\n </div>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={disabled || status === \"testing\"}\n icon={<Icon name={status === \"ok\" ? \"refresh\" : \"plug\"} size={14} />}\n onClick={onTest}\n >\n {status === \"ok\" ? retestLabel : testLabel}\n </Button>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;AAOA,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcvB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,gBAAgB,GAAG;AACjF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,QAAQ;AAAA,EACtB,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAChB,GAAG;AACD,SACE,qBAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAW,uBAAuB,QACpC,UAAA;AAAA,MAAA,WAAW,UAAU,oBAAC,QAAA,EAAM,UAAA,YAAY,QAAO;AAAA,MAC/C,WAAW,aACV,qBAAA,UAAA,EACE,UAAA;AAAA,QAAA,oBAAC,UAAK,WAAU,iBACd,8BAAC,SAAA,EAAQ,MAAK,MAAK,EAAA,CACrB;AAAA,QACA,oBAAC,UAAK,UAAA,QAAA,CAAK;AAAA,MAAA,GACb;AAAA,MAED,WAAW,QACV,qBAAA,UAAA,EACE,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA,QAC7B,oBAAC,UAAM,UAAA,OAAA,CAAO;AAAA,MAAA,GAChB;AAAA,MAED,WAAW,WACV,qBAAA,UAAA,EACE,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAK,MAAK,KAAI,MAAM,IAAI;AAAA,QACzB,oBAAC,UAAM,UAAA,OAAA,CAAO;AAAA,MAAA,EAAA,CAChB;AAAA,IAAA,GAEJ;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,UAAU,YAAY,WAAW;AAAA,QACjC,0BAAO,MAAA,EAAK,MAAM,WAAW,OAAO,YAAY,QAAQ,MAAM,GAAA,CAAI;AAAA,QAClE,SAAS;AAAA,QAER,UAAA,WAAW,OAAO,cAAc;AAAA,MAAA;AAAA,IAAA;AAAA,EACnC,GACF;AAEJ;"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * BrandMark — the agentaily mark (cursor block inside corner ticks), optionally
3
+ * followed by the typed lowercase wordmark. Monochrome in currentColor; inverts
4
+ * with the theme. Never recolor with a hue.
5
+ */
6
+ export interface BrandMarkProps {
7
+ /** Mark size in px (stroke scales with it). @default 20 */
8
+ size?: number;
9
+ /** Render the "agentaily" wordmark after the mark. @default false */
10
+ wordmark?: boolean;
11
+ /** Show the blinking block cursor after the wordmark. @default true */
12
+ cursor?: boolean;
13
+ /** Animate the cursor (blink). Set false for a solid, static cursor. @default true */
14
+ blink?: boolean;
15
+ className?: string;
16
+ }
17
+ export declare function BrandMark(props: BrandMarkProps): JSX.Element;
@@ -0,0 +1,43 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ const AX_BRANDMARK_CSS = `
4
+ .ax-brandmark { display: inline-flex; align-items: center; gap: 9px; color: var(--text-body); }
5
+ .ax-brandmark__mark { display: inline-flex; flex: none; }
6
+ .ax-brandmark__word {
7
+ font-family: var(--font-mono); font-weight: var(--weight-medium);
8
+ letter-spacing: -0.02em; color: var(--text-body);
9
+ display: inline-flex; align-items: baseline; line-height: 1;
10
+ }
11
+ .ax-brandmark__word .ax-cursor { margin-left: 1px; width: 0.42em; height: 0.92em; }
12
+ `;
13
+ if (typeof document !== "undefined" && !document.getElementById("ax-brandmark-css")) {
14
+ const s = document.createElement("style");
15
+ s.id = "ax-brandmark-css";
16
+ s.textContent = AX_BRANDMARK_CSS;
17
+ document.head.appendChild(s);
18
+ }
19
+ function BrandMark({
20
+ size = 20,
21
+ wordmark = false,
22
+ cursor = true,
23
+ blink = true,
24
+ className = "",
25
+ ...rest
26
+ }) {
27
+ const stroke = Math.max(2, Math.round(size / 32 * 2.4 * 10) / 10);
28
+ return /* @__PURE__ */ jsxs("span", { className: ["ax-brandmark", className].filter(Boolean).join(" "), ...rest, children: [
29
+ /* @__PURE__ */ jsx("span", { className: "ax-brandmark__mark", "aria-hidden": "true", children: /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: "0 0 32 32", fill: "none", children: [
30
+ /* @__PURE__ */ jsx("path", { d: "M2 10 V2 H10", stroke: "currentColor", strokeWidth: stroke }),
31
+ /* @__PURE__ */ jsx("path", { d: "M22 30 H30 V22", stroke: "currentColor", strokeWidth: stroke }),
32
+ /* @__PURE__ */ jsx("rect", { x: "12", y: "9", width: "8", height: "14", fill: "currentColor" })
33
+ ] }) }),
34
+ wordmark ? /* @__PURE__ */ jsxs("span", { className: "ax-brandmark__word", style: { fontSize: Math.round(size * 0.75) }, children: [
35
+ "agentaily",
36
+ cursor ? /* @__PURE__ */ jsx("i", { className: "ax-cursor", style: blink ? void 0 : { animation: "none" } }) : null
37
+ ] }) : null
38
+ ] });
39
+ }
40
+ export {
41
+ BrandMark
42
+ };
43
+ //# sourceMappingURL=BrandMark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrandMark.js","sources":["../../../src/components/utilities/BrandMark.jsx"],"sourcesContent":["import React from \"react\";\n\n// BrandMark — the agentaily mark (cursor block inside corner ticks) and optional\n// typed wordmark. Monochrome, drawn in currentColor so it inverts with the theme.\n// Used in auth modals, settings headers, top bars. Never recolor with a hue.\nconst AX_BRANDMARK_CSS = `\n.ax-brandmark { display: inline-flex; align-items: center; gap: 9px; color: var(--text-body); }\n.ax-brandmark__mark { display: inline-flex; flex: none; }\n.ax-brandmark__word {\n font-family: var(--font-mono); font-weight: var(--weight-medium);\n letter-spacing: -0.02em; color: var(--text-body);\n display: inline-flex; align-items: baseline; line-height: 1;\n}\n.ax-brandmark__word .ax-cursor { margin-left: 1px; width: 0.42em; height: 0.92em; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-brandmark-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-brandmark-css\";\n s.textContent = AX_BRANDMARK_CSS;\n document.head.appendChild(s);\n}\n\nexport function BrandMark({\n size = 20,\n wordmark = false,\n cursor = true,\n blink = true,\n className = \"\",\n ...rest\n}) {\n const stroke = Math.max(2, Math.round((size / 32) * 2.4 * 10) / 10);\n return (\n <span className={[\"ax-brandmark\", className].filter(Boolean).join(\" \")} {...rest}>\n <span className=\"ax-brandmark__mark\" aria-hidden=\"true\">\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\">\n <path d=\"M2 10 V2 H10\" stroke=\"currentColor\" strokeWidth={stroke} />\n <path d=\"M22 30 H30 V22\" stroke=\"currentColor\" strokeWidth={stroke} />\n <rect x=\"12\" y=\"9\" width=\"8\" height=\"14\" fill=\"currentColor\" />\n </svg>\n </span>\n {wordmark ? (\n <span className=\"ax-brandmark__word\" style={{ fontSize: Math.round(size * 0.75) }}>\n agentaily\n {cursor ? (\n <i className=\"ax-cursor\" style={blink ? undefined : { animation: \"none\" }}></i>\n ) : null}\n </span>\n ) : null}\n </span>\n );\n}\n"],"names":[],"mappings":";;AAKA,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWzB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,kBAAkB,GAAG;AACnF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,UAAU;AAAA,EACxB,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,GAAG;AACL,GAAG;AACD,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAO,OAAO,KAAM,MAAM,EAAE,IAAI,EAAE;AAClE,SACE,qBAAC,QAAA,EAAK,WAAW,CAAC,gBAAgB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAC1E,UAAA;AAAA,IAAA,oBAAC,QAAA,EAAK,WAAU,sBAAqB,eAAY,QAC/C,UAAA,qBAAC,OAAA,EAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD,UAAA;AAAA,MAAA,oBAAC,UAAK,GAAE,gBAAe,QAAO,gBAAe,aAAa,QAAQ;AAAA,0BACjE,QAAA,EAAK,GAAE,kBAAiB,QAAO,gBAAe,aAAa,QAAQ;AAAA,MACpE,oBAAC,QAAA,EAAK,GAAE,MAAK,GAAE,KAAI,OAAM,KAAI,QAAO,MAAK,MAAK,eAAA,CAAe;AAAA,IAAA,EAAA,CAC/D,EAAA,CACF;AAAA,IACC,WACC,qBAAC,QAAA,EAAK,WAAU,sBAAqB,OAAO,EAAE,UAAU,KAAK,MAAM,OAAO,IAAI,KAAK,UAAA;AAAA,MAAA;AAAA,MAEhF,SACC,oBAAC,KAAA,EAAE,WAAU,aAAY,OAAO,QAAQ,SAAY,EAAE,WAAW,OAAA,EAAO,CAAG,IACzE;AAAA,IAAA,EAAA,CACN,IACE;AAAA,EAAA,GACN;AAEJ;"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Icon — the single Lucide-geometry icon set for Agentaily product surfaces.
3
+ * Stroke 2, round caps, currentColor, 24px grid. Color via `color`/`currentColor`,
4
+ * size in px. Add icons by copying Lucide paths into the source — never freehand.
5
+ */
6
+ export type IconName =
7
+ | "send" | "arrow" | "arrowLeft" | "plus" | "x" | "check" | "search"
8
+ | "chevronDown" | "refresh" | "copy" | "trash" | "external" | "link"
9
+ | "share" | "save" | "pen" | "target"
10
+ | "warn" | "info" | "shield" | "zap" | "spark"
11
+ | "key" | "table" | "plug" | "lock" | "user" | "mail" | "logout"
12
+ | "message" | "settings" | "film" | "archive" | "folder" | "inbox" | "power" | "mic" | "code"
13
+ | "layout" | "phone" | "qr"
14
+ | "sun" | "moon" | "eye" | "eyeOff";
15
+
16
+ export interface IconProps extends React.SVGProps<SVGSVGElement> {
17
+ /** Icon name. Unknown names render nothing (warns once in dev). Accepts kebab aliases (eye-off, chevron-down). */
18
+ name: IconName | string;
19
+ /** Pixel size — sets both width and height. @default 16 */
20
+ size?: number;
21
+ /** Stroke width on the 24px grid. @default 2 */
22
+ strokeWidth?: number;
23
+ }
24
+ export declare function Icon(props: IconProps): JSX.Element | null;
25
+ export declare namespace Icon {
26
+ /** All available icon names. */
27
+ const names: string[];
28
+ }
@@ -0,0 +1,196 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import "react";
3
+ const PATHS = {
4
+ // ── actions / nav ──
5
+ send: /* @__PURE__ */ jsxs("g", { children: [
6
+ /* @__PURE__ */ jsx("path", { d: "M12 19V5" }),
7
+ /* @__PURE__ */ jsx("path", { d: "M5 12l7-7 7 7" })
8
+ ] }),
9
+ arrow: /* @__PURE__ */ jsx("path", { d: "M5 12h14M12 5l7 7-7 7" }),
10
+ arrowLeft: /* @__PURE__ */ jsx("path", { d: "M19 12H5M12 19l-7-7 7-7" }),
11
+ plus: /* @__PURE__ */ jsx("path", { d: "M12 5v14M5 12h14" }),
12
+ x: /* @__PURE__ */ jsx("path", { d: "M18 6 6 18M6 6l12 12" }),
13
+ menu: /* @__PURE__ */ jsx("path", { d: "M3 6h18M3 12h18M3 18h18" }),
14
+ check: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" }),
15
+ search: /* @__PURE__ */ jsxs("g", { children: [
16
+ /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "8" }),
17
+ /* @__PURE__ */ jsx("path", { d: "m21 21-4.3-4.3" })
18
+ ] }),
19
+ chevronDown: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }),
20
+ refresh: /* @__PURE__ */ jsxs("g", { children: [
21
+ /* @__PURE__ */ jsx("path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" }),
22
+ /* @__PURE__ */ jsx("path", { d: "M21 3v5h-5" }),
23
+ /* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" }),
24
+ /* @__PURE__ */ jsx("path", { d: "M3 21v-5h5" })
25
+ ] }),
26
+ copy: /* @__PURE__ */ jsxs("g", { children: [
27
+ /* @__PURE__ */ jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2" }),
28
+ /* @__PURE__ */ jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
29
+ ] }),
30
+ trash: /* @__PURE__ */ jsxs("g", { children: [
31
+ /* @__PURE__ */ jsx("path", { d: "M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }),
32
+ /* @__PURE__ */ jsx("path", { d: "M10 11v6M14 11v6" })
33
+ ] }),
34
+ external: /* @__PURE__ */ jsxs("g", { children: [
35
+ /* @__PURE__ */ jsx("path", { d: "M15 3h6v6" }),
36
+ /* @__PURE__ */ jsx("path", { d: "M10 14 21 3" }),
37
+ /* @__PURE__ */ jsx("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" })
38
+ ] }),
39
+ link: /* @__PURE__ */ jsxs("g", { children: [
40
+ /* @__PURE__ */ jsx("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" }),
41
+ /* @__PURE__ */ jsx("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" })
42
+ ] }),
43
+ share: /* @__PURE__ */ jsx("g", { children: /* @__PURE__ */ jsx("path", { d: "M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8M16 6l-4-4-4 4M12 2v13" }) }),
44
+ save: /* @__PURE__ */ jsxs("g", { children: [
45
+ /* @__PURE__ */ jsx("path", { d: "M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z" }),
46
+ /* @__PURE__ */ jsx("path", { d: "M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7" }),
47
+ /* @__PURE__ */ jsx("path", { d: "M7 3v4a1 1 0 0 0 1 1h7" })
48
+ ] }),
49
+ pen: /* @__PURE__ */ jsxs("g", { children: [
50
+ /* @__PURE__ */ jsx("path", { d: "M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" }),
51
+ /* @__PURE__ */ jsx("path", { d: "M18.5 2.5a2.12 2.12 0 0 1 3 3L12 15l-4 1 1-4Z" })
52
+ ] }),
53
+ target: /* @__PURE__ */ jsxs("g", { children: [
54
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "9" }),
55
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "3.5" }),
56
+ /* @__PURE__ */ jsx("path", { d: "M12 1v3M12 20v3M1 12h3M20 12h3" })
57
+ ] }),
58
+ // ── status / meaning ──
59
+ warn: /* @__PURE__ */ jsxs("g", { children: [
60
+ /* @__PURE__ */ jsx("path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z" }),
61
+ /* @__PURE__ */ jsx("path", { d: "M12 9v4M12 17h.01" })
62
+ ] }),
63
+ info: /* @__PURE__ */ jsxs("g", { children: [
64
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
65
+ /* @__PURE__ */ jsx("path", { d: "M12 16v-4M12 8h.01" })
66
+ ] }),
67
+ shield: /* @__PURE__ */ jsx("path", { d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1Z" }),
68
+ zap: /* @__PURE__ */ jsx("path", { d: "M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z" }),
69
+ spark: /* @__PURE__ */ jsx("path", { d: "M12 3l1.6 5.4L19 10l-5.4 1.6L12 17l-1.6-5.4L5 10l5.4-1.6L12 3z" }),
70
+ // ── objects / domains ──
71
+ key: /* @__PURE__ */ jsxs("g", { children: [
72
+ /* @__PURE__ */ jsx("path", { d: "m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4" }),
73
+ /* @__PURE__ */ jsx("path", { d: "m21 2-9.6 9.6" }),
74
+ /* @__PURE__ */ jsx("circle", { cx: "7.5", cy: "15.5", r: "5.5" })
75
+ ] }),
76
+ table: /* @__PURE__ */ jsxs("g", { children: [
77
+ /* @__PURE__ */ jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
78
+ /* @__PURE__ */ jsx("path", { d: "M12 3v18M3 9h18M3 15h18" })
79
+ ] }),
80
+ plug: /* @__PURE__ */ jsx("g", { children: /* @__PURE__ */ jsx("path", { d: "M12 22v-5M9 8V2M15 8V2M18 8v4a6 6 0 0 1-12 0V8Z" }) }),
81
+ lock: /* @__PURE__ */ jsxs("g", { children: [
82
+ /* @__PURE__ */ jsx("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2" }),
83
+ /* @__PURE__ */ jsx("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })
84
+ ] }),
85
+ user: /* @__PURE__ */ jsxs("g", { children: [
86
+ /* @__PURE__ */ jsx("path", { d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2" }),
87
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "7", r: "4" })
88
+ ] }),
89
+ mail: /* @__PURE__ */ jsxs("g", { children: [
90
+ /* @__PURE__ */ jsx("rect", { x: "2", y: "4", width: "20", height: "16", rx: "2" }),
91
+ /* @__PURE__ */ jsx("path", { d: "m22 7-10 5L2 7" })
92
+ ] }),
93
+ logout: /* @__PURE__ */ jsxs("g", { children: [
94
+ /* @__PURE__ */ jsx("path", { d: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" }),
95
+ /* @__PURE__ */ jsx("path", { d: "m16 17 5-5-5-5M21 12H9" })
96
+ ] }),
97
+ message: /* @__PURE__ */ jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }),
98
+ settings: /* @__PURE__ */ jsxs("g", { children: [
99
+ /* @__PURE__ */ jsx("path", { d: "M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z" }),
100
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "3" })
101
+ ] }),
102
+ film: /* @__PURE__ */ jsxs("g", { children: [
103
+ /* @__PURE__ */ jsx("rect", { x: "2", y: "2", width: "20", height: "20", rx: "2.18" }),
104
+ /* @__PURE__ */ jsx("path", { d: "M7 2v20M17 2v20M2 12h20M2 7h5M2 17h5M17 17h5M17 7h5" })
105
+ ] }),
106
+ archive: /* @__PURE__ */ jsxs("g", { children: [
107
+ /* @__PURE__ */ jsx("rect", { x: "2", y: "3", width: "20", height: "5", rx: "1" }),
108
+ /* @__PURE__ */ jsx("path", { d: "M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8M10 12h4" })
109
+ ] }),
110
+ folder: /* @__PURE__ */ jsx("path", { d: "M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z" }),
111
+ inbox: /* @__PURE__ */ jsxs("g", { children: [
112
+ /* @__PURE__ */ jsx("path", { d: "M22 12h-6l-2 3h-4l-2-3H2" }),
113
+ /* @__PURE__ */ jsx("path", { d: "M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11Z" })
114
+ ] }),
115
+ power: /* @__PURE__ */ jsxs("g", { children: [
116
+ /* @__PURE__ */ jsx("path", { d: "M12 2v10" }),
117
+ /* @__PURE__ */ jsx("path", { d: "M18.36 6.64a9 9 0 1 1-12.73 0" })
118
+ ] }),
119
+ mic: /* @__PURE__ */ jsxs("g", { children: [
120
+ /* @__PURE__ */ jsx("path", { d: "M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z" }),
121
+ /* @__PURE__ */ jsx("path", { d: "M19 10v2a7 7 0 0 1-14 0v-2M12 19v3" })
122
+ ] }),
123
+ code: /* @__PURE__ */ jsx("path", { d: "m16 18 6-6-6-6M8 6l-6 6 6 6" }),
124
+ layout: /* @__PURE__ */ jsxs("g", { children: [
125
+ /* @__PURE__ */ jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
126
+ /* @__PURE__ */ jsx("path", { d: "M9 3v18" })
127
+ ] }),
128
+ phone: /* @__PURE__ */ jsxs("g", { children: [
129
+ /* @__PURE__ */ jsx("rect", { x: "7", y: "2", width: "10", height: "20", rx: "2" }),
130
+ /* @__PURE__ */ jsx("path", { d: "M11 18h2" })
131
+ ] }),
132
+ qr: /* @__PURE__ */ jsxs("g", { children: [
133
+ /* @__PURE__ */ jsx("rect", { x: "3", y: "3", width: "7", height: "7", rx: "1" }),
134
+ /* @__PURE__ */ jsx("rect", { x: "14", y: "3", width: "7", height: "7", rx: "1" }),
135
+ /* @__PURE__ */ jsx("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1" }),
136
+ /* @__PURE__ */ jsx("path", { d: "M14 14h3v3M21 14v.01M14 21h.01M21 17v4" })
137
+ ] }),
138
+ // ── theme + reveal ──
139
+ sun: /* @__PURE__ */ jsxs("g", { children: [
140
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "4" }),
141
+ /* @__PURE__ */ jsx("path", { d: "M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41" })
142
+ ] }),
143
+ moon: /* @__PURE__ */ jsx("path", { d: "M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z" }),
144
+ eye: /* @__PURE__ */ jsxs("g", { children: [
145
+ /* @__PURE__ */ jsx("path", { d: "M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z" }),
146
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "3" })
147
+ ] }),
148
+ eyeOff: /* @__PURE__ */ jsxs("g", { children: [
149
+ /* @__PURE__ */ jsx("path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24" }),
150
+ /* @__PURE__ */ jsx("path", { d: "M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68" }),
151
+ /* @__PURE__ */ jsx("path", { d: "M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61" }),
152
+ /* @__PURE__ */ jsx("path", { d: "M2 2l20 20" })
153
+ ] })
154
+ };
155
+ const ALIASES = {
156
+ eyeoff: "eyeOff",
157
+ "eye-off": "eyeOff",
158
+ arrowleft: "arrowLeft",
159
+ "arrow-left": "arrowLeft",
160
+ chevrondown: "chevronDown",
161
+ "chevron-down": "chevronDown"
162
+ };
163
+ const _warned = {};
164
+ function Icon({ name, size = 16, strokeWidth = 2, className = "", ...rest }) {
165
+ const key = PATHS[name] ? name : ALIASES[name] || name;
166
+ const body = PATHS[key];
167
+ if (!body) {
168
+ if (typeof console !== "undefined" && !_warned[name]) {
169
+ _warned[name] = true;
170
+ console.warn(`[Icon] unknown name "${name}"`);
171
+ }
172
+ return null;
173
+ }
174
+ return /* @__PURE__ */ jsx(
175
+ "svg",
176
+ {
177
+ width: size,
178
+ height: size,
179
+ viewBox: "0 0 24 24",
180
+ fill: "none",
181
+ stroke: "currentColor",
182
+ strokeWidth,
183
+ strokeLinecap: "round",
184
+ strokeLinejoin: "round",
185
+ "aria-hidden": "true",
186
+ className,
187
+ ...rest,
188
+ children: body
189
+ }
190
+ );
191
+ }
192
+ Icon.names = Object.keys(PATHS);
193
+ export {
194
+ Icon
195
+ };
196
+ //# sourceMappingURL=Icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icon.js","sources":["../../../src/components/utilities/Icon.jsx"],"sourcesContent":["import React from \"react\";\n\n// Icon — the single Lucide-geometry icon set for Agentaily product surfaces.\n// Replaces the three ad-hoc inline sets the designer apps each carried\n// (chat ICON_PATHS, settings S_ICONS, markup M_ICONS). Stroke 2, round caps,\n// currentColor, 24px grid. Add an icon by copying a Lucide path here — never\n// freehand. Unknown names render nothing (and warn once in dev).\nconst PATHS = {\n // ── actions / nav ──\n send: (\n <g>\n <path d=\"M12 19V5\" />\n <path d=\"M5 12l7-7 7 7\" />\n </g>\n ),\n arrow: <path d=\"M5 12h14M12 5l7 7-7 7\" />,\n arrowLeft: <path d=\"M19 12H5M12 19l-7-7 7-7\" />,\n plus: <path d=\"M12 5v14M5 12h14\" />,\n x: <path d=\"M18 6 6 18M6 6l12 12\" />,\n menu: <path d=\"M3 6h18M3 12h18M3 18h18\" />,\n check: <path d=\"M20 6 9 17l-5-5\" />,\n search: (\n <g>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </g>\n ),\n chevronDown: <path d=\"m6 9 6 6 6-6\" />,\n refresh: (\n <g>\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M3 21v-5h5\" />\n </g>\n ),\n copy: (\n <g>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </g>\n ),\n trash: (\n <g>\n <path d=\"M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <path d=\"M10 11v6M14 11v6\" />\n </g>\n ),\n external: (\n <g>\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </g>\n ),\n link: (\n <g>\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </g>\n ),\n share: (\n <g>\n <path d=\"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8M16 6l-4-4-4 4M12 2v13\" />\n </g>\n ),\n save: (\n <g>\n <path d=\"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\" />\n <path d=\"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\" />\n <path d=\"M7 3v4a1 1 0 0 0 1 1h7\" />\n </g>\n ),\n pen: (\n <g>\n <path d=\"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\" />\n <path d=\"M18.5 2.5a2.12 2.12 0 0 1 3 3L12 15l-4 1 1-4Z\" />\n </g>\n ),\n target: (\n <g>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <circle cx=\"12\" cy=\"12\" r=\"3.5\" />\n <path d=\"M12 1v3M12 20v3M1 12h3M20 12h3\" />\n </g>\n ),\n\n // ── status / meaning ──\n warn: (\n <g>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </g>\n ),\n info: (\n <g>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4M12 8h.01\" />\n </g>\n ),\n shield: (\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1Z\" />\n ),\n zap: (\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n ),\n spark: <path d=\"M12 3l1.6 5.4L19 10l-5.4 1.6L12 17l-1.6-5.4L5 10l5.4-1.6L12 3z\" />,\n\n // ── objects / domains ──\n key: (\n <g>\n <path d=\"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4\" />\n <path d=\"m21 2-9.6 9.6\" />\n <circle cx=\"7.5\" cy=\"15.5\" r=\"5.5\" />\n </g>\n ),\n table: (\n <g>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M12 3v18M3 9h18M3 15h18\" />\n </g>\n ),\n plug: (\n <g>\n <path d=\"M12 22v-5M9 8V2M15 8V2M18 8v4a6 6 0 0 1-12 0V8Z\" />\n </g>\n ),\n lock: (\n <g>\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </g>\n ),\n user: (\n <g>\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </g>\n ),\n mail: (\n <g>\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m22 7-10 5L2 7\" />\n </g>\n ),\n logout: (\n <g>\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <path d=\"m16 17 5-5-5-5M21 12H9\" />\n </g>\n ),\n message: <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />,\n settings: (\n <g>\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </g>\n ),\n film: (\n <g>\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"2.18\" />\n <path d=\"M7 2v20M17 2v20M2 12h20M2 7h5M2 17h5M17 17h5M17 7h5\" />\n </g>\n ),\n archive: (\n <g>\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"5\" rx=\"1\" />\n <path d=\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8M10 12h4\" />\n </g>\n ),\n folder: (\n <path d=\"M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z\" />\n ),\n inbox: (\n <g>\n <path d=\"M22 12h-6l-2 3h-4l-2-3H2\" />\n <path d=\"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11Z\" />\n </g>\n ),\n power: (\n <g>\n <path d=\"M12 2v10\" />\n <path d=\"M18.36 6.64a9 9 0 1 1-12.73 0\" />\n </g>\n ),\n mic: (\n <g>\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2M12 19v3\" />\n </g>\n ),\n code: <path d=\"m16 18 6-6-6-6M8 6l-6 6 6 6\" />,\n layout: (\n <g>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n </g>\n ),\n phone: (\n <g>\n <rect x=\"7\" y=\"2\" width=\"10\" height=\"20\" rx=\"2\" />\n <path d=\"M11 18h2\" />\n </g>\n ),\n qr: (\n <g>\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <path d=\"M14 14h3v3M21 14v.01M14 21h.01M21 17v4\" />\n </g>\n ),\n\n // ── theme + reveal ──\n sun: (\n <g>\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\" />\n </g>\n ),\n moon: <path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\" />,\n eye: (\n <g>\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </g>\n ),\n eyeOff: (\n <g>\n <path d=\"M9.88 9.88a3 3 0 1 0 4.24 4.24\" />\n <path d=\"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\" />\n <path d=\"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\" />\n <path d=\"M2 2l20 20\" />\n </g>\n ),\n};\n\n// tolerate kebab/snake aliases for the eyeoff / arrowleft / chevrondown names\nconst ALIASES = {\n eyeoff: \"eyeOff\",\n \"eye-off\": \"eyeOff\",\n arrowleft: \"arrowLeft\",\n \"arrow-left\": \"arrowLeft\",\n chevrondown: \"chevronDown\",\n \"chevron-down\": \"chevronDown\",\n};\n\nconst _warned = {};\n\nexport function Icon({ name, size = 16, strokeWidth = 2, className = \"\", ...rest }) {\n const key = PATHS[name] ? name : ALIASES[name] || name;\n const body = PATHS[key];\n if (!body) {\n if (typeof console !== \"undefined\" && !_warned[name]) {\n _warned[name] = true;\n console.warn(`[Icon] unknown name \"${name}\"`);\n }\n return null;\n }\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={className}\n {...rest}\n >\n {body}\n </svg>\n );\n}\n\n// the set of available names, handy for specimens / tooling\nIcon.names = Object.keys(PATHS);\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * RotatingTagline — the brand's signature animated headline. A fixed prefix
3
+ * (e.g. "聊天,") followed by a phrase that types in, holds, deletes, and
4
+ * advances. The rotating phrase wears the flowing geek-rainbow gradient; a
5
+ * block cursor trails it and blinks only at rest. Font size/weight inherit
6
+ * from the parent — size it by styling the container. Respects
7
+ * prefers-reduced-motion (whole-phrase swap, no gradient flow).
8
+ */
9
+ export interface RotatingTaglineProps {
10
+ /** Static text shown before the rotating phrase. @default "聊天," */
11
+ prefix?: string;
12
+ /** Phrases cycled through, in order. @default ["构建万物","生成万物","设计万物","学习万物"] */
13
+ phrases?: string[];
14
+ /** Paint the rotating phrase with the flowing rainbow gradient. @default true */
15
+ gradient?: boolean;
16
+ /** Show the trailing block cursor. @default true */
17
+ cursor?: boolean;
18
+ /** Put a <br/> between prefix and phrase (two-line tagline). @default false */
19
+ breakAfterPrefix?: boolean;
20
+ /** Per-character type-in delay, ms. @default 140 */
21
+ typeSpeed?: number;
22
+ /** Per-character delete delay, ms. @default 70 */
23
+ deleteSpeed?: number;
24
+ /** Hold time on the full phrase before deleting, ms. @default 1700 */
25
+ hold?: number;
26
+ /** Gradient flow loop duration (CSS time). @default "1.2s" */
27
+ flowDuration?: string;
28
+ className?: string;
29
+ }
30
+ export declare function RotatingTagline(props: RotatingTaglineProps): JSX.Element;