@fonderie/vue-admin-screens 0.7.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -25,8 +25,8 @@ __export(index_exports, {
25
25
  AttentionScreen: () => AttentionScreen,
26
26
  AuditScreen: () => AuditScreen,
27
27
  CatalogScreen: () => CatalogScreen,
28
- ConfigScreen: () => ConfigScreen,
29
28
  DoctorScreen: () => DoctorScreen,
29
+ EnvironmentScreen: () => EnvironmentScreen,
30
30
  MigrationsScreen: () => MigrationsScreen,
31
31
  ModulesScreen: () => ModulesScreen,
32
32
  RoutesScreen: () => RoutesScreen,
@@ -42,20 +42,49 @@ var import_vue_courier_admin_screens = require("@fonderie/vue-courier-admin-scre
42
42
  var import_vue14 = require("vue");
43
43
 
44
44
  // src/styles.ts
45
+ var t = {
46
+ text: "var(--fonderie-text,#171717)",
47
+ muted: "var(--fonderie-text-muted,#5c5c5c)",
48
+ bg: "var(--fonderie-bg,#fafafa)",
49
+ surface: "var(--fonderie-surface,#fff)",
50
+ surfaceAlt: "var(--fonderie-surface-alt,#fafafa)",
51
+ border: "var(--fonderie-border,#e0e0e0)",
52
+ borderLight: "var(--fonderie-border-light,#f5f5f5)",
53
+ accent: "var(--fonderie-accent,#00d294)",
54
+ accentStrong: "var(--fonderie-accent-strong,#009767)",
55
+ warning: "var(--fonderie-warning,#f5a623)",
56
+ danger: "var(--fonderie-danger,#e00)",
57
+ font: 'var(--fonderie-font,Inter,"Inter Fallback",-apple-system,BlinkMacSystemFont,"Helvetica Neue",system-ui,sans-serif)',
58
+ mono: 'var(--fonderie-mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace)',
59
+ radius: "var(--fonderie-radius,4px)",
60
+ radiusLg: "var(--fonderie-radius-lg,8px)",
61
+ trackingDisplay: "var(--fonderie-tracking-display,-0.05em)",
62
+ shadowCard: "var(--fonderie-shadow-card,0 2px 3px 0 rgba(0,0,0,.05))"
63
+ };
45
64
  var styles = {
46
65
  shell: {
47
66
  display: "flex",
48
67
  minHeight: "100vh",
49
- fontFamily: "system-ui, sans-serif",
50
- color: "#111"
68
+ fontFamily: t.font,
69
+ color: t.text,
70
+ background: t.bg
71
+ },
72
+ // The sidebar sits on the raised surface against the page canvas, which is
73
+ // what separates the two without a heavy rule between them.
74
+ nav: {
75
+ width: 220,
76
+ borderRight: `1px solid ${t.border}`,
77
+ padding: 16,
78
+ flexShrink: 0,
79
+ background: t.surface
51
80
  },
52
- nav: { width: "220px", borderRight: "1px solid #eee", padding: "16px", flexShrink: 0 },
53
81
  navGroup: {
54
- fontSize: "11px",
82
+ fontSize: 11,
55
83
  textTransform: "uppercase",
56
- letterSpacing: "0.6px",
57
- color: "#888",
58
- margin: "16px 0 6px"
84
+ letterSpacing: 0.6,
85
+ color: t.muted,
86
+ margin: "16px 0 6px",
87
+ fontWeight: 600
59
88
  },
60
89
  navItem: {
61
90
  display: "block",
@@ -63,51 +92,79 @@ var styles = {
63
92
  textAlign: "left",
64
93
  background: "none",
65
94
  border: "none",
66
- borderRadius: "6px",
95
+ borderRadius: t.radius,
67
96
  padding: "6px 8px",
68
97
  cursor: "pointer",
69
- fontSize: "14px",
70
- color: "#111"
98
+ fontSize: 14,
99
+ color: t.text,
100
+ fontFamily: "inherit"
101
+ },
102
+ navItemActive: { background: t.surfaceAlt, fontWeight: 600, color: t.accentStrong },
103
+ main: { flex: 1, padding: 24, maxWidth: 960 },
104
+ container: { padding: 24, maxWidth: 960 },
105
+ title: {
106
+ fontSize: 20,
107
+ fontWeight: 600,
108
+ marginTop: 0,
109
+ marginBottom: 12,
110
+ letterSpacing: t.trackingDisplay
71
111
  },
72
- navItemActive: { background: "#f3f4f6", fontWeight: 600 },
73
- main: { flex: 1, padding: "24px", maxWidth: "960px" },
74
- container: { padding: "24px", maxWidth: "960px" },
75
- title: { fontSize: "20px", fontWeight: 700, marginTop: 0, marginBottom: "12px" },
76
- subtitle: { fontSize: "15px", fontWeight: 600, marginTop: "24px", marginBottom: "8px" },
77
- status: { padding: "12px", color: "#666" },
78
- error: { color: "#e11d48", marginBottom: "12px", fontSize: "14px" },
79
- ok: { color: "#15803d", fontWeight: 600 },
80
- bad: { color: "#e11d48", fontWeight: 600 },
81
- advice: { color: "#b45309" },
82
- muted: { color: "#666", fontSize: "13px" },
83
- mono: { fontFamily: "ui-monospace, monospace", fontSize: "13px" },
84
- table: { width: "100%", borderCollapse: "collapse", fontSize: "14px" },
112
+ subtitle: {
113
+ fontSize: 15,
114
+ fontWeight: 600,
115
+ marginTop: 24,
116
+ marginBottom: 8,
117
+ letterSpacing: t.trackingDisplay
118
+ },
119
+ status: { padding: 12, color: t.muted },
120
+ error: { color: t.danger, marginBottom: 12, fontSize: 14 },
121
+ ok: { color: t.accentStrong, fontWeight: 600 },
122
+ bad: { color: t.danger, fontWeight: 600 },
123
+ advice: { color: t.warning },
124
+ muted: { color: t.muted, fontSize: 13 },
125
+ mono: { fontFamily: t.mono, fontSize: 13 },
126
+ table: { width: "100%", borderCollapse: "collapse", fontSize: 14 },
85
127
  th: {
86
128
  textAlign: "left",
87
- borderBottom: "1px solid #ddd",
129
+ borderBottom: `1px solid ${t.border}`,
88
130
  padding: "6px 8px",
89
131
  fontWeight: 600,
90
- color: "#444"
132
+ color: t.muted
91
133
  },
92
- td: { borderBottom: "1px solid #eee", padding: "6px 8px", verticalAlign: "top" },
134
+ td: { borderBottom: `1px solid ${t.borderLight}`, padding: "6px 8px", verticalAlign: "top" },
93
135
  list: { listStyle: "none", padding: 0, margin: 0 },
94
- row: { borderBottom: "1px solid #eee", padding: "8px 0" },
136
+ row: { borderBottom: `1px solid ${t.borderLight}`, padding: "8px 0" },
95
137
  badge: {
96
138
  display: "inline-block",
97
- borderRadius: "999px",
139
+ borderRadius: 999,
98
140
  padding: "1px 8px",
99
- fontSize: "12px",
100
- background: "#f3f4f6"
141
+ fontSize: 12,
142
+ background: t.surfaceAlt,
143
+ border: `1px solid ${t.border}`,
144
+ color: t.muted
101
145
  },
102
146
  button: {
103
- background: "none",
104
- border: "1px solid #ddd",
105
- borderRadius: "8px",
147
+ background: t.surface,
148
+ border: `1px solid ${t.border}`,
149
+ borderRadius: t.radius,
106
150
  padding: "4px 10px",
107
151
  cursor: "pointer",
108
- fontSize: "13px"
152
+ fontSize: 13,
153
+ color: t.text,
154
+ fontFamily: "inherit",
155
+ boxShadow: t.shadowCard
156
+ },
157
+ toolbar: { display: "flex", gap: 8, alignItems: "center", marginBottom: 12 },
158
+ // Surfaces the screens compose themselves, kept here so a card looks the
159
+ // same on every page rather than being re-invented per screen.
160
+ card: {
161
+ background: t.surface,
162
+ border: `1px solid ${t.border}`,
163
+ borderRadius: t.radiusLg,
164
+ padding: 16,
165
+ boxShadow: t.shadowCard
109
166
  },
110
- toolbar: { display: "flex", gap: "8px", alignItems: "center", marginBottom: "12px" }
167
+ accent: { color: t.accent }
111
168
  };
112
169
 
113
170
  // src/screens/AdminLogScreen.ts
@@ -135,7 +192,7 @@ function table(headers, rows) {
135
192
  (0, import_vue.h)("thead", [
136
193
  (0, import_vue.h)(
137
194
  "tr",
138
- headers.map((t) => (0, import_vue.h)("th", { style: styles.th }, t))
195
+ headers.map((t2) => (0, import_vue.h)("th", { style: styles.th }, t2))
139
196
  )
140
197
  ]),
141
198
  (0, import_vue.h)("tbody", rows)
@@ -243,14 +300,14 @@ var AttentionScreen = (0, import_vue3.defineComponent)({
243
300
  }
244
301
  });
245
302
 
246
- // src/screens/ConfigScreen.ts
303
+ // src/screens/EnvironmentScreen.ts
247
304
  var import_vue_admin3 = require("@fonderie/vue-admin");
248
305
  var import_vue4 = require("vue");
249
- var ConfigScreen = (0, import_vue4.defineComponent)({
250
- name: "FonderieConfigScreen",
306
+ var EnvironmentScreen = (0, import_vue4.defineComponent)({
307
+ name: "FonderieEnvironmentScreen",
251
308
  props: { client: { type: Object, required: true } },
252
309
  setup(props) {
253
- const { report, isLoading, error } = (0, import_vue_admin3.useAdminConfig)(props.client);
310
+ const { report, isLoading, error } = (0, import_vue_admin3.useAdminEnvironment)(props.client);
254
311
  return () => page("Configuration", { isLoading, error }, () => {
255
312
  const r = report.value;
256
313
  if (!r) return null;
@@ -554,8 +611,8 @@ var TokensScreen = (0, import_vue9.defineComponent)({
554
611
  name: name.value.trim(),
555
612
  scopes: scopes.value,
556
613
  ...days.value && Number.isInteger(d) && d > 0 ? { expiresInDays: d } : {}
557
- }).then((t) => {
558
- minted.value = { name: t.name, token: t.token };
614
+ }).then((t2) => {
615
+ minted.value = { name: t2.name, token: t2.token };
559
616
  name.value = "";
560
617
  days.value = "";
561
618
  }).catch(() => {
@@ -601,35 +658,35 @@ var TokensScreen = (0, import_vue9.defineComponent)({
601
658
  r?.issued && r.issued.length > 0 ? table(
602
659
  ["Name", "Scopes", "Created", "Expires", "Last used", ""],
603
660
  r.issued.map(
604
- (t) => (0, import_vue9.h)("tr", { key: t.id }, [
661
+ (t2) => (0, import_vue9.h)("tr", { key: t2.id }, [
605
662
  td([
606
- t.name,
607
- t.revokedAt ? (0, import_vue9.h)("span", { style: styles.badge }, " revoked") : ""
663
+ t2.name,
664
+ t2.revokedAt ? (0, import_vue9.h)("span", { style: styles.badge }, " revoked") : ""
608
665
  ]),
609
- td(t.scopes.join(", "), styles.mono),
666
+ td(t2.scopes.join(", "), styles.mono),
610
667
  td(
611
- `${new Date(t.createdAt).toLocaleDateString()} \xB7 ${t.createdBy}`,
668
+ `${new Date(t2.createdAt).toLocaleDateString()} \xB7 ${t2.createdBy}`,
612
669
  styles.muted
613
670
  ),
614
671
  td(
615
- t.expiresAt ? new Date(t.expiresAt).toLocaleDateString() : "never",
672
+ t2.expiresAt ? new Date(t2.expiresAt).toLocaleDateString() : "never",
616
673
  styles.muted
617
674
  ),
618
675
  td(
619
- t.lastUsedAt ? new Date(t.lastUsedAt).toLocaleString() : "never",
676
+ t2.lastUsedAt ? new Date(t2.lastUsedAt).toLocaleString() : "never",
620
677
  styles.muted
621
678
  ),
622
679
  td(
623
- t.revokedAt ? "" : (0, import_vue9.h)(
680
+ t2.revokedAt ? "" : (0, import_vue9.h)(
624
681
  "button",
625
682
  {
626
683
  type: "button",
627
684
  style: styles.button,
628
685
  onClick: () => {
629
686
  if (window.confirm(
630
- `Revoke "${t.name}"? Anything using it stops working immediately.`
687
+ `Revoke "${t2.name}"? Anything using it stops working immediately.`
631
688
  ))
632
- void revoke(t.id).catch(() => {
689
+ void revoke(t2.id).catch(() => {
633
690
  });
634
691
  }
635
692
  },
@@ -875,7 +932,7 @@ var CatalogScreen = (0, import_vue11.defineComponent)({
875
932
  {
876
933
  style: {
877
934
  ...styles.mono,
878
- background: "#f9fafb",
935
+ background: "var(--fonderie-surface-alt,#fafafa)",
879
936
  padding: "12px",
880
937
  overflowX: "auto"
881
938
  }
@@ -935,11 +992,11 @@ var SubscriberScreen = (0, import_vue12.defineComponent)({
935
992
  const subscriber = (0, import_vue12.ref)(null);
936
993
  const list = (0, import_vue_admin11.useAdminSubscribers)(props.client, { limit: props.pageSize });
937
994
  const { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } = (0, import_vue_admin11.useAdminSubscriber)(props.client, subscriber, { limit: 20 });
938
- const open = (t, id) => {
995
+ const open = (t2, id) => {
939
996
  granted.value = null;
940
- type.value = t;
997
+ type.value = t2;
941
998
  idInput.value = id;
942
- subscriber.value = { type: t, id };
999
+ subscriber.value = { type: t2, id };
943
1000
  };
944
1001
  const amount = (0, import_vue12.ref)("");
945
1002
  const note = (0, import_vue12.ref)("");
@@ -1119,11 +1176,11 @@ var SubscriberScreen = (0, import_vue12.defineComponent)({
1119
1176
  ledger.value.length === 0 ? (0, import_vue12.h)("p", { style: styles.muted }, "Nothing moved yet.") : table(
1120
1177
  ["When", "Kind", "Amount", "Note"],
1121
1178
  ledger.value.map(
1122
- (t) => (0, import_vue12.h)("tr", { key: t.id }, [
1123
- td(new Date(t.createdAt).toLocaleString(), styles.muted),
1124
- td(t.type),
1125
- td(t.amount, styles.mono),
1126
- td(t.description ?? "", styles.muted)
1179
+ (t2) => (0, import_vue12.h)("tr", { key: t2.id }, [
1180
+ td(new Date(t2.createdAt).toLocaleString(), styles.muted),
1181
+ td(t2.type),
1182
+ td(t2.amount, styles.mono),
1183
+ td(t2.description ?? "", styles.muted)
1127
1184
  ])
1128
1185
  )
1129
1186
  ),
@@ -1233,7 +1290,7 @@ var NAV = [
1233
1290
  group: "System",
1234
1291
  items: [
1235
1292
  { page: "modules", label: "Modules" },
1236
- { page: "config", label: "Configuration" },
1293
+ { page: "environment", label: "Environment" },
1237
1294
  { page: "doctor", label: "Doctor" },
1238
1295
  { page: "routes", label: "Routes" }
1239
1296
  ]
@@ -1301,8 +1358,8 @@ var AdminShell = (0, import_vue14.defineComponent)({
1301
1358
  return (0, import_vue14.h)(ModulesScreen, { client: c });
1302
1359
  case "doctor":
1303
1360
  return (0, import_vue14.h)(DoctorScreen, { client: c });
1304
- case "config":
1305
- return (0, import_vue14.h)(ConfigScreen, { client: c });
1361
+ case "environment":
1362
+ return (0, import_vue14.h)(EnvironmentScreen, { client: c });
1306
1363
  case "routes":
1307
1364
  return (0, import_vue14.h)(RoutesScreen, { client: c });
1308
1365
  case "tokens":
@@ -1378,7 +1435,7 @@ var AdminShell = (0, import_vue14.defineComponent)({
1378
1435
  ];
1379
1436
  return (0, import_vue14.h)(import_vue_courier_admin_screens.TemplateListScreen, {
1380
1437
  client: kc,
1381
- "onSelect-template": (t) => editing.value = { kind: "template", type: t.type }
1438
+ "onSelect-template": (t2) => editing.value = { kind: "template", type: t2.type }
1382
1439
  });
1383
1440
  }
1384
1441
  }
@@ -1424,8 +1481,8 @@ var AdminShell = (0, import_vue14.defineComponent)({
1424
1481
  AttentionScreen,
1425
1482
  AuditScreen,
1426
1483
  CatalogScreen,
1427
- ConfigScreen,
1428
1484
  DoctorScreen,
1485
+ EnvironmentScreen,
1429
1486
  MigrationsScreen,
1430
1487
  ModulesScreen,
1431
1488
  RoutesScreen,