@strands.gg/accui 1.2.0 → 1.2.2

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 CHANGED
@@ -48,6 +48,8 @@
48
48
  --color-blue-900: oklch(37.9% 0.146 265.522);
49
49
  --color-purple-50: oklch(97.7% 0.014 308.299);
50
50
  --color-purple-100: oklch(94.6% 0.033 307.174);
51
+ --color-purple-200: oklch(90.2% 0.063 306.703);
52
+ --color-purple-700: oklch(49.6% 0.265 301.924);
51
53
  --color-gray-50: oklch(98.5% 0.002 247.839);
52
54
  --color-gray-100: oklch(96.7% 0.003 264.542);
53
55
  --color-gray-200: oklch(92.8% 0.006 264.531);
@@ -410,6 +412,9 @@
410
412
  .mr-1 {
411
413
  margin-right: calc(var(--spacing) * 1);
412
414
  }
415
+ .mr-1\.5 {
416
+ margin-right: calc(var(--spacing) * 1.5);
417
+ }
413
418
  .mr-2 {
414
419
  margin-right: calc(var(--spacing) * 2);
415
420
  }
@@ -440,6 +445,9 @@
440
445
  .mb-12 {
441
446
  margin-bottom: calc(var(--spacing) * 12);
442
447
  }
448
+ .ml-1 {
449
+ margin-left: calc(var(--spacing) * 1);
450
+ }
443
451
  .ml-2 {
444
452
  margin-left: calc(var(--spacing) * 2);
445
453
  }
@@ -770,6 +778,9 @@
770
778
  .border-neutral-200 {
771
779
  border-color: var(--color-neutral-200);
772
780
  }
781
+ .border-purple-200 {
782
+ border-color: var(--color-purple-200);
783
+ }
773
784
  .border-red-200 {
774
785
  border-color: var(--color-red-200);
775
786
  }
@@ -1135,6 +1146,9 @@
1135
1146
  .text-neutral-900 {
1136
1147
  color: var(--color-neutral-900);
1137
1148
  }
1149
+ .text-purple-700 {
1150
+ color: var(--color-purple-700);
1151
+ }
1138
1152
  .text-red-400 {
1139
1153
  color: var(--color-red-400);
1140
1154
  }
@@ -7427,15 +7427,38 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
7427
7427
  challenge: safeBufferConvert(challenge.challenge),
7428
7428
  pubKeyCredParams: challenge.pubKeyCredParams || [
7429
7429
  { type: "public-key", alg: -7 },
7430
- // ES256
7431
- { type: "public-key", alg: -257 }
7432
- // RS256
7430
+ // ES256 (ECDSA w/ SHA-256)
7431
+ { type: "public-key", alg: -35 },
7432
+ // ES384 (ECDSA w/ SHA-384)
7433
+ { type: "public-key", alg: -36 },
7434
+ // ES512 (ECDSA w/ SHA-512)
7435
+ { type: "public-key", alg: -257 },
7436
+ // RS256 (RSASSA-PKCS1-v1_5 w/ SHA-256)
7437
+ { type: "public-key", alg: -258 },
7438
+ // RS384 (RSASSA-PKCS1-v1_5 w/ SHA-384)
7439
+ { type: "public-key", alg: -259 },
7440
+ // RS512 (RSASSA-PKCS1-v1_5 w/ SHA-512)
7441
+ { type: "public-key", alg: -37 },
7442
+ // PS256 (RSASSA-PSS w/ SHA-256)
7443
+ { type: "public-key", alg: -38 },
7444
+ // PS384 (RSASSA-PSS w/ SHA-384)
7445
+ { type: "public-key", alg: -39 },
7446
+ // PS512 (RSASSA-PSS w/ SHA-512)
7447
+ { type: "public-key", alg: -8 }
7448
+ // EdDSA (Ed25519)
7433
7449
  ],
