@burdenoff/microfe-channel 2026.608.1 → 2026.624.1

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 (31) hide show
  1. package/dist/channel/components/AdapterCredentialsForm.js +11 -11
  2. package/dist/channel/components/AdapterCredentialsForm.js.map +1 -1
  3. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js +53 -53
  4. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js.map +1 -1
  5. package/dist/channel/modules/channels/pages/ChannelDetailsPage.js +78 -78
  6. package/dist/channel/modules/channels/pages/ChannelDetailsPage.js.map +1 -1
  7. package/dist/channel/modules/channels/pages/ChannelSettingsPage.js +26 -26
  8. package/dist/channel/modules/channels/pages/ChannelSettingsPage.js.map +1 -1
  9. package/dist/channel/modules/channels/pages/ChannelUsersPage.js +32 -32
  10. package/dist/channel/modules/channels/pages/ChannelUsersPage.js.map +1 -1
  11. package/dist/channel/modules/channels/pages/ChannelsListPage.js +41 -41
  12. package/dist/channel/modules/channels/pages/ChannelsListPage.js.map +1 -1
  13. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js +30 -30
  14. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js.map +1 -1
  15. package/dist/channel/modules/channels/pages/ConnectionsListPage.js +29 -29
  16. package/dist/channel/modules/channels/pages/ConnectionsListPage.js.map +1 -1
  17. package/dist/channel/modules/channels/pages/CreateChannelPage.js +28 -28
  18. package/dist/channel/modules/channels/pages/CreateChannelPage.js.map +1 -1
  19. package/dist/channel/modules/channels/pages/CreateConnectionPage.js +8 -8
  20. package/dist/channel/modules/channels/pages/CreateConnectionPage.js.map +1 -1
  21. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js +28 -28
  22. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js.map +1 -1
  23. package/dist/channel/modules/channels/pages/EditChannelPage.js +25 -25
  24. package/dist/channel/modules/channels/pages/EditChannelPage.js.map +1 -1
  25. package/dist/channel/modules/channels/pages/EditConnectionPage.js +4 -4
  26. package/dist/channel/modules/channels/pages/EditConnectionPage.js.map +1 -1
  27. package/dist/channel/modules/channels/pages/SendMessagePage.js +27 -27
  28. package/dist/channel/modules/channels/pages/SendMessagePage.js.map +1 -1
  29. package/dist/channel/modules/channels/pages/WebhookEventsPage.js +29 -29
  30. package/dist/channel/modules/channels/pages/WebhookEventsPage.js.map +1 -1
  31. package/package.json +1 -1
