@strands.gg/accui 1.3.3 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accui.css +6 -0
- package/dist/strands-auth-ui.cjs.js +108 -167
- package/dist/strands-auth-ui.cjs.js.map +1 -1
- package/dist/strands-auth-ui.es.js +108 -167
- package/dist/strands-auth-ui.es.js.map +1 -1
- package/dist/vue/components/StrandsMFASetup.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsMfaModal.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsMfaVerification.vue.d.ts.map +1 -1
- package/dist/vue/composables/useStrandsMfa.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/accui.css
CHANGED
|
@@ -605,6 +605,9 @@
|
|
|
605
605
|
.animate-spin {
|
|
606
606
|
animation: var(--animate-spin);
|
|
607
607
|
}
|
|
608
|
+
.cursor-not-allowed {
|
|
609
|
+
cursor: not-allowed;
|
|
610
|
+
}
|
|
608
611
|
.cursor-pointer {
|
|
609
612
|
cursor: pointer;
|
|
610
613
|
}
|
|
@@ -1237,6 +1240,9 @@
|
|
|
1237
1240
|
.opacity-25 {
|
|
1238
1241
|
opacity: 25%;
|
|
1239
1242
|
}
|
|
1243
|
+
.opacity-60 {
|
|
1244
|
+
opacity: 60%;
|
|
1245
|
+
}
|
|
1240
1246
|
.opacity-75 {
|
|
1241
1247
|
opacity: 75%;
|
|
1242
1248
|
}
|
|
@@ -1031,7 +1031,11 @@ function useStrandsMfa() {
|
|
|
1031
1031
|
const { getUrl } = useStrandsConfig.useStrandsConfig();
|
|
1032
1032
|
const { currentSession } = useStrandsAuth.useStrandsAuth();
|
|
1033
1033
|
const hasMfaDevices = vue.computed(() => mfaDevices.value.length > 0);
|
|
1034
|
-
const activeMfaDevices = vue.computed(
|
|
1034
|
+
const activeMfaDevices = vue.computed(
|
|
1035
|
+
() => mfaDevices.value.filter(
|
|
1036
|
+
(d) => d.is_active && d.device_type !== "hardware" && d.device_type !== "passkey"
|
|
1037
|
+
)
|
|
1038
|
+
);
|
|
1035
1039
|
const makeAuthenticatedRequest = async (url, options = {}) => {
|
|
1036
1040
|
if (!currentSession.value?.accessToken) {
|
|
1037
1041
|
throw new Error("No access token available");
|
|
@@ -1266,7 +1270,12 @@ const _sfc_main$i = /* @__PURE__ */ vue.defineComponent({
|
|
|
1266
1270
|
const cooldownActive = vue.ref(false);
|
|
1267
1271
|
const cooldownSeconds = vue.ref(0);
|
|
1268
1272
|
let cooldownInterval = null;
|
|
1269
|
-
const availableMethods = vue.computed(() =>
|
|
1273
|
+
const availableMethods = vue.computed(() => {
|
|
1274
|
+
const methods = props.availableMfaMethods || [];
|
|
1275
|
+
return methods.filter(
|
|
1276
|
+
(method) => method.device_type !== "hardware" && method.device_type !== "passkey"
|
|
1277
|
+
);
|
|
1278
|
+
});
|
|
1270
1279
|
vue.watch(() => availableMethods.value, (methods) => {
|
|
1271
1280
|
if (methods.length === 1) {
|
|
1272
1281
|
selectedMethod.value = methods[0];
|
|
@@ -1512,7 +1521,7 @@ const _hoisted_19$6 = {
|
|
|
1512
1521
|
key: 3,
|
|
1513
1522
|
class: "text-center space-y-4"
|
|
1514
1523
|
};
|
|
1515
|
-
const _hoisted_20$
|
|
1524
|
+
const _hoisted_20$5 = { class: "bg-blue-50 border border-blue-200 rounded-lg p-4" };
|
|
1516
1525
|
const _hoisted_21$4 = { class: "flex items-center space-x-3" };
|
|
1517
1526
|
const _hoisted_22$3 = { class: "text-left" };
|
|
1518
1527
|
const _hoisted_23$2 = { class: "font-medium text-blue-900" };
|
|
@@ -1526,21 +1535,21 @@ const _hoisted_27$2 = {
|
|
|
1526
1535
|
key: 4,
|
|
1527
1536
|
class: "space-y-4"
|
|
1528
1537
|
};
|
|
1529
|
-
const _hoisted_28$
|
|
1538
|
+
const _hoisted_28$1 = {
|
|
1530
1539
|
key: 0,
|
|
1531
1540
|
class: "bg-green-50 border border-green-200 rounded-lg p-4"
|
|
1532
1541
|
};
|
|
1533
|
-
const _hoisted_29$
|
|
1542
|
+
const _hoisted_29$1 = {
|
|
1534
1543
|
key: 1,
|
|
1535
1544
|
class: "text-sm text-gray-600"
|
|
1536
1545
|
};
|
|
1537
|
-
const _hoisted_30$
|
|
1546
|
+
const _hoisted_30$1 = {
|
|
1538
1547
|
key: 2,
|
|
1539
1548
|
class: "flex justify-between text-sm"
|
|
1540
1549
|
};
|
|
1541
|
-
const _hoisted_31$
|
|
1542
|
-
const _hoisted_32$
|
|
1543
|
-
const _hoisted_33$
|
|
1550
|
+
const _hoisted_31$1 = ["disabled"];
|
|
1551
|
+
const _hoisted_32$1 = { class: "pt-4 border-t border-gray-200" };
|
|
1552
|
+
const _hoisted_33$1 = {
|
|
1544
1553
|
key: 3,
|
|
1545
1554
|
class: "space-y-4 bg-amber-50 border border-amber-200 rounded-lg p-4"
|
|
1546
1555
|
};
|
|
@@ -1749,7 +1758,7 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1749
1758
|
])) : vue.createCommentVNode("v-if", true),
|
|
1750
1759
|
vue.createCommentVNode(" Hardware Key & Passkey Authentication "),
|
|
1751
1760
|
$setup.selectedMethod?.device_type === "hardware" || $setup.selectedMethod?.device_type === "passkey" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_19$6, [
|
|
1752
|
-
vue.createElementVNode("div", _hoisted_20$
|
|
1761
|
+
vue.createElementVNode("div", _hoisted_20$5, [
|
|
1753
1762
|
vue.createElementVNode("div", _hoisted_21$4, [
|
|
1754
1763
|
_cache[11] || (_cache[11] = vue.createElementVNode(
|
|
1755
1764
|
"div",
|
|
@@ -1879,7 +1888,7 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1879
1888
|
vue.createCommentVNode(" Code Input "),
|
|
1880
1889
|
$setup.selectedMethod && $setup.selectedMethod.device_type !== "hardware" && $setup.selectedMethod.device_type !== "passkey" && ($setup.selectedMethod.device_type !== "email" || $setup.emailCodeSent) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_27$2, [
|
|
1881
1890
|
vue.createCommentVNode(" Email confirmation "),
|
|
1882
|
-
$setup.selectedMethod.device_type === "email" && $setup.emailCodeSent ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_28$
|
|
1891
|
+
$setup.selectedMethod.device_type === "email" && $setup.emailCodeSent ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_28$1, _cache[14] || (_cache[14] = [
|
|
1883
1892
|
vue.createElementVNode(
|
|
1884
1893
|
"div",
|
|
1885
1894
|
{ class: "flex items-start space-x-2" },
|
|
@@ -1920,21 +1929,21 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1920
1929
|
vue.createCommentVNode(" TOTP Help "),
|
|
1921
1930
|
$setup.selectedMethod.device_type === "totp" ? (vue.openBlock(), vue.createElementBlock(
|
|
1922
1931
|
"div",
|
|
1923
|
-
_hoisted_29$
|
|
1932
|
+
_hoisted_29$1,
|
|
1924
1933
|
' Open your authenticator app and enter the 6-digit code for "' + vue.toDisplayString($setup.selectedMethod.device_name) + '" ',
|
|
1925
1934
|
1
|
|
1926
1935
|
/* TEXT */
|
|
1927
1936
|
)) : vue.createCommentVNode("v-if", true),
|
|
1928
1937
|
vue.createCommentVNode(" Email Resend "),
|
|
1929
|
-
$setup.selectedMethod.device_type === "email" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_30$
|
|
1938
|
+
$setup.selectedMethod.device_type === "email" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_30$1, [
|
|
1930
1939
|
vue.createElementVNode("button", {
|
|
1931
1940
|
onClick: $setup.sendEmailCode,
|
|
1932
1941
|
disabled: $setup.loading || $setup.cooldownActive,
|
|
1933
1942
|
class: "text-strands-600 hover:text-strands-800 disabled:text-gray-400 disabled:cursor-not-allowed"
|
|
1934
|
-
}, vue.toDisplayString($setup.cooldownActive ? `Resend in ${$setup.cooldownSeconds}s` : "Resend Code"), 9, _hoisted_31$
|
|
1943
|
+
}, vue.toDisplayString($setup.cooldownActive ? `Resend in ${$setup.cooldownSeconds}s` : "Resend Code"), 9, _hoisted_31$1)
|
|
1935
1944
|
])) : vue.createCommentVNode("v-if", true),
|
|
1936
1945
|
vue.createCommentVNode(" Backup Codes Option "),
|
|
1937
|
-
vue.createElementVNode("div", _hoisted_32$
|
|
1946
|
+
vue.createElementVNode("div", _hoisted_32$1, [
|
|
1938
1947
|
vue.createElementVNode("button", {
|
|
1939
1948
|
onClick: _cache[3] || (_cache[3] = ($event) => $setup.showBackupCodeInput = !$setup.showBackupCodeInput),
|
|
1940
1949
|
class: "flex items-center text-sm text-gray-600 hover:text-gray-800 transition-colors"
|
|
@@ -1966,7 +1975,7 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1966
1975
|
])
|
|
1967
1976
|
]),
|
|
1968
1977
|
vue.createCommentVNode(" Backup Code Input "),
|
|
1969
|
-
$setup.showBackupCodeInput ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_33$
|
|
1978
|
+
$setup.showBackupCodeInput ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_33$1, [
|
|
1970
1979
|
_cache[16] || (_cache[16] = vue.createElementVNode(
|
|
1971
1980
|
"div",
|
|
1972
1981
|
{ class: "flex items-start space-x-2 mb-3" },
|
|
@@ -3408,7 +3417,7 @@ const _hoisted_16$5 = { class: "alert-error" };
|
|
|
3408
3417
|
const _hoisted_17$5 = { class: "flex items-start gap-3" };
|
|
3409
3418
|
const _hoisted_18$5 = { class: "font-medium" };
|
|
3410
3419
|
const _hoisted_19$5 = { class: "mt-8 text-center" };
|
|
3411
|
-
const _hoisted_20$
|
|
3420
|
+
const _hoisted_20$4 = { class: "text-sm text-neutral-600" };
|
|
3412
3421
|
const _hoisted_21$3 = { key: 0 };
|
|
3413
3422
|
const _hoisted_22$2 = { class: "text-neutral-400 text-sm" };
|
|
3414
3423
|
function _sfc_render$f(_ctx, _cache, $props, $setup, $data, $options) {
|
|
@@ -3673,7 +3682,7 @@ function _sfc_render$f(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
3673
3682
|
])) : vue.createCommentVNode("v-if", true),
|
|
3674
3683
|
vue.createCommentVNode(" Sign in link "),
|
|
3675
3684
|
vue.createElementVNode("div", _hoisted_19$5, [
|
|
3676
|
-
vue.createElementVNode("p", _hoisted_20$
|
|
3685
|
+
vue.createElementVNode("p", _hoisted_20$4, [
|
|
3677
3686
|
_cache[10] || (_cache[10] = vue.createTextVNode(
|
|
3678
3687
|
" Already have an account? ",
|
|
3679
3688
|
-1
|
|
@@ -7823,7 +7832,7 @@ const _hoisted_18$3 = {
|
|
|
7823
7832
|
class: "space-y-4"
|
|
7824
7833
|
};
|
|
7825
7834
|
const _hoisted_19$3 = { class: "text-center" };
|
|
7826
|
-
const _hoisted_20$
|
|
7835
|
+
const _hoisted_20$3 = { class: "text-sm text-gray-600 mb-6" };
|
|
7827
7836
|
const _hoisted_21$2 = { class: "flex justify-end space-x-3 pt-4" };
|
|
7828
7837
|
function _sfc_render$b(_ctx, _cache, $props, $setup, $data, $options) {
|
|
7829
7838
|
return vue.openBlock(), vue.createBlock($setup["UiModal"], {
|
|
@@ -8276,7 +8285,7 @@ function _sfc_render$b(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
8276
8285
|
)),
|
|
8277
8286
|
vue.createElementVNode(
|
|
8278
8287
|
"p",
|
|
8279
|
-
_hoisted_20$
|
|
8288
|
+
_hoisted_20$3,
|
|
8280
8289
|
vue.toDisplayString($setup.errorMessage),
|
|
8281
8290
|
1
|
|
8282
8291
|
/* TEXT */
|
|
@@ -9009,21 +9018,15 @@ const _hoisted_15$2 = { class: "flex flex-col space-y-2 ml-4" };
|
|
|
9009
9018
|
const _hoisted_16$2 = { class: "flex items-center justify-between" };
|
|
9010
9019
|
const _hoisted_17$2 = { class: "flex-shrink-0 w-14 h-14 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors" };
|
|
9011
9020
|
const _hoisted_18$2 = { class: "flex flex-col space-y-2 ml-4" };
|
|
9012
|
-
const _hoisted_19$2 = { class: "
|
|
9013
|
-
const _hoisted_20$
|
|
9014
|
-
const _hoisted_21$1 = { class: "flex
|
|
9015
|
-
const _hoisted_22$1 = { class: "flex items-
|
|
9016
|
-
const _hoisted_23$1 = { class: "
|
|
9017
|
-
const _hoisted_24$1 = { class: "
|
|
9018
|
-
const _hoisted_25$1 = { class: "
|
|
9019
|
-
const _hoisted_26$1 = { class: "
|
|
9020
|
-
const _hoisted_27$1 = { class: "flex
|
|
9021
|
-
const _hoisted_28$1 = { class: "flex items-start space-x-4" };
|
|
9022
|
-
const _hoisted_29$1 = { class: "min-w-0 flex-1" };
|
|
9023
|
-
const _hoisted_30$1 = { class: "font-semibold text-gray-900 text-lg" };
|
|
9024
|
-
const _hoisted_31$1 = { class: "text-sm text-gray-600 mt-1" };
|
|
9025
|
-
const _hoisted_32$1 = { class: "text-xs text-gray-500 mt-2" };
|
|
9026
|
-
const _hoisted_33$1 = { class: "flex flex-col space-y-2 ml-4" };
|
|
9021
|
+
const _hoisted_19$2 = { class: "space-y-6" };
|
|
9022
|
+
const _hoisted_20$2 = { class: "max-h-96 overflow-y-auto space-y-4 pr-2" };
|
|
9023
|
+
const _hoisted_21$1 = { class: "flex items-start justify-between" };
|
|
9024
|
+
const _hoisted_22$1 = { class: "flex items-start space-x-4" };
|
|
9025
|
+
const _hoisted_23$1 = { class: "min-w-0 flex-1" };
|
|
9026
|
+
const _hoisted_24$1 = { class: "font-semibold text-gray-900 text-lg" };
|
|
9027
|
+
const _hoisted_25$1 = { class: "text-sm text-gray-600 mt-1" };
|
|
9028
|
+
const _hoisted_26$1 = { class: "text-xs text-gray-500 mt-2" };
|
|
9029
|
+
const _hoisted_27$1 = { class: "flex flex-col space-y-2 ml-4" };
|
|
9027
9030
|
function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
9028
9031
|
return vue.openBlock(), vue.createElementBlock(
|
|
9029
9032
|
vue.Fragment,
|
|
@@ -9154,7 +9157,7 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9154
9157
|
vue.createCommentVNode(" Tab Content: Add New Device "),
|
|
9155
9158
|
$setup.activeTab === "add" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_11$2, [
|
|
9156
9159
|
vue.createElementVNode("div", null, [
|
|
9157
|
-
_cache[
|
|
9160
|
+
_cache[17] || (_cache[17] = vue.createElementVNode(
|
|
9158
9161
|
"h3",
|
|
9159
9162
|
{ class: "text-xl font-semibold text-gray-900 mb-6" },
|
|
9160
9163
|
"Choose Your Authentication Method",
|
|
@@ -9250,94 +9253,35 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9250
9253
|
])
|
|
9251
9254
|
])
|
|
9252
9255
|
]),
|
|
9253
|
-
vue.createCommentVNode(" Hardware Key Setup "),
|
|
9254
|
-
vue.
|
|
9255
|
-
|
|
9256
|
-
|
|
9257
|
-
|
|
9258
|
-
|
|
9259
|
-
|
|
9260
|
-
|
|
9261
|
-
|
|
9262
|
-
|
|
9263
|
-
|
|
9264
|
-
|
|
9265
|
-
|
|
9266
|
-
|
|
9267
|
-
|
|
9268
|
-
|
|
9269
|
-
|
|
9270
|
-
|
|
9271
|
-
|
|
9272
|
-
|
|
9273
|
-
|
|
9274
|
-
|
|
9275
|
-
|
|
9276
|
-
|
|
9277
|
-
|
|
9278
|
-
|
|
9279
|
-
|
|
9280
|
-
|
|
9281
|
-
|
|
9282
|
-
disabled: $setup.mfaLoading
|
|
9283
|
-
}, {
|
|
9284
|
-
default: vue.withCtx(() => _cache[17] || (_cache[17] = [
|
|
9285
|
-
vue.createTextVNode(
|
|
9286
|
-
" Setup ",
|
|
9287
|
-
-1
|
|
9288
|
-
/* CACHED */
|
|
9289
|
-
)
|
|
9290
|
-
])),
|
|
9291
|
-
_: 1,
|
|
9292
|
-
__: [17]
|
|
9293
|
-
}, 8, ["disabled"])
|
|
9294
|
-
])
|
|
9295
|
-
])
|
|
9296
|
-
]),
|
|
9297
|
-
vue.createCommentVNode(" Passkey Setup "),
|
|
9298
|
-
vue.createElementVNode("div", {
|
|
9299
|
-
class: "group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200 cursor-pointer",
|
|
9300
|
-
onClick: $setup.startPasskeySetup
|
|
9301
|
-
}, [
|
|
9302
|
-
vue.createElementVNode("div", _hoisted_22$1, [
|
|
9303
|
-
vue.createElementVNode("div", _hoisted_23$1, [
|
|
9304
|
-
vue.createVNode($setup["Shield"], {
|
|
9305
|
-
size: 24,
|
|
9306
|
-
class: "text-[var(--strands-primary)]"
|
|
9307
|
-
})
|
|
9308
|
-
]),
|
|
9309
|
-
_cache[20] || (_cache[20] = vue.createElementVNode(
|
|
9310
|
-
"div",
|
|
9311
|
-
{ class: "flex items-start space-x-4" },
|
|
9312
|
-
[
|
|
9313
|
-
vue.createElementVNode("div", { class: "min-w-0 flex-1" }, [
|
|
9314
|
-
vue.createElementVNode("h4", { class: "font-semibold text-gray-900 text-lg" }, "Passkey"),
|
|
9315
|
-
vue.createElementVNode("p", { class: "text-xs text-gray-500 mt-2" }, " Use your device's built-in biometrics, PIN, or cross-device passkeys ")
|
|
9316
|
-
])
|
|
9317
|
-
],
|
|
9318
|
-
-1
|
|
9319
|
-
/* CACHED */
|
|
9320
|
-
)),
|
|
9321
|
-
vue.createElementVNode("div", _hoisted_24$1, [
|
|
9322
|
-
vue.createVNode($setup["StrandsUiButton"], {
|
|
9323
|
-
variant: "primary",
|
|
9324
|
-
size: "md",
|
|
9325
|
-
onClick: vue.withModifiers($setup.startPasskeySetup, ["stop"]),
|
|
9326
|
-
disabled: $setup.mfaLoading
|
|
9327
|
-
}, {
|
|
9328
|
-
default: vue.withCtx(() => _cache[19] || (_cache[19] = [
|
|
9329
|
-
vue.createTextVNode(
|
|
9330
|
-
" Setup ",
|
|
9331
|
-
-1
|
|
9332
|
-
/* CACHED */
|
|
9333
|
-
)
|
|
9334
|
-
])),
|
|
9335
|
-
_: 1,
|
|
9336
|
-
__: [19]
|
|
9337
|
-
}, 8, ["disabled"])
|
|
9338
|
-
])
|
|
9339
|
-
])
|
|
9340
|
-
])
|
|
9256
|
+
vue.createCommentVNode(" Hardware Key Setup - Temporarily Disabled "),
|
|
9257
|
+
vue.createCommentVNode(' \n <div class="group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200 cursor-pointer" @click="startHardwareKeySetup">\n <div class="flex items-center justify-between">\n <div class="flex-shrink-0 w-14 h-14 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors">\n <KeyRound :size="24" class="text-[var(--strands-primary)]" />\n </div>\n <div class="flex items-start space-x-4">\n <div class="min-w-0 flex-1">\n <h4 class="font-semibold text-gray-900 text-lg">Hardware Security Key</h4>\n <p class="text-xs text-gray-500 mt-2">\n Use YubiKey, FIDO2, or other physical security keys for ultimate protection\n </p>\n </div>\n </div>\n <div class="flex flex-col space-y-2 ml-4">\n <StrandsUiButton\n variant="primary"\n size="md"\n @click.stop="startHardwareKeySetup"\n :disabled="mfaLoading"\n >\n Setup\n </StrandsUiButton>\n </div>\n </div>\n </div>\n\n <-- Passkey Setup - Temporarily Disabled '),
|
|
9258
|
+
vue.createCommentVNode(`
|
|
9259
|
+
<div class="group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200 cursor-pointer" @click="startPasskeySetup">
|
|
9260
|
+
<div class="flex items-center justify-between">
|
|
9261
|
+
<div class="flex-shrink-0 w-14 h-14 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors">
|
|
9262
|
+
<Shield :size="24" class="text-[var(--strands-primary)]" />
|
|
9263
|
+
</div>
|
|
9264
|
+
<div class="flex items-start space-x-4">
|
|
9265
|
+
<div class="min-w-0 flex-1">
|
|
9266
|
+
<h4 class="font-semibold text-gray-900 text-lg">Passkey</h4>
|
|
9267
|
+
<p class="text-xs text-gray-500 mt-2">
|
|
9268
|
+
Use your device's built-in biometrics, PIN, or cross-device passkeys
|
|
9269
|
+
</p>
|
|
9270
|
+
</div>
|
|
9271
|
+
</div>
|
|
9272
|
+
<div class="flex flex-col space-y-2 ml-4">
|
|
9273
|
+
<StrandsUiButton
|
|
9274
|
+
variant="primary"
|
|
9275
|
+
size="md"
|
|
9276
|
+
@click.stop="startPasskeySetup"
|
|
9277
|
+
:disabled="mfaLoading"
|
|
9278
|
+
>
|
|
9279
|
+
Setup
|
|
9280
|
+
</StrandsUiButton>
|
|
9281
|
+
</div>
|
|
9282
|
+
</div>
|
|
9283
|
+
</div>
|
|
9284
|
+
`)
|
|
9341
9285
|
])
|
|
9342
9286
|
])
|
|
9343
9287
|
])) : $setup.activeTab === "manage" && $setup.activeMfaDevices.length > 0 ? (vue.openBlock(), vue.createElementBlock(
|
|
@@ -9345,16 +9289,16 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9345
9289
|
{ key: 1 },
|
|
9346
9290
|
[
|
|
9347
9291
|
vue.createCommentVNode(" Tab Content: Active Devices "),
|
|
9348
|
-
vue.createElementVNode("div",
|
|
9292
|
+
vue.createElementVNode("div", _hoisted_19$2, [
|
|
9349
9293
|
vue.createElementVNode("div", null, [
|
|
9350
|
-
_cache[
|
|
9294
|
+
_cache[21] || (_cache[21] = vue.createElementVNode(
|
|
9351
9295
|
"h3",
|
|
9352
9296
|
{ class: "text-xl font-semibold text-gray-900 mb-6" },
|
|
9353
9297
|
"Manage Your Active Devices",
|
|
9354
9298
|
-1
|
|
9355
9299
|
/* CACHED */
|
|
9356
9300
|
)),
|
|
9357
|
-
vue.createElementVNode("div",
|
|
9301
|
+
vue.createElementVNode("div", _hoisted_20$2, [
|
|
9358
9302
|
(vue.openBlock(true), vue.createElementBlock(
|
|
9359
9303
|
vue.Fragment,
|
|
9360
9304
|
null,
|
|
@@ -9363,8 +9307,8 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9363
9307
|
key: device.id,
|
|
9364
9308
|
class: "group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200"
|
|
9365
9309
|
}, [
|
|
9366
|
-
vue.createElementVNode("div",
|
|
9367
|
-
vue.createElementVNode("div",
|
|
9310
|
+
vue.createElementVNode("div", _hoisted_21$1, [
|
|
9311
|
+
vue.createElementVNode("div", _hoisted_22$1, [
|
|
9368
9312
|
vue.createElementVNode(
|
|
9369
9313
|
"div",
|
|
9370
9314
|
{
|
|
@@ -9379,31 +9323,31 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9379
9323
|
2
|
|
9380
9324
|
/* CLASS */
|
|
9381
9325
|
),
|
|
9382
|
-
vue.createElementVNode("div",
|
|
9326
|
+
vue.createElementVNode("div", _hoisted_23$1, [
|
|
9383
9327
|
vue.createElementVNode(
|
|
9384
9328
|
"h4",
|
|
9385
|
-
|
|
9329
|
+
_hoisted_24$1,
|
|
9386
9330
|
vue.toDisplayString(device.device_name),
|
|
9387
9331
|
1
|
|
9388
9332
|
/* TEXT */
|
|
9389
9333
|
),
|
|
9390
9334
|
vue.createElementVNode(
|
|
9391
9335
|
"p",
|
|
9392
|
-
|
|
9336
|
+
_hoisted_25$1,
|
|
9393
9337
|
vue.toDisplayString($setup.getDeviceTypeName(device.device_type)),
|
|
9394
9338
|
1
|
|
9395
9339
|
/* TEXT */
|
|
9396
9340
|
),
|
|
9397
9341
|
vue.createElementVNode(
|
|
9398
9342
|
"p",
|
|
9399
|
-
|
|
9343
|
+
_hoisted_26$1,
|
|
9400
9344
|
" Last used " + vue.toDisplayString($setup.formatLastUsed(device.last_used_at)),
|
|
9401
9345
|
1
|
|
9402
9346
|
/* TEXT */
|
|
9403
9347
|
)
|
|
9404
9348
|
])
|
|
9405
9349
|
]),
|
|
9406
|
-
vue.createElementVNode("div",
|
|
9350
|
+
vue.createElementVNode("div", _hoisted_27$1, [
|
|
9407
9351
|
vue.createCommentVNode(" Backup codes button for TOTP, Hardware Key, and Passkey devices "),
|
|
9408
9352
|
device.device_type === "totp" || device.device_type === "hardware" || device.device_type === "passkey" ? (vue.openBlock(), vue.createBlock($setup["StrandsUiButton"], {
|
|
9409
9353
|
key: 0,
|
|
@@ -9417,14 +9361,14 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9417
9361
|
size: 14,
|
|
9418
9362
|
class: "mr-2"
|
|
9419
9363
|
}),
|
|
9420
|
-
_cache[
|
|
9364
|
+
_cache[18] || (_cache[18] = vue.createTextVNode(
|
|
9421
9365
|
" Backup Codes ",
|
|
9422
9366
|
-1
|
|
9423
9367
|
/* CACHED */
|
|
9424
9368
|
))
|
|
9425
9369
|
]),
|
|
9426
9370
|
_: 2,
|
|
9427
|
-
__: [
|
|
9371
|
+
__: [18]
|
|
9428
9372
|
}, 1032, ["onClick", "disabled"])) : vue.createCommentVNode("v-if", true),
|
|
9429
9373
|
vue.createCommentVNode(" Test email MFA "),
|
|
9430
9374
|
device.device_type === "email" ? (vue.openBlock(), vue.createBlock($setup["StrandsUiButton"], {
|
|
@@ -9439,14 +9383,14 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9439
9383
|
size: 14,
|
|
9440
9384
|
class: "mr-2"
|
|
9441
9385
|
}),
|
|
9442
|
-
_cache[
|
|
9386
|
+
_cache[19] || (_cache[19] = vue.createTextVNode(
|
|
9443
9387
|
" Send Test Code ",
|
|
9444
9388
|
-1
|
|
9445
9389
|
/* CACHED */
|
|
9446
9390
|
))
|
|
9447
9391
|
]),
|
|
9448
9392
|
_: 2,
|
|
9449
|
-
__: [
|
|
9393
|
+
__: [19]
|
|
9450
9394
|
}, 1032, ["onClick", "disabled"])) : vue.createCommentVNode("v-if", true),
|
|
9451
9395
|
vue.createCommentVNode(" Remove device "),
|
|
9452
9396
|
vue.createVNode($setup["StrandsUiButton"], {
|
|
@@ -9461,14 +9405,14 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9461
9405
|
size: 14,
|
|
9462
9406
|
class: "mr-2"
|
|
9463
9407
|
}),
|
|
9464
|
-
_cache[
|
|
9408
|
+
_cache[20] || (_cache[20] = vue.createTextVNode(
|
|
9465
9409
|
" Remove ",
|
|
9466
9410
|
-1
|
|
9467
9411
|
/* CACHED */
|
|
9468
9412
|
))
|
|
9469
9413
|
]),
|
|
9470
9414
|
_: 2,
|
|
9471
|
-
__: [
|
|
9415
|
+
__: [20]
|
|
9472
9416
|
}, 1032, ["onClick", "disabled"])
|
|
9473
9417
|
])
|
|
9474
9418
|
])
|
|
@@ -9994,7 +9938,7 @@ const _hoisted_16$1 = {
|
|
|
9994
9938
|
const _hoisted_17$1 = { class: "space-y-3 md:space-y-4" };
|
|
9995
9939
|
const _hoisted_18$1 = { class: "space-y-4 p-4 bg-gray-50 rounded-xl" };
|
|
9996
9940
|
const _hoisted_19$1 = { class: "flex items-center justify-between gap-2" };
|
|
9997
|
-
const _hoisted_20 = { class: "text-sm text-gray-600" };
|
|
9941
|
+
const _hoisted_20$1 = { class: "text-sm text-gray-600" };
|
|
9998
9942
|
const _hoisted_21 = {
|
|
9999
9943
|
key: 0,
|
|
10000
9944
|
class: "space-y-3 overflow-hidden"
|
|
@@ -10256,7 +10200,7 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
10256
10200
|
)),
|
|
10257
10201
|
vue.createElementVNode(
|
|
10258
10202
|
"p",
|
|
10259
|
-
_hoisted_20,
|
|
10203
|
+
_hoisted_20$1,
|
|
10260
10204
|
"Last updated " + vue.toDisplayString($setup.passwordLastUpdated),
|
|
10261
10205
|
1
|
|
10262
10206
|
/* TEXT */
|
|
@@ -10899,15 +10843,16 @@ const _hoisted_10 = { class: "flex flex-col items-center text-center space-y-4"
|
|
|
10899
10843
|
const _hoisted_11 = { class: "w-16 h-16 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors" };
|
|
10900
10844
|
const _hoisted_12 = { class: "flex flex-col items-center text-center space-y-4" };
|
|
10901
10845
|
const _hoisted_13 = { class: "w-16 h-16 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors" };
|
|
10902
|
-
const _hoisted_14 = { class: "
|
|
10903
|
-
const _hoisted_15 = { class: "
|
|
10904
|
-
const _hoisted_16 = {
|
|
10846
|
+
const _hoisted_14 = { class: "group p-8 border border-gray-300 rounded-xl bg-gray-50 opacity-60 cursor-not-allowed" };
|
|
10847
|
+
const _hoisted_15 = { class: "flex flex-col items-center text-center space-y-4" };
|
|
10848
|
+
const _hoisted_16 = { class: "w-16 h-16 bg-gray-200 rounded-xl flex items-center justify-center" };
|
|
10849
|
+
const _hoisted_17 = {
|
|
10905
10850
|
key: 1,
|
|
10906
10851
|
class: "border-t border-gray-200 pt-8"
|
|
10907
10852
|
};
|
|
10908
|
-
const
|
|
10909
|
-
const
|
|
10910
|
-
const
|
|
10853
|
+
const _hoisted_18 = { class: "flex items-center justify-between" };
|
|
10854
|
+
const _hoisted_19 = { class: "text-gray-600 text-sm mt-1" };
|
|
10855
|
+
const _hoisted_20 = { class: "flex justify-end space-x-3" };
|
|
10911
10856
|
function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
|
|
10912
10857
|
return vue.openBlock(), vue.createElementBlock(
|
|
10913
10858
|
vue.Fragment,
|
|
@@ -10944,7 +10889,7 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
10944
10889
|
])
|
|
10945
10890
|
]),
|
|
10946
10891
|
footer: vue.withCtx(() => [
|
|
10947
|
-
vue.createElementVNode("div",
|
|
10892
|
+
vue.createElementVNode("div", _hoisted_20, [
|
|
10948
10893
|
vue.createVNode($setup["StrandsUiButton"], {
|
|
10949
10894
|
variant: "secondary",
|
|
10950
10895
|
onClick: $setup.closeModal,
|
|
@@ -11093,52 +11038,48 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
11093
11038
|
}, 8, ["disabled"])
|
|
11094
11039
|
])
|
|
11095
11040
|
]),
|
|
11096
|
-
vue.createCommentVNode(" Hardware Key Setup "),
|
|
11097
|
-
vue.createElementVNode("div",
|
|
11098
|
-
|
|
11099
|
-
|
|
11100
|
-
}, [
|
|
11101
|
-
vue.createElementVNode("div", _hoisted_14, [
|
|
11102
|
-
vue.createElementVNode("div", _hoisted_15, [
|
|
11041
|
+
vue.createCommentVNode(" Hardware Key Setup - Temporarily Disabled "),
|
|
11042
|
+
vue.createElementVNode("div", _hoisted_14, [
|
|
11043
|
+
vue.createElementVNode("div", _hoisted_15, [
|
|
11044
|
+
vue.createElementVNode("div", _hoisted_16, [
|
|
11103
11045
|
vue.createVNode($setup["KeyRound"], {
|
|
11104
11046
|
size: 28,
|
|
11105
|
-
class: "text-
|
|
11047
|
+
class: "text-gray-400"
|
|
11106
11048
|
})
|
|
11107
11049
|
]),
|
|
11108
11050
|
_cache[12] || (_cache[12] = vue.createElementVNode(
|
|
11109
11051
|
"div",
|
|
11110
11052
|
{ class: "space-y-2" },
|
|
11111
11053
|
[
|
|
11112
|
-
vue.createElementVNode("h4", { class: "font-semibold text-gray-
|
|
11113
|
-
vue.createElementVNode("p", { class: "text-sm text-gray-
|
|
11054
|
+
vue.createElementVNode("h4", { class: "font-semibold text-gray-500 text-lg" }, "Hardware Key & Passkeys"),
|
|
11055
|
+
vue.createElementVNode("p", { class: "text-sm text-gray-400 leading-relaxed" }, "Temporarily unavailable - cross-domain support coming soon")
|
|
11114
11056
|
],
|
|
11115
11057
|
-1
|
|
11116
11058
|
/* CACHED */
|
|
11117
11059
|
)),
|
|
11118
11060
|
vue.createVNode($setup["StrandsUiButton"], {
|
|
11119
|
-
variant: "
|
|
11061
|
+
variant: "secondary",
|
|
11120
11062
|
size: "md",
|
|
11121
|
-
|
|
11122
|
-
disabled: $setup.loading,
|
|
11063
|
+
disabled: "",
|
|
11123
11064
|
class: "w-full mt-4"
|
|
11124
11065
|
}, {
|
|
11125
11066
|
default: vue.withCtx(() => _cache[11] || (_cache[11] = [
|
|
11126
11067
|
vue.createTextVNode(
|
|
11127
|
-
"
|
|
11068
|
+
" Coming Soon ",
|
|
11128
11069
|
-1
|
|
11129
11070
|
/* CACHED */
|
|
11130
11071
|
)
|
|
11131
11072
|
])),
|
|
11132
11073
|
_: 1,
|
|
11133
11074
|
__: [11]
|
|
11134
|
-
}
|
|
11075
|
+
})
|
|
11135
11076
|
])
|
|
11136
11077
|
])
|
|
11137
11078
|
])
|
|
11138
11079
|
]),
|
|
11139
11080
|
vue.createCommentVNode(" Manage Existing "),
|
|
11140
|
-
$setup.activeMfaDevices.length > 0 ? (vue.openBlock(), vue.createElementBlock("div",
|
|
11141
|
-
vue.createElementVNode("div",
|
|
11081
|
+
$setup.activeMfaDevices.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_17, [
|
|
11082
|
+
vue.createElementVNode("div", _hoisted_18, [
|
|
11142
11083
|
vue.createElementVNode("div", null, [
|
|
11143
11084
|
_cache[14] || (_cache[14] = vue.createElementVNode(
|
|
11144
11085
|
"h3",
|
|
@@ -11149,7 +11090,7 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
11149
11090
|
)),
|
|
11150
11091
|
vue.createElementVNode(
|
|
11151
11092
|
"p",
|
|
11152
|
-
|
|
11093
|
+
_hoisted_19,
|
|
11153
11094
|
vue.toDisplayString($setup.activeMfaDevices.length) + " device(s) currently active",
|
|
11154
11095
|
1
|
|
11155
11096
|
/* TEXT */
|