@authon/vue 0.2.0 → 0.3.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.cjs CHANGED
@@ -25,9 +25,14 @@ __export(index_exports, {
25
25
  AuthonSignUp: () => AuthonSignUp,
26
26
  AuthonSignedIn: () => AuthonSignedIn,
27
27
  AuthonSignedOut: () => AuthonSignedOut,
28
+ AuthonSocialButton: () => AuthonSocialButton,
29
+ AuthonSocialButtons: () => AuthonSocialButtons,
28
30
  AuthonUserButton: () => AuthonUserButton,
29
31
  createAuthon: () => createAuthon,
30
32
  useAuthon: () => useAuthon,
33
+ useAuthonPasskeys: () => useAuthonPasskeys,
34
+ useAuthonPasswordless: () => useAuthonPasswordless,
35
+ useAuthonWeb3: () => useAuthonWeb3,
31
36
  useUser: () => useUser
32
37
  });
33
38
  module.exports = __toCommonJS(index_exports);
@@ -112,9 +117,155 @@ function useUser() {
112
117
  };
113
118
  }
114
119
 
115
- // src/components.ts
120
+ // src/useAuthonWeb3.ts
116
121
  var import_vue3 = require("vue");
117
- var AuthonSignIn = (0, import_vue3.defineComponent)({
122
+ var import_vue4 = require("vue");
123
+ function useAuthonWeb3() {
124
+ const state = (0, import_vue4.inject)(AUTHON_KEY);
125
+ if (!state) {
126
+ throw new Error("useAuthonWeb3() must be called inside a component tree with createAuthon() installed");
127
+ }
128
+ const s = state;
129
+ const isLoading = (0, import_vue3.ref)(false);
130
+ const error = (0, import_vue3.ref)(null);
131
+ async function wrap(fn) {
132
+ isLoading.value = true;
133
+ error.value = null;
134
+ try {
135
+ return await fn();
136
+ } catch (err) {
137
+ error.value = err instanceof Error ? err : new Error(String(err));
138
+ return null;
139
+ } finally {
140
+ isLoading.value = false;
141
+ }
142
+ }
143
+ async function getNonce(address, chain, walletType, chainId) {
144
+ return wrap(() => s.client.web3GetNonce(address, chain, walletType, chainId));
145
+ }
146
+ async function verify(message, signature, address, chain, walletType) {
147
+ const result = await wrap(
148
+ () => s.client.web3Verify(message, signature, address, chain, walletType)
149
+ );
150
+ return result !== null;
151
+ }
152
+ async function listWallets() {
153
+ return wrap(() => s.client.listWallets());
154
+ }
155
+ async function linkWallet(params) {
156
+ return wrap(() => s.client.linkWallet(params));
157
+ }
158
+ async function unlinkWallet(walletId) {
159
+ const result = await wrap(() => s.client.unlinkWallet(walletId));
160
+ return result !== null;
161
+ }
162
+ return {
163
+ getNonce,
164
+ verify,
165
+ listWallets,
166
+ linkWallet,
167
+ unlinkWallet,
168
+ isLoading,
169
+ error
170
+ };
171
+ }
172
+
173
+ // src/useAuthonPasswordless.ts
174
+ var import_vue5 = require("vue");
175
+ function useAuthonPasswordless() {
176
+ const state = (0, import_vue5.inject)(AUTHON_KEY);
177
+ if (!state) {
178
+ throw new Error("useAuthonPasswordless() must be called inside a component tree with createAuthon() installed");
179
+ }
180
+ const s = state;
181
+ const isLoading = (0, import_vue5.ref)(false);
182
+ const error = (0, import_vue5.ref)(null);
183
+ async function wrap(fn) {
184
+ isLoading.value = true;
185
+ error.value = null;
186
+ try {
187
+ return await fn();
188
+ } catch (err) {
189
+ error.value = err instanceof Error ? err : new Error(String(err));
190
+ return null;
191
+ } finally {
192
+ isLoading.value = false;
193
+ }
194
+ }
195
+ async function sendMagicLink(email) {
196
+ const result = await wrap(() => s.client.sendMagicLink(email));
197
+ return result !== null;
198
+ }
199
+ async function sendEmailOtp(email) {
200
+ const result = await wrap(() => s.client.sendEmailOtp(email));
201
+ return result !== null;
202
+ }
203
+ async function verifyPasswordless(opts) {
204
+ const result = await wrap(() => s.client.verifyPasswordless(opts));
205
+ return result !== null;
206
+ }
207
+ return {
208
+ sendMagicLink,
209
+ sendEmailOtp,
210
+ verifyPasswordless,
211
+ isLoading,
212
+ error
213
+ };
214
+ }
215
+
216
+ // src/useAuthonPasskeys.ts
217
+ var import_vue6 = require("vue");
218
+ function useAuthonPasskeys() {
219
+ const state = (0, import_vue6.inject)(AUTHON_KEY);
220
+ if (!state) {
221
+ throw new Error("useAuthonPasskeys() must be called inside a component tree with createAuthon() installed");
222
+ }
223
+ const s = state;
224
+ const isLoading = (0, import_vue6.ref)(false);
225
+ const error = (0, import_vue6.ref)(null);
226
+ async function wrap(fn) {
227
+ isLoading.value = true;
228
+ error.value = null;
229
+ try {
230
+ return await fn();
231
+ } catch (err) {
232
+ error.value = err instanceof Error ? err : new Error(String(err));
233
+ return null;
234
+ } finally {
235
+ isLoading.value = false;
236
+ }
237
+ }
238
+ async function registerPasskey(name) {
239
+ return wrap(() => s.client.registerPasskey(name));
240
+ }
241
+ async function authenticateWithPasskey(email) {
242
+ const result = await wrap(() => s.client.authenticateWithPasskey(email));
243
+ return result !== null;
244
+ }
245
+ async function listPasskeys() {
246
+ return wrap(() => s.client.listPasskeys());
247
+ }
248
+ async function renamePasskey(id, name) {
249
+ return wrap(() => s.client.renamePasskey(id, name));
250
+ }
251
+ async function revokePasskey(id) {
252
+ const result = await wrap(() => s.client.revokePasskey(id));
253
+ return result !== null;
254
+ }
255
+ return {
256
+ registerPasskey,
257
+ authenticateWithPasskey,
258
+ listPasskeys,
259
+ renamePasskey,
260
+ revokePasskey,
261
+ isLoading,
262
+ error
263
+ };
264
+ }
265
+
266
+ // src/components.ts
267
+ var import_vue7 = require("vue");
268
+ var AuthonSignIn = (0, import_vue7.defineComponent)({
118
269
  name: "AuthonSignIn",
119
270
  props: {
120
271
  mode: {
@@ -124,20 +275,20 @@ var AuthonSignIn = (0, import_vue3.defineComponent)({
124
275
  },
125
276
  setup(props) {
126
277
  const { client } = useAuthon();
127
- (0, import_vue3.onMounted)(() => {
278
+ (0, import_vue7.onMounted)(() => {
128
279
  if (props.mode === "popup") {
129
280
  client?.openSignIn();
130
281
  }
131
282
  });
132
283
  return () => {
133
284
  if (props.mode === "embedded") {
134
- return (0, import_vue3.h)("div", { id: "authon-signin-container" });
285
+ return (0, import_vue7.h)("div", { id: "authon-signin-container" });
135
286
  }
136
287
  return null;
137
288
  };
138
289
  }
139
290
  });
140
- var AuthonSignUp = (0, import_vue3.defineComponent)({
291
+ var AuthonSignUp = (0, import_vue7.defineComponent)({
141
292
  name: "AuthonSignUp",
142
293
  props: {
143
294
  mode: {
@@ -147,25 +298,25 @@ var AuthonSignUp = (0, import_vue3.defineComponent)({
147
298
  },
148
299
  setup(props) {
149
300
  const { client } = useAuthon();
150
- (0, import_vue3.onMounted)(() => {
301
+ (0, import_vue7.onMounted)(() => {
151
302
  if (props.mode === "popup") {
152
303
  client?.openSignUp();
153
304
  }
154
305
  });
155
306
  return () => {
156
307
  if (props.mode === "embedded") {
157
- return (0, import_vue3.h)("div", { id: "authon-signup-container" });
308
+ return (0, import_vue7.h)("div", { id: "authon-signup-container" });
158
309
  }
159
310
  return null;
160
311
  };
161
312
  }
162
313
  });
163
- var AuthonUserButton = (0, import_vue3.defineComponent)({
314
+ var AuthonUserButton = (0, import_vue7.defineComponent)({
164
315
  name: "AuthonUserButton",
165
316
  setup() {
166
317
  const { user, isSignedIn, signOut, openSignIn } = useAuthon();
167
- const open = (0, import_vue3.ref)(false);
168
- const initials = (0, import_vue3.computed)(() => {
318
+ const open = (0, import_vue7.ref)(false);
319
+ const initials = (0, import_vue7.computed)(() => {
169
320
  if (!user) return "?";
170
321
  const u = user;
171
322
  if (u.displayName) {
@@ -175,7 +326,7 @@ var AuthonUserButton = (0, import_vue3.defineComponent)({
175
326
  });
176
327
  return () => {
177
328
  if (!isSignedIn) {
178
- return (0, import_vue3.h)(
329
+ return (0, import_vue7.h)(
179
330
  "button",
180
331
  {
181
332
  onClick: () => openSignIn(),
@@ -196,8 +347,8 @@ var AuthonUserButton = (0, import_vue3.defineComponent)({
196
347
  const avatarUrl = user?.avatarUrl;
197
348
  const displayName = user?.displayName;
198
349
  const email = user?.email;
199
- return (0, import_vue3.h)("div", { style: { position: "relative", display: "inline-block" } }, [
200
- (0, import_vue3.h)(
350
+ return (0, import_vue7.h)("div", { style: { position: "relative", display: "inline-block" } }, [
351
+ (0, import_vue7.h)(
201
352
  "button",
202
353
  {
203
354
  onClick: () => open.value = !open.value,
@@ -218,9 +369,9 @@ var AuthonUserButton = (0, import_vue3.defineComponent)({
218
369
  fontWeight: 700
219
370
  }
220
371
  },
221
- avatarUrl ? [(0, import_vue3.h)("img", { src: avatarUrl, alt: displayName ?? "avatar", style: { width: "100%", height: "100%", objectFit: "cover" } })] : [initials.value]
372
+ avatarUrl ? [(0, import_vue7.h)("img", { src: avatarUrl, alt: displayName ?? "avatar", style: { width: "100%", height: "100%", objectFit: "cover" } })] : [initials.value]
222
373
  ),
223
- open.value ? (0, import_vue3.h)(
374
+ open.value ? (0, import_vue7.h)(
224
375
  "div",
225
376
  {
226
377
  style: {
@@ -237,11 +388,11 @@ var AuthonUserButton = (0, import_vue3.defineComponent)({
237
388
  }
238
389
  },
239
390
  [
240
- (0, import_vue3.h)("div", { style: { padding: "12px 16px", borderBottom: "1px solid #f3f4f6" } }, [
241
- displayName && (0, import_vue3.h)("div", { style: { fontSize: "14px", fontWeight: 600, color: "#111827" } }, displayName),
242
- email && (0, import_vue3.h)("div", { style: { fontSize: "12px", color: "#6b7280", marginTop: "2px" } }, email)
391
+ (0, import_vue7.h)("div", { style: { padding: "12px 16px", borderBottom: "1px solid #f3f4f6" } }, [
392
+ displayName && (0, import_vue7.h)("div", { style: { fontSize: "14px", fontWeight: 600, color: "#111827" } }, displayName),
393
+ email && (0, import_vue7.h)("div", { style: { fontSize: "12px", color: "#6b7280", marginTop: "2px" } }, email)
243
394
  ]),
244
- (0, import_vue3.h)(
395
+ (0, import_vue7.h)(
245
396
  "button",
246
397
  {
247
398
  onClick: async () => {
@@ -269,7 +420,7 @@ var AuthonUserButton = (0, import_vue3.defineComponent)({
269
420
  };
270
421
  }
271
422
  });
272
- var AuthonSignedIn = (0, import_vue3.defineComponent)({
423
+ var AuthonSignedIn = (0, import_vue7.defineComponent)({
273
424
  name: "AuthonSignedIn",
274
425
  setup(_, { slots }) {
275
426
  const { isSignedIn, isLoading } = useAuthon();
@@ -279,7 +430,7 @@ var AuthonSignedIn = (0, import_vue3.defineComponent)({
279
430
  };
280
431
  }
281
432
  });
282
- var AuthonSignedOut = (0, import_vue3.defineComponent)({
433
+ var AuthonSignedOut = (0, import_vue7.defineComponent)({
283
434
  name: "AuthonSignedOut",
284
435
  setup(_, { slots }) {
285
436
  const { isSignedIn, isLoading } = useAuthon();
@@ -289,6 +440,163 @@ var AuthonSignedOut = (0, import_vue3.defineComponent)({
289
440
  };
290
441
  }
291
442
  });
443
+
444
+ // src/SocialButton.ts
445
+ var import_vue8 = require("vue");
446
+ var import_shared = require("@authon/shared");
447
+ var import_js2 = require("@authon/js");
448
+ var AuthonSocialButton = (0, import_vue8.defineComponent)({
449
+ name: "AuthonSocialButton",
450
+ props: {
451
+ provider: { type: String, required: true },
452
+ onClick: { type: Function, required: true },
453
+ loading: { type: Boolean, default: false },
454
+ disabled: { type: Boolean, default: false },
455
+ label: { type: String, default: void 0 },
456
+ compact: { type: Boolean, default: false },
457
+ iconSize: { type: Number, default: void 0 },
458
+ borderRadius: { type: Number, default: 10 },
459
+ height: { type: Number, default: 48 },
460
+ size: { type: Number, default: 48 }
461
+ },
462
+ setup(props) {
463
+ const colors = (0, import_vue8.computed)(() => import_shared.PROVIDER_COLORS[props.provider] || { bg: "#333", text: "#fff" });
464
+ const displayName = (0, import_vue8.computed)(() => import_shared.PROVIDER_DISPLAY_NAMES[props.provider] || props.provider);
465
+ const buttonLabel = (0, import_vue8.computed)(() => props.label ?? `Continue with ${displayName.value}`);
466
+ const needsBorder = (0, import_vue8.computed)(() => colors.value.bg.toLowerCase() === "#ffffff");
467
+ const resolvedIconSize = (0, import_vue8.computed)(() => props.iconSize ?? (props.compact ? 24 : 20));
468
+ const iconSvg = (0, import_vue8.computed)(() => {
469
+ const config = (0, import_js2.getProviderButtonConfig)(props.provider);
470
+ return config.iconSvg.replace(/width="\d+"/, `width="${resolvedIconSize.value}"`).replace(/height="\d+"/, `height="${resolvedIconSize.value}"`);
471
+ });
472
+ const spinner = () => (0, import_vue8.h)("span", {
473
+ style: {
474
+ display: "inline-block",
475
+ width: "16px",
476
+ height: "16px",
477
+ border: `2px solid ${colors.value.text}`,
478
+ borderTopColor: "transparent",
479
+ borderRadius: "50%",
480
+ animation: "authon-spin 0.6s linear infinite"
481
+ }
482
+ });
483
+ const icon = () => (0, import_vue8.h)("span", {
484
+ style: { display: "flex", alignItems: "center", flexShrink: 0 },
485
+ innerHTML: iconSvg.value
486
+ });
487
+ return () => {
488
+ const borderStyle = needsBorder.value ? { border: "1px solid #dadce0" } : {};
489
+ if (props.compact) {
490
+ return (0, import_vue8.h)(
491
+ "button",
492
+ {
493
+ style: {
494
+ display: "flex",
495
+ alignItems: "center",
496
+ justifyContent: "center",
497
+ border: "none",
498
+ cursor: "pointer",
499
+ transition: "opacity 0.15s",
500
+ padding: 0,
501
+ backgroundColor: colors.value.bg,
502
+ borderRadius: `${props.borderRadius}px`,
503
+ width: `${props.size}px`,
504
+ height: `${props.size}px`,
505
+ ...borderStyle
506
+ },
507
+ onClick: () => props.onClick(props.provider),
508
+ disabled: props.disabled || props.loading,
509
+ "aria-label": `Sign in with ${displayName.value}`
510
+ },
511
+ [props.loading ? spinner() : icon()]
512
+ );
513
+ }
514
+ return (0, import_vue8.h)(
515
+ "button",
516
+ {
517
+ style: {
518
+ display: "flex",
519
+ alignItems: "center",
520
+ justifyContent: "center",
521
+ gap: "10px",
522
+ paddingLeft: "16px",
523
+ paddingRight: "16px",
524
+ border: "none",
525
+ cursor: "pointer",
526
+ fontFamily: "inherit",
527
+ transition: "opacity 0.15s",
528
+ width: "100%",
529
+ backgroundColor: colors.value.bg,
530
+ color: colors.value.text,
531
+ borderRadius: `${props.borderRadius}px`,
532
+ height: `${props.height}px`,
533
+ ...borderStyle
534
+ },
535
+ onClick: () => props.onClick(props.provider),
536
+ disabled: props.disabled || props.loading,
537
+ "aria-label": `Sign in with ${displayName.value}`
538
+ },
539
+ props.loading ? [spinner()] : [
540
+ icon(),
541
+ (0, import_vue8.h)("span", { style: { fontSize: "15px", fontWeight: 600, whiteSpace: "nowrap" } }, buttonLabel.value)
542
+ ]
543
+ );
544
+ };
545
+ }
546
+ });
547
+ var AuthonSocialButtons = (0, import_vue8.defineComponent)({
548
+ name: "AuthonSocialButtons",
549
+ props: {
550
+ onSuccess: { type: Function, default: void 0 },
551
+ onError: { type: Function, default: void 0 },
552
+ gap: { type: Number, default: void 0 },
553
+ compact: { type: Boolean, default: false },
554
+ labels: { type: Object, default: void 0 }
555
+ },
556
+ setup(props) {
557
+ const { client } = useAuthon();
558
+ const providers = (0, import_vue8.ref)([]);
559
+ const loadingProvider = (0, import_vue8.ref)(null);
560
+ const resolvedGap = (0, import_vue8.computed)(() => props.gap ?? (props.compact ? 12 : 10));
561
+ (0, import_vue8.onMounted)(async () => {
562
+ if (client) {
563
+ providers.value = await client.getProviders();
564
+ }
565
+ });
566
+ const handleClick = async (provider) => {
567
+ if (!client) return;
568
+ loadingProvider.value = provider;
569
+ try {
570
+ await client.signInWithOAuth(provider);
571
+ props.onSuccess?.();
572
+ } catch (e) {
573
+ const error = e instanceof Error ? e : new Error(String(e));
574
+ props.onError?.(error);
575
+ } finally {
576
+ loadingProvider.value = null;
577
+ }
578
+ };
579
+ return () => {
580
+ if (providers.value.length === 0) return null;
581
+ const containerStyle = props.compact ? { display: "flex", flexDirection: "row", flexWrap: "wrap", justifyContent: "center", gap: `${resolvedGap.value}px` } : { display: "flex", flexDirection: "column", gap: `${resolvedGap.value}px` };
582
+ return (0, import_vue8.h)(
583
+ "div",
584
+ { style: containerStyle },
585
+ providers.value.map(
586
+ (provider) => (0, import_vue8.h)(AuthonSocialButton, {
587
+ key: provider,
588
+ provider,
589
+ onClick: handleClick,
590
+ loading: loadingProvider.value === provider,
591
+ disabled: !!loadingProvider.value,
592
+ compact: props.compact,
593
+ label: props.labels?.[provider]
594
+ })
595
+ )
596
+ );
597
+ };
598
+ }
599
+ });
292
600
  // Annotate the CommonJS export names for ESM import in node:
293
601
  0 && (module.exports = {
294
602
  AUTHON_KEY,
@@ -296,9 +604,14 @@ var AuthonSignedOut = (0, import_vue3.defineComponent)({
296
604
  AuthonSignUp,
297
605
  AuthonSignedIn,
298
606
  AuthonSignedOut,
607
+ AuthonSocialButton,
608
+ AuthonSocialButtons,
299
609
  AuthonUserButton,
300
610
  createAuthon,
301
611
  useAuthon,
612
+ useAuthonPasskeys,
613
+ useAuthonPasswordless,
614
+ useAuthonWeb3,
302
615
  useUser
303
616
  });
304
617
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/plugin.ts","../src/composables.ts","../src/components.ts"],"sourcesContent":["export { createAuthon, AUTHON_KEY } from './plugin';\nexport type { AuthonState, AuthonPluginOptions } from './plugin';\nexport { useAuthon, useUser } from './composables';\nexport {\n AuthonSignIn,\n AuthonSignUp,\n AuthonUserButton,\n AuthonSignedIn,\n AuthonSignedOut,\n} from './components';\n","import type { App } from 'vue';\nimport { reactive } from 'vue';\nimport { Authon } from '@authon/js';\nimport type { AuthonConfig } from '@authon/js';\nimport type { AuthonUser } from '@authon/shared';\n\nexport const AUTHON_KEY = Symbol('authon');\n\nexport interface AuthonState {\n isSignedIn: boolean;\n isLoading: boolean;\n user: AuthonUser | null;\n client: Authon | null;\n}\n\nexport interface AuthonPluginOptions {\n publishableKey: string;\n config?: AuthonConfig;\n}\n\nexport function createAuthon(options: AuthonPluginOptions) {\n const state = reactive<AuthonState>({\n isSignedIn: false,\n isLoading: true,\n user: null,\n client: null,\n });\n\n return {\n install(app: App) {\n const client = new Authon(options.publishableKey, options.config);\n state.client = client as unknown as Authon;\n\n client.on('signedIn', (user) => {\n state.user = user as AuthonUser;\n state.isSignedIn = true;\n state.isLoading = false;\n });\n\n client.on('signedOut', () => {\n state.user = null;\n state.isSignedIn = false;\n });\n\n client.on('error', () => {\n state.isLoading = false;\n });\n\n const existingUser = client.getUser();\n if (existingUser) {\n state.user = existingUser as AuthonUser;\n state.isSignedIn = true;\n }\n state.isLoading = false;\n\n app.provide(AUTHON_KEY, state);\n\n app.config.globalProperties.$authon = state;\n },\n };\n}\n","import { inject, computed } from 'vue';\nimport type { ComputedRef } from 'vue';\nimport { AUTHON_KEY } from './plugin';\nimport type { AuthonState } from './plugin';\nimport type { AuthonUser } from '@authon/shared';\n\nfunction requireState(): AuthonState {\n const state = inject<AuthonState>(AUTHON_KEY);\n if (!state) {\n throw new Error('useAuthon() must be called inside a component tree with createAuthon() installed');\n }\n return state;\n}\n\nexport function useAuthon(): AuthonState & {\n signOut: () => Promise<void>;\n openSignIn: () => Promise<void>;\n openSignUp: () => Promise<void>;\n getToken: () => string | null;\n} {\n const s = requireState();\n\n async function signOut(): Promise<void> {\n await s.client?.signOut();\n s.user = null;\n s.isSignedIn = false;\n }\n\n async function openSignIn(): Promise<void> {\n await s.client?.openSignIn();\n }\n\n async function openSignUp(): Promise<void> {\n await s.client?.openSignUp();\n }\n\n function getToken(): string | null {\n return s.client?.getToken() ?? null;\n }\n\n return {\n ...s,\n signOut,\n openSignIn,\n openSignUp,\n getToken,\n };\n}\n\nexport function useUser(): { user: ComputedRef<AuthonUser | null>; isLoading: ComputedRef<boolean> } {\n const s = requireState();\n return {\n user: computed(() => s.user),\n isLoading: computed(() => s.isLoading),\n };\n}\n","import { defineComponent, h, onMounted, ref, computed } from 'vue';\nimport { useAuthon } from './composables';\n\nexport const AuthonSignIn = defineComponent({\n name: 'AuthonSignIn',\n props: {\n mode: {\n type: String as () => 'popup' | 'embedded',\n default: 'popup',\n },\n },\n setup(props) {\n const { client } = useAuthon();\n\n onMounted(() => {\n if (props.mode === 'popup') {\n client?.openSignIn();\n }\n });\n\n return () => {\n if (props.mode === 'embedded') {\n return h('div', { id: 'authon-signin-container' });\n }\n return null;\n };\n },\n});\n\nexport const AuthonSignUp = defineComponent({\n name: 'AuthonSignUp',\n props: {\n mode: {\n type: String as () => 'popup' | 'embedded',\n default: 'popup',\n },\n },\n setup(props) {\n const { client } = useAuthon();\n\n onMounted(() => {\n if (props.mode === 'popup') {\n client?.openSignUp();\n }\n });\n\n return () => {\n if (props.mode === 'embedded') {\n return h('div', { id: 'authon-signup-container' });\n }\n return null;\n };\n },\n});\n\nexport const AuthonUserButton = defineComponent({\n name: 'AuthonUserButton',\n setup() {\n const { user, isSignedIn, signOut, openSignIn } = useAuthon();\n const open = ref(false);\n\n const initials = computed(() => {\n if (!user) return '?';\n const u = user as typeof user;\n if ((u as { displayName?: string | null }).displayName) {\n return ((u as { displayName: string }).displayName)\n .split(' ')\n .map((n: string) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n }\n return ((u as { email?: string | null }).email?.[0] ?? '?').toUpperCase();\n });\n\n return () => {\n if (!isSignedIn) {\n return h(\n 'button',\n {\n onClick: () => openSignIn(),\n style: {\n padding: '8px 16px',\n borderRadius: '8px',\n border: 'none',\n background: 'linear-gradient(135deg, #7c3aed, #4f46e5)',\n color: '#fff',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 600,\n },\n },\n 'Sign In',\n );\n }\n\n const avatarUrl = (user as { avatarUrl?: string | null } | null)?.avatarUrl;\n const displayName = (user as { displayName?: string | null } | null)?.displayName;\n const email = (user as { email?: string | null } | null)?.email;\n\n return h('div', { style: { position: 'relative', display: 'inline-block' } }, [\n h(\n 'button',\n {\n onClick: () => (open.value = !open.value),\n style: {\n width: '36px',\n height: '36px',\n borderRadius: '50%',\n border: '2px solid #7c3aed',\n background: avatarUrl ? 'transparent' : 'linear-gradient(135deg, #7c3aed, #4f46e5)',\n cursor: 'pointer',\n padding: 0,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#fff',\n fontSize: '13px',\n fontWeight: 700,\n },\n },\n avatarUrl\n ? [h('img', { src: avatarUrl, alt: displayName ?? 'avatar', style: { width: '100%', height: '100%', objectFit: 'cover' } })]\n : [initials.value],\n ),\n open.value\n ? h(\n 'div',\n {\n style: {\n position: 'absolute',\n right: 0,\n top: '44px',\n minWidth: '200px',\n background: '#fff',\n border: '1px solid #e5e7eb',\n borderRadius: '12px',\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n zIndex: 9999,\n overflow: 'hidden',\n },\n },\n [\n h('div', { style: { padding: '12px 16px', borderBottom: '1px solid #f3f4f6' } }, [\n displayName && h('div', { style: { fontSize: '14px', fontWeight: 600, color: '#111827' } }, displayName),\n email && h('div', { style: { fontSize: '12px', color: '#6b7280', marginTop: '2px' } }, email),\n ]),\n h(\n 'button',\n {\n onClick: async () => {\n open.value = false;\n await signOut();\n },\n style: {\n display: 'block',\n width: '100%',\n padding: '10px 16px',\n textAlign: 'left',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n color: '#ef4444',\n fontWeight: 500,\n },\n },\n 'Sign out',\n ),\n ],\n )\n : null,\n ]);\n };\n },\n});\n\nexport const AuthonSignedIn = defineComponent({\n name: 'AuthonSignedIn',\n setup(_, { slots }) {\n const { isSignedIn, isLoading } = useAuthon();\n return () => {\n if (isLoading || !isSignedIn) return null;\n return slots.default?.();\n };\n },\n});\n\nexport const AuthonSignedOut = defineComponent({\n name: 'AuthonSignedOut',\n setup(_, { slots }) {\n const { isSignedIn, isLoading } = useAuthon();\n return () => {\n if (isLoading || isSignedIn) return null;\n return slots.default?.();\n };\n },\n});\n"],"mappings":"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","names":["import_vue","import_vue"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/plugin.ts","../src/composables.ts","../src/useAuthonWeb3.ts","../src/useAuthonPasswordless.ts","../src/useAuthonPasskeys.ts","../src/components.ts","../src/SocialButton.ts"],"sourcesContent":["export { createAuthon, AUTHON_KEY } from './plugin';\nexport type { AuthonState, AuthonPluginOptions } from './plugin';\nexport { useAuthon, useUser } from './composables';\nexport { useAuthonWeb3 } from './useAuthonWeb3';\nexport type { UseAuthonWeb3Return, LinkWalletParams } from './useAuthonWeb3';\nexport { useAuthonPasswordless } from './useAuthonPasswordless';\nexport type { UseAuthonPasswordlessReturn } from './useAuthonPasswordless';\nexport { useAuthonPasskeys } from './useAuthonPasskeys';\nexport type { UseAuthonPasskeysReturn } from './useAuthonPasskeys';\nexport {\n AuthonSignIn,\n AuthonSignUp,\n AuthonUserButton,\n AuthonSignedIn,\n AuthonSignedOut,\n} from './components';\nexport { AuthonSocialButton, AuthonSocialButtons } from './SocialButton';\n","import type { App } from 'vue';\nimport { reactive } from 'vue';\nimport { Authon } from '@authon/js';\nimport type { AuthonConfig } from '@authon/js';\nimport type { AuthonUser } from '@authon/shared';\n\nexport const AUTHON_KEY = Symbol('authon');\n\nexport interface AuthonState {\n isSignedIn: boolean;\n isLoading: boolean;\n user: AuthonUser | null;\n client: Authon | null;\n}\n\nexport interface AuthonPluginOptions {\n publishableKey: string;\n config?: AuthonConfig;\n}\n\nexport function createAuthon(options: AuthonPluginOptions) {\n const state = reactive<AuthonState>({\n isSignedIn: false,\n isLoading: true,\n user: null,\n client: null,\n });\n\n return {\n install(app: App) {\n const client = new Authon(options.publishableKey, options.config);\n state.client = client as unknown as Authon;\n\n client.on('signedIn', (user) => {\n state.user = user as AuthonUser;\n state.isSignedIn = true;\n state.isLoading = false;\n });\n\n client.on('signedOut', () => {\n state.user = null;\n state.isSignedIn = false;\n });\n\n client.on('error', () => {\n state.isLoading = false;\n });\n\n const existingUser = client.getUser();\n if (existingUser) {\n state.user = existingUser as AuthonUser;\n state.isSignedIn = true;\n }\n state.isLoading = false;\n\n app.provide(AUTHON_KEY, state);\n\n app.config.globalProperties.$authon = state;\n },\n };\n}\n","import { inject, computed } from 'vue';\nimport type { ComputedRef } from 'vue';\nimport { AUTHON_KEY } from './plugin';\nimport type { AuthonState } from './plugin';\nimport type { AuthonUser } from '@authon/shared';\n\nfunction requireState(): AuthonState {\n const state = inject<AuthonState>(AUTHON_KEY);\n if (!state) {\n throw new Error('useAuthon() must be called inside a component tree with createAuthon() installed');\n }\n return state;\n}\n\nexport function useAuthon(): AuthonState & {\n signOut: () => Promise<void>;\n openSignIn: () => Promise<void>;\n openSignUp: () => Promise<void>;\n getToken: () => string | null;\n} {\n const s = requireState();\n\n async function signOut(): Promise<void> {\n await s.client?.signOut();\n s.user = null;\n s.isSignedIn = false;\n }\n\n async function openSignIn(): Promise<void> {\n await s.client?.openSignIn();\n }\n\n async function openSignUp(): Promise<void> {\n await s.client?.openSignUp();\n }\n\n function getToken(): string | null {\n return s.client?.getToken() ?? null;\n }\n\n return {\n ...s,\n signOut,\n openSignIn,\n openSignUp,\n getToken,\n };\n}\n\nexport function useUser(): { user: ComputedRef<AuthonUser | null>; isLoading: ComputedRef<boolean> } {\n const s = requireState();\n return {\n user: computed(() => s.user),\n isLoading: computed(() => s.isLoading),\n };\n}\n","import { ref } from 'vue';\nimport type { Ref } from 'vue';\nimport type { Web3Chain, Web3NonceResponse, Web3Wallet, Web3WalletType } from '@authon/shared';\nimport { AUTHON_KEY } from './plugin';\nimport type { AuthonState } from './plugin';\nimport { inject } from 'vue';\n\nexport interface LinkWalletParams {\n address: string;\n chain: Web3Chain;\n walletType: Web3WalletType;\n chainId?: number;\n message: string;\n signature: string;\n}\n\nexport interface UseAuthonWeb3Return {\n getNonce: (\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n chainId?: number,\n ) => Promise<Web3NonceResponse | null>;\n verify: (\n message: string,\n signature: string,\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n ) => Promise<boolean>;\n listWallets: () => Promise<Web3Wallet[] | null>;\n linkWallet: (params: LinkWalletParams) => Promise<Web3Wallet | null>;\n unlinkWallet: (walletId: string) => Promise<boolean>;\n isLoading: Ref<boolean>;\n error: Ref<Error | null>;\n}\n\nexport function useAuthonWeb3(): UseAuthonWeb3Return {\n const state = inject<AuthonState>(AUTHON_KEY);\n if (!state) {\n throw new Error('useAuthonWeb3() must be called inside a component tree with createAuthon() installed');\n }\n const s = state;\n\n const isLoading = ref<boolean>(false);\n const error = ref<Error | null>(null);\n\n async function wrap<T>(fn: () => Promise<T>): Promise<T | null> {\n isLoading.value = true;\n error.value = null;\n try {\n return await fn();\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n return null;\n } finally {\n isLoading.value = false;\n }\n }\n\n async function getNonce(\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n chainId?: number,\n ): Promise<Web3NonceResponse | null> {\n return wrap(() => s.client!.web3GetNonce(address, chain, walletType, chainId));\n }\n\n async function verify(\n message: string,\n signature: string,\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n ): Promise<boolean> {\n const result = await wrap(() =>\n s.client!.web3Verify(message, signature, address, chain, walletType),\n );\n return result !== null;\n }\n\n async function listWallets(): Promise<Web3Wallet[] | null> {\n return wrap(() => s.client!.listWallets());\n }\n\n async function linkWallet(params: LinkWalletParams): Promise<Web3Wallet | null> {\n return wrap(() => s.client!.linkWallet(params));\n }\n\n async function unlinkWallet(walletId: string): Promise<boolean> {\n const result = await wrap(() => s.client!.unlinkWallet(walletId));\n return result !== null;\n }\n\n return {\n getNonce,\n verify,\n listWallets,\n linkWallet,\n unlinkWallet,\n isLoading,\n error,\n };\n}\n","import { ref, inject } from 'vue';\nimport type { Ref } from 'vue';\nimport { AUTHON_KEY } from './plugin';\nimport type { AuthonState } from './plugin';\n\nexport interface UseAuthonPasswordlessReturn {\n sendMagicLink: (email: string) => Promise<boolean>;\n sendEmailOtp: (email: string) => Promise<boolean>;\n verifyPasswordless: (opts: { token?: string; email?: string; code?: string }) => Promise<boolean>;\n isLoading: Ref<boolean>;\n error: Ref<Error | null>;\n}\n\nexport function useAuthonPasswordless(): UseAuthonPasswordlessReturn {\n const state = inject<AuthonState>(AUTHON_KEY);\n if (!state) {\n throw new Error('useAuthonPasswordless() must be called inside a component tree with createAuthon() installed');\n }\n const s = state;\n\n const isLoading = ref<boolean>(false);\n const error = ref<Error | null>(null);\n\n async function wrap<T>(fn: () => Promise<T>): Promise<T | null> {\n isLoading.value = true;\n error.value = null;\n try {\n return await fn();\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n return null;\n } finally {\n isLoading.value = false;\n }\n }\n\n async function sendMagicLink(email: string): Promise<boolean> {\n const result = await wrap(() => s.client!.sendMagicLink(email));\n return result !== null;\n }\n\n async function sendEmailOtp(email: string): Promise<boolean> {\n const result = await wrap(() => s.client!.sendEmailOtp(email));\n return result !== null;\n }\n\n async function verifyPasswordless(opts: {\n token?: string;\n email?: string;\n code?: string;\n }): Promise<boolean> {\n const result = await wrap(() => s.client!.verifyPasswordless(opts));\n return result !== null;\n }\n\n return {\n sendMagicLink,\n sendEmailOtp,\n verifyPasswordless,\n isLoading,\n error,\n };\n}\n","import { ref, inject } from 'vue';\nimport type { Ref } from 'vue';\nimport type { PasskeyCredential } from '@authon/shared';\nimport { AUTHON_KEY } from './plugin';\nimport type { AuthonState } from './plugin';\n\nexport interface UseAuthonPasskeysReturn {\n registerPasskey: (name?: string) => Promise<PasskeyCredential | null>;\n authenticateWithPasskey: (email?: string) => Promise<boolean>;\n listPasskeys: () => Promise<PasskeyCredential[] | null>;\n renamePasskey: (id: string, name: string) => Promise<PasskeyCredential | null>;\n revokePasskey: (id: string) => Promise<boolean>;\n isLoading: Ref<boolean>;\n error: Ref<Error | null>;\n}\n\nexport function useAuthonPasskeys(): UseAuthonPasskeysReturn {\n const state = inject<AuthonState>(AUTHON_KEY);\n if (!state) {\n throw new Error('useAuthonPasskeys() must be called inside a component tree with createAuthon() installed');\n }\n const s = state;\n\n const isLoading = ref<boolean>(false);\n const error = ref<Error | null>(null);\n\n async function wrap<T>(fn: () => Promise<T>): Promise<T | null> {\n isLoading.value = true;\n error.value = null;\n try {\n return await fn();\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n return null;\n } finally {\n isLoading.value = false;\n }\n }\n\n async function registerPasskey(name?: string): Promise<PasskeyCredential | null> {\n return wrap(() => s.client!.registerPasskey(name));\n }\n\n async function authenticateWithPasskey(email?: string): Promise<boolean> {\n const result = await wrap(() => s.client!.authenticateWithPasskey(email));\n return result !== null;\n }\n\n async function listPasskeys(): Promise<PasskeyCredential[] | null> {\n return wrap(() => s.client!.listPasskeys());\n }\n\n async function renamePasskey(id: string, name: string): Promise<PasskeyCredential | null> {\n return wrap(() => s.client!.renamePasskey(id, name));\n }\n\n async function revokePasskey(id: string): Promise<boolean> {\n const result = await wrap(() => s.client!.revokePasskey(id));\n return result !== null;\n }\n\n return {\n registerPasskey,\n authenticateWithPasskey,\n listPasskeys,\n renamePasskey,\n revokePasskey,\n isLoading,\n error,\n };\n}\n","import { defineComponent, h, onMounted, ref, computed } from 'vue';\nimport { useAuthon } from './composables';\n\nexport const AuthonSignIn = defineComponent({\n name: 'AuthonSignIn',\n props: {\n mode: {\n type: String as () => 'popup' | 'embedded',\n default: 'popup',\n },\n },\n setup(props) {\n const { client } = useAuthon();\n\n onMounted(() => {\n if (props.mode === 'popup') {\n client?.openSignIn();\n }\n });\n\n return () => {\n if (props.mode === 'embedded') {\n return h('div', { id: 'authon-signin-container' });\n }\n return null;\n };\n },\n});\n\nexport const AuthonSignUp = defineComponent({\n name: 'AuthonSignUp',\n props: {\n mode: {\n type: String as () => 'popup' | 'embedded',\n default: 'popup',\n },\n },\n setup(props) {\n const { client } = useAuthon();\n\n onMounted(() => {\n if (props.mode === 'popup') {\n client?.openSignUp();\n }\n });\n\n return () => {\n if (props.mode === 'embedded') {\n return h('div', { id: 'authon-signup-container' });\n }\n return null;\n };\n },\n});\n\nexport const AuthonUserButton = defineComponent({\n name: 'AuthonUserButton',\n setup() {\n const { user, isSignedIn, signOut, openSignIn } = useAuthon();\n const open = ref(false);\n\n const initials = computed(() => {\n if (!user) return '?';\n const u = user as typeof user;\n if ((u as { displayName?: string | null }).displayName) {\n return ((u as { displayName: string }).displayName)\n .split(' ')\n .map((n: string) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n }\n return ((u as { email?: string | null }).email?.[0] ?? '?').toUpperCase();\n });\n\n return () => {\n if (!isSignedIn) {\n return h(\n 'button',\n {\n onClick: () => openSignIn(),\n style: {\n padding: '8px 16px',\n borderRadius: '8px',\n border: 'none',\n background: 'linear-gradient(135deg, #7c3aed, #4f46e5)',\n color: '#fff',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 600,\n },\n },\n 'Sign In',\n );\n }\n\n const avatarUrl = (user as { avatarUrl?: string | null } | null)?.avatarUrl;\n const displayName = (user as { displayName?: string | null } | null)?.displayName;\n const email = (user as { email?: string | null } | null)?.email;\n\n return h('div', { style: { position: 'relative', display: 'inline-block' } }, [\n h(\n 'button',\n {\n onClick: () => (open.value = !open.value),\n style: {\n width: '36px',\n height: '36px',\n borderRadius: '50%',\n border: '2px solid #7c3aed',\n background: avatarUrl ? 'transparent' : 'linear-gradient(135deg, #7c3aed, #4f46e5)',\n cursor: 'pointer',\n padding: 0,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#fff',\n fontSize: '13px',\n fontWeight: 700,\n },\n },\n avatarUrl\n ? [h('img', { src: avatarUrl, alt: displayName ?? 'avatar', style: { width: '100%', height: '100%', objectFit: 'cover' } })]\n : [initials.value],\n ),\n open.value\n ? h(\n 'div',\n {\n style: {\n position: 'absolute',\n right: 0,\n top: '44px',\n minWidth: '200px',\n background: '#fff',\n border: '1px solid #e5e7eb',\n borderRadius: '12px',\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n zIndex: 9999,\n overflow: 'hidden',\n },\n },\n [\n h('div', { style: { padding: '12px 16px', borderBottom: '1px solid #f3f4f6' } }, [\n displayName && h('div', { style: { fontSize: '14px', fontWeight: 600, color: '#111827' } }, displayName),\n email && h('div', { style: { fontSize: '12px', color: '#6b7280', marginTop: '2px' } }, email),\n ]),\n h(\n 'button',\n {\n onClick: async () => {\n open.value = false;\n await signOut();\n },\n style: {\n display: 'block',\n width: '100%',\n padding: '10px 16px',\n textAlign: 'left',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n color: '#ef4444',\n fontWeight: 500,\n },\n },\n 'Sign out',\n ),\n ],\n )\n : null,\n ]);\n };\n },\n});\n\nexport const AuthonSignedIn = defineComponent({\n name: 'AuthonSignedIn',\n setup(_, { slots }) {\n const { isSignedIn, isLoading } = useAuthon();\n return () => {\n if (isLoading || !isSignedIn) return null;\n return slots.default?.();\n };\n },\n});\n\nexport const AuthonSignedOut = defineComponent({\n name: 'AuthonSignedOut',\n setup(_, { slots }) {\n const { isSignedIn, isLoading } = useAuthon();\n return () => {\n if (isLoading || isSignedIn) return null;\n return slots.default?.();\n };\n },\n});\n","import { defineComponent, h, ref, computed, onMounted, type PropType } from 'vue';\nimport { PROVIDER_COLORS, PROVIDER_DISPLAY_NAMES, type OAuthProviderType } from '@authon/shared';\nimport { getProviderButtonConfig } from '@authon/js';\nimport { useAuthon } from './composables';\n\nexport const AuthonSocialButton = defineComponent({\n name: 'AuthonSocialButton',\n props: {\n provider: { type: String as PropType<OAuthProviderType>, required: true },\n onClick: { type: Function as PropType<(provider: OAuthProviderType) => void | Promise<void>>, required: true },\n loading: { type: Boolean, default: false },\n disabled: { type: Boolean, default: false },\n label: { type: String, default: undefined },\n compact: { type: Boolean, default: false },\n iconSize: { type: Number, default: undefined },\n borderRadius: { type: Number, default: 10 },\n height: { type: Number, default: 48 },\n size: { type: Number, default: 48 },\n },\n setup(props) {\n const colors = computed(() => PROVIDER_COLORS[props.provider] || { bg: '#333', text: '#fff' });\n const displayName = computed(() => PROVIDER_DISPLAY_NAMES[props.provider] || props.provider);\n const buttonLabel = computed(() => props.label ?? `Continue with ${displayName.value}`);\n const needsBorder = computed(() => colors.value.bg.toLowerCase() === '#ffffff');\n const resolvedIconSize = computed(() => props.iconSize ?? (props.compact ? 24 : 20));\n\n const iconSvg = computed(() => {\n const config = getProviderButtonConfig(props.provider);\n return config.iconSvg\n .replace(/width=\"\\d+\"/, `width=\"${resolvedIconSize.value}\"`)\n .replace(/height=\"\\d+\"/, `height=\"${resolvedIconSize.value}\"`);\n });\n\n const spinner = () =>\n h('span', {\n style: {\n display: 'inline-block',\n width: '16px',\n height: '16px',\n border: `2px solid ${colors.value.text}`,\n borderTopColor: 'transparent',\n borderRadius: '50%',\n animation: 'authon-spin 0.6s linear infinite',\n },\n });\n\n const icon = () =>\n h('span', {\n style: { display: 'flex', alignItems: 'center', flexShrink: 0 },\n innerHTML: iconSvg.value,\n });\n\n return () => {\n const borderStyle = needsBorder.value ? { border: '1px solid #dadce0' } : {};\n\n if (props.compact) {\n return h(\n 'button',\n {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n cursor: 'pointer',\n transition: 'opacity 0.15s',\n padding: 0,\n backgroundColor: colors.value.bg,\n borderRadius: `${props.borderRadius}px`,\n width: `${props.size}px`,\n height: `${props.size}px`,\n ...borderStyle,\n },\n onClick: () => props.onClick(props.provider),\n disabled: props.disabled || props.loading,\n 'aria-label': `Sign in with ${displayName.value}`,\n },\n [props.loading ? spinner() : icon()],\n );\n }\n\n return h(\n 'button',\n {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '10px',\n paddingLeft: '16px',\n paddingRight: '16px',\n border: 'none',\n cursor: 'pointer',\n fontFamily: 'inherit',\n transition: 'opacity 0.15s',\n width: '100%',\n backgroundColor: colors.value.bg,\n color: colors.value.text,\n borderRadius: `${props.borderRadius}px`,\n height: `${props.height}px`,\n ...borderStyle,\n },\n onClick: () => props.onClick(props.provider),\n disabled: props.disabled || props.loading,\n 'aria-label': `Sign in with ${displayName.value}`,\n },\n props.loading\n ? [spinner()]\n : [\n icon(),\n h('span', { style: { fontSize: '15px', fontWeight: 600, whiteSpace: 'nowrap' } }, buttonLabel.value),\n ],\n );\n };\n },\n});\n\nexport const AuthonSocialButtons = defineComponent({\n name: 'AuthonSocialButtons',\n props: {\n onSuccess: { type: Function as PropType<() => void>, default: undefined },\n onError: { type: Function as PropType<(error: Error) => void>, default: undefined },\n gap: { type: Number, default: undefined },\n compact: { type: Boolean, default: false },\n labels: { type: Object as PropType<Partial<Record<OAuthProviderType, string>>>, default: undefined },\n },\n setup(props) {\n const { client } = useAuthon();\n const providers = ref<OAuthProviderType[]>([]);\n const loadingProvider = ref<string | null>(null);\n const resolvedGap = computed(() => props.gap ?? (props.compact ? 12 : 10));\n\n onMounted(async () => {\n if (client) {\n providers.value = await client.getProviders();\n }\n });\n\n const handleClick = async (provider: OAuthProviderType) => {\n if (!client) return;\n loadingProvider.value = provider;\n try {\n await client.signInWithOAuth(provider);\n props.onSuccess?.();\n } catch (e: any) {\n const error = e instanceof Error ? e : new Error(String(e));\n props.onError?.(error);\n } finally {\n loadingProvider.value = null;\n }\n };\n\n return () => {\n if (providers.value.length === 0) return null;\n\n const containerStyle = props.compact\n ? { display: 'flex', flexDirection: 'row' as const, flexWrap: 'wrap' as const, justifyContent: 'center', gap: `${resolvedGap.value}px` }\n : { display: 'flex', flexDirection: 'column' as const, gap: `${resolvedGap.value}px` };\n\n return h(\n 'div',\n { style: containerStyle },\n providers.value.map((provider) =>\n h(AuthonSocialButton, {\n key: provider,\n provider,\n onClick: handleClick,\n loading: loadingProvider.value === provider,\n disabled: !!loadingProvider.value,\n compact: props.compact,\n label: props.labels?.[provider],\n }),\n ),\n );\n };\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,iBAAyB;AACzB,gBAAuB;AAIhB,IAAM,aAAa,uBAAO,QAAQ;AAclC,SAAS,aAAa,SAA8B;AACzD,QAAM,YAAQ,qBAAsB;AAAA,IAClC,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AAED,SAAO;AAAA,IACL,QAAQ,KAAU;AAChB,YAAM,SAAS,IAAI,iBAAO,QAAQ,gBAAgB,QAAQ,MAAM;AAChE,YAAM,SAAS;AAEf,aAAO,GAAG,YAAY,CAAC,SAAS;AAC9B,cAAM,OAAO;AACb,cAAM,aAAa;AACnB,cAAM,YAAY;AAAA,MACpB,CAAC;AAED,aAAO,GAAG,aAAa,MAAM;AAC3B,cAAM,OAAO;AACb,cAAM,aAAa;AAAA,MACrB,CAAC;AAED,aAAO,GAAG,SAAS,MAAM;AACvB,cAAM,YAAY;AAAA,MACpB,CAAC;AAED,YAAM,eAAe,OAAO,QAAQ;AACpC,UAAI,cAAc;AAChB,cAAM,OAAO;AACb,cAAM,aAAa;AAAA,MACrB;AACA,YAAM,YAAY;AAElB,UAAI,QAAQ,YAAY,KAAK;AAE7B,UAAI,OAAO,iBAAiB,UAAU;AAAA,IACxC;AAAA,EACF;AACF;;;AC5DA,IAAAA,cAAiC;AAMjC,SAAS,eAA4B;AACnC,QAAM,YAAQ,oBAAoB,UAAU;AAC5C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,kFAAkF;AAAA,EACpG;AACA,SAAO;AACT;AAEO,SAAS,YAKd;AACA,QAAM,IAAI,aAAa;AAEvB,iBAAe,UAAyB;AACtC,UAAM,EAAE,QAAQ,QAAQ;AACxB,MAAE,OAAO;AACT,MAAE,aAAa;AAAA,EACjB;AAEA,iBAAe,aAA4B;AACzC,UAAM,EAAE,QAAQ,WAAW;AAAA,EAC7B;AAEA,iBAAe,aAA4B;AACzC,UAAM,EAAE,QAAQ,WAAW;AAAA,EAC7B;AAEA,WAAS,WAA0B;AACjC,WAAO,EAAE,QAAQ,SAAS,KAAK;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,UAAqF;AACnG,QAAM,IAAI,aAAa;AACvB,SAAO;AAAA,IACL,UAAM,sBAAS,MAAM,EAAE,IAAI;AAAA,IAC3B,eAAW,sBAAS,MAAM,EAAE,SAAS;AAAA,EACvC;AACF;;;ACvDA,IAAAC,cAAoB;AAKpB,IAAAC,cAAuB;AAgChB,SAAS,gBAAqC;AACnD,QAAM,YAAQ,oBAAoB,UAAU;AAC5C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,sFAAsF;AAAA,EACxG;AACA,QAAM,IAAI;AAEV,QAAM,gBAAY,iBAAa,KAAK;AACpC,QAAM,YAAQ,iBAAkB,IAAI;AAEpC,iBAAe,KAAQ,IAAyC;AAC9D,cAAU,QAAQ;AAClB,UAAM,QAAQ;AACd,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,aAAO;AAAA,IACT,UAAE;AACA,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AAEA,iBAAe,SACb,SACA,OACA,YACA,SACmC;AACnC,WAAO,KAAK,MAAM,EAAE,OAAQ,aAAa,SAAS,OAAO,YAAY,OAAO,CAAC;AAAA,EAC/E;AAEA,iBAAe,OACb,SACA,WACA,SACA,OACA,YACkB;AAClB,UAAM,SAAS,MAAM;AAAA,MAAK,MACxB,EAAE,OAAQ,WAAW,SAAS,WAAW,SAAS,OAAO,UAAU;AAAA,IACrE;AACA,WAAO,WAAW;AAAA,EACpB;AAEA,iBAAe,cAA4C;AACzD,WAAO,KAAK,MAAM,EAAE,OAAQ,YAAY,CAAC;AAAA,EAC3C;AAEA,iBAAe,WAAW,QAAsD;AAC9E,WAAO,KAAK,MAAM,EAAE,OAAQ,WAAW,MAAM,CAAC;AAAA,EAChD;AAEA,iBAAe,aAAa,UAAoC;AAC9D,UAAM,SAAS,MAAM,KAAK,MAAM,EAAE,OAAQ,aAAa,QAAQ,CAAC;AAChE,WAAO,WAAW;AAAA,EACpB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACxGA,IAAAC,cAA4B;AAarB,SAAS,wBAAqD;AACnE,QAAM,YAAQ,oBAAoB,UAAU;AAC5C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,8FAA8F;AAAA,EAChH;AACA,QAAM,IAAI;AAEV,QAAM,gBAAY,iBAAa,KAAK;AACpC,QAAM,YAAQ,iBAAkB,IAAI;AAEpC,iBAAe,KAAQ,IAAyC;AAC9D,cAAU,QAAQ;AAClB,UAAM,QAAQ;AACd,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,aAAO;AAAA,IACT,UAAE;AACA,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AAEA,iBAAe,cAAc,OAAiC;AAC5D,UAAM,SAAS,MAAM,KAAK,MAAM,EAAE,OAAQ,cAAc,KAAK,CAAC;AAC9D,WAAO,WAAW;AAAA,EACpB;AAEA,iBAAe,aAAa,OAAiC;AAC3D,UAAM,SAAS,MAAM,KAAK,MAAM,EAAE,OAAQ,aAAa,KAAK,CAAC;AAC7D,WAAO,WAAW;AAAA,EACpB;AAEA,iBAAe,mBAAmB,MAIb;AACnB,UAAM,SAAS,MAAM,KAAK,MAAM,EAAE,OAAQ,mBAAmB,IAAI,CAAC;AAClE,WAAO,WAAW;AAAA,EACpB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC9DA,IAAAC,cAA4B;AAgBrB,SAAS,oBAA6C;AAC3D,QAAM,YAAQ,oBAAoB,UAAU;AAC5C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,0FAA0F;AAAA,EAC5G;AACA,QAAM,IAAI;AAEV,QAAM,gBAAY,iBAAa,KAAK;AACpC,QAAM,YAAQ,iBAAkB,IAAI;AAEpC,iBAAe,KAAQ,IAAyC;AAC9D,cAAU,QAAQ;AAClB,UAAM,QAAQ;AACd,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,aAAO;AAAA,IACT,UAAE;AACA,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AAEA,iBAAe,gBAAgB,MAAkD;AAC/E,WAAO,KAAK,MAAM,EAAE,OAAQ,gBAAgB,IAAI,CAAC;AAAA,EACnD;AAEA,iBAAe,wBAAwB,OAAkC;AACvE,UAAM,SAAS,MAAM,KAAK,MAAM,EAAE,OAAQ,wBAAwB,KAAK,CAAC;AACxE,WAAO,WAAW;AAAA,EACpB;AAEA,iBAAe,eAAoD;AACjE,WAAO,KAAK,MAAM,EAAE,OAAQ,aAAa,CAAC;AAAA,EAC5C;AAEA,iBAAe,cAAc,IAAY,MAAiD;AACxF,WAAO,KAAK,MAAM,EAAE,OAAQ,cAAc,IAAI,IAAI,CAAC;AAAA,EACrD;AAEA,iBAAe,cAAc,IAA8B;AACzD,UAAM,SAAS,MAAM,KAAK,MAAM,EAAE,OAAQ,cAAc,EAAE,CAAC;AAC3D,WAAO,WAAW;AAAA,EACpB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACtEA,IAAAC,cAA6D;AAGtD,IAAM,mBAAe,6BAAgB;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,OAAO;AACX,UAAM,EAAE,OAAO,IAAI,UAAU;AAE7B,+BAAU,MAAM;AACd,UAAI,MAAM,SAAS,SAAS;AAC1B,gBAAQ,WAAW;AAAA,MACrB;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,UAAI,MAAM,SAAS,YAAY;AAC7B,mBAAO,eAAE,OAAO,EAAE,IAAI,0BAA0B,CAAC;AAAA,MACnD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;AAEM,IAAM,mBAAe,6BAAgB;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,OAAO;AACX,UAAM,EAAE,OAAO,IAAI,UAAU;AAE7B,+BAAU,MAAM;AACd,UAAI,MAAM,SAAS,SAAS;AAC1B,gBAAQ,WAAW;AAAA,MACrB;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,UAAI,MAAM,SAAS,YAAY;AAC7B,mBAAO,eAAE,OAAO,EAAE,IAAI,0BAA0B,CAAC;AAAA,MACnD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;AAEM,IAAM,uBAAmB,6BAAgB;AAAA,EAC9C,MAAM;AAAA,EACN,QAAQ;AACN,UAAM,EAAE,MAAM,YAAY,SAAS,WAAW,IAAI,UAAU;AAC5D,UAAM,WAAO,iBAAI,KAAK;AAEtB,UAAM,eAAW,sBAAS,MAAM;AAC9B,UAAI,CAAC,KAAM,QAAO;AAClB,YAAM,IAAI;AACV,UAAK,EAAsC,aAAa;AACtD,eAAS,EAA8B,YACpC,MAAM,GAAG,EACT,IAAI,CAAC,MAAc,EAAE,CAAC,CAAC,EACvB,KAAK,EAAE,EACP,YAAY,EACZ,MAAM,GAAG,CAAC;AAAA,MACf;AACA,cAAS,EAAgC,QAAQ,CAAC,KAAK,KAAK,YAAY;AAAA,IAC1E,CAAC;AAED,WAAO,MAAM;AACX,UAAI,CAAC,YAAY;AACf,mBAAO;AAAA,UACL;AAAA,UACA;AAAA,YACE,SAAS,MAAM,WAAW;AAAA,YAC1B,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,YAAY;AAAA,YACd;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAa,MAA+C;AAClE,YAAM,cAAe,MAAiD;AACtE,YAAM,QAAS,MAA2C;AAE1D,iBAAO,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,YAAY,SAAS,eAAe,EAAE,GAAG;AAAA,YAC5E;AAAA,UACE;AAAA,UACA;AAAA,YACE,SAAS,MAAO,KAAK,QAAQ,CAAC,KAAK;AAAA,YACnC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,QAAQ;AAAA,cACR,YAAY,YAAY,gBAAgB;AAAA,cACxC,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,UAAU;AAAA,cACV,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,OAAO;AAAA,cACP,UAAU;AAAA,cACV,YAAY;AAAA,YACd;AAAA,UACF;AAAA,UACA,YACI,KAAC,eAAE,OAAO,EAAE,KAAK,WAAW,KAAK,eAAe,UAAU,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,WAAW,QAAQ,EAAE,CAAC,CAAC,IACzH,CAAC,SAAS,KAAK;AAAA,QACrB;AAAA,QACA,KAAK,YACD;AAAA,UACE;AAAA,UACA;AAAA,YACE,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,KAAK;AAAA,cACL,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,UACA;AAAA,gBACE,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,aAAa,cAAc,oBAAoB,EAAE,GAAG;AAAA,cAC/E,mBAAe,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,QAAQ,YAAY,KAAK,OAAO,UAAU,EAAE,GAAG,WAAW;AAAA,cACvG,aAAS,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,QAAQ,OAAO,WAAW,WAAW,MAAM,EAAE,GAAG,KAAK;AAAA,YAC9F,CAAC;AAAA,gBACD;AAAA,cACE;AAAA,cACA;AAAA,gBACE,SAAS,YAAY;AACnB,uBAAK,QAAQ;AACb,wBAAM,QAAQ;AAAA,gBAChB;AAAA,gBACA,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,WAAW;AAAA,kBACX,YAAY;AAAA,kBACZ,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,YAAY;AAAA,gBACd;AAAA,cACF;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF,IACA;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;AAEM,IAAM,qBAAiB,6BAAgB;AAAA,EAC5C,MAAM;AAAA,EACN,MAAM,GAAG,EAAE,MAAM,GAAG;AAClB,UAAM,EAAE,YAAY,UAAU,IAAI,UAAU;AAC5C,WAAO,MAAM;AACX,UAAI,aAAa,CAAC,WAAY,QAAO;AACrC,aAAO,MAAM,UAAU;AAAA,IACzB;AAAA,EACF;AACF,CAAC;AAEM,IAAM,sBAAkB,6BAAgB;AAAA,EAC7C,MAAM;AAAA,EACN,MAAM,GAAG,EAAE,MAAM,GAAG;AAClB,UAAM,EAAE,YAAY,UAAU,IAAI,UAAU;AAC5C,WAAO,MAAM;AACX,UAAI,aAAa,WAAY,QAAO;AACpC,aAAO,MAAM,UAAU;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;ACtMD,IAAAC,cAA4E;AAC5E,oBAAgF;AAChF,IAAAC,aAAwC;AAGjC,IAAM,yBAAqB,6BAAgB;AAAA,EAChD,MAAM;AAAA,EACN,OAAO;AAAA,IACL,UAAU,EAAE,MAAM,QAAuC,UAAU,KAAK;AAAA,IACxE,SAAS,EAAE,MAAM,UAA6E,UAAU,KAAK;AAAA,IAC7G,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,IACzC,UAAU,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,IAC1C,OAAO,EAAE,MAAM,QAAQ,SAAS,OAAU;AAAA,IAC1C,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,IACzC,UAAU,EAAE,MAAM,QAAQ,SAAS,OAAU;AAAA,IAC7C,cAAc,EAAE,MAAM,QAAQ,SAAS,GAAG;AAAA,IAC1C,QAAQ,EAAE,MAAM,QAAQ,SAAS,GAAG;AAAA,IACpC,MAAM,EAAE,MAAM,QAAQ,SAAS,GAAG;AAAA,EACpC;AAAA,EACA,MAAM,OAAO;AACX,UAAM,aAAS,sBAAS,MAAM,8BAAgB,MAAM,QAAQ,KAAK,EAAE,IAAI,QAAQ,MAAM,OAAO,CAAC;AAC7F,UAAM,kBAAc,sBAAS,MAAM,qCAAuB,MAAM,QAAQ,KAAK,MAAM,QAAQ;AAC3F,UAAM,kBAAc,sBAAS,MAAM,MAAM,SAAS,iBAAiB,YAAY,KAAK,EAAE;AACtF,UAAM,kBAAc,sBAAS,MAAM,OAAO,MAAM,GAAG,YAAY,MAAM,SAAS;AAC9E,UAAM,uBAAmB,sBAAS,MAAM,MAAM,aAAa,MAAM,UAAU,KAAK,GAAG;AAEnF,UAAM,cAAU,sBAAS,MAAM;AAC7B,YAAM,aAAS,oCAAwB,MAAM,QAAQ;AACrD,aAAO,OAAO,QACX,QAAQ,eAAe,UAAU,iBAAiB,KAAK,GAAG,EAC1D,QAAQ,gBAAgB,WAAW,iBAAiB,KAAK,GAAG;AAAA,IACjE,CAAC;AAED,UAAM,UAAU,UACd,eAAE,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ,aAAa,OAAO,MAAM,IAAI;AAAA,QACtC,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,WAAW;AAAA,MACb;AAAA,IACF,CAAC;AAEH,UAAM,OAAO,UACX,eAAE,QAAQ;AAAA,MACR,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,YAAY,EAAE;AAAA,MAC9D,WAAW,QAAQ;AAAA,IACrB,CAAC;AAEH,WAAO,MAAM;AACX,YAAM,cAAc,YAAY,QAAQ,EAAE,QAAQ,oBAAoB,IAAI,CAAC;AAE3E,UAAI,MAAM,SAAS;AACjB,mBAAO;AAAA,UACL;AAAA,UACA;AAAA,YACE,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,iBAAiB,OAAO,MAAM;AAAA,cAC9B,cAAc,GAAG,MAAM,YAAY;AAAA,cACnC,OAAO,GAAG,MAAM,IAAI;AAAA,cACpB,QAAQ,GAAG,MAAM,IAAI;AAAA,cACrB,GAAG;AAAA,YACL;AAAA,YACA,SAAS,MAAM,MAAM,QAAQ,MAAM,QAAQ;AAAA,YAC3C,UAAU,MAAM,YAAY,MAAM;AAAA,YAClC,cAAc,gBAAgB,YAAY,KAAK;AAAA,UACjD;AAAA,UACA,CAAC,MAAM,UAAU,QAAQ,IAAI,KAAK,CAAC;AAAA,QACrC;AAAA,MACF;AAEA,iBAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,OAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,KAAK;AAAA,YACL,aAAa;AAAA,YACb,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,OAAO;AAAA,YACP,iBAAiB,OAAO,MAAM;AAAA,YAC9B,OAAO,OAAO,MAAM;AAAA,YACpB,cAAc,GAAG,MAAM,YAAY;AAAA,YACnC,QAAQ,GAAG,MAAM,MAAM;AAAA,YACvB,GAAG;AAAA,UACL;AAAA,UACA,SAAS,MAAM,MAAM,QAAQ,MAAM,QAAQ;AAAA,UAC3C,UAAU,MAAM,YAAY,MAAM;AAAA,UAClC,cAAc,gBAAgB,YAAY,KAAK;AAAA,QACjD;AAAA,QACA,MAAM,UACF,CAAC,QAAQ,CAAC,IACV;AAAA,UACE,KAAK;AAAA,cACL,eAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,QAAQ,YAAY,KAAK,YAAY,SAAS,EAAE,GAAG,YAAY,KAAK;AAAA,QACrG;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAEM,IAAM,0BAAsB,6BAAgB;AAAA,EACjD,MAAM;AAAA,EACN,OAAO;AAAA,IACL,WAAW,EAAE,MAAM,UAAkC,SAAS,OAAU;AAAA,IACxE,SAAS,EAAE,MAAM,UAA8C,SAAS,OAAU;AAAA,IAClF,KAAK,EAAE,MAAM,QAAQ,SAAS,OAAU;AAAA,IACxC,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,IACzC,QAAQ,EAAE,MAAM,QAAgE,SAAS,OAAU;AAAA,EACrG;AAAA,EACA,MAAM,OAAO;AACX,UAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,UAAM,gBAAY,iBAAyB,CAAC,CAAC;AAC7C,UAAM,sBAAkB,iBAAmB,IAAI;AAC/C,UAAM,kBAAc,sBAAS,MAAM,MAAM,QAAQ,MAAM,UAAU,KAAK,GAAG;AAEzE,+BAAU,YAAY;AACpB,UAAI,QAAQ;AACV,kBAAU,QAAQ,MAAM,OAAO,aAAa;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,UAAM,cAAc,OAAO,aAAgC;AACzD,UAAI,CAAC,OAAQ;AACb,sBAAgB,QAAQ;AACxB,UAAI;AACF,cAAM,OAAO,gBAAgB,QAAQ;AACrC,cAAM,YAAY;AAAA,MACpB,SAAS,GAAQ;AACf,cAAM,QAAQ,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AAC1D,cAAM,UAAU,KAAK;AAAA,MACvB,UAAE;AACA,wBAAgB,QAAQ;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO,MAAM;AACX,UAAI,UAAU,MAAM,WAAW,EAAG,QAAO;AAEzC,YAAM,iBAAiB,MAAM,UACzB,EAAE,SAAS,QAAQ,eAAe,OAAgB,UAAU,QAAiB,gBAAgB,UAAU,KAAK,GAAG,YAAY,KAAK,KAAK,IACrI,EAAE,SAAS,QAAQ,eAAe,UAAmB,KAAK,GAAG,YAAY,KAAK,KAAK;AAEvF,iBAAO;AAAA,QACL;AAAA,QACA,EAAE,OAAO,eAAe;AAAA,QACxB,UAAU,MAAM;AAAA,UAAI,CAAC,iBACnB,eAAE,oBAAoB;AAAA,YACpB,KAAK;AAAA,YACL;AAAA,YACA,SAAS;AAAA,YACT,SAAS,gBAAgB,UAAU;AAAA,YACnC,UAAU,CAAC,CAAC,gBAAgB;AAAA,YAC5B,SAAS,MAAM;AAAA,YACf,OAAO,MAAM,SAAS,QAAQ;AAAA,UAChC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;","names":["import_vue","import_vue","import_vue","import_vue","import_vue","import_vue","import_vue","import_js"]}