@inkindcards/semantic-layer 0.1.3 → 0.1.4
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/react.cjs +3 -2
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +3 -1
- package/dist/react.d.ts +3 -1
- package/dist/react.js +3 -2
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
package/dist/react.cjs
CHANGED
|
@@ -241,14 +241,15 @@ function OtpSignIn() {
|
|
|
241
241
|
/* @__PURE__ */ jsxRuntime.jsx("button", { style: buttonStyle, onClick: handleSendCode, disabled: sending, children: sending ? "Sending..." : "Send sign-in code" })
|
|
242
242
|
] });
|
|
243
243
|
}
|
|
244
|
-
function AuthGate({ children, loading, signInComponent }) {
|
|
244
|
+
function AuthGate({ children, loading, signInComponent, useEmailOtp }) {
|
|
245
245
|
const { isAuthenticated, isLoading, error, signIn } = chunkOJVM3RPD_cjs.useAuth();
|
|
246
246
|
const inIframe = isInIframe();
|
|
247
|
+
const shouldUseOtp = useEmailOtp || inIframe;
|
|
247
248
|
if (isLoading) {
|
|
248
249
|
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: loading || /* @__PURE__ */ jsxRuntime.jsx("div", { style: loadingStyle, children: "Loading..." }) });
|
|
249
250
|
}
|
|
250
251
|
if (!isAuthenticated) {
|
|
251
|
-
if (
|
|
252
|
+
if (shouldUseOtp) {
|
|
252
253
|
return /* @__PURE__ */ jsxRuntime.jsx(OtpSignIn, {});
|
|
253
254
|
}
|
|
254
255
|
if (signInComponent) {
|
package/dist/react.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/provider.tsx","../src/react/auth-gate.tsx"],"names":["useMemo","SemanticLayerClient","useState","useEffect","jsx","SemanticLayerContext","useAuth","useCallback","jsxs","Fragment"],"mappings":"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","file":"react.cjs","sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { SemanticLayerClient } from \"../client\";\nimport type { SemanticLayerConfig, AuthState } from \"../types\";\nimport { SemanticLayerContext } from \"./context\";\n\nexport interface SemanticLayerProviderProps {\n /** The Supabase URL of the gateway project. */\n gatewayUrl: string;\n /** The Supabase anon/publishable key of the gateway project. */\n anonKey: string;\n /**\n * Optional: restrict sign-in to emails matching this domain (e.g. \"inkind.com\").\n * Used for client-side validation in the OTP sign-in form.\n */\n emailDomain?: string;\n /**\n * Optional: a pre-constructed client instance.\n * If provided, gatewayUrl and anonKey are ignored.\n */\n client?: SemanticLayerClient;\n children: React.ReactNode;\n}\n\nexport function SemanticLayerProvider({\n gatewayUrl,\n anonKey,\n emailDomain,\n client: externalClient,\n children,\n}: SemanticLayerProviderProps) {\n const client = useMemo(() => {\n if (externalClient) return externalClient;\n return new SemanticLayerClient({ gatewayUrl, anonKey });\n }, [gatewayUrl, anonKey, externalClient]);\n\n const [auth, setAuth] = useState<AuthState>({\n isAuthenticated: false,\n isLoading: true,\n user: null,\n error: null,\n });\n\n useEffect(() => {\n let mounted = true;\n\n async function initAuth() {\n try {\n const session = await client.getSession();\n if (!mounted) return;\n\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email || \"\" },\n error: null,\n });\n } else {\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n }\n } catch (err) {\n if (!mounted) return;\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: err instanceof Error ? err.message : \"Auth initialization failed\",\n });\n }\n }\n\n initAuth();\n\n const { data: { subscription } } = client.onAuthStateChange((_event, session) => {\n if (!mounted) return;\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email || \"\" },\n error: null,\n });\n } else {\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n }\n });\n\n return () => {\n mounted = false;\n subscription.unsubscribe();\n };\n }, [client]);\n\n const value = useMemo(() => ({ client, auth, emailDomain }), [client, auth, emailDomain]);\n\n return (\n <SemanticLayerContext.Provider value={value}>\n {children}\n </SemanticLayerContext.Provider>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport { useAuth } from \"./hooks\";\n\nexport interface AuthGateProps {\n children: React.ReactNode;\n /** Custom loading component. */\n loading?: React.ReactNode;\n /** Custom sign-in component. Receives a signIn callback. */\n signInComponent?: (props: { signIn: () => void }) => React.ReactNode;\n}\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n gap: \"16px\",\n};\n\nconst loadingStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#6b7280\",\n};\n\nconst buttonStyle: React.CSSProperties = {\n padding: \"12px 24px\",\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#ffffff\",\n backgroundColor: \"#4285f4\",\n border: \"none\",\n borderRadius: \"8px\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n};\n\nconst inputStyle: React.CSSProperties = {\n padding: \"10px 14px\",\n fontSize: \"16px\",\n border: \"1px solid #d1d5db\",\n borderRadius: \"8px\",\n width: \"280px\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n};\n\nconst errorStyle: React.CSSProperties = {\n margin: 0,\n color: \"#ef4444\",\n fontSize: \"14px\",\n};\n\nconst linkStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n color: \"#4285f4\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n padding: 0,\n textDecoration: \"underline\",\n};\n\nfunction isInIframe(): boolean {\n try {\n return typeof window !== \"undefined\" && window.self !== window.top;\n } catch {\n return true;\n }\n}\n\n/**\n * Email OTP sign-in form for use inside iframes (Lovable editor preview).\n * Two-step: enter email → enter code from inbox.\n */\nfunction OtpSignIn() {\n const { sendOtp, verifyOtp, emailDomain } = useAuth();\n const [email, setEmail] = useState(\"\");\n const [code, setCode] = useState(\"\");\n const [step, setStep] = useState<\"email\" | \"code\">(\"email\");\n const [sending, setSending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSendCode = useCallback(async () => {\n setError(null);\n const trimmed = email.trim().toLowerCase();\n if (!trimmed) {\n setError(\"Please enter your email.\");\n return;\n }\n if (emailDomain && !trimmed.endsWith(`@${emailDomain}`)) {\n setError(`Please use your @${emailDomain} email.`);\n return;\n }\n setSending(true);\n try {\n const { error: otpError } = await sendOtp(trimmed);\n if (otpError) {\n setError(otpError.message);\n } else {\n setStep(\"code\");\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to send code\");\n } finally {\n setSending(false);\n }\n }, [email, emailDomain, sendOtp]);\n\n const handleVerifyCode = useCallback(async () => {\n setError(null);\n const trimmedCode = code.trim();\n if (!trimmedCode) {\n setError(\"Please enter the code from your email.\");\n return;\n }\n setSending(true);\n try {\n const { error: verifyError } = await verifyOtp(email.trim().toLowerCase(), trimmedCode);\n if (verifyError) {\n setError(verifyError.message);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Verification failed\");\n } finally {\n setSending(false);\n }\n }, [email, code, verifyOtp]);\n\n if (step === \"code\") {\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Check your email</h2>\n <p style={{ margin: 0, color: \"#6b7280\", textAlign: \"center\", maxWidth: \"320px\" }}>\n We sent a sign-in code to <strong>{email.trim()}</strong>\n </p>\n <input\n style={inputStyle}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n placeholder=\"Enter 6-digit code\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleVerifyCode()}\n />\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={handleVerifyCode} disabled={sending}>\n {sending ? \"Verifying...\" : \"Verify code\"}\n </button>\n <button style={linkStyle} onClick={() => { setStep(\"email\"); setCode(\"\"); setError(null); }}>\n Use a different email\n </button>\n </div>\n );\n }\n\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Sign in to continue</h2>\n <p style={{ margin: 0, color: \"#6b7280\" }}>\n Enter your {emailDomain ? `@${emailDomain} ` : \"\"}email to receive a sign-in code.\n </p>\n <input\n style={inputStyle}\n type=\"email\"\n placeholder={emailDomain ? `you@${emailDomain}` : \"you@company.com\"}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleSendCode()}\n />\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={handleSendCode} disabled={sending}>\n {sending ? \"Sending...\" : \"Send sign-in code\"}\n </button>\n </div>\n );\n}\n\n/**\n * Wraps children and only renders them when the user is authenticated.\n * In iframes (e.g. Lovable editor preview), shows an email OTP form.\n * In standalone tabs, shows the Google OAuth sign-in button.\n */\nexport function AuthGate({ children, loading, signInComponent }: AuthGateProps) {\n const { isAuthenticated, isLoading, error, signIn } = useAuth();\n const inIframe = isInIframe();\n\n if (isLoading) {\n return <>{loading || <div style={loadingStyle}>Loading...</div>}</>;\n }\n\n if (!isAuthenticated) {\n if (inIframe) {\n return <OtpSignIn />;\n }\n\n if (signInComponent) {\n return <>{signInComponent({ signIn: () => signIn(window.location.origin) })}</>;\n }\n\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Sign in to continue</h2>\n <p style={{ margin: 0, color: \"#6b7280\" }}>\n Use your Google account to access data.\n </p>\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={() => signIn(window.location.origin)}>\n Sign in with Google\n </button>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/provider.tsx","../src/react/auth-gate.tsx"],"names":["useMemo","SemanticLayerClient","useState","useEffect","jsx","SemanticLayerContext","useAuth","useCallback","jsxs","Fragment"],"mappings":";;;;;;;AAuBO,SAAS,qBAAA,CAAsB;AAAA,EACpC,UAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA,EAAQ,cAAA;AAAA,EACR;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM,MAAA,GAASA,cAAQ,MAAM;AAC3B,IAAA,IAAI,gBAAgB,OAAO,cAAA;AAC3B,IAAA,OAAO,IAAIC,qCAAA,CAAoB,EAAE,UAAA,EAAY,SAAS,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,UAAA,EAAY,OAAA,EAAS,cAAc,CAAC,CAAA;AAExC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,cAAA,CAAoB;AAAA,IAC1C,eAAA,EAAiB,KAAA;AAAA,IACjB,SAAA,EAAW,IAAA;AAAA,IACX,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,eAAe,QAAA,GAAW;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,UAAA,EAAW;AACxC,QAAA,IAAI,CAAC,OAAA,EAAS;AAEd,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,OAAA,CAAQ;AAAA,YACN,eAAA,EAAiB,IAAA;AAAA,YACjB,SAAA,EAAW,KAAA;AAAA,YACX,IAAA,EAAM,EAAE,EAAA,EAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,IAAS,EAAA,EAAG;AAAA,YAC7D,KAAA,EAAO;AAAA,WACR,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ;AAAA,YACN,eAAA,EAAiB,KAAA;AAAA,YACjB,SAAA,EAAW,KAAA;AAAA,YACX,IAAA,EAAM,IAAA;AAAA,YACN,KAAA,EAAO;AAAA,WACR,CAAA;AAAA,QACH;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,OAAA,CAAQ;AAAA,UACN,eAAA,EAAiB,KAAA;AAAA,UACjB,SAAA,EAAW,KAAA;AAAA,UACX,IAAA,EAAM,IAAA;AAAA,UACN,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,SAC7C,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,QAAA,EAAS;AAET,IAAA,MAAM,EAAE,IAAA,EAAM,EAAE,YAAA,EAAa,KAAM,MAAA,CAAO,iBAAA,CAAkB,CAAC,MAAA,EAAQ,OAAA,KAAY;AAC/E,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAA,CAAQ;AAAA,UACN,eAAA,EAAiB,IAAA;AAAA,UACjB,SAAA,EAAW,KAAA;AAAA,UACX,IAAA,EAAM,EAAE,EAAA,EAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,IAAS,EAAA,EAAG;AAAA,UAC7D,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ;AAAA,UACN,eAAA,EAAiB,KAAA;AAAA,UACjB,SAAA,EAAW,KAAA;AAAA,UACX,IAAA,EAAM,IAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,YAAA,CAAa,WAAA,EAAY;AAAA,IAC3B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,KAAA,GAAQH,aAAA,CAAQ,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAY,CAAA,EAAI,CAAC,MAAA,EAAQ,IAAA,EAAM,WAAW,CAAC,CAAA;AAExF,EAAA,uBACEI,cAAA,CAACC,sCAAA,CAAqB,QAAA,EAArB,EAA8B,OAC5B,QAAA,EACH,CAAA;AAEJ;ACjGA,IAAM,cAAA,GAAsC;AAAA,EAC1C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,SAAA,EAAW,OAAA;AAAA,EACX,UAAA,EAAY,sCAAA;AAAA,EACZ,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,SAAA,EAAW,OAAA;AAAA,EACX,UAAA,EAAY,sCAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,WAAA;AAAA,EACT,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,SAAA;AAAA,EACP,eAAA,EAAiB,SAAA;AAAA,EACjB,MAAA,EAAQ,MAAA;AAAA,EACR,YAAA,EAAc,KAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,WAAA;AAAA,EACT,QAAA,EAAU,MAAA;AAAA,EACV,MAAA,EAAQ,mBAAA;AAAA,EACR,YAAA,EAAc,KAAA;AAAA,EACd,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,MAAA,EAAQ,CAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,SAAA,GAAiC;AAAA,EACrC,UAAA,EAAY,MAAA;AAAA,EACZ,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU,MAAA;AAAA,EACV,OAAA,EAAS,CAAA;AAAA,EACT,cAAA,EAAgB;AAClB,CAAA;AAEA,SAAS,UAAA,GAAsB;AAC7B,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,SAAS,MAAA,CAAO,GAAA;AAAA,EACjE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,SAAS,SAAA,GAAY;AACnB,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,WAAA,KAAgBC,yBAAA,EAAQ;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIJ,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAA2B,OAAO,CAAA;AAC1D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,cAAA,GAAiBK,kBAAY,YAAY;AAC7C,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACzC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,QAAA,CAAS,0BAA0B,CAAA;AACnC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,eAAe,CAAC,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,WAAW,EAAE,CAAA,EAAG;AACvD,MAAA,QAAA,CAAS,CAAA,iBAAA,EAAoB,WAAW,CAAA,OAAA,CAAS,CAAA;AACjD,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,MAAM,QAAQ,OAAO,CAAA;AACjD,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAChB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,qBAAqB,CAAA;AAAA,IACrE,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,WAAA,EAAa,OAAO,CAAC,CAAA;AAEhC,EAAA,MAAM,gBAAA,GAAmBA,kBAAY,YAAY;AAC/C,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,MAAM,WAAA,GAAc,KAAK,IAAA,EAAK;AAC9B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,wCAAwC,CAAA;AACjD,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,MAAM,SAAA,CAAU,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY,EAAG,WAAW,CAAA;AACtF,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,QAAA,CAAS,YAAY,OAAO,CAAA;AAAA,MAC9B;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,qBAAqB,CAAA;AAAA,IACrE,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,IAAA,EAAM,SAAS,CAAC,CAAA;AAE3B,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,sBAAAJ,cAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,sBAC9EI,eAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,SAAA,EAAW,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,OAAA,EAAQ,EAAG,QAAA,EAAA;AAAA,QAAA,4BAAA;AAAA,wBACvDJ,cAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,MAAK,EAAE;AAAA,OAAA,EAClD,CAAA;AAAA,sBACAA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,UAAA;AAAA,UACP,IAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAU,SAAA;AAAA,UACV,YAAA,EAAa,eAAA;AAAA,UACb,WAAA,EAAY,oBAAA;AAAA,UACZ,KAAA,EAAO,IAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACvC,WAAW,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,WAAW,gBAAA;AAAiB;AAAA,OAC1D;AAAA,MACC,yBAASA,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,YAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACvCA,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,gBAAA,EAAkB,QAAA,EAAU,OAAA,EAC9D,QAAA,EAAA,OAAA,GAAU,cAAA,GAAiB,aAAA,EAC9B,CAAA;AAAA,sBACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,SAAA,EAAW,SAAS,MAAM;AAAE,QAAA,OAAA,CAAQ,OAAO,CAAA;AAAG,QAAA,OAAA,CAAQ,EAAE,CAAA;AAAG,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MAAG,GAAG,QAAA,EAAA,uBAAA,EAE7F;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEI,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,oBAAAJ,cAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,oBACjFI,eAAA,CAAC,OAAE,KAAA,EAAO,EAAE,QAAQ,CAAA,EAAG,KAAA,EAAO,WAAU,EAAG,QAAA,EAAA;AAAA,MAAA,aAAA;AAAA,MAC7B,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,CAAA,GAAM,EAAA;AAAA,MAAG;AAAA,KAAA,EACpD,CAAA;AAAA,oBACAJ,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,UAAA;AAAA,QACP,IAAA,EAAK,OAAA;AAAA,QACL,WAAA,EAAa,WAAA,GAAc,CAAA,IAAA,EAAO,WAAW,CAAA,CAAA,GAAK,iBAAA;AAAA,QAClD,KAAA,EAAO,KAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,WAAW,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,WAAW,cAAA;AAAe;AAAA,KACxD;AAAA,IACC,yBAASA,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,YAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACvCA,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,cAAA,EAAgB,QAAA,EAAU,OAAA,EAC5D,QAAA,EAAA,OAAA,GAAU,YAAA,GAAe,mBAAA,EAC5B;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,SAAS,SAAS,EAAE,QAAA,EAAU,OAAA,EAAS,eAAA,EAAiB,aAAY,EAAkB;AAC3F,EAAA,MAAM,EAAE,eAAA,EAAiB,SAAA,EAAW,KAAA,EAAO,MAAA,KAAWE,yBAAA,EAAQ;AAC9D,EAAA,MAAM,WAAW,UAAA,EAAW;AAC5B,EAAA,MAAM,eAAe,WAAA,IAAe,QAAA;AAEpC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOF,cAAAA,CAAAK,mBAAA,EAAA,EAAG,QAAA,EAAA,OAAA,oBAAWL,eAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,QAAA,EAAA,YAAA,EAAU,CAAA,EAAO,CAAA;AAAA,EAClE;AAEA,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,uBAAOA,eAAC,SAAA,EAAA,EAAU,CAAA;AAAA,IACpB;AAEA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,uBAAOA,cAAAA,CAAAK,mBAAA,EAAA,EAAG,QAAA,EAAA,eAAA,CAAgB,EAAE,MAAA,EAAQ,MAAM,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,CAAA,EAAE,CAAA;AAAA,IAC9E;AAEA,IAAA,uBACED,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,sBAAAJ,cAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,sBACjFA,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAQ,CAAA,EAAG,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,yCAAA,EAE3C,CAAA;AAAA,MACC,yBAASA,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,YAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACvCA,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,MAAM,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,QAAA,EAAA,qBAAA,EAE3E;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBAAOA,cAAAA,CAAAK,mBAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB","file":"react.cjs","sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { SemanticLayerClient } from \"../client\";\nimport type { SemanticLayerConfig, AuthState } from \"../types\";\nimport { SemanticLayerContext } from \"./context\";\n\nexport interface SemanticLayerProviderProps {\n /** The Supabase URL of the gateway project. */\n gatewayUrl: string;\n /** The Supabase anon/publishable key of the gateway project. */\n anonKey: string;\n /**\n * Optional: restrict sign-in to emails matching this domain (e.g. \"inkind.com\").\n * Used for client-side validation in the OTP sign-in form.\n */\n emailDomain?: string;\n /**\n * Optional: a pre-constructed client instance.\n * If provided, gatewayUrl and anonKey are ignored.\n */\n client?: SemanticLayerClient;\n children: React.ReactNode;\n}\n\nexport function SemanticLayerProvider({\n gatewayUrl,\n anonKey,\n emailDomain,\n client: externalClient,\n children,\n}: SemanticLayerProviderProps) {\n const client = useMemo(() => {\n if (externalClient) return externalClient;\n return new SemanticLayerClient({ gatewayUrl, anonKey });\n }, [gatewayUrl, anonKey, externalClient]);\n\n const [auth, setAuth] = useState<AuthState>({\n isAuthenticated: false,\n isLoading: true,\n user: null,\n error: null,\n });\n\n useEffect(() => {\n let mounted = true;\n\n async function initAuth() {\n try {\n const session = await client.getSession();\n if (!mounted) return;\n\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email || \"\" },\n error: null,\n });\n } else {\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n }\n } catch (err) {\n if (!mounted) return;\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: err instanceof Error ? err.message : \"Auth initialization failed\",\n });\n }\n }\n\n initAuth();\n\n const { data: { subscription } } = client.onAuthStateChange((_event, session) => {\n if (!mounted) return;\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email || \"\" },\n error: null,\n });\n } else {\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n }\n });\n\n return () => {\n mounted = false;\n subscription.unsubscribe();\n };\n }, [client]);\n\n const value = useMemo(() => ({ client, auth, emailDomain }), [client, auth, emailDomain]);\n\n return (\n <SemanticLayerContext.Provider value={value}>\n {children}\n </SemanticLayerContext.Provider>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport { useAuth } from \"./hooks\";\n\nexport interface AuthGateProps {\n children: React.ReactNode;\n /** Custom loading component. */\n loading?: React.ReactNode;\n /** Custom sign-in component. Receives a signIn callback. */\n signInComponent?: (props: { signIn: () => void }) => React.ReactNode;\n /** Force email OTP sign-in instead of Google OAuth (recommended for Lovable editor). */\n useEmailOtp?: boolean;\n}\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n gap: \"16px\",\n};\n\nconst loadingStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#6b7280\",\n};\n\nconst buttonStyle: React.CSSProperties = {\n padding: \"12px 24px\",\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#ffffff\",\n backgroundColor: \"#4285f4\",\n border: \"none\",\n borderRadius: \"8px\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n};\n\nconst inputStyle: React.CSSProperties = {\n padding: \"10px 14px\",\n fontSize: \"16px\",\n border: \"1px solid #d1d5db\",\n borderRadius: \"8px\",\n width: \"280px\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n};\n\nconst errorStyle: React.CSSProperties = {\n margin: 0,\n color: \"#ef4444\",\n fontSize: \"14px\",\n};\n\nconst linkStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n color: \"#4285f4\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n padding: 0,\n textDecoration: \"underline\",\n};\n\nfunction isInIframe(): boolean {\n try {\n return typeof window !== \"undefined\" && window.self !== window.top;\n } catch {\n return true;\n }\n}\n\n/**\n * Email OTP sign-in form for use inside iframes (Lovable editor preview).\n * Two-step: enter email → enter code from inbox.\n */\nfunction OtpSignIn() {\n const { sendOtp, verifyOtp, emailDomain } = useAuth();\n const [email, setEmail] = useState(\"\");\n const [code, setCode] = useState(\"\");\n const [step, setStep] = useState<\"email\" | \"code\">(\"email\");\n const [sending, setSending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSendCode = useCallback(async () => {\n setError(null);\n const trimmed = email.trim().toLowerCase();\n if (!trimmed) {\n setError(\"Please enter your email.\");\n return;\n }\n if (emailDomain && !trimmed.endsWith(`@${emailDomain}`)) {\n setError(`Please use your @${emailDomain} email.`);\n return;\n }\n setSending(true);\n try {\n const { error: otpError } = await sendOtp(trimmed);\n if (otpError) {\n setError(otpError.message);\n } else {\n setStep(\"code\");\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to send code\");\n } finally {\n setSending(false);\n }\n }, [email, emailDomain, sendOtp]);\n\n const handleVerifyCode = useCallback(async () => {\n setError(null);\n const trimmedCode = code.trim();\n if (!trimmedCode) {\n setError(\"Please enter the code from your email.\");\n return;\n }\n setSending(true);\n try {\n const { error: verifyError } = await verifyOtp(email.trim().toLowerCase(), trimmedCode);\n if (verifyError) {\n setError(verifyError.message);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Verification failed\");\n } finally {\n setSending(false);\n }\n }, [email, code, verifyOtp]);\n\n if (step === \"code\") {\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Check your email</h2>\n <p style={{ margin: 0, color: \"#6b7280\", textAlign: \"center\", maxWidth: \"320px\" }}>\n We sent a sign-in code to <strong>{email.trim()}</strong>\n </p>\n <input\n style={inputStyle}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n placeholder=\"Enter 6-digit code\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleVerifyCode()}\n />\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={handleVerifyCode} disabled={sending}>\n {sending ? \"Verifying...\" : \"Verify code\"}\n </button>\n <button style={linkStyle} onClick={() => { setStep(\"email\"); setCode(\"\"); setError(null); }}>\n Use a different email\n </button>\n </div>\n );\n }\n\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Sign in to continue</h2>\n <p style={{ margin: 0, color: \"#6b7280\" }}>\n Enter your {emailDomain ? `@${emailDomain} ` : \"\"}email to receive a sign-in code.\n </p>\n <input\n style={inputStyle}\n type=\"email\"\n placeholder={emailDomain ? `you@${emailDomain}` : \"you@company.com\"}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleSendCode()}\n />\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={handleSendCode} disabled={sending}>\n {sending ? \"Sending...\" : \"Send sign-in code\"}\n </button>\n </div>\n );\n}\n\n/**\n * Wraps children and only renders them when the user is authenticated.\n * In iframes (e.g. Lovable editor preview), shows an email OTP form.\n * In standalone tabs, shows the Google OAuth sign-in button.\n */\nexport function AuthGate({ children, loading, signInComponent, useEmailOtp }: AuthGateProps) {\n const { isAuthenticated, isLoading, error, signIn } = useAuth();\n const inIframe = isInIframe();\n const shouldUseOtp = useEmailOtp || inIframe;\n\n if (isLoading) {\n return <>{loading || <div style={loadingStyle}>Loading...</div>}</>;\n }\n\n if (!isAuthenticated) {\n if (shouldUseOtp) {\n return <OtpSignIn />;\n }\n\n if (signInComponent) {\n return <>{signInComponent({ signIn: () => signIn(window.location.origin) })}</>;\n }\n\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Sign in to continue</h2>\n <p style={{ margin: 0, color: \"#6b7280\" }}>\n Use your Google account to access data.\n </p>\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={() => signIn(window.location.origin)}>\n Sign in with Google\n </button>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n"]}
|
package/dist/react.d.cts
CHANGED
|
@@ -33,13 +33,15 @@ interface AuthGateProps {
|
|
|
33
33
|
signInComponent?: (props: {
|
|
34
34
|
signIn: () => void;
|
|
35
35
|
}) => React__default.ReactNode;
|
|
36
|
+
/** Force email OTP sign-in instead of Google OAuth (recommended for Lovable editor). */
|
|
37
|
+
useEmailOtp?: boolean;
|
|
36
38
|
}
|
|
37
39
|
/**
|
|
38
40
|
* Wraps children and only renders them when the user is authenticated.
|
|
39
41
|
* In iframes (e.g. Lovable editor preview), shows an email OTP form.
|
|
40
42
|
* In standalone tabs, shows the Google OAuth sign-in button.
|
|
41
43
|
*/
|
|
42
|
-
declare function AuthGate({ children, loading, signInComponent }: AuthGateProps): react_jsx_runtime.JSX.Element;
|
|
44
|
+
declare function AuthGate({ children, loading, signInComponent, useEmailOtp }: AuthGateProps): react_jsx_runtime.JSX.Element;
|
|
43
45
|
|
|
44
46
|
/** Returns the current auth state and sign-in/sign-out methods. */
|
|
45
47
|
declare function useAuth(): {
|
package/dist/react.d.ts
CHANGED
|
@@ -33,13 +33,15 @@ interface AuthGateProps {
|
|
|
33
33
|
signInComponent?: (props: {
|
|
34
34
|
signIn: () => void;
|
|
35
35
|
}) => React__default.ReactNode;
|
|
36
|
+
/** Force email OTP sign-in instead of Google OAuth (recommended for Lovable editor). */
|
|
37
|
+
useEmailOtp?: boolean;
|
|
36
38
|
}
|
|
37
39
|
/**
|
|
38
40
|
* Wraps children and only renders them when the user is authenticated.
|
|
39
41
|
* In iframes (e.g. Lovable editor preview), shows an email OTP form.
|
|
40
42
|
* In standalone tabs, shows the Google OAuth sign-in button.
|
|
41
43
|
*/
|
|
42
|
-
declare function AuthGate({ children, loading, signInComponent }: AuthGateProps): react_jsx_runtime.JSX.Element;
|
|
44
|
+
declare function AuthGate({ children, loading, signInComponent, useEmailOtp }: AuthGateProps): react_jsx_runtime.JSX.Element;
|
|
43
45
|
|
|
44
46
|
/** Returns the current auth state and sign-in/sign-out methods. */
|
|
45
47
|
declare function useAuth(): {
|
package/dist/react.js
CHANGED
|
@@ -240,14 +240,15 @@ function OtpSignIn() {
|
|
|
240
240
|
/* @__PURE__ */ jsx("button", { style: buttonStyle, onClick: handleSendCode, disabled: sending, children: sending ? "Sending..." : "Send sign-in code" })
|
|
241
241
|
] });
|
|
242
242
|
}
|
|
243
|
-
function AuthGate({ children, loading, signInComponent }) {
|
|
243
|
+
function AuthGate({ children, loading, signInComponent, useEmailOtp }) {
|
|
244
244
|
const { isAuthenticated, isLoading, error, signIn } = useAuth();
|
|
245
245
|
const inIframe = isInIframe();
|
|
246
|
+
const shouldUseOtp = useEmailOtp || inIframe;
|
|
246
247
|
if (isLoading) {
|
|
247
248
|
return /* @__PURE__ */ jsx(Fragment, { children: loading || /* @__PURE__ */ jsx("div", { style: loadingStyle, children: "Loading..." }) });
|
|
248
249
|
}
|
|
249
250
|
if (!isAuthenticated) {
|
|
250
|
-
if (
|
|
251
|
+
if (shouldUseOtp) {
|
|
251
252
|
return /* @__PURE__ */ jsx(OtpSignIn, {});
|
|
252
253
|
}
|
|
253
254
|
if (signInComponent) {
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/provider.tsx","../src/react/auth-gate.tsx"],"names":["useState","jsx"],"mappings":";;;;;;AAuBO,SAAS,qBAAA,CAAsB;AAAA,EACpC,UAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA,EAAQ,cAAA;AAAA,EACR;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAM;AAC3B,IAAA,IAAI,gBAAgB,OAAO,cAAA;AAC3B,IAAA,OAAO,IAAI,mBAAA,CAAoB,EAAE,UAAA,EAAY,SAAS,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,UAAA,EAAY,OAAA,EAAS,cAAc,CAAC,CAAA;AAExC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA,CAAoB;AAAA,IAC1C,eAAA,EAAiB,KAAA;AAAA,IACjB,SAAA,EAAW,IAAA;AAAA,IACX,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,eAAe,QAAA,GAAW;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,UAAA,EAAW;AACxC,QAAA,IAAI,CAAC,OAAA,EAAS;AAEd,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,OAAA,CAAQ;AAAA,YACN,eAAA,EAAiB,IAAA;AAAA,YACjB,SAAA,EAAW,KAAA;AAAA,YACX,IAAA,EAAM,EAAE,EAAA,EAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,IAAS,EAAA,EAAG;AAAA,YAC7D,KAAA,EAAO;AAAA,WACR,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ;AAAA,YACN,eAAA,EAAiB,KAAA;AAAA,YACjB,SAAA,EAAW,KAAA;AAAA,YACX,IAAA,EAAM,IAAA;AAAA,YACN,KAAA,EAAO;AAAA,WACR,CAAA;AAAA,QACH;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,OAAA,CAAQ;AAAA,UACN,eAAA,EAAiB,KAAA;AAAA,UACjB,SAAA,EAAW,KAAA;AAAA,UACX,IAAA,EAAM,IAAA;AAAA,UACN,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,SAC7C,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,QAAA,EAAS;AAET,IAAA,MAAM,EAAE,IAAA,EAAM,EAAE,YAAA,EAAa,KAAM,MAAA,CAAO,iBAAA,CAAkB,CAAC,MAAA,EAAQ,OAAA,KAAY;AAC/E,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAA,CAAQ;AAAA,UACN,eAAA,EAAiB,IAAA;AAAA,UACjB,SAAA,EAAW,KAAA;AAAA,UACX,IAAA,EAAM,EAAE,EAAA,EAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,IAAS,EAAA,EAAG;AAAA,UAC7D,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ;AAAA,UACN,eAAA,EAAiB,KAAA;AAAA,UACjB,SAAA,EAAW,KAAA;AAAA,UACX,IAAA,EAAM,IAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,YAAA,CAAa,WAAA,EAAY;AAAA,IAC3B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAY,CAAA,EAAI,CAAC,MAAA,EAAQ,IAAA,EAAM,WAAW,CAAC,CAAA;AAExF,EAAA,uBACE,GAAA,CAAC,oBAAA,CAAqB,QAAA,EAArB,EAA8B,OAC5B,QAAA,EACH,CAAA;AAEJ;ACnGA,IAAM,cAAA,GAAsC;AAAA,EAC1C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,SAAA,EAAW,OAAA;AAAA,EACX,UAAA,EAAY,sCAAA;AAAA,EACZ,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,SAAA,EAAW,OAAA;AAAA,EACX,UAAA,EAAY,sCAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,WAAA;AAAA,EACT,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,SAAA;AAAA,EACP,eAAA,EAAiB,SAAA;AAAA,EACjB,MAAA,EAAQ,MAAA;AAAA,EACR,YAAA,EAAc,KAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,WAAA;AAAA,EACT,QAAA,EAAU,MAAA;AAAA,EACV,MAAA,EAAQ,mBAAA;AAAA,EACR,YAAA,EAAc,KAAA;AAAA,EACd,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,MAAA,EAAQ,CAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,SAAA,GAAiC;AAAA,EACrC,UAAA,EAAY,MAAA;AAAA,EACZ,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU,MAAA;AAAA,EACV,OAAA,EAAS,CAAA;AAAA,EACT,cAAA,EAAgB;AAClB,CAAA;AAEA,SAAS,UAAA,GAAsB;AAC7B,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,SAAS,MAAA,CAAO,GAAA;AAAA,EACjE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,SAAS,SAAA,GAAY;AACnB,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,WAAA,KAAgB,OAAA,EAAQ;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAA2B,OAAO,CAAA;AAC1D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,cAAA,GAAiB,YAAY,YAAY;AAC7C,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACzC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,QAAA,CAAS,0BAA0B,CAAA;AACnC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,eAAe,CAAC,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,WAAW,EAAE,CAAA,EAAG;AACvD,MAAA,QAAA,CAAS,CAAA,iBAAA,EAAoB,WAAW,CAAA,OAAA,CAAS,CAAA;AACjD,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,MAAM,QAAQ,OAAO,CAAA;AACjD,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAChB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,qBAAqB,CAAA;AAAA,IACrE,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,WAAA,EAAa,OAAO,CAAC,CAAA;AAEhC,EAAA,MAAM,gBAAA,GAAmB,YAAY,YAAY;AAC/C,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,MAAM,WAAA,GAAc,KAAK,IAAA,EAAK;AAC9B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,wCAAwC,CAAA;AACjD,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,MAAM,SAAA,CAAU,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY,EAAG,WAAW,CAAA;AACtF,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,QAAA,CAAS,YAAY,OAAO,CAAA;AAAA,MAC9B;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,qBAAqB,CAAA;AAAA,IACrE,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,IAAA,EAAM,SAAS,CAAC,CAAA;AAE3B,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,sBAC9E,IAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,SAAA,EAAW,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,OAAA,EAAQ,EAAG,QAAA,EAAA;AAAA,QAAA,4BAAA;AAAA,wBACvDA,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,MAAK,EAAE;AAAA,OAAA,EAClD,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,UAAA;AAAA,UACP,IAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAU,SAAA;AAAA,UACV,YAAA,EAAa,eAAA;AAAA,UACb,WAAA,EAAY,oBAAA;AAAA,UACZ,KAAA,EAAO,IAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACvC,WAAW,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,WAAW,gBAAA;AAAiB;AAAA,OAC1D;AAAA,MACC,yBAASA,GAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,YAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACvCA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,gBAAA,EAAkB,QAAA,EAAU,OAAA,EAC9D,QAAA,EAAA,OAAA,GAAU,cAAA,GAAiB,aAAA,EAC9B,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,SAAA,EAAW,SAAS,MAAM;AAAE,QAAA,OAAA,CAAQ,OAAO,CAAA;AAAG,QAAA,OAAA,CAAQ,EAAE,CAAA;AAAG,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MAAG,GAAG,QAAA,EAAA,uBAAA,EAE7F;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,oBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,oBACjF,IAAA,CAAC,OAAE,KAAA,EAAO,EAAE,QAAQ,CAAA,EAAG,KAAA,EAAO,WAAU,EAAG,QAAA,EAAA;AAAA,MAAA,aAAA;AAAA,MAC7B,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,CAAA,GAAM,EAAA;AAAA,MAAG;AAAA,KAAA,EACpD,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,UAAA;AAAA,QACP,IAAA,EAAK,OAAA;AAAA,QACL,WAAA,EAAa,WAAA,GAAc,CAAA,IAAA,EAAO,WAAW,CAAA,CAAA,GAAK,iBAAA;AAAA,QAClD,KAAA,EAAO,KAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,WAAW,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,WAAW,cAAA;AAAe;AAAA,KACxD;AAAA,IACC,yBAASA,GAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,YAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACvCA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,cAAA,EAAgB,QAAA,EAAU,OAAA,EAC5D,QAAA,EAAA,OAAA,GAAU,YAAA,GAAe,mBAAA,EAC5B;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,SAAS,QAAA,CAAS,EAAE,QAAA,EAAU,OAAA,EAAS,iBAAgB,EAAkB;AAC9E,EAAA,MAAM,EAAE,eAAA,EAAiB,SAAA,EAAW,KAAA,EAAO,MAAA,KAAW,OAAA,EAAQ;AAC9D,EAAA,MAAM,WAAW,UAAA,EAAW;AAE5B,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOA,GAAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,OAAA,oBAAWA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,QAAA,EAAA,YAAA,EAAU,CAAA,EAAO,CAAA;AAAA,EAClE;AAEA,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,uBAAOA,IAAC,SAAA,EAAA,EAAU,CAAA;AAAA,IACpB;AAEA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,uBAAOA,GAAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,eAAA,CAAgB,EAAE,MAAA,EAAQ,MAAM,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,CAAA,EAAE,CAAA;AAAA,IAC9E;AAEA,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,sBACjFA,GAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAQ,CAAA,EAAG,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,yCAAA,EAE3C,CAAA;AAAA,MACC,yBAASA,GAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,YAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACvCA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,MAAM,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,QAAA,EAAA,qBAAA,EAE3E;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBAAOA,GAAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB","file":"react.js","sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { SemanticLayerClient } from \"../client\";\nimport type { SemanticLayerConfig, AuthState } from \"../types\";\nimport { SemanticLayerContext } from \"./context\";\n\nexport interface SemanticLayerProviderProps {\n /** The Supabase URL of the gateway project. */\n gatewayUrl: string;\n /** The Supabase anon/publishable key of the gateway project. */\n anonKey: string;\n /**\n * Optional: restrict sign-in to emails matching this domain (e.g. \"inkind.com\").\n * Used for client-side validation in the OTP sign-in form.\n */\n emailDomain?: string;\n /**\n * Optional: a pre-constructed client instance.\n * If provided, gatewayUrl and anonKey are ignored.\n */\n client?: SemanticLayerClient;\n children: React.ReactNode;\n}\n\nexport function SemanticLayerProvider({\n gatewayUrl,\n anonKey,\n emailDomain,\n client: externalClient,\n children,\n}: SemanticLayerProviderProps) {\n const client = useMemo(() => {\n if (externalClient) return externalClient;\n return new SemanticLayerClient({ gatewayUrl, anonKey });\n }, [gatewayUrl, anonKey, externalClient]);\n\n const [auth, setAuth] = useState<AuthState>({\n isAuthenticated: false,\n isLoading: true,\n user: null,\n error: null,\n });\n\n useEffect(() => {\n let mounted = true;\n\n async function initAuth() {\n try {\n const session = await client.getSession();\n if (!mounted) return;\n\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email || \"\" },\n error: null,\n });\n } else {\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n }\n } catch (err) {\n if (!mounted) return;\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: err instanceof Error ? err.message : \"Auth initialization failed\",\n });\n }\n }\n\n initAuth();\n\n const { data: { subscription } } = client.onAuthStateChange((_event, session) => {\n if (!mounted) return;\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email || \"\" },\n error: null,\n });\n } else {\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n }\n });\n\n return () => {\n mounted = false;\n subscription.unsubscribe();\n };\n }, [client]);\n\n const value = useMemo(() => ({ client, auth, emailDomain }), [client, auth, emailDomain]);\n\n return (\n <SemanticLayerContext.Provider value={value}>\n {children}\n </SemanticLayerContext.Provider>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport { useAuth } from \"./hooks\";\n\nexport interface AuthGateProps {\n children: React.ReactNode;\n /** Custom loading component. */\n loading?: React.ReactNode;\n /** Custom sign-in component. Receives a signIn callback. */\n signInComponent?: (props: { signIn: () => void }) => React.ReactNode;\n}\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n gap: \"16px\",\n};\n\nconst loadingStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#6b7280\",\n};\n\nconst buttonStyle: React.CSSProperties = {\n padding: \"12px 24px\",\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#ffffff\",\n backgroundColor: \"#4285f4\",\n border: \"none\",\n borderRadius: \"8px\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n};\n\nconst inputStyle: React.CSSProperties = {\n padding: \"10px 14px\",\n fontSize: \"16px\",\n border: \"1px solid #d1d5db\",\n borderRadius: \"8px\",\n width: \"280px\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n};\n\nconst errorStyle: React.CSSProperties = {\n margin: 0,\n color: \"#ef4444\",\n fontSize: \"14px\",\n};\n\nconst linkStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n color: \"#4285f4\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n padding: 0,\n textDecoration: \"underline\",\n};\n\nfunction isInIframe(): boolean {\n try {\n return typeof window !== \"undefined\" && window.self !== window.top;\n } catch {\n return true;\n }\n}\n\n/**\n * Email OTP sign-in form for use inside iframes (Lovable editor preview).\n * Two-step: enter email → enter code from inbox.\n */\nfunction OtpSignIn() {\n const { sendOtp, verifyOtp, emailDomain } = useAuth();\n const [email, setEmail] = useState(\"\");\n const [code, setCode] = useState(\"\");\n const [step, setStep] = useState<\"email\" | \"code\">(\"email\");\n const [sending, setSending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSendCode = useCallback(async () => {\n setError(null);\n const trimmed = email.trim().toLowerCase();\n if (!trimmed) {\n setError(\"Please enter your email.\");\n return;\n }\n if (emailDomain && !trimmed.endsWith(`@${emailDomain}`)) {\n setError(`Please use your @${emailDomain} email.`);\n return;\n }\n setSending(true);\n try {\n const { error: otpError } = await sendOtp(trimmed);\n if (otpError) {\n setError(otpError.message);\n } else {\n setStep(\"code\");\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to send code\");\n } finally {\n setSending(false);\n }\n }, [email, emailDomain, sendOtp]);\n\n const handleVerifyCode = useCallback(async () => {\n setError(null);\n const trimmedCode = code.trim();\n if (!trimmedCode) {\n setError(\"Please enter the code from your email.\");\n return;\n }\n setSending(true);\n try {\n const { error: verifyError } = await verifyOtp(email.trim().toLowerCase(), trimmedCode);\n if (verifyError) {\n setError(verifyError.message);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Verification failed\");\n } finally {\n setSending(false);\n }\n }, [email, code, verifyOtp]);\n\n if (step === \"code\") {\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Check your email</h2>\n <p style={{ margin: 0, color: \"#6b7280\", textAlign: \"center\", maxWidth: \"320px\" }}>\n We sent a sign-in code to <strong>{email.trim()}</strong>\n </p>\n <input\n style={inputStyle}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n placeholder=\"Enter 6-digit code\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleVerifyCode()}\n />\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={handleVerifyCode} disabled={sending}>\n {sending ? \"Verifying...\" : \"Verify code\"}\n </button>\n <button style={linkStyle} onClick={() => { setStep(\"email\"); setCode(\"\"); setError(null); }}>\n Use a different email\n </button>\n </div>\n );\n }\n\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Sign in to continue</h2>\n <p style={{ margin: 0, color: \"#6b7280\" }}>\n Enter your {emailDomain ? `@${emailDomain} ` : \"\"}email to receive a sign-in code.\n </p>\n <input\n style={inputStyle}\n type=\"email\"\n placeholder={emailDomain ? `you@${emailDomain}` : \"you@company.com\"}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleSendCode()}\n />\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={handleSendCode} disabled={sending}>\n {sending ? \"Sending...\" : \"Send sign-in code\"}\n </button>\n </div>\n );\n}\n\n/**\n * Wraps children and only renders them when the user is authenticated.\n * In iframes (e.g. Lovable editor preview), shows an email OTP form.\n * In standalone tabs, shows the Google OAuth sign-in button.\n */\nexport function AuthGate({ children, loading, signInComponent }: AuthGateProps) {\n const { isAuthenticated, isLoading, error, signIn } = useAuth();\n const inIframe = isInIframe();\n\n if (isLoading) {\n return <>{loading || <div style={loadingStyle}>Loading...</div>}</>;\n }\n\n if (!isAuthenticated) {\n if (inIframe) {\n return <OtpSignIn />;\n }\n\n if (signInComponent) {\n return <>{signInComponent({ signIn: () => signIn(window.location.origin) })}</>;\n }\n\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Sign in to continue</h2>\n <p style={{ margin: 0, color: \"#6b7280\" }}>\n Use your Google account to access data.\n </p>\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={() => signIn(window.location.origin)}>\n Sign in with Google\n </button>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/provider.tsx","../src/react/auth-gate.tsx"],"names":["useState","jsx"],"mappings":"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","file":"react.js","sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { SemanticLayerClient } from \"../client\";\nimport type { SemanticLayerConfig, AuthState } from \"../types\";\nimport { SemanticLayerContext } from \"./context\";\n\nexport interface SemanticLayerProviderProps {\n /** The Supabase URL of the gateway project. */\n gatewayUrl: string;\n /** The Supabase anon/publishable key of the gateway project. */\n anonKey: string;\n /**\n * Optional: restrict sign-in to emails matching this domain (e.g. \"inkind.com\").\n * Used for client-side validation in the OTP sign-in form.\n */\n emailDomain?: string;\n /**\n * Optional: a pre-constructed client instance.\n * If provided, gatewayUrl and anonKey are ignored.\n */\n client?: SemanticLayerClient;\n children: React.ReactNode;\n}\n\nexport function SemanticLayerProvider({\n gatewayUrl,\n anonKey,\n emailDomain,\n client: externalClient,\n children,\n}: SemanticLayerProviderProps) {\n const client = useMemo(() => {\n if (externalClient) return externalClient;\n return new SemanticLayerClient({ gatewayUrl, anonKey });\n }, [gatewayUrl, anonKey, externalClient]);\n\n const [auth, setAuth] = useState<AuthState>({\n isAuthenticated: false,\n isLoading: true,\n user: null,\n error: null,\n });\n\n useEffect(() => {\n let mounted = true;\n\n async function initAuth() {\n try {\n const session = await client.getSession();\n if (!mounted) return;\n\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email || \"\" },\n error: null,\n });\n } else {\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n }\n } catch (err) {\n if (!mounted) return;\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: err instanceof Error ? err.message : \"Auth initialization failed\",\n });\n }\n }\n\n initAuth();\n\n const { data: { subscription } } = client.onAuthStateChange((_event, session) => {\n if (!mounted) return;\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email || \"\" },\n error: null,\n });\n } else {\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n }\n });\n\n return () => {\n mounted = false;\n subscription.unsubscribe();\n };\n }, [client]);\n\n const value = useMemo(() => ({ client, auth, emailDomain }), [client, auth, emailDomain]);\n\n return (\n <SemanticLayerContext.Provider value={value}>\n {children}\n </SemanticLayerContext.Provider>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport { useAuth } from \"./hooks\";\n\nexport interface AuthGateProps {\n children: React.ReactNode;\n /** Custom loading component. */\n loading?: React.ReactNode;\n /** Custom sign-in component. Receives a signIn callback. */\n signInComponent?: (props: { signIn: () => void }) => React.ReactNode;\n /** Force email OTP sign-in instead of Google OAuth (recommended for Lovable editor). */\n useEmailOtp?: boolean;\n}\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n gap: \"16px\",\n};\n\nconst loadingStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#6b7280\",\n};\n\nconst buttonStyle: React.CSSProperties = {\n padding: \"12px 24px\",\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#ffffff\",\n backgroundColor: \"#4285f4\",\n border: \"none\",\n borderRadius: \"8px\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n};\n\nconst inputStyle: React.CSSProperties = {\n padding: \"10px 14px\",\n fontSize: \"16px\",\n border: \"1px solid #d1d5db\",\n borderRadius: \"8px\",\n width: \"280px\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n};\n\nconst errorStyle: React.CSSProperties = {\n margin: 0,\n color: \"#ef4444\",\n fontSize: \"14px\",\n};\n\nconst linkStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n color: \"#4285f4\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n padding: 0,\n textDecoration: \"underline\",\n};\n\nfunction isInIframe(): boolean {\n try {\n return typeof window !== \"undefined\" && window.self !== window.top;\n } catch {\n return true;\n }\n}\n\n/**\n * Email OTP sign-in form for use inside iframes (Lovable editor preview).\n * Two-step: enter email → enter code from inbox.\n */\nfunction OtpSignIn() {\n const { sendOtp, verifyOtp, emailDomain } = useAuth();\n const [email, setEmail] = useState(\"\");\n const [code, setCode] = useState(\"\");\n const [step, setStep] = useState<\"email\" | \"code\">(\"email\");\n const [sending, setSending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSendCode = useCallback(async () => {\n setError(null);\n const trimmed = email.trim().toLowerCase();\n if (!trimmed) {\n setError(\"Please enter your email.\");\n return;\n }\n if (emailDomain && !trimmed.endsWith(`@${emailDomain}`)) {\n setError(`Please use your @${emailDomain} email.`);\n return;\n }\n setSending(true);\n try {\n const { error: otpError } = await sendOtp(trimmed);\n if (otpError) {\n setError(otpError.message);\n } else {\n setStep(\"code\");\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to send code\");\n } finally {\n setSending(false);\n }\n }, [email, emailDomain, sendOtp]);\n\n const handleVerifyCode = useCallback(async () => {\n setError(null);\n const trimmedCode = code.trim();\n if (!trimmedCode) {\n setError(\"Please enter the code from your email.\");\n return;\n }\n setSending(true);\n try {\n const { error: verifyError } = await verifyOtp(email.trim().toLowerCase(), trimmedCode);\n if (verifyError) {\n setError(verifyError.message);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Verification failed\");\n } finally {\n setSending(false);\n }\n }, [email, code, verifyOtp]);\n\n if (step === \"code\") {\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Check your email</h2>\n <p style={{ margin: 0, color: \"#6b7280\", textAlign: \"center\", maxWidth: \"320px\" }}>\n We sent a sign-in code to <strong>{email.trim()}</strong>\n </p>\n <input\n style={inputStyle}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n placeholder=\"Enter 6-digit code\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleVerifyCode()}\n />\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={handleVerifyCode} disabled={sending}>\n {sending ? \"Verifying...\" : \"Verify code\"}\n </button>\n <button style={linkStyle} onClick={() => { setStep(\"email\"); setCode(\"\"); setError(null); }}>\n Use a different email\n </button>\n </div>\n );\n }\n\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Sign in to continue</h2>\n <p style={{ margin: 0, color: \"#6b7280\" }}>\n Enter your {emailDomain ? `@${emailDomain} ` : \"\"}email to receive a sign-in code.\n </p>\n <input\n style={inputStyle}\n type=\"email\"\n placeholder={emailDomain ? `you@${emailDomain}` : \"you@company.com\"}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleSendCode()}\n />\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={handleSendCode} disabled={sending}>\n {sending ? \"Sending...\" : \"Send sign-in code\"}\n </button>\n </div>\n );\n}\n\n/**\n * Wraps children and only renders them when the user is authenticated.\n * In iframes (e.g. Lovable editor preview), shows an email OTP form.\n * In standalone tabs, shows the Google OAuth sign-in button.\n */\nexport function AuthGate({ children, loading, signInComponent, useEmailOtp }: AuthGateProps) {\n const { isAuthenticated, isLoading, error, signIn } = useAuth();\n const inIframe = isInIframe();\n const shouldUseOtp = useEmailOtp || inIframe;\n\n if (isLoading) {\n return <>{loading || <div style={loadingStyle}>Loading...</div>}</>;\n }\n\n if (!isAuthenticated) {\n if (shouldUseOtp) {\n return <OtpSignIn />;\n }\n\n if (signInComponent) {\n return <>{signInComponent({ signIn: () => signIn(window.location.origin) })}</>;\n }\n\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Sign in to continue</h2>\n <p style={{ margin: 0, color: \"#6b7280\" }}>\n Use your Google account to access data.\n </p>\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={() => signIn(window.location.origin)}>\n Sign in with Google\n </button>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n"]}
|