@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.
- package/dist/channel/components/AdapterCredentialsForm.js +11 -11
- package/dist/channel/components/AdapterCredentialsForm.js.map +1 -1
- package/dist/channel/modules/channels/pages/ChannelDashboardPage.js +53 -53
- package/dist/channel/modules/channels/pages/ChannelDashboardPage.js.map +1 -1
- package/dist/channel/modules/channels/pages/ChannelDetailsPage.js +78 -78
- package/dist/channel/modules/channels/pages/ChannelDetailsPage.js.map +1 -1
- package/dist/channel/modules/channels/pages/ChannelSettingsPage.js +26 -26
- package/dist/channel/modules/channels/pages/ChannelSettingsPage.js.map +1 -1
- package/dist/channel/modules/channels/pages/ChannelUsersPage.js +32 -32
- package/dist/channel/modules/channels/pages/ChannelUsersPage.js.map +1 -1
- package/dist/channel/modules/channels/pages/ChannelsListPage.js +41 -41
- package/dist/channel/modules/channels/pages/ChannelsListPage.js.map +1 -1
- package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js +30 -30
- package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js.map +1 -1
- package/dist/channel/modules/channels/pages/ConnectionsListPage.js +29 -29
- package/dist/channel/modules/channels/pages/ConnectionsListPage.js.map +1 -1
- package/dist/channel/modules/channels/pages/CreateChannelPage.js +28 -28
- package/dist/channel/modules/channels/pages/CreateChannelPage.js.map +1 -1
- package/dist/channel/modules/channels/pages/CreateConnectionPage.js +8 -8
- package/dist/channel/modules/channels/pages/CreateConnectionPage.js.map +1 -1
- package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js +28 -28
- package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js.map +1 -1
- package/dist/channel/modules/channels/pages/EditChannelPage.js +25 -25
- package/dist/channel/modules/channels/pages/EditChannelPage.js.map +1 -1
- package/dist/channel/modules/channels/pages/EditConnectionPage.js +4 -4
- package/dist/channel/modules/channels/pages/EditConnectionPage.js.map +1 -1
- package/dist/channel/modules/channels/pages/SendMessagePage.js +27 -27
- package/dist/channel/modules/channels/pages/SendMessagePage.js.map +1 -1
- package/dist/channel/modules/channels/pages/WebhookEventsPage.js +29 -29
- package/dist/channel/modules/channels/pages/WebhookEventsPage.js.map +1 -1
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
184
|
+
className: "text-sm font-semibold text-text-primary",
|
|
185
185
|
children: T.displayName
|
|
186
186
|
}), /* @__PURE__ */ f("p", {
|
|
187
|
-
className: "text-xs text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
137
|
+
className: "text-xs text-text-secondary",
|
|
138
138
|
children: r
|
|
139
139
|
})] })]
|
|
140
140
|
}), i && /* @__PURE__ */ w("p", {
|
|
141
|
-
className: "text-[11px] text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
})]
|