@strands.gg/accui 1.1.4 → 1.2.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.
@@ -1475,37 +1475,37 @@ const _hoisted_14$9 = { class: "flex items-center space-x-3" };
1475
1475
  const _hoisted_15$9 = { class: "text-2xl" };
1476
1476
  const _hoisted_16$8 = { class: "font-medium text-gray-900" };
1477
1477
  const _hoisted_17$7 = { class: "text-sm text-gray-500" };
1478
- const _hoisted_18$5 = {
1478
+ const _hoisted_18$6 = {
1479
1479
  key: 2,
1480
1480
  class: "text-center"
1481
1481
  };
1482
- const _hoisted_19$3 = {
1482
+ const _hoisted_19$5 = {
1483
1483
  key: 3,
1484
1484
  class: "text-center space-y-4"
1485
1485
  };
1486
- const _hoisted_20$2 = {
1486
+ const _hoisted_20$3 = {
1487
1487
  key: 4,
1488
1488
  class: "space-y-4"
1489
1489
  };
1490
- const _hoisted_21$2 = {
1490
+ const _hoisted_21$3 = {
1491
1491
  key: 0,
1492
1492
  class: "bg-green-50 border border-green-200 rounded-lg p-4"
1493
1493
  };
1494
- const _hoisted_22$2 = {
1494
+ const _hoisted_22$3 = {
1495
1495
  key: 1,
1496
1496
  class: "text-sm text-gray-600"
1497
1497
  };
1498
- const _hoisted_23$1 = {
1498
+ const _hoisted_23$2 = {
1499
1499
  key: 2,
1500
1500
  class: "flex justify-between text-sm"
1501
1501
  };
1502
- const _hoisted_24$1 = ["disabled"];
1503
- const _hoisted_25$1 = { class: "pt-4 border-t border-gray-200" };
1504
- const _hoisted_26$1 = {
1502
+ const _hoisted_24$2 = ["disabled"];
1503
+ const _hoisted_25$2 = { class: "pt-4 border-t border-gray-200" };
1504
+ const _hoisted_26$2 = {
1505
1505
  key: 3,
1506
1506
  class: "space-y-4"
1507
1507
  };
1508
- const _hoisted_27$1 = { class: "flex justify-between" };
1508
+ const _hoisted_27$2 = { class: "flex justify-between" };
1509
1509
  function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
1510
1510
  return openBlock(), createBlock($setup["UiModal"], {
1511
1511
  open: $props.show,
@@ -1524,7 +1524,7 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
1524
1524
  )
1525
1525
  ])),
1526
1526
  footer: withCtx(() => [
1527
- createElementVNode("div", _hoisted_27$1, [
1527
+ createElementVNode("div", _hoisted_27$2, [
1528
1528
  createVNode($setup["StrandsUiButton"], {
1529
1529
  variant: "secondary",
1530
1530
  onClick: $setup.closeModal,
@@ -1683,7 +1683,7 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
1683
1683
  /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
1684
1684
  )) : createCommentVNode("v-if", true),
1685
1685
  createCommentVNode(" Email MFA Code Request "),
1686
- $setup.selectedMethod?.device_type === "email" && !$setup.emailCodeSent ? (openBlock(), createElementBlock("div", _hoisted_18$5, [
1686
+ $setup.selectedMethod?.device_type === "email" && !$setup.emailCodeSent ? (openBlock(), createElementBlock("div", _hoisted_18$6, [
1687
1687
  _cache[8] || (_cache[8] = createElementVNode(
1688
1688
  "p",
1689
1689
  { class: "text-sm text-gray-600 mb-4" },
@@ -1709,7 +1709,7 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
1709
1709
  }, 8, ["disabled", "loading"])
1710
1710
  ])) : createCommentVNode("v-if", true),
1711
1711
  createCommentVNode(" Hardware Key Authentication "),
1712
- $setup.selectedMethod?.device_type === "hardware" ? (openBlock(), createElementBlock("div", _hoisted_19$3, [
1712
+ $setup.selectedMethod?.device_type === "hardware" ? (openBlock(), createElementBlock("div", _hoisted_19$5, [
1713
1713
  _cache[10] || (_cache[10] = createElementVNode(
1714
1714
  "div",
1715
1715
  { class: "bg-blue-50 border border-blue-200 rounded-lg p-4" },
@@ -1757,9 +1757,9 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
1757
1757
  }, 8, ["disabled", "loading"])
1758
1758
  ])) : createCommentVNode("v-if", true),
1759
1759
  createCommentVNode(" Code Input "),
1760
- $setup.selectedMethod && $setup.selectedMethod.device_type !== "hardware" && ($setup.selectedMethod.device_type !== "email" || $setup.emailCodeSent) ? (openBlock(), createElementBlock("div", _hoisted_20$2, [
1760
+ $setup.selectedMethod && $setup.selectedMethod.device_type !== "hardware" && ($setup.selectedMethod.device_type !== "email" || $setup.emailCodeSent) ? (openBlock(), createElementBlock("div", _hoisted_20$3, [
1761
1761
  createCommentVNode(" Email confirmation "),
1762
- $setup.selectedMethod.device_type === "email" && $setup.emailCodeSent ? (openBlock(), createElementBlock("div", _hoisted_21$2, _cache[11] || (_cache[11] = [
1762
+ $setup.selectedMethod.device_type === "email" && $setup.emailCodeSent ? (openBlock(), createElementBlock("div", _hoisted_21$3, _cache[11] || (_cache[11] = [
1763
1763
  createElementVNode(
1764
1764
  "div",
1765
1765
  { class: "flex items-start space-x-2" },
@@ -1800,28 +1800,28 @@ function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
1800
1800
  createCommentVNode(" TOTP Help "),
1801
1801
  $setup.selectedMethod.device_type === "totp" ? (openBlock(), createElementBlock(
1802
1802
  "div",
1803
- _hoisted_22$2,
1803
+ _hoisted_22$3,
1804
1804
  ' Open your authenticator app and enter the 6-digit code for "' + toDisplayString($setup.selectedMethod.device_name) + '" ',
1805
1805
  1
1806
1806
  /* TEXT */
1807
1807
  )) : createCommentVNode("v-if", true),
1808
1808
  createCommentVNode(" Email Resend "),
1809
- $setup.selectedMethod.device_type === "email" ? (openBlock(), createElementBlock("div", _hoisted_23$1, [
1809
+ $setup.selectedMethod.device_type === "email" ? (openBlock(), createElementBlock("div", _hoisted_23$2, [
1810
1810
  createElementVNode("button", {
1811
1811
  onClick: $setup.sendEmailCode,
1812
1812
  disabled: $setup.loading || $setup.cooldownActive,
1813
1813
  class: "text-strands-600 hover:text-strands-800 disabled:text-gray-400 disabled:cursor-not-allowed"
1814
- }, toDisplayString($setup.cooldownActive ? `Resend in ${$setup.cooldownSeconds}s` : "Resend Code"), 9, _hoisted_24$1)
1814
+ }, toDisplayString($setup.cooldownActive ? `Resend in ${$setup.cooldownSeconds}s` : "Resend Code"), 9, _hoisted_24$2)
1815
1815
  ])) : createCommentVNode("v-if", true),
1816
1816
  createCommentVNode(" Backup Codes Option "),
1817
- createElementVNode("div", _hoisted_25$1, [
1817
+ createElementVNode("div", _hoisted_25$2, [
1818
1818
  createElementVNode("button", {
1819
1819
  onClick: _cache[1] || (_cache[1] = ($event) => $setup.showBackupCodeInput = !$setup.showBackupCodeInput),
1820
1820
  class: "text-sm text-gray-600 hover:text-gray-800 underline"
1821
1821
  }, " Use backup code instead ")
1822
1822
  ]),
1823
1823
  createCommentVNode(" Backup Code Input "),
1824
- $setup.showBackupCodeInput ? (openBlock(), createElementBlock("div", _hoisted_26$1, [
1824
+ $setup.showBackupCodeInput ? (openBlock(), createElementBlock("div", _hoisted_26$2, [
1825
1825
  createVNode($setup["StrandsUiInput"], {
1826
1826
  modelValue: $setup.backupCode,
1827
1827
  "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $setup.backupCode = $event),
@@ -3244,11 +3244,11 @@ const _hoisted_15$6 = {
3244
3244
  };
3245
3245
  const _hoisted_16$5 = { class: "alert-error" };
3246
3246
  const _hoisted_17$5 = { class: "flex items-start gap-3" };
3247
- const _hoisted_18$4 = { class: "font-medium" };
3248
- const _hoisted_19$2 = { class: "mt-8 text-center" };
3249
- const _hoisted_20$1 = { class: "text-sm text-neutral-600" };
3250
- const _hoisted_21$1 = { key: 0 };
3251
- const _hoisted_22$1 = { class: "text-neutral-400 text-sm" };
3247
+ const _hoisted_18$5 = { class: "font-medium" };
3248
+ const _hoisted_19$4 = { class: "mt-8 text-center" };
3249
+ const _hoisted_20$2 = { class: "text-sm text-neutral-600" };
3250
+ const _hoisted_21$2 = { key: 0 };
3251
+ const _hoisted_22$2 = { class: "text-neutral-400 text-sm" };
3252
3252
  function _sfc_render$f(_ctx, _cache, $props, $setup, $data, $options) {
3253
3253
  return openBlock(), createElementBlock("div", _hoisted_1$d, [
3254
3254
  createCommentVNode(" Success State "),
@@ -3501,7 +3501,7 @@ function _sfc_render$f(_ctx, _cache, $props, $setup, $data, $options) {
3501
3501
  )),
3502
3502
  createElementVNode(
3503
3503
  "p",
3504
- _hoisted_18$4,
3504
+ _hoisted_18$5,
3505
3505
  toDisplayString($setup.error),
3506
3506
  1
3507
3507
  /* TEXT */
@@ -3510,8 +3510,8 @@ function _sfc_render$f(_ctx, _cache, $props, $setup, $data, $options) {
3510
3510
  ])
3511
3511
  ])) : createCommentVNode("v-if", true),
3512
3512
  createCommentVNode(" Sign in link "),
3513
- createElementVNode("div", _hoisted_19$2, [
3514
- createElementVNode("p", _hoisted_20$1, [
3513
+ createElementVNode("div", _hoisted_19$4, [
3514
+ createElementVNode("p", _hoisted_20$2, [
3515
3515
  _cache[10] || (_cache[10] = createTextVNode(
3516
3516
  " Already have an account? ",
3517
3517
  -1
@@ -3530,8 +3530,8 @@ function _sfc_render$f(_ctx, _cache, $props, $setup, $data, $options) {
3530
3530
  }, {
3531
3531
  default: withCtx(() => [
3532
3532
  createCommentVNode(" Need help "),
3533
- $setup.getSupportEmail() ? (openBlock(), createElementBlock("div", _hoisted_21$1, [
3534
- createElementVNode("p", _hoisted_22$1, [
3533
+ $setup.getSupportEmail() ? (openBlock(), createElementBlock("div", _hoisted_21$2, [
3534
+ createElementVNode("p", _hoisted_22$2, [
3535
3535
  _cache[12] || (_cache[12] = createTextVNode(
3536
3536
  " Need help? ",
3537
3537
  -1
@@ -4121,6 +4121,173 @@ function _sfc_render$e(_ctx, _cache, $props, $setup, $data, $options) {
4121
4121
  );
4122
4122
  }
4123
4123
  const StrandsCompleteSignUp = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["render", _sfc_render$e], ["__file", "/home/runner/work/strands-accounts/strands-accounts/apps/accounts-ui/src/vue/components/StrandsCompleteSignUp.vue"]]);
4124
+ /**
4125
+ * @license lucide-vue-next v0.539.0 - ISC
4126
+ *
4127
+ * This source code is licensed under the ISC license.
4128
+ * See the LICENSE file in the root directory of this source tree.
4129
+ */
4130
+ const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
4131
+ const toCamelCase = (string) => string.replace(
4132
+ /^([A-Z])|[\s-_]+(\w)/g,
4133
+ (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()
4134
+ );
4135
+ const toPascalCase = (string) => {
4136
+ const camelCase = toCamelCase(string);
4137
+ return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
4138
+ };
4139
+ const mergeClasses = (...classes) => classes.filter((className, index, array) => {
4140
+ return Boolean(className) && className.trim() !== "" && array.indexOf(className) === index;
4141
+ }).join(" ").trim();
4142
+ const isEmptyString = (value) => value === "";
4143
+ /**
4144
+ * @license lucide-vue-next v0.539.0 - ISC
4145
+ *
4146
+ * This source code is licensed under the ISC license.
4147
+ * See the LICENSE file in the root directory of this source tree.
4148
+ */
4149
+ var defaultAttributes = {
4150
+ xmlns: "http://www.w3.org/2000/svg",
4151
+ width: 24,
4152
+ height: 24,
4153
+ viewBox: "0 0 24 24",
4154
+ fill: "none",
4155
+ stroke: "currentColor",
4156
+ "stroke-width": 2,
4157
+ "stroke-linecap": "round",
4158
+ "stroke-linejoin": "round"
4159
+ };
4160
+ /**
4161
+ * @license lucide-vue-next v0.539.0 - ISC
4162
+ *
4163
+ * This source code is licensed under the ISC license.
4164
+ * See the LICENSE file in the root directory of this source tree.
4165
+ */
4166
+ const Icon = ({
4167
+ name,
4168
+ iconNode,
4169
+ absoluteStrokeWidth,
4170
+ "absolute-stroke-width": absoluteStrokeWidthKebabCase,
4171
+ strokeWidth,
4172
+ "stroke-width": strokeWidthKebabCase,
4173
+ size = defaultAttributes.width,
4174
+ color = defaultAttributes.stroke,
4175
+ ...props
4176
+ }, { slots }) => {
4177
+ return h(
4178
+ "svg",
4179
+ {
4180
+ ...defaultAttributes,
4181
+ ...props,
4182
+ width: size,
4183
+ height: size,
4184
+ stroke: color,
4185
+ "stroke-width": isEmptyString(absoluteStrokeWidth) || isEmptyString(absoluteStrokeWidthKebabCase) || absoluteStrokeWidth === true || absoluteStrokeWidthKebabCase === true ? Number(strokeWidth || strokeWidthKebabCase || defaultAttributes["stroke-width"]) * 24 / Number(size) : strokeWidth || strokeWidthKebabCase || defaultAttributes["stroke-width"],
4186
+ class: mergeClasses(
4187
+ "lucide",
4188
+ props.class,
4189
+ ...name ? [`lucide-${toKebabCase(toPascalCase(name))}-icon`, `lucide-${toKebabCase(name)}`] : ["lucide-icon"]
4190
+ )
4191
+ },
4192
+ [...iconNode.map((child) => h(...child)), ...slots.default ? [slots.default()] : []]
4193
+ );
4194
+ };
4195
+ /**
4196
+ * @license lucide-vue-next v0.539.0 - ISC
4197
+ *
4198
+ * This source code is licensed under the ISC license.
4199
+ * See the LICENSE file in the root directory of this source tree.
4200
+ */
4201
+ const createLucideIcon = (iconName, iconNode) => (props, { slots, attrs }) => h(
4202
+ Icon,
4203
+ {
4204
+ ...attrs,
4205
+ ...props,
4206
+ iconNode,
4207
+ name: iconName
4208
+ },
4209
+ slots
4210
+ );
4211
+ /**
4212
+ * @license lucide-vue-next v0.539.0 - ISC
4213
+ *
4214
+ * This source code is licensed under the ISC license.
4215
+ * See the LICENSE file in the root directory of this source tree.
4216
+ */
4217
+ const KeyRound = createLucideIcon("key-round", [
4218
+ [
4219
+ "path",
4220
+ {
4221
+ d: "M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",
4222
+ key: "1s6t7t"
4223
+ }
4224
+ ],
4225
+ ["circle", { cx: "16.5", cy: "7.5", r: ".5", fill: "currentColor", key: "w0ekpg" }]
4226
+ ]);
4227
+ /**
4228
+ * @license lucide-vue-next v0.539.0 - ISC
4229
+ *
4230
+ * This source code is licensed under the ISC license.
4231
+ * See the LICENSE file in the root directory of this source tree.
4232
+ */
4233
+ const Mail = createLucideIcon("mail", [
4234
+ ["path", { d: "m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7", key: "132q7q" }],
4235
+ ["rect", { x: "2", y: "4", width: "20", height: "16", rx: "2", key: "izxlao" }]
4236
+ ]);
4237
+ /**
4238
+ * @license lucide-vue-next v0.539.0 - ISC
4239
+ *
4240
+ * This source code is licensed under the ISC license.
4241
+ * See the LICENSE file in the root directory of this source tree.
4242
+ */
4243
+ const Settings = createLucideIcon("settings", [
4244
+ [
4245
+ "path",
4246
+ {
4247
+ d: "M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",
4248
+ key: "1i5ecw"
4249
+ }
4250
+ ],
4251
+ ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
4252
+ ]);
4253
+ /**
4254
+ * @license lucide-vue-next v0.539.0 - ISC
4255
+ *
4256
+ * This source code is licensed under the ISC license.
4257
+ * See the LICENSE file in the root directory of this source tree.
4258
+ */
4259
+ const Shield = createLucideIcon("shield", [
4260
+ [
4261
+ "path",
4262
+ {
4263
+ d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",
4264
+ key: "oel41y"
4265
+ }
4266
+ ]
4267
+ ]);
4268
+ /**
4269
+ * @license lucide-vue-next v0.539.0 - ISC
4270
+ *
4271
+ * This source code is licensed under the ISC license.
4272
+ * See the LICENSE file in the root directory of this source tree.
4273
+ */
4274
+ const Smartphone = createLucideIcon("smartphone", [
4275
+ ["rect", { width: "14", height: "20", x: "5", y: "2", rx: "2", ry: "2", key: "1yt0o3" }],
4276
+ ["path", { d: "M12 18h.01", key: "mhygvu" }]
4277
+ ]);
4278
+ /**
4279
+ * @license lucide-vue-next v0.539.0 - ISC
4280
+ *
4281
+ * This source code is licensed under the ISC license.
4282
+ * See the LICENSE file in the root directory of this source tree.
4283
+ */
4284
+ const Trash2 = createLucideIcon("trash-2", [
4285
+ ["path", { d: "M10 11v6", key: "nco0om" }],
4286
+ ["path", { d: "M14 11v6", key: "outv1u" }],
4287
+ ["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
4288
+ ["path", { d: "M3 6h18", key: "d0wm0j" }],
4289
+ ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
4290
+ ]);
4124
4291
  function getDefaultExportFromCjs(x) {
4125
4292
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
4126
4293
  }
@@ -6391,8 +6558,8 @@ const _hoisted_14$5 = {
6391
6558
  const _hoisted_15$5 = { class: "bg-red-50 border border-red-200 rounded-lg p-4" };
6392
6559
  const _hoisted_16$4 = { class: "bg-white rounded border p-3" };
6393
6560
  const _hoisted_17$4 = { class: "grid grid-cols-2 gap-2 text-sm font-mono text-gray-900" };
6394
- const _hoisted_18$3 = { class: "flex justify-center mt-3" };
6395
- const _hoisted_19$1 = { class: "flex justify-end pt-4" };
6561
+ const _hoisted_18$4 = { class: "flex justify-center mt-3" };
6562
+ const _hoisted_19$3 = { class: "flex justify-end pt-4" };
6396
6563
  function _sfc_render$d(_ctx, _cache, $props, $setup, $data, $options) {
6397
6564
  return openBlock(), createBlock($setup["UiModal"], {
6398
6565
  open: $props.show,
@@ -6715,7 +6882,7 @@ function _sfc_render$d(_ctx, _cache, $props, $setup, $data, $options) {
6715
6882
  ))
6716
6883
  ])
6717
6884
  ]),
6718
- createElementVNode("div", _hoisted_18$3, [
6885
+ createElementVNode("div", _hoisted_18$4, [
6719
6886
  createVNode($setup["StrandsUiButton"], {
6720
6887
  variant: "secondary",
6721
6888
  size: "sm",
@@ -6733,7 +6900,7 @@ function _sfc_render$d(_ctx, _cache, $props, $setup, $data, $options) {
6733
6900
  })
6734
6901
  ])
6735
6902
  ]),
6736
- createElementVNode("div", _hoisted_19$1, [
6903
+ createElementVNode("div", _hoisted_19$3, [
6737
6904
  createVNode($setup["StrandsUiButton"], {
6738
6905
  variant: "primary",
6739
6906
  onClick: $setup.finish
@@ -7425,7 +7592,7 @@ const _hoisted_15$4 = {
7425
7592
  };
7426
7593
  const _hoisted_16$3 = { class: "text-center" };
7427
7594
  const _hoisted_17$3 = { class: "text-sm text-gray-600 mb-6" };
7428
- const _hoisted_18$2 = { class: "flex justify-end space-x-3 pt-4" };
7595
+ const _hoisted_18$3 = { class: "flex justify-end space-x-3 pt-4" };
7429
7596
  function _sfc_render$b(_ctx, _cache, $props, $setup, $data, $options) {
7430
7597
  return openBlock(), createBlock($setup["UiModal"], {
7431
7598
  open: $props.show,
@@ -7823,7 +7990,7 @@ function _sfc_render$b(_ctx, _cache, $props, $setup, $data, $options) {
7823
7990
  /* TEXT */
7824
7991
  )
7825
7992
  ]),
7826
- createElementVNode("div", _hoisted_18$2, [
7993
+ createElementVNode("div", _hoisted_18$3, [
7827
7994
  createVNode($setup["StrandsUiButton"], {
7828
7995
  variant: "secondary",
7829
7996
  onClick: _cache[2] || (_cache[2] = ($event) => $setup.step = 1)
@@ -8385,6 +8552,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
8385
8552
  formatLastUsed
8386
8553
  } = useStrandsMfa();
8387
8554
  const showModal = computed(() => props.show);
8555
+ const activeTab = ref("add");
8388
8556
  const showTotpSetup = ref(false);
8389
8557
  const showEmailMfaSetup = ref(false);
8390
8558
  const showHardwareKeySetup = ref(false);
@@ -8444,16 +8612,19 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
8444
8612
  const handleTotpSetupSuccess = async () => {
8445
8613
  showTotpSetup.value = false;
8446
8614
  await fetchMfaDevices();
8615
+ activeTab.value = "manage";
8447
8616
  emit("mfa-updated");
8448
8617
  };
8449
8618
  const handleEmailMfaSetupSuccess = async () => {
8450
8619
  showEmailMfaSetup.value = false;
8451
8620
  await fetchMfaDevices();
8621
+ activeTab.value = "manage";
8452
8622
  emit("mfa-updated");
8453
8623
  };
8454
8624
  const handleHardwareKeySetupSuccess = async () => {
8455
8625
  showHardwareKeySetup.value = false;
8456
8626
  await fetchMfaDevices();
8627
+ activeTab.value = "manage";
8457
8628
  emit("mfa-updated");
8458
8629
  };
8459
8630
  const getDeviceIconBackground = (deviceType) => {
@@ -8469,10 +8640,33 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
8469
8640
  return "bg-gray-50 group-hover:bg-gray-100";
8470
8641
  }
8471
8642
  };
8472
- const __returned__ = { props, emit, mfaDevices: mfaDevices2, mfaEnabled: mfaEnabled2, mfaLoading, activeMfaDevices, fetchMfaDevices, disableMfaDevice, sendEmailMfaCode, getDeviceTypeIcon, getDeviceTypeName, formatLastUsed, showModal, showTotpSetup, showEmailMfaSetup, showHardwareKeySetup, showBackupCodesModal, showConfirmDisable, selectedDevice, closeModal, startTotpSetup, startEmailMfaSetup, startHardwareKeySetup, showBackupCodes, testEmailMfa, confirmDisableDevice, handleDisableDevice, handleTotpSetupSuccess, handleEmailMfaSetupSuccess, handleHardwareKeySetupSuccess, getDeviceIconBackground, get StrandsUiButton() {
8643
+ const getDeviceIconComponent = (deviceType) => {
8644
+ switch (deviceType) {
8645
+ case "totp":
8646
+ return Smartphone;
8647
+ case "email":
8648
+ return Mail;
8649
+ case "hardware":
8650
+ case "passkey":
8651
+ return KeyRound;
8652
+ default:
8653
+ return Shield;
8654
+ }
8655
+ };
8656
+ const __returned__ = { props, emit, mfaDevices: mfaDevices2, mfaEnabled: mfaEnabled2, mfaLoading, activeMfaDevices, fetchMfaDevices, disableMfaDevice, sendEmailMfaCode, getDeviceTypeIcon, getDeviceTypeName, formatLastUsed, showModal, activeTab, showTotpSetup, showEmailMfaSetup, showHardwareKeySetup, showBackupCodesModal, showConfirmDisable, selectedDevice, closeModal, startTotpSetup, startEmailMfaSetup, startHardwareKeySetup, showBackupCodes, testEmailMfa, confirmDisableDevice, handleDisableDevice, handleTotpSetupSuccess, handleEmailMfaSetupSuccess, handleHardwareKeySetupSuccess, getDeviceIconBackground, getDeviceIconComponent, get StrandsUiButton() {
8473
8657
  return StrandsUiButton;
8474
8658
  }, get StrandsUiLoader() {
8475
8659
  return StrandsUiLoader;
8660
+ }, get Smartphone() {
8661
+ return Smartphone;
8662
+ }, get Mail() {
8663
+ return Mail;
8664
+ }, get KeyRound() {
8665
+ return KeyRound;
8666
+ }, get Shield() {
8667
+ return Shield;
8668
+ }, get Trash2() {
8669
+ return Trash2;
8476
8670
  }, UiModal, StrandsTotpSetupModal, StrandsEmailMfaSetupModal, StrandsHardwareKeySetupModal, StrandsBackupCodesModal, StrandsConfirmModal };
8477
8671
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
8478
8672
  return __returned__;
@@ -8495,15 +8689,34 @@ const _hoisted_8$2 = {
8495
8689
  key: 1,
8496
8690
  class: "inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-gray-100 text-gray-600"
8497
8691
  };
8498
- const _hoisted_9$2 = { key: 0 };
8499
- const _hoisted_10$2 = { class: "space-y-3" };
8500
- const _hoisted_11$2 = { class: "flex items-center space-x-3" };
8501
- const _hoisted_12$2 = { class: "text-xl" };
8502
- const _hoisted_13$2 = { class: "min-w-0 flex-1" };
8503
- const _hoisted_14$2 = { class: "font-medium text-gray-900 text-sm" };
8504
- const _hoisted_15$2 = { class: "text-xs text-gray-500 mt-0.5" };
8505
- const _hoisted_16$2 = { class: "flex items-center space-x-2" };
8506
- const _hoisted_17$2 = { class: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4" };
8692
+ const _hoisted_9$2 = { class: "border-b border-gray-200" };
8693
+ const _hoisted_10$2 = {
8694
+ class: "-mb-px flex space-x-8",
8695
+ "aria-label": "Tabs"
8696
+ };
8697
+ const _hoisted_11$2 = {
8698
+ key: 0,
8699
+ class: "space-y-6"
8700
+ };
8701
+ const _hoisted_12$2 = { class: "space-y-4" };
8702
+ const _hoisted_13$2 = { class: "flex items-center justify-between" };
8703
+ const _hoisted_14$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" };
8704
+ const _hoisted_15$2 = { class: "flex flex-col space-y-2 ml-4" };
8705
+ const _hoisted_16$2 = { class: "flex items-center justify-between" };
8706
+ 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" };
8707
+ const _hoisted_18$2 = { class: "flex flex-col space-y-2 ml-4" };
8708
+ const _hoisted_19$2 = { class: "flex items-center justify-between" };
8709
+ 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" };
8710
+ const _hoisted_21$1 = { class: "flex flex-col space-y-2 ml-4" };
8711
+ const _hoisted_22$1 = { class: "space-y-6" };
8712
+ const _hoisted_23$1 = { class: "max-h-96 overflow-y-auto space-y-4 pr-2" };
8713
+ const _hoisted_24$1 = { class: "flex items-start justify-between" };
8714
+ const _hoisted_25$1 = { class: "flex items-start space-x-4" };
8715
+ const _hoisted_26$1 = { class: "min-w-0 flex-1" };
8716
+ const _hoisted_27$1 = { class: "font-semibold text-gray-900 text-lg" };
8717
+ const _hoisted_28$1 = { class: "text-sm text-gray-600 mt-1" };
8718
+ const _hoisted_29$1 = { class: "text-xs text-gray-500 mt-2" };
8719
+ const _hoisted_30$1 = { class: "flex flex-col space-y-2 ml-4" };
8507
8720
  function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
8508
8721
  return openBlock(), createElementBlock(
8509
8722
  Fragment,
@@ -8512,11 +8725,11 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
8512
8725
  createVNode($setup["UiModal"], {
8513
8726
  open: $setup.showModal,
8514
8727
  onClose: $setup.closeModal,
8515
- "card-class": "max-w-lg"
8728
+ "card-class": "max-w-4xl"
8516
8729
  }, {
8517
8730
  header: withCtx(() => [
8518
8731
  createElementVNode("div", { class: "flex items-center justify-between" }, [
8519
- _cache[6] || (_cache[6] = createElementVNode(
8732
+ _cache[8] || (_cache[8] = createElementVNode(
8520
8733
  "h2",
8521
8734
  { class: "text-2xl font-bold text-gray-900" },
8522
8735
  "Two-Factor Authentication",
@@ -8526,7 +8739,7 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
8526
8739
  createElementVNode("button", {
8527
8740
  onClick: $setup.closeModal,
8528
8741
  class: "text-gray-400 hover:text-gray-600 transition-colors duration-200"
8529
- }, _cache[5] || (_cache[5] = [
8742
+ }, _cache[7] || (_cache[7] = [
8530
8743
  createElementVNode(
8531
8744
  "svg",
8532
8745
  {
@@ -8552,7 +8765,7 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
8552
8765
  default: withCtx(() => [
8553
8766
  $setup.mfaLoading ? (openBlock(), createElementBlock("div", _hoisted_1$6, [
8554
8767
  createVNode($setup["StrandsUiLoader"], { size: 32 }),
8555
- _cache[7] || (_cache[7] = createElementVNode(
8768
+ _cache[9] || (_cache[9] = createElementVNode(
8556
8769
  "span",
8557
8770
  { class: "ml-3 text-gray-600" },
8558
8771
  "Loading MFA settings...",
@@ -8563,13 +8776,13 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
8563
8776
  Fragment,
8564
8777
  { key: 1 },
8565
8778
  [
8566
- createCommentVNode(" Content when loaded "),
8779
+ createCommentVNode(" Tab Navigation "),
8567
8780
  createElementVNode("div", _hoisted_2$5, [
8568
8781
  createCommentVNode(" MFA Status Overview "),
8569
8782
  createElementVNode("div", _hoisted_3$5, [
8570
8783
  createElementVNode("div", _hoisted_4$4, [
8571
8784
  createElementVNode("div", null, [
8572
- _cache[8] || (_cache[8] = createElementVNode(
8785
+ _cache[10] || (_cache[10] = createElementVNode(
8573
8786
  "h3",
8574
8787
  { class: "font-semibold text-gray-900" },
8575
8788
  "Two-Factor Authentication",
@@ -8585,251 +8798,341 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
8585
8798
  )
8586
8799
  ]),
8587
8800
  createElementVNode("div", _hoisted_6$2, [
8588
- $setup.mfaEnabled ? (openBlock(), createElementBlock("span", _hoisted_7$2, " ✓ Enabled ")) : (openBlock(), createElementBlock("span", _hoisted_8$2, " Not Enabled "))
8801
+ $setup.mfaEnabled ? (openBlock(), createElementBlock("span", _hoisted_7$2, [
8802
+ createVNode($setup["Shield"], {
8803
+ size: 12,
8804
+ class: "mr-1"
8805
+ }),
8806
+ _cache[11] || (_cache[11] = createTextVNode(
8807
+ " Enabled ",
8808
+ -1
8809
+ /* CACHED */
8810
+ ))
8811
+ ])) : (openBlock(), createElementBlock("span", _hoisted_8$2, " Not Enabled "))
8589
8812
  ])
8590
8813
  ])
8591
8814
  ]),
8592
- createCommentVNode(" Active Devices "),
8593
- $setup.activeMfaDevices.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_9$2, [
8594
- _cache[12] || (_cache[12] = createElementVNode(
8595
- "h3",
8596
- { class: "text-lg font-semibold text-gray-900 mb-4" },
8597
- "Active Devices",
8598
- -1
8599
- /* CACHED */
8600
- )),
8601
- createElementVNode("div", _hoisted_10$2, [
8602
- (openBlock(true), createElementBlock(
8603
- Fragment,
8604
- null,
8605
- renderList($setup.activeMfaDevices, (device) => {
8606
- return openBlock(), createElementBlock("div", {
8607
- key: device.id,
8608
- class: "group flex items-center justify-between p-4 bg-white border border-gray-200 rounded-lg hover:border-gray-300 hover:shadow-md transition-all duration-200"
8609
- }, [
8610
- createElementVNode("div", _hoisted_11$2, [
8611
- createElementVNode(
8612
- "div",
8613
- {
8614
- class: normalizeClass(["flex-shrink-0 w-10 h-10 rounded-lg flex items-center justify-center", $setup.getDeviceIconBackground(device.device_type)])
8615
- },
8616
- [
8617
- createElementVNode(
8618
- "span",
8619
- _hoisted_12$2,
8620
- toDisplayString($setup.getDeviceTypeIcon(device.device_type)),
8621
- 1
8622
- /* TEXT */
8623
- )
8624
- ],
8625
- 2
8626
- /* CLASS */
8627
- ),
8628
- createElementVNode("div", _hoisted_13$2, [
8629
- createElementVNode(
8630
- "h4",
8631
- _hoisted_14$2,
8632
- toDisplayString(device.device_name),
8633
- 1
8634
- /* TEXT */
8635
- ),
8636
- createElementVNode(
8637
- "p",
8638
- _hoisted_15$2,
8639
- toDisplayString($setup.getDeviceTypeName(device.device_type)) + " • Last used " + toDisplayString($setup.formatLastUsed(device.last_used_at)),
8640
- 1
8641
- /* TEXT */
8642
- )
8643
- ])
8815
+ createCommentVNode(" Tab Navigation "),
8816
+ createElementVNode("div", _hoisted_9$2, [
8817
+ createElementVNode("nav", _hoisted_10$2, [
8818
+ createElementVNode(
8819
+ "button",
8820
+ {
8821
+ onClick: _cache[0] || (_cache[0] = ($event) => $setup.activeTab = "add"),
8822
+ class: normalizeClass([
8823
+ $setup.activeTab === "add" ? "border-[var(--strands-primary)] text-[var(--strands-primary)]" : "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300",
8824
+ "whitespace-nowrap py-2 px-1 border-b-2 font-medium text-sm transition-colors"
8825
+ ])
8826
+ },
8827
+ " Add New Device ",
8828
+ 2
8829
+ /* CLASS */
8830
+ ),
8831
+ $setup.activeMfaDevices.length > 0 ? (openBlock(), createElementBlock(
8832
+ "button",
8833
+ {
8834
+ key: 0,
8835
+ onClick: _cache[1] || (_cache[1] = ($event) => $setup.activeTab = "manage"),
8836
+ class: normalizeClass([
8837
+ $setup.activeTab === "manage" ? "border-[var(--strands-primary)] text-[var(--strands-primary)]" : "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300",
8838
+ "whitespace-nowrap py-2 px-1 border-b-2 font-medium text-sm transition-colors"
8839
+ ])
8840
+ },
8841
+ " Active Devices (" + toDisplayString($setup.activeMfaDevices.length) + ") ",
8842
+ 3
8843
+ /* TEXT, CLASS */
8844
+ )) : createCommentVNode("v-if", true)
8845
+ ])
8846
+ ]),
8847
+ createCommentVNode(" Tab Content: Add New Device "),
8848
+ $setup.activeTab === "add" ? (openBlock(), createElementBlock("div", _hoisted_11$2, [
8849
+ createElementVNode("div", null, [
8850
+ _cache[18] || (_cache[18] = createElementVNode(
8851
+ "h3",
8852
+ { class: "text-xl font-semibold text-gray-900 mb-6" },
8853
+ "Choose Your Authentication Method",
8854
+ -1
8855
+ /* CACHED */
8856
+ )),
8857
+ createElementVNode("div", _hoisted_12$2, [
8858
+ createCommentVNode(" TOTP Setup "),
8859
+ createElementVNode("div", {
8860
+ 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",
8861
+ onClick: $setup.startTotpSetup
8862
+ }, [
8863
+ createElementVNode("div", _hoisted_13$2, [
8864
+ createElementVNode("div", _hoisted_14$2, [
8865
+ createVNode($setup["Smartphone"], {
8866
+ size: 24,
8867
+ class: "text-[var(--strands-primary)]"
8868
+ })
8644
8869
  ]),
8645
- createElementVNode("div", _hoisted_16$2, [
8646
- createCommentVNode(" Backup codes button for TOTP and Hardware Key devices "),
8647
- device.device_type === "totp" || device.device_type === "hardware" ? (openBlock(), createBlock($setup["StrandsUiButton"], {
8648
- key: 0,
8649
- variant: "secondary",
8650
- size: "sm",
8651
- onClick: ($event) => $setup.showBackupCodes(device),
8870
+ _cache[13] || (_cache[13] = createElementVNode(
8871
+ "div",
8872
+ { class: "flex items-start space-x-4" },
8873
+ [
8874
+ createElementVNode("div", { class: "min-w-0 flex-1" }, [
8875
+ createElementVNode("h4", { class: "font-semibold text-gray-900 text-lg" }, "Authenticator App"),
8876
+ createElementVNode("p", { class: "text-xs text-gray-500 mt-2" }, " Use Google Authenticator, Authy, or any TOTP-compatible app to generate secure codes ")
8877
+ ])
8878
+ ],
8879
+ -1
8880
+ /* CACHED */
8881
+ )),
8882
+ createElementVNode("div", _hoisted_15$2, [
8883
+ createVNode($setup["StrandsUiButton"], {
8884
+ variant: "primary",
8885
+ size: "md",
8886
+ onClick: withModifiers($setup.startTotpSetup, ["stop"]),
8652
8887
  disabled: $setup.mfaLoading
8653
8888
  }, {
8654
- default: withCtx(() => [..._cache[9] || (_cache[9] = [
8889
+ default: withCtx(() => _cache[12] || (_cache[12] = [
8655
8890
  createTextVNode(
8656
- " Backup Codes ",
8891
+ " Setup ",
8657
8892
  -1
8658
8893
  /* CACHED */
8659
8894
  )
8660
- ])]),
8661
- _: 2,
8662
- __: [9]
8663
- }, 1032, ["onClick", "disabled"])) : createCommentVNode("v-if", true),
8664
- createCommentVNode(" Test email MFA "),
8665
- device.device_type === "email" ? (openBlock(), createBlock($setup["StrandsUiButton"], {
8666
- key: 1,
8667
- variant: "secondary",
8668
- size: "sm",
8669
- onClick: ($event) => $setup.testEmailMfa(device),
8895
+ ])),
8896
+ _: 1,
8897
+ __: [12]
8898
+ }, 8, ["disabled"])
8899
+ ])
8900
+ ])
8901
+ ]),
8902
+ createCommentVNode(" Email MFA Setup "),
8903
+ createElementVNode("div", {
8904
+ 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",
8905
+ onClick: $setup.startEmailMfaSetup
8906
+ }, [
8907
+ createElementVNode("div", _hoisted_16$2, [
8908
+ createElementVNode("div", _hoisted_17$2, [
8909
+ createVNode($setup["Mail"], {
8910
+ size: 24,
8911
+ class: "text-[var(--strands-primary)]"
8912
+ })
8913
+ ]),
8914
+ _cache[15] || (_cache[15] = createElementVNode(
8915
+ "div",
8916
+ { class: "flex items-start space-x-4" },
8917
+ [
8918
+ createElementVNode("div", { class: "min-w-0 flex-1" }, [
8919
+ createElementVNode("h4", { class: "font-semibold text-gray-900 text-lg" }, "Email Verification"),
8920
+ createElementVNode("p", { class: "text-xs text-gray-500 mt-2" }, " Receive verification codes directly in your email inbox for easy access ")
8921
+ ])
8922
+ ],
8923
+ -1
8924
+ /* CACHED */
8925
+ )),
8926
+ createElementVNode("div", _hoisted_18$2, [
8927
+ createVNode($setup["StrandsUiButton"], {
8928
+ variant: "primary",
8929
+ size: "md",
8930
+ onClick: withModifiers($setup.startEmailMfaSetup, ["stop"]),
8670
8931
  disabled: $setup.mfaLoading
8671
8932
  }, {
8672
- default: withCtx(() => [..._cache[10] || (_cache[10] = [
8933
+ default: withCtx(() => _cache[14] || (_cache[14] = [
8673
8934
  createTextVNode(
8674
- " Send Test Code ",
8935
+ " Setup ",
8675
8936
  -1
8676
8937
  /* CACHED */
8677
8938
  )
8678
- ])]),
8679
- _: 2,
8680
- __: [10]
8681
- }, 1032, ["onClick", "disabled"])) : createCommentVNode("v-if", true),
8682
- createCommentVNode(" Remove device "),
8939
+ ])),
8940
+ _: 1,
8941
+ __: [14]
8942
+ }, 8, ["disabled"])
8943
+ ])
8944
+ ])
8945
+ ]),
8946
+ createCommentVNode(" Hardware Key & Passkeys Setup "),
8947
+ createElementVNode("div", {
8948
+ 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",
8949
+ onClick: $setup.startHardwareKeySetup
8950
+ }, [
8951
+ createElementVNode("div", _hoisted_19$2, [
8952
+ createElementVNode("div", _hoisted_20$1, [
8953
+ createVNode($setup["KeyRound"], {
8954
+ size: 24,
8955
+ class: "text-[var(--strands-primary)]"
8956
+ })
8957
+ ]),
8958
+ _cache[17] || (_cache[17] = createElementVNode(
8959
+ "div",
8960
+ { class: "flex items-start space-x-4" },
8961
+ [
8962
+ createElementVNode("div", { class: "min-w-0 flex-1" }, [
8963
+ createElementVNode("h4", { class: "font-semibold text-gray-900 text-lg" }, "Hardware Key & Passkeys"),
8964
+ createElementVNode("p", { class: "text-xs text-gray-500 mt-2" }, " Use YubiKey, FIDO2 devices, WebAuthn, or built-in passkeys for maximum security ")
8965
+ ])
8966
+ ],
8967
+ -1
8968
+ /* CACHED */
8969
+ )),
8970
+ createElementVNode("div", _hoisted_21$1, [
8683
8971
  createVNode($setup["StrandsUiButton"], {
8684
- variant: "secondary",
8685
- size: "sm",
8686
- onClick: ($event) => $setup.confirmDisableDevice(device),
8972
+ variant: "primary",
8973
+ size: "md",
8974
+ onClick: withModifiers($setup.startHardwareKeySetup, ["stop"]),
8687
8975
  disabled: $setup.mfaLoading
8688
8976
  }, {
8689
- default: withCtx(() => [..._cache[11] || (_cache[11] = [
8977
+ default: withCtx(() => _cache[16] || (_cache[16] = [
8690
8978
  createTextVNode(
8691
- " Remove ",
8979
+ " Setup ",
8692
8980
  -1
8693
8981
  /* CACHED */
8694
8982
  )
8695
- ])]),
8696
- _: 2,
8697
- __: [11]
8698
- }, 1032, ["onClick", "disabled"])
8983
+ ])),
8984
+ _: 1,
8985
+ __: [16]
8986
+ }, 8, ["disabled"])
8699
8987
  ])
8700
- ]);
8701
- }),
8702
- 128
8703
- /* KEYED_FRAGMENT */
8704
- ))
8988
+ ])
8989
+ ])
8990
+ ])
8705
8991
  ])
8706
- ])) : createCommentVNode("v-if", true),
8707
- createCommentVNode(" Add New Device "),
8708
- createElementVNode("div", null, [
8709
- _cache[19] || (_cache[19] = createElementVNode(
8710
- "h3",
8711
- { class: "text-lg font-semibold text-gray-900 mb-4" },
8712
- "Add New Device",
8713
- -1
8714
- /* CACHED */
8715
- )),
8716
- createElementVNode("div", _hoisted_17$2, [
8717
- createCommentVNode(" TOTP Setup "),
8718
- createElementVNode("div", {
8719
- class: "group p-3 sm:p-4 border border-gray-200 rounded-lg hover:border-gray-300 hover:shadow-md transition-all duration-200 cursor-pointer active:scale-[0.98] touch-manipulation",
8720
- onClick: $setup.startTotpSetup
8721
- }, [
8722
- _cache[14] || (_cache[14] = createElementVNode(
8723
- "div",
8724
- { class: "flex items-center space-x-3 mb-3" },
8725
- [
8726
- createElementVNode("div", { class: "flex-shrink-0 w-10 h-10 bg-blue-50 rounded-lg flex items-center justify-center group-hover:bg-blue-100 transition-colors duration-200" }, [
8727
- createElementVNode("span", { class: "text-xl" }, "📱")
8728
- ]),
8729
- createElementVNode("div", { class: "min-w-0 flex-1" }, [
8730
- createElementVNode("h4", { class: "font-medium text-gray-900 text-sm" }, "Authenticator App"),
8731
- createElementVNode("p", { class: "text-xs text-gray-500 mt-0.5" }, "Google Authenticator, Authy, etc.")
8732
- ])
8733
- ],
8734
- -1
8735
- /* CACHED */
8736
- )),
8737
- createVNode($setup["StrandsUiButton"], {
8738
- variant: "primary",
8739
- size: "sm",
8740
- onClick: withModifiers($setup.startTotpSetup, ["stop"]),
8741
- disabled: $setup.mfaLoading,
8742
- class: "w-full"
8743
- }, {
8744
- default: withCtx(() => _cache[13] || (_cache[13] = [
8745
- createTextVNode(
8746
- " Setup TOTP ",
8747
- -1
8748
- /* CACHED */
8749
- )
8750
- ])),
8751
- _: 1,
8752
- __: [13]
8753
- }, 8, ["disabled"])
8754
- ]),
8755
- createCommentVNode(" Email MFA Setup "),
8756
- createElementVNode("div", {
8757
- class: "group p-3 sm:p-4 border border-gray-200 rounded-lg hover:border-gray-300 hover:shadow-md transition-all duration-200 cursor-pointer active:scale-[0.98] touch-manipulation",
8758
- onClick: $setup.startEmailMfaSetup
8759
- }, [
8760
- _cache[16] || (_cache[16] = createElementVNode(
8761
- "div",
8762
- { class: "flex items-center space-x-3 mb-3" },
8763
- [
8764
- createElementVNode("div", { class: "flex-shrink-0 w-10 h-10 bg-green-50 rounded-lg flex items-center justify-center group-hover:bg-green-100 transition-colors duration-200" }, [
8765
- createElementVNode("span", { class: "text-xl" }, "📧")
8766
- ]),
8767
- createElementVNode("div", { class: "min-w-0 flex-1" }, [
8768
- createElementVNode("h4", { class: "font-medium text-gray-900 text-sm" }, "Email Verification"),
8769
- createElementVNode("p", { class: "text-xs text-gray-500 mt-0.5" }, "Codes sent to your email")
8770
- ])
8771
- ],
8772
- -1
8773
- /* CACHED */
8774
- )),
8775
- createVNode($setup["StrandsUiButton"], {
8776
- variant: "primary",
8777
- size: "sm",
8778
- onClick: withModifiers($setup.startEmailMfaSetup, ["stop"]),
8779
- disabled: $setup.mfaLoading,
8780
- class: "w-full"
8781
- }, {
8782
- default: withCtx(() => _cache[15] || (_cache[15] = [
8783
- createTextVNode(
8784
- " Setup Email 2FA ",
8785
- -1
8786
- /* CACHED */
8787
- )
8788
- ])),
8789
- _: 1,
8790
- __: [15]
8791
- }, 8, ["disabled"])
8792
- ]),
8793
- createCommentVNode(" Hardware Key & Passkeys Setup "),
8794
- createElementVNode("div", {
8795
- class: "group p-3 sm:p-4 border border-gray-200 rounded-lg hover:border-gray-300 hover:shadow-md transition-all duration-200 cursor-pointer active:scale-[0.98] touch-manipulation sm:col-span-2 lg:col-span-1",
8796
- onClick: $setup.startHardwareKeySetup
8797
- }, [
8798
- _cache[18] || (_cache[18] = createElementVNode(
8799
- "div",
8800
- { class: "flex items-center space-x-3 mb-3" },
8801
- [
8802
- createElementVNode("div", { class: "flex-shrink-0 w-10 h-10 bg-purple-50 rounded-lg flex items-center justify-center group-hover:bg-purple-100 transition-colors duration-200" }, [
8803
- createElementVNode("span", { class: "text-xl" }, "🔑")
8804
- ]),
8805
- createElementVNode("div", { class: "min-w-0 flex-1" }, [
8806
- createElementVNode("h4", { class: "font-medium text-gray-900 text-sm" }, "Hardware Key & Passkeys"),
8807
- createElementVNode("p", { class: "text-xs text-gray-500 mt-0.5" }, "YubiKey, FIDO2, WebAuthn, Passkeys")
8808
- ])
8809
- ],
8810
- -1
8811
- /* CACHED */
8812
- )),
8813
- createVNode($setup["StrandsUiButton"], {
8814
- variant: "primary",
8815
- size: "sm",
8816
- onClick: withModifiers($setup.startHardwareKeySetup, ["stop"]),
8817
- disabled: $setup.mfaLoading,
8818
- class: "w-full"
8819
- }, {
8820
- default: withCtx(() => _cache[17] || (_cache[17] = [
8821
- createTextVNode(
8822
- " Setup Hardware Key ",
8823
- -1
8824
- /* CACHED */
8825
- )
8826
- ])),
8827
- _: 1,
8828
- __: [17]
8829
- }, 8, ["disabled"])
8992
+ ])) : $setup.activeTab === "manage" && $setup.activeMfaDevices.length > 0 ? (openBlock(), createElementBlock(
8993
+ Fragment,
8994
+ { key: 1 },
8995
+ [
8996
+ createCommentVNode(" Tab Content: Active Devices "),
8997
+ createElementVNode("div", _hoisted_22$1, [
8998
+ createElementVNode("div", null, [
8999
+ _cache[22] || (_cache[22] = createElementVNode(
9000
+ "h3",
9001
+ { class: "text-xl font-semibold text-gray-900 mb-6" },
9002
+ "Manage Your Active Devices",
9003
+ -1
9004
+ /* CACHED */
9005
+ )),
9006
+ createElementVNode("div", _hoisted_23$1, [
9007
+ (openBlock(true), createElementBlock(
9008
+ Fragment,
9009
+ null,
9010
+ renderList($setup.activeMfaDevices, (device) => {
9011
+ return openBlock(), createElementBlock("div", {
9012
+ key: device.id,
9013
+ class: "group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200"
9014
+ }, [
9015
+ createElementVNode("div", _hoisted_24$1, [
9016
+ createElementVNode("div", _hoisted_25$1, [
9017
+ createElementVNode(
9018
+ "div",
9019
+ {
9020
+ class: normalizeClass(["flex-shrink-0 w-14 h-14 rounded-xl flex items-center justify-center", $setup.getDeviceIconBackground(device.device_type)])
9021
+ },
9022
+ [
9023
+ (openBlock(), createBlock(resolveDynamicComponent($setup.getDeviceIconComponent(device.device_type)), {
9024
+ size: 24,
9025
+ class: "text-gray-600"
9026
+ }))
9027
+ ],
9028
+ 2
9029
+ /* CLASS */
9030
+ ),
9031
+ createElementVNode("div", _hoisted_26$1, [
9032
+ createElementVNode(
9033
+ "h4",
9034
+ _hoisted_27$1,
9035
+ toDisplayString(device.device_name),
9036
+ 1
9037
+ /* TEXT */
9038
+ ),
9039
+ createElementVNode(
9040
+ "p",
9041
+ _hoisted_28$1,
9042
+ toDisplayString($setup.getDeviceTypeName(device.device_type)),
9043
+ 1
9044
+ /* TEXT */
9045
+ ),
9046
+ createElementVNode(
9047
+ "p",
9048
+ _hoisted_29$1,
9049
+ " Last used " + toDisplayString($setup.formatLastUsed(device.last_used_at)),
9050
+ 1
9051
+ /* TEXT */
9052
+ )
9053
+ ])
9054
+ ]),
9055
+ createElementVNode("div", _hoisted_30$1, [
9056
+ createCommentVNode(" Backup codes button for TOTP and Hardware Key devices "),
9057
+ device.device_type === "totp" || device.device_type === "hardware" ? (openBlock(), createBlock($setup["StrandsUiButton"], {
9058
+ key: 0,
9059
+ variant: "secondary",
9060
+ size: "sm",
9061
+ onClick: ($event) => $setup.showBackupCodes(device),
9062
+ disabled: $setup.mfaLoading
9063
+ }, {
9064
+ default: withCtx(() => [
9065
+ createVNode($setup["KeyRound"], {
9066
+ size: 14,
9067
+ class: "mr-2"
9068
+ }),
9069
+ _cache[19] || (_cache[19] = createTextVNode(
9070
+ " Backup Codes ",
9071
+ -1
9072
+ /* CACHED */
9073
+ ))
9074
+ ]),
9075
+ _: 2,
9076
+ __: [19]
9077
+ }, 1032, ["onClick", "disabled"])) : createCommentVNode("v-if", true),
9078
+ createCommentVNode(" Test email MFA "),
9079
+ device.device_type === "email" ? (openBlock(), createBlock($setup["StrandsUiButton"], {
9080
+ key: 1,
9081
+ variant: "secondary",
9082
+ size: "sm",
9083
+ onClick: ($event) => $setup.testEmailMfa(device),
9084
+ disabled: $setup.mfaLoading
9085
+ }, {
9086
+ default: withCtx(() => [
9087
+ createVNode($setup["Mail"], {
9088
+ size: 14,
9089
+ class: "mr-2"
9090
+ }),
9091
+ _cache[20] || (_cache[20] = createTextVNode(
9092
+ " Send Test Code ",
9093
+ -1
9094
+ /* CACHED */
9095
+ ))
9096
+ ]),
9097
+ _: 2,
9098
+ __: [20]
9099
+ }, 1032, ["onClick", "disabled"])) : createCommentVNode("v-if", true),
9100
+ createCommentVNode(" Remove device "),
9101
+ createVNode($setup["StrandsUiButton"], {
9102
+ variant: "secondary",
9103
+ size: "sm",
9104
+ onClick: ($event) => $setup.confirmDisableDevice(device),
9105
+ disabled: $setup.mfaLoading,
9106
+ class: "text-red-600 hover:bg-red-50 hover:text-red-700 border-red-200"
9107
+ }, {
9108
+ default: withCtx(() => [
9109
+ createVNode($setup["Trash2"], {
9110
+ size: 14,
9111
+ class: "mr-2"
9112
+ }),
9113
+ _cache[21] || (_cache[21] = createTextVNode(
9114
+ " Remove ",
9115
+ -1
9116
+ /* CACHED */
9117
+ ))
9118
+ ]),
9119
+ _: 2,
9120
+ __: [21]
9121
+ }, 1032, ["onClick", "disabled"])
9122
+ ])
9123
+ ])
9124
+ ]);
9125
+ }),
9126
+ 128
9127
+ /* KEYED_FRAGMENT */
9128
+ ))
9129
+ ])
9130
+ ])
8830
9131
  ])
8831
- ])
8832
- ])
9132
+ ],
9133
+ 2112
9134
+ /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
9135
+ )) : createCommentVNode("v-if", true)
8833
9136
  ])
8834
9137
  ],
8835
9138
  2112
@@ -8838,26 +9141,26 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
8838
9141
  $setup.showTotpSetup ? (openBlock(), createBlock($setup["StrandsTotpSetupModal"], {
8839
9142
  key: 2,
8840
9143
  show: $setup.showTotpSetup,
8841
- onClose: _cache[0] || (_cache[0] = ($event) => $setup.showTotpSetup = false),
9144
+ onClose: _cache[2] || (_cache[2] = ($event) => $setup.showTotpSetup = false),
8842
9145
  onSuccess: $setup.handleTotpSetupSuccess
8843
9146
  }, null, 8, ["show"])) : createCommentVNode("v-if", true),
8844
9147
  $setup.showEmailMfaSetup ? (openBlock(), createBlock($setup["StrandsEmailMfaSetupModal"], {
8845
9148
  key: 3,
8846
9149
  show: $setup.showEmailMfaSetup,
8847
- onClose: _cache[1] || (_cache[1] = ($event) => $setup.showEmailMfaSetup = false),
9150
+ onClose: _cache[3] || (_cache[3] = ($event) => $setup.showEmailMfaSetup = false),
8848
9151
  onSuccess: $setup.handleEmailMfaSetupSuccess
8849
9152
  }, null, 8, ["show"])) : createCommentVNode("v-if", true),
8850
9153
  $setup.showHardwareKeySetup ? (openBlock(), createBlock($setup["StrandsHardwareKeySetupModal"], {
8851
9154
  key: 4,
8852
9155
  show: $setup.showHardwareKeySetup,
8853
- onClose: _cache[2] || (_cache[2] = ($event) => $setup.showHardwareKeySetup = false),
9156
+ onClose: _cache[4] || (_cache[4] = ($event) => $setup.showHardwareKeySetup = false),
8854
9157
  onSuccess: $setup.handleHardwareKeySetupSuccess
8855
9158
  }, null, 8, ["show"])) : createCommentVNode("v-if", true),
8856
9159
  $setup.showBackupCodesModal ? (openBlock(), createBlock($setup["StrandsBackupCodesModal"], {
8857
9160
  key: 5,
8858
9161
  show: $setup.showBackupCodesModal,
8859
9162
  device: $setup.selectedDevice,
8860
- onClose: _cache[3] || (_cache[3] = ($event) => $setup.showBackupCodesModal = false)
9163
+ onClose: _cache[5] || (_cache[5] = ($event) => $setup.showBackupCodesModal = false)
8861
9164
  }, null, 8, ["show", "device"])) : createCommentVNode("v-if", true)
8862
9165
  ]),
8863
9166
  _: 1
@@ -8873,7 +9176,7 @@ function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
8873
9176
  "cancel-text": "Keep Device",
8874
9177
  variant: "secondary",
8875
9178
  onConfirm: $setup.handleDisableDevice,
8876
- onCancel: _cache[4] || (_cache[4] = ($event) => $setup.showConfirmDisable = false)
9179
+ onCancel: _cache[6] || (_cache[6] = ($event) => $setup.showConfirmDisable = false)
8877
9180
  }, null, 8, ["show", "message"])) : createCommentVNode("v-if", true)
8878
9181
  ],
8879
9182
  64
@@ -9278,7 +9581,7 @@ const _hoisted_16$1 = {
9278
9581
  };
9279
9582
  const _hoisted_17$1 = { class: "space-y-3 md:space-y-4" };
9280
9583
  const _hoisted_18$1 = { class: "space-y-4 p-4 bg-gray-50 rounded-xl" };
9281
- const _hoisted_19 = { class: "flex items-center justify-between gap-2" };
9584
+ const _hoisted_19$1 = { class: "flex items-center justify-between gap-2" };
9282
9585
  const _hoisted_20 = { class: "text-sm text-gray-600" };
9283
9586
  const _hoisted_21 = {
9284
9587
  key: 0,
@@ -9524,7 +9827,7 @@ function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
9524
9827
  )),
9525
9828
  createCommentVNode(" Password Change "),
9526
9829
  createElementVNode("div", _hoisted_18$1, [
9527
- createElementVNode("div", _hoisted_19, [
9830
+ createElementVNode("div", _hoisted_19$1, [
9528
9831
  createElementVNode("div", null, [
9529
9832
  _cache[15] || (_cache[15] = createElementVNode(
9530
9833
  "h4",
@@ -10040,129 +10343,6 @@ function _sfc_render$6(_ctx, _cache, $props, $setup, $data, $options) {
10040
10343
  ]);
10041
10344
  }
10042
10345
  const StrandsPasswordReset = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["render", _sfc_render$6], ["__file", "/home/runner/work/strands-accounts/strands-accounts/apps/accounts-ui/src/vue/components/StrandsPasswordReset.vue"]]);
10043
- /**
10044
- * @license lucide-vue-next v0.539.0 - ISC
10045
- *
10046
- * This source code is licensed under the ISC license.
10047
- * See the LICENSE file in the root directory of this source tree.
10048
- */
10049
- const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
10050
- const toCamelCase = (string) => string.replace(
10051
- /^([A-Z])|[\s-_]+(\w)/g,
10052
- (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()
10053
- );
10054
- const toPascalCase = (string) => {
10055
- const camelCase = toCamelCase(string);
10056
- return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
10057
- };
10058
- const mergeClasses = (...classes) => classes.filter((className, index, array) => {
10059
- return Boolean(className) && className.trim() !== "" && array.indexOf(className) === index;
10060
- }).join(" ").trim();
10061
- const isEmptyString = (value) => value === "";
10062
- /**
10063
- * @license lucide-vue-next v0.539.0 - ISC
10064
- *
10065
- * This source code is licensed under the ISC license.
10066
- * See the LICENSE file in the root directory of this source tree.
10067
- */
10068
- var defaultAttributes = {
10069
- xmlns: "http://www.w3.org/2000/svg",
10070
- width: 24,
10071
- height: 24,
10072
- viewBox: "0 0 24 24",
10073
- fill: "none",
10074
- stroke: "currentColor",
10075
- "stroke-width": 2,
10076
- "stroke-linecap": "round",
10077
- "stroke-linejoin": "round"
10078
- };
10079
- /**
10080
- * @license lucide-vue-next v0.539.0 - ISC
10081
- *
10082
- * This source code is licensed under the ISC license.
10083
- * See the LICENSE file in the root directory of this source tree.
10084
- */
10085
- const Icon = ({
10086
- name,
10087
- iconNode,
10088
- absoluteStrokeWidth,
10089
- "absolute-stroke-width": absoluteStrokeWidthKebabCase,
10090
- strokeWidth,
10091
- "stroke-width": strokeWidthKebabCase,
10092
- size = defaultAttributes.width,
10093
- color = defaultAttributes.stroke,
10094
- ...props
10095
- }, { slots }) => {
10096
- return h(
10097
- "svg",
10098
- {
10099
- ...defaultAttributes,
10100
- ...props,
10101
- width: size,
10102
- height: size,
10103
- stroke: color,
10104
- "stroke-width": isEmptyString(absoluteStrokeWidth) || isEmptyString(absoluteStrokeWidthKebabCase) || absoluteStrokeWidth === true || absoluteStrokeWidthKebabCase === true ? Number(strokeWidth || strokeWidthKebabCase || defaultAttributes["stroke-width"]) * 24 / Number(size) : strokeWidth || strokeWidthKebabCase || defaultAttributes["stroke-width"],
10105
- class: mergeClasses(
10106
- "lucide",
10107
- props.class,
10108
- ...name ? [`lucide-${toKebabCase(toPascalCase(name))}-icon`, `lucide-${toKebabCase(name)}`] : ["lucide-icon"]
10109
- )
10110
- },
10111
- [...iconNode.map((child) => h(...child)), ...slots.default ? [slots.default()] : []]
10112
- );
10113
- };
10114
- /**
10115
- * @license lucide-vue-next v0.539.0 - ISC
10116
- *
10117
- * This source code is licensed under the ISC license.
10118
- * See the LICENSE file in the root directory of this source tree.
10119
- */
10120
- const createLucideIcon = (iconName, iconNode) => (props, { slots, attrs }) => h(
10121
- Icon,
10122
- {
10123
- ...attrs,
10124
- ...props,
10125
- iconNode,
10126
- name: iconName
10127
- },
10128
- slots
10129
- );
10130
- /**
10131
- * @license lucide-vue-next v0.539.0 - ISC
10132
- *
10133
- * This source code is licensed under the ISC license.
10134
- * See the LICENSE file in the root directory of this source tree.
10135
- */
10136
- const KeyRound = createLucideIcon("key-round", [
10137
- [
10138
- "path",
10139
- {
10140
- d: "M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",
10141
- key: "1s6t7t"
10142
- }
10143
- ],
10144
- ["circle", { cx: "16.5", cy: "7.5", r: ".5", fill: "currentColor", key: "w0ekpg" }]
10145
- ]);
10146
- /**
10147
- * @license lucide-vue-next v0.539.0 - ISC
10148
- *
10149
- * This source code is licensed under the ISC license.
10150
- * See the LICENSE file in the root directory of this source tree.
10151
- */
10152
- const Mail = createLucideIcon("mail", [
10153
- ["path", { d: "m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7", key: "132q7q" }],
10154
- ["rect", { x: "2", y: "4", width: "20", height: "16", rx: "2", key: "izxlao" }]
10155
- ]);
10156
- /**
10157
- * @license lucide-vue-next v0.539.0 - ISC
10158
- *
10159
- * This source code is licensed under the ISC license.
10160
- * See the LICENSE file in the root directory of this source tree.
10161
- */
10162
- const Smartphone = createLucideIcon("smartphone", [
10163
- ["rect", { width: "14", height: "20", x: "5", y: "2", rx: "2", ry: "2", key: "1yt0o3" }],
10164
- ["path", { d: "M12 18h.01", key: "mhygvu" }]
10165
- ]);
10166
10346
  const _sfc_main$5 = /* @__PURE__ */ defineComponent({
10167
10347
  __name: "StrandsMFASetup",
10168
10348
  props: {
@@ -10229,6 +10409,10 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
10229
10409
  return Mail;
10230
10410
  }, get KeyRound() {
10231
10411
  return KeyRound;
10412
+ }, get Shield() {
10413
+ return Shield;
10414
+ }, get Settings() {
10415
+ return Settings;
10232
10416
  } };
10233
10417
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
10234
10418
  return __returned__;
@@ -10236,28 +10420,32 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
10236
10420
  });
10237
10421
  const _hoisted_1$3 = { class: "flex items-center justify-between" };
10238
10422
  const _hoisted_2$2 = { class: "text-right" };
10239
- const _hoisted_3$2 = { class: "space-y-6" };
10423
+ const _hoisted_3$2 = { class: "space-y-8" };
10240
10424
  const _hoisted_4$1 = {
10241
10425
  key: 0,
10242
- class: "flex items-center justify-center py-12"
10426
+ class: "flex items-center justify-center py-16"
10243
10427
  };
10244
- const _hoisted_5$1 = { class: "space-y-6" };
10428
+ const _hoisted_5$1 = { class: "space-y-8" };
10245
10429
  const _hoisted_6 = {
10246
10430
  key: 0,
10247
- class: "bg-green-50 border border-green-200 rounded-lg p-4"
10431
+ class: "bg-green-50 border border-green-200 rounded-xl p-6"
10432
+ };
10433
+ const _hoisted_7 = { class: "flex items-center space-x-3" };
10434
+ const _hoisted_8 = { class: "w-10 h-10 bg-green-100 rounded-full flex items-center justify-center" };
10435
+ const _hoisted_9 = { class: "grid grid-cols-1 md:grid-cols-3 gap-6" };
10436
+ const _hoisted_10 = { class: "flex flex-col items-center text-center space-y-4" };
10437
+ 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" };
10438
+ const _hoisted_12 = { class: "flex flex-col items-center text-center space-y-4" };
10439
+ 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" };
10440
+ const _hoisted_14 = { class: "flex flex-col items-center text-center space-y-4" };
10441
+ 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" };
10442
+ const _hoisted_16 = {
10443
+ key: 1,
10444
+ class: "border-t border-gray-200 pt-8"
10248
10445
  };
10249
- const _hoisted_7 = { class: "grid grid-cols-1 md:grid-cols-3 gap-4" };
10250
- const _hoisted_8 = { class: "p-6 border border-gray-200 rounded-lg hover:shadow-sm hover:border-[var(--strands-primary)] transition-all duration-200" };
10251
- const _hoisted_9 = { class: "flex flex-col items-center text-center space-y-3" };
10252
- const _hoisted_10 = { class: "w-12 h-12 bg-[var(--strands-primary)] bg-opacity-10 rounded-lg flex items-center justify-center" };
10253
- const _hoisted_11 = { class: "p-6 border border-gray-200 rounded-lg hover:shadow-sm hover:border-[var(--strands-primary)] transition-all duration-200" };
10254
- const _hoisted_12 = { class: "flex flex-col items-center text-center space-y-3" };
10255
- const _hoisted_13 = { class: "w-12 h-12 bg-[var(--strands-primary)] bg-opacity-10 rounded-lg flex items-center justify-center" };
10256
- const _hoisted_14 = { class: "p-6 border border-gray-200 rounded-lg hover:shadow-sm hover:border-[var(--strands-primary)] transition-all duration-200" };
10257
- const _hoisted_15 = { class: "flex flex-col items-center text-center space-y-3" };
10258
- const _hoisted_16 = { class: "w-12 h-12 bg-[var(--strands-primary)] bg-opacity-10 rounded-lg flex items-center justify-center" };
10259
- const _hoisted_17 = { key: 1 };
10260
- const _hoisted_18 = { class: "flex justify-end space-x-3" };
10446
+ const _hoisted_17 = { class: "flex items-center justify-between" };
10447
+ const _hoisted_18 = { class: "text-gray-600 text-sm mt-1" };
10448
+ const _hoisted_19 = { class: "flex justify-end space-x-3" };
10261
10449
  function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
10262
10450
  return openBlock(), createElementBlock(
10263
10451
  Fragment,
@@ -10266,7 +10454,7 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
10266
10454
  createVNode($setup["UiModal"], {
10267
10455
  open: $props.show,
10268
10456
  onClose: $setup.closeModal,
10269
- "card-class": "max-w-4xl"
10457
+ "card-class": "max-w-5xl"
10270
10458
  }, {
10271
10459
  header: withCtx(() => [
10272
10460
  createElementVNode("div", _hoisted_1$3, [
@@ -10294,7 +10482,7 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
10294
10482
  ])
10295
10483
  ]),
10296
10484
  footer: withCtx(() => [
10297
- createElementVNode("div", _hoisted_18, [
10485
+ createElementVNode("div", _hoisted_19, [
10298
10486
  createVNode($setup["StrandsUiButton"], {
10299
10487
  variant: "secondary",
10300
10488
  onClick: $setup.closeModal,
@@ -10331,67 +10519,68 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
10331
10519
  createCommentVNode(" MFA Options "),
10332
10520
  createElementVNode("div", _hoisted_5$1, [
10333
10521
  createCommentVNode(" Current MFA Status "),
10334
- $setup.mfaEnabled || $setup.activeMfaDevices.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_6, _cache[6] || (_cache[6] = [
10335
- createElementVNode(
10336
- "div",
10337
- { class: "flex items-center space-x-2" },
10338
- [
10339
- createElementVNode("svg", {
10340
- class: "w-5 h-5 text-green-600",
10341
- fill: "currentColor",
10342
- viewBox: "0 0 20 20"
10343
- }, [
10344
- createElementVNode("path", {
10345
- "fill-rule": "evenodd",
10346
- d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",
10347
- "clip-rule": "evenodd"
10348
- })
10349
- ]),
10350
- createElementVNode("span", { class: "text-green-800 font-medium" }, "2FA is currently enabled on your account")
10351
- ],
10352
- -1
10353
- /* CACHED */
10354
- )
10355
- ]))) : createCommentVNode("v-if", true),
10522
+ $setup.mfaEnabled || $setup.activeMfaDevices.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_6, [
10523
+ createElementVNode("div", _hoisted_7, [
10524
+ createElementVNode("div", _hoisted_8, [
10525
+ createVNode($setup["Shield"], {
10526
+ size: 20,
10527
+ class: "text-green-600"
10528
+ })
10529
+ ]),
10530
+ _cache[6] || (_cache[6] = createElementVNode(
10531
+ "div",
10532
+ null,
10533
+ [
10534
+ createElementVNode("span", { class: "text-green-800 font-medium text-lg" }, "2FA is currently enabled on your account"),
10535
+ createElementVNode("p", { class: "text-green-700 text-sm mt-1" }, "Your account has additional security protection")
10536
+ ],
10537
+ -1
10538
+ /* CACHED */
10539
+ ))
10540
+ ])
10541
+ ])) : createCommentVNode("v-if", true),
10356
10542
  createCommentVNode(" Setup Options "),
10357
10543
  createElementVNode("div", null, [
10358
10544
  _cache[13] || (_cache[13] = createElementVNode(
10359
10545
  "h3",
10360
- { class: "text-lg font-semibold text-gray-900 mb-4" },
10361
- "Add New Device",
10546
+ { class: "text-xl font-semibold text-gray-900 mb-6" },
10547
+ "Choose Your Authentication Method",
10362
10548
  -1
10363
10549
  /* CACHED */
10364
10550
  )),
10365
- createElementVNode("div", _hoisted_7, [
10551
+ createElementVNode("div", _hoisted_9, [
10366
10552
  createCommentVNode(" TOTP Setup "),
10367
- createElementVNode("div", _hoisted_8, [
10368
- createElementVNode("div", _hoisted_9, [
10369
- createElementVNode("div", _hoisted_10, [
10553
+ createElementVNode("div", {
10554
+ class: "group p-8 border border-gray-200 rounded-xl hover:shadow-lg hover:border-[var(--strands-primary)] transition-all duration-200 cursor-pointer",
10555
+ onClick: $setup.startTotpSetup
10556
+ }, [
10557
+ createElementVNode("div", _hoisted_10, [
10558
+ createElementVNode("div", _hoisted_11, [
10370
10559
  createVNode($setup["Smartphone"], {
10371
- size: 24,
10560
+ size: 28,
10372
10561
  class: "text-[var(--strands-primary)]"
10373
10562
  })
10374
10563
  ]),
10375
10564
  _cache[8] || (_cache[8] = createElementVNode(
10376
10565
  "div",
10377
- null,
10566
+ { class: "space-y-2" },
10378
10567
  [
10379
- createElementVNode("h4", { class: "font-medium text-gray-900" }, "Authenticator App"),
10380
- createElementVNode("p", { class: "text-sm text-gray-500" }, "Google Authenticator, Authy, etc.")
10568
+ createElementVNode("h4", { class: "font-semibold text-gray-900 text-lg" }, "Authenticator App"),
10569
+ createElementVNode("p", { class: "text-sm text-gray-500 leading-relaxed" }, "Use Google Authenticator, Authy, or any TOTP-compatible app to generate secure codes")
10381
10570
  ],
10382
10571
  -1
10383
10572
  /* CACHED */
10384
10573
  )),
10385
10574
  createVNode($setup["StrandsUiButton"], {
10386
10575
  variant: "primary",
10387
- size: "sm",
10388
- onClick: $setup.startTotpSetup,
10576
+ size: "md",
10577
+ onClick: withModifiers($setup.startTotpSetup, ["stop"]),
10389
10578
  disabled: $setup.loading,
10390
- class: "w-full"
10579
+ class: "w-full mt-4"
10391
10580
  }, {
10392
10581
  default: withCtx(() => _cache[7] || (_cache[7] = [
10393
10582
  createTextVNode(
10394
- " Setup TOTP ",
10583
+ " Setup Authenticator ",
10395
10584
  -1
10396
10585
  /* CACHED */
10397
10586
  )
@@ -10402,30 +10591,33 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
10402
10591
  ])
10403
10592
  ]),
10404
10593
  createCommentVNode(" Email MFA Setup "),
10405
- createElementVNode("div", _hoisted_11, [
10594
+ createElementVNode("div", {
10595
+ class: "group p-8 border border-gray-200 rounded-xl hover:shadow-lg hover:border-[var(--strands-primary)] transition-all duration-200 cursor-pointer",
10596
+ onClick: $setup.startEmailMfaSetup
10597
+ }, [
10406
10598
  createElementVNode("div", _hoisted_12, [
10407
10599
  createElementVNode("div", _hoisted_13, [
10408
10600
  createVNode($setup["Mail"], {
10409
- size: 24,
10601
+ size: 28,
10410
10602
  class: "text-[var(--strands-primary)]"
10411
10603
  })
10412
10604
  ]),
10413
10605
  _cache[10] || (_cache[10] = createElementVNode(
10414
10606
  "div",
10415
- null,
10607
+ { class: "space-y-2" },
10416
10608
  [
10417
- createElementVNode("h4", { class: "font-medium text-gray-900" }, "Email Verification"),
10418
- createElementVNode("p", { class: "text-sm text-gray-500" }, "Codes sent to your email")
10609
+ createElementVNode("h4", { class: "font-semibold text-gray-900 text-lg" }, "Email Verification"),
10610
+ createElementVNode("p", { class: "text-sm text-gray-500 leading-relaxed" }, "Receive verification codes directly in your email inbox for easy access")
10419
10611
  ],
10420
10612
  -1
10421
10613
  /* CACHED */
10422
10614
  )),
10423
10615
  createVNode($setup["StrandsUiButton"], {
10424
10616
  variant: "primary",
10425
- size: "sm",
10426
- onClick: $setup.startEmailMfaSetup,
10617
+ size: "md",
10618
+ onClick: withModifiers($setup.startEmailMfaSetup, ["stop"]),
10427
10619
  disabled: $setup.loading,
10428
- class: "w-full"
10620
+ class: "w-full mt-4"
10429
10621
  }, {
10430
10622
  default: withCtx(() => _cache[9] || (_cache[9] = [
10431
10623
  createTextVNode(
@@ -10440,30 +10632,33 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
10440
10632
  ])
10441
10633
  ]),
10442
10634
  createCommentVNode(" Hardware Key Setup "),
10443
- createElementVNode("div", _hoisted_14, [
10444
- createElementVNode("div", _hoisted_15, [
10445
- createElementVNode("div", _hoisted_16, [
10635
+ createElementVNode("div", {
10636
+ class: "group p-8 border border-gray-200 rounded-xl hover:shadow-lg hover:border-[var(--strands-primary)] transition-all duration-200 cursor-pointer",
10637
+ onClick: $setup.startHardwareKeySetup
10638
+ }, [
10639
+ createElementVNode("div", _hoisted_14, [
10640
+ createElementVNode("div", _hoisted_15, [
10446
10641
  createVNode($setup["KeyRound"], {
10447
- size: 24,
10642
+ size: 28,
10448
10643
  class: "text-[var(--strands-primary)]"
10449
10644
  })
10450
10645
  ]),
10451
10646
  _cache[12] || (_cache[12] = createElementVNode(
10452
10647
  "div",
10453
- null,
10648
+ { class: "space-y-2" },
10454
10649
  [
10455
- createElementVNode("h4", { class: "font-medium text-gray-900" }, "Hardware Key & Passkeys"),
10456
- createElementVNode("p", { class: "text-sm text-gray-500" }, "YubiKey, FIDO2, WebAuthn, Passkeys")
10650
+ createElementVNode("h4", { class: "font-semibold text-gray-900 text-lg" }, "Hardware Key & Passkeys"),
10651
+ createElementVNode("p", { class: "text-sm text-gray-500 leading-relaxed" }, "Use YubiKey, FIDO2 devices, WebAuthn, or built-in passkeys for maximum security")
10457
10652
  ],
10458
10653
  -1
10459
10654
  /* CACHED */
10460
10655
  )),
10461
10656
  createVNode($setup["StrandsUiButton"], {
10462
10657
  variant: "primary",
10463
- size: "sm",
10464
- onClick: $setup.startHardwareKeySetup,
10658
+ size: "md",
10659
+ onClick: withModifiers($setup.startHardwareKeySetup, ["stop"]),
10465
10660
  disabled: $setup.loading,
10466
- class: "w-full"
10661
+ class: "w-full mt-4"
10467
10662
  }, {
10468
10663
  default: withCtx(() => _cache[11] || (_cache[11] = [
10469
10664
  createTextVNode(
@@ -10480,30 +10675,45 @@ function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
10480
10675
  ])
10481
10676
  ]),
10482
10677
  createCommentVNode(" Manage Existing "),
10483
- $setup.activeMfaDevices.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_17, [
10484
- _cache[15] || (_cache[15] = createElementVNode(
10485
- "h3",
10486
- { class: "text-lg font-semibold text-gray-900 mb-4" },
10487
- "Manage Existing Methods",
10488
- -1
10489
- /* CACHED */
10490
- )),
10491
- createVNode($setup["StrandsUiButton"], {
10492
- variant: "secondary",
10493
- onClick: $setup.openMfaModal,
10494
- disabled: $setup.loading,
10495
- class: "w-full"
10496
- }, {
10497
- default: withCtx(() => _cache[14] || (_cache[14] = [
10498
- createTextVNode(
10499
- " Manage 2FA Devices ",
10678
+ $setup.activeMfaDevices.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_16, [
10679
+ createElementVNode("div", _hoisted_17, [
10680
+ createElementVNode("div", null, [
10681
+ _cache[14] || (_cache[14] = createElementVNode(
10682
+ "h3",
10683
+ { class: "text-lg font-semibold text-gray-900" },
10684
+ "Manage Existing Methods",
10500
10685
  -1
10501
10686
  /* CACHED */
10687
+ )),
10688
+ createElementVNode(
10689
+ "p",
10690
+ _hoisted_18,
10691
+ toDisplayString($setup.activeMfaDevices.length) + " device(s) currently active",
10692
+ 1
10693
+ /* TEXT */
10502
10694
  )
10503
- ])),
10504
- _: 1,
10505
- __: [14]
10506
- }, 8, ["disabled"])
10695
+ ]),
10696
+ createVNode($setup["StrandsUiButton"], {
10697
+ variant: "secondary",
10698
+ size: "md",
10699
+ onClick: $setup.openMfaModal,
10700
+ disabled: $setup.loading
10701
+ }, {
10702
+ default: withCtx(() => [
10703
+ createVNode($setup["Settings"], {
10704
+ size: 16,
10705
+ class: "mr-2"
10706
+ }),
10707
+ _cache[15] || (_cache[15] = createTextVNode(
10708
+ " Manage Devices ",
10709
+ -1
10710
+ /* CACHED */
10711
+ ))
10712
+ ]),
10713
+ _: 1,
10714
+ __: [15]
10715
+ }, 8, ["disabled"])
10716
+ ])
10507
10717
  ])) : createCommentVNode("v-if", true)
10508
10718
  ])
10509
10719
  ],