@a-tech.jo/auth-sdk 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/dist/index.mjs ADDED
@@ -0,0 +1,731 @@
1
+ // src/config.ts
2
+ var DEFAULT_ENVIRONMENT_URLS = {
3
+ production: "https://auth.atech-workspace.com",
4
+ stage: "https://stage.auth.atech-workspace.com",
5
+ local: "http://localhost:3000"
6
+ };
7
+ var DEFAULT_ENDPOINTS = {
8
+ login: "/api/auth/login",
9
+ register: "/api/auth/signup",
10
+ forgotPassword: "/api/auth/forgot-password",
11
+ resetPassword: "/api/auth/reset-password",
12
+ refreshToken: "/api/auth/refresh-token",
13
+ me: "/api/auth/me"
14
+ };
15
+ var DEFAULT_STORAGE_KEYS = {
16
+ accessToken: "atech_access_token",
17
+ refreshToken: "atech_refresh_token"
18
+ };
19
+ var DEFAULT_THEME = {
20
+ primary: "#7c3aed",
21
+ // Purple
22
+ navy: "#0f172a",
23
+ // Dark Slate/Navy
24
+ pink: "#ec4899",
25
+ // Pink Accent
26
+ bg: "#ffffff"
27
+ // White Card
28
+ };
29
+ var DEFAULT_SDK_CONFIG = {
30
+ environment: "production",
31
+ environmentUrls: DEFAULT_ENVIRONMENT_URLS,
32
+ endpoints: DEFAULT_ENDPOINTS,
33
+ storageKeys: DEFAULT_STORAGE_KEYS,
34
+ theme: DEFAULT_THEME,
35
+ brand: {
36
+ logoUrl: "/images/logo.png",
37
+ companyName: "A-Tech"
38
+ }
39
+ };
40
+ function getSDKConfig(options = {}) {
41
+ const environment = options.environment || DEFAULT_SDK_CONFIG.environment;
42
+ const baseUrl = (options.customBaseUrl || options.environmentUrls?.[environment] || DEFAULT_ENVIRONMENT_URLS[environment]).replace(/\/$/, "");
43
+ return {
44
+ environment,
45
+ baseUrl,
46
+ endpoints: {
47
+ ...DEFAULT_ENDPOINTS,
48
+ ...options.endpoints
49
+ },
50
+ storageKeys: {
51
+ ...DEFAULT_STORAGE_KEYS,
52
+ ...options.storageKeys
53
+ },
54
+ theme: {
55
+ ...DEFAULT_THEME,
56
+ ...options.theme
57
+ },
58
+ brand: {
59
+ ...DEFAULT_SDK_CONFIG.brand,
60
+ ...options.brand
61
+ },
62
+ onSuccess: options.onSuccess,
63
+ onError: options.onError
64
+ };
65
+ }
66
+
67
+ // src/client.ts
68
+ var AuthClient = class {
69
+ constructor(options = {}) {
70
+ this.config = getSDKConfig(options);
71
+ }
72
+ async request(endpoint, data) {
73
+ const url = `${this.config.baseUrl}${endpoint}`;
74
+ const response = await fetch(url, {
75
+ method: "POST",
76
+ headers: { "Content-Type": "application/json" },
77
+ body: JSON.stringify(data)
78
+ });
79
+ const result = await response.json();
80
+ if (!response.ok) {
81
+ throw new Error(result.error || result.message || "Authentication request failed");
82
+ }
83
+ return result;
84
+ }
85
+ async login(payload) {
86
+ return this.request(this.config.endpoints.login, payload);
87
+ }
88
+ async register(payload) {
89
+ return this.request(this.config.endpoints.register, payload);
90
+ }
91
+ async forgotPassword(payload) {
92
+ return this.request(this.config.endpoints.forgotPassword, payload);
93
+ }
94
+ async resetPassword(payload) {
95
+ return this.request(this.config.endpoints.resetPassword, payload);
96
+ }
97
+ };
98
+
99
+ // src/AuthContext.tsx
100
+ import { createContext, useContext, useState, useEffect, useMemo } from "react";
101
+ import { jsx } from "react/jsx-runtime";
102
+ var AuthContext = createContext(null);
103
+ function isTokenExpired(token) {
104
+ if (!token) return true;
105
+ try {
106
+ const base64Url = token.split(".")[1];
107
+ if (!base64Url) return true;
108
+ const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
109
+ const jsonPayload = decodeURIComponent(
110
+ window.atob(base64).split("").map((c) => "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2)).join("")
111
+ );
112
+ const { exp } = JSON.parse(jsonPayload);
113
+ if (!exp) return false;
114
+ return Date.now() >= exp * 1e3;
115
+ } catch {
116
+ return true;
117
+ }
118
+ }
119
+ var AuthProvider = ({ config = {}, children }) => {
120
+ const [client] = useState(() => new AuthClient(config));
121
+ const [token, setToken] = useState(null);
122
+ const [user, setUser] = useState(null);
123
+ useEffect(() => {
124
+ if (typeof window !== "undefined") {
125
+ const savedToken = localStorage.getItem("auth_token");
126
+ if (savedToken) setToken(savedToken);
127
+ }
128
+ }, []);
129
+ const saveSession = (res) => {
130
+ if (res.token) {
131
+ setToken(res.token);
132
+ if (typeof window !== "undefined") {
133
+ localStorage.setItem("auth_token", res.token);
134
+ if (res.refreshToken) {
135
+ localStorage.setItem("auth_refresh_token", res.refreshToken);
136
+ }
137
+ }
138
+ }
139
+ if (res.user) setUser(res.user);
140
+ if (config.onSuccess) config.onSuccess(res);
141
+ };
142
+ const login = async (payload) => {
143
+ try {
144
+ const res = await client.login(payload);
145
+ saveSession(res);
146
+ return res;
147
+ } catch (err) {
148
+ if (config.onError) config.onError(err);
149
+ throw err;
150
+ }
151
+ };
152
+ const register = async (payload) => {
153
+ try {
154
+ const res = await client.register(payload);
155
+ saveSession(res);
156
+ return res;
157
+ } catch (err) {
158
+ if (config.onError) config.onError(err);
159
+ throw err;
160
+ }
161
+ };
162
+ const logout = () => {
163
+ setToken(null);
164
+ setUser(null);
165
+ if (typeof window !== "undefined") {
166
+ localStorage.removeItem("auth_token");
167
+ localStorage.removeItem("auth_refresh_token");
168
+ }
169
+ };
170
+ const isExpired = useMemo(() => isTokenExpired(token), [token]);
171
+ return /* @__PURE__ */ jsx(
172
+ AuthContext.Provider,
173
+ {
174
+ value: {
175
+ client,
176
+ token,
177
+ user,
178
+ login,
179
+ register,
180
+ logout,
181
+ isAuthenticated: !!token && !isExpired,
182
+ isExpired
183
+ },
184
+ children
185
+ }
186
+ );
187
+ };
188
+ var useAuth = () => {
189
+ const context = useContext(AuthContext);
190
+ if (!context) {
191
+ throw new Error("useAuth must be used within an <AuthProvider />");
192
+ }
193
+ return context;
194
+ };
195
+
196
+ // src/components/AuthContainer.tsx
197
+ import { useState as useState5 } from "react";
198
+
199
+ // src/components/LoginForm.tsx
200
+ import { useState as useState2 } from "react";
201
+
202
+ // src/assets/images/logo.png
203
+ var logo_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAswAAADuCAMAAAAa9KE8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAwBQTFRFbgnMaArEIRBhHhFd6NH7cgnSqYbS6+H2dAnUZAq+KBBrFRFRagrGeAjaXgu2RA2R8eD+pIbMYUuV3NHrYwq8jgb4fgjiOQ6CTwyhiAfwbQnKjQf2VAyohAfqu4TrGBFVmIe7WAuufQjg9fD6Og6EYAu5egjcWguwdwnYcAnPJhBoiXiwSg2bcDqySA2YigfzUAyiUgymUi6R3cL1Pg6KEhJNhgfuXAu0ZUubDRJFJBBmonbTvKTbZwrCw6TllC7pZgrBLw90gwfp1cLqrkT/Qg2PgAjlChJBtYXjRg2VYQu6GhFYXEyOMA92kAb7dgnXcQnQdynGQA2NTAydkAb6yMTYgQjmhUjGwYP0Kg9uNg5+48H+TAyc2rL7VwusoCn8w7TaLA9xXAuy1qL+bArJy7PlfUm70sLmMg95hgfsgDjJxYP5p5bGEBJKnIfBPQ6IqWXlVgyqPA6HyYP/mGfOiwf0l3fEmBb8HBFaypP3umP8tZTaRw2WQg2OfWmoWxuohVi9LQ9ynmbWMg94IhBkDhJInEbmZBq1AxM45eHuUgykVgurBhM8a1uapUXysIXcKSBkSwyc8vD3BBM62MLvz8PhraXFplXri1fGNw6AvoTwhhfku5TioYbH////oUbtFBFPc0quakqhPB5+cxnJvHT1nZe5CBM/zaLytKXPjoiumlbajEfQkwb/SB2OubXNSDWBvbTTbBnAUxyexJPvfBjVjgb3tVT/e1mvrpXQimi6Sx2S0LLtqEX3YiqpkVfOPx6CMx9xawrIYgq7UQykewjecgnRfAjfQQ2OWwuydQnWaArDSA2XWAutZQq/jAf1Lg9zhQfsMQ94QA6Mkgb+Pg6JggjnFxFTTgyfbwnNVQypeAjZggjojwb5fwjjXQu1kgb9bQnLKw9vRQ2TXwu3NA97iQfxhwfveQjbUwynaQrFYwq9NQ59fQjhkwb+CxJDPw6LcwnTIBBfWQuvSQ2ZwnP/0JL/9/D+uITobArKXDuXr1X3LSBogRfdqXXdAAAAHWn4xgAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAACUvSURBVHja7J17eFTVucajYGKxIpBSULHgSQALUuUiWKAECCAS0EbkIEQuFrkYEImhJAKHICIMRYxGQFEYwVuBQ61FLUKFtqK2gFDEokBVqtwsUovFGuX0ON0zmcu+rPV939p77T179t6f9I8+j848w/z4ePOutd83KxJMJDJo0PbofOc7n376LWX2KNNbmR8ps+ucc845efLkt5V5TZnbb7/9kksu+eijLGUOHjz4fWV+rMybb5533ufKnH/++TuVuVGZK6644i9/ufDCT5Rpo8wbyvxBmf/6+9+/q8yHygwYMOC/lXn33fff79u372XKvK1MV2VOnDhxsTLHlbnqqqt+qsyflLn00kt/3bRp0w+UufmG6Pz1r3/+859/EUxisvzO8dGjrZUZlMD50yTOveM479oVo1mPc5xmPc7ngzjHaE7hPCCFc18tzidSOF+Vwlmh+dKmdTjX0RzD+bOA4gDmSKShMkePGnA2LGctzrrlnMD5TQXnz7U4x2lO4Kxazn9PLecBqeWcwPmOFM7HUzj/KYWzejkHOAcwR7odVkaF8yBca5xka42DRq1xvnY5X0jVGn0pWoOBcwCyn2He0U0ZLc0srbEH1hofOaU1dDgHWiOAOYWyMj+poxnCGdYatzO0xo+NWkOH8xtanD9U48zTGmzpHGiNAOZIpK0yfJz5WmOXnVpjgFFriErnAGbfoXxGmQTO3bQ4t8alsyyt8YZWawQ2XQCz+OzefbmaZoLW+BZfa7xmVmsENl0As/UZPVqhmYDzdvM23Y+NNt2NDtp0Acw+mbLFo0cbce5mxHmQG44EA5sugJk/h8rKFutxTixn6zZdVhpsukBr+BXmQ4cUmtnL2Rabjn0kKNGmC44EfQtzixaHYjgvFsDZzTZdoDX8C/Pf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";
204
+
205
+ // src/components/LoginForm.tsx
206
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
207
+ var SDKLoginForm = ({
208
+ onSuccess,
209
+ onForgotPasswordClick,
210
+ onRegisterClick,
211
+ className = ""
212
+ }) => {
213
+ const { login, client } = useAuth();
214
+ const [email, setEmail] = useState2("");
215
+ const [password, setPassword] = useState2("");
216
+ const [loading, setLoading] = useState2(false);
217
+ const [error, setError] = useState2(null);
218
+ const colors = client?.config?.theme || {
219
+ primary: "#7c3aed",
220
+ navy: "#0f172a",
221
+ pink: "#ec4899",
222
+ bg: "#ffffff"
223
+ };
224
+ const dynamicThemeVars = {
225
+ "--atech-primary": colors.primary,
226
+ "--atech-navy": colors.navy,
227
+ "--atech-pink": colors.pink,
228
+ "--atech-bg": colors.bg
229
+ };
230
+ const logoSrc = client?.config?.brand?.logoUrl || logo_default;
231
+ const handleSubmit = async (e) => {
232
+ e.preventDefault();
233
+ setLoading(true);
234
+ setError(null);
235
+ try {
236
+ await login({ email, password });
237
+ if (onSuccess) onSuccess();
238
+ } catch (err) {
239
+ setError(err.message || "Invalid credentials provided.");
240
+ } finally {
241
+ setLoading(false);
242
+ }
243
+ };
244
+ return /* @__PURE__ */ jsxs("div", { className: `atech-card ${className}`, style: dynamicThemeVars, children: [
245
+ /* @__PURE__ */ jsx2("div", { className: "atech-header", children: /* @__PURE__ */ jsx2(
246
+ "img",
247
+ {
248
+ src: logoSrc,
249
+ alt: client?.config?.brand?.companyName || "Logo",
250
+ className: "atech-logo"
251
+ }
252
+ ) }),
253
+ /* @__PURE__ */ jsx2("h1", { className: "atech-title", children: "Sign In" }),
254
+ error && /* @__PURE__ */ jsx2("div", { className: "atech-error", children: error }),
255
+ /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "atech-form", children: [
256
+ /* @__PURE__ */ jsxs("div", { className: "atech-field", children: [
257
+ /* @__PURE__ */ jsx2("label", { className: "atech-label", children: "Email Address" }),
258
+ /* @__PURE__ */ jsx2(
259
+ "input",
260
+ {
261
+ type: "email",
262
+ required: true,
263
+ placeholder: "john@example.com",
264
+ value: email,
265
+ onChange: (e) => setEmail(e.target.value),
266
+ className: "atech-input"
267
+ }
268
+ )
269
+ ] }),
270
+ /* @__PURE__ */ jsxs("div", { className: "atech-field", children: [
271
+ /* @__PURE__ */ jsx2("label", { className: "atech-label", children: "Password" }),
272
+ /* @__PURE__ */ jsx2(
273
+ "input",
274
+ {
275
+ type: "password",
276
+ required: true,
277
+ placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
278
+ value: password,
279
+ onChange: (e) => setPassword(e.target.value),
280
+ className: "atech-input"
281
+ }
282
+ )
283
+ ] }),
284
+ /* @__PURE__ */ jsx2("button", { type: "submit", disabled: loading, className: "atech-button", children: loading ? "Signing in..." : "Sign In" })
285
+ ] }),
286
+ /* @__PURE__ */ jsxs("div", { className: "atech-footer", children: [
287
+ onForgotPasswordClick ? /* @__PURE__ */ jsx2("button", { type: "button", onClick: onForgotPasswordClick, className: "atech-link", children: "Forgot Password?" }) : /* @__PURE__ */ jsx2("span", {}),
288
+ onRegisterClick && /* @__PURE__ */ jsx2("button", { type: "button", onClick: onRegisterClick, className: "atech-link", children: "Create Account" })
289
+ ] })
290
+ ] });
291
+ };
292
+
293
+ // src/components/RegisterForm.tsx
294
+ import { useEffect as useEffect2, useState as useState3, useRef } from "react";
295
+ import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
296
+ var SDKRegisterForm = ({
297
+ onSuccess,
298
+ onLoginClick,
299
+ className = ""
300
+ }) => {
301
+ const { register, client } = useAuth();
302
+ const [firstName, setFirstName] = useState3("");
303
+ const [lastName, setLastName] = useState3("");
304
+ const [email, setEmail] = useState3("");
305
+ const [phoneNumber, setPhoneNumber] = useState3("");
306
+ const [password, setPassword] = useState3("");
307
+ const [loading, setLoading] = useState3(false);
308
+ const [error, setError] = useState3(null);
309
+ const [countries, setCountries] = useState3([]);
310
+ const [selectedCountry, setSelectedCountry] = useState3({
311
+ id: 0,
312
+ name: "United States",
313
+ phoneCode: "+1",
314
+ nameIso2: "US"
315
+ });
316
+ const [isDropdownOpen, setIsDropdownOpen] = useState3(false);
317
+ const [searchQuery, setSearchQuery] = useState3("");
318
+ const dropdownRef = useRef(null);
319
+ const colors = client?.config?.theme || {
320
+ primary: "#7c3aed",
321
+ navy: "#0f172a",
322
+ pink: "#ec4899",
323
+ bg: "#ffffff"
324
+ };
325
+ const dynamicThemeVars = {
326
+ "--atech-primary": colors.primary,
327
+ "--atech-navy": colors.navy,
328
+ "--atech-pink": colors.pink,
329
+ "--atech-bg": colors.bg
330
+ };
331
+ const logoSrc = client?.config?.brand?.logoUrl || logo_default;
332
+ useEffect2(() => {
333
+ if (client && typeof client.searchCountries === "function") {
334
+ client.searchCountries("").then((res) => {
335
+ if (res?.data && Array.isArray(res.data) && res.data.length > 0) {
336
+ setCountries(res.data);
337
+ const defaultC = res.data.find((c) => c.phoneCode);
338
+ if (defaultC) setSelectedCountry(defaultC);
339
+ }
340
+ }).catch(() => fallbackCountries());
341
+ } else {
342
+ fallbackCountries();
343
+ }
344
+ }, [client]);
345
+ const fallbackCountries = () => {
346
+ setCountries([
347
+ { id: 1, name: "United States", phoneCode: "+1", nameIso2: "US" },
348
+ { id: 2, name: "Jordan", phoneCode: "+962", nameIso2: "JO" },
349
+ { id: 3, name: "United Kingdom", phoneCode: "+44", nameIso2: "GB" },
350
+ { id: 4, name: "Germany", phoneCode: "+49", nameIso2: "DE" },
351
+ { id: 5, name: "Canada", phoneCode: "+1", nameIso2: "CA" }
352
+ ]);
353
+ };
354
+ useEffect2(() => {
355
+ const handleClickOutside = (event) => {
356
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
357
+ setIsDropdownOpen(false);
358
+ }
359
+ };
360
+ document.addEventListener("mousedown", handleClickOutside);
361
+ return () => document.removeEventListener("mousedown", handleClickOutside);
362
+ }, []);
363
+ const getFlagEmoji = (isoCode) => {
364
+ if (!isoCode || isoCode.length !== 2) return "\u{1F310}";
365
+ const codePoints = isoCode.toUpperCase().split("").map((char) => 127397 + char.charCodeAt(0));
366
+ return String.fromCodePoint(...codePoints);
367
+ };
368
+ const filteredCountries = countries.filter((c) => {
369
+ const q = searchQuery.toLowerCase();
370
+ return c.name.toLowerCase().includes(q) || c.nameIso2 && c.nameIso2.toLowerCase().includes(q) || c.phoneCode && c.phoneCode.includes(q);
371
+ });
372
+ const handleSubmit = async (e) => {
373
+ e.preventDefault();
374
+ setLoading(true);
375
+ setError(null);
376
+ try {
377
+ const code = selectedCountry.phoneCode ? selectedCountry.phoneCode.startsWith("+") ? selectedCountry.phoneCode : `+${selectedCountry.phoneCode}` : "+1";
378
+ const rawPhone = phoneNumber ? phoneNumber.trim().replace(/^\+/, "") : "";
379
+ const formattedPhoneNumber = rawPhone ? `${code} ${rawPhone}` : "";
380
+ const payload = {
381
+ firstName,
382
+ lastName,
383
+ email,
384
+ phoneNumber: formattedPhoneNumber,
385
+ password
386
+ };
387
+ await register(payload);
388
+ if (onSuccess) onSuccess();
389
+ } catch (err) {
390
+ setError(err.message || "Registration failed. Please try again.");
391
+ } finally {
392
+ setLoading(false);
393
+ }
394
+ };
395
+ return /* @__PURE__ */ jsxs2("div", { className: `atech-card ${className}`, style: dynamicThemeVars, children: [
396
+ /* @__PURE__ */ jsx3("div", { className: "atech-header", children: /* @__PURE__ */ jsx3(
397
+ "img",
398
+ {
399
+ src: logoSrc,
400
+ alt: client?.config?.brand?.companyName || "Logo",
401
+ className: "atech-logo"
402
+ }
403
+ ) }),
404
+ /* @__PURE__ */ jsx3("h1", { className: "atech-title", children: "Create Account" }),
405
+ error && /* @__PURE__ */ jsx3("div", { className: "atech-error", children: error }),
406
+ /* @__PURE__ */ jsxs2("form", { onSubmit: handleSubmit, className: "atech-form", children: [
407
+ /* @__PURE__ */ jsxs2("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "0.75rem" }, children: [
408
+ /* @__PURE__ */ jsxs2("div", { className: "atech-field", children: [
409
+ /* @__PURE__ */ jsx3("label", { className: "atech-label", children: "First Name" }),
410
+ /* @__PURE__ */ jsx3(
411
+ "input",
412
+ {
413
+ type: "text",
414
+ required: true,
415
+ placeholder: "John",
416
+ value: firstName,
417
+ onChange: (e) => setFirstName(e.target.value),
418
+ className: "atech-input"
419
+ }
420
+ )
421
+ ] }),
422
+ /* @__PURE__ */ jsxs2("div", { className: "atech-field", children: [
423
+ /* @__PURE__ */ jsx3("label", { className: "atech-label", children: "Last Name" }),
424
+ /* @__PURE__ */ jsx3(
425
+ "input",
426
+ {
427
+ type: "text",
428
+ required: true,
429
+ placeholder: "Doe",
430
+ value: lastName,
431
+ onChange: (e) => setLastName(e.target.value),
432
+ className: "atech-input"
433
+ }
434
+ )
435
+ ] })
436
+ ] }),
437
+ /* @__PURE__ */ jsxs2("div", { className: "atech-field", children: [
438
+ /* @__PURE__ */ jsx3("label", { className: "atech-label", children: "Email Address" }),
439
+ /* @__PURE__ */ jsx3(
440
+ "input",
441
+ {
442
+ type: "email",
443
+ required: true,
444
+ placeholder: "john@example.com",
445
+ value: email,
446
+ onChange: (e) => setEmail(e.target.value),
447
+ className: "atech-input"
448
+ }
449
+ )
450
+ ] }),
451
+ /* @__PURE__ */ jsxs2("div", { className: "atech-field", children: [
452
+ /* @__PURE__ */ jsx3("label", { className: "atech-label", children: "Phone Number" }),
453
+ /* @__PURE__ */ jsxs2("div", { style: { display: "flex", gap: "0.5rem", position: "relative" }, ref: dropdownRef, children: [
454
+ /* @__PURE__ */ jsxs2(
455
+ "button",
456
+ {
457
+ type: "button",
458
+ onClick: () => setIsDropdownOpen(!isDropdownOpen),
459
+ className: "atech-country-trigger",
460
+ children: [
461
+ /* @__PURE__ */ jsx3("span", { children: getFlagEmoji(selectedCountry.nameIso2) }),
462
+ /* @__PURE__ */ jsx3("span", { style: { fontWeight: 600 }, children: selectedCountry.phoneCode ? selectedCountry.phoneCode.startsWith("+") ? selectedCountry.phoneCode : `+${selectedCountry.phoneCode}` : "+1" }),
463
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: "0.75rem", opacity: 0.6 }, children: "\u25BC" })
464
+ ]
465
+ }
466
+ ),
467
+ isDropdownOpen && /* @__PURE__ */ jsxs2("div", { className: "atech-country-popover", children: [
468
+ /* @__PURE__ */ jsx3(
469
+ "input",
470
+ {
471
+ type: "text",
472
+ autoFocus: true,
473
+ placeholder: "Search country or code...",
474
+ value: searchQuery,
475
+ onChange: (e) => setSearchQuery(e.target.value),
476
+ className: "atech-input",
477
+ style: { padding: "0.375rem 0.5rem", fontSize: "0.75rem", marginBottom: "0.5rem" }
478
+ }
479
+ ),
480
+ /* @__PURE__ */ jsx3("div", { className: "atech-country-list", children: filteredCountries.length > 0 ? filteredCountries.map((c) => {
481
+ const code = c.phoneCode ? c.phoneCode.startsWith("+") ? c.phoneCode : `+${c.phoneCode}` : "+1";
482
+ return /* @__PURE__ */ jsxs2(
483
+ "button",
484
+ {
485
+ type: "button",
486
+ onClick: () => {
487
+ setSelectedCountry(c);
488
+ setIsDropdownOpen(false);
489
+ setSearchQuery("");
490
+ },
491
+ className: "atech-country-option",
492
+ children: [
493
+ /* @__PURE__ */ jsxs2("span", { style: { display: "flex", alignItems: "center", gap: "0.5rem", overflow: "hidden" }, children: [
494
+ /* @__PURE__ */ jsx3("span", { children: getFlagEmoji(c.nameIso2) }),
495
+ /* @__PURE__ */ jsx3("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: c.name })
496
+ ] }),
497
+ /* @__PURE__ */ jsx3("span", { style: { fontFamily: "monospace", color: "#64748b", fontWeight: 600 }, children: code })
498
+ ]
499
+ },
500
+ c.id
501
+ );
502
+ }) : /* @__PURE__ */ jsx3("div", { style: { padding: "0.5rem", fontSize: "0.75rem", color: "#94a3b8", textAlign: "center" }, children: "No countries found" }) })
503
+ ] }),
504
+ /* @__PURE__ */ jsx3(
505
+ "input",
506
+ {
507
+ type: "tel",
508
+ placeholder: "(555) 000-0000",
509
+ value: phoneNumber,
510
+ onChange: (e) => setPhoneNumber(e.target.value),
511
+ className: "atech-input",
512
+ style: { flex: 1 }
513
+ }
514
+ )
515
+ ] })
516
+ ] }),
517
+ /* @__PURE__ */ jsxs2("div", { className: "atech-field", children: [
518
+ /* @__PURE__ */ jsx3("label", { className: "atech-label", children: "Password" }),
519
+ /* @__PURE__ */ jsx3(
520
+ "input",
521
+ {
522
+ type: "password",
523
+ required: true,
524
+ placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
525
+ value: password,
526
+ onChange: (e) => setPassword(e.target.value),
527
+ className: "atech-input"
528
+ }
529
+ )
530
+ ] }),
531
+ /* @__PURE__ */ jsx3("button", { type: "submit", disabled: loading, className: "atech-button", children: loading ? /* @__PURE__ */ jsxs2(Fragment, { children: [
532
+ /* @__PURE__ */ jsxs2(
533
+ "svg",
534
+ {
535
+ className: "atech-spinner",
536
+ xmlns: "http://www.w3.org/2000/svg",
537
+ fill: "none",
538
+ viewBox: "0 0 24 24",
539
+ children: [
540
+ /* @__PURE__ */ jsx3(
541
+ "circle",
542
+ {
543
+ style: { opacity: 0.25 },
544
+ cx: "12",
545
+ cy: "12",
546
+ r: "10",
547
+ stroke: "currentColor",
548
+ strokeWidth: "4"
549
+ }
550
+ ),
551
+ /* @__PURE__ */ jsx3(
552
+ "path",
553
+ {
554
+ style: { opacity: 0.75 },
555
+ fill: "currentColor",
556
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
557
+ }
558
+ )
559
+ ]
560
+ }
561
+ ),
562
+ /* @__PURE__ */ jsx3("span", { children: "Creating Account..." })
563
+ ] }) : "Register" })
564
+ ] }),
565
+ /* @__PURE__ */ jsx3("div", { className: "atech-footer", style: { justifyContent: "center" }, children: onLoginClick && /* @__PURE__ */ jsx3("button", { type: "button", onClick: onLoginClick, className: "atech-link", children: "Already have an account? Sign In" }) })
566
+ ] });
567
+ };
568
+
569
+ // src/components/ForgotPasswordForm.tsx
570
+ import { useState as useState4 } from "react";
571
+ import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
572
+ var SDKForgotPasswordForm = ({
573
+ onSuccess,
574
+ onLoginClick,
575
+ className = ""
576
+ }) => {
577
+ const { client } = useAuth();
578
+ const [email, setEmail] = useState4("");
579
+ const [loading, setLoading] = useState4(false);
580
+ const [submitted, setSubmitted] = useState4(false);
581
+ const [error, setError] = useState4(null);
582
+ const colors = client?.config?.theme || {
583
+ primary: "#7c3aed",
584
+ navy: "#0f172a",
585
+ pink: "#ec4899",
586
+ bg: "#ffffff"
587
+ };
588
+ const dynamicThemeVars = {
589
+ "--atech-primary": colors.primary,
590
+ "--atech-navy": colors.navy,
591
+ "--atech-pink": colors.pink,
592
+ "--atech-bg": colors.bg
593
+ };
594
+ const logoSrc = client?.config?.brand?.logoUrl || logo_default;
595
+ const handleSubmit = async (e) => {
596
+ e.preventDefault();
597
+ setLoading(true);
598
+ setError(null);
599
+ try {
600
+ await client.forgotPassword({ email });
601
+ setSubmitted(true);
602
+ if (onSuccess) onSuccess();
603
+ } catch (err) {
604
+ setError(err.message || "Failed to send reset email. Please try again.");
605
+ } finally {
606
+ setLoading(false);
607
+ }
608
+ };
609
+ return /* @__PURE__ */ jsxs3("div", { className: `atech-card ${className}`, style: dynamicThemeVars, children: [
610
+ /* @__PURE__ */ jsx4("div", { className: "atech-header", children: /* @__PURE__ */ jsx4(
611
+ "img",
612
+ {
613
+ src: logoSrc,
614
+ alt: client?.config?.brand?.companyName || "Logo",
615
+ className: "atech-logo"
616
+ }
617
+ ) }),
618
+ /* @__PURE__ */ jsx4("h1", { className: "atech-title", children: "Reset Password" }),
619
+ submitted ? /* @__PURE__ */ jsxs3("div", { style: { textAlign: "center" }, children: [
620
+ /* @__PURE__ */ jsxs3("p", { style: { fontSize: "0.875rem", color: "#334155", marginBottom: "1.5rem" }, children: [
621
+ "If an account exists for ",
622
+ /* @__PURE__ */ jsx4("strong", { children: email }),
623
+ ", a password reset link has been sent."
624
+ ] }),
625
+ onLoginClick && /* @__PURE__ */ jsx4("button", { type: "button", onClick: onLoginClick, className: "atech-button", children: "Return to Sign In" })
626
+ ] }) : /* @__PURE__ */ jsxs3(Fragment2, { children: [
627
+ error && /* @__PURE__ */ jsx4("div", { className: "atech-error", children: error }),
628
+ /* @__PURE__ */ jsxs3("form", { onSubmit: handleSubmit, className: "atech-form", children: [
629
+ /* @__PURE__ */ jsxs3("div", { className: "atech-field", children: [
630
+ /* @__PURE__ */ jsx4("label", { className: "atech-label", children: "Email Address" }),
631
+ /* @__PURE__ */ jsx4(
632
+ "input",
633
+ {
634
+ type: "email",
635
+ required: true,
636
+ placeholder: "john@example.com",
637
+ value: email,
638
+ onChange: (e) => setEmail(e.target.value),
639
+ className: "atech-input"
640
+ }
641
+ )
642
+ ] }),
643
+ /* @__PURE__ */ jsx4("button", { type: "submit", disabled: loading, className: "atech-button", children: loading ? /* @__PURE__ */ jsxs3(Fragment2, { children: [
644
+ /* @__PURE__ */ jsxs3(
645
+ "svg",
646
+ {
647
+ className: "atech-spinner",
648
+ xmlns: "http://www.w3.org/2000/svg",
649
+ fill: "none",
650
+ viewBox: "0 0 24 24",
651
+ children: [
652
+ /* @__PURE__ */ jsx4(
653
+ "circle",
654
+ {
655
+ style: { opacity: 0.25 },
656
+ cx: "12",
657
+ cy: "12",
658
+ r: "10",
659
+ stroke: "currentColor",
660
+ strokeWidth: "4"
661
+ }
662
+ ),
663
+ /* @__PURE__ */ jsx4(
664
+ "path",
665
+ {
666
+ style: { opacity: 0.75 },
667
+ fill: "currentColor",
668
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
669
+ }
670
+ )
671
+ ]
672
+ }
673
+ ),
674
+ /* @__PURE__ */ jsx4("span", { children: "Sending Reset Link..." })
675
+ ] }) : "Send Reset Link" })
676
+ ] }),
677
+ /* @__PURE__ */ jsx4("div", { className: "atech-footer", style: { justifyContent: "center" }, children: onLoginClick && /* @__PURE__ */ jsx4("button", { type: "button", onClick: onLoginClick, className: "atech-link", children: "Back to Sign In" }) })
678
+ ] })
679
+ ] });
680
+ };
681
+
682
+ // src/components/AuthContainer.tsx
683
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
684
+ var SDKAuthContainer = ({
685
+ initialMode = "login",
686
+ onSuccess,
687
+ className = "",
688
+ ssoMessage = "A-Tech Single Sign-On"
689
+ }) => {
690
+ const [mode, setMode] = useState5(initialMode);
691
+ return /* @__PURE__ */ jsxs4("div", { className: `atech-auth-wrapper ${className}`, children: [
692
+ /* @__PURE__ */ jsxs4("div", { className: "atech-sso-badge", children: [
693
+ /* @__PURE__ */ jsx5("span", { className: "atech-sso-pulse" }),
694
+ /* @__PURE__ */ jsx5("span", { className: "atech-sso-text", children: ssoMessage })
695
+ ] }),
696
+ mode === "login" && /* @__PURE__ */ jsx5(
697
+ SDKLoginForm,
698
+ {
699
+ onSuccess,
700
+ onRegisterClick: () => setMode("register"),
701
+ onForgotPasswordClick: () => setMode("forgot-password")
702
+ }
703
+ ),
704
+ mode === "register" && /* @__PURE__ */ jsx5(
705
+ SDKRegisterForm,
706
+ {
707
+ onSuccess,
708
+ onLoginClick: () => setMode("login")
709
+ }
710
+ ),
711
+ mode === "forgot-password" && /* @__PURE__ */ jsx5(
712
+ SDKForgotPasswordForm,
713
+ {
714
+ onSuccess,
715
+ onLoginClick: () => setMode("login")
716
+ }
717
+ )
718
+ ] });
719
+ };
720
+ export {
721
+ AuthClient,
722
+ AuthProvider,
723
+ DEFAULT_ENDPOINTS,
724
+ DEFAULT_ENVIRONMENT_URLS,
725
+ DEFAULT_SDK_CONFIG,
726
+ DEFAULT_STORAGE_KEYS,
727
+ DEFAULT_THEME,
728
+ SDKAuthContainer,
729
+ getSDKConfig,
730
+ useAuth
731
+ };