@better-forge/ui 0.0.0-stage → 0.1.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.
Files changed (234) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -3
  3. package/dist/api/client.d.ts +42 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +130 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/components/ConfirmIdentityModal.d.ts +18 -0
  8. package/dist/components/ConfirmIdentityModal.d.ts.map +1 -0
  9. package/dist/components/ConfirmIdentityModal.js +30 -0
  10. package/dist/components/ConfirmIdentityModal.js.map +1 -0
  11. package/dist/components/ConfirmModal.d.ts +18 -0
  12. package/dist/components/ConfirmModal.d.ts.map +1 -0
  13. package/dist/components/ConfirmModal.js +11 -0
  14. package/dist/components/ConfirmModal.js.map +1 -0
  15. package/dist/components/CopyButton.d.ts +11 -0
  16. package/dist/components/CopyButton.d.ts.map +1 -0
  17. package/dist/components/CopyButton.js +44 -0
  18. package/dist/components/CopyButton.js.map +1 -0
  19. package/dist/components/CredentialSection.d.ts +38 -0
  20. package/dist/components/CredentialSection.d.ts.map +1 -0
  21. package/dist/components/CredentialSection.js +69 -0
  22. package/dist/components/CredentialSection.js.map +1 -0
  23. package/dist/components/ErrorBoundary.d.ts +18 -0
  24. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  25. package/dist/components/ErrorBoundary.js +25 -0
  26. package/dist/components/ErrorBoundary.js.map +1 -0
  27. package/dist/components/ModalShell.d.ts +58 -0
  28. package/dist/components/ModalShell.d.ts.map +1 -0
  29. package/dist/components/ModalShell.js +92 -0
  30. package/dist/components/ModalShell.js.map +1 -0
  31. package/dist/components/ResetTwoFactorModal.d.ts +14 -0
  32. package/dist/components/ResetTwoFactorModal.d.ts.map +1 -0
  33. package/dist/components/ResetTwoFactorModal.js +16 -0
  34. package/dist/components/ResetTwoFactorModal.js.map +1 -0
  35. package/dist/components/SidePanel.d.ts +35 -0
  36. package/dist/components/SidePanel.d.ts.map +1 -0
  37. package/dist/components/SidePanel.js +19 -0
  38. package/dist/components/SidePanel.js.map +1 -0
  39. package/dist/components/SingleSignOnModal.d.ts +4 -0
  40. package/dist/components/SingleSignOnModal.d.ts.map +1 -0
  41. package/dist/components/SingleSignOnModal.js +64 -0
  42. package/dist/components/SingleSignOnModal.js.map +1 -0
  43. package/dist/components/SsoConfirmation.d.ts +22 -0
  44. package/dist/components/SsoConfirmation.d.ts.map +1 -0
  45. package/dist/components/SsoConfirmation.js +87 -0
  46. package/dist/components/SsoConfirmation.js.map +1 -0
  47. package/dist/components/VaultTypePicker.d.ts +13 -0
  48. package/dist/components/VaultTypePicker.d.ts.map +1 -0
  49. package/dist/components/VaultTypePicker.js +62 -0
  50. package/dist/components/VaultTypePicker.js.map +1 -0
  51. package/dist/components/WhatsNew.d.ts +18 -0
  52. package/dist/components/WhatsNew.d.ts.map +1 -0
  53. package/dist/components/WhatsNew.js +50 -0
  54. package/dist/components/WhatsNew.js.map +1 -0
  55. package/dist/components/formParts.d.ts +40 -0
  56. package/dist/components/formParts.d.ts.map +1 -0
  57. package/dist/components/formParts.js +31 -0
  58. package/dist/components/formParts.js.map +1 -0
  59. package/dist/components/ui/Alert.d.ts +15 -0
  60. package/dist/components/ui/Alert.d.ts.map +1 -0
  61. package/dist/components/ui/Alert.js +14 -0
  62. package/dist/components/ui/Alert.js.map +1 -0
  63. package/dist/components/ui/DataTable.d.ts +52 -0
  64. package/dist/components/ui/DataTable.d.ts.map +1 -0
  65. package/dist/components/ui/DataTable.js +112 -0
  66. package/dist/components/ui/DataTable.js.map +1 -0
  67. package/dist/components/ui/Field.d.ts +27 -0
  68. package/dist/components/ui/Field.d.ts.map +1 -0
  69. package/dist/components/ui/Field.js +25 -0
  70. package/dist/components/ui/Field.js.map +1 -0
  71. package/dist/components/ui/PageHeader.d.ts +18 -0
  72. package/dist/components/ui/PageHeader.d.ts.map +1 -0
  73. package/dist/components/ui/PageHeader.js +10 -0
  74. package/dist/components/ui/PageHeader.js.map +1 -0
  75. package/dist/components/ui/Pagination.d.ts +21 -0
  76. package/dist/components/ui/Pagination.d.ts.map +1 -0
  77. package/dist/components/ui/Pagination.js +10 -0
  78. package/dist/components/ui/Pagination.js.map +1 -0
  79. package/dist/components/ui/QuickStartPanel.d.ts +21 -0
  80. package/dist/components/ui/QuickStartPanel.d.ts.map +1 -0
  81. package/dist/components/ui/QuickStartPanel.js +11 -0
  82. package/dist/components/ui/QuickStartPanel.js.map +1 -0
  83. package/dist/components/ui/StateViews.d.ts +50 -0
  84. package/dist/components/ui/StateViews.d.ts.map +1 -0
  85. package/dist/components/ui/StateViews.js +33 -0
  86. package/dist/components/ui/StateViews.js.map +1 -0
  87. package/dist/components/ui/Switch.d.ts +16 -0
  88. package/dist/components/ui/Switch.d.ts.map +1 -0
  89. package/dist/components/ui/Switch.js +15 -0
  90. package/dist/components/ui/Switch.js.map +1 -0
  91. package/dist/components/ui/Toast.d.ts +20 -0
  92. package/dist/components/ui/Toast.d.ts.map +1 -0
  93. package/dist/components/ui/Toast.js +46 -0
  94. package/dist/components/ui/Toast.js.map +1 -0
  95. package/dist/components/ui/index.d.ts +10 -0
  96. package/dist/components/ui/index.d.ts.map +1 -0
  97. package/dist/components/ui/index.js +10 -0
  98. package/dist/components/ui/index.js.map +1 -0
  99. package/dist/config.d.ts +46 -0
  100. package/dist/config.d.ts.map +1 -0
  101. package/dist/config.js +12 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/hooks/useDarkMode.d.ts +2 -0
  104. package/dist/hooks/useDarkMode.d.ts.map +1 -0
  105. package/dist/hooks/useDarkMode.js +37 -0
  106. package/dist/hooks/useDarkMode.js.map +1 -0
  107. package/dist/hooks/useDebouncedValue.d.ts +6 -0
  108. package/dist/hooks/useDebouncedValue.d.ts.map +1 -0
  109. package/dist/hooks/useDebouncedValue.js +19 -0
  110. package/dist/hooks/useDebouncedValue.js.map +1 -0
  111. package/dist/index.d.ts +36 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +36 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/lib/changelog.d.ts +32 -0
  116. package/dist/lib/changelog.d.ts.map +1 -0
  117. package/dist/lib/changelog.js +71 -0
  118. package/dist/lib/changelog.js.map +1 -0
  119. package/dist/lib/dateFormat.d.ts +24 -0
  120. package/dist/lib/dateFormat.d.ts.map +1 -0
  121. package/dist/lib/dateFormat.js +67 -0
  122. package/dist/lib/dateFormat.js.map +1 -0
  123. package/dist/navigation.d.ts +5 -0
  124. package/dist/navigation.d.ts.map +1 -0
  125. package/dist/navigation.js +7 -0
  126. package/dist/navigation.js.map +1 -0
  127. package/dist/pages/ApiTokens.d.ts +9 -0
  128. package/dist/pages/ApiTokens.d.ts.map +1 -0
  129. package/dist/pages/ApiTokens.js +116 -0
  130. package/dist/pages/ApiTokens.js.map +1 -0
  131. package/dist/pages/AuditLog.d.ts +14 -0
  132. package/dist/pages/AuditLog.d.ts.map +1 -0
  133. package/dist/pages/AuditLog.js +104 -0
  134. package/dist/pages/AuditLog.js.map +1 -0
  135. package/dist/pages/Backups.d.ts +2 -0
  136. package/dist/pages/Backups.d.ts.map +1 -0
  137. package/dist/pages/Backups.js +118 -0
  138. package/dist/pages/Backups.js.map +1 -0
  139. package/dist/pages/ChangePassword.d.ts +2 -0
  140. package/dist/pages/ChangePassword.d.ts.map +1 -0
  141. package/dist/pages/ChangePassword.js +40 -0
  142. package/dist/pages/ChangePassword.js.map +1 -0
  143. package/dist/pages/Login.d.ts +12 -0
  144. package/dist/pages/Login.d.ts.map +1 -0
  145. package/dist/pages/Login.js +69 -0
  146. package/dist/pages/Login.js.map +1 -0
  147. package/dist/pages/Settings.d.ts +2 -0
  148. package/dist/pages/Settings.d.ts.map +1 -0
  149. package/dist/pages/Settings.js +149 -0
  150. package/dist/pages/Settings.js.map +1 -0
  151. package/dist/pages/Setup.d.ts +2 -0
  152. package/dist/pages/Setup.d.ts.map +1 -0
  153. package/dist/pages/Setup.js +113 -0
  154. package/dist/pages/Setup.js.map +1 -0
  155. package/dist/pages/SsoConfirm.d.ts +3 -0
  156. package/dist/pages/SsoConfirm.d.ts.map +1 -0
  157. package/dist/pages/SsoConfirm.js +20 -0
  158. package/dist/pages/SsoConfirm.js.map +1 -0
  159. package/dist/pages/SsoTestResult.d.ts +2 -0
  160. package/dist/pages/SsoTestResult.d.ts.map +1 -0
  161. package/dist/pages/SsoTestResult.js +49 -0
  162. package/dist/pages/SsoTestResult.js.map +1 -0
  163. package/dist/pages/Users.d.ts +22 -0
  164. package/dist/pages/Users.d.ts.map +1 -0
  165. package/dist/pages/Users.js +124 -0
  166. package/dist/pages/Users.js.map +1 -0
  167. package/dist/pages/Vault.d.ts +2 -0
  168. package/dist/pages/Vault.d.ts.map +1 -0
  169. package/dist/pages/Vault.js +372 -0
  170. package/dist/pages/Vault.js.map +1 -0
  171. package/dist/shell/AdminShell.d.ts +46 -0
  172. package/dist/shell/AdminShell.d.ts.map +1 -0
  173. package/dist/shell/AdminShell.js +76 -0
  174. package/dist/shell/AdminShell.js.map +1 -0
  175. package/dist/shell/guards.d.ts +28 -0
  176. package/dist/shell/guards.d.ts.map +1 -0
  177. package/dist/shell/guards.js +71 -0
  178. package/dist/shell/guards.js.map +1 -0
  179. package/icons.json +170 -0
  180. package/package.json +71 -6
  181. package/src/api/client.ts +139 -0
  182. package/src/components/ConfirmIdentityModal.tsx +82 -0
  183. package/src/components/ConfirmModal.tsx +83 -0
  184. package/src/components/CopyButton.tsx +71 -0
  185. package/src/components/CredentialSection.tsx +270 -0
  186. package/src/components/ErrorBoundary.tsx +47 -0
  187. package/src/components/ModalShell.tsx +160 -0
  188. package/src/components/ResetTwoFactorModal.tsx +74 -0
  189. package/src/components/SidePanel.tsx +96 -0
  190. package/src/components/SingleSignOnModal.tsx +161 -0
  191. package/src/components/SsoConfirmation.tsx +96 -0
  192. package/src/components/VaultTypePicker.tsx +131 -0
  193. package/src/components/WhatsNew.tsx +84 -0
  194. package/src/components/formParts.tsx +59 -0
  195. package/src/components/ui/Alert.tsx +45 -0
  196. package/src/components/ui/DataTable.tsx +225 -0
  197. package/src/components/ui/Field.tsx +63 -0
  198. package/src/components/ui/PageHeader.tsx +36 -0
  199. package/src/components/ui/Pagination.tsx +37 -0
  200. package/src/components/ui/QuickStartPanel.tsx +57 -0
  201. package/src/components/ui/StateViews.tsx +135 -0
  202. package/src/components/ui/Switch.tsx +65 -0
  203. package/src/components/ui/Toast.tsx +104 -0
  204. package/src/components/ui/index.ts +9 -0
  205. package/src/config.ts +46 -0
  206. package/src/hooks/useDarkMode.ts +38 -0
  207. package/src/hooks/useDebouncedValue.ts +22 -0
  208. package/src/index.ts +42 -0
  209. package/src/lib/changelog.ts +93 -0
  210. package/src/lib/dateFormat.ts +90 -0
  211. package/src/navigation.ts +6 -0
  212. package/src/pages/ApiTokens.tsx +361 -0
  213. package/src/pages/AuditLog.tsx +388 -0
  214. package/src/pages/Backups.tsx +170 -0
  215. package/src/pages/ChangePassword.tsx +84 -0
  216. package/src/pages/Login.tsx +275 -0
  217. package/src/pages/Settings.tsx +264 -0
  218. package/src/pages/Setup.tsx +438 -0
  219. package/src/pages/SsoConfirm.tsx +26 -0
  220. package/src/pages/SsoTestResult.tsx +104 -0
  221. package/src/pages/Users.tsx +426 -0
  222. package/src/pages/Vault.tsx +1036 -0
  223. package/src/shell/AdminShell.tsx +256 -0
  224. package/src/shell/guards.tsx +88 -0
  225. package/styles/base.css +521 -0
  226. package/styles/fonts/inter-latin-1.woff2 +0 -0
  227. package/styles/fonts/inter-latin-ext.woff2 +0 -0
  228. package/styles/fonts/jetbrains-mono-latin-3.woff2 +0 -0
  229. package/styles/fonts/jetbrains-mono-latin-ext-2.woff2 +0 -0
  230. package/styles/fonts/manrope-latin-5.woff2 +0 -0
  231. package/styles/fonts/manrope-latin-ext-4.woff2 +0 -0
  232. package/styles/fonts/material-symbols-outlined-fill.woff2 +0 -0
  233. package/styles/icons.css +4 -0
  234. package/tailwind-preset.js +79 -0