@@ -27,7 +27,7 @@ function m({ adapterType: s, credentials: m, onChange: h, onValidationChange: g,
27
27
  s,
28
28
  g
29
29
  ]), !s) return /* @__PURE__ */ f("div", {
30
- className: "text-center py-6 text-muted-foreground",
30
+ className: "text-center py-6 text-text-secondary",
31
31
  children: /* @__PURE__ */ f("p", {
32
32
  className: "text-sm",
33
33
  children: b("channel.selectAdapterType", "Select an adapter type to configure credentials")
@@ -69,11 +69,11 @@ function m({ adapterType: s, credentials: m, onChange: h, onValidationChange: g,
69
69
  [e]: !t[e]
70
70
  }));
71
71
  }, k = (e) => {
72
- let t = m[e.key], n = C[e.key] && e.required && !t, r = `w-full px-3 py-2 text-sm bg-surface border rounded-lg focus:outline-none focus:ring-2 focus:ring-accent-primary disabled:opacity-50 disabled:cursor-not-allowed ${n ? "border-status-error-border" : "border-border"}`, i = `adapter-cred-${e.key}`;
72
+ let t = m[e.key], n = C[e.key] && e.required && !t, r = `w-full px-3 py-2 text-sm bg-surface border rounded-lg focus:outline-none focus:ring-2 focus:ring-accent-primary disabled:opacity-50 disabled:cursor-not-allowed ${n ? "border-status-error-border" : "border-border-subtle"}`, i = `adapter-cred-${e.key}`;
73
73
  return /* @__PURE__ */ p("div", { children: [
74
74
  /* @__PURE__ */ p("label", {
75
75
  htmlFor: i,
76
- className: "block text-sm font-medium text-foreground mb-1.5",
76
+ className: "block text-sm font-medium text-text-primary mb-1.5",
77
77
  children: [e.displayName, e.required && /* @__PURE__ */ f("span", {
78
78
  className: "text-status-error-text ml-1",
79
79
  children: "*"
@@ -106,7 +106,7 @@ function m({ adapterType: s, credentials: m, onChange: h, onValidationChange: g,
106
106
  type: "button",
107
107
  onClick: () => O(e.key),
108
108
  "aria-label": x[e.key] ? `Hide ${e.displayName}` : `Show ${e.displayName}`,
109
- className: "absolute right-2 top-1/2 -translate-y-1/2 p-1 text-muted-foreground hover:text-foreground",
109
+ className: "absolute right-2 top-1/2 -translate-y-1/2 p-1 text-text-secondary hover:text-text-primary",
110
110
  tabIndex: -1,
111
111
  children: x[e.key] ? /* @__PURE__ */ f(u, { size: 16 }) : /* @__PURE__ */ f(l, { size: 16 })
112
112
  })]
@@ -140,9 +140,9 @@ function m({ adapterType: s, credentials: m, onChange: h, onValidationChange: g,
140
140
  checked: t ?? e.defaultValue ?? !1,
141
141
  onChange: (t) => E(e.key, t.target.checked),
142
142
  disabled: _,
143
- className: "size-4 rounded border-border text-accent-primary focus:ring-accent-primary"
143
+ className: "size-4 rounded border-border-subtle text-accent-primary focus:ring-accent-primary"
144
144
  }), /* @__PURE__ */ f("span", {
145
- className: "text-sm text-muted-foreground",
145
+ className: "text-sm text-text-secondary",
146
146
  children: e.description
147
147
  })]
148
148
  }),
@@ -167,7 +167,7 @@ function m({ adapterType: s, credentials: m, onChange: h, onValidationChange: g,
167
167
  }, e.value))]
168
168
  }),
169
169
  e.type !== "boolean" && /* @__PURE__ */ f("p", {
170
- className: "mt-1 text-xs text-muted-foreground",
170
+ className: "mt-1 text-xs text-text-secondary",
171
171
  children: e.description
172
172
  }),
173
173
  n && /* @__PURE__ */ f("p", {
@@ -181,10 +181,10 @@ function m({ adapterType: s, credentials: m, onChange: h, onValidationChange: g,
181
181
  children: [/* @__PURE__ */ p("div", {
182
182
  className: "flex items-start justify-between",
183
183
  children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h3", {
184
- className: "text-sm font-semibold text-foreground",
184
+ className: "text-sm font-semibold text-text-primary",
185
185
  children: T.displayName
186
186
  }), /* @__PURE__ */ f("p", {
187
- className: "text-xs text-muted-foreground mt-0.5",
187
+ className: "text-xs text-text-secondary mt-0.5",
188
188
  children: T.description
189
189
  })] }), T.docUrl && /* @__PURE__ */ p("a", {
190
190
  href: T.docUrl,
@@ -199,9 +199,9 @@ function m({ adapterType: s, credentials: m, onChange: h, onValidationChange: g,
199
199
  className: "space-y-4",
200
200
  children: T.credentials.map(k)
201
201
  }), v && T.platformMetadata && T.platformMetadata.length > 0 && /* @__PURE__ */ f(d, { children: /* @__PURE__ */ p("div", {
202
- className: "border-t border-border pt-4 mt-4",
202
+ className: "border-t border-border-subtle pt-4 mt-4",
203
203
  children: [/* @__PURE__ */ f("p", {
204
- className: "text-xs font-medium text-muted-foreground mb-3",
204
+ className: "text-xs font-medium text-text-secondary mb-3",
205
205
  children: b("channel.optionalSettings", "Optional Settings")
206
206
  }), /* @__PURE__ */ f("div", {
207
207
  className: "space-y-4",
@@ -1 +1 @@
1
- {"version":3,"file":"AdapterCredentialsForm.js","names":[],"sources":["../../../src/channel/components/AdapterCredentialsForm.tsx"],"sourcesContent":["/**\n * Adapter Credentials Form\n *\n * Dynamic form that renders credential fields based on the selected adapter type.\n * Field names match exactly what the backend adapters expect.\n */\n\nimport { useState, useEffect } from 'react';\nimport { ExternalLink, Eye, EyeOff, AlertCircle, CheckCircle2 } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { AdapterType } from '../hooks/useChannels';\nimport {\n getAdapterCredentialSchema,\n getDefaultCredentials,\n validateCredentials,\n type CredentialField,\n} from '../config/adapterCredentials';\n\ninterface AdapterCredentialsFormProps {\n adapterType: AdapterType | undefined;\n credentials: Record<string, unknown>;\n onChange: (credentials: Record<string, unknown>) => void;\n onValidationChange?: (isValid: boolean, errors: string[]) => void;\n disabled?: boolean;\n showPlatformMetadata?: boolean;\n}\n\nexport function AdapterCredentialsForm({\n adapterType,\n credentials,\n onChange,\n onValidationChange,\n disabled = false,\n showPlatformMetadata = true,\n}: AdapterCredentialsFormProps) {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const [showPasswords, setShowPasswords] = useState<Record<string, boolean>>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n\n const schema = getAdapterCredentialSchema(adapterType);\n\n // Initialize with default values when adapter type changes\n useEffect(() => {\n if (adapterType) {\n const defaults = getDefaultCredentials(adapterType);\n const merged = { ...defaults, ...credentials };\n if (JSON.stringify(merged) !== JSON.stringify(credentials)) {\n onChange(merged);\n }\n }\n }, [adapterType]);\n\n // Validate on change\n useEffect(() => {\n if (onValidationChange && adapterType) {\n const { valid, errors } = validateCredentials(adapterType, credentials);\n onValidationChange(valid, errors);\n }\n }, [credentials, adapterType, onValidationChange]);\n\n if (!adapterType) {\n return (\n <div className=\"text-center py-6 text-muted-foreground\">\n <p className=\"text-sm\">\n {tr('channel.selectAdapterType', 'Select an adapter type to configure credentials')}\n </p>\n </div>\n );\n }\n\n if (!schema) {\n return (\n <div className=\"p-4 bg-status-warning-bg-subtle border border-warning-300 rounded-lg\">\n <div className=\"flex items-start gap-2\">\n <AlertCircle size={16} className=\"text-status-warning-text mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-warning-700\">\n {tr('channel.noCredentialSchema', 'No credential schema defined for')} {adapterType}\n </p>\n <p className=\"text-xs text-warning-600 mt-1\">\n {tr(\n 'channel.enterCredentialsAsJson',\n 'You can still enter credentials as JSON in the raw format below.'\n )}\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n const handleFieldChange = (key: string, value: unknown) => {\n onChange({ ...credentials, [key]: value });\n };\n\n const handleFieldBlur = (key: string) => {\n setTouched((prev) => ({ ...prev, [key]: true }));\n };\n\n const togglePasswordVisibility = (key: string) => {\n setShowPasswords((prev) => ({ ...prev, [key]: !prev[key] }));\n };\n\n const renderField = (field: CredentialField) => {\n const value = credentials[field.key];\n const fieldError = touched[field.key] && field.required && !value;\n\n const commonInputClasses = `w-full px-3 py-2 text-sm bg-surface border rounded-lg focus:outline-none focus:ring-2 focus:ring-accent-primary disabled:opacity-50 disabled:cursor-not-allowed ${\n fieldError ? 'border-status-error-border' : 'border-border'\n }`;\n\n const fieldId = `adapter-cred-${field.key}`;\n return (\n <div key={field.key}>\n <label htmlFor={fieldId} className=\"block text-sm font-medium text-foreground mb-1.5\">\n {field.displayName}\n {field.required && <span className=\"text-status-error-text ml-1\">*</span>}\n </label>\n\n {field.type === 'text' && (\n <input\n id={fieldId}\n aria-label={field.displayName}\n type=\"text\"\n value={(value as string) || ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n className={commonInputClasses}\n />\n )}\n\n {field.type === 'password' && (\n <div className=\"relative\">\n <input\n id={fieldId}\n aria-label={field.displayName}\n type={showPasswords[field.key] ? 'text' : 'password'}\n value={(value as string) || ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n className={`${commonInputClasses} pr-10`}\n />\n <button\n type=\"button\"\n onClick={() => togglePasswordVisibility(field.key)}\n aria-label={\n showPasswords[field.key] ? `Hide ${field.displayName}` : `Show ${field.displayName}`\n }\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1 text-muted-foreground hover:text-foreground\"\n tabIndex={-1}\n >\n {showPasswords[field.key] ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n )}\n\n {field.type === 'textarea' && (\n <textarea\n id={fieldId}\n aria-label={field.displayName}\n value={(value as string) || ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n rows={4}\n className={`${commonInputClasses} resize-none font-mono text-xs`}\n />\n )}\n\n {field.type === 'number' && (\n <input\n id={fieldId}\n aria-label={field.displayName}\n type=\"number\"\n value={(value as number) ?? field.defaultValue ?? ''}\n onChange={(e) =>\n handleFieldChange(field.key, e.target.value ? Number(e.target.value) : undefined)\n }\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n className={commonInputClasses}\n />\n )}\n\n {field.type === 'boolean' && (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={(value as boolean) ?? field.defaultValue ?? false}\n onChange={(e) => handleFieldChange(field.key, e.target.checked)}\n disabled={disabled}\n className=\"size-4 rounded border-border text-accent-primary focus:ring-accent-primary\"\n />\n <span className=\"text-sm text-muted-foreground\">{field.description}</span>\n </label>\n )}\n\n {field.type === 'select' && field.options && (\n <select\n id={fieldId}\n aria-label={field.displayName}\n value={(value as string) ?? field.defaultValue ?? ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n className={`${commonInputClasses} bg-bg-surface`}\n >\n <option value=\"\">\n {tr('channel.select', 'Select')} {field.displayName.toLowerCase()}\n </option>\n {field.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )}\n\n {field.type !== 'boolean' && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{field.description}</p>\n )}\n\n {fieldError && (\n <p className=\"mt-1 text-xs text-status-error-text\">\n {tr('channel.fieldRequired', 'This field is required')}\n </p>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"space-y-5\">\n {/* Header with adapter info */}\n <div className=\"flex items-start justify-between\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">{schema.displayName}</h3>\n <p className=\"text-xs text-muted-foreground mt-0.5\">{schema.description}</p>\n </div>\n {schema.docUrl && (\n <a\n href={schema.docUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-xs text-accent-primary hover:text-accent-primary-hover\"\n >\n <span>{tr('channel.docs', 'Docs')}</span>\n <ExternalLink size={12} />\n </a>\n )}\n </div>\n\n {/* Credential fields */}\n <div className=\"space-y-4\">\n {schema.credentials.length > 0 && (\n <div className=\"space-y-4\">{schema.credentials.map(renderField)}</div>\n )}\n\n {/* Platform metadata fields (optional settings) */}\n {showPlatformMetadata && schema.platformMetadata && schema.platformMetadata.length > 0 && (\n <>\n <div className=\"border-t border-border pt-4 mt-4\">\n <p className=\"text-xs font-medium text-muted-foreground mb-3\">\n {tr('channel.optionalSettings', 'Optional Settings')}\n </p>\n <div className=\"space-y-4\">{schema.platformMetadata.map(renderField)}</div>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Compact validation status indicator\n */\nexport function CredentialValidationStatus({\n adapterType,\n credentials,\n}: {\n adapterType: AdapterType | undefined;\n credentials: Record<string, unknown>;\n}) {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n\n if (!adapterType) return null;\n\n const { valid, errors } = validateCredentials(adapterType, credentials);\n\n if (valid) {\n return (\n <div className=\"flex items-center gap-1.5 text-status-success-text\">\n <CheckCircle2 size={14} />\n <span className=\"text-xs\">\n {tr('channel.allRequiredFieldsFilled', 'All required fields filled')}\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-1.5 text-status-warning-text\">\n <AlertCircle size={14} />\n <span className=\"text-xs\">\n {errors.length} {tr('channel.fieldsNeedAttention', 'field(s) need attention')}\n </span>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AdapterCredentialsForm.js","names":[],"sources":["../../../src/channel/components/AdapterCredentialsForm.tsx"],"sourcesContent":["/**\n * Adapter Credentials Form\n *\n * Dynamic form that renders credential fields based on the selected adapter type.\n * Field names match exactly what the backend adapters expect.\n */\n\nimport { useState, useEffect } from 'react';\nimport { ExternalLink, Eye, EyeOff, AlertCircle, CheckCircle2 } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { AdapterType } from '../hooks/useChannels';\nimport {\n getAdapterCredentialSchema,\n getDefaultCredentials,\n validateCredentials,\n type CredentialField,\n} from '../config/adapterCredentials';\n\ninterface AdapterCredentialsFormProps {\n adapterType: AdapterType | undefined;\n credentials: Record<string, unknown>;\n onChange: (credentials: Record<string, unknown>) => void;\n onValidationChange?: (isValid: boolean, errors: string[]) => void;\n disabled?: boolean;\n showPlatformMetadata?: boolean;\n}\n\nexport function AdapterCredentialsForm({\n adapterType,\n credentials,\n onChange,\n onValidationChange,\n disabled = false,\n showPlatformMetadata = true,\n}: AdapterCredentialsFormProps) {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const [showPasswords, setShowPasswords] = useState<Record<string, boolean>>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n\n const schema = getAdapterCredentialSchema(adapterType);\n\n // Initialize with default values when adapter type changes\n useEffect(() => {\n if (adapterType) {\n const defaults = getDefaultCredentials(adapterType);\n const merged = { ...defaults, ...credentials };\n if (JSON.stringify(merged) !== JSON.stringify(credentials)) {\n onChange(merged);\n }\n }\n }, [adapterType]);\n\n // Validate on change\n useEffect(() => {\n if (onValidationChange && adapterType) {\n const { valid, errors } = validateCredentials(adapterType, credentials);\n onValidationChange(valid, errors);\n }\n }, [credentials, adapterType, onValidationChange]);\n\n if (!adapterType) {\n return (\n <div className=\"text-center py-6 text-text-secondary\">\n <p className=\"text-sm\">\n {tr('channel.selectAdapterType', 'Select an adapter type to configure credentials')}\n </p>\n </div>\n );\n }\n\n if (!schema) {\n return (\n <div className=\"p-4 bg-status-warning-bg-subtle border border-warning-300 rounded-lg\">\n <div className=\"flex items-start gap-2\">\n <AlertCircle size={16} className=\"text-status-warning-text mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-warning-700\">\n {tr('channel.noCredentialSchema', 'No credential schema defined for')} {adapterType}\n </p>\n <p className=\"text-xs text-warning-600 mt-1\">\n {tr(\n 'channel.enterCredentialsAsJson',\n 'You can still enter credentials as JSON in the raw format below.'\n )}\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n const handleFieldChange = (key: string, value: unknown) => {\n onChange({ ...credentials, [key]: value });\n };\n\n const handleFieldBlur = (key: string) => {\n setTouched((prev) => ({ ...prev, [key]: true }));\n };\n\n const togglePasswordVisibility = (key: string) => {\n setShowPasswords((prev) => ({ ...prev, [key]: !prev[key] }));\n };\n\n const renderField = (field: CredentialField) => {\n const value = credentials[field.key];\n const fieldError = touched[field.key] && field.required && !value;\n\n const commonInputClasses = `w-full px-3 py-2 text-sm bg-surface border rounded-lg focus:outline-none focus:ring-2 focus:ring-accent-primary disabled:opacity-50 disabled:cursor-not-allowed ${\n fieldError ? 'border-status-error-border' : 'border-border-subtle'\n }`;\n\n const fieldId = `adapter-cred-${field.key}`;\n return (\n <div key={field.key}>\n <label htmlFor={fieldId} className=\"block text-sm font-medium text-text-primary mb-1.5\">\n {field.displayName}\n {field.required && <span className=\"text-status-error-text ml-1\">*</span>}\n </label>\n\n {field.type === 'text' && (\n <input\n id={fieldId}\n aria-label={field.displayName}\n type=\"text\"\n value={(value as string) || ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n className={commonInputClasses}\n />\n )}\n\n {field.type === 'password' && (\n <div className=\"relative\">\n <input\n id={fieldId}\n aria-label={field.displayName}\n type={showPasswords[field.key] ? 'text' : 'password'}\n value={(value as string) || ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n className={`${commonInputClasses} pr-10`}\n />\n <button\n type=\"button\"\n onClick={() => togglePasswordVisibility(field.key)}\n aria-label={\n showPasswords[field.key] ? `Hide ${field.displayName}` : `Show ${field.displayName}`\n }\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1 text-text-secondary hover:text-text-primary\"\n tabIndex={-1}\n >\n {showPasswords[field.key] ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n )}\n\n {field.type === 'textarea' && (\n <textarea\n id={fieldId}\n aria-label={field.displayName}\n value={(value as string) || ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n rows={4}\n className={`${commonInputClasses} resize-none font-mono text-xs`}\n />\n )}\n\n {field.type === 'number' && (\n <input\n id={fieldId}\n aria-label={field.displayName}\n type=\"number\"\n value={(value as number) ?? field.defaultValue ?? ''}\n onChange={(e) =>\n handleFieldChange(field.key, e.target.value ? Number(e.target.value) : undefined)\n }\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n placeholder={field.placeholder}\n className={commonInputClasses}\n />\n )}\n\n {field.type === 'boolean' && (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={(value as boolean) ?? field.defaultValue ?? false}\n onChange={(e) => handleFieldChange(field.key, e.target.checked)}\n disabled={disabled}\n className=\"size-4 rounded border-border-subtle text-accent-primary focus:ring-accent-primary\"\n />\n <span className=\"text-sm text-text-secondary\">{field.description}</span>\n </label>\n )}\n\n {field.type === 'select' && field.options && (\n <select\n id={fieldId}\n aria-label={field.displayName}\n value={(value as string) ?? field.defaultValue ?? ''}\n onChange={(e) => handleFieldChange(field.key, e.target.value)}\n onBlur={() => handleFieldBlur(field.key)}\n disabled={disabled}\n className={`${commonInputClasses} bg-bg-surface`}\n >\n <option value=\"\">\n {tr('channel.select', 'Select')} {field.displayName.toLowerCase()}\n </option>\n {field.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )}\n\n {field.type !== 'boolean' && (\n <p className=\"mt-1 text-xs text-text-secondary\">{field.description}</p>\n )}\n\n {fieldError && (\n <p className=\"mt-1 text-xs text-status-error-text\">\n {tr('channel.fieldRequired', 'This field is required')}\n </p>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"space-y-5\">\n {/* Header with adapter info */}\n <div className=\"flex items-start justify-between\">\n <div>\n <h3 className=\"text-sm font-semibold text-text-primary\">{schema.displayName}</h3>\n <p className=\"text-xs text-text-secondary mt-0.5\">{schema.description}</p>\n </div>\n {schema.docUrl && (\n <a\n href={schema.docUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-xs text-accent-primary hover:text-accent-primary-hover\"\n >\n <span>{tr('channel.docs', 'Docs')}</span>\n <ExternalLink size={12} />\n </a>\n )}\n </div>\n\n {/* Credential fields */}\n <div className=\"space-y-4\">\n {schema.credentials.length > 0 && (\n <div className=\"space-y-4\">{schema.credentials.map(renderField)}</div>\n )}\n\n {/* Platform metadata fields (optional settings) */}\n {showPlatformMetadata && schema.platformMetadata && schema.platformMetadata.length > 0 && (\n <>\n <div className=\"border-t border-border-subtle pt-4 mt-4\">\n <p className=\"text-xs font-medium text-text-secondary mb-3\">\n {tr('channel.optionalSettings', 'Optional Settings')}\n </p>\n <div className=\"space-y-4\">{schema.platformMetadata.map(renderField)}</div>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Compact validation status indicator\n */\nexport function CredentialValidationStatus({\n adapterType,\n credentials,\n}: {\n adapterType: AdapterType | undefined;\n credentials: Record<string, unknown>;\n}) {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n\n if (!adapterType) return null;\n\n const { valid, errors } = validateCredentials(adapterType, credentials);\n\n if (valid) {\n return (\n <div className=\"flex items-center gap-1.5 text-status-success-text\">\n <CheckCircle2 size={14} />\n <span className=\"text-xs\">\n {tr('channel.allRequiredFieldsFilled', 'All required fields filled')}\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-1.5 text-status-warning-text\">\n <AlertCircle size={14} />\n <span className=\"text-xs\">\n {errors.length} {tr('channel.fieldsNeedAttention', 'field(s) need attention')}\n </span>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -64,7 +64,7 @@ var E = {
64
64
  INACTIVE: {
65
65
  label: "Inactive",
66
66
  dotColor: "bg-text-tertiary",
67
- textColor: "text-muted-foreground",
67
+ textColor: "text-text-secondary",
68
68
  icon: b
69
69
  },
70
70
  ERROR: {
@@ -82,7 +82,7 @@ var E = {
82
82
  ARCHIVED: {
83
83
  label: "Archived",
84
84
  dotColor: "bg-text-tertiary",
85
- textColor: "text-muted-foreground",
85
+ textColor: "text-text-secondary",
86
86
  icon: b
87
87
  }
88
88
  }, O = {
@@ -103,7 +103,7 @@ var E = {
103
103
  },
104
104
  UNKNOWN: {
105
105
  label: "Unknown",
106
- color: "text-muted-foreground",
106
+ color: "text-text-secondary",
107
107
  icon: _
108
108
  }
109
109
  };
@@ -121,7 +121,7 @@ function ge(e) {
121
121
  }
122
122
  function k({ icon: e, iconClass: t, value: n, label: r, sub: i }) {
123
123
  return /* @__PURE__ */ T("div", {
124
- className: "p-4 bg-surface border border-border rounded-lg",
124
+ className: "p-4 bg-surface border border-border-subtle rounded-lg",
125
125
  children: [/* @__PURE__ */ T("div", {
126
126
  className: "flex items-center gap-3",
127
127
  children: [/* @__PURE__ */ w("div", {
@@ -131,14 +131,14 @@ function k({ icon: e, iconClass: t, value: n, label: r, sub: i }) {
131
131
  className: t
132
132
  })
133
133
  }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
134
- className: "text-2xl font-bold text-foreground leading-tight",
134
+ className: "text-2xl font-bold text-text-primary leading-tight",
135
135
  children: n
136
136
  }), /* @__PURE__ */ w("p", {
137
- className: "text-xs text-muted-foreground",
137
+ className: "text-xs text-text-secondary",
138
138
  children: r
139
139
  })] })]
140
140
  }), i && /* @__PURE__ */ w("p", {
141
- className: "text-[11px] text-muted-foreground mt-2 pl-11",
141
+ className: "text-[11px] text-text-secondary mt-2 pl-11",
142
142
  children: i
143
143
  })]
144
144
  });
@@ -247,10 +247,10 @@ function A() {
247
247
  className: "text-accent-primary"
248
248
  })
249
249
  }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("h1", {
250
- className: "text-xl font-bold text-foreground",
250
+ className: "text-xl font-bold text-text-primary",
251
251
  children: A("channel.channelDashboard", "Channel Dashboard")
252
252
  }), /* @__PURE__ */ w("p", {
253
- className: "text-sm text-muted-foreground",
253
+ className: "text-sm text-text-secondary",
254
254
  children: A("channel.dashboardSubtitle", "Manage and monitor your communication channels")
255
255
  })] })]
256
256
  }), /* @__PURE__ */ T("div", {
@@ -258,7 +258,7 @@ function A() {
258
258
  children: [/* @__PURE__ */ T("button", {
259
259
  type: "button",
260
260
  onClick: () => Y(),
261
- className: "inline-flex items-center gap-1.5 px-3 py-2 text-sm text-muted-foreground hover:text-foreground border border-border rounded-lg hover:hover:bg-action-primary-bg/10 transition-colors",
261
+ className: "inline-flex items-center gap-1.5 px-3 py-2 text-sm text-text-secondary hover:text-text-primary border border-border-subtle rounded-lg hover:hover:bg-action-primary-bg/10 transition-colors",
262
262
  children: [/* @__PURE__ */ w(S, { size: 14 }), A("channel.refresh", "Refresh")]
263
263
  }), _ && /* @__PURE__ */ T("button", {
264
264
  type: "button",
@@ -336,20 +336,20 @@ function A() {
336
336
  className: "relative flex-1",
337
337
  children: [/* @__PURE__ */ w(de, {
338
338
  size: 14,
339
- className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground"
339
+ className: "absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary"
340
340
  }), /* @__PURE__ */ w("input", {
341
341
  type: "text",
342
342
  "aria-label": A("channel.searchChannels", "Search channels..."),
343
343
  placeholder: A("channel.searchChannels", "Search channels..."),
344
344
  value: U.search || "",
345
345
  onChange: (e) => W({ search: e.target.value }),
346
- className: "w-full pl-9 pr-4 py-2 text-sm bg-surface border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500/50 placeholder:text-muted-foreground"
346
+ className: "w-full pl-9 pr-4 py-2 text-sm bg-surface border border-border-subtle rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500/50 placeholder:text-text-secondary"
347
347
  })]
348
348
  }),
349
349
  /* @__PURE__ */ T("select", {
350
350
  value: U.platform || "",
351
351
  onChange: (e) => W({ platform: e.target.value || void 0 }),
352
- className: "px-3 py-2 text-sm bg-surface border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500/50 text-foreground",
352
+ className: "px-3 py-2 text-sm bg-surface border border-border-subtle rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500/50 text-text-primary",
353
353
  children: [/* @__PURE__ */ w("option", {
354
354
  value: "",
355
355
  children: A("channel.allPlatforms", "All Platforms")
@@ -361,7 +361,7 @@ function A() {
361
361
  /* @__PURE__ */ T("select", {
362
362
  value: U.status || "",
363
363
  onChange: (e) => W({ status: e.target.value || void 0 }),
364
- className: "px-3 py-2 text-sm bg-surface border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500/50 text-foreground",
364
+ className: "px-3 py-2 text-sm bg-surface border border-border-subtle rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500/50 text-text-primary",
365
365
  children: [/* @__PURE__ */ w("option", {
366
366
  value: "",
367
367
  children: A("channel.allStatus", "All Status")
@@ -415,11 +415,11 @@ function A() {
415
415
  })
416
416
  }),
417
417
  /* @__PURE__ */ w("h3", {
418
- className: "text-lg font-semibold text-foreground mb-1",
418
+ className: "text-lg font-semibold text-text-primary mb-1",
419
419
  children: U.search || U.platform || U.status ? A("channel.noChannelsMatchFilter", "No channels match your filters") : A("channel.noChannels", "No channels yet")
420
420
  }),
421
421
  /* @__PURE__ */ w("p", {
422
- className: "text-sm text-muted-foreground max-w-sm mb-5",
422
+ className: "text-sm text-text-secondary max-w-sm mb-5",
423
423
  children: U.search || U.platform || U.status ? A("channel.adjustFilters", "Try adjusting your search or filters.") : A("channel.createFirstChannel", "Create your first communication channel to start sending messages across Email, SMS, Push, Slack and more.")
424
424
  }),
425
425
  _ && !(U.search || U.platform || U.status) && /* @__PURE__ */ T("button", {
@@ -431,45 +431,45 @@ function A() {
431
431
  ]
432
432
  }),
433
433
  z.length > 0 && /* @__PURE__ */ T("div", {
434
- className: "border border-border rounded-lg overflow-hidden",
434
+ className: "border border-border-subtle rounded-lg overflow-hidden",
435
435
  "data-tour": "channels-dashboard-table",
436
436
  children: [/* @__PURE__ */ w("div", {
437
437
  className: "overflow-x-auto min-w-full",
438
438
  children: /* @__PURE__ */ T("table", {
439
439
  className: "w-full text-sm min-w-[800px]",
440
440
  children: [/* @__PURE__ */ w("thead", { children: /* @__PURE__ */ T("tr", {
441
- className: "hover:bg-action-primary-bg/10/50 border-b border-border",
441
+ className: "hover:bg-action-primary-bg/10/50 border-b border-border-subtle",
442
442
  children: [
443
443
  /* @__PURE__ */ w("th", {
444
- className: "text-left px-4 py-3 text-xs font-medium text-muted-foreground uppercase tracking-wider",
444
+ className: "text-left px-4 py-3 text-xs font-medium text-text-secondary uppercase tracking-wider",
445
445
  children: A("channel.channel", "Channel")
446
446
  }),
447
447
  /* @__PURE__ */ w("th", {
448
- className: "text-left px-4 py-3 text-xs font-medium text-muted-foreground uppercase tracking-wider",
448
+ className: "text-left px-4 py-3 text-xs font-medium text-text-secondary uppercase tracking-wider",
449
449
  children: A("channel.platform", "Platform")
450
450
  }),
451
451
  /* @__PURE__ */ w("th", {
452
- className: "text-left px-4 py-3 text-xs font-medium text-muted-foreground uppercase tracking-wider",
452
+ className: "text-left px-4 py-3 text-xs font-medium text-text-secondary uppercase tracking-wider",
453
453
  children: A("channel.status", "Status")
454
454
  }),
455
455
  /* @__PURE__ */ w("th", {
456
- className: "text-left px-4 py-3 text-xs font-medium text-muted-foreground uppercase tracking-wider",
456
+ className: "text-left px-4 py-3 text-xs font-medium text-text-secondary uppercase tracking-wider",
457
457
  children: A("channel.health", "Health")
458
458
  }),
459
459
  /* @__PURE__ */ w("th", {
460
- className: "text-left px-4 py-3 text-xs font-medium text-muted-foreground uppercase tracking-wider",
460
+ className: "text-left px-4 py-3 text-xs font-medium text-text-secondary uppercase tracking-wider",
461
461
  children: A("channel.connection", "Connection")
462
462
  }),
463
463
  /* @__PURE__ */ w("th", {
464
- className: "text-right px-4 py-3 text-xs font-medium text-muted-foreground uppercase tracking-wider",
464
+ className: "text-right px-4 py-3 text-xs font-medium text-text-secondary uppercase tracking-wider",
465
465
  children: A("channel.msgs24h", "Msgs 24h")
466
466
  }),
467
467
  /* @__PURE__ */ w("th", {
468
- className: "text-right px-4 py-3 text-xs font-medium text-muted-foreground uppercase tracking-wider",
468
+ className: "text-right px-4 py-3 text-xs font-medium text-text-secondary uppercase tracking-wider",
469
469
  children: A("channel.updated", "Updated")
470
470
  }),
471
471
  /* @__PURE__ */ w("th", {
472
- className: "text-right px-4 py-3 text-xs font-medium text-muted-foreground uppercase tracking-wider",
472
+ className: "text-right px-4 py-3 text-xs font-medium text-text-secondary uppercase tracking-wider",
473
473
  children: A("channel.actions", "Actions")
474
474
  })
475
475
  ]
@@ -487,10 +487,10 @@ function A() {
487
487
  onClick: () => m(`/channels/${e.id}`),
488
488
  className: "text-left group/name",
489
489
  children: [/* @__PURE__ */ w("p", {
490
- className: "font-medium text-foreground group-hover/name:text-accent-primary transition-colors truncate max-w-[200px]",
490
+ className: "font-medium text-text-primary group-hover/name:text-accent-primary transition-colors truncate max-w-[200px]",
491
491
  children: e.name
492
492
  }), e.description && /* @__PURE__ */ w("p", {
493
- className: "text-xs text-muted-foreground truncate max-w-[200px]",
493
+ className: "text-xs text-text-secondary truncate max-w-[200px]",
494
494
  children: e.description
495
495
  })]
496
496
  })
@@ -501,7 +501,7 @@ function A() {
501
501
  className: `inline-flex items-center px-2 py-0.5 text-[11px] font-semibold rounded-full ${I(e.platform).color}`,
502
502
  children: I(e.platform).label
503
503
  }), e.adapterType && /* @__PURE__ */ w("p", {
504
- className: "text-[10px] text-muted-foreground mt-0.5 font-mono",
504
+ className: "text-[10px] text-text-secondary mt-0.5 font-mono",
505
505
  children: e.adapterType.replace(/_/g, " ")
506
506
  })]
507
507
  }),
@@ -528,21 +528,21 @@ function A() {
528
528
  /* @__PURE__ */ w("td", {
529
529
  className: "px-4 py-3",
530
530
  children: /* @__PURE__ */ w("span", {
531
- className: `text-xs ${e.isConnected ? "text-status-success-text" : "text-muted-foreground"}`,
531
+ className: `text-xs ${e.isConnected ? "text-status-success-text" : "text-text-secondary"}`,
532
532
  children: e.isConnected ? A("channel.connected", "Connected") : A("channel.disconnected", "Disconnected")
533
533
  })
534
534
  }),
535
535
  /* @__PURE__ */ w("td", {
536
536
  className: "px-4 py-3 text-right",
537
537
  children: /* @__PURE__ */ w("span", {
538
- className: "text-xs text-foreground tabular-nums",
538
+ className: "text-xs text-text-primary tabular-nums",
539
539
  children: (e.messageCount24h ?? 0).toLocaleString()
540
540
  })
541
541
  }),
542
542
  /* @__PURE__ */ w("td", {
543
543
  className: "px-4 py-3 text-right",
544
544
  children: /* @__PURE__ */ w("span", {
545
- className: "text-xs text-muted-foreground whitespace-nowrap",
545
+ className: "text-xs text-text-secondary whitespace-nowrap",
546
546
  children: ge(e.updatedAt)
547
547
  })
548
548
  }),
@@ -554,7 +554,7 @@ function A() {
554
554
  /* @__PURE__ */ w("button", {
555
555
  type: "button",
556
556
  onClick: () => m(`/channels/${e.id}`),
557
- className: "p-1.5 text-muted-foreground hover:text-accent-primary hover:bg-accent-primary/10 rounded transition-colors",
557
+ className: "p-1.5 text-text-secondary hover:text-accent-primary hover:bg-accent-primary/10 rounded transition-colors",
558
558
  title: A("channel.view", "View"),
559
559
  children: /* @__PURE__ */ w(se, { size: 14 })
560
560
  }),
@@ -564,7 +564,7 @@ function A() {
564
564
  type: "button",
565
565
  onClick: () => be(e.id),
566
566
  disabled: t,
567
- className: "p-1.5 text-muted-foreground hover:text-accent-blue hover:bg-accent-blue-subtle rounded transition-colors disabled:opacity-40",
567
+ className: "p-1.5 text-text-secondary hover:text-accent-blue hover:bg-accent-blue-subtle rounded transition-colors disabled:opacity-40",
568
568
  title: A("channel.healthCheck", "Health Check"),
569
569
  children: t ? /* @__PURE__ */ w(v, {
570
570
  size: 14,
@@ -578,7 +578,7 @@ function A() {
578
578
  type: "button",
579
579
  onClick: () => ye(e),
580
580
  disabled: t,
581
- className: `p-1.5 rounded transition-colors disabled:opacity-40 ${e.status === "ACTIVE" ? "text-muted-foreground hover:text-status-warning-text hover:bg-status-warning-bg-subtle" : "text-muted-foreground hover:text-status-success-text hover:bg-status-success-bg-subtle"}`,
581
+ className: `p-1.5 rounded transition-colors disabled:opacity-40 ${e.status === "ACTIVE" ? "text-text-secondary hover:text-status-warning-text hover:bg-status-warning-bg-subtle" : "text-text-secondary hover:text-status-success-text hover:bg-status-success-bg-subtle"}`,
582
582
  title: e.status === "ACTIVE" ? A("channel.deactivate", "Deactivate") : A("channel.activate", "Activate"),
583
583
  children: e.status === "ACTIVE" ? /* @__PURE__ */ w(b, { size: 14 }) : /* @__PURE__ */ w(ue, { size: 14 })
584
584
  })
@@ -594,7 +594,7 @@ function A() {
594
594
  }), /* @__PURE__ */ w("button", {
595
595
  type: "button",
596
596
  onClick: () => M(null),
597
- className: "px-1.5 py-0.5 text-[11px] text-muted-foreground hover:hover:bg-action-primary-bg/10 rounded transition-colors",
597
+ className: "px-1.5 py-0.5 text-[11px] text-text-secondary hover:hover:bg-action-primary-bg/10 rounded transition-colors",
598
598
  children: A("channel.no", "No")
599
599
  })]
600
600
  }) : /* @__PURE__ */ w(s, {
@@ -602,7 +602,7 @@ function A() {
602
602
  children: /* @__PURE__ */ w("button", {
603
603
  type: "button",
604
604
  onClick: () => M(e.id),
605
- className: "p-1.5 text-muted-foreground hover:text-status-error-text hover:bg-status-error-bg-subtle rounded transition-colors",
605
+ className: "p-1.5 text-text-secondary hover:text-status-error-text hover:bg-status-error-bg-subtle rounded transition-colors",
606
606
  title: A("channel.delete", "Delete"),
607
607
  children: /* @__PURE__ */ w(pe, { size: 14 })
608
608
  })
@@ -616,14 +616,14 @@ function A() {
616
616
  })]
617
617
  })
618
618
  }), /* @__PURE__ */ T("div", {
619
- className: "px-4 py-2.5 border-t border-border flex items-center justify-between",
619
+ className: "px-4 py-2.5 border-t border-border-subtle flex items-center justify-between",
620
620
  children: [/* @__PURE__ */ T("p", {
621
- className: "text-xs text-muted-foreground",
621
+ className: "text-xs text-text-secondary",
622
622
  children: [
623
623
  A("channel.showing", "Showing"),
624
624
  " ",
625
625
  /* @__PURE__ */ T("span", {
626
- className: "font-medium text-foreground",
626
+ className: "font-medium text-text-primary",
627
627
  children: [
628
628
  H === 0 ? 0 : P * 10 + 1,
629
629
  "–",
@@ -634,7 +634,7 @@ function A() {
634
634
  A("channel.of", "of"),
635
635
  " ",
636
636
  /* @__PURE__ */ w("span", {
637
- className: "font-medium text-foreground",
637
+ className: "font-medium text-text-primary",
638
638
  children: H
639
639
  }),
640
640
  " ",
@@ -647,11 +647,11 @@ function A() {
647
647
  type: "button",
648
648
  onClick: () => F((e) => Math.max(0, e - 1)),
649
649
  disabled: P === 0,
650
- className: "px-2.5 py-1 text-xs border border-border rounded hover:bg-muted transition-colors disabled:opacity-40 disabled:cursor-not-allowed",
650
+ className: "px-2.5 py-1 text-xs border border-border-subtle rounded hover:bg-bg-sunken transition-colors disabled:opacity-40 disabled:cursor-not-allowed",
651
651
  children: A("channel.previous", "Prev")
652
652
  }),
653
653
  /* @__PURE__ */ T("span", {
654
- className: "text-xs text-muted-foreground",
654
+ className: "text-xs text-text-secondary",
655
655
  children: [
656
656
  P + 1,
657
657
  " / ",
@@ -662,7 +662,7 @@ function A() {
662
662
  type: "button",
663
663
  onClick: () => F((e) => Math.min(X - 1, e + 1)),
664
664
  disabled: P >= X - 1,
665
- className: "px-2.5 py-1 text-xs border border-border rounded hover:bg-muted transition-colors disabled:opacity-40 disabled:cursor-not-allowed",
665
+ className: "px-2.5 py-1 text-xs border border-border-subtle rounded hover:bg-bg-sunken transition-colors disabled:opacity-40 disabled:cursor-not-allowed",
666
666
  children: A("channel.next", "Next")
667
667
  })
668
668
  ]
@@ -676,17 +676,17 @@ function A() {
676
676
  /* @__PURE__ */ T("button", {
677
677
  type: "button",
678
678
  onClick: () => m("/channels/?tab=all"),
679
- className: "flex items-center gap-3 p-3 bg-surface border border-border rounded-lg hover:hover:bg-action-primary-bg/10 transition-colors text-left",
679
+ className: "flex items-center gap-3 p-3 bg-surface border border-border-subtle rounded-lg hover:hover:bg-action-primary-bg/10 transition-colors text-left",
680
680
  children: [/* @__PURE__ */ w(x, {
681
681
  size: 16,
682
682
  className: "text-accent-primary shrink-0"
683
683
  }), /* @__PURE__ */ T("div", {
684
684
  className: "min-w-0",
685
685
  children: [/* @__PURE__ */ w("p", {
686
- className: "text-sm font-medium text-foreground",
686
+ className: "text-sm font-medium text-text-primary",
687
687
  children: A("channel.allChannels", "All Channels")
688
688
  }), /* @__PURE__ */ w("p", {
689
- className: "text-xs text-muted-foreground truncate",
689
+ className: "text-xs text-text-secondary truncate",
690
690
  children: A("channel.browseChannels", "Browse and manage channel cards")
691
691
  })]
692
692
  })]
@@ -694,17 +694,17 @@ function A() {
694
694
  /* @__PURE__ */ T("button", {
695
695
  type: "button",
696
696
  onClick: () => m("/channels/?tab=connections"),
697
- className: "flex items-center gap-3 p-3 bg-surface border border-border rounded-lg hover:hover:bg-action-primary-bg/10 transition-colors text-left",
697
+ className: "flex items-center gap-3 p-3 bg-surface border border-border-subtle rounded-lg hover:hover:bg-action-primary-bg/10 transition-colors text-left",
698
698
  children: [/* @__PURE__ */ w(h, {
699
699
  size: 16,
700
700
  className: "text-accent-blue shrink-0"
701
701
  }), /* @__PURE__ */ T("div", {
702
702
  className: "min-w-0",
703
703
  children: [/* @__PURE__ */ w("p", {
704
- className: "text-sm font-medium text-foreground",
704
+ className: "text-sm font-medium text-text-primary",
705
705
  children: A("channel.connections", "Connections")
706
706
  }), /* @__PURE__ */ w("p", {
707
- className: "text-xs text-muted-foreground truncate",
707
+ className: "text-xs text-text-secondary truncate",
708
708
  children: A("channel.connectionsSubtitle", "OAuth, API keys & credentials")
709
709
  })]
710
710
  })]
@@ -712,17 +712,17 @@ function A() {
712
712
  /* @__PURE__ */ T("button", {
713
713
  type: "button",
714
714
  onClick: () => m("/channels/?tab=send"),
715
- className: "flex items-center gap-3 p-3 bg-surface border border-border rounded-lg hover:hover:bg-action-primary-bg/10 transition-colors text-left",
715
+ className: "flex items-center gap-3 p-3 bg-surface border border-border-subtle rounded-lg hover:hover:bg-action-primary-bg/10 transition-colors text-left",
716
716
  children: [/* @__PURE__ */ w(oe, {
717
717
  size: 16,
718
718
  className: "text-accent-violet shrink-0"
719
719
  }), /* @__PURE__ */ T("div", {
720
720
  className: "min-w-0",
721
721
  children: [/* @__PURE__ */ w("p", {
722
- className: "text-sm font-medium text-foreground",
722
+ className: "text-sm font-medium text-text-primary",
723
723
  children: A("channel.sendMessage", "Send Message")
724
724
  }), /* @__PURE__ */ w("p", {
725
- className: "text-xs text-muted-foreground truncate",
725
+ className: "text-xs text-text-secondary truncate",
726
726
  children: A("channel.sendMessageSubtitle", "Send a test or one-off notification")
727
727
  })]
728
728
  })]