firebase-os 1.0.0
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/README.md +236 -0
- package/dist/FirebaseOS.d.ts +18 -0
- package/dist/_redirects +1 -0
- package/dist/contactForm.config-BHvMbfxM.js +42 -0
- package/dist/contactForm.config-DLeI_ZEj.js +2 -0
- package/dist/contactForm.config-Dfh0WPXL.cjs +1 -0
- package/dist/contactForm.config-Y2AYSH9s.cjs +1 -0
- package/dist/favicon.svg +5 -0
- package/dist/firebase-os.cjs.js +627 -0
- package/dist/firebase-os.css +2 -0
- package/dist/firebase-os.es.js +90410 -0
- package/dist/icons.svg +24 -0
- package/dist/index.d.ts +6 -0
- package/dist/lib/AuthContext.d.ts +25 -0
- package/dist/lib/ConfigContext.d.ts +19 -0
- package/dist/lib/ThemeContext.d.ts +17 -0
- package/dist/supportForm.config-3dz3ymzX.cjs +1 -0
- package/dist/supportForm.config-74T-eSSH.js +2 -0
- package/dist/supportForm.config-D5ZRFZtU.js +35 -0
- package/dist/supportForm.config-NfLDtLTB.cjs +1 -0
- package/dist/theme.config-BJFA9Nq2.cjs +1 -0
- package/dist/theme.config-BbEzcEDR.js +2 -0
- package/dist/theme.config-DJqqr_kx.cjs +1 -0
- package/dist/theme.config-q93xMCw6.js +68 -0
- package/package.json +80 -0
- package/scripts/postinstall.js +98 -0
package/dist/icons.svg
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<symbol id="bluesky-icon" viewBox="0 0 16 17">
|
|
3
|
+
<g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
|
|
4
|
+
<defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
|
|
5
|
+
</symbol>
|
|
6
|
+
<symbol id="discord-icon" viewBox="0 0 20 19">
|
|
7
|
+
<path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
|
|
8
|
+
</symbol>
|
|
9
|
+
<symbol id="documentation-icon" viewBox="0 0 21 20">
|
|
10
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
|
|
11
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
|
|
12
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
|
|
13
|
+
</symbol>
|
|
14
|
+
<symbol id="github-icon" viewBox="0 0 19 19">
|
|
15
|
+
<path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
|
|
16
|
+
</symbol>
|
|
17
|
+
<symbol id="social-icon" viewBox="0 0 20 20">
|
|
18
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
|
|
19
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
|
|
20
|
+
</symbol>
|
|
21
|
+
<symbol id="x-icon" viewBox="0 0 19 19">
|
|
22
|
+
<path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
|
|
23
|
+
</symbol>
|
|
24
|
+
</svg>
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { FirebaseOS } from './FirebaseOS';
|
|
2
|
+
export type { FirebaseOSProps } from './FirebaseOS';
|
|
3
|
+
export { useAuth } from './lib/AuthContext';
|
|
4
|
+
export { useTheme } from './lib/ThemeContext';
|
|
5
|
+
export { useConfig } from './lib/ConfigContext';
|
|
6
|
+
export type { FirebaseOSConfig } from './lib/ConfigContext';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { User } from 'firebase/auth';
|
|
3
|
+
interface AuthContextType {
|
|
4
|
+
user: User | null;
|
|
5
|
+
userRole: string | null;
|
|
6
|
+
loading: boolean;
|
|
7
|
+
signOut: () => Promise<void>;
|
|
8
|
+
registerUser: (email: string, password: string, firstName: string, lastName: string) => Promise<void>;
|
|
9
|
+
userInactive: boolean;
|
|
10
|
+
roleResolved: boolean;
|
|
11
|
+
refreshUser: () => Promise<void>;
|
|
12
|
+
activeOrg?: any;
|
|
13
|
+
activeWorkspace?: any;
|
|
14
|
+
checkOrg?: any;
|
|
15
|
+
workspaceAccess?: any;
|
|
16
|
+
userWorkspaces?: any;
|
|
17
|
+
switchWorkspace?: any;
|
|
18
|
+
createWorkspace?: any;
|
|
19
|
+
createOrg?: any;
|
|
20
|
+
}
|
|
21
|
+
export declare function AuthProvider({ children }: {
|
|
22
|
+
children: React.ReactNode;
|
|
23
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
export declare const useAuth: () => AuthContextType;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface FirebaseOSConfig {
|
|
3
|
+
firebaseConfig?: {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
authDomain: string;
|
|
6
|
+
projectId: string;
|
|
7
|
+
storageBucket: string;
|
|
8
|
+
messagingSenderId: string;
|
|
9
|
+
appId: string;
|
|
10
|
+
};
|
|
11
|
+
adminEmails?: string[];
|
|
12
|
+
basename?: string;
|
|
13
|
+
onAuthChange?: (user: any) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare function ConfigProvider({ config, children }: {
|
|
16
|
+
config: FirebaseOSConfig;
|
|
17
|
+
children: React.ReactNode;
|
|
18
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export declare const useConfig: () => FirebaseOSConfig;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { themeConfig } from '../configs/theme.config';
|
|
3
|
+
type Theme = 'light' | 'dark';
|
|
4
|
+
interface ThemeContextType {
|
|
5
|
+
theme: Theme;
|
|
6
|
+
setTheme: (theme: Theme) => void;
|
|
7
|
+
toggleTheme: () => void;
|
|
8
|
+
isSystem: boolean;
|
|
9
|
+
setIsSystem: (is: boolean) => void;
|
|
10
|
+
config: typeof themeConfig;
|
|
11
|
+
activeConfig: any;
|
|
12
|
+
}
|
|
13
|
+
export declare function ThemeProvider({ children }: {
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export declare const useTheme: () => ThemeContextType;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./supportForm.config-NfLDtLTB.cjs`);require(`./firebase-os.cjs.js`),exports.supportFormConfig=e.t;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
//#region src/configs/forms/supportForm.config.ts
|
|
2
|
+
var e = {
|
|
3
|
+
systemName: "support",
|
|
4
|
+
formType: "private",
|
|
5
|
+
submitPage: "requests",
|
|
6
|
+
redirectTo: "/dashboard",
|
|
7
|
+
title: "Request Assistance",
|
|
8
|
+
buttonName: "Get Assistance",
|
|
9
|
+
submitText: "Submit Request",
|
|
10
|
+
fields: [
|
|
11
|
+
{
|
|
12
|
+
name: "topic",
|
|
13
|
+
type: "text",
|
|
14
|
+
label: "Topic",
|
|
15
|
+
placeholder: "E.g. Password reset issue",
|
|
16
|
+
required: !0
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: "contactEmail",
|
|
20
|
+
type: "email",
|
|
21
|
+
label: "Contact Email",
|
|
22
|
+
placeholder: "your@email.com",
|
|
23
|
+
required: !0
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "description",
|
|
27
|
+
type: "textarea",
|
|
28
|
+
label: "Description",
|
|
29
|
+
placeholder: "Please describe your issue in detail...",
|
|
30
|
+
required: !0
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
};
|
|
34
|
+
//#endregion
|
|
35
|
+
export { e as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={systemName:`support`,formType:`private`,submitPage:`requests`,redirectTo:`/dashboard`,title:`Request Assistance`,buttonName:`Get Assistance`,submitText:`Submit Request`,fields:[{name:`topic`,type:`text`,label:`Topic`,placeholder:`E.g. Password reset issue`,required:!0},{name:`contactEmail`,type:`email`,label:`Contact Email`,placeholder:`your@email.com`,required:!0},{name:`description`,type:`textarea`,label:`Description`,placeholder:`Please describe your issue in detail...`,required:!0}]};Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return e}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./theme.config-DJqqr_kx.cjs`);require(`./firebase-os.cjs.js`),exports.themeConfig=e.t;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={appName:`Firebase OS.`,defaultTheme:`system`,showThemeToggle:!0,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`,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`,colors:{dark:{background:`#07070f`,backgroundSecondary:`#0a0a18`,foreground:`#f0eeff`,accent:`#a78bfa`,panelBg:`rgba(167, 139, 250, 0.05)`,panelBorder:`rgba(167, 139, 250, 0.15)`,buttonGradient:[`#6d28d9`,`#a78bfa`],secondaryButton:{bg:`rgba(255, 255, 255, 0.05)`,border:`rgba(255, 255, 255, 0.1)`,text:`#f0eeff`},buttonHoverGradient:[`#7c3aed`,`#c4b5fd`],glowColor:`rgba(167, 139, 250, 0.40)`,notificationIconColor:`#a78bfa`,textGradient:[`#f0eeff`,`#c4b5fd`,`#a78bfa`],selectionBg:`rgba(167, 139, 250, 0.40)`,selectionText:`#ffffff`},light:{background:`#fcfaff`,backgroundSecondary:`#f7f3ff`,foreground:`#1e1b4b`,accent:`#7c3aed`,panelBg:`rgba(255, 255, 255, 0.70)`,panelBorder:`rgba(124, 58, 237, 0.08)`,buttonGradient:[`#5b21b6`,`#a78bfa`],secondaryButton:{bg:`rgba(0, 0, 0, 0.03)`,border:`rgba(0, 0, 0, 0.06)`,text:`#1e1b4b`},buttonHoverGradient:[`#6d28d9`,`#a78bfa`],glowColor:`rgba(124, 58, 237, 0.30)`,notificationIconColor:`#7c3aed`,textGradient:[`#2e1065`,`#6d28d9`,`#cdc1ff`],selectionBg:`rgba(124, 58, 237, 0.30)`,selectionText:`#ffffff`}},fontFamily:`Inter`,cornerRounding:`default`,cornerRadii:{buttonRadius:.75,inputRadius:.75,cardRadius:1.5,modalRadius:2.5}};Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return e}});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
//#region src/configs/theme.config.ts
|
|
2
|
+
var e = {
|
|
3
|
+
appName: "Firebase OS.",
|
|
4
|
+
defaultTheme: "system",
|
|
5
|
+
showThemeToggle: !0,
|
|
6
|
+
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",
|
|
7
|
+
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",
|
|
8
|
+
colors: {
|
|
9
|
+
dark: {
|
|
10
|
+
background: "#07070f",
|
|
11
|
+
backgroundSecondary: "#0a0a18",
|
|
12
|
+
foreground: "#f0eeff",
|
|
13
|
+
accent: "#a78bfa",
|
|
14
|
+
panelBg: "rgba(167, 139, 250, 0.05)",
|
|
15
|
+
panelBorder: "rgba(167, 139, 250, 0.15)",
|
|
16
|
+
buttonGradient: ["#6d28d9", "#a78bfa"],
|
|
17
|
+
secondaryButton: {
|
|
18
|
+
bg: "rgba(255, 255, 255, 0.05)",
|
|
19
|
+
border: "rgba(255, 255, 255, 0.1)",
|
|
20
|
+
text: "#f0eeff"
|
|
21
|
+
},
|
|
22
|
+
buttonHoverGradient: ["#7c3aed", "#c4b5fd"],
|
|
23
|
+
glowColor: "rgba(167, 139, 250, 0.40)",
|
|
24
|
+
notificationIconColor: "#a78bfa",
|
|
25
|
+
textGradient: [
|
|
26
|
+
"#f0eeff",
|
|
27
|
+
"#c4b5fd",
|
|
28
|
+
"#a78bfa"
|
|
29
|
+
],
|
|
30
|
+
selectionBg: "rgba(167, 139, 250, 0.40)",
|
|
31
|
+
selectionText: "#ffffff"
|
|
32
|
+
},
|
|
33
|
+
light: {
|
|
34
|
+
background: "#fcfaff",
|
|
35
|
+
backgroundSecondary: "#f7f3ff",
|
|
36
|
+
foreground: "#1e1b4b",
|
|
37
|
+
accent: "#7c3aed",
|
|
38
|
+
panelBg: "rgba(255, 255, 255, 0.70)",
|
|
39
|
+
panelBorder: "rgba(124, 58, 237, 0.08)",
|
|
40
|
+
buttonGradient: ["#5b21b6", "#a78bfa"],
|
|
41
|
+
secondaryButton: {
|
|
42
|
+
bg: "rgba(0, 0, 0, 0.03)",
|
|
43
|
+
border: "rgba(0, 0, 0, 0.06)",
|
|
44
|
+
text: "#1e1b4b"
|
|
45
|
+
},
|
|
46
|
+
buttonHoverGradient: ["#6d28d9", "#a78bfa"],
|
|
47
|
+
glowColor: "rgba(124, 58, 237, 0.30)",
|
|
48
|
+
notificationIconColor: "#7c3aed",
|
|
49
|
+
textGradient: [
|
|
50
|
+
"#2e1065",
|
|
51
|
+
"#6d28d9",
|
|
52
|
+
"#cdc1ff"
|
|
53
|
+
],
|
|
54
|
+
selectionBg: "rgba(124, 58, 237, 0.30)",
|
|
55
|
+
selectionText: "#ffffff"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
fontFamily: "Inter",
|
|
59
|
+
cornerRounding: "default",
|
|
60
|
+
cornerRadii: {
|
|
61
|
+
buttonRadius: .75,
|
|
62
|
+
inputRadius: .75,
|
|
63
|
+
cardRadius: 1.5,
|
|
64
|
+
modalRadius: 2.5
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
//#endregion
|
|
68
|
+
export { e as t };
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "firebase-os",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A complete Firebase-powered admin OS — one React component.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/firebase-os.cjs.js",
|
|
7
|
+
"module": "dist/firebase-os.es.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/firebase-os.es.js",
|
|
12
|
+
"require": "./dist/firebase-os.cjs.js",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
},
|
|
15
|
+
"./styles.css": {
|
|
16
|
+
"default": "./dist/firebase-os.css"
|
|
17
|
+
},
|
|
18
|
+
"./dist/firebase-os.css": {
|
|
19
|
+
"default": "./dist/firebase-os.css"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"scripts"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"dev": "vite",
|
|
28
|
+
"test": "vitest run",
|
|
29
|
+
"test:watch": "vitest",
|
|
30
|
+
"build": "tsc -b && vite build",
|
|
31
|
+
"build:lib": "vite build",
|
|
32
|
+
"lint": "eslint .",
|
|
33
|
+
"preview": "vite preview",
|
|
34
|
+
"postinstall": "node scripts/postinstall.js"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@eslint/js": "^9.39.4",
|
|
38
|
+
"@tailwindcss/vite": "^4.2.2",
|
|
39
|
+
"@types/node": "^24.12.0",
|
|
40
|
+
"@types/react": "^19.2.14",
|
|
41
|
+
"@types/react-dom": "^19.2.3",
|
|
42
|
+
"@vitejs/plugin-react": "^6.0.1",
|
|
43
|
+
"clsx": "^2.1.1",
|
|
44
|
+
"firebase": "^12.11.0",
|
|
45
|
+
"framer-motion": "^12.38.0",
|
|
46
|
+
"fuse.js": "^7.3.0",
|
|
47
|
+
"iconoir": "^7.11.0",
|
|
48
|
+
"iconoir-react": "^7.11.0",
|
|
49
|
+
"lucide-react": "^1.7.0",
|
|
50
|
+
"react": "^19.2.4",
|
|
51
|
+
"react-dom": "^19.2.4",
|
|
52
|
+
"react-dropzone": "^15.0.0",
|
|
53
|
+
"react-international-phone": "^4.8.0",
|
|
54
|
+
"react-phone-number-input": "^3.4.16",
|
|
55
|
+
"react-router-dom": "^7.13.2",
|
|
56
|
+
"tailwind-merge": "^3.5.0",
|
|
57
|
+
"tailwindcss": "^4.2.2",
|
|
58
|
+
"typescript": "~5.9.3",
|
|
59
|
+
"vite": "^8.0.1"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
63
|
+
"@testing-library/react": "^16.3.2",
|
|
64
|
+
"@testing-library/user-event": "^14.6.1",
|
|
65
|
+
"eslint": "^9.39.4",
|
|
66
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
67
|
+
"eslint-plugin-react-refresh": "^0.5.2",
|
|
68
|
+
"globals": "^17.4.0",
|
|
69
|
+
"jsdom": "^29.0.1",
|
|
70
|
+
"typescript-eslint": "^8.57.0",
|
|
71
|
+
"vite-plugin-dts": "^5.0.0",
|
|
72
|
+
"vitest": "^4.1.2"
|
|
73
|
+
},
|
|
74
|
+
"peerDependencies": {
|
|
75
|
+
"react": ">=18",
|
|
76
|
+
"react-dom": ">=18",
|
|
77
|
+
"react-router-dom": ">=6",
|
|
78
|
+
"firebase": ">=10"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* firebase-os postinstall script
|
|
4
|
+
*
|
|
5
|
+
* Runs automatically after `npm install firebase-os`.
|
|
6
|
+
* Patches the consumer project so that <FirebaseOS /> renders correctly
|
|
7
|
+
* out of the box — no manual cleanup required.
|
|
8
|
+
*
|
|
9
|
+
* What it does:
|
|
10
|
+
* 1. Clears src/index.css and src/App.css to remove Vite default styling
|
|
11
|
+
* that would clash with the library's design system.
|
|
12
|
+
* 2. Writes a clean src/main.tsx that removes the Vite index.css import.
|
|
13
|
+
* 3. Writes the minimal src/App.tsx that mounts <FirebaseOS />.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import fs from 'fs';
|
|
17
|
+
import path from 'path';
|
|
18
|
+
import { fileURLToPath } from 'url';
|
|
19
|
+
|
|
20
|
+
// Walk up from node_modules/firebase-os/scripts/ to find the consumer project root
|
|
21
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
22
|
+
// __dirname = <consumer>/node_modules/firebase-os/scripts
|
|
23
|
+
const consumerRoot = path.resolve(__dirname, '..', '..', '..');
|
|
24
|
+
|
|
25
|
+
// Only run when we are truly installed inside a consumer (not during our own dev)
|
|
26
|
+
const consumerPkg = path.join(consumerRoot, 'package.json');
|
|
27
|
+
if (!fs.existsSync(consumerPkg)) {
|
|
28
|
+
console.log('[firebase-os] postinstall: no package.json found up the tree, skipping.');
|
|
29
|
+
process.exit(0);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let pkgJson;
|
|
33
|
+
try {
|
|
34
|
+
pkgJson = JSON.parse(fs.readFileSync(consumerPkg, 'utf8'));
|
|
35
|
+
} catch {
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Don't self-apply when running inside our own library project
|
|
40
|
+
if (pkgJson.name === 'firebase-os') {
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
console.log('\n[firebase-os] Setting up project for zero-config usage...\n');
|
|
45
|
+
|
|
46
|
+
const srcDir = path.join(consumerRoot, 'src');
|
|
47
|
+
|
|
48
|
+
// ── 1. Clear Vite's default conflicting CSS files ───────────────────────────
|
|
49
|
+
const cssFiles = ['index.css', 'App.css'];
|
|
50
|
+
for (const file of cssFiles) {
|
|
51
|
+
const filePath = path.join(srcDir, file);
|
|
52
|
+
if (fs.existsSync(filePath)) {
|
|
53
|
+
fs.writeFileSync(filePath, '/* cleared by firebase-os postinstall */\n');
|
|
54
|
+
console.log(` ✓ Cleared ${file} (was conflicting with firebase-os styles)`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// ── 2. Patch main.tsx — remove the import './index.css' line ────────────────
|
|
59
|
+
const mainPath = path.join(srcDir, 'main.tsx');
|
|
60
|
+
if (fs.existsSync(mainPath)) {
|
|
61
|
+
const mainContent = fs.readFileSync(mainPath, 'utf8');
|
|
62
|
+
// Only write if it still has the problematic Vite imports
|
|
63
|
+
if (mainContent.includes("import './index.css'") || mainContent.includes('import "./index.css"')) {
|
|
64
|
+
const clean = `import { StrictMode } from 'react'
|
|
65
|
+
import { createRoot } from 'react-dom/client'
|
|
66
|
+
import App from './App.tsx'
|
|
67
|
+
|
|
68
|
+
createRoot(document.getElementById('root')!).render(
|
|
69
|
+
<StrictMode>
|
|
70
|
+
<App />
|
|
71
|
+
</StrictMode>,
|
|
72
|
+
)
|
|
73
|
+
`;
|
|
74
|
+
fs.writeFileSync(mainPath, clean);
|
|
75
|
+
console.log(' ✓ Patched main.tsx (removed Vite CSS import)');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ── 3. Write App.tsx with FirebaseOS already wired up ───────────────────────
|
|
80
|
+
const appPath = path.join(srcDir, 'App.tsx');
|
|
81
|
+
const appContent = `import { FirebaseOS } from 'firebase-os';
|
|
82
|
+
import 'firebase-os/styles.css';
|
|
83
|
+
|
|
84
|
+
export default function App() {
|
|
85
|
+
return <FirebaseOS />;
|
|
86
|
+
}
|
|
87
|
+
`;
|
|
88
|
+
|
|
89
|
+
// Only write if the file doesn't already import FirebaseOS
|
|
90
|
+
const existingApp = fs.existsSync(appPath) ? fs.readFileSync(appPath, 'utf8') : '';
|
|
91
|
+
if (!existingApp.includes('firebase-os')) {
|
|
92
|
+
fs.writeFileSync(appPath, appContent);
|
|
93
|
+
console.log(' ✓ Wrote App.tsx with <FirebaseOS /> ready to go');
|
|
94
|
+
} else {
|
|
95
|
+
console.log(' ℹ App.tsx already uses firebase-os — skipped');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
console.log('\n[firebase-os] Setup complete! Run `npm run dev` to start.\n');
|