diff --git a/apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx b/apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx
index 352a0cfd334..ddda31f2a41 100644
--- a/apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx
@@ -16,7 +16,9 @@ import { CredentialsSkeleton } from '@/app/workspace/[workspaceId]/settings/comp
import { CustomToolsSkeleton } from '@/app/workspace/[workspaceId]/settings/components/custom-tools/custom-tool-skeleton'
import { GeneralSkeleton } from '@/app/workspace/[workspaceId]/settings/components/general/general-skeleton'
import { InboxSkeleton } from '@/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton'
+import { IntegrationsSkeleton } from '@/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton'
import { McpSkeleton } from '@/app/workspace/[workspaceId]/settings/components/mcp/mcp-skeleton'
+import { RecentlyDeletedSkeleton } from '@/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton'
import { SkillsSkeleton } from '@/app/workspace/[workspaceId]/settings/components/skills/skill-skeleton'
import { WorkflowMcpServersSkeleton } from '@/app/workspace/[workspaceId]/settings/components/workflow-mcp-servers/workflow-mcp-servers-skeleton'
import type { SettingsSection } from '@/app/workspace/[workspaceId]/settings/navigation'
@@ -52,7 +54,7 @@ const Integrations = dynamic(
import('@/app/workspace/[workspaceId]/settings/components/integrations/integrations').then(
(m) => m.Integrations
),
- { loading: () => }
+ { loading: () => }
)
const Credentials = dynamic(
() =>
@@ -145,7 +147,7 @@ const RecentlyDeleted = dynamic(
import(
'@/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted'
).then((m) => m.RecentlyDeleted),
- { loading: () => }
+ { loading: () => }
)
const AccessControl = dynamic(
() => import('@/ee/access-control/components/access-control').then((m) => m.AccessControl),
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin-skeleton.tsx
index 5fc7bfcf968..5115edac650 100644
--- a/apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin-skeleton.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin-skeleton.tsx
@@ -1,5 +1,9 @@
import { Skeleton } from '@/components/emcn'
+/**
+ * Skeleton component for admin settings loading state.
+ * Matches the exact layout structure of the Admin component.
+ */
export function AdminSkeleton() {
return (
@@ -7,6 +11,9 @@ export function AdminSkeleton() {
+
+
+
@@ -14,9 +21,51 @@ export function AdminSkeleton() {
-
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+
+
)
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton.tsx
index 2840852df87..a4131c5cb77 100644
--- a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton.tsx
@@ -25,12 +25,31 @@ export function ApiKeysSkeleton() {
return (
-
-
+
+
-
)
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-keys.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-keys.tsx
index d60b76eeffd..5db8c7d592f 100644
--- a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-keys.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-keys.tsx
@@ -158,14 +158,14 @@ export function ApiKeys() {
{isLoading ? (
+ {/* Workspace section header */}
+ {/* Personal section header + keys */}
@@ -310,6 +310,15 @@ export function ApiKeys() {
{/* Allow Personal API Keys Toggle - Fixed at bottom */}
+ {isLoading && canManageWorkspaceKeys && (
+
+ )}
{!isLoading && canManageWorkspaceKeys && (
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok-skeleton.tsx
index de080c3c23b..ead1b66fbc9 100644
--- a/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok-skeleton.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok-skeleton.tsx
@@ -9,11 +9,14 @@ export function BYOKKeySkeleton() {
-
+
+
+
+
)
}
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton.tsx
index 32823978561..c6812a3d2de 100644
--- a/apps/sim/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton.tsx
@@ -1,46 +1,70 @@
import { Skeleton } from '@/components/emcn'
-const GRID_COLS = 'grid grid-cols-[minmax(0,1fr)_8px_minmax(0,1fr)_auto] items-center'
+const GRID_COLS = 'grid grid-cols-[minmax(0,1fr)_8px_minmax(0,1fr)_auto_auto] items-center'
+const COL_SPAN_ALL = 'col-span-5'
/**
- * Skeleton component for a single secret row in the grid layout.
+ * Skeleton for a single integration credential row.
*/
export function CredentialSkeleton() {
return (
-
+
+ )
+}
+
+/**
+ * Skeleton for a single secret row matching the credentials grid layout.
+ */
+function CredentialRowSkeleton() {
+ return (
+
)
}
/**
- * Skeleton for the Secrets section shown during dynamic import loading.
+ * Skeleton for the Credentials (Secrets) page shown during dynamic import loading.
*/
export function CredentialsSkeleton() {
return (
-
-
-
-
)
}
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/custom-tools/custom-tool-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/custom-tools/custom-tool-skeleton.tsx
index 93f2895d768..6fe69f3630c 100644
--- a/apps/sim/app/workspace/[workspaceId]/settings/components/custom-tools/custom-tool-skeleton.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/settings/components/custom-tools/custom-tool-skeleton.tsx
@@ -7,11 +7,11 @@ export function CustomToolSkeleton() {
return (
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/general/general-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/general/general-skeleton.tsx
index e58ef57af15..dae014f0bf4 100644
--- a/apps/sim/app/workspace/[workspaceId]/settings/components/general/general-skeleton.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/settings/components/general/general-skeleton.tsx
@@ -11,10 +11,10 @@ export function GeneralSkeleton() {
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton.tsx
index 70768951c2d..1948ccb1146 100644
--- a/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton.tsx
@@ -8,7 +8,7 @@ export function InboxTaskSkeleton() {
-
+
@@ -20,36 +20,64 @@ export function InboxTaskSkeleton() {
}
/**
- * Skeleton for the full Inbox section shown during dynamic import loading.
+ * Skeleton for the full Inbox section shown while data is loading.
*/
export function InboxSkeleton() {
return (
-
-
-
-
-
-
-
+
-
-
-
-
+
+
+
+
+
-
-
-
-
-
)
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton.tsx
new file mode 100644
index 00000000000..223c274568d
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton.tsx
@@ -0,0 +1,23 @@
+import { Skeleton } from '@/components/emcn'
+import { CredentialSkeleton } from '@/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton'
+
+/**
+ * Skeleton for the Integrations section shown during dynamic import loading.
+ */
+export function IntegrationsSkeleton() {
+ return (
+
+ )
+}
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-skeleton/mcp-server-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-skeleton/mcp-server-skeleton.tsx
index 87b6f0ce01a..f32b4591c3e 100644
--- a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-skeleton/mcp-server-skeleton.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-skeleton/mcp-server-skeleton.tsx
@@ -9,10 +9,10 @@ export function McpServerSkeleton() {
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/deleted-item-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/deleted-item-skeleton.tsx
index 58a62e1f52a..e6cf2de3306 100644
--- a/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/deleted-item-skeleton.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/deleted-item-skeleton.tsx
@@ -5,7 +5,7 @@ import { Skeleton } from '@/components/emcn'
*/
export function DeletedItemSkeleton() {
return (
-
+
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx
new file mode 100644
index 00000000000..59846faac9a
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx
@@ -0,0 +1,33 @@
+import { Skeleton } from '@/components/emcn'
+import { DeletedItemSkeleton } from '@/app/workspace/[workspaceId]/settings/components/recently-deleted/deleted-item-skeleton'
+
+/**
+ * Skeleton component for the entire Recently Deleted settings section.
+ * Renders placeholder UI for the search bar, sort dropdown, tabs, and item list.
+ */
+export function RecentlyDeletedSkeleton() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}