@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.
@@ -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: String, required: false },
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(() => mfaDevices.value.filter((d) => d.is_active));
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(() => props.availableMfaMethods || []);
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 challenge = challengeResponse.challenge;
1395
- console.log("Received WebAuthn challenge:", challenge);
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
- ...challenge,
1399
- timeout: isPasskey ? 3e5 : challenge.timeout || 6e4,
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$4 = { class: "bg-blue-50 border border-blue-200 rounded-lg p-4" };
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$2 = {
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$2 = {
1541
+ const _hoisted_29$1 = {
1513
1542
  key: 1,
1514
1543
  class: "text-sm text-gray-600"
1515
1544
  };
1516
- const _hoisted_30$2 = {
1545
+ const _hoisted_30$1 = {
1517
1546
  key: 2,
1518
1547
  class: "flex justify-between text-sm"
1519
1548
  };
1520
- const _hoisted_31$2 = ["disabled"];
1521
- const _hoisted_32$2 = { class: "pt-4 border-t border-gray-200" };
1522
- const _hoisted_33$2 = {
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$4, [
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$2, _cache[14] || (_cache[14] = [
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$2,
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$2, [
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$2)
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$2, [
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$2, [
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$3 = { class: "text-sm text-neutral-600" };
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$3, [
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$2 = { class: "text-sm text-gray-600 mb-6" };
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$2,
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: "flex items-center justify-between" };
8992
- const _hoisted_20$1 = { 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" };
8993
- const _hoisted_21$1 = { class: "flex flex-col space-y-2 ml-4" };
8994
- const _hoisted_22$1 = { class: "flex items-center justify-between" };
8995
- const _hoisted_23$1 = { 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" };
8996
- const _hoisted_24$1 = { class: "flex flex-col space-y-2 ml-4" };
8997
- const _hoisted_25$1 = { class: "space-y-6" };
8998
- const _hoisted_26$1 = { class: "max-h-96 overflow-y-auto space-y-4 pr-2" };
8999
- const _hoisted_27$1 = { class: "flex items-start justify-between" };
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[21] || (_cache[21] = createElementVNode(
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
- createElementVNode("div", {
9234
- 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",
9235
- onClick: $setup.startHardwareKeySetup
9236
- }, [
9237
- createElementVNode("div", _hoisted_19$2, [
9238
- createElementVNode("div", _hoisted_20$1, [
9239
- createVNode($setup["KeyRound"], {
9240
- size: 24,
9241
- class: "text-[var(--strands-primary)]"
9242
- })
9243
- ]),
9244
- _cache[18] || (_cache[18] = createElementVNode(
9245
- "div",
9246
- { class: "flex items-start space-x-4" },
9247
- [
9248
- createElementVNode("div", { class: "min-w-0 flex-1" }, [
9249
- createElementVNode("h4", { class: "font-semibold text-gray-900 text-lg" }, "Hardware Security Key"),
9250
- createElementVNode("p", { class: "text-xs text-gray-500 mt-2" }, " Use YubiKey, FIDO2, or other physical security keys for ultimate protection ")
9251
- ])
9252
- ],
9253
- -1
9254
- /* CACHED */
9255
- )),
9256
- createElementVNode("div", _hoisted_21$1, [
9257
- createVNode($setup["StrandsUiButton"], {
9258
- variant: "primary",
9259
- size: "md",
9260
- onClick: withModifiers($setup.startHardwareKeySetup, ["stop"]),
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", _hoisted_25$1, [
9291
+ createElementVNode("div", _hoisted_19$2, [
9328
9292
  createElementVNode("div", null, [
9329
- _cache[25] || (_cache[25] = createElementVNode(
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", _hoisted_26$1, [
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", _hoisted_27$1, [
9346
- createElementVNode("div", _hoisted_28$1, [
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", _hoisted_29$1, [
9325
+ createElementVNode("div", _hoisted_23$1, [
9362
9326
  createElementVNode(
9363
9327
  "h4",
9364
- _hoisted_30$1,
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
- _hoisted_31$1,
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
- _hoisted_32$1,
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", _hoisted_33$1, [
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[22] || (_cache[22] = createTextVNode(
9363
+ _cache[18] || (_cache[18] = createTextVNode(
9400
9364
  " Backup Codes ",
9401
9365
  -1
9402
9366
  /* CACHED */
9403
9367
  ))
9404
9368
  ]),
9405
9369
  _: 2,
9406
- __: [22]
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[23] || (_cache[23] = createTextVNode(
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
- __: [23]
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[24] || (_cache[24] = createTextVNode(
9407
+ _cache[20] || (_cache[20] = createTextVNode(
9444
9408
  " Remove ",
9445
9409
  -1
9446
9410
  /* CACHED */
9447
9411
  ))
9448
9412
  ]),
9449
9413
  _: 2,
9450
- __: [24]
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: "flex flex-col items-center text-center space-y-4" };
10882
- const _hoisted_15 = { 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" };
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 _hoisted_17 = { class: "flex items-center justify-between" };
10888
- const _hoisted_18 = { class: "text-gray-600 text-sm mt-1" };
10889
- const _hoisted_19 = { class: "flex justify-end space-x-3" };
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", _hoisted_19, [
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
- class: "group p-8 border border-gray-200 rounded-xl hover:shadow-lg hover:border-[var(--strands-primary)] transition-all duration-200 cursor-pointer",
11078
- onClick: $setup.startHardwareKeySetup
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-[var(--strands-primary)]"
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-900 text-lg" }, "Hardware Key & Passkeys"),
11092
- createElementVNode("p", { class: "text-sm text-gray-500 leading-relaxed" }, "Use YubiKey, FIDO2 devices, WebAuthn, or built-in passkeys for maximum security")
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: "primary",
11060
+ variant: "secondary",
11099
11061
  size: "md",
11100
- onClick: withModifiers($setup.startHardwareKeySetup, ["stop"]),
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
- " Setup Hardware Key ",
11067
+ " Coming Soon ",
11107
11068
  -1
11108
11069
  /* CACHED */
11109
11070
  )
11110
11071
  ])),
11111
11072
  _: 1,
11112
11073
  __: [11]
11113
- }, 8, ["disabled"])
11074
+ })
11114
11075
  ])
11115
11076
  ])
11116
11077
  ])
11117
11078
  ]),
11118
11079
  createCommentVNode(" Manage Existing "),
11119
- $setup.activeMfaDevices.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_16, [
11120
- createElementVNode("div", _hoisted_17, [
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
- _hoisted_18,
11092
+ _hoisted_19,
11132
11093
  toDisplayString($setup.activeMfaDevices.length) + " device(s) currently active",
11133
11094
  1
11134
11095
  /* TEXT */