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 ( +
+
+ + +
+ +
+ + + + + +
+ +
+
+ + + +
+
+
+ ) +}