diff --git a/examples/docs-examples/src/app/loading.tsx b/examples/docs-examples/src/app/loading.tsx
index 4349ac3a6..fc80ef063 100644
--- a/examples/docs-examples/src/app/loading.tsx
+++ b/examples/docs-examples/src/app/loading.tsx
@@ -1,3 +1,3 @@
export default function Loading() {
- return null;
+ return
Loading...
;
}
diff --git a/examples/docs-examples/src/stack.tsx b/examples/docs-examples/src/stack.tsx
index e5279bcd4..dda30b13e 100644
--- a/examples/docs-examples/src/stack.tsx
+++ b/examples/docs-examples/src/stack.tsx
@@ -5,7 +5,5 @@ import { StackServerApp } from "@stackframe/stack";
export const stackServerApp = new StackServerApp({
tokenStore: "nextjs-cookie",
urls: {
- signIn: "/signin",
- signUp: "/signup",
}
});
diff --git a/packages/stack-ui/src/components/ui/skeleton.tsx b/packages/stack-ui/src/components/ui/skeleton.tsx
index f31d78aea..9bbec7d48 100644
--- a/packages/stack-ui/src/components/ui/skeleton.tsx
+++ b/packages/stack-ui/src/components/ui/skeleton.tsx
@@ -3,64 +3,16 @@
import React from "react";
import { cn } from "../..";
-// TODO: add this to the generated global CSS
-const styleSheet = `
-@keyframes animation-light {
-0% {
- filter: grayscale(1) contrast(0) brightness(0) invert(1) brightness(0.8);
+function Skeleton({
+ className,
+ ...props
+}: React.HTMLAttributes) {
+ return (
+
+ );
}
-100% {
- filter: grayscale(1) contrast(0) brightness(0) invert(1) brightness(0.9);
-}
-
-@keyframes animation-dark {
-0% {
- filter: grayscale(1) contrast(0) brightness(0) invert(1) brightness(0.2);
-}
-100% {
- filter: grayscale(1) contrast(0) brightness(0) invert(1) brightness(0.1);
-}
-
-.stack-skeleton[data-stack-state="activated"],
-.stack-skeleton[data-stack-state="activated"] * {
- pointer-events: none !important;
- -webkit-user-select: none !important;
- -moz-user-select: none !important;
- user-select: none !important;
- cursor: default !important;
-}
-
-.stack-skeleton[data-stack-state="activated"] {
- animation: animation-light 1s infinite alternate-reverse !important;
-}
-
-html[data-stack-theme='dark'] .stack-skeleton[data-stack-state="activated"] {
- animation: animation-dark 1s infinite alternate-reverse !important;
-}
-
-html[data-stack-theme='dark'] .stack-skeleton[data-stack-state="activated"] {
- animation: animation-dark 1s infinite alternate-reverse !important;
-}
-`;
-
-const Skeleton = React.forwardRef<
- React.ElementRef<"span">,
- React.ComponentPropsWithoutRef<"span"> & { deactivated?: boolean }
->(
- (props, ref) => {
- return (
- <>
-
-
- >
- );
- }
-);
-Skeleton.displayName = "Skeleton";
export { Skeleton };
diff --git a/packages/stack/src/components-page/auth-page.tsx b/packages/stack/src/components-page/auth-page.tsx
index bab5fca66..36f4d1d8a 100644
--- a/packages/stack/src/components-page/auth-page.tsx
+++ b/packages/stack/src/components-page/auth-page.tsx
@@ -1,8 +1,8 @@
'use client';
import { runAsynchronously } from '@stackframe/stack-shared/dist/utils/promises';
-import { StyledLink, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from '@stackframe/stack-ui';
-import { useEffect } from 'react';
+import { Skeleton, StyledLink, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from '@stackframe/stack-ui';
+import { Suspense, useEffect } from 'react';
import { useStackApp, useUser } from '..';
import { CredentialSignIn } from '../components/credential-sign-in';
import { CredentialSignUp } from '../components/credential-sign-up';
@@ -11,10 +11,10 @@ import { SeparatorWithText } from '../components/elements/separator-with-text';
import { MagicLinkSignIn } from '../components/magic-link-sign-in';
import { PredefinedMessageCard } from '../components/message-cards/predefined-message-card';
import { OAuthButtonGroup } from '../components/oauth-button-group';
-import { useTranslation } from '../lib/translations';
import { PasskeyButton } from '../components/passkey-button';
+import { useTranslation } from '../lib/translations';
-export function AuthPage(props: {
+type Props = {
noPasswordRepeat?: boolean,
firstTab?: 'magic-link' | 'password',
fullPage?: boolean,
@@ -32,7 +32,37 @@ export function AuthPage(props: {
}[],
},
},
-}) {
+}
+
+export function AuthPage(props: Props) {
+ return }>
+
+ ;
+}
+
+function Fallback(props: Props) {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+ );
+}
+
+function Inner (props: Props) {
const stackApp = useStackApp();
const user = useUser();
const projectFromHook = stackApp.useProject();
diff --git a/packages/stack/src/components/selected-team-switcher.tsx b/packages/stack/src/components/selected-team-switcher.tsx
index 416416825..4d3b650e4 100644
--- a/packages/stack/src/components/selected-team-switcher.tsx
+++ b/packages/stack/src/components/selected-team-switcher.tsx
@@ -10,11 +10,12 @@ import {
SelectSeparator,
SelectTrigger,
SelectValue,
+ Skeleton,
Typography
} from "@stackframe/stack-ui";
import { PlusCircle, Settings } from "lucide-react";
import { useRouter } from "next/navigation";
-import { useEffect, useMemo } from "react";
+import { Suspense, useEffect, useMemo } from "react";
import { Team, useStackApp, useUser } from "..";
import { useTranslation } from "../lib/translations";
import { TeamIcon } from "./team-icon";
@@ -26,6 +27,16 @@ type SelectedTeamSwitcherProps = {
};
export function SelectedTeamSwitcher(props: SelectedTeamSwitcherProps) {
+ return }>
+
+ ;
+}
+
+function Fallback() {
+ return ;
+}
+
+function Inner(props: SelectedTeamSwitcherProps) {
const { t } = useTranslation();
const app = useStackApp();
const user = useUser();
diff --git a/packages/stack/src/components/user-button.tsx b/packages/stack/src/components/user-button.tsx
index f18e968b7..bf0aa2314 100644
--- a/packages/stack/src/components/user-button.tsx
+++ b/packages/stack/src/components/user-button.tsx
@@ -31,13 +31,7 @@ type UserButtonProps = {
export function UserButton(props: UserButtonProps) {
return (
-
-
-
- }
- >
+ }>
);