@strands.gg/accui 1.3.2 → 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 +134 -173
- package/dist/strands-auth-ui.cjs.js.map +1 -1
- package/dist/strands-auth-ui.es.js +134 -173
- 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/dist/vue/ui/UiInput.vue.d.ts +3 -1
- package/dist/vue/ui/UiInput.vue.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -369,7 +369,7 @@ const _sfc_main$o = /* @__PURE__ */ defineComponent({
|
|
|
369
369
|
placeholder: { type: String, required: false },
|
|
370
370
|
disabled: { type: Boolean, required: false },
|
|
371
371
|
required: { type: Boolean, required: false },
|
|
372
|
-
error: { type:
|
|
372
|
+
error: { type: Object, required: false },
|
|
373
373
|
helpText: { type: String, required: false },
|
|
374
374
|
autocomplete: { type: String, required: false },
|
|
375
375
|
size: { type: String, required: false, default: "md" }
|
|
@@ -538,7 +538,7 @@ function _sfc_render$o(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
538
538
|
$props.error ? (openBlock(), createElementBlock(
|
|
539
539
|
"p",
|
|
540
540
|
_hoisted_9$b,
|
|
541
|
-
toDisplayString($props.error),
|
|
541
|
+
toDisplayString($props.error.message),
|
|
542
542
|
1
|
|
543
543
|
/* TEXT */
|
|
544
544
|
)) : $props.helpText ? (openBlock(), createElementBlock(
|
|
@@ -1030,7 +1030,11 @@ function useStrandsMfa() {
|
|
|
1030
1030
|
const { getUrl } = useStrandsConfig();
|
|
1031
1031
|
const { currentSession } = useStrandsAuth();
|
|
1032
1032
|
const hasMfaDevices = computed(() => mfaDevices.value.length > 0);
|
|
1033
|
-
const activeMfaDevices = computed(
|
|
1033
|
+
const activeMfaDevices = computed(
|
|
1034
|
+
() => mfaDevices.value.filter(
|
|
1035
|
+
(d) => d.is_active && d.device_type !== "hardware" && d.device_type !== "passkey"
|
|
1036
|
+
)
|
|
1037
|
+
);
|
|
1034
1038
|
const makeAuthenticatedRequest = async (url, options = {}) => {
|
|
1035
1039
|
if (!currentSession.value?.accessToken) {
|
|
1036
1040
|
throw new Error("No access token available");
|
|
@@ -1265,7 +1269,12 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
|
|
|
1265
1269
|
const cooldownActive = ref(false);
|
|
1266
1270
|
const cooldownSeconds = ref(0);
|
|
1267
1271
|
let cooldownInterval = null;
|
|
1268
|
-
const availableMethods = computed(() =>
|
|
1272
|
+
const availableMethods = computed(() => {
|
|
1273
|
+
const methods = props.availableMfaMethods || [];
|
|
1274
|
+
return methods.filter(
|
|
1275
|
+
(method) => method.device_type !== "hardware" && method.device_type !== "passkey"
|
|
1276
|
+
);
|
|
1277
|
+
});
|
|
1269
1278
|
watch(() => availableMethods.value, (methods) => {
|
|
1270
1279
|
if (methods.length === 1) {
|
|
1271
1280
|
selectedMethod.value = methods[0];
|
|
@@ -1391,14 +1400,33 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
|
|
|
1391
1400
|
throw new Error("Hardware keys are not supported in this browser");
|
|
1392
1401
|
}
|
|
1393
1402
|
const challengeResponse = await getMfaWebAuthnChallenge(selectedMethod.value.id);
|
|
1394
|
-
const
|
|
1395
|
-
|
|
1403
|
+
const challengeData = challengeResponse.challenge.publicKey || challengeResponse.challenge;
|
|
1404
|
+
const base64ToUint8Array = (base64) => {
|
|
1405
|
+
if (!base64 || typeof base64 !== "string") {
|
|
1406
|
+
return new Uint8Array(0);
|
|
1407
|
+
}
|
|
1408
|
+
const padding = "=".repeat((4 - base64.length % 4) % 4);
|
|
1409
|
+
const b64 = (base64 + padding).replace(/-/g, "+").replace(/_/g, "/");
|
|
1410
|
+
const rawData = window.atob(b64);
|
|
1411
|
+
const outputArray = new Uint8Array(rawData.length);
|
|
1412
|
+
for (let i = 0; i < rawData.length; ++i) {
|
|
1413
|
+
outputArray[i] = rawData.charCodeAt(i);
|
|
1414
|
+
}
|
|
1415
|
+
return outputArray;
|
|
1416
|
+
};
|
|
1396
1417
|
const isPasskey = selectedMethod.value.device_type === "passkey";
|
|
1397
1418
|
const publicKeyCredentialRequestOptions = {
|
|
1398
|
-
...
|
|
1399
|
-
|
|
1419
|
+
...challengeData,
|
|
1420
|
+
challenge: challengeData.challenge ? base64ToUint8Array(challengeData.challenge) : new Uint8Array(32),
|
|
1421
|
+
timeout: isPasskey ? 3e5 : challengeData.timeout || 6e4,
|
|
1400
1422
|
userVerification: isPasskey ? "required" : "discouraged"
|
|
1401
1423
|
};
|
|
1424
|
+
if (challengeData.allowCredentials && Array.isArray(challengeData.allowCredentials)) {
|
|
1425
|
+
publicKeyCredentialRequestOptions.allowCredentials = challengeData.allowCredentials.map((cred) => ({
|
|
1426
|
+
...cred,
|
|
1427
|
+
id: base64ToUint8Array(cred.id)
|
|
1428
|
+
}));
|
|
1429
|
+
}
|
|
1402
1430
|
const credential = await navigator.credentials.get({
|
|
1403
1431
|
publicKey: publicKeyCredentialRequestOptions
|
|
1404
1432
|
});
|
|
@@ -1439,6 +1467,7 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
|
|
|
1439
1467
|
await verifyMfa(selectedMethod.value.id, JSON.stringify(credentialData));
|
|
1440
1468
|
emit("success");
|
|
1441
1469
|
} catch (error) {
|
|
1470
|
+
console.error("Hardware key authentication error:", error);
|
|
1442
1471
|
emit("error", error instanceof Error ? error.message : "Hardware key authentication failed");
|
|
1443
1472
|
}
|
|
1444
1473
|
};
|
|
@@ -1491,7 +1520,7 @@ const _hoisted_19$6 = {
|
|
|
1491
1520
|
key: 3,
|
|
1492
1521
|
class: "text-center space-y-4"
|
|
1493
1522
|
};
|
|
1494
|
-
const _hoisted_20$
|
|
1523
|
+
const _hoisted_20$5 = { class: "bg-blue-50 border border-blue-200 rounded-lg p-4" };
|
|
1495
1524
|
const _hoisted_21$4 = { class: "flex items-center space-x-3" };
|
|
1496
1525
|
const _hoisted_22$3 = { class: "text-left" };
|
|
1497
1526
|
const _hoisted_23$2 = { class: "font-medium text-blue-900" };
|
|
@@ -1505,21 +1534,21 @@ const _hoisted_27$2 = {
|
|
|
1505
1534
|
key: 4,
|
|
1506
1535
|
class: "space-y-4"
|
|
1507
1536
|
};
|
|
1508
|
-
const _hoisted_28$
|
|
1537
|
+
const _hoisted_28$1 = {
|
|
1509
1538
|
key: 0,
|
|
1510
1539
|
class: "bg-green-50 border border-green-200 rounded-lg p-4"
|
|
1511
1540
|
};
|
|
1512
|
-
const _hoisted_29$
|
|
1541
|
+
const _hoisted_29$1 = {
|
|
1513
1542
|
key: 1,
|
|
1514
1543
|
class: "text-sm text-gray-600"
|
|
1515
1544
|
};
|
|
1516
|
-
const _hoisted_30$
|
|
1545
|
+
const _hoisted_30$1 = {
|
|
1517
1546
|
key: 2,
|
|
1518
1547
|
class: "flex justify-between text-sm"
|
|
1519
1548
|
};
|
|
1520
|
-
const _hoisted_31$
|
|
1521
|
-
const _hoisted_32$
|
|
1522
|
-
const _hoisted_33$
|
|
1549
|
+
const _hoisted_31$1 = ["disabled"];
|
|
1550
|
+
const _hoisted_32$1 = { class: "pt-4 border-t border-gray-200" };
|
|
1551
|
+
const _hoisted_33$1 = {
|
|
1523
1552
|
key: 3,
|
|
1524
1553
|
class: "space-y-4 bg-amber-50 border border-amber-200 rounded-lg p-4"
|
|
1525
1554
|
};
|
|
@@ -1728,7 +1757,7 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1728
1757
|
])) : createCommentVNode("v-if", true),
|
|
1729
1758
|
createCommentVNode(" Hardware Key & Passkey Authentication "),
|
|
1730
1759
|
$setup.selectedMethod?.device_type === "hardware" || $setup.selectedMethod?.device_type === "passkey" ? (openBlock(), createElementBlock("div", _hoisted_19$6, [
|
|
1731
|
-
createElementVNode("div", _hoisted_20$
|
|
1760
|
+
createElementVNode("div", _hoisted_20$5, [
|
|
1732
1761
|
createElementVNode("div", _hoisted_21$4, [
|
|
1733
1762
|
_cache[11] || (_cache[11] = createElementVNode(
|
|
1734
1763
|
"div",
|
|
@@ -1858,7 +1887,7 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1858
1887
|
createCommentVNode(" Code Input "),
|
|
1859
1888
|
$setup.selectedMethod && $setup.selectedMethod.device_type !== "hardware" && $setup.selectedMethod.device_type !== "passkey" && ($setup.selectedMethod.device_type !== "email" || $setup.emailCodeSent) ? (openBlock(), createElementBlock("div", _hoisted_27$2, [
|
|
1860
1889
|
createCommentVNode(" Email confirmation "),
|
|
1861
|
-
$setup.selectedMethod.device_type === "email" && $setup.emailCodeSent ? (openBlock(), createElementBlock("div", _hoisted_28$
|
|
1890
|
+
$setup.selectedMethod.device_type === "email" && $setup.emailCodeSent ? (openBlock(), createElementBlock("div", _hoisted_28$1, _cache[14] || (_cache[14] = [
|
|
1862
1891
|
createElementVNode(
|
|
1863
1892
|
"div",
|
|
1864
1893
|
{ class: "flex items-start space-x-2" },
|
|
@@ -1899,21 +1928,21 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1899
1928
|
createCommentVNode(" TOTP Help "),
|
|
1900
1929
|
$setup.selectedMethod.device_type === "totp" ? (openBlock(), createElementBlock(
|
|
1901
1930
|
"div",
|
|
1902
|
-
_hoisted_29$
|
|
1931
|
+
_hoisted_29$1,
|
|
1903
1932
|
' Open your authenticator app and enter the 6-digit code for "' + toDisplayString($setup.selectedMethod.device_name) + '" ',
|
|
1904
1933
|
1
|
|
1905
1934
|
/* TEXT */
|
|
1906
1935
|
)) : createCommentVNode("v-if", true),
|
|
1907
1936
|
createCommentVNode(" Email Resend "),
|
|
1908
|
-
$setup.selectedMethod.device_type === "email" ? (openBlock(), createElementBlock("div", _hoisted_30$
|
|
1937
|
+
$setup.selectedMethod.device_type === "email" ? (openBlock(), createElementBlock("div", _hoisted_30$1, [
|
|
1909
1938
|
createElementVNode("button", {
|
|
1910
1939
|
onClick: $setup.sendEmailCode,
|
|
1911
1940
|
disabled: $setup.loading || $setup.cooldownActive,
|
|
1912
1941
|
class: "text-strands-600 hover:text-strands-800 disabled:text-gray-400 disabled:cursor-not-allowed"
|
|
1913
|
-
}, toDisplayString($setup.cooldownActive ? `Resend in ${$setup.cooldownSeconds}s` : "Resend Code"), 9, _hoisted_31$
|
|
1942
|
+
}, toDisplayString($setup.cooldownActive ? `Resend in ${$setup.cooldownSeconds}s` : "Resend Code"), 9, _hoisted_31$1)
|
|
1914
1943
|
])) : createCommentVNode("v-if", true),
|
|
1915
1944
|
createCommentVNode(" Backup Codes Option "),
|
|
1916
|
-
createElementVNode("div", _hoisted_32$
|
|
1945
|
+
createElementVNode("div", _hoisted_32$1, [
|
|
1917
1946
|
createElementVNode("button", {
|
|
1918
1947
|
onClick: _cache[3] || (_cache[3] = ($event) => $setup.showBackupCodeInput = !$setup.showBackupCodeInput),
|
|
1919
1948
|
class: "flex items-center text-sm text-gray-600 hover:text-gray-800 transition-colors"
|
|
@@ -1945,7 +1974,7 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1945
1974
|
])
|
|
1946
1975
|
]),
|
|
1947
1976
|
createCommentVNode(" Backup Code Input "),
|
|
1948
|
-
$setup.showBackupCodeInput ? (openBlock(), createElementBlock("div", _hoisted_33$
|
|
1977
|
+
$setup.showBackupCodeInput ? (openBlock(), createElementBlock("div", _hoisted_33$1, [
|
|
1949
1978
|
_cache[16] || (_cache[16] = createElementVNode(
|
|
1950
1979
|
"div",
|
|
1951
1980
|
{ class: "flex items-start space-x-2 mb-3" },
|
|
@@ -3387,7 +3416,7 @@ const _hoisted_16$5 = { class: "alert-error" };
|
|
|
3387
3416
|
const _hoisted_17$5 = { class: "flex items-start gap-3" };
|
|
3388
3417
|
const _hoisted_18$5 = { class: "font-medium" };
|
|
3389
3418
|
const _hoisted_19$5 = { class: "mt-8 text-center" };
|
|
3390
|
-
const _hoisted_20$
|
|
3419
|
+
const _hoisted_20$4 = { class: "text-sm text-neutral-600" };
|
|
3391
3420
|
const _hoisted_21$3 = { key: 0 };
|
|
3392
3421
|
const _hoisted_22$2 = { class: "text-neutral-400 text-sm" };
|
|
3393
3422
|
function _sfc_render$f(_ctx, _cache, $props, $setup, $data, $options) {
|
|
@@ -3652,7 +3681,7 @@ function _sfc_render$f(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
3652
3681
|
])) : createCommentVNode("v-if", true),
|
|
3653
3682
|
createCommentVNode(" Sign in link "),
|
|
3654
3683
|
createElementVNode("div", _hoisted_19$5, [
|
|
3655
|
-
createElementVNode("p", _hoisted_20$
|
|
3684
|
+
createElementVNode("p", _hoisted_20$4, [
|
|
3656
3685
|
_cache[10] || (_cache[10] = createTextVNode(
|
|
3657
3686
|
" Already have an account? ",
|
|
3658
3687
|
-1
|
|
@@ -7802,7 +7831,7 @@ const _hoisted_18$3 = {
|
|
|
7802
7831
|
class: "space-y-4"
|
|
7803
7832
|
};
|
|
7804
7833
|
const _hoisted_19$3 = { class: "text-center" };
|
|
7805
|
-
const _hoisted_20$
|
|
7834
|
+
const _hoisted_20$3 = { class: "text-sm text-gray-600 mb-6" };
|
|
7806
7835
|
const _hoisted_21$2 = { class: "flex justify-end space-x-3 pt-4" };
|
|
7807
7836
|
function _sfc_render$b(_ctx, _cache, $props, $setup, $data, $options) {
|
|
7808
7837
|
return openBlock(), createBlock($setup["UiModal"], {
|
|
@@ -8255,7 +8284,7 @@ function _sfc_render$b(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
8255
8284
|
)),
|
|
8256
8285
|
createElementVNode(
|
|
8257
8286
|
"p",
|
|
8258
|
-
_hoisted_20$
|
|
8287
|
+
_hoisted_20$3,
|
|
8259
8288
|
toDisplayString($setup.errorMessage),
|
|
8260
8289
|
1
|
|
8261
8290
|
/* TEXT */
|
|
@@ -8988,21 +9017,15 @@ const _hoisted_15$2 = { class: "flex flex-col space-y-2 ml-4" };
|
|
|
8988
9017
|
const _hoisted_16$2 = { class: "flex items-center justify-between" };
|
|
8989
9018
|
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" };
|
|
8990
9019
|
const _hoisted_18$2 = { class: "flex flex-col space-y-2 ml-4" };
|
|
8991
|
-
const _hoisted_19$2 = { class: "
|
|
8992
|
-
const _hoisted_20$
|
|
8993
|
-
const _hoisted_21$1 = { class: "flex
|
|
8994
|
-
const _hoisted_22$1 = { class: "flex items-
|
|
8995
|
-
const _hoisted_23$1 = { class: "
|
|
8996
|
-
const _hoisted_24$1 = { class: "
|
|
8997
|
-
const _hoisted_25$1 = { class: "
|
|
8998
|
-
const _hoisted_26$1 = { class: "
|
|
8999
|
-
const _hoisted_27$1 = { class: "flex
|
|
9000
|
-
const _hoisted_28$1 = { class: "flex items-start space-x-4" };
|
|
9001
|
-
const _hoisted_29$1 = { class: "min-w-0 flex-1" };
|
|
9002
|
-
const _hoisted_30$1 = { class: "font-semibold text-gray-900 text-lg" };
|
|
9003
|
-
const _hoisted_31$1 = { class: "text-sm text-gray-600 mt-1" };
|
|
9004
|
-
const _hoisted_32$1 = { class: "text-xs text-gray-500 mt-2" };
|
|
9005
|
-
const _hoisted_33$1 = { class: "flex flex-col space-y-2 ml-4" };
|
|
9020
|
+
const _hoisted_19$2 = { class: "space-y-6" };
|
|
9021
|
+
const _hoisted_20$2 = { class: "max-h-96 overflow-y-auto space-y-4 pr-2" };
|
|
9022
|
+
const _hoisted_21$1 = { class: "flex items-start justify-between" };
|
|
9023
|
+
const _hoisted_22$1 = { class: "flex items-start space-x-4" };
|
|
9024
|
+
const _hoisted_23$1 = { class: "min-w-0 flex-1" };
|
|
9025
|
+
const _hoisted_24$1 = { class: "font-semibold text-gray-900 text-lg" };
|
|
9026
|
+
const _hoisted_25$1 = { class: "text-sm text-gray-600 mt-1" };
|
|
9027
|
+
const _hoisted_26$1 = { class: "text-xs text-gray-500 mt-2" };
|
|
9028
|
+
const _hoisted_27$1 = { class: "flex flex-col space-y-2 ml-4" };
|
|
9006
9029
|
function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
9007
9030
|
return openBlock(), createElementBlock(
|
|
9008
9031
|
Fragment,
|
|
@@ -9133,7 +9156,7 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9133
9156
|
createCommentVNode(" Tab Content: Add New Device "),
|
|
9134
9157
|
$setup.activeTab === "add" ? (openBlock(), createElementBlock("div", _hoisted_11$2, [
|
|
9135
9158
|
createElementVNode("div", null, [
|
|
9136
|
-
_cache[
|
|
9159
|
+
_cache[17] || (_cache[17] = createElementVNode(
|
|
9137
9160
|
"h3",
|
|
9138
9161
|
{ class: "text-xl font-semibold text-gray-900 mb-6" },
|
|
9139
9162
|
"Choose Your Authentication Method",
|
|
@@ -9229,94 +9252,35 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9229
9252
|
])
|
|
9230
9253
|
])
|
|
9231
9254
|
]),
|
|
9232
|
-
createCommentVNode(" Hardware Key Setup "),
|
|
9233
|
-
|
|
9234
|
-
|
|
9235
|
-
|
|
9236
|
-
|
|
9237
|
-
|
|
9238
|
-
|
|
9239
|
-
|
|
9240
|
-
|
|
9241
|
-
|
|
9242
|
-
|
|
9243
|
-
|
|
9244
|
-
|
|
9245
|
-
|
|
9246
|
-
|
|
9247
|
-
|
|
9248
|
-
|
|
9249
|
-
|
|
9250
|
-
|
|
9251
|
-
|
|
9252
|
-
|
|
9253
|
-
|
|
9254
|
-
|
|
9255
|
-
|
|
9256
|
-
|
|
9257
|
-
|
|
9258
|
-
|
|
9259
|
-
|
|
9260
|
-
|
|
9261
|
-
disabled: $setup.mfaLoading
|
|
9262
|
-
}, {
|
|
9263
|
-
default: withCtx(() => _cache[17] || (_cache[17] = [
|
|
9264
|
-
createTextVNode(
|
|
9265
|
-
" Setup ",
|
|
9266
|
-
-1
|
|
9267
|
-
/* CACHED */
|
|
9268
|
-
)
|
|
9269
|
-
])),
|
|
9270
|
-
_: 1,
|
|
9271
|
-
__: [17]
|
|
9272
|
-
}, 8, ["disabled"])
|
|
9273
|
-
])
|
|
9274
|
-
])
|
|
9275
|
-
]),
|
|
9276
|
-
createCommentVNode(" Passkey Setup "),
|
|
9277
|
-
createElementVNode("div", {
|
|
9278
|
-
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",
|
|
9279
|
-
onClick: $setup.startPasskeySetup
|
|
9280
|
-
}, [
|
|
9281
|
-
createElementVNode("div", _hoisted_22$1, [
|
|
9282
|
-
createElementVNode("div", _hoisted_23$1, [
|
|
9283
|
-
createVNode($setup["Shield"], {
|
|
9284
|
-
size: 24,
|
|
9285
|
-
class: "text-[var(--strands-primary)]"
|
|
9286
|
-
})
|
|
9287
|
-
]),
|
|
9288
|
-
_cache[20] || (_cache[20] = createElementVNode(
|
|
9289
|
-
"div",
|
|
9290
|
-
{ class: "flex items-start space-x-4" },
|
|
9291
|
-
[
|
|
9292
|
-
createElementVNode("div", { class: "min-w-0 flex-1" }, [
|
|
9293
|
-
createElementVNode("h4", { class: "font-semibold text-gray-900 text-lg" }, "Passkey"),
|
|
9294
|
-
createElementVNode("p", { class: "text-xs text-gray-500 mt-2" }, " Use your device's built-in biometrics, PIN, or cross-device passkeys ")
|
|
9295
|
-
])
|
|
9296
|
-
],
|
|
9297
|
-
-1
|
|
9298
|
-
/* CACHED */
|
|
9299
|
-
)),
|
|
9300
|
-
createElementVNode("div", _hoisted_24$1, [
|
|
9301
|
-
createVNode($setup["StrandsUiButton"], {
|
|
9302
|
-
variant: "primary",
|
|
9303
|
-
size: "md",
|
|
9304
|
-
onClick: withModifiers($setup.startPasskeySetup, ["stop"]),
|
|
9305
|
-
disabled: $setup.mfaLoading
|
|
9306
|
-
}, {
|
|
9307
|
-
default: withCtx(() => _cache[19] || (_cache[19] = [
|
|
9308
|
-
createTextVNode(
|
|
9309
|
-
" Setup ",
|
|
9310
|
-
-1
|
|
9311
|
-
/* CACHED */
|
|
9312
|
-
)
|
|
9313
|
-
])),
|
|
9314
|
-
_: 1,
|
|
9315
|
-
__: [19]
|
|
9316
|
-
}, 8, ["disabled"])
|
|
9317
|
-
])
|
|
9318
|
-
])
|
|
9319
|
-
])
|
|
9255
|
+
createCommentVNode(" Hardware Key Setup - Temporarily Disabled "),
|
|
9256
|
+
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 '),
|
|
9257
|
+
createCommentVNode(`
|
|
9258
|
+
<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">
|
|
9259
|
+
<div class="flex items-center justify-between">
|
|
9260
|
+
<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">
|
|
9261
|
+
<Shield :size="24" class="text-[var(--strands-primary)]" />
|
|
9262
|
+
</div>
|
|
9263
|
+
<div class="flex items-start space-x-4">
|
|
9264
|
+
<div class="min-w-0 flex-1">
|
|
9265
|
+
<h4 class="font-semibold text-gray-900 text-lg">Passkey</h4>
|
|
9266
|
+
<p class="text-xs text-gray-500 mt-2">
|
|
9267
|
+
Use your device's built-in biometrics, PIN, or cross-device passkeys
|
|
9268
|
+
</p>
|
|
9269
|
+
</div>
|
|
9270
|
+
</div>
|
|
9271
|
+
<div class="flex flex-col space-y-2 ml-4">
|
|
9272
|
+
<StrandsUiButton
|
|
9273
|
+
variant="primary"
|
|
9274
|
+
size="md"
|
|
9275
|
+
@click.stop="startPasskeySetup"
|
|
9276
|
+
:disabled="mfaLoading"
|
|
9277
|
+
>
|
|
9278
|
+
Setup
|
|
9279
|
+
</StrandsUiButton>
|
|
9280
|
+
</div>
|
|
9281
|
+
</div>
|
|
9282
|
+
</div>
|
|
9283
|
+
`)
|
|
9320
9284
|
])
|
|
9321
9285
|
])
|
|
9322
9286
|
])) : $setup.activeTab === "manage" && $setup.activeMfaDevices.length > 0 ? (openBlock(), createElementBlock(
|
|
@@ -9324,16 +9288,16 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9324
9288
|
{ key: 1 },
|
|
9325
9289
|
[
|
|
9326
9290
|
createCommentVNode(" Tab Content: Active Devices "),
|
|
9327
|
-
createElementVNode("div",
|
|
9291
|
+
createElementVNode("div", _hoisted_19$2, [
|
|
9328
9292
|
createElementVNode("div", null, [
|
|
9329
|
-
_cache[
|
|
9293
|
+
_cache[21] || (_cache[21] = createElementVNode(
|
|
9330
9294
|
"h3",
|
|
9331
9295
|
{ class: "text-xl font-semibold text-gray-900 mb-6" },
|
|
9332
9296
|
"Manage Your Active Devices",
|
|
9333
9297
|
-1
|
|
9334
9298
|
/* CACHED */
|
|
9335
9299
|
)),
|
|
9336
|
-
createElementVNode("div",
|
|
9300
|
+
createElementVNode("div", _hoisted_20$2, [
|
|
9337
9301
|
(openBlock(true), createElementBlock(
|
|
9338
9302
|
Fragment,
|
|
9339
9303
|
null,
|
|
@@ -9342,8 +9306,8 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9342
9306
|
key: device.id,
|
|
9343
9307
|
class: "group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200"
|
|
9344
9308
|
}, [
|
|
9345
|
-
createElementVNode("div",
|
|
9346
|
-
createElementVNode("div",
|
|
9309
|
+
createElementVNode("div", _hoisted_21$1, [
|
|
9310
|
+
createElementVNode("div", _hoisted_22$1, [
|
|
9347
9311
|
createElementVNode(
|
|
9348
9312
|
"div",
|
|
9349
9313
|
{
|
|
@@ -9358,31 +9322,31 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9358
9322
|
2
|
|
9359
9323
|
/* CLASS */
|
|
9360
9324
|
),
|
|
9361
|
-
createElementVNode("div",
|
|
9325
|
+
createElementVNode("div", _hoisted_23$1, [
|
|
9362
9326
|
createElementVNode(
|
|
9363
9327
|
"h4",
|
|
9364
|
-
|
|
9328
|
+
_hoisted_24$1,
|
|
9365
9329
|
toDisplayString(device.device_name),
|
|
9366
9330
|
1
|
|
9367
9331
|
/* TEXT */
|
|
9368
9332
|
),
|
|
9369
9333
|
createElementVNode(
|
|
9370
9334
|
"p",
|
|
9371
|
-
|
|
9335
|
+
_hoisted_25$1,
|
|
9372
9336
|
toDisplayString($setup.getDeviceTypeName(device.device_type)),
|
|
9373
9337
|
1
|
|
9374
9338
|
/* TEXT */
|
|
9375
9339
|
),
|
|
9376
9340
|
createElementVNode(
|
|
9377
9341
|
"p",
|
|
9378
|
-
|
|
9342
|
+
_hoisted_26$1,
|
|
9379
9343
|
" Last used " + toDisplayString($setup.formatLastUsed(device.last_used_at)),
|
|
9380
9344
|
1
|
|
9381
9345
|
/* TEXT */
|
|
9382
9346
|
)
|
|
9383
9347
|
])
|
|
9384
9348
|
]),
|
|
9385
|
-
createElementVNode("div",
|
|
9349
|
+
createElementVNode("div", _hoisted_27$1, [
|
|
9386
9350
|
createCommentVNode(" Backup codes button for TOTP, Hardware Key, and Passkey devices "),
|
|
9387
9351
|
device.device_type === "totp" || device.device_type === "hardware" || device.device_type === "passkey" ? (openBlock(), createBlock($setup["StrandsUiButton"], {
|
|
9388
9352
|
key: 0,
|
|
@@ -9396,14 +9360,14 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9396
9360
|
size: 14,
|
|
9397
9361
|
class: "mr-2"
|
|
9398
9362
|
}),
|
|
9399
|
-
_cache[
|
|
9363
|
+
_cache[18] || (_cache[18] = createTextVNode(
|
|
9400
9364
|
" Backup Codes ",
|
|
9401
9365
|
-1
|
|
9402
9366
|
/* CACHED */
|
|
9403
9367
|
))
|
|
9404
9368
|
]),
|
|
9405
9369
|
_: 2,
|
|
9406
|
-
__: [
|
|
9370
|
+
__: [18]
|
|
9407
9371
|
}, 1032, ["onClick", "disabled"])) : createCommentVNode("v-if", true),
|
|
9408
9372
|
createCommentVNode(" Test email MFA "),
|
|
9409
9373
|
device.device_type === "email" ? (openBlock(), createBlock($setup["StrandsUiButton"], {
|
|
@@ -9418,14 +9382,14 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9418
9382
|
size: 14,
|
|
9419
9383
|
class: "mr-2"
|
|
9420
9384
|
}),
|
|
9421
|
-
_cache[
|
|
9385
|
+
_cache[19] || (_cache[19] = createTextVNode(
|
|
9422
9386
|
" Send Test Code ",
|
|
9423
9387
|
-1
|
|
9424
9388
|
/* CACHED */
|
|
9425
9389
|
))
|
|
9426
9390
|
]),
|
|
9427
9391
|
_: 2,
|
|
9428
|
-
__: [
|
|
9392
|
+
__: [19]
|
|
9429
9393
|
}, 1032, ["onClick", "disabled"])) : createCommentVNode("v-if", true),
|
|
9430
9394
|
createCommentVNode(" Remove device "),
|
|
9431
9395
|
createVNode($setup["StrandsUiButton"], {
|
|
@@ -9440,14 +9404,14 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
9440
9404
|
size: 14,
|
|
9441
9405
|
class: "mr-2"
|
|
9442
9406
|
}),
|
|
9443
|
-
_cache[
|
|
9407
|
+
_cache[20] || (_cache[20] = createTextVNode(
|
|
9444
9408
|
" Remove ",
|
|
9445
9409
|
-1
|
|
9446
9410
|
/* CACHED */
|
|
9447
9411
|
))
|
|
9448
9412
|
]),
|
|
9449
9413
|
_: 2,
|
|
9450
|
-
__: [
|
|
9414
|
+
__: [20]
|
|
9451
9415
|
}, 1032, ["onClick", "disabled"])
|
|
9452
9416
|
])
|
|
9453
9417
|
])
|
|
@@ -9973,7 +9937,7 @@ const _hoisted_16$1 = {
|
|
|
9973
9937
|
const _hoisted_17$1 = { class: "space-y-3 md:space-y-4" };
|
|
9974
9938
|
const _hoisted_18$1 = { class: "space-y-4 p-4 bg-gray-50 rounded-xl" };
|
|
9975
9939
|
const _hoisted_19$1 = { class: "flex items-center justify-between gap-2" };
|
|
9976
|
-
const _hoisted_20 = { class: "text-sm text-gray-600" };
|
|
9940
|
+
const _hoisted_20$1 = { class: "text-sm text-gray-600" };
|
|
9977
9941
|
const _hoisted_21 = {
|
|
9978
9942
|
key: 0,
|
|
9979
9943
|
class: "space-y-3 overflow-hidden"
|
|
@@ -10235,7 +10199,7 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
10235
10199
|
)),
|
|
10236
10200
|
createElementVNode(
|
|
10237
10201
|
"p",
|
|
10238
|
-
_hoisted_20,
|
|
10202
|
+
_hoisted_20$1,
|
|
10239
10203
|
"Last updated " + toDisplayString($setup.passwordLastUpdated),
|
|
10240
10204
|
1
|
|
10241
10205
|
/* TEXT */
|
|
@@ -10878,15 +10842,16 @@ const _hoisted_10 = { class: "flex flex-col items-center text-center space-y-4"
|
|
|
10878
10842
|
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" };
|
|
10879
10843
|
const _hoisted_12 = { class: "flex flex-col items-center text-center space-y-4" };
|
|
10880
10844
|
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" };
|
|
10881
|
-
const _hoisted_14 = { class: "
|
|
10882
|
-
const _hoisted_15 = { class: "
|
|
10883
|
-
const _hoisted_16 = {
|
|
10845
|
+
const _hoisted_14 = { class: "group p-8 border border-gray-300 rounded-xl bg-gray-50 opacity-60 cursor-not-allowed" };
|
|
10846
|
+
const _hoisted_15 = { class: "flex flex-col items-center text-center space-y-4" };
|
|
10847
|
+
const _hoisted_16 = { class: "w-16 h-16 bg-gray-200 rounded-xl flex items-center justify-center" };
|
|
10848
|
+
const _hoisted_17 = {
|
|
10884
10849
|
key: 1,
|
|
10885
10850
|
class: "border-t border-gray-200 pt-8"
|
|
10886
10851
|
};
|
|
10887
|
-
const
|
|
10888
|
-
const
|
|
10889
|
-
const
|
|
10852
|
+
const _hoisted_18 = { class: "flex items-center justify-between" };
|
|
10853
|
+
const _hoisted_19 = { class: "text-gray-600 text-sm mt-1" };
|
|
10854
|
+
const _hoisted_20 = { class: "flex justify-end space-x-3" };
|
|
10890
10855
|
function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
|
|
10891
10856
|
return openBlock(), createElementBlock(
|
|
10892
10857
|
Fragment,
|
|
@@ -10923,7 +10888,7 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
10923
10888
|
])
|
|
10924
10889
|
]),
|
|
10925
10890
|
footer: withCtx(() => [
|
|
10926
|
-
createElementVNode("div",
|
|
10891
|
+
createElementVNode("div", _hoisted_20, [
|
|
10927
10892
|
createVNode($setup["StrandsUiButton"], {
|
|
10928
10893
|
variant: "secondary",
|
|
10929
10894
|
onClick: $setup.closeModal,
|
|
@@ -11072,52 +11037,48 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
11072
11037
|
}, 8, ["disabled"])
|
|
11073
11038
|
])
|
|
11074
11039
|
]),
|
|
11075
|
-
createCommentVNode(" Hardware Key Setup "),
|
|
11076
|
-
createElementVNode("div",
|
|
11077
|
-
|
|
11078
|
-
|
|
11079
|
-
}, [
|
|
11080
|
-
createElementVNode("div", _hoisted_14, [
|
|
11081
|
-
createElementVNode("div", _hoisted_15, [
|
|
11040
|
+
createCommentVNode(" Hardware Key Setup - Temporarily Disabled "),
|
|
11041
|
+
createElementVNode("div", _hoisted_14, [
|
|
11042
|
+
createElementVNode("div", _hoisted_15, [
|
|
11043
|
+
createElementVNode("div", _hoisted_16, [
|
|
11082
11044
|
createVNode($setup["KeyRound"], {
|
|
11083
11045
|
size: 28,
|
|
11084
|
-
class: "text-
|
|
11046
|
+
class: "text-gray-400"
|
|
11085
11047
|
})
|
|
11086
11048
|
]),
|
|
11087
11049
|
_cache[12] || (_cache[12] = createElementVNode(
|
|
11088
11050
|
"div",
|
|
11089
11051
|
{ class: "space-y-2" },
|
|
11090
11052
|
[
|
|
11091
|
-
createElementVNode("h4", { class: "font-semibold text-gray-
|
|
11092
|
-
createElementVNode("p", { class: "text-sm text-gray-
|
|
11053
|
+
createElementVNode("h4", { class: "font-semibold text-gray-500 text-lg" }, "Hardware Key & Passkeys"),
|
|
11054
|
+
createElementVNode("p", { class: "text-sm text-gray-400 leading-relaxed" }, "Temporarily unavailable - cross-domain support coming soon")
|
|
11093
11055
|
],
|
|
11094
11056
|
-1
|
|
11095
11057
|
/* CACHED */
|
|
11096
11058
|
)),
|
|
11097
11059
|
createVNode($setup["StrandsUiButton"], {
|
|
11098
|
-
variant: "
|
|
11060
|
+
variant: "secondary",
|
|
11099
11061
|
size: "md",
|
|
11100
|
-
|
|
11101
|
-
disabled: $setup.loading,
|
|
11062
|
+
disabled: "",
|
|
11102
11063
|
class: "w-full mt-4"
|
|
11103
11064
|
}, {
|
|
11104
11065
|
default: withCtx(() => _cache[11] || (_cache[11] = [
|
|
11105
11066
|
createTextVNode(
|
|
11106
|
-
"
|
|
11067
|
+
" Coming Soon ",
|
|
11107
11068
|
-1
|
|
11108
11069
|
/* CACHED */
|
|
11109
11070
|
)
|
|
11110
11071
|
])),
|
|
11111
11072
|
_: 1,
|
|
11112
11073
|
__: [11]
|
|
11113
|
-
}
|
|
11074
|
+
})
|
|
11114
11075
|
])
|
|
11115
11076
|
])
|
|
11116
11077
|
])
|
|
11117
11078
|
]),
|
|
11118
11079
|
createCommentVNode(" Manage Existing "),
|
|
11119
|
-
$setup.activeMfaDevices.length > 0 ? (openBlock(), createElementBlock("div",
|
|
11120
|
-
createElementVNode("div",
|
|
11080
|
+
$setup.activeMfaDevices.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_17, [
|
|
11081
|
+
createElementVNode("div", _hoisted_18, [
|
|
11121
11082
|
createElementVNode("div", null, [
|
|
11122
11083
|
_cache[14] || (_cache[14] = createElementVNode(
|
|
11123
11084
|
"h3",
|
|
@@ -11128,7 +11089,7 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
11128
11089
|
)),
|
|
11129
11090
|
createElementVNode(
|
|
11130
11091
|
"p",
|
|
11131
|
-
|
|
11092
|
+
_hoisted_19,
|
|
11132
11093
|
toDisplayString($setup.activeMfaDevices.length) + " device(s) currently active",
|
|
11133
11094
|
1
|
|
11134
11095
|
/* TEXT */
|