7434
- timeout: challenge.timeout || 6e4,
7450
+ timeout: challenge.timeout || 12e4,
7451
+ // Longer timeout for hardware keys
7435
7452
  authenticatorSelection: challenge.authenticatorSelection || {
7436
- userVerification: "preferred"
7453
+ authenticatorAttachment: "cross-platform",
7454
+ // Prefer external authenticators like YubiKey
7455
+ requireResidentKey: false,
7456
+ residentKey: "discouraged",
7457
+ userVerification: "discouraged"
7458
+ // YubiKeys work better with discouraged
7437
7459
  },
7438
- attestation: challenge.attestation || "none"
7460
+ attestation: challenge.attestation || "direct"
7461
+ // Better compatibility with hardware keys
7439
7462
  };
7440
7463
  if (challenge.excludeCredentials && Array.isArray(challenge.excludeCredentials) && challenge.excludeCredentials.length > 0) {
7441
7464
  cleanChallenge.excludeCredentials = challenge.excludeCredentials.map((cred) => ({
@@ -7465,6 +7488,16 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
7465
7488
  if (!window.navigator.credentials || !window.PublicKeyCredential) {
7466
7489
  throw new Error("WebAuthn is not supported in this browser");
7467
7490
  }
7491
+ try {
7492
+ const available = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable?.();
7493
+ console.log("Platform authenticator available:", available);
7494
+ if (PublicKeyCredential.isConditionalMediationAvailable) {
7495
+ const conditionalMediationAvailable = await PublicKeyCredential.isConditionalMediationAvailable();
7496
+ console.log("Conditional mediation available:", conditionalMediationAvailable);
7497
+ }
7498
+ } catch (checkError) {
7499
+ console.warn("Could not check authenticator availability:", checkError);
7500
+ }
7468
7501
  if (!currentSession.value?.accessToken) {
7469
7502
  throw new Error("Not authenticated. Please sign in again.");
7470
7503
  }
@@ -7531,7 +7564,26 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
7531
7564
  }
7532
7565
  } catch (error) {
7533
7566
  console.error("Hardware key registration error:", error);
7534
- errorMessage.value = error instanceof Error ? error.message : "Hardware key registration failed";
7567
+ let userErrorMessage = "Hardware key registration failed";
7568
+ if (error instanceof Error) {
7569
+ const errorMsg = error.message.toLowerCase();
7570
+ if (errorMsg.includes("not supported") || errorMsg.includes("webauthn")) {
7571
+ userErrorMessage = "WebAuthn is not supported in this browser. Please use Chrome, Firefox, Safari, or Edge.";
7572
+ } else if (errorMsg.includes("cancelled") || errorMsg.includes("aborted")) {
7573
+ userErrorMessage = "Hardware key registration was cancelled. Please try again and touch your key when prompted.";
7574
+ } else if (errorMsg.includes("timeout")) {
7575
+ userErrorMessage = "Hardware key registration timed out. Please ensure your key is connected and try again.";
7576
+ } else if (errorMsg.includes("not allowed") || errorMsg.includes("invalid state")) {
7577
+ userErrorMessage = "This hardware key may already be registered or cannot be used. Try a different key or contact support.";
7578
+ } else if (errorMsg.includes("can't be used") || errorMsg.includes("newer or different")) {
7579
+ userErrorMessage = "Your hardware key is not compatible. Please ensure you have a FIDO2/WebAuthn compatible key like YubiKey 5 Series, and that it's properly connected.";
7580
+ } else if (errorMsg.includes("user verification") || errorMsg.includes("pin")) {
7581
+ userErrorMessage = "Hardware key verification failed. If your key has a PIN, please enter it when prompted.";
7582
+ } else {
7583
+ userErrorMessage = error.message;
7584
+ }
7585
+ }
7586
+ errorMessage.value = userErrorMessage;
7535
7587
  step.value = 5;
7536
7588
  } finally {
7537
7589
  internalLoading.value = false;
@@ -9199,6 +9251,7 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
9199
9251
  const emit = __emit;
9200
9252
  const { getSupportEmail, config: strandsConfig, getUrl } = useStrandsConfig.useStrandsConfig(props.config);
9201
9253
  const { fetchProfile, updateProfile, changeEmail, currentUser: authUser, currentSession, isAuthenticated, refreshToken, signOut } = useStrandsAuth.useStrandsAuth();
9254
+ const { mfaDevices: mfaDevices2, mfaEnabled: mfaEnabled2, activeMfaDevices, fetchMfaDevices } = useStrandsMfa();
9202
9255
  const internalUser = vue.ref(null);
9203
9256
  const fetchingProfile = vue.ref(false);
9204
9257
  const currentUser = vue.computed(() => {
@@ -9276,6 +9329,54 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
9276
9329
  const years = Math.floor(diffDays / 365);
9277
9330
  return years === 1 ? "1 year ago" : `${years} years ago`;
9278
9331
  });
9332
+ const deviceTypeCounts = vue.computed(() => {
9333
+ const devices = activeMfaDevices.value || [];
9334
+ const counts = {
9335
+ totp: 0,
9336
+ email: 0,
9337
+ hardware: 0,
9338
+ passkey: 0
9339
+ };
9340
+ devices.forEach((device) => {
9341
+ if (device.device_type in counts) {
9342
+ counts[device.device_type]++;
9343
+ }
9344
+ });
9345
+ return counts;
9346
+ });
9347
+ const mfaDeviceChips = vue.computed(() => {
9348
+ const chips = [];
9349
+ const counts = deviceTypeCounts.value;
9350
+ if (counts.totp > 0) {
9351
+ chips.push({
9352
+ type: "totp",
9353
+ count: counts.totp,
9354
+ label: counts.totp === 1 ? "Auth app" : "Auth apps",
9355
+ icon: Smartphone,
9356
+ color: "bg-blue-50 text-blue-700 border-blue-200"
9357
+ });
9358
+ }
9359
+ if (counts.email > 0) {
9360
+ chips.push({
9361
+ type: "email",
9362
+ count: counts.email,
9363
+ label: "Email",
9364
+ icon: Mail,
9365
+ color: "bg-green-50 text-green-700 border-green-200"
9366
+ });
9367
+ }
9368
+ if (counts.hardware > 0 || counts.passkey > 0) {
9369
+ const totalHardware = counts.hardware + counts.passkey;
9370
+ chips.push({
9371
+ type: "hardware",
9372
+ count: totalHardware,
9373
+ label: totalHardware === 1 ? "Key" : "Keys",
9374
+ icon: KeyRound,
9375
+ color: "bg-purple-50 text-purple-700 border-purple-200"
9376
+ });
9377
+ }
9378
+ return chips;
9379
+ });
9279
9380
  const getInitials2 = (firstName, lastName) => {
9280
9381
  if (!firstName && !lastName) return "U";
9281
9382
  return `${firstName?.[0] || ""}${lastName?.[0] || ""}`.toUpperCase();
@@ -9285,6 +9386,9 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
9285
9386
  fetchingProfile.value = true;
9286
9387
  try {
9287
9388
  await fetchProfile();
9389
+ if (isAuthenticated.value) {
9390
+ await fetchMfaDevices();
9391
+ }
9288
9392
  } catch (err) {
9289
9393
  const errorMsg = err instanceof Error ? err.message : "Failed to load profile";
9290
9394
  errorMessage.value = errorMsg;
@@ -9499,6 +9603,7 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
9499
9603
  const handleMfaUpdated = async () => {
9500
9604
  try {
9501
9605
  await fetchProfile();
9606
+ await fetchMfaDevices();
9502
9607
  successMessage.value = "MFA settings updated successfully";
9503
9608
  emit("mfa-toggle", currentUser.value?.mfaEnabled || false);
9504
9609
  } catch (err) {
@@ -9536,7 +9641,7 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
9536
9641
  signingOut.value = false;
9537
9642
  }
9538
9643
  };
9539
- const __returned__ = { props, emit, getSupportEmail, strandsConfig, getUrl, fetchProfile, updateProfile, changeEmail, authUser, currentSession, isAuthenticated, refreshToken, signOut, internalUser, fetchingProfile, currentUser, loading: loading2, uploading, signingOut, showPasswordChange, showEmailChange, emailChangeLoading, showMfaModal, successMessage, errorMessage, activeSessions, fileInputRef, form, emailChangeForm, passwordForm, errors, hasChanges, isPasswordFormValid, isEmailChangeFormValid, passwordLastUpdated, getInitials: getInitials2, fetchUserProfile, clearMessages, handleUpdateProfile, handlePasswordChange, handleEmailChange, triggerFileUpload, handleFileSelect, uploadAvatar, handleMfaUpdated, handleCancel, handleSignOut, get StrandsUiButton() {
9644
+ const __returned__ = { props, emit, getSupportEmail, strandsConfig, getUrl, fetchProfile, updateProfile, changeEmail, authUser, currentSession, isAuthenticated, refreshToken, signOut, mfaDevices: mfaDevices2, mfaEnabled: mfaEnabled2, activeMfaDevices, fetchMfaDevices, internalUser, fetchingProfile, currentUser, loading: loading2, uploading, signingOut, showPasswordChange, showEmailChange, emailChangeLoading, showMfaModal, successMessage, errorMessage, activeSessions, fileInputRef, form, emailChangeForm, passwordForm, errors, hasChanges, isPasswordFormValid, isEmailChangeFormValid, passwordLastUpdated, deviceTypeCounts, mfaDeviceChips, getInitials: getInitials2, fetchUserProfile, clearMessages, handleUpdateProfile, handlePasswordChange, handleEmailChange, triggerFileUpload, handleFileSelect, uploadAvatar, handleMfaUpdated, handleCancel, handleSignOut, get StrandsUiButton() {
9540
9645
  return StrandsUiButton;
9541
9646
  }, get StrandsUiInput() {
9542
9647
  return StrandsUiInput;
@@ -9589,31 +9694,37 @@ const _hoisted_21 = {
9589
9694
  class: "space-y-3 overflow-hidden"
9590
9695
  };
9591
9696
  const _hoisted_22 = { class: "p-4 bg-gray-50 rounded-xl" };
9592
- const _hoisted_23 = { class: "flex items-center justify-between gap-2" };
9593
- const _hoisted_24 = { class: "text-sm text-gray-600" };
9594
- const _hoisted_25 = { class: "p-4 bg-gray-50 rounded-xl" };
9595
- const _hoisted_26 = { class: "flex items-center justify-between gap-2" };
9596
- const _hoisted_27 = { class: "text-sm text-gray-600" };
9597
- const _hoisted_28 = {
9697
+ const _hoisted_23 = { class: "flex items-start justify-between gap-4" };
9698
+ const _hoisted_24 = { class: "flex-1" };
9699
+ const _hoisted_25 = { class: "text-sm text-gray-600 mt-1" };
9700
+ const _hoisted_26 = {
9701
+ key: 0,
9702
+ class: "flex flex-wrap gap-2 mt-3"
9703
+ };
9704
+ const _hoisted_27 = { class: "ml-1" };
9705
+ const _hoisted_28 = { class: "p-4 bg-gray-50 rounded-xl" };
9706
+ const _hoisted_29 = { class: "flex items-center justify-between gap-2" };
9707
+ const _hoisted_30 = { class: "text-sm text-gray-600" };
9708
+ const _hoisted_31 = {
9598
9709
  key: 0,
9599
9710
  class: "flex flex-col sm:flex-row gap-3 pt-6 border-t border-gray-200 animate-slide-up"
9600
9711
  };
9601
- const _hoisted_29 = {
9712
+ const _hoisted_32 = {
9602
9713
  key: 0,
9603
9714
  class: "mt-6 animate-fade-in"
9604
9715
  };
9605
- const _hoisted_30 = { class: "alert-success" };
9606
- const _hoisted_31 = { class: "flex items-start gap-3" };
9607
- const _hoisted_32 = { class: "font-medium" };
9608
- const _hoisted_33 = {
9716
+ const _hoisted_33 = { class: "alert-success" };
9717
+ const _hoisted_34 = { class: "flex items-start gap-3" };
9718
+ const _hoisted_35 = { class: "font-medium" };
9719
+ const _hoisted_36 = {
9609
9720
  key: 1,
9610
9721
  class: "mt-6 animate-fade-in"
9611
9722
  };
9612
- const _hoisted_34 = { class: "alert-error" };
9613
- const _hoisted_35 = { class: "flex items-start gap-3" };
9614
- const _hoisted_36 = { class: "font-medium" };
9615
- const _hoisted_37 = { key: 0 };
9616
- const _hoisted_38 = { class: "text-gray-400 text-sm" };
9723
+ const _hoisted_37 = { class: "alert-error" };
9724
+ const _hoisted_38 = { class: "flex items-start gap-3" };
9725
+ const _hoisted_39 = { class: "font-medium" };
9726
+ const _hoisted_40 = { key: 0 };
9727
+ const _hoisted_41 = { class: "text-gray-400 text-sm" };
9617
9728
  function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
9618
9729
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$5, [
9619
9730
  vue.createElementVNode("div", _hoisted_2$4, [
@@ -9910,7 +10021,7 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
9910
10021
  vue.createCommentVNode(" Two-Factor Authentication "),
9911
10022
  vue.createElementVNode("div", _hoisted_22, [
9912
10023
  vue.createElementVNode("div", _hoisted_23, [
9913
- vue.createElementVNode("div", null, [
10024
+ vue.createElementVNode("div", _hoisted_24, [
9914
10025
  _cache[17] || (_cache[17] = vue.createElementVNode(
9915
10026
  "h4",
9916
10027
  { class: "font-medium text-gray-900" },
@@ -9920,16 +10031,60 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
9920
10031
  )),
9921
10032
  vue.createElementVNode(
9922
10033
  "p",
9923
- _hoisted_24,
10034
+ _hoisted_25,
9924
10035
  vue.toDisplayString($setup.currentUser?.mfaEnabled ? "Enabled" : "Add extra security to your account"),
9925
10036
  1
9926
10037
  /* TEXT */
9927
- )
10038
+ ),
10039
+ vue.createCommentVNode(" Device Type Chips "),
10040
+ $setup.mfaDeviceChips.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_26, [
10041
+ (vue.openBlock(true), vue.createElementBlock(
10042
+ vue.Fragment,
10043
+ null,
10044
+ vue.renderList($setup.mfaDeviceChips, (chip) => {
10045
+ return vue.openBlock(), vue.createElementBlock(
10046
+ "div",
10047
+ {
10048
+ key: chip.type,
10049
+ class: vue.normalizeClass([
10050
+ "inline-flex items-center px-2.5 py-1 rounded-lg text-xs font-medium border transition-colors",
10051
+ chip.color
10052
+ ])
10053
+ },
10054
+ [
10055
+ (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(chip.icon), {
10056
+ size: 12,
10057
+ class: "mr-1.5"
10058
+ })),
10059
+ vue.createElementVNode(
10060
+ "span",
10061
+ null,
10062
+ vue.toDisplayString(chip.count),
10063
+ 1
10064
+ /* TEXT */
10065
+ ),
10066
+ vue.createElementVNode(
10067
+ "span",
10068
+ _hoisted_27,
10069
+ vue.toDisplayString(chip.label),
10070
+ 1
10071
+ /* TEXT */
10072
+ )
10073
+ ],
10074
+ 2
10075
+ /* CLASS */
10076
+ );
10077
+ }),
10078
+ 128
10079
+ /* KEYED_FRAGMENT */
10080
+ ))
10081
+ ])) : vue.createCommentVNode("v-if", true)
9928
10082
  ]),
9929
10083
  vue.createVNode($setup["StrandsUiButton"], {
9930
10084
  variant: $setup.currentUser?.mfaEnabled ? "secondary" : "primary",
9931
10085
  size: "sm",
9932
- onClick: _cache[9] || (_cache[9] = ($event) => $setup.showMfaModal = true)
10086
+ onClick: _cache[9] || (_cache[9] = ($event) => $setup.showMfaModal = true),
10087
+ class: "flex-shrink-0"
9933
10088
  }, {
9934
10089
  default: vue.withCtx(() => [
9935
10090
  vue.createTextVNode(
@@ -9944,8 +10099,8 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
9944
10099
  ])
9945
10100
  ]),
9946
10101
  vue.createCommentVNode(" Active Sessions "),
9947
- vue.createElementVNode("div", _hoisted_25, [
9948
- vue.createElementVNode("div", _hoisted_26, [
10102
+ vue.createElementVNode("div", _hoisted_28, [
10103
+ vue.createElementVNode("div", _hoisted_29, [
9949
10104
  vue.createElementVNode("div", null, [
9950
10105
  _cache[18] || (_cache[18] = vue.createElementVNode(
9951
10106
  "h4",
@@ -9956,7 +10111,7 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
9956
10111
  )),
9957
10112
  vue.createElementVNode(
9958
10113
  "p",
9959
- _hoisted_27,
10114
+ _hoisted_30,
9960
10115
  vue.toDisplayString($setup.activeSessions.length) + " active device(s)",
9961
10116
  1
9962
10117
  /* TEXT */
@@ -9983,7 +10138,7 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
9983
10138
  ])
9984
10139
  ]),
9985
10140
  vue.createCommentVNode(" Action Buttons - Only show when changes are made "),
9986
- $setup.hasChanges ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_28, [
10141
+ $setup.hasChanges ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_31, [
9987
10142
  vue.createVNode($setup["StrandsUiButton"], {
9988
10143
  type: "submit",
9989
10144
  variant: "primary",
@@ -10021,9 +10176,9 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
10021
10176
  /* NEED_HYDRATION */
10022
10177
  ),
10023
10178
  vue.createCommentVNode(" Success/Error Messages "),
10024
- $setup.successMessage ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_29, [
10025
- vue.createElementVNode("div", _hoisted_30, [
10026
- vue.createElementVNode("div", _hoisted_31, [
10179
+ $setup.successMessage ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_32, [
10180
+ vue.createElementVNode("div", _hoisted_33, [
10181
+ vue.createElementVNode("div", _hoisted_34, [
10027
10182
  _cache[22] || (_cache[22] = vue.createElementVNode(
10028
10183
  "svg",
10029
10184
  {
@@ -10043,7 +10198,7 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
10043
10198
  )),
10044
10199
  vue.createElementVNode(
10045
10200
  "p",
10046
- _hoisted_32,
10201
+ _hoisted_35,
10047
10202
  vue.toDisplayString($setup.successMessage),
10048
10203
  1
10049
10204
  /* TEXT */
@@ -10051,9 +10206,9 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
10051
10206
  ])
10052
10207
  ])
10053
10208
  ])) : vue.createCommentVNode("v-if", true),
10054
- $setup.errorMessage ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_33, [
10055
- vue.createElementVNode("div", _hoisted_34, [
10056
- vue.createElementVNode("div", _hoisted_35, [
10209
+ $setup.errorMessage ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_36, [
10210
+ vue.createElementVNode("div", _hoisted_37, [
10211
+ vue.createElementVNode("div", _hoisted_38, [
10057
10212
  _cache[23] || (_cache[23] = vue.createElementVNode(
10058
10213
  "svg",
10059
10214
  {
@@ -10073,7 +10228,7 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
10073
10228
  )),
10074
10229
  vue.createElementVNode(
10075
10230
  "p",
10076
- _hoisted_36,
10231
+ _hoisted_39,
10077
10232
  vue.toDisplayString($setup.errorMessage),
10078
10233
  1
10079
10234
  /* TEXT */
@@ -10104,8 +10259,8 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
10104
10259
  /* STABLE */
10105
10260
  }, 8, ["disabled"]),
10106
10261
  vue.createCommentVNode(" Need help "),
10107
- $setup.getSupportEmail() ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_37, [
10108
- vue.createElementVNode("p", _hoisted_38, [
10262
+ $setup.getSupportEmail() ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_40, [
10263
+ vue.createElementVNode("p", _hoisted_41, [
10109
10264
  _cache[25] || (_cache[25] = vue.createTextVNode(
10110
10265
  " Need help? ",
10111
10266
  -1