@fonderie/vue-admin-screens 0.1.0 → 0.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.
package/README.md CHANGED
@@ -10,12 +10,13 @@ Status: **experimental** (0.x).
10
10
  |---|---|---|
11
11
  | Today | Attention | what needs me today — empty is green |
12
12
  | System | Modules · Configuration · Doctor · Routes | what did I deploy · is it configured · is it working · what is exposed |
13
+ | People | Users | why can't this person log in — lookup, sessions, sign-ins, suspend, sign out everywhere (`authClient`) |
13
14
  | Settings | Config & secrets | the `@fonderie/config` admin screens, as a sub-page |
14
15
  | Messaging | Templates | the `@fonderie/courier` admin screens, as a sub-page |
15
16
  | Activity | Admin log · Access | who did what · who can be here |
16
17
 
17
18
  ```ts
18
- import { AdminClient, ConfigAdminClient, CourierAdminClient } from '@fonderie/client';
19
+ import { AdminClient, AuthAdminClient, ConfigAdminClient, CourierAdminClient } from '@fonderie/client';
19
20
  import { AdminShell } from '@fonderie/vue-admin-screens';
20
21
 
21
22
  const base = { baseUrl: 'https://api.example.com', adminToken, actor: 'louis' };
@@ -23,10 +24,11 @@ const client = new AdminClient(base);
23
24
  // prefix: the composed surface under /_admin — one token for everything.
24
25
  const configClient = new ConfigAdminClient({ ...base, prefix: '/_admin' });
25
26
  const courierClient = new CourierAdminClient({ ...base, prefix: '/_admin' });
27
+ const authClient = new AuthAdminClient(base); // @fonderie/auth ≥ 7.8
26
28
  ```
27
29
 
28
30
  ```ts
29
- h(AdminShell, { client, configClient, courierClient })
31
+ h(AdminShell, { client, configClient, courierClient, authClient })
30
32
  ```
31
33
 
32
34
  Pass `page` and listen to `navigate` to own the URL (one route per page);
package/dist/index.cjs CHANGED
@@ -27,14 +27,15 @@ __export(index_exports, {
27
27
  DoctorScreen: () => DoctorScreen,
28
28
  ModulesScreen: () => ModulesScreen,
29
29
  RoutesScreen: () => RoutesScreen,
30
- TokensScreen: () => TokensScreen
30
+ TokensScreen: () => TokensScreen,
31
+ UsersScreen: () => UsersScreen
31
32
  });
32
33
  module.exports = __toCommonJS(index_exports);
33
34
 
34
35
  // src/screens/AdminShell.ts
35
36
  var import_vue_config_admin_screens = require("@fonderie/vue-config-admin-screens");
36
37
  var import_vue_courier_admin_screens = require("@fonderie/vue-courier-admin-screens");
37
- var import_vue9 = require("vue");
38
+ var import_vue10 = require("vue");
38
39
 
39
40
  // src/styles.ts
40
41
  var styles = {
@@ -460,6 +461,140 @@ var TokensScreen = (0, import_vue8.defineComponent)({
460
461
  }
461
462
  });
462
463
 
464
+ // src/screens/UsersScreen.ts
465
+ var import_vue_admin8 = require("@fonderie/vue-admin");
466
+ var import_vue9 = require("vue");
467
+ var UsersScreen = (0, import_vue9.defineComponent)({
468
+ name: "FonderieUsersScreen",
469
+ props: { client: { type: Object, required: true } },
470
+ setup(props) {
471
+ const input = (0, import_vue9.ref)("");
472
+ const email = (0, import_vue9.ref)("");
473
+ const { user, isLoading, error, suspend, unsuspend, revokeSessions } = (0, import_vue_admin8.useAdminUser)(
474
+ props.client,
475
+ { email }
476
+ );
477
+ const userId = (0, import_vue9.computed)(() => user.value?.id ?? null);
478
+ const sessions = (0, import_vue_admin8.useAdminUserSessions)(props.client, userId);
479
+ const history = (0, import_vue_admin8.useAdminLoginHistory)(props.client, userId, { limit: 20 });
480
+ const yesNo = (v) => (0, import_vue9.h)("span", { style: v ? styles.ok : styles.muted }, v ? "yes" : "no");
481
+ const row = (k, v) => (0, import_vue9.h)("tr", [td(k), td(v)]);
482
+ return () => {
483
+ const u = user.value;
484
+ return (0, import_vue9.h)("div", { style: styles.container }, [
485
+ (0, import_vue9.h)("h1", { style: styles.title }, "Users"),
486
+ (0, import_vue9.h)(
487
+ "form",
488
+ {
489
+ style: styles.toolbar,
490
+ onSubmit: (e) => {
491
+ e.preventDefault();
492
+ email.value = input.value.trim();
493
+ }
494
+ },
495
+ [
496
+ (0, import_vue9.h)("input", {
497
+ type: "email",
498
+ value: input.value,
499
+ onInput: (e) => input.value = e.target.value,
500
+ placeholder: "email address",
501
+ style: { ...styles.button, cursor: "text", minWidth: "280px" },
502
+ "aria-label": "Email"
503
+ }),
504
+ (0, import_vue9.h)(
505
+ "button",
506
+ { type: "submit", style: styles.button, disabled: isLoading.value },
507
+ "Look up"
508
+ )
509
+ ]
510
+ ),
511
+ error.value ? (0, import_vue9.h)(
512
+ "p",
513
+ { style: styles.error, role: "alert" },
514
+ error.value.status === 404 ? "No user with that email." : error.value.explanation
515
+ ) : null,
516
+ u ? [
517
+ (0, import_vue9.h)("h2", { style: styles.subtitle }, [
518
+ u.firstName || u.lastName ? `${u.firstName} ${u.lastName}`.trim() : u.email,
519
+ " ",
520
+ u.suspended ? (0, import_vue9.h)("span", { style: styles.badge }, "suspended") : null,
521
+ u.deletedAt ? (0, import_vue9.h)("span", { style: styles.badge }, "deleted") : null
522
+ ]),
523
+ (0, import_vue9.h)("table", { style: styles.table }, [
524
+ (0, import_vue9.h)("tbody", [
525
+ row("id", (0, import_vue9.h)("span", { style: styles.mono }, u.id)),
526
+ row("email", [u.email, " \xB7 verified ", yesNo(u.isEmailVerified)]),
527
+ row("MFA", yesNo(u.mfaEnabled)),
528
+ row(
529
+ "provider",
530
+ `${u.provider || "password"}${u.hasPassword ? "" : " \xB7 no password set"}`
531
+ ),
532
+ row(
533
+ "last login",
534
+ u.lastLogin ? new Date(u.lastLogin).toLocaleString() : (0, import_vue9.h)("span", { style: styles.muted }, "never")
535
+ ),
536
+ row("created", new Date(u.createdAt).toLocaleString())
537
+ ])
538
+ ]),
539
+ (0, import_vue9.h)("div", { style: { ...styles.toolbar, marginTop: "12px" } }, [
540
+ u.suspended ? refreshButton("Unsuspend", isLoading.value, () => void unsuspend()) : refreshButton("Suspend", isLoading.value, () => void suspend()),
541
+ refreshButton(
542
+ "Sign out everywhere",
543
+ isLoading.value,
544
+ () => void revokeSessions().then(() => sessions.refresh())
545
+ )
546
+ ]),
547
+ (0, import_vue9.h)("h2", { style: styles.subtitle }, "Live sessions"),
548
+ sessions.sessions.value.length === 0 ? (0, import_vue9.h)("p", { style: styles.muted }, "None.") : (0, import_vue9.h)(
549
+ "ul",
550
+ { style: styles.list },
551
+ sessions.sessions.value.map(
552
+ (s) => (0, import_vue9.h)("li", { key: s.id, style: styles.row }, [
553
+ (0, import_vue9.h)("span", { style: styles.mono }, s.ipAddress ?? "\u2014"),
554
+ " ",
555
+ (0, import_vue9.h)("span", { style: styles.muted }, s.userAgent ?? ""),
556
+ " ",
557
+ (0, import_vue9.h)(
558
+ "span",
559
+ { style: styles.muted },
560
+ `since ${new Date(s.createdAt).toLocaleString()}`
561
+ )
562
+ ])
563
+ )
564
+ ),
565
+ (0, import_vue9.h)("h2", { style: styles.subtitle }, "Recent sign-ins"),
566
+ history.events.value.length === 0 && !history.isLoading.value ? (0, import_vue9.h)("p", { style: styles.muted }, "None recorded.") : (0, import_vue9.h)(
567
+ "ul",
568
+ { style: styles.list },
569
+ history.events.value.map(
570
+ (e) => (0, import_vue9.h)("li", { key: e.id, style: styles.row }, [
571
+ (0, import_vue9.h)(
572
+ "span",
573
+ { style: e.outcome === "success" ? styles.ok : styles.bad },
574
+ e.outcome
575
+ ),
576
+ " ",
577
+ (0, import_vue9.h)("span", { style: styles.muted }, e.method),
578
+ " ",
579
+ (0, import_vue9.h)("span", { style: styles.muted }, new Date(e.createdAt).toLocaleString())
580
+ ])
581
+ )
582
+ ),
583
+ history.hasMore.value && !history.isLoading.value ? (0, import_vue9.h)(
584
+ "button",
585
+ {
586
+ type: "button",
587
+ style: { ...styles.button, marginTop: "8px" },
588
+ onClick: () => void history.loadMore()
589
+ },
590
+ "Load more"
591
+ ) : null
592
+ ] : null
593
+ ]);
594
+ };
595
+ }
596
+ });
597
+
463
598
  // src/screens/AdminShell.ts
