firebase-os 1.1.4 → 1.1.6

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 (124) hide show
  1. package/dist/FirebaseOS.d.ts +15 -0
  2. package/dist/firebase-os.cjs.js +5 -20
  3. package/dist/firebase-os.es.js +95 -90
  4. package/dist/index.d.ts +3 -0
  5. package/dist/lib/ConfigContext.d.ts +12 -0
  6. package/package.json +3 -2
  7. package/scripts/postinstall.js +86 -15
  8. package/src/App.css +184 -0
  9. package/src/App.tsx +214 -0
  10. package/src/FirebaseOS.tsx +81 -0
  11. package/src/assets/hero.png +0 -0
  12. package/src/assets/react.svg +1 -0
  13. package/src/assets/vite.svg +1 -0
  14. package/src/components/AdminNotifications.test.tsx +98 -0
  15. package/src/components/AdminNotifications.tsx +194 -0
  16. package/src/components/Button.test.tsx +22 -0
  17. package/src/components/Button.tsx +53 -0
  18. package/src/components/ConfirmModal.test.tsx +98 -0
  19. package/src/components/ConfirmModal.tsx +73 -0
  20. package/src/components/ContactPopup.test.tsx +98 -0
  21. package/src/components/ContactPopup.tsx +437 -0
  22. package/src/components/CustomSelect.test.tsx +47 -0
  23. package/src/components/CustomSelect.tsx +89 -0
  24. package/src/components/DashboardNav.test.tsx +98 -0
  25. package/src/components/DashboardNav.tsx +281 -0
  26. package/src/components/Input.test.tsx +33 -0
  27. package/src/components/Input.tsx +61 -0
  28. package/src/components/JsonEditor.tsx +579 -0
  29. package/src/components/Navbar.test.tsx +98 -0
  30. package/src/components/Navbar.tsx +563 -0
  31. package/src/configs/forms/contactForm.config.ts +15 -0
  32. package/src/configs/forms/index.ts +29 -0
  33. package/src/configs/forms/pubForm.config.ts +11 -0
  34. package/src/configs/forms/supportForm.config.ts +14 -0
  35. package/src/configs/forms/userForm.config.ts +11 -0
  36. package/src/configs/pages/admin.config.ts +29 -0
  37. package/src/configs/pages/contact.config.ts +6 -0
  38. package/src/configs/pages/home.config.ts +18 -0
  39. package/src/configs/pages/mem.config.ts +2 -0
  40. package/src/configs/pages/menuOrders.config.ts +11 -0
  41. package/src/configs/pages/pub.config.ts +11 -0
  42. package/src/configs/pages/shared.config.ts +29 -0
  43. package/src/configs/pages/support.config.ts +7 -0
  44. package/src/configs/pages/tabOrders.config.ts +33 -0
  45. package/src/configs/pages/user.config.ts +29 -0
  46. package/src/configs/theme.config.ts +93 -0
  47. package/src/index.css +403 -0
  48. package/src/index.ts +22 -0
  49. package/src/lib/AuthContext.test.tsx +88 -0
  50. package/src/lib/AuthContext.tsx +191 -0
  51. package/src/lib/ConfigContext.tsx +45 -0
  52. package/src/lib/ThemeContext.tsx +233 -0
  53. package/src/lib/firebase.ts +91 -0
  54. package/src/main.tsx +22 -0
  55. package/src/microcomponents/AdminExampleContent.tsx +44 -0
  56. package/src/microcomponents/PrivateExampleContent.tsx +39 -0
  57. package/src/microcomponents/Public.tsx +126 -0
  58. package/src/microcomponents/SharedExampleContent.tsx +53 -0
  59. package/src/pages/Dashboard.test.tsx +98 -0
  60. package/src/pages/Dashboard.tsx +60 -0
  61. package/src/pages/DynamicPage.tsx +237 -0
  62. package/src/pages/FormsAdmin.test.tsx +98 -0
  63. package/src/pages/FormsAdmin.tsx +459 -0
  64. package/src/pages/Home.test.tsx +98 -0
  65. package/src/pages/Home.tsx +144 -0
  66. package/src/pages/Login.test.tsx +98 -0
  67. package/src/pages/Login.tsx +108 -0
  68. package/src/pages/PagesAdmin.test.tsx +98 -0
  69. package/src/pages/PagesAdmin.tsx +1022 -0
  70. package/src/pages/Profile.test.tsx +98 -0
  71. package/src/pages/Profile.tsx +319 -0
  72. package/src/pages/Register.test.tsx +98 -0
  73. package/src/pages/Register.tsx +116 -0
  74. package/src/pages/Requests.test.tsx +95 -0
  75. package/src/pages/Requests.tsx +422 -0
  76. package/src/pages/ResetPassword.test.tsx +98 -0
  77. package/src/pages/ResetPassword.tsx +92 -0
  78. package/src/pages/Settings.test.tsx +98 -0
  79. package/src/pages/Settings.tsx +393 -0
  80. package/src/pages/Setup.tsx +407 -0
  81. package/src/pages/StorageAdmin.test.tsx +150 -0
  82. package/src/pages/StorageAdmin.tsx +769 -0
  83. package/src/pages/Submissions.test.tsx +95 -0
  84. package/src/pages/Submissions.tsx +378 -0
  85. package/src/pages/Templates.test.tsx +98 -0
  86. package/src/pages/Templates.tsx +103 -0
  87. package/src/pages/ThemeAdmin.test.tsx +144 -0
  88. package/src/pages/ThemeAdmin.tsx +1000 -0
  89. package/src/pages/Users.test.tsx +95 -0
  90. package/src/pages/Users.tsx +334 -0
  91. package/src/pages/Verify.test.tsx +98 -0
  92. package/src/pages/Verify.tsx +95 -0
  93. package/src/prompts/index.ts +13 -0
  94. package/src/prompts/pages/publicPage.ts +44 -0
  95. package/src/prompts/sharedConstants.ts +12 -0
  96. package/src/prompts/tabs/board/adminboard.ts +32 -0
  97. package/src/prompts/tabs/board/privateboard.ts +36 -0
  98. package/src/prompts/tabs/board/publicboard.ts +36 -0
  99. package/src/prompts/tabs/calendar/admincalendar.ts +32 -0
  100. package/src/prompts/tabs/calendar/privatecalendar.ts +36 -0
  101. package/src/prompts/tabs/calendar/publiccalendar.ts +36 -0
  102. package/src/prompts/tabs/crud/admin.ts +54 -0
  103. package/src/prompts/tabs/crud/private.ts +55 -0
  104. package/src/prompts/tabs/crud/shared.ts +53 -0
  105. package/src/prompts/tabs/table/admintable.ts +32 -0
  106. package/src/prompts/tabs/table/privatetable.ts +36 -0
  107. package/src/prompts/tabs/table/publictable.ts +36 -0
  108. package/src/setupTests.ts +1 -0
  109. package/src/templates/AdminPageTemplate.tsx +678 -0
  110. package/src/templates/PrivatePageTemplate.tsx +594 -0
  111. package/src/templates/PublicPageTemplate.tsx +92 -0
  112. package/src/templates/SharedPageTemplate.tsx +551 -0
  113. package/src/templates/TemplateBoard.test.tsx +106 -0
  114. package/src/templates/TemplateBoard.tsx +642 -0
  115. package/src/templates/TemplateCalendar.test.tsx +106 -0
  116. package/src/templates/TemplateCalendar.tsx +848 -0
  117. package/src/templates/TemplateConfirmation.test.tsx +106 -0
  118. package/src/templates/TemplateConfirmation.tsx +145 -0
  119. package/src/templates/TemplateInlineForm.test.tsx +106 -0
  120. package/src/templates/TemplateInlineForm.tsx +129 -0
  121. package/src/templates/TemplatePopupForm.test.tsx +106 -0
  122. package/src/templates/TemplatePopupForm.tsx +174 -0
  123. package/src/templates/TemplateTable.test.tsx +106 -0
  124. package/src/templates/TemplateTable.tsx +675 -0
