@authon/vue 0.1.19 → 0.2.1
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 +161 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +149 -3
- package/dist/index.d.ts +149 -3
- package/dist/index.js +159 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -25,6 +25,8 @@ __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,
|
|
@@ -289,6 +291,163 @@ var AuthonSignedOut = (0, import_vue3.defineComponent)({
|
|
|
289
291
|
};
|
|
290
292
|
}
|
|
291
293
|
});
|
|
294
|
+
|
|
295
|
+
// src/SocialButton.ts
|
|
296
|
+
var import_vue4 = require("vue");
|
|
297
|
+
var import_shared = require("@authon/shared");
|
|
298
|
+
var import_js2 = require("@authon/js");
|
|
299
|
+
var AuthonSocialButton = (0, import_vue4.defineComponent)({
|
|
300
|
+
name: "AuthonSocialButton",
|
|
301
|
+
props: {
|
|
302
|
+
provider: { type: String, required: true },
|
|
303
|
+
onClick: { type: Function, required: true },
|
|
304
|
+
loading: { type: Boolean, default: false },
|
|
305
|
+
disabled: { type: Boolean, default: false },
|
|
306
|
+
label: { type: String, default: void 0 },
|
|
307
|
+
compact: { type: Boolean, default: false },
|
|
308
|
+
iconSize: { type: Number, default: void 0 },
|
|
309
|
+
borderRadius: { type: Number, default: 10 },
|
|
310
|
+
height: { type: Number, default: 48 },
|
|
311
|
+
size: { type: Number, default: 48 }
|
|
312
|
+
},
|
|
313
|
+
setup(props) {
|
|
314
|
+
const colors = (0, import_vue4.computed)(() => import_shared.PROVIDER_COLORS[props.provider] || { bg: "#333", text: "#fff" });
|
|
315
|
+
const displayName = (0, import_vue4.computed)(() => import_shared.PROVIDER_DISPLAY_NAMES[props.provider] || props.provider);
|
|
316
|
+
const buttonLabel = (0, import_vue4.computed)(() => props.label ?? `Continue with ${displayName.value}`);
|
|
317
|
+
const needsBorder = (0, import_vue4.computed)(() => colors.value.bg.toLowerCase() === "#ffffff");
|
|
318
|
+
const resolvedIconSize = (0, import_vue4.computed)(() => props.iconSize ?? (props.compact ? 24 : 20));
|
|
319
|
+
const iconSvg = (0, import_vue4.computed)(() => {
|
|
320
|
+
const config = (0, import_js2.getProviderButtonConfig)(props.provider);
|
|
321
|
+
return config.iconSvg.replace(/width="\d+"/, `width="${resolvedIconSize.value}"`).replace(/height="\d+"/, `height="${resolvedIconSize.value}"`);
|
|
322
|
+
});
|
|
323
|
+
const spinner = () => (0, import_vue4.h)("span", {
|
|
324
|
+
style: {
|
|
325
|
+
display: "inline-block",
|
|
326
|
+
width: "16px",
|
|
327
|
+
height: "16px",
|
|
328
|
+
border: `2px solid ${colors.value.text}`,
|
|
329
|
+
borderTopColor: "transparent",
|
|
330
|
+
borderRadius: "50%",
|
|
331
|
+
animation: "authon-spin 0.6s linear infinite"
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
const icon = () => (0, import_vue4.h)("span", {
|
|
335
|
+
style: { display: "flex", alignItems: "center", flexShrink: 0 },
|
|
336
|
+
innerHTML: iconSvg.value
|
|
337
|
+
});
|
|
338
|
+
return () => {
|
|
339
|
+
const borderStyle = needsBorder.value ? { border: "1px solid #dadce0" } : {};
|
|
340
|
+
if (props.compact) {
|
|
341
|
+
return (0, import_vue4.h)(
|
|
342
|
+
"button",
|
|
343
|
+
{
|
|
344
|
+
style: {
|
|
345
|
+
display: "flex",
|
|
346
|
+
alignItems: "center",
|
|
347
|
+
justifyContent: "center",
|
|
348
|
+
border: "none",
|
|
349
|
+
cursor: "pointer",
|
|
350
|
+
transition: "opacity 0.15s",
|
|
351
|
+
padding: 0,
|
|
352
|
+
backgroundColor: colors.value.bg,
|
|
353
|
+
borderRadius: `${props.borderRadius}px`,
|
|
354
|
+
width: `${props.size}px`,
|
|
355
|
+
height: `${props.size}px`,
|
|
356
|
+
...borderStyle
|
|
357
|
+
},
|
|
358
|
+
onClick: () => props.onClick(props.provider),
|
|
359
|
+
disabled: props.disabled || props.loading,
|
|
360
|
+
"aria-label": `Sign in with ${displayName.value}`
|
|
361
|
+
},
|
|
362
|
+
[props.loading ? spinner() : icon()]
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
return (0, import_vue4.h)(
|
|
366
|
+
"button",
|
|
367
|
+
{
|
|
368
|
+
style: {
|
|
369
|
+
display: "flex",
|
|
370
|
+
alignItems: "center",
|
|
371
|
+
justifyContent: "center",
|
|
372
|
+
gap: "10px",
|
|
373
|
+
paddingLeft: "16px",
|
|
374
|
+
paddingRight: "16px",
|
|
375
|
+
border: "none",
|
|
376
|
+
cursor: "pointer",
|
|
377
|
+
fontFamily: "inherit",
|
|
378
|
+
transition: "opacity 0.15s",
|
|
379
|
+
width: "100%",
|
|
380
|
+
backgroundColor: colors.value.bg,
|
|
381
|
+
color: colors.value.text,
|
|
382
|
+
borderRadius: `${props.borderRadius}px`,
|
|
383
|
+
height: `${props.height}px`,
|
|
384
|
+
...borderStyle
|
|
385
|
+
},
|
|
386
|
+
onClick: () => props.onClick(props.provider),
|
|
387
|
+
disabled: props.disabled || props.loading,
|
|
388
|
+
"aria-label": `Sign in with ${displayName.value}`
|
|
389
|
+
},
|
|
390
|
+
props.loading ? [spinner()] : [
|
|
391
|
+
icon(),
|
|
392
|
+
(0, import_vue4.h)("span", { style: { fontSize: "15px", fontWeight: 600, whiteSpace: "nowrap" } }, buttonLabel.value)
|
|
393
|
+
]
|
|
394
|
+
);
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
var AuthonSocialButtons = (0, import_vue4.defineComponent)({
|
|
399
|
+
name: "AuthonSocialButtons",
|
|
400
|
+
props: {
|
|
401
|
+
onSuccess: { type: Function, default: void 0 },
|
|
402
|
+
onError: { type: Function, default: void 0 },
|
|
403
|
+
gap: { type: Number, default: void 0 },
|
|
404
|
+
compact: { type: Boolean, default: false },
|
|
405
|
+
labels: { type: Object, default: void 0 }
|
|
406
|
+
},
|
|
407
|
+
setup(props) {
|
|
408
|
+
const { client } = useAuthon();
|
|
409
|
+
const providers = (0, import_vue4.ref)([]);
|
|
410
|
+
const loadingProvider = (0, import_vue4.ref)(null);
|
|
411
|
+
const resolvedGap = (0, import_vue4.computed)(() => props.gap ?? (props.compact ? 12 : 10));
|
|
412
|
+
(0, import_vue4.onMounted)(async () => {
|
|
413
|
+
if (client) {
|
|
414
|
+
providers.value = await client.getProviders();
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
const handleClick = async (provider) => {
|
|
418
|
+
if (!client) return;
|
|
419
|
+
loadingProvider.value = provider;
|
|
420
|
+
try {
|
|
421
|
+
await client.signInWithOAuth(provider);
|
|
422
|
+
props.onSuccess?.();
|
|
423
|
+
} catch (e) {
|
|
424
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
425
|
+
props.onError?.(error);
|
|
426
|
+
} finally {
|
|
427
|
+
loadingProvider.value = null;
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
return () => {
|
|
431
|
+
if (providers.value.length === 0) return null;
|
|
432
|
+
const containerStyle = props.compact ? { display: "flex", flexDirection: "row", flexWrap: "wrap", justifyContent: "center", gap: `${resolvedGap.value}px` } : { display: "flex", flexDirection: "column", gap: `${resolvedGap.value}px` };
|
|
433
|
+
return (0, import_vue4.h)(
|
|
434
|
+
"div",
|
|
435
|
+
{ style: containerStyle },
|
|
436
|
+
providers.value.map(
|
|
437
|
+
(provider) => (0, import_vue4.h)(AuthonSocialButton, {
|
|
438
|
+
key: provider,
|
|
439
|
+
provider,
|
|
440
|
+
onClick: handleClick,
|
|
441
|
+
loading: loadingProvider.value === provider,
|
|
442
|
+
disabled: !!loadingProvider.value,
|
|
443
|
+
compact: props.compact,
|
|
444
|
+
label: props.labels?.[provider]
|
|
445
|
+
})
|
|
446
|
+
)
|
|
447
|
+
);
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
});
|
|
292
451
|
// Annotate the CommonJS export names for ESM import in node:
|
|
293
452
|
0 && (module.exports = {
|
|
294
453
|
AUTHON_KEY,
|
|
@@ -296,6 +455,8 @@ var AuthonSignedOut = (0, import_vue3.defineComponent)({
|
|
|
296
455
|
AuthonSignUp,
|
|
297
456
|
AuthonSignedIn,
|
|
298
457
|
AuthonSignedOut,
|
|
458
|
+
AuthonSocialButton,
|
|
459
|
+
AuthonSocialButtons,
|
|
299
460
|
AuthonUserButton,
|
|
300
461
|
createAuthon,
|
|
301
462
|
useAuthon,
|
package/dist/index.cjs.map
CHANGED
|
@@ -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/components.ts","../src/SocialButton.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';\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 { 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":"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","names":["import_vue","import_vue","import_vue","import_js"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as vue from 'vue';
|
|
2
|
-
import { App, ComputedRef } from 'vue';
|
|
2
|
+
import { App, ComputedRef, PropType } from 'vue';
|
|
3
3
|
import { AuthonConfig, Authon } from '@authon/js';
|
|
4
|
-
import { AuthonUser } from '@authon/shared';
|
|
4
|
+
import { AuthonUser, OAuthProviderType } from '@authon/shared';
|
|
5
5
|
|
|
6
6
|
declare const AUTHON_KEY: unique symbol;
|
|
7
7
|
interface AuthonState {
|
|
@@ -69,4 +69,150 @@ declare const AuthonSignedOut: vue.DefineComponent<{}, () => vue.VNode<vue.Rende
|
|
|
69
69
|
[key: string]: any;
|
|
70
70
|
}>[] | null | undefined, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
declare const AuthonSocialButton: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
73
|
+
provider: {
|
|
74
|
+
type: PropType<OAuthProviderType>;
|
|
75
|
+
required: true;
|
|
76
|
+
};
|
|
77
|
+
onClick: {
|
|
78
|
+
type: PropType<(provider: OAuthProviderType) => void | Promise<void>>;
|
|
79
|
+
required: true;
|
|
80
|
+
};
|
|
81
|
+
loading: {
|
|
82
|
+
type: BooleanConstructor;
|
|
83
|
+
default: boolean;
|
|
84
|
+
};
|
|
85
|
+
disabled: {
|
|
86
|
+
type: BooleanConstructor;
|
|
87
|
+
default: boolean;
|
|
88
|
+
};
|
|
89
|
+
label: {
|
|
90
|
+
type: StringConstructor;
|
|
91
|
+
default: undefined;
|
|
92
|
+
};
|
|
93
|
+
compact: {
|
|
94
|
+
type: BooleanConstructor;
|
|
95
|
+
default: boolean;
|
|
96
|
+
};
|
|
97
|
+
iconSize: {
|
|
98
|
+
type: NumberConstructor;
|
|
99
|
+
default: undefined;
|
|
100
|
+
};
|
|
101
|
+
borderRadius: {
|
|
102
|
+
type: NumberConstructor;
|
|
103
|
+
default: number;
|
|
104
|
+
};
|
|
105
|
+
height: {
|
|
106
|
+
type: NumberConstructor;
|
|
107
|
+
default: number;
|
|
108
|
+
};
|
|
109
|
+
size: {
|
|
110
|
+
type: NumberConstructor;
|
|
111
|
+
default: number;
|
|
112
|
+
};
|
|
113
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
114
|
+
[key: string]: any;
|
|
115
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
116
|
+
provider: {
|
|
117
|
+
type: PropType<OAuthProviderType>;
|
|
118
|
+
required: true;
|
|
119
|
+
};
|
|
120
|
+
onClick: {
|
|
121
|
+
type: PropType<(provider: OAuthProviderType) => void | Promise<void>>;
|
|
122
|
+
required: true;
|
|
123
|
+
};
|
|
124
|
+
loading: {
|
|
125
|
+
type: BooleanConstructor;
|
|
126
|
+
default: boolean;
|
|
127
|
+
};
|
|
128
|
+
disabled: {
|
|
129
|
+
type: BooleanConstructor;
|
|
130
|
+
default: boolean;
|
|
131
|
+
};
|
|
132
|
+
label: {
|
|
133
|
+
type: StringConstructor;
|
|
134
|
+
default: undefined;
|
|
135
|
+
};
|
|
136
|
+
compact: {
|
|
137
|
+
type: BooleanConstructor;
|
|
138
|
+
default: boolean;
|
|
139
|
+
};
|
|
140
|
+
iconSize: {
|
|
141
|
+
type: NumberConstructor;
|
|
142
|
+
default: undefined;
|
|
143
|
+
};
|
|
144
|
+
borderRadius: {
|
|
145
|
+
type: NumberConstructor;
|
|
146
|
+
default: number;
|
|
147
|
+
};
|
|
148
|
+
height: {
|
|
149
|
+
type: NumberConstructor;
|
|
150
|
+
default: number;
|
|
151
|
+
};
|
|
152
|
+
size: {
|
|
153
|
+
type: NumberConstructor;
|
|
154
|
+
default: number;
|
|
155
|
+
};
|
|
156
|
+
}>> & Readonly<{}>, {
|
|
157
|
+
label: string;
|
|
158
|
+
loading: boolean;
|
|
159
|
+
disabled: boolean;
|
|
160
|
+
compact: boolean;
|
|
161
|
+
iconSize: number;
|
|
162
|
+
borderRadius: number;
|
|
163
|
+
height: number;
|
|
164
|
+
size: number;
|
|
165
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
166
|
+
declare const AuthonSocialButtons: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
167
|
+
onSuccess: {
|
|
168
|
+
type: PropType<() => void>;
|
|
169
|
+
default: undefined;
|
|
170
|
+
};
|
|
171
|
+
onError: {
|
|
172
|
+
type: PropType<(error: Error) => void>;
|
|
173
|
+
default: undefined;
|
|
174
|
+
};
|
|
175
|
+
gap: {
|
|
176
|
+
type: NumberConstructor;
|
|
177
|
+
default: undefined;
|
|
178
|
+
};
|
|
179
|
+
compact: {
|
|
180
|
+
type: BooleanConstructor;
|
|
181
|
+
default: boolean;
|
|
182
|
+
};
|
|
183
|
+
labels: {
|
|
184
|
+
type: PropType<Partial<Record<OAuthProviderType, string>>>;
|
|
185
|
+
default: undefined;
|
|
186
|
+
};
|
|
187
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
188
|
+
[key: string]: any;
|
|
189
|
+
}> | null, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
190
|
+
onSuccess: {
|
|
191
|
+
type: PropType<() => void>;
|
|
192
|
+
default: undefined;
|
|
193
|
+
};
|
|
194
|
+
onError: {
|
|
195
|
+
type: PropType<(error: Error) => void>;
|
|
196
|
+
default: undefined;
|
|
197
|
+
};
|
|
198
|
+
gap: {
|
|
199
|
+
type: NumberConstructor;
|
|
200
|
+
default: undefined;
|
|
201
|
+
};
|
|
202
|
+
compact: {
|
|
203
|
+
type: BooleanConstructor;
|
|
204
|
+
default: boolean;
|
|
205
|
+
};
|
|
206
|
+
labels: {
|
|
207
|
+
type: PropType<Partial<Record<OAuthProviderType, string>>>;
|
|
208
|
+
default: undefined;
|
|
209
|
+
};
|
|
210
|
+
}>> & Readonly<{}>, {
|
|
211
|
+
onError: (error: Error) => void;
|
|
212
|
+
compact: boolean;
|
|
213
|
+
onSuccess: () => void;
|
|
214
|
+
gap: number;
|
|
215
|
+
labels: Partial<Record<"google" | "apple" | "kakao" | "naver" | "facebook" | "github" | "discord" | "x" | "line" | "microsoft", string>>;
|
|
216
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
217
|
+
|
|
218
|
+
export { AUTHON_KEY, type AuthonPluginOptions, AuthonSignIn, AuthonSignUp, AuthonSignedIn, AuthonSignedOut, AuthonSocialButton, AuthonSocialButtons, type AuthonState, AuthonUserButton, createAuthon, useAuthon, useUser };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as vue from 'vue';
|
|
2
|
-
import { App, ComputedRef } from 'vue';
|
|
2
|
+
import { App, ComputedRef, PropType } from 'vue';
|
|
3
3
|
import { AuthonConfig, Authon } from '@authon/js';
|
|
4
|
-
import { AuthonUser } from '@authon/shared';
|
|
4
|
+
import { AuthonUser, OAuthProviderType } from '@authon/shared';
|
|
5
5
|
|
|
6
6
|
declare const AUTHON_KEY: unique symbol;
|
|
7
7
|
interface AuthonState {
|
|
@@ -69,4 +69,150 @@ declare const AuthonSignedOut: vue.DefineComponent<{}, () => vue.VNode<vue.Rende
|
|
|
69
69
|
[key: string]: any;
|
|
70
70
|
}>[] | null | undefined, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
declare const AuthonSocialButton: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
73
|
+
provider: {
|
|
74
|
+
type: PropType<OAuthProviderType>;
|
|
75
|
+
required: true;
|
|
76
|
+
};
|
|
77
|
+
onClick: {
|
|
78
|
+
type: PropType<(provider: OAuthProviderType) => void | Promise<void>>;
|
|
79
|
+
required: true;
|
|
80
|
+
};
|
|
81
|
+
loading: {
|
|
82
|
+
type: BooleanConstructor;
|
|
83
|
+
default: boolean;
|
|
84
|
+
};
|
|
85
|
+
disabled: {
|
|
86
|
+
type: BooleanConstructor;
|
|
87
|
+
default: boolean;
|
|
88
|
+
};
|
|
89
|
+
label: {
|
|
90
|
+
type: StringConstructor;
|
|
91
|
+
default: undefined;
|
|
92
|
+
};
|
|
93
|
+
compact: {
|
|
94
|
+
type: BooleanConstructor;
|
|
95
|
+
default: boolean;
|
|
96
|
+
};
|
|
97
|
+
iconSize: {
|
|
98
|
+
type: NumberConstructor;
|
|
99
|
+
default: undefined;
|
|
100
|
+
};
|
|
101
|
+
borderRadius: {
|
|
102
|
+
type: NumberConstructor;
|
|
103
|
+
default: number;
|
|
104
|
+
};
|
|
105
|
+
height: {
|
|
106
|
+
type: NumberConstructor;
|
|
107
|
+
default: number;
|
|
108
|
+
};
|
|
109
|
+
size: {
|
|
110
|
+
type: NumberConstructor;
|
|
111
|
+
default: number;
|
|
112
|
+
};
|
|
113
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
114
|
+
[key: string]: any;
|
|
115
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
116
|
+
provider: {
|
|
117
|
+
type: PropType<OAuthProviderType>;
|
|
118
|
+
required: true;
|
|
119
|
+
};
|
|
120
|
+
onClick: {
|
|
121
|
+
type: PropType<(provider: OAuthProviderType) => void | Promise<void>>;
|
|
122
|
+
required: true;
|
|
123
|
+
};
|
|
124
|
+
loading: {
|
|
125
|
+
type: BooleanConstructor;
|
|
126
|
+
default: boolean;
|
|
127
|
+
};
|
|
128
|
+
disabled: {
|
|
129
|
+
type: BooleanConstructor;
|
|
130
|
+
default: boolean;
|
|
131
|
+
};
|
|
132
|
+
label: {
|
|
133
|
+
type: StringConstructor;
|
|
134
|
+
default: undefined;
|
|
135
|
+
};
|
|
136
|
+
compact: {
|
|
137
|
+
type: BooleanConstructor;
|
|
138
|
+
default: boolean;
|
|
139
|
+
};
|
|
140
|
+
iconSize: {
|
|
141
|
+
type: NumberConstructor;
|
|
142
|
+
default: undefined;
|
|
143
|
+
};
|
|
144
|
+
borderRadius: {
|
|
145
|
+
type: NumberConstructor;
|
|
146
|
+
default: number;
|
|
147
|
+
};
|
|
148
|
+
height: {
|
|
149
|
+
type: NumberConstructor;
|
|
150
|
+
default: number;
|
|
151
|
+
};
|
|
152
|
+
size: {
|
|
153
|
+
type: NumberConstructor;
|
|
154
|
+
default: number;
|
|
155
|
+
};
|
|
156
|
+
}>> & Readonly<{}>, {
|
|
157
|
+
label: string;
|
|
158
|
+
loading: boolean;
|
|
159
|
+
disabled: boolean;
|
|
160
|
+
compact: boolean;
|
|
161
|
+
iconSize: number;
|
|
162
|
+
borderRadius: number;
|
|
163
|
+
height: number;
|
|
164
|
+
size: number;
|
|
165
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
166
|
+
declare const AuthonSocialButtons: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
167
|
+
onSuccess: {
|
|
168
|
+
type: PropType<() => void>;
|
|
169
|
+
default: undefined;
|
|
170
|
+
};
|
|
171
|
+
onError: {
|
|
172
|
+
type: PropType<(error: Error) => void>;
|
|
173
|
+
default: undefined;
|
|
174
|
+
};
|
|
175
|
+
gap: {
|
|
176
|
+
type: NumberConstructor;
|
|
177
|
+
default: undefined;
|
|
178
|
+
};
|
|
179
|
+
compact: {
|
|
180
|
+
type: BooleanConstructor;
|
|
181
|
+
default: boolean;
|
|
182
|
+
};
|
|
183
|
+
labels: {
|
|
184
|
+
type: PropType<Partial<Record<OAuthProviderType, string>>>;
|
|
185
|
+
default: undefined;
|
|
186
|
+
};
|
|
187
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
188
|
+
[key: string]: any;
|
|
189
|
+
}> | null, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
190
|
+
onSuccess: {
|
|
191
|
+
type: PropType<() => void>;
|
|
192
|
+
default: undefined;
|
|
193
|
+
};
|
|
194
|
+
onError: {
|
|
195
|
+
type: PropType<(error: Error) => void>;
|
|
196
|
+
default: undefined;
|
|
197
|
+
};
|
|
198
|
+
gap: {
|
|
199
|
+
type: NumberConstructor;
|
|
200
|
+
default: undefined;
|
|
201
|
+
};
|
|
202
|
+
compact: {
|
|
203
|
+
type: BooleanConstructor;
|
|
204
|
+
default: boolean;
|
|
205
|
+
};
|
|
206
|
+
labels: {
|
|
207
|
+
type: PropType<Partial<Record<OAuthProviderType, string>>>;
|
|
208
|
+
default: undefined;
|
|
209
|
+
};
|
|
210
|
+
}>> & Readonly<{}>, {
|
|
211
|
+
onError: (error: Error) => void;
|
|
212
|
+
compact: boolean;
|
|
213
|
+
onSuccess: () => void;
|
|
214
|
+
gap: number;
|
|
215
|
+
labels: Partial<Record<"google" | "apple" | "kakao" | "naver" | "facebook" | "github" | "discord" | "x" | "line" | "microsoft", string>>;
|
|
216
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
217
|
+
|
|
218
|
+
export { AUTHON_KEY, type AuthonPluginOptions, AuthonSignIn, AuthonSignUp, AuthonSignedIn, AuthonSignedOut, AuthonSocialButton, AuthonSocialButtons, type AuthonState, AuthonUserButton, createAuthon, useAuthon, useUser };
|
package/dist/index.js
CHANGED
|
@@ -255,12 +255,171 @@ var AuthonSignedOut = defineComponent({
|
|
|
255
255
|
};
|
|
256
256
|
}
|
|
257
257
|
});
|
|
258
|
+
|
|
259
|
+
// src/SocialButton.ts
|
|
260
|
+
import { defineComponent as defineComponent2, h as h2, ref as ref2, computed as computed3, onMounted as onMounted2 } from "vue";
|
|
261
|
+
import { PROVIDER_COLORS, PROVIDER_DISPLAY_NAMES } from "@authon/shared";
|
|
262
|
+
import { getProviderButtonConfig } from "@authon/js";
|
|
263
|
+
var AuthonSocialButton = defineComponent2({
|
|
264
|
+
name: "AuthonSocialButton",
|
|
265
|
+
props: {
|
|
266
|
+
provider: { type: String, required: true },
|
|
267
|
+
onClick: { type: Function, required: true },
|
|
268
|
+
loading: { type: Boolean, default: false },
|
|
269
|
+
disabled: { type: Boolean, default: false },
|
|
270
|
+
label: { type: String, default: void 0 },
|
|
271
|
+
compact: { type: Boolean, default: false },
|
|
272
|
+
iconSize: { type: Number, default: void 0 },
|
|
273
|
+
borderRadius: { type: Number, default: 10 },
|
|
274
|
+
height: { type: Number, default: 48 },
|
|
275
|
+
size: { type: Number, default: 48 }
|
|
276
|
+
},
|
|
277
|
+
setup(props) {
|
|
278
|
+
const colors = computed3(() => PROVIDER_COLORS[props.provider] || { bg: "#333", text: "#fff" });
|
|
279
|
+
const displayName = computed3(() => PROVIDER_DISPLAY_NAMES[props.provider] || props.provider);
|
|
280
|
+
const buttonLabel = computed3(() => props.label ?? `Continue with ${displayName.value}`);
|
|
281
|
+
const needsBorder = computed3(() => colors.value.bg.toLowerCase() === "#ffffff");
|
|
282
|
+
const resolvedIconSize = computed3(() => props.iconSize ?? (props.compact ? 24 : 20));
|
|
283
|
+
const iconSvg = computed3(() => {
|
|
284
|
+
const config = getProviderButtonConfig(props.provider);
|
|
285
|
+
return config.iconSvg.replace(/width="\d+"/, `width="${resolvedIconSize.value}"`).replace(/height="\d+"/, `height="${resolvedIconSize.value}"`);
|
|
286
|
+
});
|
|
287
|
+
const spinner = () => h2("span", {
|
|
288
|
+
style: {
|
|
289
|
+
display: "inline-block",
|
|
290
|
+
width: "16px",
|
|
291
|
+
height: "16px",
|
|
292
|
+
border: `2px solid ${colors.value.text}`,
|
|
293
|
+
borderTopColor: "transparent",
|
|
294
|
+
borderRadius: "50%",
|
|
295
|
+
animation: "authon-spin 0.6s linear infinite"
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
const icon = () => h2("span", {
|
|
299
|
+
style: { display: "flex", alignItems: "center", flexShrink: 0 },
|
|
300
|
+
innerHTML: iconSvg.value
|
|
301
|
+
});
|
|
302
|
+
return () => {
|
|
303
|
+
const borderStyle = needsBorder.value ? { border: "1px solid #dadce0" } : {};
|
|
304
|
+
if (props.compact) {
|
|
305
|
+
return h2(
|
|
306
|
+
"button",
|
|
307
|
+
{
|
|
308
|
+
style: {
|
|
309
|
+
display: "flex",
|
|
310
|
+
alignItems: "center",
|
|
311
|
+
justifyContent: "center",
|
|
312
|
+
border: "none",
|
|
313
|
+
cursor: "pointer",
|
|
314
|
+
transition: "opacity 0.15s",
|
|
315
|
+
padding: 0,
|
|
316
|
+
backgroundColor: colors.value.bg,
|
|
317
|
+
borderRadius: `${props.borderRadius}px`,
|
|
318
|
+
width: `${props.size}px`,
|
|
319
|
+
height: `${props.size}px`,
|
|
320
|
+
...borderStyle
|
|
321
|
+
},
|
|
322
|
+
onClick: () => props.onClick(props.provider),
|
|
323
|
+
disabled: props.disabled || props.loading,
|
|
324
|
+
"aria-label": `Sign in with ${displayName.value}`
|
|
325
|
+
},
|
|
326
|
+
[props.loading ? spinner() : icon()]
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
return h2(
|
|
330
|
+
"button",
|
|
331
|
+
{
|
|
332
|
+
style: {
|
|
333
|
+
display: "flex",
|
|
334
|
+
alignItems: "center",
|
|
335
|
+
justifyContent: "center",
|
|
336
|
+
gap: "10px",
|
|
337
|
+
paddingLeft: "16px",
|
|
338
|
+
paddingRight: "16px",
|
|
339
|
+
border: "none",
|
|
340
|
+
cursor: "pointer",
|
|
341
|
+
fontFamily: "inherit",
|
|
342
|
+
transition: "opacity 0.15s",
|
|
343
|
+
width: "100%",
|
|
344
|
+
backgroundColor: colors.value.bg,
|
|
345
|
+
color: colors.value.text,
|
|
346
|
+
borderRadius: `${props.borderRadius}px`,
|
|
347
|
+
height: `${props.height}px`,
|
|
348
|
+
...borderStyle
|
|
349
|
+
},
|
|
350
|
+
onClick: () => props.onClick(props.provider),
|
|
351
|
+
disabled: props.disabled || props.loading,
|
|
352
|
+
"aria-label": `Sign in with ${displayName.value}`
|
|
353
|
+
},
|
|
354
|
+
props.loading ? [spinner()] : [
|
|
355
|
+
icon(),
|
|
356
|
+
h2("span", { style: { fontSize: "15px", fontWeight: 600, whiteSpace: "nowrap" } }, buttonLabel.value)
|
|
357
|
+
]
|
|
358
|
+
);
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
var AuthonSocialButtons = defineComponent2({
|
|
363
|
+
name: "AuthonSocialButtons",
|
|
364
|
+
props: {
|
|
365
|
+
onSuccess: { type: Function, default: void 0 },
|
|
366
|
+
onError: { type: Function, default: void 0 },
|
|
367
|
+
gap: { type: Number, default: void 0 },
|
|
368
|
+
compact: { type: Boolean, default: false },
|
|
369
|
+
labels: { type: Object, default: void 0 }
|
|
370
|
+
},
|
|
371
|
+
setup(props) {
|
|
372
|
+
const { client } = useAuthon();
|
|
373
|
+
const providers = ref2([]);
|
|
374
|
+
const loadingProvider = ref2(null);
|
|
375
|
+
const resolvedGap = computed3(() => props.gap ?? (props.compact ? 12 : 10));
|
|
376
|
+
onMounted2(async () => {
|
|
377
|
+
if (client) {
|
|
378
|
+
providers.value = await client.getProviders();
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
const handleClick = async (provider) => {
|
|
382
|
+
if (!client) return;
|
|
383
|
+
loadingProvider.value = provider;
|
|
384
|
+
try {
|
|
385
|
+
await client.signInWithOAuth(provider);
|
|
386
|
+
props.onSuccess?.();
|
|
387
|
+
} catch (e) {
|
|
388
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
389
|
+
props.onError?.(error);
|
|
390
|
+
} finally {
|
|
391
|
+
loadingProvider.value = null;
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
return () => {
|
|
395
|
+
if (providers.value.length === 0) return null;
|
|
396
|
+
const containerStyle = props.compact ? { display: "flex", flexDirection: "row", flexWrap: "wrap", justifyContent: "center", gap: `${resolvedGap.value}px` } : { display: "flex", flexDirection: "column", gap: `${resolvedGap.value}px` };
|
|
397
|
+
return h2(
|
|
398
|
+
"div",
|
|
399
|
+
{ style: containerStyle },
|
|
400
|
+
providers.value.map(
|
|
401
|
+
(provider) => h2(AuthonSocialButton, {
|
|
402
|
+
key: provider,
|
|
403
|
+
provider,
|
|
404
|
+
onClick: handleClick,
|
|
405
|
+
loading: loadingProvider.value === provider,
|
|
406
|
+
disabled: !!loadingProvider.value,
|
|
407
|
+
compact: props.compact,
|
|
408
|
+
label: props.labels?.[provider]
|
|
409
|
+
})
|
|
410
|
+
)
|
|
411
|
+
);
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
});
|
|
258
415
|
export {
|
|
259
416
|
AUTHON_KEY,
|
|
260
417
|
AuthonSignIn,
|
|
261
418
|
AuthonSignUp,
|
|
262
419
|
AuthonSignedIn,
|
|
263
420
|
AuthonSignedOut,
|
|
421
|
+
AuthonSocialButton,
|
|
422
|
+
AuthonSocialButtons,
|
|
264
423
|
AuthonUserButton,
|
|
265
424
|
createAuthon,
|
|
266
425
|
useAuthon,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin.ts","../src/composables.ts","../src/components.ts"],"sourcesContent":["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":["computed","computed"]}
|
|
1
|
+
{"version":3,"sources":["../src/plugin.ts","../src/composables.ts","../src/components.ts","../src/SocialButton.ts"],"sourcesContent":["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","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":"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","names":["computed","computed","defineComponent","h","ref","computed","onMounted","defineComponent","computed","h","ref","onMounted"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@authon/vue",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Authon Vue 3 SDK — plugin, composables, and components",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"sdk"
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@authon/js": "
|
|
42
|
-
"@authon/shared": "
|
|
41
|
+
"@authon/js": "^0.2.1",
|
|
42
|
+
"@authon/shared": "^0.2.0"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"vue": "^3.3.0"
|