464
599
  var NAV = [
465
600
  { group: "Today", items: [{ page: "attention", label: "Attention" }] },
@@ -472,6 +607,7 @@ var NAV = [
472
607
  { page: "routes", label: "Routes" }
473
608
  ]
474
609
  },
610
+ { group: "People", items: [{ page: "users", label: "Users", needs: "auth" }] },
475
611
  { group: "Settings", items: [{ page: "settings", label: "Config & secrets", needs: "config" }] },
476
612
  { group: "Messaging", items: [{ page: "templates", label: "Templates", needs: "courier" }] },
477
613
  {
@@ -482,7 +618,7 @@ var NAV = [
482
618
  ]
483
619
  }
484
620
  ];
485
- var AdminShell = (0, import_vue9.defineComponent)({
621
+ var AdminShell = (0, import_vue10.defineComponent)({
486
622
  name: "FonderieAdminShell",
487
623
  props: {
488
624
  client: { type: Object, required: true },
@@ -490,6 +626,8 @@ var AdminShell = (0, import_vue9.defineComponent)({
490
626
  // `prefix: '/_admin'` to go through the one token.
491
627
  configClient: { type: Object, default: void 0 },
492
628
  courierClient: { type: Object, default: void 0 },
629
+ // Given ⇒ the People page (users) appears; needs @fonderie/auth ≥ 7.8.
630
+ authClient: { type: Object, default: void 0 },
493
631
  environment: { type: String, default: void 0 },
494
632
  // Controlled navigation: pass `page` and listen to `navigate` to own the
495
633
  // URL. Omit `page` and the shell keeps it itself.
@@ -497,15 +635,15 @@ var AdminShell = (0, import_vue9.defineComponent)({
497
635
  },
498
636
  emits: { navigate: (_page) => true },
499
637
  setup(props, { emit }) {
500
- const own = (0, import_vue9.ref)("attention");
501
- const current = (0, import_vue9.computed)(() => props.page ?? own.value);
502
- const editing = (0, import_vue9.ref)(null);
638
+ const own = (0, import_vue10.ref)("attention");
639
+ const current = (0, import_vue10.computed)(() => props.page ?? own.value);
640
+ const editing = (0, import_vue10.ref)(null);
503
641
  const go = (p) => {
504
642
  editing.value = null;
505
643
  emit("navigate", p);
506
644
  if (props.page === void 0) own.value = p;
507
645
  };
508
- const back = () => (0, import_vue9.h)(
646
+ const back = () => (0, import_vue10.h)(
509
647
  "button",
510
648
  { type: "button", style: styles.button, onClick: () => editing.value = null },
511
649
  "\u2190 Back"
@@ -514,23 +652,25 @@ var AdminShell = (0, import_vue9.defineComponent)({
514
652
  const c = props.client;
515
653
  switch (current.value) {
516
654
  case "attention":
517
- return (0, import_vue9.h)(AttentionScreen, { client: c });
655
+ return (0, import_vue10.h)(AttentionScreen, { client: c });
518
656
  case "modules":
519
- return (0, import_vue9.h)(ModulesScreen, { client: c });
657
+ return (0, import_vue10.h)(ModulesScreen, { client: c });
520
658
  case "doctor":
521
- return (0, import_vue9.h)(DoctorScreen, { client: c });
659
+ return (0, import_vue10.h)(DoctorScreen, { client: c });
522
660
  case "config":
523
- return (0, import_vue9.h)(ConfigScreen, { client: c });
661
+ return (0, import_vue10.h)(ConfigScreen, { client: c });
524
662
  case "routes":
525
- return (0, import_vue9.h)(RoutesScreen, { client: c });
663
+ return (0, import_vue10.h)(RoutesScreen, { client: c });
526
664
  case "tokens":
527
- return (0, import_vue9.h)(TokensScreen, { client: c });
665
+ return (0, import_vue10.h)(TokensScreen, { client: c });
528
666
  case "log":
529
- return (0, import_vue9.h)(AdminLogScreen, { client: c });
667
+ return (0, import_vue10.h)(AdminLogScreen, { client: c });
668
+ case "users":
669
+ return props.authClient ? (0, import_vue10.h)(UsersScreen, { client: props.authClient }) : (0, import_vue10.h)("p", { style: styles.status }, "Pass an AuthAdminClient to look up users here.");
530
670
  case "settings": {
531
671
  const cc = props.configClient;
532
672
  if (!cc)
533
- return (0, import_vue9.h)(
673
+ return (0, import_vue10.h)(
534
674
  "p",
535
675
  { style: styles.status },
536
676
  "Pass a ConfigAdminClient to manage config and secrets here."
@@ -539,7 +679,7 @@ var AdminShell = (0, import_vue9.defineComponent)({
539
679
  if (e && e.kind !== "template")
540
680
  return [
541
681
  back(),
542
- (0, import_vue9.h)(import_vue_config_admin_screens.ConfigEditorScreen, {
682
+ (0, import_vue10.h)(import_vue_config_admin_screens.ConfigEditorScreen, {
543
683
  client: cc,
544
684
  kind: e.kind,
545
685
  configKey: e.key,
@@ -547,7 +687,7 @@ var AdminShell = (0, import_vue9.defineComponent)({
547
687
  onSaved: () => editing.value = null
548
688
  })
549
689
  ];
550
- return (0, import_vue9.h)(import_vue_config_admin_screens.ConfigListScreen, {
690
+ return (0, import_vue10.h)(import_vue_config_admin_screens.ConfigListScreen, {
551
691
  client: cc,
552
692
  ...props.environment !== void 0 ? { environment: props.environment } : {},
553
693
  "onSelect-config": (key) => editing.value = { kind: "config", key },
@@ -557,7 +697,7 @@ var AdminShell = (0, import_vue9.defineComponent)({
557
697
  case "templates": {
558
698
  const kc = props.courierClient;
559
699
  if (!kc)
560
- return (0, import_vue9.h)(
700
+ return (0, import_vue10.h)(
561
701
  "p",
562
702
  { style: styles.status },
563
703
  "Pass a CourierAdminClient to manage templates here."
@@ -566,32 +706,32 @@ var AdminShell = (0, import_vue9.defineComponent)({
566
706
  if (e?.kind === "template")
567
707
  return [
568
708
  back(),
569
- (0, import_vue9.h)(import_vue_courier_admin_screens.TemplateEditorScreen, {
709
+ (0, import_vue10.h)(import_vue_courier_admin_screens.TemplateEditorScreen, {
570
710
  client: kc,
571
711
  type: e.type,
572
712
  onSaved: () => editing.value = null
573
713
  })
574
714
  ];
575
- return (0, import_vue9.h)(import_vue_courier_admin_screens.TemplateListScreen, {
715
+ return (0, import_vue10.h)(import_vue_courier_admin_screens.TemplateListScreen, {
576
716
  client: kc,
577
717
  "onSelect-template": (t) => editing.value = { kind: "template", type: t.type }
578
718
  });
579
719
  }
580
720
  }
581
721
  };
582
- return () => (0, import_vue9.h)("div", { style: styles.shell }, [
583
- (0, import_vue9.h)(
722
+ return () => (0, import_vue10.h)("div", { style: styles.shell }, [
723
+ (0, import_vue10.h)(
584
724
  "nav",
585
725
  { style: styles.nav, "aria-label": "Admin" },
586
726
  NAV.map((g) => {
587
727
  const items = g.items.filter(
588
- (i) => !i.needs || (i.needs === "config" ? props.configClient : props.courierClient)
728
+ (i) => !i.needs || (i.needs === "config" ? props.configClient : i.needs === "courier" ? props.courierClient : props.authClient)
589
729
  );
590
730
  if (items.length === 0) return null;
591
- return (0, import_vue9.h)("div", { key: g.group }, [
592
- (0, import_vue9.h)("div", { style: styles.navGroup }, g.group),
731
+ return (0, import_vue10.h)("div", { key: g.group }, [
732
+ (0, import_vue10.h)("div", { style: styles.navGroup }, g.group),
593
733
  ...items.map(
594
- (i) => (0, import_vue9.h)(
734
+ (i) => (0, import_vue10.h)(
595
735
  "button",
596
736
  {
597
737
  key: i.page,
@@ -609,7 +749,7 @@ var AdminShell = (0, import_vue9.defineComponent)({
609
749
  ]);
610
750
  })
611
751
  ),
612
- (0, import_vue9.h)("main", { style: styles.main }, body())
752
+ (0, import_vue10.h)("main", { style: styles.main }, body())
613
753
  ]);
614
754
  }
615
755
  });
@@ -622,6 +762,7 @@ var AdminShell = (0, import_vue9.defineComponent)({
622
762
  DoctorScreen,
623
763
  ModulesScreen,
624
764
  RoutesScreen,
625
- TokensScreen
765
+ TokensScreen,
766
+ UsersScreen
626
767
  });
627
768
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/screens/AdminShell.ts","../src/styles.ts","../src/screens/AdminLogScreen.ts","../src/screens/common.ts","../src/screens/AttentionScreen.ts","../src/screens/ConfigScreen.ts","../src/screens/DoctorScreen.ts","../src/screens/ModulesScreen.ts","../src/screens/RoutesScreen.ts","../src/screens/TokensScreen.ts"],"sourcesContent":["export type { AdminPage } from './screens';\nexport {\n\tAdminLogScreen,\n\tAdminShell,\n\tAttentionScreen,\n\tConfigScreen,\n\tDoctorScreen,\n\tModulesScreen,\n\tRoutesScreen,\n\tTokensScreen,\n} from './screens';\n","import type { AdminClient, ConfigAdminClient, CourierAdminClient } from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/vue-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/vue-courier-admin-screens';\nimport type { PropType, VNode } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { AdminLogScreen } from './AdminLogScreen';\nimport { AttentionScreen } from './AttentionScreen';\nimport { ConfigScreen } from './ConfigScreen';\nimport { DoctorScreen } from './DoctorScreen';\nimport { ModulesScreen } from './ModulesScreen';\nimport { RoutesScreen } from './RoutesScreen';\nimport { TokensScreen } from './TokensScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'config'\n\t| 'routes'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates';\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{ page: AdminPage; label: string; needs?: 'config' | 'courier' }>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'config', label: 'Configuration' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t],\n\t},\n];\n\ntype Editing =\n\t| { kind: 'config' | 'secret'; key: string }\n\t| { kind: 'template'; type: string }\n\t| null;\n\nexport const AdminShell = defineComponent({\n\tname: 'FonderieAdminShell',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\t// Given ⇒ the Settings and Messaging pages appear. Construct them with\n\t\t// `prefix: '/_admin'` to go through the one token.\n\t\tconfigClient: { type: Object as PropType<ConfigAdminClient>, default: undefined },\n\t\tcourierClient: { type: Object as PropType<CourierAdminClient>, default: undefined },\n\t\tenvironment: { type: String, default: undefined },\n\t\t// Controlled navigation: pass `page` and listen to `navigate` to own the\n\t\t// URL. Omit `page` and the shell keeps it itself.\n\t\tpage: { type: String as PropType<AdminPage>, default: undefined },\n\t},\n\temits: { navigate: (_page: AdminPage) => true },\n\tsetup(props, { emit }) {\n\t\tconst own = ref<AdminPage>('attention');\n\t\tconst current = computed(() => props.page ?? own.value);\n\t\tconst editing = ref<Editing>(null);\n\t\tconst go = (p: AdminPage) => {\n\t\t\tediting.value = null;\n\t\t\temit('navigate', p);\n\t\t\tif (props.page === undefined) own.value = p;\n\t\t};\n\t\tconst back = () =>\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{ type: 'button', style: styles.button, onClick: () => (editing.value = null) },\n\t\t\t\t'← Back',\n\t\t\t);\n\n\t\tconst body = (): VNode | VNode[] => {\n\t\t\tconst c = props.client;\n\t\t\tswitch (current.value) {\n\t\t\t\tcase 'attention':\n\t\t\t\t\treturn h(AttentionScreen, { client: c });\n\t\t\t\tcase 'modules':\n\t\t\t\t\treturn h(ModulesScreen, { client: c });\n\t\t\t\tcase 'doctor':\n\t\t\t\t\treturn h(DoctorScreen, { client: c });\n\t\t\t\tcase 'config':\n\t\t\t\t\treturn h(ConfigScreen, { client: c });\n\t\t\t\tcase 'routes':\n\t\t\t\t\treturn h(RoutesScreen, { client: c });\n\t\t\t\tcase 'tokens':\n\t\t\t\t\treturn h(TokensScreen, { client: c });\n\t\t\t\tcase 'log':\n\t\t\t\t\treturn h(AdminLogScreen, { client: c });\n\t\t\t\tcase 'settings': {\n\t\t\t\t\tconst cc = props.configClient;\n\t\t\t\t\tif (!cc)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t'Pass a ConfigAdminClient to manage config and secrets here.',\n\t\t\t\t\t\t);\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e && e.kind !== 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(),\n\t\t\t\t\t\t\th(ConfigEditorScreen, {\n\t\t\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t\t\tkind: e.kind,\n\t\t\t\t\t\t\t\tconfigKey: e.key,\n\t\t\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn h(ConfigListScreen, {\n\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t'onSelect-config': (key: string) => (editing.value = { kind: 'config', key }),\n\t\t\t\t\t\t'onSelect-secret': (key: string) => (editing.value = { kind: 'secret', key }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase 'templates': {\n\t\t\t\t\tconst kc = props.courierClient;\n\t\t\t\t\tif (!kc)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t'Pass a CourierAdminClient to manage templates here.',\n\t\t\t\t\t\t);\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e?.kind === 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(),\n\t\t\t\t\t\t\th(TemplateEditorScreen, {\n\t\t\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t\t\ttype: e.type,\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn h(TemplateListScreen, {\n\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t'onSelect-template': (t: { type: string }) =>\n\t\t\t\t\t\t\t(editing.value = { kind: 'template', type: t.type }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treturn () =>\n\t\t\th('div', { style: styles.shell }, [\n\t\t\t\th(\n\t\t\t\t\t'nav',\n\t\t\t\t\t{ style: styles.nav, 'aria-label': 'Admin' },\n\t\t\t\t\tNAV.map((g) => {\n\t\t\t\t\t\tconst items = g.items.filter(\n\t\t\t\t\t\t\t(i) => !i.needs || (i.needs === 'config' ? props.configClient : props.courierClient),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\t\treturn h('div', { key: g.group }, [\n\t\t\t\t\t\t\th('div', { style: styles.navGroup }, g.group),\n\t\t\t\t\t\t\t...items.map((i) =>\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tkey: i.page,\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t...styles.navItem,\n\t\t\t\t\t\t\t\t\t\t\t...(current.value === i.page ? styles.navItemActive : {}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'aria-current': current.value === i.page ? 'page' : undefined,\n\t\t\t\t\t\t\t\t\t\tonClick: () => go(i.page),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ti.label,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]);\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\th('main', { style: styles.main }, body()),\n\t\t\t]);\n\t},\n});\n","import type { CSSProperties } from 'vue';\n\n// One palette for every admin page; the same values as the config and courier\n// admin screens so the shell reads as one surface.\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: 'system-ui, sans-serif',\n\t\tcolor: '#111',\n\t},\n\tnav: { width: '220px', borderRight: '1px solid #eee', padding: '16px', flexShrink: 0 },\n\tnavGroup: {\n\t\tfontSize: '11px',\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: '0.6px',\n\t\tcolor: '#888',\n\t\tmargin: '16px 0 6px',\n\t},\n\tnavItem: {\n\t\tdisplay: 'block',\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: '6px',\n\t\tpadding: '6px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: '14px',\n\t\tcolor: '#111',\n\t},\n\tnavItemActive: { background: '#f3f4f6', fontWeight: 600 },\n\tmain: { flex: 1, padding: '24px', maxWidth: '960px' },\n\tcontainer: { padding: '24px', maxWidth: '960px' },\n\ttitle: { fontSize: '20px', fontWeight: 700, marginTop: 0, marginBottom: '12px' },\n\tsubtitle: { fontSize: '15px', fontWeight: 600, marginTop: '24px', marginBottom: '8px' },\n\tstatus: { padding: '12px', color: '#666' },\n\terror: { color: '#e11d48', marginBottom: '12px', fontSize: '14px' },\n\tok: { color: '#15803d', fontWeight: 600 },\n\tbad: { color: '#e11d48', fontWeight: 600 },\n\tadvice: { color: '#b45309' },\n\tmuted: { color: '#666', fontSize: '13px' },\n\tmono: { fontFamily: 'ui-monospace, monospace', fontSize: '13px' },\n\ttable: { width: '100%', borderCollapse: 'collapse', fontSize: '14px' },\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: '1px solid #ddd',\n\t\tpadding: '6px 8px',\n\t\tfontWeight: 600,\n\t\tcolor: '#444',\n\t},\n\ttd: { borderBottom: '1px solid #eee', padding: '6px 8px', verticalAlign: 'top' },\n\tlist: { listStyle: 'none', padding: 0, margin: 0 },\n\trow: { borderBottom: '1px solid #eee', padding: '8px 0' },\n\tbadge: {\n\t\tdisplay: 'inline-block',\n\t\tborderRadius: '999px',\n\t\tpadding: '1px 8px',\n\t\tfontSize: '12px',\n\t\tbackground: '#f3f4f6',\n\t},\n\tbutton: {\n\t\tbackground: 'none',\n\t\tborder: '1px solid #ddd',\n\t\tborderRadius: '8px',\n\t\tpadding: '4px 10px',\n\t\tcursor: 'pointer',\n\t\tfontSize: '13px',\n\t},\n\ttoolbar: { display: 'flex', gap: '8px', alignItems: 'center', marginBottom: '12px' },\n};\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\nexport const AdminLogScreen = defineComponent({\n\tname: 'FonderieAdminLogScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(props.client, {\n\t\t\tlimit: props.pageSize,\n\t\t});\n\t\treturn () =>\n\t\t\th('div', { style: styles.container }, [\n\t\t\t\th('div', { style: styles.toolbar }, [\n\t\t\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, 'Admin log'),\n\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t]),\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 404\n\t\t\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t\t\t: error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: [\n\t\t\t\t\t\t\ttable(\n\t\t\t\t\t\t\t\t['When', 'Actor', 'Request', 'Status', 'Module'],\n\t\t\t\t\t\t\t\tentries.value.map((e) =>\n\t\t\t\t\t\t\t\t\th('tr', { key: e.id }, [\n\t\t\t\t\t\t\t\t\t\ttd(new Date(e.at).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\t\ttd(e.actor),\n\t\t\t\t\t\t\t\t\t\ttd(`${e.method} ${e.path}`, styles.mono),\n\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t{ style: e.status >= 400 ? styles.bad : styles.ok },\n\t\t\t\t\t\t\t\t\t\t\t\tString(e.status),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `${e.durationMs} ms`),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\ttd(e.module, styles.muted),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tisLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '12px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t],\n\t\t\t]);\n\t},\n});\n","import type { FonderieApiError } from '@fonderie/client';\nimport type { Ref, VNode } from 'vue';\nimport { h } from 'vue';\nimport { styles } from '../styles';\n\n// Shared frame: title (+ toolbar), then loading / error / content.\nexport function page(\n\ttitle: string,\n\tstate: { isLoading: Ref<boolean>; error: Ref<FonderieApiError | null> },\n\tcontent: () => VNode | VNode[] | null,\n\ttoolbar: VNode[] = [],\n\toptions: { loadingText?: string; errorText?: (e: FonderieApiError) => string } = {},\n): VNode {\n\tconst body = state.isLoading.value\n\t\t? h('p', { style: styles.status }, options.loadingText ?? 'Loading…')\n\t\t: state.error.value\n\t\t\t? h(\n\t\t\t\t\t'p',\n\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t(options.errorText ?? ((e) => e.explanation))(state.error.value),\n\t\t\t\t)\n\t\t\t: content();\n\treturn h('div', { style: styles.container }, [\n\t\th('div', { style: styles.toolbar }, [\n\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, title),\n\t\t\t...toolbar,\n\t\t]),\n\t\tbody,\n\t]);\n}\n\nexport function table(headers: string[], rows: VNode[]): VNode {\n\treturn h('table', { style: styles.table }, [\n\t\th('thead', [\n\t\t\th(\n\t\t\t\t'tr',\n\t\t\t\theaders.map((t) => h('th', { style: styles.th }, t)),\n\t\t\t),\n\t\t]),\n\t\th('tbody', rows),\n\t]);\n}\n\nexport const td = (children: VNode | string | (VNode | string)[], extra: object = {}) =>\n\th('td', { style: { ...styles.td, ...extra } }, children);\n\nexport const refreshButton = (label: string, disabled: boolean, onClick: () => void) =>\n\th('button', { type: 'button', style: styles.button, disabled, onClick }, label);\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\nexport const AttentionScreen = defineComponent({\n\tname: 'FonderieAttentionScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { attention, isLoading, error, refresh } = useAttention(props.client);\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Attention',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst a = attention.value;\n\t\t\t\t\tif (!a) return null;\n\t\t\t\t\tif (a.items.length === 0)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.ok },\n\t\t\t\t\t\t\t`Nothing needs you. Checked ${new Date(a.generatedAt).toLocaleString()}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\ta.items.map((item) =>\n\t\t\t\t\t\t\th('li', { key: `${item.source}:${item.message}`, style: styles.row }, [\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t{ style: item.severity === 'error' ? styles.bad : styles.advice },\n\t\t\t\t\t\t\t\t\titem.severity,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, item.source),\n\t\t\t\t\t\t\t\t` — ${item.message}`,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t[refreshButton('Refresh', isLoading.value, () => void refresh())],\n\t\t\t\t{ loadingText: 'Running the checks…' },\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminConfig } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page } from './common';\n\nexport const ConfigScreen = defineComponent({\n\tname: 'FonderieConfigScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminConfig(props.client);\n\t\treturn () =>\n\t\t\tpage('Configuration', { isLoading, error }, () => {\n\t\t\t\tconst r = report.value;\n\t\t\t\tif (!r) return null;\n\t\t\t\treturn [\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Readiness'),\n\t\t\t\t\th(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\tr.modules.map((m) =>\n\t\t\t\t\t\t\th('li', { key: m.name, style: styles.row }, [\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, m.name),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t...(m.problems.length === 0\n\t\t\t\t\t\t\t\t\t? [h('span', { style: styles.ok }, 'ok')]\n\t\t\t\t\t\t\t\t\t: m.problems.map((p) =>\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey: p.message,\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: p.severity === 'error' ? styles.bad : styles.advice,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\tp.message,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t)),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Environment'),\n\t\t\t\t\tr.env.length === 0\n\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No variables declared — pass `env` to AdminModule.')\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\tr.env.map((e) =>\n\t\t\t\t\t\t\t\t\th('li', { key: e.name, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, e.name),\n\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\th('span', { style: e.set ? styles.ok : styles.bad }, e.set ? 'set' : 'missing'),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\nexport const DoctorScreen = defineComponent({\n\tname: 'FonderieDoctorScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh } = useDoctor(props.client);\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Doctor',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst r = report.value;\n\t\t\t\t\tif (!r) return null;\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\tr.checks.map((c) =>\n\t\t\t\t\t\t\th('li', { key: c.name, style: styles.row }, [\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t{ style: c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\tc.skipped ? 'skipped' : c.ok ? 'ok' : 'failed',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, c.name),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `${c.module} · ${c.durationMs} ms`),\n\t\t\t\t\t\t\t\tc.skipped ? h('div', { style: styles.muted }, c.skipped) : null,\n\t\t\t\t\t\t\t\t...c.findings.map((f) =>\n\t\t\t\t\t\t\t\t\th('div', { key: f, style: c.ok ? styles.advice : styles.bad }, f),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\trefreshButton('Run again', isLoading.value, () => void refresh()),\n\t\t\t\t\treport.value && !isLoading.value\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: report.value.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\treport.value.ok ? 'all checks pass' : 'a check failed',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: h('span'),\n\t\t\t\t],\n\t\t\t\t{ loadingText: 'Running the checks…' },\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, table, td } from './common';\n\nexport const ModulesScreen = defineComponent({\n\tname: 'FonderieModulesScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { manifest, isLoading, error } = useManifest(props.client);\n\t\treturn () =>\n\t\t\tpage('Modules', { isLoading, error }, () => {\n\t\t\t\tconst m = manifest.value;\n\t\t\t\tif (!m) return null;\n\t\t\t\treturn [\n\t\t\t\t\th(\n\t\t\t\t\t\t'p',\n\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t`${m.env} · admin ${m.admin.version} · admin log ${m.admin.log ? 'on' : 'off'} · ${m.routes.length} routes`,\n\t\t\t\t\t),\n\t\t\t\t\ttable(\n\t\t\t\t\t\t['Module', 'Version', 'Readiness', 'Describes admin'],\n\t\t\t\t\t\tm.modules.map((mod) =>\n\t\t\t\t\t\t\th('tr', { key: mod.name }, [\n\t\t\t\t\t\t\t\ttd(mod.name, styles.mono),\n\t\t\t\t\t\t\t\ttd(mod.version ?? h('span', { style: styles.muted }, 'not reported')),\n\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t{ style: mod.readiness.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\t\tmod.readiness.ok ? 'ok' : 'error',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...mod.readiness.problems.map((p) =>\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tkey: p.message,\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: p.severity === 'error' ? styles.bad : styles.advice,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tp.message,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\ttd(mod.describesAdmin ? 'yes' : h('span', { style: styles.muted }, 'no')),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, table, td } from './common';\n\nexport const RoutesScreen = defineComponent({\n\tname: 'FonderieRoutesScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminRoutes(props.client);\n\t\treturn () =>\n\t\t\tpage('Routes', { isLoading, error }, () =>\n\t\t\t\ttable(\n\t\t\t\t\t['Method', 'Path', 'Guard', 'Module'],\n\t\t\t\t\t(report.value?.routes ?? []).map((r) =>\n\t\t\t\t\t\th('tr', { key: `${r.method} ${r.path}` }, [\n\t\t\t\t\t\t\ttd(r.method, styles.mono),\n\t\t\t\t\t\t\ttd(r.path, styles.mono),\n\t\t\t\t\t\t\ttd(h('span', { style: styles.badge }, r.guard)),\n\t\t\t\t\t\t\ttd(r.module ?? 'application', styles.muted),\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page } from './common';\n\nexport const TokensScreen = defineComponent({\n\tname: 'FonderieTokensScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminTokens(props.client);\n\t\treturn () =>\n\t\t\tpage('Access', { isLoading, error }, () => {\n\t\t\t\tconst r = report.value;\n\t\t\t\tif (!r) return null;\n\t\t\t\treturn [\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Admin token'),\n\t\t\t\t\th('p', [\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t{ style: r.admin.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\tr.admin.ok ? 'strong' : 'weak',\n\t\t\t\t\t\t),\n\t\t\t\t\t\t...r.admin.problems.map((p) =>\n\t\t\t\t\t\t\th('div', { key: p.message, style: styles.bad }, p.message),\n\t\t\t\t\t\t),\n\t\t\t\t\t]),\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Legacy per-brick tokens'),\n\t\t\t\t\tr.legacy.length === 0\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\"None — every brick's admin surface goes through this token.\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\tr.legacy.map((l) =>\n\t\t\t\t\t\t\t\t\th('li', { key: l.module, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, l.module),\n\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t\t'still registers its standalone routes with its own token (deprecated)',\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n"],"mappings":"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","names":["import_vue","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/screens/AdminShell.ts","../src/styles.ts","../src/screens/AdminLogScreen.ts","../src/screens/common.ts","../src/screens/AttentionScreen.ts","../src/screens/ConfigScreen.ts","../src/screens/DoctorScreen.ts","../src/screens/ModulesScreen.ts","../src/screens/RoutesScreen.ts","../src/screens/TokensScreen.ts","../src/screens/UsersScreen.ts"],"sourcesContent":["export type { AdminPage } from './screens';\nexport {\n\tAdminLogScreen,\n\tAdminShell,\n\tAttentionScreen,\n\tConfigScreen,\n\tDoctorScreen,\n\tModulesScreen,\n\tRoutesScreen,\n\tTokensScreen,\n\tUsersScreen,\n} from './screens';\n","import type {\n\tAdminClient,\n\tAuthAdminClient,\n\tConfigAdminClient,\n\tCourierAdminClient,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/vue-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/vue-courier-admin-screens';\nimport type { PropType, VNode } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { AdminLogScreen } from './AdminLogScreen';\nimport { AttentionScreen } from './AttentionScreen';\nimport { ConfigScreen } from './ConfigScreen';\nimport { DoctorScreen } from './DoctorScreen';\nimport { ModulesScreen } from './ModulesScreen';\nimport { RoutesScreen } from './RoutesScreen';\nimport { TokensScreen } from './TokensScreen';\nimport { UsersScreen } from './UsersScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'config'\n\t| 'routes'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users';\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{ page: AdminPage; label: string; needs?: 'config' | 'courier' | 'auth' }>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'config', label: 'Configuration' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'People', items: [{ page: 'users', label: 'Users', needs: 'auth' }] },\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t],\n\t},\n];\n\ntype Editing =\n\t| { kind: 'config' | 'secret'; key: string }\n\t| { kind: 'template'; type: string }\n\t| null;\n\nexport const AdminShell = defineComponent({\n\tname: 'FonderieAdminShell',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\t// Given ⇒ the Settings and Messaging pages appear. Construct them with\n\t\t// `prefix: '/_admin'` to go through the one token.\n\t\tconfigClient: { type: Object as PropType<ConfigAdminClient>, default: undefined },\n\t\tcourierClient: { type: Object as PropType<CourierAdminClient>, default: undefined },\n\t\t// Given ⇒ the People page (users) appears; needs @fonderie/auth ≥ 7.8.\n\t\tauthClient: { type: Object as PropType<AuthAdminClient>, default: undefined },\n\t\tenvironment: { type: String, default: undefined },\n\t\t// Controlled navigation: pass `page` and listen to `navigate` to own the\n\t\t// URL. Omit `page` and the shell keeps it itself.\n\t\tpage: { type: String as PropType<AdminPage>, default: undefined },\n\t},\n\temits: { navigate: (_page: AdminPage) => true },\n\tsetup(props, { emit }) {\n\t\tconst own = ref<AdminPage>('attention');\n\t\tconst current = computed(() => props.page ?? own.value);\n\t\tconst editing = ref<Editing>(null);\n\t\tconst go = (p: AdminPage) => {\n\t\t\tediting.value = null;\n\t\t\temit('navigate', p);\n\t\t\tif (props.page === undefined) own.value = p;\n\t\t};\n\t\tconst back = () =>\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{ type: 'button', style: styles.button, onClick: () => (editing.value = null) },\n\t\t\t\t'← Back',\n\t\t\t);\n\n\t\tconst body = (): VNode | VNode[] => {\n\t\t\tconst c = props.client;\n\t\t\tswitch (current.value) {\n\t\t\t\tcase 'attention':\n\t\t\t\t\treturn h(AttentionScreen, { client: c });\n\t\t\t\tcase 'modules':\n\t\t\t\t\treturn h(ModulesScreen, { client: c });\n\t\t\t\tcase 'doctor':\n\t\t\t\t\treturn h(DoctorScreen, { client: c });\n\t\t\t\tcase 'config':\n\t\t\t\t\treturn h(ConfigScreen, { client: c });\n\t\t\t\tcase 'routes':\n\t\t\t\t\treturn h(RoutesScreen, { client: c });\n\t\t\t\tcase 'tokens':\n\t\t\t\t\treturn h(TokensScreen, { client: c });\n\t\t\t\tcase 'log':\n\t\t\t\t\treturn h(AdminLogScreen, { client: c });\n\t\t\t\tcase 'users':\n\t\t\t\t\treturn props.authClient\n\t\t\t\t\t\t? h(UsersScreen, { client: props.authClient })\n\t\t\t\t\t\t: h('p', { style: styles.status }, 'Pass an AuthAdminClient to look up users here.');\n\t\t\t\tcase 'settings': {\n\t\t\t\t\tconst cc = props.configClient;\n\t\t\t\t\tif (!cc)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t'Pass a ConfigAdminClient to manage config and secrets here.',\n\t\t\t\t\t\t);\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e && e.kind !== 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(),\n\t\t\t\t\t\t\th(ConfigEditorScreen, {\n\t\t\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t\t\tkind: e.kind,\n\t\t\t\t\t\t\t\tconfigKey: e.key,\n\t\t\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn h(ConfigListScreen, {\n\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t'onSelect-config': (key: string) => (editing.value = { kind: 'config', key }),\n\t\t\t\t\t\t'onSelect-secret': (key: string) => (editing.value = { kind: 'secret', key }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase 'templates': {\n\t\t\t\t\tconst kc = props.courierClient;\n\t\t\t\t\tif (!kc)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t'Pass a CourierAdminClient to manage templates here.',\n\t\t\t\t\t\t);\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e?.kind === 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(),\n\t\t\t\t\t\t\th(TemplateEditorScreen, {\n\t\t\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t\t\ttype: e.type,\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn h(TemplateListScreen, {\n\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t'onSelect-template': (t: { type: string }) =>\n\t\t\t\t\t\t\t(editing.value = { kind: 'template', type: t.type }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treturn () =>\n\t\t\th('div', { style: styles.shell }, [\n\t\t\t\th(\n\t\t\t\t\t'nav',\n\t\t\t\t\t{ style: styles.nav, 'aria-label': 'Admin' },\n\t\t\t\t\tNAV.map((g) => {\n\t\t\t\t\t\tconst items = g.items.filter(\n\t\t\t\t\t\t\t(i) =>\n\t\t\t\t\t\t\t\t!i.needs ||\n\t\t\t\t\t\t\t\t(i.needs === 'config'\n\t\t\t\t\t\t\t\t\t? props.configClient\n\t\t\t\t\t\t\t\t\t: i.needs === 'courier'\n\t\t\t\t\t\t\t\t\t\t? props.courierClient\n\t\t\t\t\t\t\t\t\t\t: props.authClient),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\t\treturn h('div', { key: g.group }, [\n\t\t\t\t\t\t\th('div', { style: styles.navGroup }, g.group),\n\t\t\t\t\t\t\t...items.map((i) =>\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tkey: i.page,\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t...styles.navItem,\n\t\t\t\t\t\t\t\t\t\t\t...(current.value === i.page ? styles.navItemActive : {}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'aria-current': current.value === i.page ? 'page' : undefined,\n\t\t\t\t\t\t\t\t\t\tonClick: () => go(i.page),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ti.label,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]);\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\th('main', { style: styles.main }, body()),\n\t\t\t]);\n\t},\n});\n","import type { CSSProperties } from 'vue';\n\n// One palette for every admin page; the same values as the config and courier\n// admin screens so the shell reads as one surface.\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: 'system-ui, sans-serif',\n\t\tcolor: '#111',\n\t},\n\tnav: { width: '220px', borderRight: '1px solid #eee', padding: '16px', flexShrink: 0 },\n\tnavGroup: {\n\t\tfontSize: '11px',\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: '0.6px',\n\t\tcolor: '#888',\n\t\tmargin: '16px 0 6px',\n\t},\n\tnavItem: {\n\t\tdisplay: 'block',\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: '6px',\n\t\tpadding: '6px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: '14px',\n\t\tcolor: '#111',\n\t},\n\tnavItemActive: { background: '#f3f4f6', fontWeight: 600 },\n\tmain: { flex: 1, padding: '24px', maxWidth: '960px' },\n\tcontainer: { padding: '24px', maxWidth: '960px' },\n\ttitle: { fontSize: '20px', fontWeight: 700, marginTop: 0, marginBottom: '12px' },\n\tsubtitle: { fontSize: '15px', fontWeight: 600, marginTop: '24px', marginBottom: '8px' },\n\tstatus: { padding: '12px', color: '#666' },\n\terror: { color: '#e11d48', marginBottom: '12px', fontSize: '14px' },\n\tok: { color: '#15803d', fontWeight: 600 },\n\tbad: { color: '#e11d48', fontWeight: 600 },\n\tadvice: { color: '#b45309' },\n\tmuted: { color: '#666', fontSize: '13px' },\n\tmono: { fontFamily: 'ui-monospace, monospace', fontSize: '13px' },\n\ttable: { width: '100%', borderCollapse: 'collapse', fontSize: '14px' },\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: '1px solid #ddd',\n\t\tpadding: '6px 8px',\n\t\tfontWeight: 600,\n\t\tcolor: '#444',\n\t},\n\ttd: { borderBottom: '1px solid #eee', padding: '6px 8px', verticalAlign: 'top' },\n\tlist: { listStyle: 'none', padding: 0, margin: 0 },\n\trow: { borderBottom: '1px solid #eee', padding: '8px 0' },\n\tbadge: {\n\t\tdisplay: 'inline-block',\n\t\tborderRadius: '999px',\n\t\tpadding: '1px 8px',\n\t\tfontSize: '12px',\n\t\tbackground: '#f3f4f6',\n\t},\n\tbutton: {\n\t\tbackground: 'none',\n\t\tborder: '1px solid #ddd',\n\t\tborderRadius: '8px',\n\t\tpadding: '4px 10px',\n\t\tcursor: 'pointer',\n\t\tfontSize: '13px',\n\t},\n\ttoolbar: { display: 'flex', gap: '8px', alignItems: 'center', marginBottom: '12px' },\n};\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\nexport const AdminLogScreen = defineComponent({\n\tname: 'FonderieAdminLogScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(props.client, {\n\t\t\tlimit: props.pageSize,\n\t\t});\n\t\treturn () =>\n\t\t\th('div', { style: styles.container }, [\n\t\t\t\th('div', { style: styles.toolbar }, [\n\t\t\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, 'Admin log'),\n\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t]),\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 404\n\t\t\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t\t\t: error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: [\n\t\t\t\t\t\t\ttable(\n\t\t\t\t\t\t\t\t['When', 'Actor', 'Request', 'Status', 'Module'],\n\t\t\t\t\t\t\t\tentries.value.map((e) =>\n\t\t\t\t\t\t\t\t\th('tr', { key: e.id }, [\n\t\t\t\t\t\t\t\t\t\ttd(new Date(e.at).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\t\ttd(e.actor),\n\t\t\t\t\t\t\t\t\t\ttd(`${e.method} ${e.path}`, styles.mono),\n\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t{ style: e.status >= 400 ? styles.bad : styles.ok },\n\t\t\t\t\t\t\t\t\t\t\t\tString(e.status),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `${e.durationMs} ms`),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\ttd(e.module, styles.muted),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tisLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '12px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t],\n\t\t\t]);\n\t},\n});\n","import type { FonderieApiError } from '@fonderie/client';\nimport type { Ref, VNode } from 'vue';\nimport { h } from 'vue';\nimport { styles } from '../styles';\n\n// Shared frame: title (+ toolbar), then loading / error / content.\nexport function page(\n\ttitle: string,\n\tstate: { isLoading: Ref<boolean>; error: Ref<FonderieApiError | null> },\n\tcontent: () => VNode | VNode[] | null,\n\ttoolbar: VNode[] = [],\n\toptions: { loadingText?: string; errorText?: (e: FonderieApiError) => string } = {},\n): VNode {\n\tconst body = state.isLoading.value\n\t\t? h('p', { style: styles.status }, options.loadingText ?? 'Loading…')\n\t\t: state.error.value\n\t\t\t? h(\n\t\t\t\t\t'p',\n\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t(options.errorText ?? ((e) => e.explanation))(state.error.value),\n\t\t\t\t)\n\t\t\t: content();\n\treturn h('div', { style: styles.container }, [\n\t\th('div', { style: styles.toolbar }, [\n\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, title),\n\t\t\t...toolbar,\n\t\t]),\n\t\tbody,\n\t]);\n}\n\nexport function table(headers: string[], rows: VNode[]): VNode {\n\treturn h('table', { style: styles.table }, [\n\t\th('thead', [\n\t\t\th(\n\t\t\t\t'tr',\n\t\t\t\theaders.map((t) => h('th', { style: styles.th }, t)),\n\t\t\t),\n\t\t]),\n\t\th('tbody', rows),\n\t]);\n}\n\nexport const td = (children: VNode | string | (VNode | string)[], extra: object = {}) =>\n\th('td', { style: { ...styles.td, ...extra } }, children);\n\nexport const refreshButton = (label: string, disabled: boolean, onClick: () => void) =>\n\th('button', { type: 'button', style: styles.button, disabled, onClick }, label);\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\nexport const AttentionScreen = defineComponent({\n\tname: 'FonderieAttentionScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { attention, isLoading, error, refresh } = useAttention(props.client);\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Attention',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst a = attention.value;\n\t\t\t\t\tif (!a) return null;\n\t\t\t\t\tif (a.items.length === 0)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.ok },\n\t\t\t\t\t\t\t`Nothing needs you. Checked ${new Date(a.generatedAt).toLocaleString()}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\ta.items.map((item) =>\n\t\t\t\t\t\t\th('li', { key: `${item.source}:${item.message}`, style: styles.row }, [\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t{ style: item.severity === 'error' ? styles.bad : styles.advice },\n\t\t\t\t\t\t\t\t\titem.severity,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, item.source),\n\t\t\t\t\t\t\t\t` — ${item.message}`,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t[refreshButton('Refresh', isLoading.value, () => void refresh())],\n\t\t\t\t{ loadingText: 'Running the checks…' },\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminConfig } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page } from './common';\n\nexport const ConfigScreen = defineComponent({\n\tname: 'FonderieConfigScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminConfig(props.client);\n\t\treturn () =>\n\t\t\tpage('Configuration', { isLoading, error }, () => {\n\t\t\t\tconst r = report.value;\n\t\t\t\tif (!r) return null;\n\t\t\t\treturn [\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Readiness'),\n\t\t\t\t\th(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\tr.modules.map((m) =>\n\t\t\t\t\t\t\th('li', { key: m.name, style: styles.row }, [\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, m.name),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t...(m.problems.length === 0\n\t\t\t\t\t\t\t\t\t? [h('span', { style: styles.ok }, 'ok')]\n\t\t\t\t\t\t\t\t\t: m.problems.map((p) =>\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey: p.message,\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: p.severity === 'error' ? styles.bad : styles.advice,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\tp.message,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t)),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Environment'),\n\t\t\t\t\tr.env.length === 0\n\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No variables declared — pass `env` to AdminModule.')\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\tr.env.map((e) =>\n\t\t\t\t\t\t\t\t\th('li', { key: e.name, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, e.name),\n\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\th('span', { style: e.set ? styles.ok : styles.bad }, e.set ? 'set' : 'missing'),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\nexport const DoctorScreen = defineComponent({\n\tname: 'FonderieDoctorScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh } = useDoctor(props.client);\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Doctor',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst r = report.value;\n\t\t\t\t\tif (!r) return null;\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\tr.checks.map((c) =>\n\t\t\t\t\t\t\th('li', { key: c.name, style: styles.row }, [\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t{ style: c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\tc.skipped ? 'skipped' : c.ok ? 'ok' : 'failed',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, c.name),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `${c.module} · ${c.durationMs} ms`),\n\t\t\t\t\t\t\t\tc.skipped ? h('div', { style: styles.muted }, c.skipped) : null,\n\t\t\t\t\t\t\t\t...c.findings.map((f) =>\n\t\t\t\t\t\t\t\t\th('div', { key: f, style: c.ok ? styles.advice : styles.bad }, f),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\trefreshButton('Run again', isLoading.value, () => void refresh()),\n\t\t\t\t\treport.value && !isLoading.value\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: report.value.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\treport.value.ok ? 'all checks pass' : 'a check failed',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: h('span'),\n\t\t\t\t],\n\t\t\t\t{ loadingText: 'Running the checks…' },\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, table, td } from './common';\n\nexport const ModulesScreen = defineComponent({\n\tname: 'FonderieModulesScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { manifest, isLoading, error } = useManifest(props.client);\n\t\treturn () =>\n\t\t\tpage('Modules', { isLoading, error }, () => {\n\t\t\t\tconst m = manifest.value;\n\t\t\t\tif (!m) return null;\n\t\t\t\treturn [\n\t\t\t\t\th(\n\t\t\t\t\t\t'p',\n\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t`${m.env} · admin ${m.admin.version} · admin log ${m.admin.log ? 'on' : 'off'} · ${m.routes.length} routes`,\n\t\t\t\t\t),\n\t\t\t\t\ttable(\n\t\t\t\t\t\t['Module', 'Version', 'Readiness', 'Describes admin'],\n\t\t\t\t\t\tm.modules.map((mod) =>\n\t\t\t\t\t\t\th('tr', { key: mod.name }, [\n\t\t\t\t\t\t\t\ttd(mod.name, styles.mono),\n\t\t\t\t\t\t\t\ttd(mod.version ?? h('span', { style: styles.muted }, 'not reported')),\n\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t{ style: mod.readiness.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\t\tmod.readiness.ok ? 'ok' : 'error',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...mod.readiness.problems.map((p) =>\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tkey: p.message,\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: p.severity === 'error' ? styles.bad : styles.advice,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tp.message,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\ttd(mod.describesAdmin ? 'yes' : h('span', { style: styles.muted }, 'no')),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, table, td } from './common';\n\nexport const RoutesScreen = defineComponent({\n\tname: 'FonderieRoutesScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminRoutes(props.client);\n\t\treturn () =>\n\t\t\tpage('Routes', { isLoading, error }, () =>\n\t\t\t\ttable(\n\t\t\t\t\t['Method', 'Path', 'Guard', 'Module'],\n\t\t\t\t\t(report.value?.routes ?? []).map((r) =>\n\t\t\t\t\t\th('tr', { key: `${r.method} ${r.path}` }, [\n\t\t\t\t\t\t\ttd(r.method, styles.mono),\n\t\t\t\t\t\t\ttd(r.path, styles.mono),\n\t\t\t\t\t\t\ttd(h('span', { style: styles.badge }, r.guard)),\n\t\t\t\t\t\t\ttd(r.module ?? 'application', styles.muted),\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page } from './common';\n\nexport const TokensScreen = defineComponent({\n\tname: 'FonderieTokensScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminTokens(props.client);\n\t\treturn () =>\n\t\t\tpage('Access', { isLoading, error }, () => {\n\t\t\t\tconst r = report.value;\n\t\t\t\tif (!r) return null;\n\t\t\t\treturn [\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Admin token'),\n\t\t\t\t\th('p', [\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t{ style: r.admin.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\tr.admin.ok ? 'strong' : 'weak',\n\t\t\t\t\t\t),\n\t\t\t\t\t\t...r.admin.problems.map((p) =>\n\t\t\t\t\t\t\th('div', { key: p.message, style: styles.bad }, p.message),\n\t\t\t\t\t\t),\n\t\t\t\t\t]),\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Legacy per-brick tokens'),\n\t\t\t\t\tr.legacy.length === 0\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\"None — every brick's admin surface goes through this token.\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\tr.legacy.map((l) =>\n\t\t\t\t\t\t\t\t\th('li', { key: l.module, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, l.module),\n\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t\t'still registers its standalone routes with its own token (deprecated)',\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AuthAdminClient } from '@fonderie/client';\nimport { useAdminLoginHistory, useAdminUser, useAdminUserSessions } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, td } from './common';\n\n// Why can't this person log in. Look up by email, see the account, its live\n// sessions and recent sign-ins; suspend, unsuspend, or sign them out everywhere.\nexport const UsersScreen = defineComponent({\n\tname: 'FonderieUsersScreen',\n\tprops: { client: { type: Object as PropType<AuthAdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst input = ref('');\n\t\tconst email = ref('');\n\t\tconst { user, isLoading, error, suspend, unsuspend, revokeSessions } = useAdminUser(\n\t\t\tprops.client,\n\t\t\t{ email },\n\t\t);\n\t\tconst userId = computed(() => user.value?.id ?? null);\n\t\tconst sessions = useAdminUserSessions(props.client, userId);\n\t\tconst history = useAdminLoginHistory(props.client, userId, { limit: 20 });\n\t\tconst yesNo = (v: boolean) =>\n\t\t\th('span', { style: v ? styles.ok : styles.muted }, v ? 'yes' : 'no');\n\t\tconst row = (k: string, v: unknown) => h('tr', [td(k), td(v as never)]);\n\n\t\treturn () => {\n\t\t\tconst u = user.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Users'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\temail.value = input.value.trim();\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\ttype: 'email',\n\t\t\t\t\t\t\tvalue: input.value,\n\t\t\t\t\t\t\tonInput: (e: Event) => (input.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\tplaceholder: 'email address',\n\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text', minWidth: '280px' },\n\t\t\t\t\t\t\t'aria-label': 'Email',\n\t\t\t\t\t\t}),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Look up',\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 404 ? 'No user with that email.' : error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\tu\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, [\n\t\t\t\t\t\t\t\tu.firstName || u.lastName ? `${u.firstName} ${u.lastName}`.trim() : u.email,\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\tu.suspended ? h('span', { style: styles.badge }, 'suspended') : null,\n\t\t\t\t\t\t\t\tu.deletedAt ? h('span', { style: styles.badge }, 'deleted') : null,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('table', { style: styles.table }, [\n\t\t\t\t\t\t\t\th('tbody', [\n\t\t\t\t\t\t\t\t\trow('id', h('span', { style: styles.mono }, u.id)),\n\t\t\t\t\t\t\t\t\trow('email', [u.email, ' · verified ', yesNo(u.isEmailVerified)]),\n\t\t\t\t\t\t\t\t\trow('MFA', yesNo(u.mfaEnabled)),\n\t\t\t\t\t\t\t\t\trow(\n\t\t\t\t\t\t\t\t\t\t'provider',\n\t\t\t\t\t\t\t\t\t\t`${u.provider || 'password'}${u.hasPassword ? '' : ' · no password set'}`,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trow(\n\t\t\t\t\t\t\t\t\t\t'last login',\n\t\t\t\t\t\t\t\t\t\tu.lastLogin\n\t\t\t\t\t\t\t\t\t\t\t? new Date(u.lastLogin).toLocaleString()\n\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, 'never'),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trow('created', new Date(u.createdAt).toLocaleString()),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('div', { style: { ...styles.toolbar, marginTop: '12px' } }, [\n\t\t\t\t\t\t\t\tu.suspended\n\t\t\t\t\t\t\t\t\t? refreshButton('Unsuspend', isLoading.value, () => void unsuspend())\n\t\t\t\t\t\t\t\t\t: refreshButton('Suspend', isLoading.value, () => void suspend()),\n\t\t\t\t\t\t\t\trefreshButton(\n\t\t\t\t\t\t\t\t\t'Sign out everywhere',\n\t\t\t\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t\t\t\t() => void revokeSessions().then(() => sessions.refresh()),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Live sessions'),\n\t\t\t\t\t\t\tsessions.sessions.value.length === 0\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'None.')\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\t\t\tsessions.sessions.value.map((s) =>\n\t\t\t\t\t\t\t\t\t\t\th('li', { key: s.id, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, s.ipAddress ?? '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, s.userAgent ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t\t\t\t`since ${new Date(s.createdAt).toLocaleString()}`,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Recent sign-ins'),\n\t\t\t\t\t\t\thistory.events.value.length === 0 && !history.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'None recorded.')\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\t\t\thistory.events.value.map((e) =>\n\t\t\t\t\t\t\t\t\t\t\th('li', { key: e.id, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: e.outcome === 'success' ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\t\t\t\t\te.outcome,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, e.method),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, new Date(e.createdAt).toLocaleString()),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\thistory.hasMore.value && !history.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void history.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n"],"mappings":"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","names":["import_vue","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue"]}