@@ -0,0 +1,372 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useId, useState } from 'react';
3
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
4
+ import { api } from '../api/client';
5
+ import { ConfirmModal } from '../components/ConfirmModal';
6
+ import { CopyButton } from '../components/CopyButton';
7
+ import { Modal, ModalFooter, ModalHeader, ModalShell } from '../components/ModalShell';
8
+ import { SidePanelFrame, SideTabStrip } from '../components/SidePanel';
9
+ import { VAULT_TYPE_ICONS, VaultTypePicker, isReferenceVault } from '../components/VaultTypePicker';
10
+ import { Alert, EmptyState, EmptyStateLink, ErrorState, Field, LoadingState, useToast } from '../components/ui';
11
+ import { CredentialSection } from '../components/CredentialSection';
12
+ import { uiConfig } from '../config';
13
+ import { formatDate } from '../lib/dateFormat';
14
+ const EMPTY_CONNECTION = {
15
+ address: '', namespace: '', mount: 'secret', authMethod: 'token', token: '', roleId: '', secretId: '', approleMount: 'approle', caCert: '', credentialsRef: undefined,
16
+ };
17
+ /** The request body for a connection: a chosen secret replaces the typed credentials, direct input clears it. */
18
+ function connectionPayload(form) {
19
+ return { ...form, credentialsRef: form.credentialsRef ? { vaultId: form.credentialsRef.vaultId, secretId: form.credentialsRef.secretId, ...(Object.keys(form.credentialsRef.fieldMapping ?? {}).length > 0 && { fieldMapping: form.credentialsRef.fieldMapping }) } : null };
20
+ }
21
+ const VAULT_TYPE_LABELS = { local: 'LOCAL', hashicorp: 'HASHICORP VAULT' };
22
+ /**
23
+ * Local-vault secrets a HashiCorp connection can take its credentials from. Only local vaults are offered,
24
+ * so a connection never depends on another external vault.
25
+ */
26
+ function useLocalSecretPicker(vaults) {
27
+ const [secretsByVault, setSecretsByVault] = useState({});
28
+ const loadSecrets = useCallback(async (vaultId) => {
29
+ try {
30
+ const secrets = await api.get(`/admin/vaults/${vaultId}/secrets`);
31
+ setSecretsByVault((prev) => ({ ...prev, [vaultId]: secrets }));
32
+ }
33
+ catch { /* the picker simply stays empty */ }
34
+ }, []);
35
+ return { vaults: vaults.filter((v) => v.type === 'local'), secretsByVault, onLoadSecrets: loadSecrets };
36
+ }
37
+ function errorMessage(err, fallback) {
38
+ return err instanceof Error && err.message ? err.message : fallback;
39
+ }
40
+ // ── Main page ──────────────────────────────────────────────────────────────────
41
+ export default function VaultPage() {
42
+ const qc = useQueryClient();
43
+ const toast = useToast();
44
+ const [selectedVaultId, setSelectedVaultId] = useState(null);
45
+ const [showCreateVault, setShowCreateVault] = useState(false);
46
+ const [showCreateSecret, setShowCreateSecret] = useState(false);
47
+ const [revealedSecret, setRevealedSecret] = useState(null);
48
+ const [revealing, setRevealing] = useState(null);
49
+ const [deleteVaultTarget, setDeleteVaultTarget] = useState(null);
50
+ const [deleteSecretTarget, setDeleteSecretTarget] = useState(null);
51
+ const [showConnection, setShowConnection] = useState(false);
52
+ const vaultsQuery = useQuery({
53
+ queryKey: ['vaults'],
54
+ queryFn: () => api.get('/admin/vaults'),
55
+ });
56
+ const vaults = vaultsQuery.data ?? [];
57
+ const secretsQuery = useQuery({
58
+ queryKey: ['vault-secrets', selectedVaultId],
59
+ queryFn: () => api.get(`/admin/vaults/${selectedVaultId}/secrets`),
60
+ enabled: selectedVaultId !== null,
61
+ });
62
+ const secrets = secretsQuery.data ?? [];
63
+ const deleteVault = useMutation({
64
+ mutationFn: (id) => api.delete(`/admin/vaults/${id}`),
65
+ onSuccess: (_, id) => {
66
+ const vault = vaults.find((v) => v.id === id);
67
+ toast.success(vault ? `Deleted vault "${vault.name}".` : 'Vault deleted.');
68
+ setDeleteVaultTarget(null);
69
+ qc.invalidateQueries({ queryKey: ['vaults'] });
70
+ if (selectedVaultId === id)
71
+ setSelectedVaultId(null);
72
+ },
73
+ onError: (err) => {
74
+ setDeleteVaultTarget(null);
75
+ toast.error(errorMessage(err, 'Failed to delete vault'));
76
+ },
77
+ });
78
+ const deleteSecret = useMutation({
79
+ mutationFn: ({ vaultId, secretId }) => api.delete(`/admin/vaults/${vaultId}/secrets/${secretId}`),
80
+ onSuccess: () => {
81
+ toast.success('Secret deleted.');
82
+ setDeleteSecretTarget(null);
83
+ qc.invalidateQueries({ queryKey: ['vault-secrets', selectedVaultId] });
84
+ },
85
+ onError: (err) => {
86
+ setDeleteSecretTarget(null);
87
+ toast.error(errorMessage(err, 'Failed to delete secret'));
88
+ },
89
+ });
90
+ const testConnection = useMutation({
91
+ mutationFn: (id) => api.post(`/admin/vaults/${id}/test`),
92
+ onSuccess: (res) => toast.success(res.ttlSeconds ? `Connected to HashiCorp Vault. Token valid for ${res.ttlSeconds} s.` : 'Connected to HashiCorp Vault.'),
93
+ onError: (err) => toast.error(`Connection failed: ${errorMessage(err, 'unknown error')}`),
94
+ });
95
+ async function handleReveal(secret) {
96
+ setRevealing(secret.id);
97
+ try {
98
+ const data = await api.get(`/admin/vaults/${secret.vaultId}/secrets/${secret.id}/reveal`);
99
+ setRevealedSecret(data);
100
+ }
101
+ catch (err) {
102
+ toast.error(`Could not reveal "${secret.name}": ${errorMessage(err, 'unknown error')}`);
103
+ }
104
+ finally {
105
+ setRevealing(null);
106
+ }
107
+ }
108
+ const selectedVault = vaults.find((v) => v.id === selectedVaultId);
109
+ return (_jsxs("div", { className: "flex flex-col md:flex-row h-full md:overflow-hidden fade-up", children: [_jsxs("aside", { "aria-label": "Vaults", className: "w-full md:w-64 flex flex-col shrink-0 md:overflow-y-auto border-b md:border-b-0 md:border-r", style: { borderColor: 'var(--m3-outline-variant)', background: 'var(--m3-surface-container-low)' }, children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-4", style: { borderBottom: '1px solid var(--m3-outline-variant)' }, children: [_jsxs("div", { children: [_jsx("h1", { className: "font-headline font-bold text-base", style: { color: 'var(--m3-on-surface)' }, children: "Vaults" }), vaultsQuery.data && (_jsxs("p", { className: "text-xs mt-0.5", style: { color: 'var(--m3-secondary)' }, children: [vaults.length, " vault", vaults.length !== 1 ? 's' : ''] }))] }), _jsx("button", { type: "button", onClick: () => setShowCreateVault(true), className: "btn btn-primary btn-sm px-2", "aria-label": "Create vault", title: "Create vault", children: _jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: "add" }) })] }), _jsx("div", { className: "flex-1 p-2 space-y-1", children: vaultsQuery.isLoading ? (_jsx(LoadingState, { label: "Loading vaults\u2026", className: "py-6" })) : vaultsQuery.isError ? (_jsx(ErrorState, { message: "Could not load vaults.", onRetry: () => void vaultsQuery.refetch(), className: "px-3 py-6" })) : (_jsxs(_Fragment, { children: [vaults.map((vault) => (_jsx(VaultRow, { vault: vault, isSelected: selectedVaultId === vault.id, onClick: () => setSelectedVaultId(vault.id), onDelete: () => setDeleteVaultTarget(vault) }, vault.id))), vaults.length === 0 && (_jsx("p", { className: "text-xs text-center py-6", style: { color: 'var(--m3-secondary)' }, children: "No vaults yet" }))] })) })] }), _jsx("main", { className: "flex-1 flex flex-col md:overflow-hidden min-w-0", children: selectedVault ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 px-4 md:px-6 py-4 shrink-0", style: { borderBottom: '1px solid var(--m3-outline-variant)' }, children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", style: { fontSize: '20px', color: 'var(--m3-primary)' }, children: VAULT_TYPE_ICONS[selectedVault.type] }), _jsx("h2", { className: "font-headline font-bold text-lg break-all", style: { color: 'var(--m3-on-surface)' }, children: selectedVault.name }), _jsx("span", { className: "text-[10px] px-2 py-0.5 rounded-full font-bold uppercase tracking-wide", style: { background: 'var(--m3-primary-fixed)', color: 'var(--m3-primary)' }, children: VAULT_TYPE_LABELS[selectedVault.type] })] }), selectedVault.description && (_jsx("p", { className: "text-sm mt-1", style: { color: 'var(--m3-secondary)' }, children: selectedVault.description }))] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [selectedVault.type === 'hashicorp' && (_jsxs(_Fragment, { children: [_jsxs("button", { type: "button", onClick: () => testConnection.mutate(selectedVault.id), disabled: testConnection.isPending, className: "btn btn-secondary", children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: "network_check" }), testConnection.isPending ? 'Testing…' : 'Test connection'] }), _jsxs("button", { type: "button", onClick: () => setShowConnection(true), className: "btn btn-secondary", children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: "settings" }), "Connection settings"] })] })), _jsxs("button", { type: "button", onClick: () => setShowCreateSecret(true), className: "btn btn-primary", children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: isReferenceVault(selectedVault.type) ? 'add_link' : 'add' }), isReferenceVault(selectedVault.type) ? 'Add Reference' : 'New Secret'] })] })] }), _jsx("div", { className: "flex-1 overflow-y-auto p-4 md:p-6", children: secretsQuery.isLoading ? (_jsx(LoadingState, { label: "Loading secrets\u2026" })) : secretsQuery.isError ? (_jsx(ErrorState, { message: "Could not load the secrets in this vault.", onRetry: () => void secretsQuery.refetch() })) : secrets.length === 0 ? (_jsx(EmptyState, { icon: "key_off", title: isReferenceVault(selectedVault.type) ? 'No references in this vault' : 'No secrets in this vault', description: isReferenceVault(selectedVault.type)
110
+ ? _jsxs(_Fragment, { children: [_jsx(EmptyStateLink, { onClick: () => setShowCreateSecret(true), children: "Add a reference" }), " to a path in HashiCorp Vault that ", uiConfig().texts.secretConsumers, " can use. ", uiConfig().texts.appName, " only reads from HashiCorp Vault; it never creates or changes secrets there."] })
111
+ : _jsxs(_Fragment, { children: [_jsx(EmptyStateLink, { onClick: () => setShowCreateSecret(true), children: "Add a secret" }), " to store credentials, tokens or JSON configuration that ", uiConfig().texts.secretConsumers, " can reference."] }) })) : (_jsx("div", { className: "space-y-2", children: secrets.map((secret) => (_jsx(SecretRow, { secret: secret, isRevealing: revealing === secret.id, onReveal: () => handleReveal(secret), onDelete: () => setDeleteSecretTarget(secret) }, secret.id))) })) })] })) : (_jsxs("div", { className: "flex-1 flex flex-col items-center justify-center gap-3 py-16", style: { color: 'var(--m3-secondary)' }, children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", style: { fontSize: '56px', opacity: 0.3 }, children: "shield_lock" }), _jsx("p", { className: "text-sm", children: "Select a vault to view its secrets" })] })) }), showCreateVault && (_jsx(CreateVaultModal, { vaults: vaults, onClose: () => setShowCreateVault(false), onCreated: (v) => { qc.invalidateQueries({ queryKey: ['vaults'] }); setSelectedVaultId(v.id); setShowCreateVault(false); toast.success(`Created vault "${v.name}".`); } })), showCreateSecret && selectedVaultId !== null && (_jsx(CreateSecretModal, { vaultId: selectedVaultId, vaultType: selectedVault?.type ?? 'local', onClose: () => setShowCreateSecret(false), onCreated: () => { qc.invalidateQueries({ queryKey: ['vault-secrets', selectedVaultId] }); setShowCreateSecret(false); toast.success('Secret saved.'); } })), showConnection && selectedVault?.type === 'hashicorp' && (_jsx(ConnectionSettingsModal, { vaultId: selectedVault.id, vaults: vaults, onClose: () => setShowConnection(false), onSaved: () => { qc.invalidateQueries({ queryKey: ['vaults'] }); setShowConnection(false); toast.success('Connection settings saved.'); } })), revealedSecret && (_jsx(RevealModal, { secret: revealedSecret, onClose: () => setRevealedSecret(null) })), deleteVaultTarget && (_jsx(DeleteVaultModal, { vault: deleteVaultTarget, secretCount: deleteVaultTarget.id === selectedVaultId && secretsQuery.data ? secrets.length : null, pending: deleteVault.isPending, onClose: () => setDeleteVaultTarget(null), onConfirm: () => deleteVault.mutate(deleteVaultTarget.id) })), deleteSecretTarget && (_jsx(ConfirmModal, { title: "Delete secret", message: `Delete secret "${deleteSecretTarget.name}"? This action cannot be undone.`, confirmLabel: "Delete", pending: deleteSecret.isPending, pendingLabel: "Deleting\u2026", onConfirm: () => deleteSecret.mutate({ vaultId: deleteSecretTarget.vaultId, secretId: deleteSecretTarget.id }), onCancel: () => setDeleteSecretTarget(null) }))] }));
112
+ }
113
+ // ── Vault row ──────────────────────────────────────────────────────────────────
114
+ function VaultRow({ vault, isSelected, onClick, onDelete }) {
115
+ return (_jsxs("div", { className: `group flex items-center gap-1 rounded-xl transition-colors ${isSelected ? '' : 'hover:bg-[var(--m3-surface-container)]'}`, style: {
116
+ background: isSelected ? 'var(--m3-surface-container-lowest)' : undefined,
117
+ boxShadow: isSelected ? '0 1px 4px rgba(19,27,46,0.08)' : 'none',
118
+ }, children: [_jsxs("button", { type: "button", onClick: onClick, "aria-current": isSelected ? 'true' : undefined, className: "flex-1 min-w-0 flex items-center gap-3 px-3 py-2.5 rounded-xl text-left focus-ring", children: [_jsx("span", { className: "material-symbols-outlined shrink-0", "aria-hidden": "true", style: { fontSize: '18px', color: isSelected ? 'var(--m3-primary)' : 'var(--m3-secondary)', fontVariationSettings: isSelected ? "'FILL' 1" : "'FILL' 0" }, children: VAULT_TYPE_ICONS[vault.type] }), _jsxs("span", { className: "flex-1 min-w-0", children: [_jsx("span", { className: "block text-sm font-medium truncate", style: { color: 'var(--m3-on-surface)' }, children: vault.name }), vault.description && (_jsx("span", { className: "block text-[10px] truncate", style: { color: 'var(--m3-secondary)' }, children: vault.description }))] })] }), _jsx("button", { type: "button", onClick: onDelete, "aria-label": `Delete vault ${vault.name}`, title: "Delete vault", className: "btn-icon w-7 h-7 mr-1.5 shrink-0 opacity-100 md:opacity-0 md:group-hover:opacity-100 md:group-focus-within:opacity-100 hover:!text-[color:var(--m3-down)]", children: _jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", style: { fontSize: '16px' }, children: "close" }) })] }));
119
+ }
120
+ // ── Secret row ─────────────────────────────────────────────────────────────────
121
+ const TYPE_LABELS = { userpass: 'User/Pass', value: 'Value', json: 'JSON' };
122
+ const TYPE_ICONS = { userpass: 'person', value: 'key', json: 'data_object' };
123
+ function SecretRow({ secret, isRevealing, onReveal, onDelete }) {
124
+ return (_jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-2 px-4 py-3 rounded-xl", style: { background: 'var(--m3-surface-container)', border: '1px solid var(--m3-outline-variant)' }, children: [_jsx("span", { className: "material-symbols-outlined shrink-0", "aria-hidden": "true", style: { fontSize: '20px', color: 'var(--m3-secondary)' }, children: TYPE_ICONS[secret.type] ?? 'key' }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("p", { className: "text-sm font-semibold break-all", style: { color: 'var(--m3-on-surface)' }, children: secret.name }), _jsxs("p", { className: "text-xs mt-0.5", style: { color: 'var(--m3-secondary)' }, children: [TYPE_LABELS[secret.type], " \u00B7 Updated ", formatDate(secret.updatedAt)] })] }), _jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [_jsxs("button", { type: "button", onClick: onReveal, disabled: isRevealing, className: "btn btn-secondary btn-sm", children: [_jsx("span", { className: `material-symbols-outlined ${isRevealing ? 'animate-spin' : ''}`, "aria-hidden": "true", children: isRevealing ? 'progress_activity' : 'visibility' }), isRevealing ? 'Loading…' : 'Reveal'] }), _jsx("button", { type: "button", onClick: onDelete, "aria-label": `Delete secret ${secret.name}`, title: "Delete secret", className: "btn-icon hover:!text-[color:var(--m3-down)]", children: _jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", style: { fontSize: '16px' }, children: "delete" }) })] })] }));
125
+ }
126
+ // ── Delete Vault modal (with checkbox when secrets exist) ─────────────────────
127
+ function DeleteVaultModal({ vault, secretCount, pending, onClose, onConfirm }) {
128
+ const hasSecrets = secretCount === null || secretCount > 0;
129
+ const isReference = isReferenceVault(vault.type);
130
+ const [confirmed, setConfirmed] = useState(false);
131
+ return (_jsx(ModalShell, { onClose: pending ? undefined : onClose, children: _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": "Delete vault", "aria-busy": pending || undefined, className: "rounded-2xl w-full max-w-sm", style: { background: 'var(--m3-surface-container-low)', border: '1px solid var(--m3-outline-variant)' }, children: [_jsx(ModalHeader, { icon: "warning", title: "Delete vault", onClose: pending ? () => { } : onClose }), _jsxs("div", { className: "p-6 space-y-4", children: [_jsxs("p", { className: "text-sm", style: { color: 'var(--m3-on-surface-variant)' }, children: ["You are about to delete ", _jsx("span", { className: "font-semibold", style: { color: 'var(--m3-on-surface)' }, children: vault.name }), "."] }), hasSecrets && (_jsxs("div", { className: "rounded-xl px-4 py-3 space-y-3", style: { background: 'var(--m3-error-container)' }, children: [_jsx("p", { className: "text-sm font-medium", style: { color: 'var(--m3-on-error-container)' }, children: isReference
132
+ ? (secretCount !== null && secretCount > 0
133
+ ? `This vault contains ${secretCount} reference${secretCount !== 1 ? 's' : ''}. They will be removed from ${uiConfig().texts.appName}. Nothing is deleted in HashiCorp Vault.`
134
+ : `This vault may contain references. They will be removed from ${uiConfig().texts.appName}. Nothing is deleted in HashiCorp Vault.`)
135
+ : (secretCount !== null && secretCount > 0
136
+ ? `This vault contains ${secretCount} secret${secretCount !== 1 ? 's' : ''}. All secrets will be permanently deleted.`
137
+ : 'This vault may contain secrets. All secrets will be permanently deleted.') }), _jsxs("label", { className: "flex items-center gap-2.5 cursor-pointer select-none", children: [_jsx("input", { type: "checkbox", checked: confirmed, disabled: pending, onChange: (e) => setConfirmed(e.target.checked), className: "w-4 h-4 rounded" }), _jsx("span", { className: "text-sm font-medium", style: { color: 'var(--m3-on-error-container)' }, children: isReference ? 'I understand the references will be removed' : 'I understand all secrets will be permanently deleted' })] })] }))] }), _jsxs(ModalFooter, { children: [_jsx("button", { type: "button", onClick: onClose, disabled: pending, className: "btn btn-secondary", children: "Cancel" }), _jsx("button", { type: "button", onClick: onConfirm, disabled: pending || (hasSecrets && !confirmed), className: "btn btn-danger", children: pending ? 'Deleting…' : 'Delete vault' })] })] }) }));
138
+ }
139
+ // ── Create Vault modal ─────────────────────────────────────────────────────────
140
+ function CreateVaultModal({ vaults, onClose, onCreated }) {
141
+ const [name, setName] = useState('');
142
+ const [description, setDescription] = useState('');
143
+ const [type, setType] = useState('local');
144
+ const [connection, setConnection] = useState(EMPTY_CONNECTION);
145
+ const [error, setError] = useState('');
146
+ const [loading, setLoading] = useState(false);
147
+ const test = useConnectionTest(connection);
148
+ const pickers = useLocalSecretPicker(vaults);
149
+ async function handleSubmit(e) {
150
+ e.preventDefault();
151
+ setError('');
152
+ setLoading(true);
153
+ try {
154
+ const vault = await api.post('/admin/vaults', {
155
+ name,
156
+ description: description || undefined,
157
+ ...(type === 'hashicorp' ? { type, connection: connectionPayload(connection) } : {}),
158
+ });
159
+ onCreated(vault);
160
+ }
161
+ catch (err) {
162
+ setError(errorMessage(err, 'Failed to create vault'));
163
+ }
164
+ finally {
165
+ setLoading(false);
166
+ }
167
+ }
168
+ const hashicorp = type === 'hashicorp';
169
+ return (_jsxs(ConnectionDialog, { title: "Create Vault", icon: "shield_lock", onClose: onClose, onSubmit: handleSubmit, advanced: hashicorp ? { connection, onChange: setConnection } : null, footer: _jsx(ModalActions, { onClose: onClose, loading: loading, submitLabel: "Create Vault", test: hashicorp ? test : undefined }), children: [error && _jsx(Alert, { tone: "error", children: error }), _jsx(Field, { label: "Vault name", required: true, children: _jsx("input", { value: name, onChange: (e) => setName(e.target.value), required: true, className: "input-sig", placeholder: "My Credentials", autoFocus: true }) }), _jsx(Field, { label: "Description (optional)", children: _jsx("input", { value: description, onChange: (e) => setDescription(e.target.value), className: "input-sig", placeholder: "What this vault stores\u2026" }) }), _jsx(VaultTypePicker, { value: type, onChange: setType }), hashicorp && _jsx(ConnectionFields, { value: connection, onChange: setConnection, pickers: pickers }), hashicorp && test.result && _jsx(Alert, { tone: test.result.ok ? 'success' : 'error', children: test.result.text })] }));
170
+ }
171
+ // ── Create Secret modal ────────────────────────────────────────────────────────
172
+ function CreateSecretModal({ vaultId, vaultType, onClose, onCreated }) {
173
+ const [name, setName] = useState('');
174
+ const [path, setPath] = useState('');
175
+ const [secretKey, setSecretKey] = useState('');
176
+ const isReference = isReferenceVault(vaultType);
177
+ const [type, setType] = useState('userpass');
178
+ const [username, setUsername] = useState('');
179
+ const [password, setPassword] = useState('');
180
+ const [value, setValue] = useState('');
181
+ const [json, setJson] = useState('');
182
+ const [jsonError, setJsonError] = useState('');
183
+ const [error, setError] = useState('');
184
+ const [loading, setLoading] = useState(false);
185
+ const typeLabelId = useId();
186
+ function validateJson(v) {
187
+ try {
188
+ JSON.parse(v);
189
+ setJsonError('');
190
+ }
191
+ catch {
192
+ setJsonError('Invalid JSON');
193
+ }
194
+ }
195
+ async function handleSubmit(e) {
196
+ e.preventDefault();
197
+ if (type === 'json' && jsonError)
198
+ return;
199
+ setError('');
200
+ setLoading(true);
201
+ try {
202
+ const body = { name, type };
203
+ if (isReference) {
204
+ body['path'] = path;
205
+ if (type === 'value')
206
+ body['key'] = secretKey;
207
+ }
208
+ else {
209
+ if (type === 'userpass')
210
+ body['userpass'] = { username, password };
211
+ if (type === 'value')
212
+ body['value'] = value;
213
+ if (type === 'json')
214
+ body['json'] = json;
215
+ }
216
+ await api.post(`/admin/vaults/${vaultId}/secrets`, body);
217
+ onCreated();
218
+ }
219
+ catch (err) {
220
+ setError(errorMessage(err, 'Failed to create secret'));
221
+ }
222
+ finally {
223
+ setLoading(false);
224
+ }
225
+ }
226
+ const types = [
227
+ { value: 'userpass', label: 'User / Password', desc: 'Username + password pair' },
228
+ { value: 'value', label: 'Secure Value', desc: 'Token, connection string…' },
229
+ { value: 'json', label: 'JSON', desc: 'Arbitrary JSON object' },
230
+ ];
231
+ return (_jsx(Modal, { title: isReference ? 'Add Secret Reference' : 'New Secret', icon: isReference ? 'link' : 'key', onClose: onClose, flush: true, children: _jsxs("form", { onSubmit: handleSubmit, children: [_jsxs("div", { className: "p-6 space-y-4", children: [error && _jsx(Alert, { tone: "error", children: error }), isReference && _jsxs(Alert, { tone: "info", children: ["This only points at a secret that already exists in HashiCorp Vault. ", uiConfig().texts.appName, " reads it when needed and never creates, changes or deletes anything there."] }), _jsx(Field, { label: isReference ? 'Reference name' : 'Secret name', required: true, children: _jsx("input", { value: name, onChange: (e) => setName(e.target.value), required: true, className: "input-sig", placeholder: "my-api-key", autoFocus: true }) }), _jsxs("div", { role: "group", "aria-labelledby": typeLabelId, children: [_jsx("p", { id: typeLabelId, className: "block font-mono text-xs uppercase tracking-wider mb-2", style: { color: 'var(--m3-secondary)' }, children: "Type" }), _jsx("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-2", children: types.map((t) => (_jsxs("button", { type: "button", "aria-pressed": type === t.value, onClick: () => setType(t.value), className: `px-3 py-2.5 rounded-xl text-left transition-all focus-ring ${type === t.value ? 'selection-active' : ''}`, style: { background: 'var(--m3-surface-container)', color: 'var(--m3-secondary)', border: '1px solid var(--m3-outline-variant)' }, children: [_jsx("span", { className: "block text-xs font-bold", children: t.label }), _jsx("span", { className: "block text-[10px] mt-0.5 opacity-80", children: t.desc })] }, t.value))) })] }), isReference && (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Path", required: true, hint: type === 'userpass' ? 'Reads the keys "username" and "password" at this path.' : type === 'json' ? 'Reads every key at this path.' : 'Path of the KV v2 secret, relative to the mount.', children: _jsx("input", { value: path, onChange: (e) => setPath(e.target.value), required: true, className: "input-sig font-mono", placeholder: uiConfig().texts.vaultPathExample, autoComplete: "off" }) }), type === 'value' && (_jsx(Field, { label: "Key", required: true, children: _jsx("input", { value: secretKey, onChange: (e) => setSecretKey(e.target.value), required: true, className: "input-sig font-mono", placeholder: "api_key", autoComplete: "off" }) }))] })), !isReference && type === 'userpass' && (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Username", required: true, children: _jsx("input", { value: username, onChange: (e) => setUsername(e.target.value), required: true, className: "input-sig", placeholder: "admin", autoComplete: "off" }) }), _jsx(Field, { label: "Password", required: true, children: _jsx("input", { type: "password", value: password, onChange: (e) => setPassword(e.target.value), required: true, className: "input-sig", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", autoComplete: "new-password" }) })] })), !isReference && type === 'value' && (_jsx(Field, { label: "Value", required: true, children: _jsx("input", { value: value, onChange: (e) => setValue(e.target.value), required: true, className: "input-sig", placeholder: "Bearer eyJ\u2026", autoComplete: "off" }) })), !isReference && type === 'json' && (_jsx(Field, { label: "JSON", required: true, error: jsonError || undefined, children: _jsx("textarea", { value: json, onChange: (e) => { setJson(e.target.value); validateJson(e.target.value); }, required: true, rows: 5, className: "input-sig font-mono text-xs resize-none", placeholder: '{\n "key": "value"\n}', style: { borderColor: jsonError ? 'var(--m3-error)' : undefined } }) }))] }), _jsx(ModalActions, { onClose: onClose, loading: loading, submitLabel: isReference ? 'Save Reference' : 'Save Secret' })] }) }));
232
+ }
233
+ // ── HashiCorp connection ───────────────────────────────────────────────────────
234
+ /** Fields that decide where credentials are sent. */
235
+ const TARGET_FIELDS = ['address', 'namespace', 'mount', 'authMethod', 'approleMount', 'caCert'];
236
+ const DEFAULT_MOUNT = 'secret';
237
+ const DEFAULT_APPROLE_MOUNT = 'approle';
238
+ /** The fields every connection needs; the rarely changed options live in the side panel (`ConnectionAdvanced`). */
239
+ function ConnectionFields({ value, onChange, pickers, keepHint }) {
240
+ const set = (patch) => onChange({ ...value, ...patch });
241
+ const authLabelId = useId();
242
+ const credentialHint = keepHint ? 'Leave blank to keep the saved value. Re-enter it when you change the address, namespace, mount, CA certificate or auth method.' : undefined;
243
+ const insecure = value.address.trim().toLowerCase().startsWith('http://');
244
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(Field, { label: "Address", required: true, children: _jsx("input", { type: "url", value: value.address, onChange: (e) => set({ address: e.target.value }), required: true, className: "input-sig font-mono", placeholder: "https://vault.example.com:8200", autoComplete: "off" }) }), insecure && _jsx(Alert, { tone: "warning", children: "The token is sent unencrypted over http://. Use https:// unless Vault is on a trusted private network." }), _jsxs("div", { role: "group", "aria-labelledby": authLabelId, children: [_jsx("p", { id: authLabelId, className: "block font-mono text-xs uppercase tracking-wider mb-2", style: { color: 'var(--m3-secondary)' }, children: "Auth method" }), _jsx("div", { className: "flex gap-2", children: ['token', 'approle'].map((method) => (_jsx("button", { type: "button", "aria-pressed": value.authMethod === method, onClick: () => set({ authMethod: method, credentialsRef: undefined }), className: `flex-1 px-3 py-2 rounded-lg text-sm font-medium focus-ring ${value.authMethod === method ? 'selection-active' : ''}`, style: { border: '1px solid var(--m3-outline-variant)' }, children: method === 'token' ? 'Token' : 'AppRole' }, method))) })] }), _jsx(CredentialSection, { ...pickers, vault: value.credentialsRef, onVaultChange: (credentialsRef) => set({ credentialsRef }), mappingFields: value.authMethod === 'token' ? [{ key: 'token', label: 'Token' }] : [{ key: 'roleId', label: 'Role ID' }, { key: 'secretId', label: 'Secret ID' }], secretTypes: value.authMethod === 'token' ? ['value', 'json'] : ['userpass', 'json'], valueLabel: "token", userpassNote: "The username is used as the Role ID and the password as the Secret ID.", note: value.authMethod === 'token'
245
+ ? 'Read the token from a local vault secret.'
246
+ : 'Read the Role ID and Secret ID from a local vault secret.', children: value.authMethod === 'token' ? (_jsx(Field, { label: "Token", required: !keepHint, hint: credentialHint, children: _jsx("input", { type: "password", value: value.token, onChange: (e) => set({ token: e.target.value }), required: !keepHint, className: "input-sig font-mono", autoComplete: "new-password" }) })) : (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Role ID", required: true, children: _jsx("input", { value: value.roleId, onChange: (e) => set({ roleId: e.target.value }), required: true, className: "input-sig font-mono", autoComplete: "off" }) }), _jsx(Field, { label: "Secret ID", required: !keepHint, hint: credentialHint, children: _jsx("input", { type: "password", value: value.secretId, onChange: (e) => set({ secretId: e.target.value }), required: !keepHint, className: "input-sig font-mono", autoComplete: "new-password" }) })] })) })] }));
247
+ }
248
+ /** Options that rarely change from their defaults: namespace, mounts and the CA certificate. */
249
+ function ConnectionAdvanced({ value, onChange }) {
250
+ const set = (patch) => onChange({ ...value, ...patch });
251
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(Field, { label: "Namespace (optional)", children: _jsx("input", { value: value.namespace, onChange: (e) => set({ namespace: e.target.value }), className: "input-sig font-mono", placeholder: "team-a", autoComplete: "off" }) }), _jsx(Field, { label: "KV v2 mount", required: true, children: _jsx("input", { value: value.mount, onChange: (e) => set({ mount: e.target.value }), required: true, className: "input-sig font-mono", placeholder: DEFAULT_MOUNT, autoComplete: "off" }) }), value.authMethod === 'approle' && (_jsx(Field, { label: "AppRole mount", children: _jsx("input", { value: value.approleMount, onChange: (e) => set({ approleMount: e.target.value }), className: "input-sig font-mono", placeholder: DEFAULT_APPROLE_MOUNT, autoComplete: "off" }) })), _jsx(Field, { label: "CA certificate (optional)", hint: "PEM. Only for a private CA; include the full chain.", children: _jsx("textarea", { value: value.caCert, onChange: (e) => set({ caCert: e.target.value }), rows: 5, className: "input-sig font-mono text-xs resize-none", placeholder: "-----BEGIN CERTIFICATE-----" }) })] }));
252
+ }
253
+ const ADVANCED_META = { icon: 'tune', label: 'Connection options' };
254
+ /** Number of options in the side panel that differ from their defaults, shown as the tab badge. */
255
+ function advancedCount(c) {
256
+ return [
257
+ c.namespace.trim() !== '',
258
+ c.mount.trim() !== DEFAULT_MOUNT,
259
+ c.authMethod === 'approle' && c.approleMount.trim() !== DEFAULT_APPROLE_MOUNT,
260
+ c.caCert.trim() !== '',
261
+ ].filter(Boolean).length;
262
+ }
263
+ /**
264
+ * A modal form with the connection options in a collapsible side panel.
265
+ * Without `advanced` (a local vault) it is a plain narrow dialog with no tab strip.
266
+ */
267
+ function ConnectionDialog({ title, icon, onClose, onSubmit, advanced, footer, children }) {
268
+ const hasAdvanced = advanced !== null;
269
+ // Open whenever the dialog has connection options, since they include a required field.
270
+ const [open, setOpen] = useState(hasAdvanced);
271
+ useEffect(() => setOpen(hasAdvanced), [hasAdvanced]);
272
+ const showPanel = open && advanced !== null;
273
+ const count = advanced ? advancedCount(advanced.connection) : 0;
274
+ return (_jsx(ModalShell, { align: "top", onClose: onClose, label: title, children: _jsxs("div", { className: "rounded-2xl my-8 flex flex-col lg:flex-row", style: {
275
+ width: showPanel ? 'min(900px, calc(100vw - 32px))' : advanced ? 'min(492px, calc(100vw - 32px))' : 'min(448px, calc(100vw - 32px))',
276
+ background: 'var(--m3-surface-container-low)',
277
+ border: '1px solid var(--m3-outline-variant)',
278
+ transition: 'width 0.2s ease',
279
+ }, children: [_jsxs("div", { className: `flex-none min-w-0 w-full ${showPanel ? 'lg:w-[460px]' : advanced ? 'lg:w-[calc(100%-44px)]' : 'lg:w-full'}`, children: [_jsx(ModalHeader, { icon: icon, title: title, onClose: onClose }), _jsxs("form", { onSubmit: onSubmit, children: [_jsx("div", { className: "p-6 space-y-4", children: children }), footer] })] }), showPanel && (_jsx(SidePanelFrame, { meta: ADVANCED_META, layout: "responsive", children: _jsx(ConnectionAdvanced, { value: advanced.connection, onChange: advanced.onChange }) })), advanced && (_jsx(SideTabStrip, { tabs: [{ key: 'advanced', badge: count > 0 ? String(count) : null }], meta: { advanced: ADVANCED_META }, active: open ? 'advanced' : null, onToggle: (key) => setOpen(key !== null), layout: "responsive" }))] }) }));
280
+ }
281
+ function ConnectionSettingsModal({ vaultId, vaults, onClose, onSaved }) {
282
+ const [form, setForm] = useState(null);
283
+ const [error, setError] = useState('');
284
+ const [loading, setLoading] = useState(false);
285
+ const query = useQuery({
286
+ queryKey: ['vault-connection', vaultId],
287
+ queryFn: () => api.get(`/admin/vaults/${vaultId}`),
288
+ gcTime: 0,
289
+ });
290
+ const saved = query.data?.connection;
291
+ const current = form ?? (saved ? { ...EMPTY_CONNECTION, ...saved, credentialsRef: saved.credentialsRef ? { fieldMapping: {}, ...saved.credentialsRef } : undefined, token: '', secretId: '' } : null);
292
+ const pickers = useLocalSecretPicker(vaults);
293
+ const savedVaultId = saved?.credentialsRef?.vaultId;
294
+ const { onLoadSecrets } = pickers;
295
+ useEffect(() => { if (savedVaultId)
296
+ void onLoadSecrets(savedVaultId); }, [savedVaultId, onLoadSecrets]);
297
+ // The saved secret must not follow a changed target to a new server: the admin picks it again, as typed credentials are.
298
+ const change = (next) => {
299
+ const moved = current !== null && TARGET_FIELDS.some((f) => next[f] !== current[f]);
300
+ setForm(moved && next.credentialsRef === current?.credentialsRef ? { ...next, credentialsRef: undefined } : next);
301
+ };
302
+ const hasSavedDirect = !!current && (current.authMethod === 'token' ? saved?.hasToken : saved?.hasSecretId) === true;
303
+ const test = useConnectionTest(current ?? EMPTY_CONNECTION, vaultId);
304
+ async function handleSubmit(e) {
305
+ e.preventDefault();
306
+ if (!current)
307
+ return;
308
+ setError('');
309
+ setLoading(true);
310
+ try {
311
+ await api.patch(`/admin/vaults/${vaultId}`, { connection: connectionPayload(current) });
312
+ onSaved();
313
+ }
314
+ catch (err) {
315
+ setError(errorMessage(err, 'Failed to save connection settings'));
316
+ }
317
+ finally {
318
+ setLoading(false);
319
+ }
320
+ }
321
+ if (!current) {
322
+ return (_jsx(Modal, { title: "Connection settings", icon: "settings", onClose: onClose, children: query.isError
323
+ ? _jsx(ErrorState, { message: "Could not load the connection settings.", onRetry: () => void query.refetch() })
324
+ : _jsx(LoadingState, { label: "Loading\u2026" }) }));
325
+ }
326
+ return (_jsxs(ConnectionDialog, { title: "Connection settings", icon: "settings", onClose: onClose, onSubmit: handleSubmit, advanced: { connection: current, onChange: change }, footer: _jsx(ModalActions, { onClose: onClose, loading: loading, submitLabel: "Save", test: test }), children: [error && _jsx(Alert, { tone: "error", children: error }), _jsx(ConnectionFields, { value: current, onChange: change, pickers: pickers, keepHint: hasSavedDirect }), test.result && _jsx(Alert, { tone: test.result.ok ? 'success' : 'error', children: test.result.text })] }));
327
+ }
328
+ // ── Reveal modal ───────────────────────────────────────────────────────────────
329
+ /** Pretty-prints stored JSON; falls back to the raw text when it cannot be parsed so the modal never crashes. */
330
+ function formatJson(raw) {
331
+ try {
332
+ return { text: JSON.stringify(JSON.parse(raw), null, 2), valid: true };
333
+ }
334
+ catch {
335
+ return { text: raw, valid: false };
336
+ }
337
+ }
338
+ function RevealModal({ secret, onClose }) {
339
+ const [showPassword, setShowPassword] = useState(false);
340
+ const json = secret.type === 'json' ? formatJson(secret.value.value ?? '{}') : null;
341
+ return (_jsxs(Modal, { title: secret.name, icon: TYPE_ICONS[secret.type] ?? 'key', onClose: onClose, flush: true, children: [_jsxs("div", { className: "p-6 space-y-3", children: [_jsx("div", { className: "flex items-center gap-2", children: _jsx("span", { className: "text-[10px] uppercase tracking-wider font-bold px-2 py-0.5 rounded-full", style: { background: 'var(--m3-surface-container-high)', color: 'var(--m3-secondary)' }, children: TYPE_LABELS[secret.type] }) }), secret.source && (_jsxs("p", { className: "text-xs font-mono break-all", style: { color: 'var(--m3-secondary)' }, children: ["Source: ", secret.source.path, secret.source.key ? ` (${secret.source.key})` : ''] })), secret.type === 'userpass' && (_jsxs(_Fragment, { children: [_jsx(RevealField, { label: "Username", value: secret.value.username ?? '', mono: true }), _jsx(RevealField, { label: "Password", value: secret.value.password ?? '', hidden: !showPassword, mono: true, action: _jsx("button", { type: "button", onClick: () => setShowPassword((p) => !p), "aria-pressed": showPassword, className: "btn btn-ghost btn-sm py-1 text-xs", children: showPassword ? 'Hide' : 'Show' }) })] })), (secret.type === 'value') && (_jsx(RevealField, { label: "Value", value: secret.value.value ?? '', mono: true })), json && (_jsxs("div", { children: [_jsxs("div", { className: "flex items-center justify-between mb-1.5", children: [_jsx("p", { className: "text-[10px] uppercase tracking-wider", style: { color: 'var(--m3-secondary)' }, children: "JSON" }), _jsx(CopyButton, { value: json.text, iconOnly: true })] }), !json.valid && (_jsx(Alert, { tone: "warning", className: "mb-2", children: "The stored value is not valid JSON; showing it as plain text." })), _jsx("pre", { className: "text-xs p-3 rounded-xl overflow-auto max-h-64", style: { background: 'var(--m3-surface-container-high)', color: 'var(--m3-on-surface)', fontFamily: 'monospace' }, children: json.text })] }))] }), _jsx(ModalFooter, { children: _jsx("button", { type: "button", onClick: onClose, className: "btn btn-secondary", children: "Close" }) })] }));
342
+ }
343
+ function RevealField({ label, value, mono, hidden, action }) {
344
+ return (_jsxs("div", { children: [_jsxs("div", { className: "flex items-center justify-between mb-1", children: [_jsx("p", { className: "text-[10px] uppercase tracking-wider", style: { color: 'var(--m3-secondary)' }, children: label }), action] }), _jsxs("div", { className: "px-3 py-2 rounded-xl flex items-center justify-between gap-2", style: { background: 'var(--m3-surface-container-high)' }, children: [_jsx("span", { className: `text-sm flex-1 break-all ${mono ? 'font-mono' : ''}`, style: { color: 'var(--m3-on-surface)', filter: hidden ? 'blur(6px)' : 'none', userSelect: hidden ? 'none' : undefined }, children: value || '(empty)' }), !hidden && _jsx(CopyButton, { value: value, label: `Copy ${label.toLowerCase()}`, iconOnly: true })] })] }));
345
+ }
346
+ // ── Shared primitives ──────────────────────────────────────────────────────────
347
+ /** Tests the connection form as it is filled in, before it is saved. */
348
+ function useConnectionTest(connection, vaultId) {
349
+ const [result, setResult] = useState(null);
350
+ const [pending, setPending] = useState(false);
351
+ async function run() {
352
+ setPending(true);
353
+ setResult(null);
354
+ try {
355
+ const res = await api.post('/admin/vaults/test-connection', { vaultId, connection: connectionPayload(connection) });
356
+ setResult({ ok: true, text: res.ttlSeconds ? `Connected. Token valid for ${res.ttlSeconds} s.` : 'Connected.' });
357
+ }
358
+ catch (err) {
359
+ setResult({ ok: false, text: `Connection failed: ${errorMessage(err, 'unknown error')}` });
360
+ }
361
+ finally {
362
+ setPending(false);
363
+ }
364
+ }
365
+ return { result, pending, run };
366
+ }
367
+ function ModalActions({ onClose, loading, submitLabel, test }) {
368
+ return (_jsxs(ModalFooter, { start: test ? (_jsx("button", { type: "button", onClick: () => void test.run(), disabled: test.pending || loading, className: "btn btn-outline", children: test.pending
369
+ ? _jsxs(_Fragment, { children: [_jsx("span", { className: "material-symbols-outlined animate-spin", "aria-hidden": "true", children: "progress_activity" }), " Testing\u2026"] })
370
+ : _jsxs(_Fragment, { children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: "network_check" }), " Test connection"] }) })) : undefined, children: [_jsx("button", { type: "button", onClick: onClose, className: "btn btn-secondary", children: "Cancel" }), _jsx("button", { type: "submit", disabled: loading, className: "btn btn-primary", children: loading ? 'Saving…' : submitLabel })] }));
371
+ }
372
+ //# sourceMappingURL=Vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Vault.js","sourceRoot":"","sources":["../../src/pages/Vault.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export interface NavItem {
2
+ to: string;
3
+ label: string;
4
+ icon: string;
5
+ /** The lowest role that sees the item (see `roleRank`). */
6
+ minRole: string;
7
+ }
8
+ export interface NavSection {
9
+ label: string;
10
+ items: NavItem[];
11
+ }
12
+ /** A link below the sections that leaves the interface (the public page, the documentation). */
13
+ export interface ExternalLink {
14
+ label: string;
15
+ icon: string;
16
+ href: () => string;
17
+ }
18
+ export interface AdminShellConfig {
19
+ sections: NavSection[];
20
+ /** Roles from the lowest to the highest rank: a user sees an item when their rank reaches the item's `minRole`. */
21
+ roleRank: Readonly<Record<string, number>>;
22
+ brand: {
23
+ iconUrl: string;
24
+ name: string;
25
+ title: string;
26
+ subtitle: string;
27
+ };
28
+ /** The page the first item leads to: it is highlighted only when it is exactly the current one. */
29
+ homePath: string;
30
+ settingsPath: string;
31
+ loginPath: string;
32
+ externalLinks: readonly ExternalLink[];
33
+ /** The release notes shown once to a user who last saw an older version. */
34
+ whatsNew: {
35
+ changelog: string;
36
+ version: string;
37
+ docsUrl: string;
38
+ };
39
+ }
40
+ /**
41
+ * The signed-in shell of an admin interface: a sidebar (a drawer on a phone) with the sections the user's role may see,
42
+ * the footer links, the theme switch and logout, and the page below it. The sections, roles, brand and links are the
43
+ * application's; the page is whatever the router renders in the `Outlet`.
44
+ */
45
+ export declare function createAdminShell(config: AdminShellConfig): () => import("react").JSX.Element;
46
+ //# sourceMappingURL=AdminShell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminShell.d.ts","sourceRoot":"","sources":["../../src/shell/AdminShell.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE;AAE/D,gGAAgG;AAChG,MAAM,WAAW,YAAY;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,MAAM,CAAA;CAAE;AAEjF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,UAAU,EAAE,CAAA;IACtB,mHAAmH;IACnH,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC1C,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IACzE,mGAAmG;IACnG,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,SAAS,YAAY,EAAE,CAAA;IACtC,4EAA4E;IAC5E,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAClE;AAqID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,qCAoFxD"}