@strands.gg/accui 0.0.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/README.md +50 -0
- package/dist/components/StrandsDeviceManager.vue.d.ts +3 -0
- package/dist/components/StrandsDeviceManager.vue.d.ts.map +1 -0
- package/dist/components/StrandsMFASetup.vue.d.ts +3 -0
- package/dist/components/StrandsMFASetup.vue.d.ts.map +1 -0
- package/dist/components/StrandsOrganizationSwitcher.vue.d.ts +14 -0
- package/dist/components/StrandsOrganizationSwitcher.vue.d.ts.map +1 -0
- package/dist/components/StrandsPasswordReset.vue.d.ts +3 -0
- package/dist/components/StrandsPasswordReset.vue.d.ts.map +1 -0
- package/dist/components/StrandsSignIn.vue.d.ts +16 -0
- package/dist/components/StrandsSignIn.vue.d.ts.map +1 -0
- package/dist/components/StrandsSignUp.vue.d.ts +9 -0
- package/dist/components/StrandsSignUp.vue.d.ts.map +1 -0
- package/dist/components/StrandsUserProfile.vue.d.ts +3 -0
- package/dist/components/StrandsUserProfile.vue.d.ts.map +1 -0
- package/dist/composables/useStrandsAuth.d.ts +38 -0
- package/dist/composables/useStrandsAuth.d.ts.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/strands-auth-ui.es.d.ts +2 -0
- package/dist/strands-auth-ui.es.js +389 -0
- package/dist/strands-auth-ui.es.js.map +1 -0
- package/dist/strands-auth-ui.umd.js +2 -0
- package/dist/strands-auth-ui.umd.js.map +1 -0
- package/dist/types/index.d.ts +32 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +38 -0
package/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# @strands.gg/accui
|
|
2
|
+
|
|
3
|
+
Strands Authentication UI Components for Vue 3
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @strands.gg/accui
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```vue
|
|
14
|
+
<template>
|
|
15
|
+
<div>
|
|
16
|
+
<StrandsSignIn @success="handleSignInSuccess" />
|
|
17
|
+
</div>
|
|
18
|
+
</template>
|
|
19
|
+
|
|
20
|
+
<script setup lang="ts">
|
|
21
|
+
import { StrandsSignIn } from "@strands.gg/accui";
|
|
22
|
+
|
|
23
|
+
const handleSignInSuccess = (user: any) => {
|
|
24
|
+
console.log("User signed in:", user);
|
|
25
|
+
};
|
|
26
|
+
</script>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Available Components
|
|
30
|
+
|
|
31
|
+
- `StrandsSignIn` - Sign in form component
|
|
32
|
+
- `StrandsSignUp` - Sign up form component
|
|
33
|
+
- `StrandsUserProfile` - User profile management component
|
|
34
|
+
- `StrandsPasswordReset` - Password reset component
|
|
35
|
+
- `StrandsMFASetup` - Multi-factor authentication setup
|
|
36
|
+
- `StrandsDeviceManager` - Device management component
|
|
37
|
+
- `StrandsOrganizationSwitcher` - Organization switching component
|
|
38
|
+
|
|
39
|
+
## Composables
|
|
40
|
+
|
|
41
|
+
- `useStrandsAuth` - Authentication state management composable
|
|
42
|
+
|
|
43
|
+
## Requirements
|
|
44
|
+
|
|
45
|
+
- Vue 3.4+
|
|
46
|
+
|
|
47
|
+
## License
|
|
48
|
+
|
|
49
|
+
MIT
|
|
50
|
+
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
|
|
2
|
+
export default _default;
|
|
3
|
+
//# sourceMappingURL=StrandsDeviceManager.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StrandsDeviceManager.vue.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/components/StrandsDeviceManager.vue"],"names":[],"mappings":"AAYA;;AAsEA,wBAMG"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
|
|
2
|
+
export default _default;
|
|
3
|
+
//# sourceMappingURL=StrandsMFASetup.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StrandsMFASetup.vue.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/components/StrandsMFASetup.vue"],"names":[],"mappings":"AAYA;;AAsEA,wBAMG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface Organization {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
slug: string;
|
|
5
|
+
}
|
|
6
|
+
interface Props {
|
|
7
|
+
organizations?: Organization[];
|
|
8
|
+
currentOrg?: Organization;
|
|
9
|
+
}
|
|
10
|
+
declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{}>, {
|
|
11
|
+
organizations: Organization[];
|
|
12
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=StrandsOrganizationSwitcher.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StrandsOrganizationSwitcher.vue.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/components/StrandsOrganizationSwitcher.vue"],"names":[],"mappings":"AAqBA;AAmDA,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,UAAU,KAAK;IACb,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;IAC9B,UAAU,CAAC,EAAE,YAAY,CAAA;CAC1B;;mBAFiB,YAAY,EAAE;;AA0FhC,wBAQG"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
|
|
2
|
+
export default _default;
|
|
3
|
+
//# sourceMappingURL=StrandsPasswordReset.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StrandsPasswordReset.vue.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/components/StrandsPasswordReset.vue"],"names":[],"mappings":"AAYA;;AAsEA,wBAMG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
oauthProviders?: string[];
|
|
3
|
+
redirectUrl?: string;
|
|
4
|
+
}
|
|
5
|
+
declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
6
|
+
success: (user: any) => any;
|
|
7
|
+
error: (error: string) => any;
|
|
8
|
+
}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{
|
|
9
|
+
onSuccess?: ((user: any) => any) | undefined;
|
|
10
|
+
onError?: ((error: string) => any) | undefined;
|
|
11
|
+
}>, {
|
|
12
|
+
oauthProviders: string[];
|
|
13
|
+
redirectUrl: string;
|
|
14
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
15
|
+
export default _default;
|
|
16
|
+
//# sourceMappingURL=StrandsSignIn.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StrandsSignIn.vue.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/components/StrandsSignIn.vue"],"names":[],"mappings":"AAwEA;AAkIA,UAAU,KAAK;IACb,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;;;;;;;;oBAFkB,MAAM,EAAE;iBACX,MAAM;;AA6LtB,wBASG"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
2
|
+
success: (user: any) => any;
|
|
3
|
+
error: (error: string) => any;
|
|
4
|
+
}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{
|
|
5
|
+
onSuccess?: ((user: any) => any) | undefined;
|
|
6
|
+
onError?: ((error: string) => any) | undefined;
|
|
7
|
+
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
|
|
8
|
+
export default _default;
|
|
9
|
+
//# sourceMappingURL=StrandsSignUp.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StrandsSignUp.vue.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/components/StrandsSignUp.vue"],"names":[],"mappings":"AAgGA;;;;;;;;AA2VA,wBAOG"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
|
|
2
|
+
export default _default;
|
|
3
|
+
//# sourceMappingURL=StrandsUserProfile.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StrandsUserProfile.vue.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/components/StrandsUserProfile.vue"],"names":[],"mappings":"AAYA;;AAsEA,wBAMG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
interface User {
|
|
2
|
+
id: string;
|
|
3
|
+
email: string;
|
|
4
|
+
firstName?: string;
|
|
5
|
+
lastName?: string;
|
|
6
|
+
emailVerified: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function useStrandsAuth(): {
|
|
9
|
+
currentUser: import('vue').ComputedRef<{
|
|
10
|
+
id: string;
|
|
11
|
+
email: string;
|
|
12
|
+
firstName?: string | undefined;
|
|
13
|
+
lastName?: string | undefined;
|
|
14
|
+
emailVerified: boolean;
|
|
15
|
+
} | null>;
|
|
16
|
+
currentSession: import('vue').ComputedRef<{
|
|
17
|
+
accessToken: string;
|
|
18
|
+
refreshToken: string;
|
|
19
|
+
expiresAt: Date;
|
|
20
|
+
} | null>;
|
|
21
|
+
isAuthenticated: import('vue').ComputedRef<boolean>;
|
|
22
|
+
loading: import('vue').ComputedRef<boolean>;
|
|
23
|
+
signIn: (credentials: {
|
|
24
|
+
email: string;
|
|
25
|
+
password: string;
|
|
26
|
+
}) => Promise<void>;
|
|
27
|
+
signUp: (userData: {
|
|
28
|
+
email: string;
|
|
29
|
+
password: string;
|
|
30
|
+
firstName?: string;
|
|
31
|
+
lastName?: string;
|
|
32
|
+
}) => Promise<void>;
|
|
33
|
+
signOut: () => Promise<void>;
|
|
34
|
+
refreshToken: () => Promise<void>;
|
|
35
|
+
updateProfile: (profileData: Partial<User>) => Promise<void>;
|
|
36
|
+
};
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=useStrandsAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStrandsAuth.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/composables/useStrandsAuth.ts"],"names":[],"mappings":"AAGA,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,OAAO,CAAA;CACvB;AAaD,wBAAgB,cAAc;;YAlBxB,MAAM;eACH,MAAM;oBACD,MAAM;mBACP,MAAM;uBACF,OAAO;;;qBAKT,MAAM;sBACL,MAAM;mBACT,IAAI;;;;0BAUoB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;uBAyBtC;QAC9B,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB;;;iCA+CyC,OAAO,CAAC,IAAI,CAAC;EA4BxD"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { default as StrandsSignIn } from './components/StrandsSignIn.vue';
|
|
2
|
+
export { default as StrandsSignUp } from './components/StrandsSignUp.vue';
|
|
3
|
+
export { default as StrandsUserProfile } from './components/StrandsUserProfile.vue';
|
|
4
|
+
export { default as StrandsPasswordReset } from './components/StrandsPasswordReset.vue';
|
|
5
|
+
export { default as StrandsMFASetup } from './components/StrandsMFASetup.vue';
|
|
6
|
+
export { default as StrandsDeviceManager } from './components/StrandsDeviceManager.vue';
|
|
7
|
+
export { default as StrandsOrganizationSwitcher } from './components/StrandsOrganizationSwitcher.vue';
|
|
8
|
+
export { useStrandsAuth } from './composables/useStrandsAuth';
|
|
9
|
+
export type * from './types';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../apps/accounts-ui/src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACzE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACzE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AACnF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AACvF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AACvF,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,8CAA8C,CAAA;AAGrG,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAG7D,mBAAmB,SAAS,CAAA"}
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { defineComponent as b, ref as f, reactive as E, createElementBlock as l, openBlock as n, createElementVNode as e, createCommentVNode as _, withModifiers as N, withDirectives as v, vModelText as w, toDisplayString as x, createStaticVNode as S, Fragment as P, renderList as $, computed as A, createTextVNode as U } from "vue";
|
|
2
|
+
const C = { class: "max-w-md mx-auto bg-white rounded-lg shadow-lg p-6" }, O = ["disabled"], V = {
|
|
3
|
+
key: 0,
|
|
4
|
+
class: "mt-6"
|
|
5
|
+
}, F = { class: "mt-4 space-y-2" }, M = ["onClick"], I = {
|
|
6
|
+
key: 1,
|
|
7
|
+
class: "mt-4 p-3 bg-red-50 border border-red-200 rounded-md"
|
|
8
|
+
}, z = { class: "text-sm text-red-600" }, Y = /* @__PURE__ */ b({
|
|
9
|
+
__name: "StrandsSignIn",
|
|
10
|
+
props: {
|
|
11
|
+
oauthProviders: { default: () => [] },
|
|
12
|
+
redirectUrl: { default: "/" }
|
|
13
|
+
},
|
|
14
|
+
emits: ["success", "error"],
|
|
15
|
+
setup(m, { emit: i }) {
|
|
16
|
+
const r = i, d = f(!1), o = f(""), t = E({
|
|
17
|
+
email: "",
|
|
18
|
+
password: ""
|
|
19
|
+
}), a = async () => {
|
|
20
|
+
d.value = !0, o.value = "";
|
|
21
|
+
try {
|
|
22
|
+
console.log("Sign in attempt:", t), r("success", { email: t.email });
|
|
23
|
+
} catch {
|
|
24
|
+
o.value = "Invalid email or password", r("error", o.value);
|
|
25
|
+
} finally {
|
|
26
|
+
d.value = !1;
|
|
27
|
+
}
|
|
28
|
+
}, k = async (p) => {
|
|
29
|
+
try {
|
|
30
|
+
console.log("OAuth sign in:", p);
|
|
31
|
+
} catch {
|
|
32
|
+
o.value = `Failed to sign in with ${p}`, r("error", o.value);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
return (p, s) => {
|
|
36
|
+
var u;
|
|
37
|
+
return n(), l("div", C, [
|
|
38
|
+
s[5] || (s[5] = e("div", { class: "text-center mb-6" }, [
|
|
39
|
+
e("h2", { class: "text-2xl font-bold text-gray-900" }, "Sign In"),
|
|
40
|
+
e("p", { class: "text-gray-600 mt-2" }, "Welcome back to your account")
|
|
41
|
+
], -1)),
|
|
42
|
+
e("form", {
|
|
43
|
+
onSubmit: N(a, ["prevent"]),
|
|
44
|
+
class: "space-y-4"
|
|
45
|
+
}, [
|
|
46
|
+
e("div", null, [
|
|
47
|
+
s[2] || (s[2] = e("label", {
|
|
48
|
+
for: "email",
|
|
49
|
+
class: "block text-sm font-medium text-gray-700 mb-1"
|
|
50
|
+
}, " Email Address ", -1)),
|
|
51
|
+
v(e("input", {
|
|
52
|
+
id: "email",
|
|
53
|
+
"onUpdate:modelValue": s[0] || (s[0] = (g) => t.email = g),
|
|
54
|
+
type: "email",
|
|
55
|
+
required: "",
|
|
56
|
+
class: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",
|
|
57
|
+
placeholder: "Enter your email"
|
|
58
|
+
}, null, 512), [
|
|
59
|
+
[w, t.email]
|
|
60
|
+
])
|
|
61
|
+
]),
|
|
62
|
+
e("div", null, [
|
|
63
|
+
s[3] || (s[3] = e("label", {
|
|
64
|
+
for: "password",
|
|
65
|
+
class: "block text-sm font-medium text-gray-700 mb-1"
|
|
66
|
+
}, " Password ", -1)),
|
|
67
|
+
v(e("input", {
|
|
68
|
+
id: "password",
|
|
69
|
+
"onUpdate:modelValue": s[1] || (s[1] = (g) => t.password = g),
|
|
70
|
+
type: "password",
|
|
71
|
+
required: "",
|
|
72
|
+
class: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",
|
|
73
|
+
placeholder: "Enter your password"
|
|
74
|
+
}, null, 512), [
|
|
75
|
+
[w, t.password]
|
|
76
|
+
])
|
|
77
|
+
]),
|
|
78
|
+
e("button", {
|
|
79
|
+
type: "submit",
|
|
80
|
+
disabled: d.value,
|
|
81
|
+
class: "w-full bg-[#EA00A8] text-white py-2 px-4 rounded-md hover:bg-[#B8006F] focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed"
|
|
82
|
+
}, x(d.value ? "Signing In..." : "Sign In"), 9, O)
|
|
83
|
+
], 32),
|
|
84
|
+
(u = p.oauthProviders) != null && u.length ? (n(), l("div", V, [
|
|
85
|
+
s[4] || (s[4] = S('<div class="relative"><div class="absolute inset-0 flex items-center"><div class="w-full border-t border-gray-300"></div></div><div class="relative flex justify-center text-sm"><span class="px-2 bg-white text-gray-500">Or continue with</span></div></div>', 1)),
|
|
86
|
+
e("div", F, [
|
|
87
|
+
(n(!0), l(P, null, $(p.oauthProviders, (g) => (n(), l("button", {
|
|
88
|
+
key: g,
|
|
89
|
+
onClick: (Q) => k(g),
|
|
90
|
+
class: "w-full flex items-center justify-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-[#EA00A8]"
|
|
91
|
+
}, x(g.charAt(0).toUpperCase() + g.slice(1)), 9, M))), 128))
|
|
92
|
+
])
|
|
93
|
+
])) : _("", !0),
|
|
94
|
+
o.value ? (n(), l("div", I, [
|
|
95
|
+
e("p", z, x(o.value), 1)
|
|
96
|
+
])) : _("", !0)
|
|
97
|
+
]);
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}), D = { class: "max-w-md mx-auto bg-white rounded-lg shadow-lg p-6" }, T = { class: "grid grid-cols-2 gap-4" }, q = ["disabled"], B = {
|
|
101
|
+
key: 0,
|
|
102
|
+
class: "mt-4 p-3 bg-red-50 border border-red-200 rounded-md"
|
|
103
|
+
}, j = { class: "text-sm text-red-600" }, L = {
|
|
104
|
+
key: 1,
|
|
105
|
+
class: "mt-2 p-2 bg-yellow-50 border border-yellow-200 rounded-md"
|
|
106
|
+
}, Z = /* @__PURE__ */ b({
|
|
107
|
+
__name: "StrandsSignUp",
|
|
108
|
+
emits: ["success", "error"],
|
|
109
|
+
setup(m, { emit: i }) {
|
|
110
|
+
const r = i, d = f(!1), o = f(""), t = E({
|
|
111
|
+
firstName: "",
|
|
112
|
+
lastName: "",
|
|
113
|
+
email: "",
|
|
114
|
+
password: "",
|
|
115
|
+
confirmPassword: ""
|
|
116
|
+
}), a = A(() => t.password === t.confirmPassword), k = async () => {
|
|
117
|
+
if (!a.value) {
|
|
118
|
+
o.value = "Passwords do not match";
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
d.value = !0, o.value = "";
|
|
122
|
+
try {
|
|
123
|
+
console.log("Sign up attempt:", { ...t, password: "***", confirmPassword: "***" }), r("success", {
|
|
124
|
+
email: t.email,
|
|
125
|
+
firstName: t.firstName,
|
|
126
|
+
lastName: t.lastName
|
|
127
|
+
});
|
|
128
|
+
} catch {
|
|
129
|
+
o.value = "Failed to create account", r("error", o.value);
|
|
130
|
+
} finally {
|
|
131
|
+
d.value = !1;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
return (p, s) => (n(), l("div", D, [
|
|
135
|
+
s[11] || (s[11] = e("div", { class: "text-center mb-6" }, [
|
|
136
|
+
e("h2", { class: "text-2xl font-bold text-gray-900" }, "Create Account"),
|
|
137
|
+
e("p", { class: "text-gray-600 mt-2" }, "Join us today")
|
|
138
|
+
], -1)),
|
|
139
|
+
e("form", {
|
|
140
|
+
onSubmit: N(k, ["prevent"]),
|
|
141
|
+
class: "space-y-4"
|
|
142
|
+
}, [
|
|
143
|
+
e("div", T, [
|
|
144
|
+
e("div", null, [
|
|
145
|
+
s[5] || (s[5] = e("label", {
|
|
146
|
+
for: "firstName",
|
|
147
|
+
class: "block text-sm font-medium text-gray-700 mb-1"
|
|
148
|
+
}, " First Name ", -1)),
|
|
149
|
+
v(e("input", {
|
|
150
|
+
id: "firstName",
|
|
151
|
+
"onUpdate:modelValue": s[0] || (s[0] = (u) => t.firstName = u),
|
|
152
|
+
type: "text",
|
|
153
|
+
class: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",
|
|
154
|
+
placeholder: "First name"
|
|
155
|
+
}, null, 512), [
|
|
156
|
+
[w, t.firstName]
|
|
157
|
+
])
|
|
158
|
+
]),
|
|
159
|
+
e("div", null, [
|
|
160
|
+
s[6] || (s[6] = e("label", {
|
|
161
|
+
for: "lastName",
|
|
162
|
+
class: "block text-sm font-medium text-gray-700 mb-1"
|
|
163
|
+
}, " Last Name ", -1)),
|
|
164
|
+
v(e("input", {
|
|
165
|
+
id: "lastName",
|
|
166
|
+
"onUpdate:modelValue": s[1] || (s[1] = (u) => t.lastName = u),
|
|
167
|
+
type: "text",
|
|
168
|
+
class: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",
|
|
169
|
+
placeholder: "Last name"
|
|
170
|
+
}, null, 512), [
|
|
171
|
+
[w, t.lastName]
|
|
172
|
+
])
|
|
173
|
+
])
|
|
174
|
+
]),
|
|
175
|
+
e("div", null, [
|
|
176
|
+
s[7] || (s[7] = e("label", {
|
|
177
|
+
for: "email",
|
|
178
|
+
class: "block text-sm font-medium text-gray-700 mb-1"
|
|
179
|
+
}, " Email Address ", -1)),
|
|
180
|
+
v(e("input", {
|
|
181
|
+
id: "email",
|
|
182
|
+
"onUpdate:modelValue": s[2] || (s[2] = (u) => t.email = u),
|
|
183
|
+
type: "email",
|
|
184
|
+
required: "",
|
|
185
|
+
class: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",
|
|
186
|
+
placeholder: "Enter your email"
|
|
187
|
+
}, null, 512), [
|
|
188
|
+
[w, t.email]
|
|
189
|
+
])
|
|
190
|
+
]),
|
|
191
|
+
e("div", null, [
|
|
192
|
+
s[8] || (s[8] = e("label", {
|
|
193
|
+
for: "password",
|
|
194
|
+
class: "block text-sm font-medium text-gray-700 mb-1"
|
|
195
|
+
}, " Password ", -1)),
|
|
196
|
+
v(e("input", {
|
|
197
|
+
id: "password",
|
|
198
|
+
"onUpdate:modelValue": s[3] || (s[3] = (u) => t.password = u),
|
|
199
|
+
type: "password",
|
|
200
|
+
required: "",
|
|
201
|
+
class: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",
|
|
202
|
+
placeholder: "Create a password"
|
|
203
|
+
}, null, 512), [
|
|
204
|
+
[w, t.password]
|
|
205
|
+
])
|
|
206
|
+
]),
|
|
207
|
+
e("div", null, [
|
|
208
|
+
s[9] || (s[9] = e("label", {
|
|
209
|
+
for: "confirmPassword",
|
|
210
|
+
class: "block text-sm font-medium text-gray-700 mb-1"
|
|
211
|
+
}, " Confirm Password ", -1)),
|
|
212
|
+
v(e("input", {
|
|
213
|
+
id: "confirmPassword",
|
|
214
|
+
"onUpdate:modelValue": s[4] || (s[4] = (u) => t.confirmPassword = u),
|
|
215
|
+
type: "password",
|
|
216
|
+
required: "",
|
|
217
|
+
class: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",
|
|
218
|
+
placeholder: "Confirm your password"
|
|
219
|
+
}, null, 512), [
|
|
220
|
+
[w, t.confirmPassword]
|
|
221
|
+
])
|
|
222
|
+
]),
|
|
223
|
+
e("button", {
|
|
224
|
+
type: "submit",
|
|
225
|
+
disabled: d.value || !a.value,
|
|
226
|
+
class: "w-full bg-[#EA00A8] text-white py-2 px-4 rounded-md hover:bg-[#B8006F] focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed"
|
|
227
|
+
}, x(d.value ? "Creating Account..." : "Create Account"), 9, q)
|
|
228
|
+
], 32),
|
|
229
|
+
o.value ? (n(), l("div", B, [
|
|
230
|
+
e("p", j, x(o.value), 1)
|
|
231
|
+
])) : _("", !0),
|
|
232
|
+
!a.value && t.confirmPassword ? (n(), l("div", L, s[10] || (s[10] = [
|
|
233
|
+
e("p", { class: "text-sm text-yellow-600" }, "Passwords do not match", -1)
|
|
234
|
+
]))) : _("", !0)
|
|
235
|
+
]));
|
|
236
|
+
}
|
|
237
|
+
}), R = { class: "max-w-md mx-auto bg-white rounded-lg shadow-lg p-6" }, ee = /* @__PURE__ */ b({
|
|
238
|
+
__name: "StrandsUserProfile",
|
|
239
|
+
setup(m) {
|
|
240
|
+
return (i, r) => (n(), l("div", R, r[0] || (r[0] = [
|
|
241
|
+
S('<div class="text-center mb-6"><h2 class="text-2xl font-bold text-gray-900">User Profile</h2><p class="text-gray-600 mt-2">Manage your account information</p></div><div class="space-y-4"><p class="text-gray-500">Profile management interface will be implemented here.</p></div>', 2)
|
|
242
|
+
])));
|
|
243
|
+
}
|
|
244
|
+
}), J = { class: "max-w-md mx-auto bg-white rounded-lg shadow-lg p-6" }, se = /* @__PURE__ */ b({
|
|
245
|
+
__name: "StrandsPasswordReset",
|
|
246
|
+
setup(m) {
|
|
247
|
+
return (i, r) => (n(), l("div", J, r[0] || (r[0] = [
|
|
248
|
+
S('<div class="text-center mb-6"><h2 class="text-2xl font-bold text-gray-900">Reset Password</h2><p class="text-gray-600 mt-2">Enter your email to reset your password</p></div><div class="space-y-4"><p class="text-gray-500">Password reset functionality will be implemented here.</p></div>', 2)
|
|
249
|
+
])));
|
|
250
|
+
}
|
|
251
|
+
}), W = { class: "max-w-md mx-auto bg-white rounded-lg shadow-lg p-6" }, te = /* @__PURE__ */ b({
|
|
252
|
+
__name: "StrandsMFASetup",
|
|
253
|
+
setup(m) {
|
|
254
|
+
return (i, r) => (n(), l("div", W, r[0] || (r[0] = [
|
|
255
|
+
S('<div class="text-center mb-6"><h2 class="text-2xl font-bold text-gray-900">Two-Factor Authentication</h2><p class="text-gray-600 mt-2">Secure your account with 2FA</p></div><div class="space-y-4"><p class="text-gray-500">MFA setup functionality will be implemented here.</p></div>', 2)
|
|
256
|
+
])));
|
|
257
|
+
}
|
|
258
|
+
}), G = { class: "max-w-2xl mx-auto bg-white rounded-lg shadow-lg p-6" }, re = /* @__PURE__ */ b({
|
|
259
|
+
__name: "StrandsDeviceManager",
|
|
260
|
+
setup(m) {
|
|
261
|
+
return (i, r) => (n(), l("div", G, r[0] || (r[0] = [
|
|
262
|
+
S('<div class="text-center mb-6"><h2 class="text-2xl font-bold text-gray-900">Device Manager</h2><p class="text-gray-600 mt-2">Manage your active devices and sessions</p></div><div class="space-y-4"><p class="text-gray-500">Device management functionality will be implemented here.</p></div>', 2)
|
|
263
|
+
])));
|
|
264
|
+
}
|
|
265
|
+
}), H = { class: "relative inline-block text-left" }, K = {
|
|
266
|
+
key: 0,
|
|
267
|
+
class: "absolute right-0 z-10 mt-2 w-56 origin-top-right rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5"
|
|
268
|
+
}, oe = /* @__PURE__ */ b({
|
|
269
|
+
__name: "StrandsOrganizationSwitcher",
|
|
270
|
+
props: {
|
|
271
|
+
organizations: { default: () => [] },
|
|
272
|
+
currentOrg: {}
|
|
273
|
+
},
|
|
274
|
+
setup(m) {
|
|
275
|
+
const i = f(!1), r = () => {
|
|
276
|
+
i.value = !i.value;
|
|
277
|
+
};
|
|
278
|
+
return (d, o) => {
|
|
279
|
+
var t;
|
|
280
|
+
return n(), l("div", H, [
|
|
281
|
+
e("button", {
|
|
282
|
+
type: "button",
|
|
283
|
+
class: "inline-flex w-full justify-center gap-x-1.5 rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50",
|
|
284
|
+
onClick: r
|
|
285
|
+
}, [
|
|
286
|
+
U(x(((t = d.currentOrg) == null ? void 0 : t.name) || "Select Organization") + " ", 1),
|
|
287
|
+
o[0] || (o[0] = e("svg", {
|
|
288
|
+
class: "-mr-1 h-5 w-5 text-gray-400",
|
|
289
|
+
viewBox: "0 0 20 20",
|
|
290
|
+
fill: "currentColor"
|
|
291
|
+
}, [
|
|
292
|
+
e("path", {
|
|
293
|
+
"fill-rule": "evenodd",
|
|
294
|
+
d: "M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z",
|
|
295
|
+
"clip-rule": "evenodd"
|
|
296
|
+
})
|
|
297
|
+
], -1))
|
|
298
|
+
]),
|
|
299
|
+
i.value ? (n(), l("div", K, o[1] || (o[1] = [
|
|
300
|
+
e("div", { class: "py-1" }, [
|
|
301
|
+
e("p", { class: "px-4 py-2 text-xs text-gray-500 uppercase tracking-wide" }, "Organizations"),
|
|
302
|
+
e("p", { class: "px-4 py-2 text-gray-500" }, "Organization switching will be implemented here.")
|
|
303
|
+
], -1)
|
|
304
|
+
]))) : _("", !0)
|
|
305
|
+
]);
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
}), y = f(null), h = f(null), c = f(!1);
|
|
309
|
+
function ae() {
|
|
310
|
+
const m = A(() => y.value !== null), i = async (a) => {
|
|
311
|
+
c.value = !0;
|
|
312
|
+
try {
|
|
313
|
+
console.log("Sign in with:", a), y.value = {
|
|
314
|
+
id: "1",
|
|
315
|
+
email: a.email,
|
|
316
|
+
firstName: "John",
|
|
317
|
+
lastName: "Doe",
|
|
318
|
+
emailVerified: !0
|
|
319
|
+
}, h.value = {
|
|
320
|
+
accessToken: "mock-access-token",
|
|
321
|
+
refreshToken: "mock-refresh-token",
|
|
322
|
+
expiresAt: new Date(Date.now() + 5 * 60 * 1e3)
|
|
323
|
+
// 5 minutes
|
|
324
|
+
};
|
|
325
|
+
} finally {
|
|
326
|
+
c.value = !1;
|
|
327
|
+
}
|
|
328
|
+
}, r = async (a) => {
|
|
329
|
+
c.value = !0;
|
|
330
|
+
try {
|
|
331
|
+
console.log("Sign up with:", a), y.value = {
|
|
332
|
+
id: "1",
|
|
333
|
+
email: a.email,
|
|
334
|
+
firstName: a.firstName,
|
|
335
|
+
lastName: a.lastName,
|
|
336
|
+
emailVerified: !1
|
|
337
|
+
};
|
|
338
|
+
} finally {
|
|
339
|
+
c.value = !1;
|
|
340
|
+
}
|
|
341
|
+
}, d = async () => {
|
|
342
|
+
c.value = !0;
|
|
343
|
+
try {
|
|
344
|
+
console.log("Sign out"), y.value = null, h.value = null;
|
|
345
|
+
} finally {
|
|
346
|
+
c.value = !1;
|
|
347
|
+
}
|
|
348
|
+
}, o = async () => {
|
|
349
|
+
if (h.value) {
|
|
350
|
+
c.value = !0;
|
|
351
|
+
try {
|
|
352
|
+
console.log("Refresh token"), h.value.expiresAt = new Date(Date.now() + 5 * 60 * 1e3);
|
|
353
|
+
} finally {
|
|
354
|
+
c.value = !1;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}, t = async (a) => {
|
|
358
|
+
c.value = !0;
|
|
359
|
+
try {
|
|
360
|
+
console.log("Update profile:", a), y.value && Object.assign(y.value, a);
|
|
361
|
+
} finally {
|
|
362
|
+
c.value = !1;
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
return {
|
|
366
|
+
// State
|
|
367
|
+
currentUser: A(() => y.value),
|
|
368
|
+
currentSession: A(() => h.value),
|
|
369
|
+
isAuthenticated: m,
|
|
370
|
+
loading: A(() => c.value),
|
|
371
|
+
// Methods
|
|
372
|
+
signIn: i,
|
|
373
|
+
signUp: r,
|
|
374
|
+
signOut: d,
|
|
375
|
+
refreshToken: o,
|
|
376
|
+
updateProfile: t
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
export {
|
|
380
|
+
re as StrandsDeviceManager,
|
|
381
|
+
te as StrandsMFASetup,
|
|
382
|
+
oe as StrandsOrganizationSwitcher,
|
|
383
|
+
se as StrandsPasswordReset,
|
|
384
|
+
Y as StrandsSignIn,
|
|
385
|
+
Z as StrandsSignUp,
|
|
386
|
+
ee as StrandsUserProfile,
|
|
387
|
+
ae as useStrandsAuth
|
|
388
|
+
};
|
|
389
|
+
//# sourceMappingURL=strands-auth-ui.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strands-auth-ui.es.js","sources":["../../../apps/accounts-ui/src/components/StrandsSignIn.vue","../../../apps/accounts-ui/src/components/StrandsSignUp.vue","../../../apps/accounts-ui/src/components/StrandsUserProfile.vue","../../../apps/accounts-ui/src/components/StrandsPasswordReset.vue","../../../apps/accounts-ui/src/components/StrandsMFASetup.vue","../../../apps/accounts-ui/src/components/StrandsDeviceManager.vue","../../../apps/accounts-ui/src/components/StrandsOrganizationSwitcher.vue","../../../apps/accounts-ui/src/composables/useStrandsAuth.ts"],"sourcesContent":["<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Sign In</h2>\n <p class=\"text-gray-600 mt-2\">Welcome back to your account</p>\n </div>\n\n <form @submit.prevent=\"handleSignIn\" class=\"space-y-4\">\n <div>\n <label for=\"email\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Email Address\n </label>\n <input\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n required\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"Enter your email\"\n />\n </div>\n\n <div>\n <label for=\"password\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Password\n </label>\n <input\n id=\"password\"\n v-model=\"form.password\"\n type=\"password\"\n required\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"Enter your password\"\n />\n </div>\n\n <button\n type=\"submit\"\n :disabled=\"loading\"\n class=\"w-full bg-[#EA00A8] text-white py-2 px-4 rounded-md hover:bg-[#B8006F] focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {{ loading ? 'Signing In...' : 'Sign In' }}\n </button>\n </form>\n\n <div v-if=\"oauthProviders?.length\" class=\"mt-6\">\n <div class=\"relative\">\n <div class=\"absolute inset-0 flex items-center\">\n <div class=\"w-full border-t border-gray-300\" />\n </div>\n <div class=\"relative flex justify-center text-sm\">\n <span class=\"px-2 bg-white text-gray-500\">Or continue with</span>\n </div>\n </div>\n\n <div class=\"mt-4 space-y-2\">\n <button\n v-for=\"provider in oauthProviders\"\n :key=\"provider\"\n @click=\"handleOAuthSignIn(provider)\"\n class=\"w-full flex items-center justify-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-[#EA00A8]\"\n >\n {{ provider.charAt(0).toUpperCase() + provider.slice(1) }}\n </button>\n </div>\n </div>\n\n <div v-if=\"error\" class=\"mt-4 p-3 bg-red-50 border border-red-200 rounded-md\">\n <p class=\"text-sm text-red-600\">{{ error }}</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive } from 'vue'\n\ninterface Props {\n oauthProviders?: string[]\n redirectUrl?: string\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n oauthProviders: () => [],\n redirectUrl: '/'\n})\n\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n email: '',\n password: ''\n})\n\nconst handleSignIn = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // TODO: Integrate with auth SDK\n console.log('Sign in attempt:', form)\n emit('success', { email: form.email })\n } catch (err) {\n error.value = 'Invalid email or password'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthSignIn = async (provider: string) => {\n try {\n // TODO: Integrate with OAuth providers\n console.log('OAuth sign in:', provider)\n } catch (err) {\n error.value = `Failed to sign in with ${provider}`\n emit('error', error.value)\n }\n}\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Create Account</h2>\n <p class=\"text-gray-600 mt-2\">Join us today</p>\n </div>\n\n <form @submit.prevent=\"handleSignUp\" class=\"space-y-4\">\n <div class=\"grid grid-cols-2 gap-4\">\n <div>\n <label for=\"firstName\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n First Name\n </label>\n <input\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"First name\"\n />\n </div>\n \n <div>\n <label for=\"lastName\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Last Name\n </label>\n <input\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"Last name\"\n />\n </div>\n </div>\n\n <div>\n <label for=\"email\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Email Address\n </label>\n <input\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n required\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"Enter your email\"\n />\n </div>\n\n <div>\n <label for=\"password\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Password\n </label>\n <input\n id=\"password\"\n v-model=\"form.password\"\n type=\"password\"\n required\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"Create a password\"\n />\n </div>\n\n <div>\n <label for=\"confirmPassword\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Confirm Password\n </label>\n <input\n id=\"confirmPassword\"\n v-model=\"form.confirmPassword\"\n type=\"password\"\n required\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"Confirm your password\"\n />\n </div>\n\n <button\n type=\"submit\"\n :disabled=\"loading || !isPasswordMatch\"\n class=\"w-full bg-[#EA00A8] text-white py-2 px-4 rounded-md hover:bg-[#B8006F] focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {{ loading ? 'Creating Account...' : 'Create Account' }}\n </button>\n </form>\n\n <div v-if=\"error\" class=\"mt-4 p-3 bg-red-50 border border-red-200 rounded-md\">\n <p class=\"text-sm text-red-600\">{{ error }}</p>\n </div>\n\n <div v-if=\"!isPasswordMatch && form.confirmPassword\" class=\"mt-2 p-2 bg-yellow-50 border border-yellow-200 rounded-md\">\n <p class=\"text-sm text-yellow-600\">Passwords do not match</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed } from 'vue'\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n}\n\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n password: '',\n confirmPassword: ''\n})\n\nconst isPasswordMatch = computed(() => {\n return form.password === form.confirmPassword\n})\n\nconst handleSignUp = async () => {\n if (!isPasswordMatch.value) {\n error.value = 'Passwords do not match'\n return\n }\n\n loading.value = true\n error.value = ''\n\n try {\n // TODO: Integrate with auth SDK\n console.log('Sign up attempt:', { ...form, password: '***', confirmPassword: '***' })\n emit('success', { \n email: form.email, \n firstName: form.firstName, \n lastName: form.lastName \n })\n } catch (err) {\n error.value = 'Failed to create account'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">User Profile</h2>\n <p class=\"text-gray-600 mt-2\">Manage your account information</p>\n </div>\n\n <div class=\"space-y-4\">\n <p class=\"text-gray-500\">Profile management interface will be implemented here.</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// TODO: Implement user profile functionality\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Reset Password</h2>\n <p class=\"text-gray-600 mt-2\">Enter your email to reset your password</p>\n </div>\n\n <div class=\"space-y-4\">\n <p class=\"text-gray-500\">Password reset functionality will be implemented here.</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// TODO: Implement password reset functionality\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Two-Factor Authentication</h2>\n <p class=\"text-gray-600 mt-2\">Secure your account with 2FA</p>\n </div>\n\n <div class=\"space-y-4\">\n <p class=\"text-gray-500\">MFA setup functionality will be implemented here.</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// TODO: Implement MFA setup functionality\n</script>","<template>\n <div class=\"max-w-2xl mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Device Manager</h2>\n <p class=\"text-gray-600 mt-2\">Manage your active devices and sessions</p>\n </div>\n\n <div class=\"space-y-4\">\n <p class=\"text-gray-500\">Device management functionality will be implemented here.</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// TODO: Implement device management functionality\n</script>","<template>\n <div class=\"relative inline-block text-left\">\n <button\n type=\"button\"\n class=\"inline-flex w-full justify-center gap-x-1.5 rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50\"\n @click=\"toggleDropdown\"\n >\n {{ currentOrg?.name || 'Select Organization' }}\n <svg class=\"-mr-1 h-5 w-5 text-gray-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n\n <div v-if=\"isOpen\" class=\"absolute right-0 z-10 mt-2 w-56 origin-top-right rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5\">\n <div class=\"py-1\">\n <p class=\"px-4 py-2 text-xs text-gray-500 uppercase tracking-wide\">Organizations</p>\n <p class=\"px-4 py-2 text-gray-500\">Organization switching will be implemented here.</p>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\n\ninterface Organization {\n id: string\n name: string\n slug: string\n}\n\ninterface Props {\n organizations?: Organization[]\n currentOrg?: Organization\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n organizations: () => [],\n})\n\nconst isOpen = ref(false)\n\nconst toggleDropdown = () => {\n isOpen.value = !isOpen.value\n}\n\n// TODO: Implement organization switching functionality\n</script>","import { ref, computed } from 'vue'\n\n// Mock user interface\ninterface User {\n id: string\n email: string\n firstName?: string\n lastName?: string\n emailVerified: boolean\n}\n\n// Mock session interface\ninterface Session {\n accessToken: string\n refreshToken: string\n expiresAt: Date\n}\n\nconst currentUser = ref<User | null>(null)\nconst currentSession = ref<Session | null>(null)\nconst loading = ref(false)\n\nexport function useStrandsAuth() {\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: { email: string; password: string }) => {\n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign in with:', credentials)\n \n // Mock successful sign in\n currentUser.value = {\n id: '1',\n email: credentials.email,\n firstName: 'John',\n lastName: 'Doe',\n emailVerified: true,\n }\n \n currentSession.value = {\n accessToken: 'mock-access-token',\n refreshToken: 'mock-refresh-token',\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes\n }\n } finally {\n loading.value = false\n }\n }\n\n const signUp = async (userData: {\n email: string\n password: string\n firstName?: string\n lastName?: string\n }) => {\n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign up with:', userData)\n \n // Mock successful sign up\n currentUser.value = {\n id: '1',\n email: userData.email,\n firstName: userData.firstName,\n lastName: userData.lastName,\n emailVerified: false,\n }\n } finally {\n loading.value = false\n }\n }\n\n const signOut = async () => {\n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign out')\n \n currentUser.value = null\n currentSession.value = null\n } finally {\n loading.value = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value) return\n \n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Refresh token')\n \n // Mock token refresh\n currentSession.value.expiresAt = new Date(Date.now() + 5 * 60 * 1000)\n } finally {\n loading.value = false\n }\n }\n\n const updateProfile = async (profileData: Partial<User>) => {\n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Update profile:', profileData)\n \n if (currentUser.value) {\n Object.assign(currentUser.value, profileData)\n }\n } finally {\n loading.value = false\n }\n }\n\n return {\n // State\n currentUser: computed(() => currentUser.value),\n currentSession: computed(() => currentSession.value),\n isAuthenticated,\n loading: computed(() => loading.value),\n\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n updateProfile,\n }\n}"],"names":["emit","__emit","loading","ref","error","form","reactive","handleSignIn","handleOAuthSignIn","provider","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_cache","$event","_vModelText","_hoisted_2","oauthProviders","_hoisted_3","_hoisted_4","_Fragment","_renderList","_toDisplayString","_hoisted_5","_hoisted_6","_hoisted_7","isPasswordMatch","computed","handleSignUp","isOpen","toggleDropdown","currentOrg","currentUser","currentSession","useStrandsAuth","isAuthenticated","signIn","credentials","signUp","userData","signOut","refreshToken","updateProfile","profileData"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(l,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(l=typeof globalThis<"u"?globalThis:l||self,e(l.StrandsAuthUI={},l.Vue))})(this,function(l,e){"use strict";const w={class:"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6"},b=["disabled"],x={key:0,class:"mt-6"},h={class:"mt-4 space-y-2"},E=["onClick"],N={key:1,class:"mt-4 p-3 bg-red-50 border border-red-200 rounded-md"},V={class:"text-sm text-red-600"},A=e.defineComponent({__name:"StrandsSignIn",props:{oauthProviders:{default:()=>[]},redirectUrl:{default:"/"}},emits:["success","error"],setup(m,{emit:a}){const s=a,i=e.ref(!1),r=e.ref(""),o=e.reactive({email:"",password:""}),n=async()=>{i.value=!0,r.value="";try{console.log("Sign in attempt:",o),s("success",{email:o.email})}catch{r.value="Invalid email or password",s("error",r.value)}finally{i.value=!1}},y=async p=>{try{console.log("OAuth sign in:",p)}catch{r.value=`Failed to sign in with ${p}`,s("error",r.value)}};return(p,t)=>{var d;return e.openBlock(),e.createElementBlock("div",w,[t[5]||(t[5]=e.createElementVNode("div",{class:"text-center mb-6"},[e.createElementVNode("h2",{class:"text-2xl font-bold text-gray-900"},"Sign In"),e.createElementVNode("p",{class:"text-gray-600 mt-2"},"Welcome back to your account")],-1)),e.createElementVNode("form",{onSubmit:e.withModifiers(n,["prevent"]),class:"space-y-4"},[e.createElementVNode("div",null,[t[2]||(t[2]=e.createElementVNode("label",{for:"email",class:"block text-sm font-medium text-gray-700 mb-1"}," Email Address ",-1)),e.withDirectives(e.createElementVNode("input",{id:"email","onUpdate:modelValue":t[0]||(t[0]=u=>o.email=u),type:"email",required:"",class:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",placeholder:"Enter your email"},null,512),[[e.vModelText,o.email]])]),e.createElementVNode("div",null,[t[3]||(t[3]=e.createElementVNode("label",{for:"password",class:"block text-sm font-medium text-gray-700 mb-1"}," Password ",-1)),e.withDirectives(e.createElementVNode("input",{id:"password","onUpdate:modelValue":t[1]||(t[1]=u=>o.password=u),type:"password",required:"",class:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",placeholder:"Enter your password"},null,512),[[e.vModelText,o.password]])]),e.createElementVNode("button",{type:"submit",disabled:i.value,class:"w-full bg-[#EA00A8] text-white py-2 px-4 rounded-md hover:bg-[#B8006F] focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed"},e.toDisplayString(i.value?"Signing In...":"Sign In"),9,b)],32),(d=p.oauthProviders)!=null&&d.length?(e.openBlock(),e.createElementBlock("div",x,[t[4]||(t[4]=e.createStaticVNode('<div class="relative"><div class="absolute inset-0 flex items-center"><div class="w-full border-t border-gray-300"></div></div><div class="relative flex justify-center text-sm"><span class="px-2 bg-white text-gray-500">Or continue with</span></div></div>',1)),e.createElementVNode("div",h,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.oauthProviders,u=>(e.openBlock(),e.createElementBlock("button",{key:u,onClick:R=>y(u),class:"w-full flex items-center justify-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-[#EA00A8]"},e.toDisplayString(u.charAt(0).toUpperCase()+u.slice(1)),9,E))),128))])])):e.createCommentVNode("",!0),r.value?(e.openBlock(),e.createElementBlock("div",N,[e.createElementVNode("p",V,e.toDisplayString(r.value),1)])):e.createCommentVNode("",!0)])}}}),k={class:"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6"},S={class:"grid grid-cols-2 gap-4"},_=["disabled"],B={key:0,class:"mt-4 p-3 bg-red-50 border border-red-200 rounded-md"},P={class:"text-sm text-red-600"},C={key:1,class:"mt-2 p-2 bg-yellow-50 border border-yellow-200 rounded-md"},M=e.defineComponent({__name:"StrandsSignUp",emits:["success","error"],setup(m,{emit:a}){const s=a,i=e.ref(!1),r=e.ref(""),o=e.reactive({firstName:"",lastName:"",email:"",password:"",confirmPassword:""}),n=e.computed(()=>o.password===o.confirmPassword),y=async()=>{if(!n.value){r.value="Passwords do not match";return}i.value=!0,r.value="";try{console.log("Sign up attempt:",{...o,password:"***",confirmPassword:"***"}),s("success",{email:o.email,firstName:o.firstName,lastName:o.lastName})}catch{r.value="Failed to create account",s("error",r.value)}finally{i.value=!1}};return(p,t)=>(e.openBlock(),e.createElementBlock("div",k,[t[11]||(t[11]=e.createElementVNode("div",{class:"text-center mb-6"},[e.createElementVNode("h2",{class:"text-2xl font-bold text-gray-900"},"Create Account"),e.createElementVNode("p",{class:"text-gray-600 mt-2"},"Join us today")],-1)),e.createElementVNode("form",{onSubmit:e.withModifiers(y,["prevent"]),class:"space-y-4"},[e.createElementVNode("div",S,[e.createElementVNode("div",null,[t[5]||(t[5]=e.createElementVNode("label",{for:"firstName",class:"block text-sm font-medium text-gray-700 mb-1"}," First Name ",-1)),e.withDirectives(e.createElementVNode("input",{id:"firstName","onUpdate:modelValue":t[0]||(t[0]=d=>o.firstName=d),type:"text",class:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",placeholder:"First name"},null,512),[[e.vModelText,o.firstName]])]),e.createElementVNode("div",null,[t[6]||(t[6]=e.createElementVNode("label",{for:"lastName",class:"block text-sm font-medium text-gray-700 mb-1"}," Last Name ",-1)),e.withDirectives(e.createElementVNode("input",{id:"lastName","onUpdate:modelValue":t[1]||(t[1]=d=>o.lastName=d),type:"text",class:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",placeholder:"Last name"},null,512),[[e.vModelText,o.lastName]])])]),e.createElementVNode("div",null,[t[7]||(t[7]=e.createElementVNode("label",{for:"email",class:"block text-sm font-medium text-gray-700 mb-1"}," Email Address ",-1)),e.withDirectives(e.createElementVNode("input",{id:"email","onUpdate:modelValue":t[2]||(t[2]=d=>o.email=d),type:"email",required:"",class:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",placeholder:"Enter your email"},null,512),[[e.vModelText,o.email]])]),e.createElementVNode("div",null,[t[8]||(t[8]=e.createElementVNode("label",{for:"password",class:"block text-sm font-medium text-gray-700 mb-1"}," Password ",-1)),e.withDirectives(e.createElementVNode("input",{id:"password","onUpdate:modelValue":t[3]||(t[3]=d=>o.password=d),type:"password",required:"",class:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",placeholder:"Create a password"},null,512),[[e.vModelText,o.password]])]),e.createElementVNode("div",null,[t[9]||(t[9]=e.createElementVNode("label",{for:"confirmPassword",class:"block text-sm font-medium text-gray-700 mb-1"}," Confirm Password ",-1)),e.withDirectives(e.createElementVNode("input",{id:"confirmPassword","onUpdate:modelValue":t[4]||(t[4]=d=>o.confirmPassword=d),type:"password",required:"",class:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]",placeholder:"Confirm your password"},null,512),[[e.vModelText,o.confirmPassword]])]),e.createElementVNode("button",{type:"submit",disabled:i.value||!n.value,class:"w-full bg-[#EA00A8] text-white py-2 px-4 rounded-md hover:bg-[#B8006F] focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed"},e.toDisplayString(i.value?"Creating Account...":"Create Account"),9,_)],32),r.value?(e.openBlock(),e.createElementBlock("div",B,[e.createElementVNode("p",P,e.toDisplayString(r.value),1)])):e.createCommentVNode("",!0),!n.value&&o.confirmPassword?(e.openBlock(),e.createElementBlock("div",C,t[10]||(t[10]=[e.createElementVNode("p",{class:"text-sm text-yellow-600"},"Passwords do not match",-1)]))):e.createCommentVNode("",!0)]))}}),U={class:"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6"},$=e.defineComponent({__name:"StrandsUserProfile",setup(m){return(a,s)=>(e.openBlock(),e.createElementBlock("div",U,s[0]||(s[0]=[e.createStaticVNode('<div class="text-center mb-6"><h2 class="text-2xl font-bold text-gray-900">User Profile</h2><p class="text-gray-600 mt-2">Manage your account information</p></div><div class="space-y-4"><p class="text-gray-500">Profile management interface will be implemented here.</p></div>',2)])))}}),D={class:"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6"},T=e.defineComponent({__name:"StrandsPasswordReset",setup(m){return(a,s)=>(e.openBlock(),e.createElementBlock("div",D,s[0]||(s[0]=[e.createStaticVNode('<div class="text-center mb-6"><h2 class="text-2xl font-bold text-gray-900">Reset Password</h2><p class="text-gray-600 mt-2">Enter your email to reset your password</p></div><div class="space-y-4"><p class="text-gray-500">Password reset functionality will be implemented here.</p></div>',2)])))}}),O={class:"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6"},F=e.defineComponent({__name:"StrandsMFASetup",setup(m){return(a,s)=>(e.openBlock(),e.createElementBlock("div",O,s[0]||(s[0]=[e.createStaticVNode('<div class="text-center mb-6"><h2 class="text-2xl font-bold text-gray-900">Two-Factor Authentication</h2><p class="text-gray-600 mt-2">Secure your account with 2FA</p></div><div class="space-y-4"><p class="text-gray-500">MFA setup functionality will be implemented here.</p></div>',2)])))}}),v={class:"max-w-2xl mx-auto bg-white rounded-lg shadow-lg p-6"},I=e.defineComponent({__name:"StrandsDeviceManager",setup(m){return(a,s)=>(e.openBlock(),e.createElementBlock("div",v,s[0]||(s[0]=[e.createStaticVNode('<div class="text-center mb-6"><h2 class="text-2xl font-bold text-gray-900">Device Manager</h2><p class="text-gray-600 mt-2">Manage your active devices and sessions</p></div><div class="space-y-4"><p class="text-gray-500">Device management functionality will be implemented here.</p></div>',2)])))}}),z={class:"relative inline-block text-left"},j={key:0,class:"absolute right-0 z-10 mt-2 w-56 origin-top-right rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5"},q=e.defineComponent({__name:"StrandsOrganizationSwitcher",props:{organizations:{default:()=>[]},currentOrg:{}},setup(m){const a=e.ref(!1),s=()=>{a.value=!a.value};return(i,r)=>{var o;return e.openBlock(),e.createElementBlock("div",z,[e.createElementVNode("button",{type:"button",class:"inline-flex w-full justify-center gap-x-1.5 rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50",onClick:s},[e.createTextVNode(e.toDisplayString(((o=i.currentOrg)==null?void 0:o.name)||"Select Organization")+" ",1),r[0]||(r[0]=e.createElementVNode("svg",{class:"-mr-1 h-5 w-5 text-gray-400",viewBox:"0 0 20 20",fill:"currentColor"},[e.createElementVNode("path",{"fill-rule":"evenodd",d:"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z","clip-rule":"evenodd"})],-1))]),a.value?(e.openBlock(),e.createElementBlock("div",j,r[1]||(r[1]=[e.createElementVNode("div",{class:"py-1"},[e.createElementVNode("p",{class:"px-4 py-2 text-xs text-gray-500 uppercase tracking-wide"},"Organizations"),e.createElementVNode("p",{class:"px-4 py-2 text-gray-500"},"Organization switching will be implemented here.")],-1)]))):e.createCommentVNode("",!0)])}}}),f=e.ref(null),g=e.ref(null),c=e.ref(!1);function L(){const m=e.computed(()=>f.value!==null),a=async n=>{c.value=!0;try{console.log("Sign in with:",n),f.value={id:"1",email:n.email,firstName:"John",lastName:"Doe",emailVerified:!0},g.value={accessToken:"mock-access-token",refreshToken:"mock-refresh-token",expiresAt:new Date(Date.now()+5*60*1e3)}}finally{c.value=!1}},s=async n=>{c.value=!0;try{console.log("Sign up with:",n),f.value={id:"1",email:n.email,firstName:n.firstName,lastName:n.lastName,emailVerified:!1}}finally{c.value=!1}},i=async()=>{c.value=!0;try{console.log("Sign out"),f.value=null,g.value=null}finally{c.value=!1}},r=async()=>{if(g.value){c.value=!0;try{console.log("Refresh token"),g.value.expiresAt=new Date(Date.now()+5*60*1e3)}finally{c.value=!1}}},o=async n=>{c.value=!0;try{console.log("Update profile:",n),f.value&&Object.assign(f.value,n)}finally{c.value=!1}};return{currentUser:e.computed(()=>f.value),currentSession:e.computed(()=>g.value),isAuthenticated:m,loading:e.computed(()=>c.value),signIn:a,signUp:s,signOut:i,refreshToken:r,updateProfile:o}}l.StrandsDeviceManager=I,l.StrandsMFASetup=F,l.StrandsOrganizationSwitcher=q,l.StrandsPasswordReset=T,l.StrandsSignIn=A,l.StrandsSignUp=M,l.StrandsUserProfile=$,l.useStrandsAuth=L,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})});
|
|
2
|
+
//# sourceMappingURL=strands-auth-ui.umd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strands-auth-ui.umd.js","sources":["../../../apps/accounts-ui/src/components/StrandsSignIn.vue","../../../apps/accounts-ui/src/components/StrandsSignUp.vue","../../../apps/accounts-ui/src/components/StrandsUserProfile.vue","../../../apps/accounts-ui/src/components/StrandsPasswordReset.vue","../../../apps/accounts-ui/src/components/StrandsMFASetup.vue","../../../apps/accounts-ui/src/components/StrandsDeviceManager.vue","../../../apps/accounts-ui/src/components/StrandsOrganizationSwitcher.vue","../../../apps/accounts-ui/src/composables/useStrandsAuth.ts"],"sourcesContent":["<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Sign In</h2>\n <p class=\"text-gray-600 mt-2\">Welcome back to your account</p>\n </div>\n\n <form @submit.prevent=\"handleSignIn\" class=\"space-y-4\">\n <div>\n <label for=\"email\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Email Address\n </label>\n <input\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n required\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"Enter your email\"\n />\n </div>\n\n <div>\n <label for=\"password\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Password\n </label>\n <input\n id=\"password\"\n v-model=\"form.password\"\n type=\"password\"\n required\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"Enter your password\"\n />\n </div>\n\n <button\n type=\"submit\"\n :disabled=\"loading\"\n class=\"w-full bg-[#EA00A8] text-white py-2 px-4 rounded-md hover:bg-[#B8006F] focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {{ loading ? 'Signing In...' : 'Sign In' }}\n </button>\n </form>\n\n <div v-if=\"oauthProviders?.length\" class=\"mt-6\">\n <div class=\"relative\">\n <div class=\"absolute inset-0 flex items-center\">\n <div class=\"w-full border-t border-gray-300\" />\n </div>\n <div class=\"relative flex justify-center text-sm\">\n <span class=\"px-2 bg-white text-gray-500\">Or continue with</span>\n </div>\n </div>\n\n <div class=\"mt-4 space-y-2\">\n <button\n v-for=\"provider in oauthProviders\"\n :key=\"provider\"\n @click=\"handleOAuthSignIn(provider)\"\n class=\"w-full flex items-center justify-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-[#EA00A8]\"\n >\n {{ provider.charAt(0).toUpperCase() + provider.slice(1) }}\n </button>\n </div>\n </div>\n\n <div v-if=\"error\" class=\"mt-4 p-3 bg-red-50 border border-red-200 rounded-md\">\n <p class=\"text-sm text-red-600\">{{ error }}</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive } from 'vue'\n\ninterface Props {\n oauthProviders?: string[]\n redirectUrl?: string\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n oauthProviders: () => [],\n redirectUrl: '/'\n})\n\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n email: '',\n password: ''\n})\n\nconst handleSignIn = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // TODO: Integrate with auth SDK\n console.log('Sign in attempt:', form)\n emit('success', { email: form.email })\n } catch (err) {\n error.value = 'Invalid email or password'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthSignIn = async (provider: string) => {\n try {\n // TODO: Integrate with OAuth providers\n console.log('OAuth sign in:', provider)\n } catch (err) {\n error.value = `Failed to sign in with ${provider}`\n emit('error', error.value)\n }\n}\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Create Account</h2>\n <p class=\"text-gray-600 mt-2\">Join us today</p>\n </div>\n\n <form @submit.prevent=\"handleSignUp\" class=\"space-y-4\">\n <div class=\"grid grid-cols-2 gap-4\">\n <div>\n <label for=\"firstName\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n First Name\n </label>\n <input\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"First name\"\n />\n </div>\n \n <div>\n <label for=\"lastName\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Last Name\n </label>\n <input\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"Last name\"\n />\n </div>\n </div>\n\n <div>\n <label for=\"email\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Email Address\n </label>\n <input\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n required\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"Enter your email\"\n />\n </div>\n\n <div>\n <label for=\"password\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Password\n </label>\n <input\n id=\"password\"\n v-model=\"form.password\"\n type=\"password\"\n required\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"Create a password\"\n />\n </div>\n\n <div>\n <label for=\"confirmPassword\" class=\"block text-sm font-medium text-gray-700 mb-1\">\n Confirm Password\n </label>\n <input\n id=\"confirmPassword\"\n v-model=\"form.confirmPassword\"\n type=\"password\"\n required\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:border-[#EA00A8]\"\n placeholder=\"Confirm your password\"\n />\n </div>\n\n <button\n type=\"submit\"\n :disabled=\"loading || !isPasswordMatch\"\n class=\"w-full bg-[#EA00A8] text-white py-2 px-4 rounded-md hover:bg-[#B8006F] focus:outline-none focus:ring-2 focus:ring-[#EA00A8] focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {{ loading ? 'Creating Account...' : 'Create Account' }}\n </button>\n </form>\n\n <div v-if=\"error\" class=\"mt-4 p-3 bg-red-50 border border-red-200 rounded-md\">\n <p class=\"text-sm text-red-600\">{{ error }}</p>\n </div>\n\n <div v-if=\"!isPasswordMatch && form.confirmPassword\" class=\"mt-2 p-2 bg-yellow-50 border border-yellow-200 rounded-md\">\n <p class=\"text-sm text-yellow-600\">Passwords do not match</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed } from 'vue'\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n}\n\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n password: '',\n confirmPassword: ''\n})\n\nconst isPasswordMatch = computed(() => {\n return form.password === form.confirmPassword\n})\n\nconst handleSignUp = async () => {\n if (!isPasswordMatch.value) {\n error.value = 'Passwords do not match'\n return\n }\n\n loading.value = true\n error.value = ''\n\n try {\n // TODO: Integrate with auth SDK\n console.log('Sign up attempt:', { ...form, password: '***', confirmPassword: '***' })\n emit('success', { \n email: form.email, \n firstName: form.firstName, \n lastName: form.lastName \n })\n } catch (err) {\n error.value = 'Failed to create account'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">User Profile</h2>\n <p class=\"text-gray-600 mt-2\">Manage your account information</p>\n </div>\n\n <div class=\"space-y-4\">\n <p class=\"text-gray-500\">Profile management interface will be implemented here.</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// TODO: Implement user profile functionality\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Reset Password</h2>\n <p class=\"text-gray-600 mt-2\">Enter your email to reset your password</p>\n </div>\n\n <div class=\"space-y-4\">\n <p class=\"text-gray-500\">Password reset functionality will be implemented here.</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// TODO: Implement password reset functionality\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Two-Factor Authentication</h2>\n <p class=\"text-gray-600 mt-2\">Secure your account with 2FA</p>\n </div>\n\n <div class=\"space-y-4\">\n <p class=\"text-gray-500\">MFA setup functionality will be implemented here.</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// TODO: Implement MFA setup functionality\n</script>","<template>\n <div class=\"max-w-2xl mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Device Manager</h2>\n <p class=\"text-gray-600 mt-2\">Manage your active devices and sessions</p>\n </div>\n\n <div class=\"space-y-4\">\n <p class=\"text-gray-500\">Device management functionality will be implemented here.</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// TODO: Implement device management functionality\n</script>","<template>\n <div class=\"relative inline-block text-left\">\n <button\n type=\"button\"\n class=\"inline-flex w-full justify-center gap-x-1.5 rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50\"\n @click=\"toggleDropdown\"\n >\n {{ currentOrg?.name || 'Select Organization' }}\n <svg class=\"-mr-1 h-5 w-5 text-gray-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n\n <div v-if=\"isOpen\" class=\"absolute right-0 z-10 mt-2 w-56 origin-top-right rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5\">\n <div class=\"py-1\">\n <p class=\"px-4 py-2 text-xs text-gray-500 uppercase tracking-wide\">Organizations</p>\n <p class=\"px-4 py-2 text-gray-500\">Organization switching will be implemented here.</p>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\n\ninterface Organization {\n id: string\n name: string\n slug: string\n}\n\ninterface Props {\n organizations?: Organization[]\n currentOrg?: Organization\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n organizations: () => [],\n})\n\nconst isOpen = ref(false)\n\nconst toggleDropdown = () => {\n isOpen.value = !isOpen.value\n}\n\n// TODO: Implement organization switching functionality\n</script>","import { ref, computed } from 'vue'\n\n// Mock user interface\ninterface User {\n id: string\n email: string\n firstName?: string\n lastName?: string\n emailVerified: boolean\n}\n\n// Mock session interface\ninterface Session {\n accessToken: string\n refreshToken: string\n expiresAt: Date\n}\n\nconst currentUser = ref<User | null>(null)\nconst currentSession = ref<Session | null>(null)\nconst loading = ref(false)\n\nexport function useStrandsAuth() {\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: { email: string; password: string }) => {\n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign in with:', credentials)\n \n // Mock successful sign in\n currentUser.value = {\n id: '1',\n email: credentials.email,\n firstName: 'John',\n lastName: 'Doe',\n emailVerified: true,\n }\n \n currentSession.value = {\n accessToken: 'mock-access-token',\n refreshToken: 'mock-refresh-token',\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes\n }\n } finally {\n loading.value = false\n }\n }\n\n const signUp = async (userData: {\n email: string\n password: string\n firstName?: string\n lastName?: string\n }) => {\n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign up with:', userData)\n \n // Mock successful sign up\n currentUser.value = {\n id: '1',\n email: userData.email,\n firstName: userData.firstName,\n lastName: userData.lastName,\n emailVerified: false,\n }\n } finally {\n loading.value = false\n }\n }\n\n const signOut = async () => {\n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign out')\n \n currentUser.value = null\n currentSession.value = null\n } finally {\n loading.value = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value) return\n \n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Refresh token')\n \n // Mock token refresh\n currentSession.value.expiresAt = new Date(Date.now() + 5 * 60 * 1000)\n } finally {\n loading.value = false\n }\n }\n\n const updateProfile = async (profileData: Partial<User>) => {\n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Update profile:', profileData)\n \n if (currentUser.value) {\n Object.assign(currentUser.value, profileData)\n }\n } finally {\n loading.value = false\n }\n }\n\n return {\n // State\n currentUser: computed(() => currentUser.value),\n currentSession: computed(() => currentSession.value),\n isAuthenticated,\n loading: computed(() => loading.value),\n\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n updateProfile,\n }\n}"],"names":["emit","__emit","loading","ref","error","form","reactive","handleSignIn","handleOAuthSignIn","provider","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_cache","$event","_vModelText","_hoisted_2","oauthProviders","_hoisted_3","_hoisted_4","_Fragment","_renderList","_toDisplayString","_hoisted_5","_hoisted_6","_hoisted_7","isPasswordMatch","computed","handleSignUp","isOpen","toggleDropdown","currentOrg","currentUser","currentSession","useStrandsAuth","isAuthenticated","signIn","credentials","signUp","userData","signOut","refreshToken","updateProfile","profileData"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface User {
|
|
2
|
+
id: string;
|
|
3
|
+
email: string;
|
|
4
|
+
firstName?: string;
|
|
5
|
+
lastName?: string;
|
|
6
|
+
emailVerified: boolean;
|
|
7
|
+
createdAt: Date;
|
|
8
|
+
updatedAt: Date;
|
|
9
|
+
}
|
|
10
|
+
export interface Session {
|
|
11
|
+
id: string;
|
|
12
|
+
userId: string;
|
|
13
|
+
accessToken: string;
|
|
14
|
+
refreshToken: string;
|
|
15
|
+
expiresAt: Date;
|
|
16
|
+
createdAt: Date;
|
|
17
|
+
}
|
|
18
|
+
export interface Organization {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
slug: string;
|
|
22
|
+
createdAt: Date;
|
|
23
|
+
updatedAt: Date;
|
|
24
|
+
}
|
|
25
|
+
export interface AuthConfig {
|
|
26
|
+
apiUrl: string;
|
|
27
|
+
applicationId: string;
|
|
28
|
+
publicKey: string;
|
|
29
|
+
autoRefresh?: boolean;
|
|
30
|
+
redirectUrl?: string;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/types/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,OAAO,CAAA;IACtB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@strands.gg/accui",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Strands Authentication UI Components",
|
|
5
|
+
"main": "./dist/strands-auth-ui.umd.js",
|
|
6
|
+
"module": "./dist/strands-auth-ui.es.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/strands-auth-ui.es.js",
|
|
11
|
+
"require": "./dist/strands-auth-ui.umd.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"keywords": [
|
|
19
|
+
"vue",
|
|
20
|
+
"authentication",
|
|
21
|
+
"ui",
|
|
22
|
+
"components",
|
|
23
|
+
"strands"
|
|
24
|
+
],
|
|
25
|
+
"author": "Strands Services Limited",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/StrandsServicesLimited/strands-accounts.git",
|
|
30
|
+
"directory": "apps/accounts-ui"
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"vue": "^3.4.0"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
}
|
|
38
|
+
}
|