primus-saas-react 1.0.3 → 1.0.5

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.
Files changed (45) hide show
  1. package/dist/styles.css +568 -0
  2. package/package.json +15 -9
  3. package/DEMO.md +0 -68
  4. package/INTEGRATION.md +0 -702
  5. package/build_log.txt +0 -0
  6. package/postcss.config.js +0 -6
  7. package/src/components/ai/AICopilot.tsx +0 -88
  8. package/src/components/auth/PrimusLogin.tsx +0 -298
  9. package/src/components/auth/UserProfile.tsx +0 -26
  10. package/src/components/banking/accounts/AccountDashboard.tsx +0 -67
  11. package/src/components/banking/cards/CreditCardVisual.tsx +0 -67
  12. package/src/components/banking/credit/CreditScoreCard.tsx +0 -80
  13. package/src/components/banking/kyc/KYCVerification.tsx +0 -76
  14. package/src/components/banking/loans/LoanCalculator.tsx +0 -106
  15. package/src/components/banking/transactions/TransactionHistory.tsx +0 -74
  16. package/src/components/crud/PrimusDataTable.tsx +0 -220
  17. package/src/components/crud/PrimusModal.tsx +0 -68
  18. package/src/components/dashboard/PrimusDashboard.tsx +0 -145
  19. package/src/components/documents/DocumentViewer.tsx +0 -107
  20. package/src/components/featureflags/FeatureFlagToggle.tsx +0 -64
  21. package/src/components/insurance/agents/AgentDirectory.tsx +0 -72
  22. package/src/components/insurance/claims/ClaimStatusTracker.tsx +0 -78
  23. package/src/components/insurance/fraud/FraudDetectionDashboard.tsx +0 -68
  24. package/src/components/insurance/policies/PolicyCard.tsx +0 -77
  25. package/src/components/insurance/premium/PremiumCalculator.tsx +0 -104
  26. package/src/components/insurance/quotes/QuoteComparison.tsx +0 -75
  27. package/src/components/layout/PrimusHeader.tsx +0 -75
  28. package/src/components/layout/PrimusLayout.tsx +0 -47
  29. package/src/components/layout/PrimusSidebar.tsx +0 -102
  30. package/src/components/logging/LogViewer.tsx +0 -90
  31. package/src/components/notifications/NotificationFeed.tsx +0 -106
  32. package/src/components/notifications/PrimusNotificationCenter.tsx +0 -282
  33. package/src/components/payments/CheckoutForm.tsx +0 -167
  34. package/src/components/security/SecurityDashboard.tsx +0 -83
  35. package/src/components/shared/Button.tsx +0 -36
  36. package/src/components/shared/Input.tsx +0 -36
  37. package/src/components/storage/FileUploader.tsx +0 -79
  38. package/src/context/PrimusProvider.tsx +0 -156
  39. package/src/context/PrimusThemeProvider.tsx +0 -160
  40. package/src/hooks/useNotifications.ts +0 -58
  41. package/src/hooks/usePrimusAuth.ts +0 -3
  42. package/src/hooks/useRealtimeNotifications.ts +0 -114
  43. package/src/index.ts +0 -42
  44. package/tailwind.config.js +0 -18
  45. package/tsconfig.json +0 -28
