@agentaily/design-system 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/DESIGN.md +58 -7
  2. package/README.md +10 -6
  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 +48 -0
  17. package/dist/components/auth/SignInPage.js +217 -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/Form.d.ts +164 -0
  40. package/dist/components/inputs/Form.js +484 -0
  41. package/dist/components/inputs/Form.js.map +1 -0
  42. package/dist/components/inputs/Input.d.ts +2 -0
  43. package/dist/components/inputs/Input.js +14 -10
  44. package/dist/components/inputs/Input.js.map +1 -1
  45. package/dist/components/inputs/SecretField.d.ts +21 -0
  46. package/dist/components/inputs/SecretField.js +70 -0
  47. package/dist/components/inputs/SecretField.js.map +1 -0
  48. package/dist/components/layout/AppShell.d.ts +30 -0
  49. package/dist/components/layout/AppShell.js +117 -0
  50. package/dist/components/layout/AppShell.js.map +1 -0
  51. package/dist/components/layout/DesignerShell.d.ts +39 -0
  52. package/dist/components/layout/DesignerShell.js +146 -0
  53. package/dist/components/layout/DesignerShell.js.map +1 -0
  54. package/dist/components/layout/DocsLayout.d.ts +24 -0
  55. package/dist/components/layout/DocsLayout.js +113 -0
  56. package/dist/components/layout/DocsLayout.js.map +1 -0
  57. package/dist/components/layout/SettingsPage.d.ts +31 -0
  58. package/dist/components/layout/SettingsPage.js +92 -0
  59. package/dist/components/layout/SettingsPage.js.map +1 -0
  60. package/dist/components/review/MarkupLayer.d.ts +20 -0
  61. package/dist/components/review/MarkupLayer.js +237 -0
  62. package/dist/components/review/MarkupLayer.js.map +1 -0
  63. package/dist/components/settings/HelpSteps.d.ts +20 -0
  64. package/dist/components/settings/HelpSteps.js +40 -0
  65. package/dist/components/settings/HelpSteps.js.map +1 -0
  66. package/dist/components/settings/IntegrationSettings.d.ts +15 -0
  67. package/dist/components/settings/IntegrationSettings.js +630 -0
  68. package/dist/components/settings/IntegrationSettings.js.map +1 -0
  69. package/dist/components/settings/TestRow.d.ts +21 -0
  70. package/dist/components/settings/TestRow.js +66 -0
  71. package/dist/components/settings/TestRow.js.map +1 -0
  72. package/dist/components/utilities/BrandMark.d.ts +17 -0
  73. package/dist/components/utilities/BrandMark.js +43 -0
  74. package/dist/components/utilities/BrandMark.js.map +1 -0
  75. package/dist/components/utilities/Icon.d.ts +28 -0
  76. package/dist/components/utilities/Icon.js +196 -0
  77. package/dist/components/utilities/Icon.js.map +1 -0
  78. package/dist/index.d.ts +23 -0
  79. package/dist/index.js +35 -0
  80. package/dist/index.js.map +1 -1
  81. package/dist/styles.css +67 -64
  82. 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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"}