@@ -0,0 +1,29 @@
1
+ export const adminPageConfig = {
2
+ tabName: 'Admin Tab',
3
+ iconName: '',
4
+ route: '/admin-tab',
5
+ template: 'none',
6
+ form: '',
7
+ showPrompt: true,
8
+ tabTitle: 'Admin Dashboard',
9
+ showButton: true,
10
+ buttonStyle: 'primary',
11
+ buttonText: '+',
12
+ buttonAction: 'save_info',
13
+ storage: true,
14
+ buttonStorageIcon: 'upload',
15
+ buttonStorageText: '',
16
+ buttonStorageStyle: 'secondary',
17
+ buttonStorageAction: 'upload_file',
18
+ // Calendar defaults (used when template === 'calendar')
19
+ defaultView: 'calendar',
20
+ defaultTimeFormat: '12h',
21
+ showViewsButton: true,
22
+ viewsButtonStyle: 'secondary',
23
+ // Table defaults (used when template === 'table')
24
+ showExportButton: true,
25
+ exportButtonIcon: 'download-square',
26
+ // Board defaults (used when template === 'board')
27
+ keyName: 'key',
28
+ valueName: 'value',
29
+ };
@@ -0,0 +1,6 @@
1
+ export const defaultContactConfig = {
2
+ route: '/contact',
3
+ template: 'popup_form',
4
+ form: 'contact',
5
+ pageName: 'Contact'
6
+ };
@@ -0,0 +1,18 @@
1
+ export const defaultHomeConfig = {
2
+ hero: {
3
+ title: 'Firebase OS.',
4
+ showSubtitle: true,
5
+ subtitle: 'The Open-Source Firebase Starter',
6
+ text: 'A production-ready Firebase backend template with Auth, Firestore prefix rules, and a clean dashboard — ready for vibe-coded apps.',
7
+ buttons: {
8
+ primary: {
9
+ text: 'Start Building Free',
10
+ action: 'register'
11
+ },
12
+ secondary: {
13
+ text: 'Sign In',
14
+ action: 'sign_in'
15
+ }
16
+ }
17
+ }
18
+ };
@@ -0,0 +1,2 @@
1
+ export const memPageConfig = {
2
+ };
@@ -0,0 +1,11 @@
1
+ import type { OrderItem } from './tabOrders.config';
2
+
3
+ /**
4
+ * Default public menu order — used when Firestore has no record.
5
+ * Home is intentionally excluded from the nav menu (it's the logo link).
6
+ */
7
+ export const defaultMenuOrder: OrderItem[] = [
8
+ { id: 'contact', hidden: false },
9
+ { id: 'templates', hidden: false },
10
+ { id: 'setup', hidden: false },
11
+ ];
@@ -0,0 +1,11 @@
1
+ export const defaultPublicConfig = {
2
+ route: '/page_1',
3
+ pageName: 'New Public Page',
4
+ template: 'none',
5
+ pageTitle: 'My Custom Page',
6
+ copyPrompt: true,
7
+ showButton: true,
8
+ buttonText: 'Open Form',
9
+ action: 'form',
10
+ form: 'contact'
11
+ };
@@ -0,0 +1,29 @@
1
+ export const sharedPageConfig = {
2
+ tabName: 'Shared Tab',
3
+ iconName: '',
4
+ route: '/shared-tab',
5
+ template: 'none',
6
+ form: '',
7
+ showPrompt: true,
8
+ tabTitle: 'Shared Dashboard',
9
+ showButton: true,
10
+ buttonStyle: 'primary',
11
+ buttonText: '+',
12
+ buttonAction: 'save_info',
13
+ storage: true,
14
+ buttonStorageIcon: 'upload',
15
+ buttonStorageText: '',
16
+ buttonStorageStyle: 'secondary',
17
+ buttonStorageAction: 'upload_file',
18
+ // Calendar defaults (used when template === 'calendar')
19
+ defaultView: 'calendar',
20
+ defaultTimeFormat: '12h',
21
+ showViewsButton: true,
22
+ viewsButtonStyle: 'secondary',
23
+ // Table defaults (used when template === 'table')
24
+ showExportButton: true,
25
+ exportButtonIcon: 'download-square',
26
+ // Board defaults (used when template === 'board')
27
+ keyName: 'key',
28
+ valueName: 'value',
29
+ };
@@ -0,0 +1,7 @@
1
+ export const defaultSupportConfig = {
2
+ route: '/support',
3
+ template: 'popup_form',
4
+ form: 'support',
5
+ tabName: 'Support',
6
+ iconName: ''
7
+ };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * OrderItem — the shape stored in sys_configs/tab_order and sys_configs/page_order.
3
+ * Both order AND visibility live here so there is a single source of truth.
4
+ */
5
+ export type OrderItem = {
6
+ id: string;
7
+ hidden: boolean;
8
+ };
9
+
10
+ /**
11
+ * Converts legacy plain-string arrays (old Firestore data) to OrderItem[].
12
+ * Always safe to call even if the data is already in the correct shape.
13
+ */
14
+ export const parseOrderItems = (raw: any[]): OrderItem[] =>
15
+ (raw || []).map(item =>
16
+ typeof item === 'string'
17
+ ? { id: item, hidden: false }
18
+ : { id: String(item.id), hidden: Boolean(item.hidden) }
19
+ );
20
+
21
+ /** Default tab order for the internal dashboard — used when Firestore has no record. */
22
+ export const defaultTabOrder: OrderItem[] = [
23
+ { id: 'pages', hidden: false },
24
+ { id: 'forms', hidden: false },
25
+ { id: 'drive', hidden: false },
26
+ { id: 'users', hidden: false },
27
+ { id: 'theme', hidden: false },
28
+ { id: 'submissions', hidden: false },
29
+ { id: 'requests', hidden: false },
30
+ { id: 'settings', hidden: false },
31
+ { id: 'profile', hidden: false },
32
+ { id: 'support', hidden: true },
33
+ ];
@@ -0,0 +1,29 @@
1
+ export const userPageConfig = {
2
+ tabName: 'New Private Page',
3
+ iconName: '',
4
+ route: '/new-private-page',
5
+ template: 'none',
6
+ form: 'support',
7
+ showPrompt: true,
8
+ tabTitle: 'Private Dashboard',
9
+ showButton: true,
10
+ buttonStyle: 'primary',
11
+ buttonText: '+',
12
+ buttonAction: 'save_info',
13
+ storage: true,
14
+ buttonStorageIcon: 'upload',
15
+ buttonStorageText: '',
16
+ buttonStorageStyle: 'secondary',
17
+ buttonStorageAction: 'upload_file',
18
+ // Calendar defaults (used when template === 'calendar')
19
+ defaultView: 'calendar',
20
+ defaultTimeFormat: '12h',
21
+ showViewsButton: true,
22
+ viewsButtonStyle: 'secondary',
23
+ // Table defaults (used when template === 'table')
24
+ showExportButton: true,
25
+ exportButtonIcon: 'download-square',
26
+ // Board defaults (used when template === 'board')
27
+ keyName: 'key',
28
+ valueName: 'value',
29
+ };
@@ -0,0 +1,93 @@
1
+ /**
2
+ * THEME & BRANDING CONFIGURATION
3
+ *
4
+ * This is the central hub for customizing your app's look.
5
+ * Change any value below to rebrand your "Firebase OS" instantly.
6
+ */
7
+
8
+ export const themeConfig = {
9
+ // -------------------------------------------------------------------------
10
+ // 1. GLOBAL SETTINGS
11
+ // -------------------------------------------------------------------------
12
+ appName: 'Firebase OS.',
13
+
14
+ // Choose how the app starts: 'system', 'light', or 'dark'
15
+ defaultTheme: 'system' as 'system' | 'light' | 'dark',
16
+
17
+ // Show or hide the Sun/Moon toggle button in the top menu
18
+ showThemeToggle: true,
19
+
20
+ // Links to your logo and favicon (Can be a URL or a local path like /favicon.svg)
21
+ logoUrl: 'https://firebasestorage.googleapis.com/v0/b/fir-os-47863.firebasestorage.app/o/pub_files%2F1776321238933_favicon_smaller.png?alt=media&token=efecb55c-2456-4cbe-a20a-b86db54a1e55',
22
+ faviconUrl: 'https://firebasestorage.googleapis.com/v0/b/fir-os-47863.firebasestorage.app/o/pub_files%2F1776321238933_favicon_smaller.png?alt=media&token=efecb55c-2456-4cbe-a20a-b86db54a1e55',
23
+
24
+ // -------------------------------------------------------------------------
25
+ // 2. THEME COLORS
26
+ // -------------------------------------------------------------------------
27
+ colors: {
28
+ // --- DARK MODE ---
29
+ dark: {
30
+ background: '#07070f', // Main background color
31
+ backgroundSecondary: '#0a0a18', // Gradient blending background color
32
+ foreground: '#f0eeff', // Primary text color
33
+
34
+ accent: '#a78bfa', // Main branding color (Purple)
35
+
36
+ panelBg: 'rgba(167, 139, 250, 0.05)', // Card/Panel background
37
+ panelBorder: 'rgba(167, 139, 250, 0.15)', // Card/Panel borders
38
+
39
+ buttonGradient: ['#6d28d9', '#a78bfa'], // [Start, End]
40
+ secondaryButton: {
41
+ bg: 'rgba(255, 255, 255, 0.05)',
42
+ border: 'rgba(255, 255, 255, 0.1)',
43
+ text: '#f0eeff'
44
+ },
45
+ buttonHoverGradient: ['#7c3aed', '#c4b5fd'], // [Start, End]
46
+ glowColor: 'rgba(167, 139, 250, 0.40)', // Component shadow glow
47
+ notificationIconColor: '#a78bfa',
48
+ textGradient: ['#f0eeff', '#c4b5fd', '#a78bfa'], // Can add up to 6 colors
49
+ selectionBg: 'rgba(167, 139, 250, 0.40)',
50
+ selectionText: '#ffffff',
51
+ },
52
+
53
+ // --- LIGHT MODE ---
54
+ light: {
55
+ background: '#fcfaff', // Main background color
56
+ backgroundSecondary: '#f7f3ff', // Gradient blending background color
57
+ foreground: '#1e1b4b', // Primary text color
58
+
59
+ accent: '#7c3aed', // Main branding color (Purple)
60
+ panelBg: 'rgba(255, 255, 255, 0.70)', // Card/Panel background
61
+ panelBorder: 'rgba(124, 58, 237, 0.08)', // Card/Panel borders
62
+
63
+ buttonGradient: ['#5b21b6', '#a78bfa'], // [Start, End]
64
+ secondaryButton: {
65
+ bg: 'rgba(0, 0, 0, 0.03)',
66
+ border: 'rgba(0, 0, 0, 0.06)',
67
+ text: '#1e1b4b'
68
+ },
69
+ buttonHoverGradient: ['#6d28d9', '#a78bfa'], // [Start, End]
70
+ glowColor: 'rgba(124, 58, 237, 0.30)',
71
+ notificationIconColor: '#7c3aed',
72
+ textGradient: ['#2e1065', '#6d28d9', '#cdc1ff'], // [Start, Middle, End]
73
+ selectionBg: 'rgba(124, 58, 237, 0.30)',
74
+ selectionText: '#ffffff',
75
+ }
76
+ },
77
+
78
+ // -------------------------------------------------------------------------
79
+ // 3. FONT STYLES & TYPOGRAPHY
80
+ // -------------------------------------------------------------------------
81
+ fontFamily: 'Inter',
82
+
83
+ // -------------------------------------------------------------------------
84
+ // 6. COMPONENT STYLING & BORDER RADII (GLOBAL)
85
+ // -------------------------------------------------------------------------
86
+ cornerRounding: 'default' as 'default' | 'custom',
87
+ cornerRadii: {
88
+ buttonRadius: 0.75, // 12px (xl)
89
+ inputRadius: 0.75, // Form inputs
90
+ cardRadius: 1.5, // 24px (2xl, 3xl)
91
+ modalRadius: 2.5, // Global popups and main internal boxes
92
+ }
93
+ };
package/src/index.css ADDED
@@ -0,0 +1,403 @@
1
+ @import "tailwindcss";
2
+
3
+ @theme {
4
+ --color-background: var(--bg-color);
5
+ --color-foreground: var(--fg-color);
6
+ --color-primary: var(--primary-color);
7
+ --color-primary-glow: var(--primary-glow);
8
+ --color-accent: var(--accent-color);
9
+
10
+ --radius-lg: var(--btn-radius, 0.75rem);
11
+ --radius-xl: var(--input-radius, 0.75rem);
12
+ --radius-2xl: var(--card-radius, 1.5rem);
13
+ --radius-3xl: var(--modal-radius, 2rem);
14
+ }
15
+
16
+ /* Hide number input spinners globally */
17
+ input[type=number]::-webkit-inner-spin-button,
18
+ input[type=number]::-webkit-outer-spin-button {
19
+ -webkit-appearance: none;
20
+ margin: 0;
21
+ }
22
+
23
+ input[type=number] {
24
+ -moz-appearance: textfield;
25
+ }
26
+
27
+ @layer base {
28
+ :root {
29
+ color-scheme: dark;
30
+ /* DEFAULT: Dark Theme (Firebase OS) */
31
+ --bg-color: #07070f;
32
+ --bg-secondary-color: #0a0a18;
33
+ --bg-gradient: linear-gradient(135deg, var(--bg-color) 0%, var(--bg-secondary-color) 100%);
34
+ --bg-decorator-1: color-mix(in srgb, var(--accent-color) 12%, transparent);
35
+ --bg-decorator-2: color-mix(in srgb, var(--accent-color) 7%, transparent);
36
+
37
+ --fg-color: #f0eeff;
38
+ --primary-color: #1a1a2e;
39
+ --primary-glow: color-mix(in srgb, var(--accent-color) 25%, transparent);
40
+ --primary-glow-rgb: 140, 90, 255;
41
+ --accent-color: #a78bfa;
42
+ /* violet-400 */
43
+ --accent-deep: #7c3aed;
44
+ /* violet-600 */
45
+
46
+ --panel-bg: rgba(20, 15, 40, 0.45);
47
+ --panel-border: color-mix(in srgb, var(--accent-color) 15%, transparent);
48
+
49
+ --button-bg: linear-gradient(135deg, #6d28d9 0%, #a78bfa 100%);
50
+ --button-fg: #ffffff;
51
+ --button-hover: linear-gradient(135deg, #7c3aed 0%, #c4b5fd 100%);
52
+
53
+ --text-gradient: linear-gradient(135deg, #f0eeff 0%, #c4b5fd 40%, #a78bfa 100%);
54
+ }
55
+
56
+ [data-theme='light'] {
57
+ color-scheme: light;
58
+ --bg-color: #fcfaff;
59
+ --bg-secondary-color: #f7f3ff;
60
+ --bg-gradient: linear-gradient(135deg, var(--bg-color) 0%, var(--bg-secondary-color) 100%);
61
+ --bg-decorator-1: color-mix(in srgb, var(--accent-color) 6%, transparent);
62
+ --bg-decorator-2: color-mix(in srgb, var(--accent-color) 4%, transparent);
63
+
64
+ --fg-color: #1e1b4b;
65
+ --primary-color: #ffffff;
66
+ --primary-glow: color-mix(in srgb, var(--accent-color) 12%, transparent);
67
+ --primary-glow-rgb: 124, 58, 237;
68
+ --accent-color: #7c3aed;
69
+ /* violet-600 */
70
+ --accent-deep: #6d28d9;
71
+ /* violet-700 */
72
+
73
+ --panel-bg: rgba(255, 255, 255, 0.7);
74
+ --panel-border: color-mix(in srgb, var(--accent-color) 8%, transparent);
75
+
76
+ --button-bg: linear-gradient(135deg, #5b21b6 0%, #a78bfa 100%);
77
+ --button-fg: #ffffff;
78
+ --button-hover: linear-gradient(135deg, #4c1d95 0%, #7c3aed 100%);
79
+
80
+ --text-gradient: linear-gradient(135deg, #2e1065 0%, #6d28d9 65%, #cdc1ff 100%);
81
+ }
82
+ }
83
+
84
+ body {
85
+ font-family: var(--font-family, 'Inter', system-ui, sans-serif);
86
+ font-size: 1rem;
87
+ line-height: var(--leading-normal, 1.5);
88
+ background: var(--bg-gradient);
89
+ color: var(--fg-color);
90
+ min-height: 100vh;
91
+ margin: 0;
92
+ overflow-x: hidden;
93
+ }
94
+
95
+ ::selection {
96
+ background: var(--selection-bg, rgba(167, 139, 250, 0.4));
97
+ color: var(--selection-text, #ffffff);
98
+ }
99
+
100
+ h1,
101
+ .text-5xl,
102
+ .text-6xl,
103
+ .text-7xl {
104
+ font-weight: var(--weight-h1, 800) !important;
105
+ }
106
+
107
+ h2,
108
+ .text-3xl,
109
+ .text-4xl {
110
+ font-weight: var(--weight-h2, 700) !important;
111
+ }
112
+
113
+ h3,
114
+ .text-xl,
115
+ .text-2xl {
116
+ font-weight: var(--weight-h3, 700) !important;
117
+ }
118
+
119
+ /* Animations & Glows */
120
+ @keyframes float {
121
+ 0% {
122
+ transform: translateY(0px);
123
+ }
124
+
125
+ 50% {
126
+ transform: translateY(-8px);
127
+ }
128
+
129
+ 100% {
130
+ transform: translateY(0px);
131
+ }
132
+ }
133
+
134
+ @keyframes shimmer {
135
+ 100% {
136
+ transform: translateX(100%);
137
+ }
138
+ }
139
+
140
+ @layer utilities {
141
+ .glass-panel {
142
+ background: var(--panel-bg);
143
+ backdrop-filter: blur(20px);
144
+ -webkit-backdrop-filter: blur(20px);
145
+ border: 1px solid var(--panel-border);
146
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
147
+ }
148
+
149
+ .glass-panel:hover {
150
+ border-color: var(--accent-color);
151
+ box-shadow: 0 8px 30px var(--glow-color, var(--primary-glow));
152
+ }
153
+
154
+ .glow-focus:focus-within {
155
+ box-shadow: 0 0 25px var(--glow-color, var(--primary-glow));
156
+ border-color: var(--accent-color);
157
+ transform: translateY(-2px);
158
+ }
159
+
160
+ .glow-hover {
161
+ transition: all 0.4s ease;
162
+ }
163
+
164
+ .glow-hover:hover {
165
+ box-shadow: 0 0 30px var(--glow-color, var(--primary-glow));
166
+ border-color: var(--accent-color);
167
+ transform: translateY(-2px);
168
+ }
169
+
170
+ input:focus,
171
+ textarea:focus,
172
+ select:focus {
173
+ box-shadow: 0 0 15px var(--glow-color, var(--primary-glow)) !important;
174
+ border-color: var(--accent-color) !important;
175
+ outline: none;
176
+ }
177
+
178
+ input.no-glow:focus,
179
+ textarea.no-glow:focus {
180
+ box-shadow: none !important;
181
+ border-color: transparent !important;
182
+ background-color: transparent !important;
183
+ }
184
+
185
+ .animate-float {
186
+ animation: float 6s ease-in-out infinite;
187
+ }
188
+
189
+ .bg-decorator-1 {
190
+ background: var(--bg-decorator-1);
191
+ }
192
+
193
+ .bg-decorator-2 {
194
+ background: var(--bg-decorator-2);
195
+ }
196
+
197
+ .btn-primary {
198
+ background: var(--button-bg);
199
+ color: var(--button-fg);
200
+ border-radius: var(--btn-radius, 0.75rem) !important;
201
+ transition: all 0.4s ease;
202
+ }
203
+
204
+ .btn-primary:hover {
205
+ background: var(--button-hover-bg, var(--button-hover));
206
+ box-shadow: 0 0 30px var(--glow-color, var(--primary-glow));
207
+ transform: translateY(-2px);
208
+ }
209
+
210
+ .btn-secondary {
211
+ background: var(--btn-sec-bg);
212
+ border: none;
213
+ box-shadow: inset 0 0 0 1px var(--btn-sec-border);
214
+ color: var(--btn-sec-text);
215
+ border-radius: var(--btn-radius, 0.75rem) !important;
216
+ transition: all 0.4s ease;
217
+ }
218
+
219
+ .btn-secondary:hover {
220
+ box-shadow: inset 0 0 0 1px var(--btn-sec-border), 0 0 20px var(--glow-color, var(--primary-glow));
221
+ transform: translateY(-2px);
222
+ }
223
+
224
+ .text-accent {
225
+ color: var(--accent-color);
226
+ }
227
+
228
+ .text-notification-icon {
229
+ color: var(--notification-icon-color);
230
+ }
231
+
232
+ .border-accent {
233
+ border-color: var(--accent-color);
234
+ }
235
+
236
+ .text-gradient {
237
+ background-clip: text;
238
+ -webkit-background-clip: text;
239
+ color: transparent;
240
+ background-image: var(--text-gradient);
241
+ }
242
+
243
+ .accent-gradient {
244
+ background: linear-gradient(135deg, #6d28d9 0%, #a78bfa 100%);
245
+ }
246
+
247
+ .no-scrollbar::-webkit-scrollbar {
248
+ display: none;
249
+ }
250
+
251
+ .no-scrollbar {
252
+ -ms-overflow-style: none;
253
+ scrollbar-width: none;
254
+ }
255
+
256
+ .styled-scrollbars-mini::-webkit-scrollbar {
257
+ height: 6px;
258
+ width: 6px;
259
+ }
260
+
261
+ .styled-scrollbars-mini::-webkit-scrollbar-track {
262
+ background: transparent;
263
+ }
264
+
265
+ .styled-scrollbars-mini::-webkit-scrollbar-thumb {
266
+ background: color-mix(in srgb, var(--accent-color) 20%, transparent);
267
+ border-radius: 10px;
268
+ }
269
+
270
+ .styled-scrollbars-mini::-webkit-scrollbar-thumb:hover {
271
+ background: color-mix(in srgb, var(--accent-color) 40%, transparent);
272
+ }
273
+
274
+ .styled-scrollbars-mini {
275
+ scrollbar-width: thin;
276
+ scrollbar-color: color-mix(in srgb, var(--accent-color) 20%, transparent) transparent;
277
+ }
278
+ }
279
+
280
+ .react-international-phone {
281
+ background: transparent !important;
282
+ background-color: transparent !important;
283
+ border: none !important;
284
+ box-shadow: none !important;
285
+ }
286
+
287
+ .react-international-phone-input {
288
+ background: transparent !important;
289
+ background-color: transparent !important;
290
+ border: none !important;
291
+ outline: none !important;
292
+ box-shadow: none !important;
293
+ color: var(--fg-color) !important;
294
+ }
295
+
296
+ .react-international-phone-input:focus,
297
+ .react-international-phone-input:active,
298
+ .react-international-phone-input:focus-visible,
299
+ .react-international-phone-input:focus-within {
300
+ background: transparent !important;
301
+ background-color: transparent !important;
302
+ border: none !important;
303
+ outline: none !important;
304
+ box-shadow: none !important;
305
+ color: var(--fg-color) !important;
306
+ -webkit-appearance: none !important;
307
+ }
308
+
309
+ .react-international-phone-country-selector {
310
+ position: relative !important;
311
+ overflow: visible !important;
312
+ }
313
+
314
+ .react-international-phone-country-selector-button {
315
+ background: transparent !important;
316
+ border: none !important;
317
+ box-shadow: none !important;
318
+ color: var(--fg-color) !important;
319
+ outline: none !important;
320
+ }
321
+
322
+ .react-international-phone-country-selector-button:focus,
323
+ .react-international-phone-country-selector-button:active,
324
+ .react-international-phone-country-selector-button:hover {
325
+ background: rgba(0, 0, 0, 0.02) !important;
326
+ border: none !important;
327
+ box-shadow: none !important;
328
+ outline: none !important;
329
+ }
330
+
331
+ .react-international-phone-country-selector-dropdown {
332
+ z-index: 2147483647 !important;
333
+ background: color-mix(in srgb, var(--bg-color) 95%, transparent) !important;
334
+ backdrop-filter: blur(20px) !important;
335
+ -webkit-backdrop-filter: blur(20px) !important;
336
+ border-radius: 1rem !important;
337
+ border: 1px solid var(--panel-border) !important;
338
+ box-shadow: 0 40px 80px -15px rgba(0, 0, 0, 0.5) !important;
339
+ color: var(--fg-color) !important;
340
+ max-height: 400px !important;
341
+ overflow-y: auto !important;
342
+ position: absolute !important;
343
+ top: calc(100% + 4px) !important;
344
+ left: 0 !important;
345
+ }
346
+
347
+ /* Scrollbar styling for dropdown */
348
+ .react-international-phone-country-selector-dropdown::-webkit-scrollbar {
349
+ width: 6px !important;
350
+ height: 6px !important;
351
+ }
352
+
353
+ .react-international-phone-country-selector-dropdown::-webkit-scrollbar-thumb {
354
+ background: color-mix(in srgb, var(--accent-color) 30%, transparent) !important;
355
+ border-radius: 4px !important;
356
+ }
357
+
358
+ .react-international-phone-country-selector-dropdown::-webkit-scrollbar-thumb:hover {
359
+ background: color-mix(in srgb, var(--accent-color) 60%, transparent) !important;
360
+ }
361
+
362
+ .react-international-phone-country-selector-dropdown * {
363
+ color: inherit !important;
364
+ outline: none !important;
365
+ }
366
+
367
+ .react-international-phone-country-selector-dropdown__list {
368
+ max-height: 380px !important;
369
+ overflow-y: auto !important;
370
+ }
371
+
372
+ .react-international-phone-country-selector-dropdown__list::-webkit-scrollbar {
373
+ width: 6px !important;
374
+ }
375
+
376
+ .react-international-phone-country-selector-dropdown__list::-webkit-scrollbar-thumb {
377
+ background: color-mix(in srgb, var(--accent-color) 30%, transparent) !important;
378
+ border-radius: 4px !important;
379
+ }
380
+
381
+ .react-international-phone-country-selector-dropdown__list-item {
382
+ color: var(--fg-color) !important;
383
+ background: transparent !important;
384
+ border: 1px solid transparent !important;
385
+ border-radius: 0.5rem !important;
386
+ margin: 0.25rem !important;
387
+ }
388
+
389
+ .react-international-phone-country-selector-dropdown__list-item:hover,
390
+ .react-international-phone-country-selector-dropdown__list-item--focused {
391
+ background-color: color-mix(in srgb, var(--fg-color) 5%, transparent) !important;
392
+ border-color: color-mix(in srgb, var(--accent-color) 20%, transparent) !important;
393
+ }
394
+
395
+ .react-international-phone-country-selector-dropdown__list-item-dial-code {
396
+ color: color-mix(in srgb, var(--fg-color) 50%, transparent) !important;
397
+ font-weight: 500 !important;
398
+ }
399
+
400
+ .react-international-phone-country-selector-dropdown__list-item-country-name {
401
+ color: var(--fg-color) !important;
402
+ font-weight: 600 !important;
403
+ }