@@ -1,79 +0,0 @@
1
- import React, { useState } from 'react';
2
-
3
- export const FileUploader: React.FC<{ apiUrl?: string; onUploadComplete?: (file: any) => void }> = ({
4
- apiUrl = 'http://localhost:5221',
5
- onUploadComplete
6
- }) => {
7
- const [uploading, setUploading] = useState(false);
8
- const [dragActive, setDragActive] = useState(false);
9
-
10
- const handleUpload = async (file: File) => {
11
- setUploading(true);
12
- const formData = new FormData();
13
- formData.append('file', file);
14
-
15
- try {
16
- const response = await fetch(`${apiUrl}/api/storage/upload`, {
17
- method: 'POST',
18
- body: formData
19
- });
20
-
21
- if (response.ok) {
22
- const data = await response.json();
23
- onUploadComplete?.(data);
24
- }
25
- } catch (error) {
26
- console.error('Upload failed:', error);
27
- } finally {
28
- setUploading(false);
29
- }
30
- };
31
-
32
- const handleDrop = (e: React.DragEvent) => {
33
- e.preventDefault();
34
- setDragActive(false);
35
-
36
- if (e.dataTransfer.files && e.dataTransfer.files[0]) {
37
- handleUpload(e.dataTransfer.files[0]);
38
- }
39
- };
40
-
41
- return (
42
- <div className="bg-white p-6 rounded-lg border border-gray-200 shadow-sm">
43
- <h3 className="text-lg font-medium text-gray-900 mb-4">Upload File</h3>
44
-
45
- <div
46
- className={`border-2 border-dashed rounded-lg p-8 text-center ${dragActive ? 'border-primus-500 bg-primus-50' : 'border-gray-300'
47
- }`}
48
- onDragOver={(e) => { e.preventDefault(); setDragActive(true); }}
49
- onDragLeave={() => setDragActive(false)}
50
- onDrop={handleDrop}
51
- >
52
- {uploading ? (
53
- <div className="text-gray-600">Uploading...</div>
54
- ) : (
55
- <>
56
- <svg className="mx-auto h-12 w-12 text-gray-400" stroke="currentColor" fill="none" viewBox="0 0 48 48">
57
- <path d="M28 8H12a4 4 0 00-4 4v20m32-12v8m0 0v8a4 4 0 01-4 4H12a4 4 0 01-4-4v-4m32-4l-3.172-3.172a4 4 0 00-5.656 0L28 28M8 32l9.172-9.172a4 4 0 015.656 0L28 28m0 0l4 4m4-24h8m-4-4v8m-12 4h.02" strokeWidth={2} strokeLinecap="round" strokeLinejoin="round" />
58
- </svg>
59
- <p className="mt-2 text-sm text-gray-600">
60
- Drag and drop a file here, or click to select
61
- </p>
62
- <input
63
- type="file"
64
- className="hidden"
65
- id="file-upload"
66
- onChange={(e) => e.target.files?.[0] && handleUpload(e.target.files[0])}
67
- />
68
- <label
69
- htmlFor="file-upload"
70
- className="mt-4 inline-block px-4 py-2 bg-primus-600 text-white rounded cursor-pointer hover:bg-primus-700"
71
- >
72
- Select File
73
- </label>
74
- </>
75
- )}
76
- </div>
77
- </div>
78
- );
79
- };
@@ -1,156 +0,0 @@
1
- import React, { createContext, useContext, useEffect, useState, useCallback } from 'react';
2
-
3
- interface PrimusUser {
4
- id?: string;
5
- name: string;
6
- email: string;
7
- roles?: string[];
8
- claims?: Record<string, any>;
9
- }
10
-
11
- interface PrimusAuthContextType {
12
- isAuthenticated: boolean;
13
- user: PrimusUser | null;
14
- login: (credentials: { email: string; password: string } | { provider: 'auth0' | 'azure' | 'google' | 'github' }) => Promise<{ success: boolean; error?: string }>;
15
- logout: () => Promise<void>;
16
- token: string | null;
17
- isLoading: boolean;
18
- }
19
-
20
- const PrimusAuthContext = createContext<PrimusAuthContextType | undefined>(undefined);
21
-
22
- export interface PrimusProviderProps {
23
- children: React.ReactNode;
24
- /** Base URL for authentication API (e.g., http://localhost:5221) */
25
- authority: string;
26
- clientId: string;
27
- redirectUri?: string;
28
- /** Called after successful login */
29
- onLoginSuccess?: (user: PrimusUser, token: string) => void;
30
- /** Called on login failure */
31
- onLoginError?: (error: string) => void;
32
- }
33
-
34
- export const PrimusProvider: React.FC<PrimusProviderProps> = ({
35
- children,
36
- authority,
37
- clientId,
38
- onLoginSuccess,
39
- onLoginError,
40
- }) => {
41
- // Suppress unused warning
42
- void clientId;
43
-
44
- const [isAuthenticated, setIsAuthenticated] = useState(false);
45
- const [user, setUser] = useState<PrimusUser | null>(null);
46
- const [token, setToken] = useState<string | null>(null);
47
- const [isLoading, setIsLoading] = useState(false);
48
-
49
- // Check for existing session on mount
50
- useEffect(() => {
51
- const storedToken = localStorage.getItem('primus_token');
52
- const storedUser = localStorage.getItem('primus_user');
53
- if (storedToken && storedUser) {
54
- try {
55
- setToken(storedToken);
56
- setUser(JSON.parse(storedUser));
57
- setIsAuthenticated(true);
58
- } catch {
59
- localStorage.removeItem('primus_token');
60
- localStorage.removeItem('primus_user');
61
- }
62
- }
63
- }, []);
64
-
65
- const login = useCallback(async (
66
- credentials: { email: string; password: string } | { provider: 'auth0' | 'azure' | 'google' | 'github' }
67
- ): Promise<{ success: boolean; error?: string }> => {
68
- setIsLoading(true);
69
-
70
- try {
71
- let endpoint: string;
72
- let body: any;
73
-
74
- if ('provider' in credentials) {
75
- // Social/SSO login
76
- endpoint = `${authority}/auth/${credentials.provider}`;
77
- body = {};
78
- } else {
79
- // Email/password login
80
- endpoint = `${authority}/auth/local`;
81
- body = { email: credentials.email, password: credentials.password };
82
- }
83
-
84
- const response = await fetch(endpoint, {
85
- method: 'POST',
86
- headers: { 'Content-Type': 'application/json' },
87
- body: JSON.stringify(body),
88
- });
89
-
90
- if (!response.ok) {
91
- const errorData = await response.json().catch(() => ({}));
92
- const errorMsg = errorData.message || `Login failed (${response.status})`;
93
- onLoginError?.(errorMsg);
94
- return { success: false, error: errorMsg };
95
- }
96
-
97
- const data = await response.json();
98
- const accessToken = data.access_token || data.token;
99
-
100
- // Parse user from token or response
101
- const userData: PrimusUser = data.user || {
102
- name: 'Authenticated User',
103
- email: 'provider' in credentials ? `${credentials.provider}@primus.local` : credentials.email,
104
- };
105
-
106
- // Store session
107
- localStorage.setItem('primus_token', accessToken);
108
- localStorage.setItem('primus_user', JSON.stringify(userData));
109
-
110
- setToken(accessToken);
111
- setUser(userData);
112
- setIsAuthenticated(true);
113
-
114
- onLoginSuccess?.(userData, accessToken);
115
- return { success: true };
116
-
117
- } catch (err) {
118
- const errorMsg = err instanceof Error ? err.message : 'Network error';
119
- onLoginError?.(errorMsg);
120
- return { success: false, error: errorMsg };
121
- } finally {
122
- setIsLoading(false);
123
- }
124
- }, [authority, onLoginSuccess, onLoginError]);
125
-
126
- const logout = useCallback(async () => {
127
- localStorage.removeItem('primus_token');
128
- localStorage.removeItem('primus_user');
129
- setToken(null);
130
- setIsAuthenticated(false);
131
- setUser(null);
132
- }, []);
133
-
134
- return (
135
- <PrimusAuthContext.Provider value={{ isAuthenticated, user, login, logout, token, isLoading }}>
136
- {children}
137
- </PrimusAuthContext.Provider>
138
- );
139
- };
140
-
141
- export const usePrimusAuth = () => {
142
- const context = useContext(PrimusAuthContext);
143
-
144
- // Fallback for components used outside provider (standalone mode)
145
- if (context === undefined) {
146
- return {
147
- isAuthenticated: false,
148
- user: null,
149
- login: async () => ({ success: false, error: 'PrimusProvider not configured' }),
150
- logout: async () => { },
151
- token: null,
152
- isLoading: false,
153
- };
154
- }
155
- return context;
156
- };
@@ -1,160 +0,0 @@
1
- import { createContext, useContext, useState, useCallback, ReactNode } from 'react';
2
-
3
- export type PrimusTheme = 'light' | 'dark';
4
-
5
- interface ThemeColors {
6
- bg: string;
7
- bgSecondary: string;
8
- bgTertiary: string;
9
- bgHover: string;
10
- border: string;
11
- borderSecondary: string;
12
- text: string;
13
- textSecondary: string;
14
- textMuted: string;
15
- accent: string;
16
- accentHover: string;
17
- accentText: string;
18
- badge: string;
19
- success: string;
20
- warning: string;
21
- error: string;
22
- info: string;
23
- }
24
-
25
- export const themeColors: Record<PrimusTheme, ThemeColors> = {
26
- light: {
27
- bg: 'bg-white',
28
- bgSecondary: 'bg-gray-50',
29
- bgTertiary: 'bg-gray-100',
30
- bgHover: 'hover:bg-gray-100',
31
- border: 'border-gray-200',
32
- borderSecondary: 'border-gray-100',
33
- text: 'text-gray-900',
34
- textSecondary: 'text-gray-600',
35
- textMuted: 'text-gray-400',
36
- accent: 'bg-violet-600',
37
- accentHover: 'hover:bg-violet-500',
38
- accentText: 'text-violet-600',
39
- badge: 'bg-orange-500',
40
- success: 'text-emerald-600',
41
- warning: 'text-amber-600',
42
- error: 'text-rose-600',
43
- info: 'text-blue-600',
44
- },
45
- dark: {
46
- bg: 'bg-gray-900',
47
- bgSecondary: 'bg-gray-800',
48
- bgTertiary: 'bg-gray-800/50',
49
- bgHover: 'hover:bg-gray-800',
50
- border: 'border-gray-700',
51
- borderSecondary: 'border-gray-800',
52
- text: 'text-white',
53
- textSecondary: 'text-gray-400',
54
- textMuted: 'text-gray-500',
55
- accent: 'bg-blue-600',
56
- accentHover: 'hover:bg-blue-500',
57
- accentText: 'text-blue-400',
58
- badge: 'bg-rose-500',
59
- success: 'text-emerald-400',
60
- warning: 'text-amber-400',
61
- error: 'text-rose-400',
62
- info: 'text-blue-400',
63
- }
64
- };
65
-
66
- interface PrimusThemeContextValue {
67
- theme: PrimusTheme;
68
- colors: ThemeColors;
69
- setTheme: (theme: PrimusTheme) => void;
70
- toggleTheme: () => void;
71
- }
72
-
73
- const PrimusThemeContext = createContext<PrimusThemeContextValue | undefined>(undefined);
74
-
75
- interface PrimusThemeProviderProps {
76
- children: ReactNode;
77
- defaultTheme?: PrimusTheme;
78
- }
79
-
80
- /**
81
- * PrimusThemeProvider - Global Theme Context for Primus UI Components
82
- *
83
- * Wrap your app with this provider to enable consistent theming across all Primus components.
84
- *
85
- * @example
86
- * ```tsx
87
- * <PrimusThemeProvider defaultTheme="dark">
88
- * <App />
89
- * </PrimusThemeProvider>
90
- * ```
91
- */
92
- export function PrimusThemeProvider({ children, defaultTheme = 'dark' }: PrimusThemeProviderProps) {
93
- const [theme, setTheme] = useState<PrimusTheme>(defaultTheme);
94
-
95
- const toggleTheme = useCallback(() => {
96
- setTheme(prev => prev === 'dark' ? 'light' : 'dark');
97
- }, []);
98
-
99
- const value: PrimusThemeContextValue = {
100
- theme,
101
- colors: themeColors[theme],
102
- setTheme,
103
- toggleTheme,
104
- };
105
-
106
- return (
107
- <PrimusThemeContext.Provider value={value}>
108
- {children}
109
- </PrimusThemeContext.Provider>
110
- );
111
- }
112
-
113
- /**
114
- * usePrimusTheme - Hook to access the current Primus theme
115
- *
116
- * @example
117
- * ```tsx
118
- * const { theme, colors, toggleTheme } = usePrimusTheme();
119
- * ```
120
- */
121
- export function usePrimusTheme(): PrimusThemeContextValue {
122
- const context = useContext(PrimusThemeContext);
123
-
124
- // Fallback for components used outside provider
125
- if (!context) {
126
- return {
127
- theme: 'dark',
128
- colors: themeColors.dark,
129
- setTheme: () => console.warn('PrimusThemeProvider not found'),
130
- toggleTheme: () => console.warn('PrimusThemeProvider not found'),
131
- };
132
- }
133
-
134
- return context;
135
- }
136
-
137
- /**
138
- * PrimusThemeToggle - A button to toggle between light and dark themes
139
- */
140
- export function PrimusThemeToggle() {
141
- const { theme, toggleTheme, colors } = usePrimusTheme();
142
-
143
- return (
144
- <button
145
- onClick={toggleTheme}
146
- className={`p-2 rounded-lg ${colors.bgHover} transition-colors`}
147
- title={`Switch to ${theme === 'dark' ? 'light' : 'dark'} mode`}
148
- >
149
- {theme === 'dark' ? (
150
- <svg className="h-5 w-5 text-yellow-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
151
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z" />
152
- </svg>
153
- ) : (
154
- <svg className="h-5 w-5 text-gray-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
155
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z" />
156
- </svg>
157
- )}
158
- </button>
159
- );
160
- }
@@ -1,58 +0,0 @@
1
- import { useState, useEffect } from 'react';
2
-
3
- export interface Notification {
4
- id: string;
5
- title: string;
6
- message: string;
7
- type: 'info' | 'success' | 'warning' | 'error';
8
- timestamp: string;
9
- read: boolean;
10
- }
11
-
12
- export const useNotifications = (apiUrl: string = 'http://localhost:5221') => {
13
- const [notifications, setNotifications] = useState<Notification[]>([]);
14
- const [unreadCount, setUnreadCount] = useState(0);
15
- const [loading, setLoading] = useState(true);
16
-
17
- useEffect(() => {
18
- fetchNotifications();
19
-
20
- // Poll for new notifications every 3 seconds (near real-time for demo)
21
- const interval = setInterval(fetchNotifications, 3000);
22
- return () => clearInterval(interval);
23
- }, []);
24
-
25
- const fetchNotifications = async () => {
26
- try {
27
- const response = await fetch(`${apiUrl}/notifications`);
28
- if (response.ok) {
29
- const data = await response.json();
30
- setNotifications(data);
31
- setUnreadCount(data.filter((n: Notification) => !n.read).length);
32
- }
33
- } catch (error) {
34
- console.error('Failed to fetch notifications:', error);
35
- } finally {
36
- setLoading(false);
37
- }
38
- };
39
-
40
- const markAsRead = (id: string) => {
41
- setNotifications(prev => prev.map(n => n.id === id ? { ...n, read: true } : n));
42
- setUnreadCount(prev => Math.max(0, prev - 1));
43
- };
44
-
45
- const markAllAsRead = () => {
46
- setNotifications(prev => prev.map(n => ({ ...n, read: true })));
47
- setUnreadCount(0);
48
- };
49
-
50
- return {
51
- notifications,
52
- unreadCount,
53
- loading,
54
- markAsRead,
55
- markAllAsRead,
56
- refresh: fetchNotifications
57
- };
58
- };
@@ -1,3 +0,0 @@
1
- import { usePrimusAuth } from '../context/PrimusProvider';
2
-
3
- export { usePrimusAuth };
@@ -1,114 +0,0 @@
1
- import { useState, useEffect, useCallback } from 'react';
2
-
3
- export interface PrimusNotification {
4
- id: string;
5
- title: string;
6
- message: string;
7
- type: 'info' | 'success' | 'warning' | 'error';
8
- timestamp: string;
9
- read: boolean;
10
- }
11
-
12
- export interface UseRealtimeNotificationsOptions {
13
- apiUrl: string;
14
- pollInterval?: number; // milliseconds, default 3000
15
- userId?: string;
16
- }
17
-
18
- /**
19
- * Hook for managing real-time notifications from Primus Backend.
20
- * Supports both polling and SignalR (when available).
21
- */
22
- export const useRealtimeNotifications = (options: UseRealtimeNotificationsOptions) => {
23
- const { apiUrl, pollInterval = 3000, userId } = options;
24
- const [notifications, setNotifications] = useState<PrimusNotification[]>([]);
25
- const [unreadCount, setUnreadCount] = useState(0);
26
- const [loading, setLoading] = useState(true);
27
- const [error, setError] = useState<string | null>(null);
28
-
29
- const baseUrl = `${apiUrl}/api/notifications`;
30
-
31
- const fetchNotifications = useCallback(async () => {
32
- try {
33
- const url = userId ? `${baseUrl}?userId=${userId}` : baseUrl;
34
- const response = await fetch(url);
35
- if (response.ok) {
36
- const data = await response.json();
37
- setNotifications(data);
38
- setUnreadCount(data.filter((n: PrimusNotification) => !n.read).length);
39
- setError(null);
40
- }
41
- } catch (err) {
42
- setError('Failed to connect to notification service');
43
- } finally {
44
- setLoading(false);
45
- }
46
- }, [baseUrl, userId]);
47
-
48
- const sendNotification = useCallback(async (
49
- title: string,
50
- message: string,
51
- type: 'info' | 'success' | 'warning' | 'error' = 'info'
52
- ) => {
53
- try {
54
- const response = await fetch(baseUrl, {
55
- method: 'POST',
56
- headers: { 'Content-Type': 'application/json' },
57
- body: JSON.stringify({ title, message, type, userId })
58
- });
59
- if (response.ok) {
60
- // Immediately refresh to show the new notification
61
- await fetchNotifications();
62
- return true;
63
- }
64
- return false;
65
- } catch {
66
- return false;
67
- }
68
- }, [baseUrl, userId, fetchNotifications]);
69
-
70
- const markAsRead = useCallback(async (id: string) => {
71
- try {
72
- await fetch(`${baseUrl}/${id}/read`, { method: 'PUT' });
73
- setNotifications(prev => prev.map(n => n.id === id ? { ...n, read: true } : n));
74
- setUnreadCount(prev => Math.max(0, prev - 1));
75
- } catch {
76
- // Silently fail
77
- }
78
- }, [baseUrl]);
79
-
80
- const markAllAsRead = useCallback(async () => {
81
- // Mark all unread as read
82
- const unread = notifications.filter(n => !n.read);
83
- await Promise.all(unread.map(n => fetch(`${baseUrl}/${n.id}/read`, { method: 'PUT' })));
84
- setNotifications(prev => prev.map(n => ({ ...n, read: true })));
85
- setUnreadCount(0);
86
- }, [notifications, baseUrl]);
87
-
88
- const deleteNotification = useCallback(async (id: string) => {
89
- try {
90
- await fetch(`${baseUrl}/${id}`, { method: 'DELETE' });
91
- setNotifications(prev => prev.filter(n => n.id !== id));
92
- } catch {
93
- // Silently fail
94
- }
95
- }, [baseUrl]);
96
-
97
- useEffect(() => {
98
- fetchNotifications();
99
- const interval = setInterval(fetchNotifications, pollInterval);
100
- return () => clearInterval(interval);
101
- }, [fetchNotifications, pollInterval]);
102
-
103
- return {
104
- notifications,
105
- unreadCount,
106
- loading,
107
- error,
108
- sendNotification,
109
- markAsRead,
110
- markAllAsRead,
111
- deleteNotification,
112
- refresh: fetchNotifications
113
- };
114
- };
package/src/index.ts DELETED
@@ -1,42 +0,0 @@
1
- // Export all new components
2
- export * from './components/banking/accounts/AccountDashboard';
3
- export * from './components/banking/kyc/KYCVerification';
4
- export * from './components/banking/loans/LoanCalculator';
5
- export * from './components/banking/credit/CreditScoreCard';
6
- export * from './components/insurance/quotes/QuoteComparison';
7
- export * from './components/insurance/agents/AgentDirectory';
8
- export * from './components/insurance/fraud/FraudDetectionDashboard';
9
- export * from './components/insurance/premium/PremiumCalculator';
10
- export * from './components/ai/AICopilot';
11
- export * from './components/storage/FileUploader';
12
- export * from './components/security/SecurityDashboard';
13
-
14
- // Existing exports
15
- export * from './components/auth/PrimusLogin';
16
- export * from './context/PrimusProvider';
17
- export * from './context/PrimusThemeProvider';
18
- export * from './components/notifications/NotificationFeed';
19
- export * from './components/notifications/PrimusNotificationCenter';
20
- export * from './hooks/useNotifications';
21
- export * from './hooks/useRealtimeNotifications';
22
- export * from './components/payments/CheckoutForm';
23
- export * from './components/documents/DocumentViewer';
24
- export * from './components/banking/cards/CreditCardVisual';
25
- export * from './components/banking/transactions/TransactionHistory';
26
- export * from './components/insurance/policies/PolicyCard';
27
- export * from './components/insurance/claims/ClaimStatusTracker';
28
- export * from './components/featureflags/FeatureFlagToggle';
29
- export * from './components/logging/LogViewer';
30
-
31
- // Layout components (NEW)
32
- export * from './components/layout/PrimusLayout';
33
- export * from './components/layout/PrimusSidebar';
34
- export * from './components/layout/PrimusHeader';
35
-
36
- // CRUD components (NEW)
37
- export * from './components/crud/PrimusDataTable';
38
- export * from './components/crud/PrimusModal';
39
-
40
- // Dashboard components (NEW)
41
- export * from './components/dashboard/PrimusDashboard';
42
-
@@ -1,18 +0,0 @@
1
- /** @type {import('tailwindcss').Config} */
2
- module.exports = {
3
- content: ["./src/**/*.{js,ts,jsx,tsx}"],
4
- theme: {
5
- extend: {
6
- colors: {
7
- primus: {
8
- 50: '#f0f9ff',
9
- 100: '#e0f2fe',
10
- 500: '#0ea5e9',
11
- 600: '#0284c7',
12
- 900: '#0c4a6e',
13
- }
14
- }
15
- },
16
- },
17
- plugins: [],
18
- }
package/tsconfig.json DELETED
@@ -1,28 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2020",
4
- "useDefineForClassFields": true,
5
- "lib": [
6
- "ES2020",
7
- "DOM",
8
- "DOM.Iterable"
9
- ],
10
- "module": "ESNext",
11
- "skipLibCheck": true,
12
- "moduleResolution": "bundler",
13
- "allowImportingTsExtensions": true,
14
- "resolveJsonModule": true,
15
- "isolatedModules": true,
16
- "noEmit": true,
17
- "jsx": "react-jsx",
18
- "strict": true,
19
- "noUnusedLocals": true,
20
- "noUnusedParameters": true,
21
- "noFallthroughCasesInSwitch": true,
22
- "declaration": true,
23
- "baseUrl": "."
24
- },
25
- "include": [
26
- "src"
27
- ]
28
- }