analytica-frontend-lib 1.0.67 → 1.0.70
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/Auth/index.d.mts +218 -0
- package/dist/Auth/index.d.ts +218 -0
- package/dist/Auth/index.js +190 -0
- package/dist/Auth/index.js.map +1 -0
- package/dist/Auth/index.mjs +166 -0
- package/dist/Auth/index.mjs.map +1 -0
- package/dist/Card/index.d.mts +8 -1
- package/dist/Card/index.d.ts +8 -1
- package/dist/Card/index.js +45 -0
- package/dist/Card/index.js.map +1 -1
- package/dist/Card/index.mjs +45 -0
- package/dist/Card/index.mjs.map +1 -1
- package/dist/Tab/index.d.mts +37 -0
- package/dist/Tab/index.d.ts +37 -0
- package/dist/Tab/index.js +182 -0
- package/dist/Tab/index.js.map +1 -0
- package/dist/Tab/index.mjs +161 -0
- package/dist/Tab/index.mjs.map +1 -0
- package/dist/index.css +224 -119
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +361 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +359 -1
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +224 -119
- package/dist/styles.css.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// src/components/Auth/Auth.tsx
|
|
2
|
+
import {
|
|
3
|
+
createContext,
|
|
4
|
+
useContext,
|
|
5
|
+
useEffect,
|
|
6
|
+
useState,
|
|
7
|
+
useCallback,
|
|
8
|
+
useMemo
|
|
9
|
+
} from "react";
|
|
10
|
+
import { useLocation, Navigate } from "react-router-dom";
|
|
11
|
+
import { Fragment, jsx } from "react/jsx-runtime";
|
|
12
|
+
var AuthContext = createContext(void 0);
|
|
13
|
+
var AuthProvider = ({
|
|
14
|
+
children,
|
|
15
|
+
checkAuthFn,
|
|
16
|
+
signOutFn,
|
|
17
|
+
initialAuthState = {},
|
|
18
|
+
getUserFn,
|
|
19
|
+
getSessionFn,
|
|
20
|
+
getTokensFn
|
|
21
|
+
}) => {
|
|
22
|
+
const [authState, setAuthState] = useState({
|
|
23
|
+
isAuthenticated: false,
|
|
24
|
+
isLoading: true,
|
|
25
|
+
...initialAuthState
|
|
26
|
+
});
|
|
27
|
+
const checkAuth = useCallback(async () => {
|
|
28
|
+
try {
|
|
29
|
+
setAuthState((prev) => ({ ...prev, isLoading: true }));
|
|
30
|
+
if (!checkAuthFn) {
|
|
31
|
+
setAuthState((prev) => ({
|
|
32
|
+
...prev,
|
|
33
|
+
isAuthenticated: false,
|
|
34
|
+
isLoading: false
|
|
35
|
+
}));
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
const isAuth = await checkAuthFn();
|
|
39
|
+
setAuthState((prev) => ({
|
|
40
|
+
...prev,
|
|
41
|
+
isAuthenticated: isAuth,
|
|
42
|
+
isLoading: false,
|
|
43
|
+
user: getUserFn ? getUserFn() : prev.user,
|
|
44
|
+
sessionInfo: getSessionFn ? getSessionFn() : prev.sessionInfo,
|
|
45
|
+
tokens: getTokensFn ? getTokensFn() : prev.tokens
|
|
46
|
+
}));
|
|
47
|
+
return isAuth;
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.error("Erro ao verificar autentica\xE7\xE3o:", error);
|
|
50
|
+
setAuthState((prev) => ({
|
|
51
|
+
...prev,
|
|
52
|
+
isAuthenticated: false,
|
|
53
|
+
isLoading: false
|
|
54
|
+
}));
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}, [checkAuthFn, getUserFn, getSessionFn, getTokensFn]);
|
|
58
|
+
const signOut = useCallback(() => {
|
|
59
|
+
if (signOutFn) {
|
|
60
|
+
signOutFn();
|
|
61
|
+
}
|
|
62
|
+
setAuthState((prev) => ({
|
|
63
|
+
...prev,
|
|
64
|
+
isAuthenticated: false,
|
|
65
|
+
user: void 0,
|
|
66
|
+
sessionInfo: void 0,
|
|
67
|
+
tokens: void 0
|
|
68
|
+
}));
|
|
69
|
+
}, [signOutFn]);
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
checkAuth();
|
|
72
|
+
}, [checkAuth]);
|
|
73
|
+
const contextValue = useMemo(
|
|
74
|
+
() => ({
|
|
75
|
+
...authState,
|
|
76
|
+
checkAuth,
|
|
77
|
+
signOut
|
|
78
|
+
}),
|
|
79
|
+
[authState, checkAuth, signOut]
|
|
80
|
+
);
|
|
81
|
+
return /* @__PURE__ */ jsx(AuthContext.Provider, { value: contextValue, children });
|
|
82
|
+
};
|
|
83
|
+
var useAuth = () => {
|
|
84
|
+
const context = useContext(AuthContext);
|
|
85
|
+
if (context === void 0) {
|
|
86
|
+
throw new Error("useAuth deve ser usado dentro de um AuthProvider");
|
|
87
|
+
}
|
|
88
|
+
return context;
|
|
89
|
+
};
|
|
90
|
+
var ProtectedRoute = ({
|
|
91
|
+
children,
|
|
92
|
+
redirectTo = "/",
|
|
93
|
+
loadingComponent,
|
|
94
|
+
additionalCheck
|
|
95
|
+
}) => {
|
|
96
|
+
const { isAuthenticated, isLoading, ...authState } = useAuth();
|
|
97
|
+
const defaultLoadingComponent = /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center min-h-screen", children: /* @__PURE__ */ jsx("div", { className: "text-text-950 text-lg", children: "Carregando..." }) });
|
|
98
|
+
if (isLoading) {
|
|
99
|
+
return /* @__PURE__ */ jsx(Fragment, { children: loadingComponent || defaultLoadingComponent });
|
|
100
|
+
}
|
|
101
|
+
if (!isAuthenticated) {
|
|
102
|
+
return /* @__PURE__ */ jsx(Navigate, { to: redirectTo, replace: true });
|
|
103
|
+
}
|
|
104
|
+
if (additionalCheck && !additionalCheck({ isAuthenticated, isLoading, ...authState })) {
|
|
105
|
+
return /* @__PURE__ */ jsx(Navigate, { to: redirectTo, replace: true });
|
|
106
|
+
}
|
|
107
|
+
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
108
|
+
};
|
|
109
|
+
var PublicRoute = ({
|
|
110
|
+
children,
|
|
111
|
+
redirectTo = "/painel",
|
|
112
|
+
redirectIfAuthenticated = false,
|
|
113
|
+
checkAuthBeforeRender = false
|
|
114
|
+
}) => {
|
|
115
|
+
const { isAuthenticated, isLoading } = useAuth();
|
|
116
|
+
if (checkAuthBeforeRender && isLoading) {
|
|
117
|
+
return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center min-h-screen", children: /* @__PURE__ */ jsx("div", { className: "text-text-950 text-lg", children: "Carregando..." }) });
|
|
118
|
+
}
|
|
119
|
+
if (isAuthenticated && redirectIfAuthenticated) {
|
|
120
|
+
return /* @__PURE__ */ jsx(Navigate, { to: redirectTo, replace: true });
|
|
121
|
+
}
|
|
122
|
+
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
123
|
+
};
|
|
124
|
+
var withAuth = (Component, options = {}) => {
|
|
125
|
+
return (props) => /* @__PURE__ */ jsx(ProtectedRoute, { ...options, children: /* @__PURE__ */ jsx(Component, { ...props }) });
|
|
126
|
+
};
|
|
127
|
+
var useAuthGuard = (options = {}) => {
|
|
128
|
+
const authState = useAuth();
|
|
129
|
+
const { requireAuth = true, customCheck } = options;
|
|
130
|
+
const canAccess = !authState.isLoading && (requireAuth ? authState.isAuthenticated && (!customCheck || customCheck(authState)) : !authState.isAuthenticated || !customCheck || customCheck(authState));
|
|
131
|
+
return {
|
|
132
|
+
canAccess,
|
|
133
|
+
isLoading: authState.isLoading,
|
|
134
|
+
authState
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
var useRouteAuth = (fallbackPath = "/") => {
|
|
138
|
+
const { isAuthenticated, isLoading } = useAuth();
|
|
139
|
+
const location = useLocation();
|
|
140
|
+
const redirectToLogin = () => /* @__PURE__ */ jsx(Navigate, { to: fallbackPath, state: { from: location }, replace: true });
|
|
141
|
+
return {
|
|
142
|
+
isAuthenticated,
|
|
143
|
+
isLoading,
|
|
144
|
+
redirectToLogin
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
var Auth_default = {
|
|
148
|
+
AuthProvider,
|
|
149
|
+
ProtectedRoute,
|
|
150
|
+
PublicRoute,
|
|
151
|
+
withAuth,
|
|
152
|
+
useAuth,
|
|
153
|
+
useAuthGuard,
|
|
154
|
+
useRouteAuth
|
|
155
|
+
};
|
|
156
|
+
export {
|
|
157
|
+
AuthProvider,
|
|
158
|
+
ProtectedRoute,
|
|
159
|
+
PublicRoute,
|
|
160
|
+
Auth_default as default,
|
|
161
|
+
useAuth,
|
|
162
|
+
useAuthGuard,
|
|
163
|
+
useRouteAuth,
|
|
164
|
+
withAuth
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Auth/Auth.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useEffect,\n useState,\n ReactNode,\n ComponentType,\n useCallback,\n useMemo,\n} from 'react';\nimport { useLocation, Navigate } from 'react-router-dom';\n\n/**\n * Interface básica para tokens de autenticação\n */\nexport interface AuthTokens {\n token: string;\n refreshToken: string;\n [key: string]: unknown;\n}\n\n/**\n * Interface básica para usuário\n */\nexport interface AuthUser {\n id: string;\n name?: string;\n email?: string;\n [key: string]: unknown;\n}\n\n/**\n * Interface básica para informações de sessão\n */\nexport interface SessionInfo {\n institutionId?: string;\n profileId?: string;\n schoolId?: string;\n schoolYearId?: string;\n classId?: string;\n [key: string]: unknown;\n}\n\n/**\n * Interface para o estado de autenticação\n */\nexport interface AuthState {\n isAuthenticated: boolean;\n isLoading: boolean;\n user?: AuthUser | null;\n sessionInfo?: SessionInfo | null;\n tokens?: AuthTokens | null;\n}\n\n/**\n * Interface para as funções de autenticação\n */\nexport interface AuthContextType extends AuthState {\n checkAuth: () => Promise<boolean>;\n signOut: () => void;\n}\n\n/**\n * Context de autenticação\n */\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\n\n/**\n * Props do AuthProvider\n */\nexport interface AuthProviderProps {\n children: ReactNode;\n /**\n * Função para verificar se o usuário está autenticado\n * Deve retornar uma Promise<boolean>\n */\n checkAuthFn?: () => Promise<boolean> | boolean;\n /**\n * Função para fazer logout\n */\n signOutFn?: () => void;\n /**\n * Estado de autenticação inicial\n */\n initialAuthState?: Partial<AuthState>;\n /**\n * Função para obter dados do usuário (opcional)\n */\n getUserFn?: () => AuthUser | null | undefined;\n /**\n * Função para obter informações da sessão (opcional)\n */\n getSessionFn?: () => SessionInfo | null | undefined;\n /**\n * Função para obter tokens (opcional)\n */\n getTokensFn?: () => AuthTokens | null | undefined;\n}\n\n/**\n * Provider de autenticação que gerencia o estado global de auth\n * Compatível com qualquer store (Zustand, Redux, Context, etc.)\n */\nexport const AuthProvider = ({\n children,\n checkAuthFn,\n signOutFn,\n initialAuthState = {},\n getUserFn,\n getSessionFn,\n getTokensFn,\n}: AuthProviderProps) => {\n const [authState, setAuthState] = useState<AuthState>({\n isAuthenticated: false,\n isLoading: true,\n ...initialAuthState,\n });\n\n const checkAuth = useCallback(async (): Promise<boolean> => {\n try {\n setAuthState((prev) => ({ ...prev, isLoading: true }));\n\n // Se não há função de verificação, assume como não autenticado\n if (!checkAuthFn) {\n setAuthState((prev) => ({\n ...prev,\n isAuthenticated: false,\n isLoading: false,\n }));\n return false;\n }\n\n const isAuth = await checkAuthFn();\n\n setAuthState((prev) => ({\n ...prev,\n isAuthenticated: isAuth,\n isLoading: false,\n user: getUserFn ? getUserFn() : prev.user,\n sessionInfo: getSessionFn ? getSessionFn() : prev.sessionInfo,\n tokens: getTokensFn ? getTokensFn() : prev.tokens,\n }));\n\n return isAuth;\n } catch (error) {\n console.error('Erro ao verificar autenticação:', error);\n setAuthState((prev) => ({\n ...prev,\n isAuthenticated: false,\n isLoading: false,\n }));\n return false;\n }\n }, [checkAuthFn, getUserFn, getSessionFn, getTokensFn]);\n\n const signOut = useCallback(() => {\n if (signOutFn) {\n signOutFn();\n }\n setAuthState((prev) => ({\n ...prev,\n isAuthenticated: false,\n user: undefined,\n sessionInfo: undefined,\n tokens: undefined,\n }));\n }, [signOutFn]);\n\n useEffect(() => {\n checkAuth();\n }, [checkAuth]);\n\n const contextValue = useMemo(\n (): AuthContextType => ({\n ...authState,\n checkAuth,\n signOut,\n }),\n [authState, checkAuth, signOut]\n );\n\n return (\n <AuthContext.Provider value={contextValue}>{children}</AuthContext.Provider>\n );\n};\n\n/**\n * Hook para usar o contexto de autenticação\n */\nexport const useAuth = (): AuthContextType => {\n const context = useContext(AuthContext);\n if (context === undefined) {\n throw new Error('useAuth deve ser usado dentro de um AuthProvider');\n }\n return context;\n};\n\n/**\n * Props do ProtectedRoute\n */\nexport interface ProtectedRouteProps {\n children: ReactNode;\n /**\n * Path para redirecionamento quando não autenticado\n */\n redirectTo?: string;\n /**\n * Componente de loading personalizado\n */\n loadingComponent?: ReactNode;\n /**\n * Função adicional de verificação (ex: verificar permissões específicas)\n */\n additionalCheck?: (authState: AuthState) => boolean;\n}\n\n/**\n * Componente para proteger rotas que requerem autenticação\n *\n * @example\n * ```tsx\n * <ProtectedRoute redirectTo=\"/login\">\n * <PainelPage />\n * </ProtectedRoute>\n * ```\n */\nexport const ProtectedRoute = ({\n children,\n redirectTo = '/',\n loadingComponent,\n additionalCheck,\n}: ProtectedRouteProps) => {\n const { isAuthenticated, isLoading, ...authState } = useAuth();\n\n // Componente de loading padrão\n const defaultLoadingComponent = (\n <div className=\"flex items-center justify-center min-h-screen\">\n <div className=\"text-text-950 text-lg\">Carregando...</div>\n </div>\n );\n\n // Mostrar loading enquanto verifica autenticação\n if (isLoading) {\n return <>{loadingComponent || defaultLoadingComponent}</>;\n }\n\n // Verificar autenticação básica\n if (!isAuthenticated) {\n return <Navigate to={redirectTo} replace />;\n }\n\n // Verificação adicional (ex: permissões)\n if (\n additionalCheck &&\n !additionalCheck({ isAuthenticated, isLoading, ...authState })\n ) {\n return <Navigate to={redirectTo} replace />;\n }\n\n return <>{children}</>;\n};\n\n/**\n * Props do PublicRoute\n */\nexport interface PublicRouteProps {\n children: ReactNode;\n /**\n * Path para redirecionamento\n */\n redirectTo?: string;\n /**\n * Se deve redirecionar quando usuário estiver autenticado\n */\n redirectIfAuthenticated?: boolean;\n /**\n * Se deve verificar autenticação antes de renderizar\n */\n checkAuthBeforeRender?: boolean;\n}\n\n/**\n * Componente para rotas públicas (login, recuperação de senha, etc.)\n * Opcionalmente redireciona se o usuário já estiver autenticado\n *\n * @example\n * ```tsx\n * <PublicRoute redirectTo=\"/painel\" redirectIfAuthenticated={true}>\n * <LoginPage />\n * </PublicRoute>\n * ```\n */\nexport const PublicRoute = ({\n children,\n redirectTo = '/painel',\n redirectIfAuthenticated = false,\n checkAuthBeforeRender = false,\n}: PublicRouteProps) => {\n const { isAuthenticated, isLoading } = useAuth();\n\n // Se deve aguardar verificação de auth antes de renderizar\n if (checkAuthBeforeRender && isLoading) {\n return (\n <div className=\"flex items-center justify-center min-h-screen\">\n <div className=\"text-text-950 text-lg\">Carregando...</div>\n </div>\n );\n }\n\n // Redirecionar se já autenticado e configurado para isso\n if (isAuthenticated && redirectIfAuthenticated) {\n return <Navigate to={redirectTo} replace />;\n }\n\n return <>{children}</>;\n};\n\n/**\n * HOC para proteger componentes com autenticação\n *\n * @example\n * ```tsx\n * const ProtectedComponent = withAuth(MyComponent, {\n * fallback: \"/login\",\n * loadingComponent: <CustomSpinner />\n * });\n * ```\n */\nexport const withAuth = <P extends object>(\n Component: ComponentType<P>,\n options: Omit<ProtectedRouteProps, 'children'> = {}\n) => {\n return (props: P) => (\n <ProtectedRoute {...options}>\n <Component {...props} />\n </ProtectedRoute>\n );\n};\n\n/**\n * Hook para guard de autenticação com verificações customizadas\n *\n * @example\n * ```tsx\n * const { canAccess, isLoading } = useAuthGuard({\n * requireAuth: true,\n * customCheck: (user) => user?.role === 'admin'\n * });\n * ```\n */\nexport const useAuthGuard = (\n options: {\n requireAuth?: boolean;\n customCheck?: (authState: AuthState) => boolean;\n } = {}\n) => {\n const authState = useAuth();\n const { requireAuth = true, customCheck } = options;\n\n const canAccess =\n !authState.isLoading &&\n (requireAuth\n ? authState.isAuthenticated && (!customCheck || customCheck(authState))\n : !authState.isAuthenticated || !customCheck || customCheck(authState));\n\n return {\n canAccess,\n isLoading: authState.isLoading,\n authState,\n };\n};\n\n/**\n * Hook para verificar autenticação em rotas específicas\n * Útil para verificações condicionais dentro de componentes\n *\n * @example\n * ```tsx\n * const { isAuthenticated, redirectToLogin } = useRouteAuth();\n *\n * if (!isAuthenticated) {\n * return redirectToLogin();\n * }\n * ```\n */\nexport const useRouteAuth = (fallbackPath = '/') => {\n const { isAuthenticated, isLoading } = useAuth();\n const location = useLocation();\n\n const redirectToLogin = () => (\n <Navigate to={fallbackPath} state={{ from: location }} replace />\n );\n\n return {\n isAuthenticated,\n isLoading,\n redirectToLogin,\n };\n};\n\nexport default {\n AuthProvider,\n ProtectedRoute,\n PublicRoute,\n withAuth,\n useAuth,\n useAuthGuard,\n useRouteAuth,\n};\n"],"mappings":"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","names":[]}
|
package/dist/Card/index.d.mts
CHANGED
|
@@ -114,5 +114,12 @@ interface CardAudioProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
114
114
|
}>;
|
|
115
115
|
}
|
|
116
116
|
declare const CardAudio: react.ForwardRefExoticComponent<CardAudioProps & react.RefAttributes<HTMLDivElement>>;
|
|
117
|
+
interface CardSimuladoProps extends HTMLAttributes<HTMLDivElement> {
|
|
118
|
+
title: string;
|
|
119
|
+
duration?: string;
|
|
120
|
+
info: string;
|
|
121
|
+
backgroundColor: 'enem' | 'prova' | 'simuladao' | 'vestibular';
|
|
122
|
+
}
|
|
123
|
+
declare const CardSimulado: react.ForwardRefExoticComponent<CardSimuladoProps & react.RefAttributes<HTMLDivElement>>;
|
|
117
124
|
|
|
118
|
-
export { CardActivitiesResults, CardAudio, CardBase, CardForum, CardPerformance, CardProgress, CardQuestions, CardResults, CardSettings, CardStatus, CardSupport, CardTopic };
|
|
125
|
+
export { CardActivitiesResults, CardAudio, CardBase, CardForum, CardPerformance, CardProgress, CardQuestions, CardResults, CardSettings, CardSimulado, CardStatus, CardSupport, CardTopic };
|
package/dist/Card/index.d.ts
CHANGED
|
@@ -114,5 +114,12 @@ interface CardAudioProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
114
114
|
}>;
|
|
115
115
|
}
|
|
116
116
|
declare const CardAudio: react.ForwardRefExoticComponent<CardAudioProps & react.RefAttributes<HTMLDivElement>>;
|
|
117
|
+
interface CardSimuladoProps extends HTMLAttributes<HTMLDivElement> {
|
|
118
|
+
title: string;
|
|
119
|
+
duration?: string;
|
|
120
|
+
info: string;
|
|
121
|
+
backgroundColor: 'enem' | 'prova' | 'simuladao' | 'vestibular';
|
|
122
|
+
}
|
|
123
|
+
declare const CardSimulado: react.ForwardRefExoticComponent<CardSimuladoProps & react.RefAttributes<HTMLDivElement>>;
|
|
117
124
|
|
|
118
|
-
export { CardActivitiesResults, CardAudio, CardBase, CardForum, CardPerformance, CardProgress, CardQuestions, CardResults, CardSettings, CardStatus, CardSupport, CardTopic };
|
|
125
|
+
export { CardActivitiesResults, CardAudio, CardBase, CardForum, CardPerformance, CardProgress, CardQuestions, CardResults, CardSettings, CardSimulado, CardStatus, CardSupport, CardTopic };
|
package/dist/Card/index.js
CHANGED
|
@@ -29,6 +29,7 @@ __export(Card_exports, {
|
|
|
29
29
|
CardQuestions: () => CardQuestions,
|
|
30
30
|
CardResults: () => CardResults,
|
|
31
31
|
CardSettings: () => CardSettings,
|
|
32
|
+
CardSimulado: () => CardSimulado,
|
|
32
33
|
CardStatus: () => CardStatus,
|
|
33
34
|
CardSupport: () => CardSupport,
|
|
34
35
|
CardTopic: () => CardTopic
|
|
@@ -1549,6 +1550,49 @@ var CardAudio = (0, import_react.forwardRef)(
|
|
|
1549
1550
|
);
|
|
1550
1551
|
}
|
|
1551
1552
|
);
|
|
1553
|
+
var SIMULADO_BACKGROUND_CLASSES = {
|
|
1554
|
+
enem: "bg-exam-1",
|
|
1555
|
+
prova: "bg-exam-2",
|
|
1556
|
+
simuladao: "bg-exam-3",
|
|
1557
|
+
vestibular: "bg-exam-4"
|
|
1558
|
+
};
|
|
1559
|
+
var CardSimulado = (0, import_react.forwardRef)(
|
|
1560
|
+
({ title, duration, info, backgroundColor, className, ...props }, ref) => {
|
|
1561
|
+
const backgroundClass = SIMULADO_BACKGROUND_CLASSES[backgroundColor];
|
|
1562
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1563
|
+
CardBase,
|
|
1564
|
+
{
|
|
1565
|
+
ref,
|
|
1566
|
+
layout: "horizontal",
|
|
1567
|
+
padding: "medium",
|
|
1568
|
+
minHeight: "none",
|
|
1569
|
+
cursor: "pointer",
|
|
1570
|
+
className: `${backgroundClass} hover:shadow-soft-shadow-2 transition-shadow duration-200 ${className}`,
|
|
1571
|
+
...props,
|
|
1572
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex justify-between items-center w-full gap-4", children: [
|
|
1573
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex flex-col gap-1 flex-1 min-w-0", children: [
|
|
1574
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text_default, { size: "lg", weight: "bold", className: "text-text-950 truncate", children: title }),
|
|
1575
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex items-center gap-4 text-text-700", children: [
|
|
1576
|
+
duration && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex items-center gap-1", children: [
|
|
1577
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_phosphor_react2.Clock, { size: 16, className: "flex-shrink-0" }),
|
|
1578
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text_default, { size: "sm", children: duration })
|
|
1579
|
+
] }),
|
|
1580
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text_default, { size: "sm", className: "truncate", children: info })
|
|
1581
|
+
] })
|
|
1582
|
+
] }),
|
|
1583
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1584
|
+
import_phosphor_react2.CaretRight,
|
|
1585
|
+
{
|
|
1586
|
+
size: 24,
|
|
1587
|
+
className: "text-text-800 flex-shrink-0",
|
|
1588
|
+
"data-testid": "caret-icon"
|
|
1589
|
+
}
|
|
1590
|
+
)
|
|
1591
|
+
] })
|
|
1592
|
+
}
|
|
1593
|
+
);
|
|
1594
|
+
}
|
|
1595
|
+
);
|
|
1552
1596
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1553
1597
|
0 && (module.exports = {
|
|
1554
1598
|
CardActivitiesResults,
|
|
@@ -1560,6 +1604,7 @@ var CardAudio = (0, import_react.forwardRef)(
|
|
|
1560
1604
|
CardQuestions,
|
|
1561
1605
|
CardResults,
|
|
1562
1606
|
CardSettings,
|
|
1607
|
+
CardSimulado,
|
|
1563
1608
|
CardStatus,
|
|
1564
1609
|
CardSupport,
|
|
1565
1610
|
CardTopic
|