@clef-sh/ui 0.1.20 → 0.1.21

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 (103) hide show
  1. package/dist/client/assets/index-DPWHjBbB.js +34 -0
  2. package/dist/client/assets/index-qsLTYpc9.css +2 -0
  3. package/dist/client/clef.svg +2 -0
  4. package/dist/client/index.html +3 -31
  5. package/dist/client-lib/components/Button.d.ts +1 -1
  6. package/dist/client-lib/components/Button.d.ts.map +1 -1
  7. package/dist/client-lib/components/CopyButton.d.ts.map +1 -1
  8. package/dist/client-lib/components/EnvBadge.d.ts.map +1 -1
  9. package/dist/client-lib/components/MatrixGrid.d.ts.map +1 -1
  10. package/dist/client-lib/components/Sidebar.d.ts +1 -1
  11. package/dist/client-lib/components/Sidebar.d.ts.map +1 -1
  12. package/dist/client-lib/components/StatusDot.d.ts.map +1 -1
  13. package/dist/client-lib/components/SyncPanel.d.ts.map +1 -1
  14. package/dist/client-lib/components/TopBar.d.ts +6 -0
  15. package/dist/client-lib/components/TopBar.d.ts.map +1 -1
  16. package/dist/client-lib/primitives/Badge.d.ts +11 -0
  17. package/dist/client-lib/primitives/Badge.d.ts.map +1 -0
  18. package/dist/client-lib/primitives/Card.d.ts +28 -0
  19. package/dist/client-lib/primitives/Card.d.ts.map +1 -0
  20. package/dist/client-lib/primitives/Dialog.d.ts +30 -0
  21. package/dist/client-lib/primitives/Dialog.d.ts.map +1 -0
  22. package/dist/client-lib/primitives/EmptyState.d.ts +10 -0
  23. package/dist/client-lib/primitives/EmptyState.d.ts.map +1 -0
  24. package/dist/client-lib/primitives/Field.d.ts +36 -0
  25. package/dist/client-lib/primitives/Field.d.ts.map +1 -0
  26. package/dist/client-lib/primitives/Input.d.ts +6 -0
  27. package/dist/client-lib/primitives/Input.d.ts.map +1 -0
  28. package/dist/client-lib/primitives/Stat.d.ts +11 -0
  29. package/dist/client-lib/primitives/Stat.d.ts.map +1 -0
  30. package/dist/client-lib/primitives/Table.d.ts +37 -0
  31. package/dist/client-lib/primitives/Table.d.ts.map +1 -0
  32. package/dist/client-lib/primitives/Tabs.d.ts +29 -0
  33. package/dist/client-lib/primitives/Tabs.d.ts.map +1 -0
  34. package/dist/client-lib/primitives/Toast.d.ts +16 -0
  35. package/dist/client-lib/primitives/Toast.d.ts.map +1 -0
  36. package/dist/client-lib/primitives/Toolbar.d.ts +29 -0
  37. package/dist/client-lib/primitives/Toolbar.d.ts.map +1 -0
  38. package/dist/client-lib/primitives/index.d.ts +23 -0
  39. package/dist/client-lib/primitives/index.d.ts.map +1 -0
  40. package/dist/client-lib/theme.d.ts +18 -41
  41. package/dist/client-lib/theme.d.ts.map +1 -1
  42. package/dist/server/api.d.ts.map +1 -1
  43. package/dist/server/api.js +215 -0
  44. package/dist/server/api.js.map +1 -1
  45. package/dist/server/envelope.d.ts +15 -0
  46. package/dist/server/envelope.d.ts.map +1 -0
  47. package/dist/server/envelope.js +310 -0
  48. package/dist/server/envelope.js.map +1 -0
  49. package/package.json +7 -2
  50. package/src/client/App.tsx +16 -41
  51. package/src/client/components/Button.tsx +13 -22
  52. package/src/client/components/CopyButton.tsx +5 -12
  53. package/src/client/components/EnvBadge.tsx +30 -15
  54. package/src/client/components/MatrixGrid.tsx +108 -252
  55. package/src/client/components/Sidebar.tsx +123 -199
  56. package/src/client/components/StatusDot.tsx +10 -15
  57. package/src/client/components/SyncPanel.tsx +14 -62
  58. package/src/client/components/TopBar.tsx +11 -36
  59. package/src/client/index.html +1 -30
  60. package/src/client/main.tsx +1 -0
  61. package/src/client/primitives/Badge.test.tsx +47 -0
  62. package/src/client/primitives/Badge.tsx +64 -0
  63. package/src/client/primitives/Card.test.tsx +50 -0
  64. package/src/client/primitives/Card.tsx +85 -0
  65. package/src/client/primitives/Dialog.test.tsx +55 -0
  66. package/src/client/primitives/Dialog.tsx +96 -0
  67. package/src/client/primitives/EmptyState.test.tsx +25 -0
  68. package/src/client/primitives/EmptyState.tsx +38 -0
  69. package/src/client/primitives/Field.test.tsx +46 -0
  70. package/src/client/primitives/Field.tsx +95 -0
  71. package/src/client/primitives/Input.tsx +26 -0
  72. package/src/client/primitives/Stat.test.tsx +32 -0
  73. package/src/client/primitives/Stat.tsx +52 -0
  74. package/src/client/primitives/Table.test.tsx +58 -0
  75. package/src/client/primitives/Table.tsx +113 -0
  76. package/src/client/primitives/Tabs.test.tsx +44 -0
  77. package/src/client/primitives/Tabs.tsx +100 -0
  78. package/src/client/primitives/Toast.test.tsx +77 -0
  79. package/src/client/primitives/Toast.tsx +89 -0
  80. package/src/client/primitives/Toolbar.test.tsx +50 -0
  81. package/src/client/primitives/Toolbar.tsx +86 -0
  82. package/src/client/primitives/index.ts +43 -0
  83. package/src/client/public/clef.svg +2 -0
  84. package/src/client/screens/BackendScreen.tsx +104 -363
  85. package/src/client/screens/DiffView.tsx +187 -378
  86. package/src/client/screens/EnvelopeScreen.test.tsx +542 -0
  87. package/src/client/screens/EnvelopeScreen.tsx +948 -0
  88. package/src/client/screens/GitLogView.tsx +48 -106
  89. package/src/client/screens/ImportScreen.tsx +105 -308
  90. package/src/client/screens/LintView.tsx +184 -379
  91. package/src/client/screens/ManifestScreen.tsx +283 -445
  92. package/src/client/screens/MatrixView.tsx +75 -91
  93. package/src/client/screens/NamespaceEditor.tsx +234 -609
  94. package/src/client/screens/PolicyView.tsx +183 -453
  95. package/src/client/screens/RecipientsScreen.tsx +71 -350
  96. package/src/client/screens/ResetScreen.tsx +67 -237
  97. package/src/client/screens/ScanScreen.tsx +85 -249
  98. package/src/client/screens/SchemaEditor.test.tsx +237 -0
  99. package/src/client/screens/SchemaEditor.tsx +435 -0
  100. package/src/client/screens/ServiceIdentitiesScreen.tsx +251 -788
  101. package/src/client/styles.css +77 -0
  102. package/src/client/theme.ts +27 -48
  103. package/dist/client/assets/index-Db6WgHgY.js +0 -38
@@ -1,9 +1,8 @@
1
1
  import React, { useState } from "react";
2
- import { theme } from "../theme";
3
- import { TopBar } from "../components/TopBar";
4
2
  import { Button } from "../components/Button";
5
3
  import { MatrixGrid } from "../components/MatrixGrid";
6
4
  import { SyncPanel } from "../components/SyncPanel";
5
+ import { Toolbar } from "../primitives";
7
6
  import type { ViewName } from "../components/Sidebar";
8
7
  import type { ClefManifest, MatrixStatus } from "@clef-sh/core";
9
8
 
@@ -27,12 +26,15 @@ export function MatrixView({
27
26
  const [syncingNs, setSyncingNs] = useState<string | null>(null);
28
27
  if (!manifest) {
29
28
  return (
30
- <div style={{ flex: 1, display: "flex", flexDirection: "column" }}>
31
- <TopBar title="Secret Matrix" subtitle="Loading..." />
32
- <div style={{ flex: 1, padding: 28 }}>
33
- <p style={{ color: theme.textMuted, fontFamily: theme.sans, fontSize: 13 }}>
34
- Loading manifest...
35
- </p>
29
+ <div className="flex flex-1 flex-col">
30
+ <Toolbar>
31
+ <div>
32
+ <Toolbar.Title>Secret Matrix</Toolbar.Title>
33
+ <Toolbar.Subtitle>Loading...</Toolbar.Subtitle>
34
+ </div>
35
+ </Toolbar>
36
+ <div className="flex-1 p-7">
37
+ <p className="font-sans text-[13px] text-ash">Loading manifest...</p>
36
38
  </div>
37
39
  </div>
38
40
  );
@@ -54,92 +56,45 @@ export function MatrixView({
54
56
  const fileCount = namespaces.length * environments.length;
55
57
 
56
58
  return (
57
- <div style={{ flex: 1, display: "flex", flexDirection: "column", overflow: "hidden" }}>
58
- <TopBar
59
- title="Secret Matrix"
60
- subtitle={`${namespaces.length} namespaces \u00B7 ${environments.length} environments \u00B7 ${fileCount} files`}
61
- actions={
62
- <>
63
- <Button onClick={() => setView("lint")}>Lint All</Button>
64
- <Button onClick={() => setView("manifest")} data-testid="matrix-add-environment-btn">
65
- + Environment
66
- </Button>
67
- <Button
68
- variant="primary"
69
- onClick={() => setView("manifest")}
70
- data-testid="matrix-add-namespace-btn"
71
- >
72
- + Namespace
73
- </Button>
74
- </>
75
- }
76
- />
59
+ <div className="flex flex-1 flex-col overflow-hidden">
60
+ <Toolbar>
61
+ <div>
62
+ <Toolbar.Title>Secret Matrix</Toolbar.Title>
63
+ <Toolbar.Subtitle>
64
+ {`${namespaces.length} namespaces · ${environments.length} environments · ${fileCount} files`}
65
+ </Toolbar.Subtitle>
66
+ </div>
67
+ <Toolbar.Actions>
68
+ <Button onClick={() => setView("lint")}>Lint All</Button>
69
+ <Button onClick={() => setView("manifest")} data-testid="matrix-add-environment-btn">
70
+ + Environment
71
+ </Button>
72
+ <Button
73
+ variant="primary"
74
+ onClick={() => setView("manifest")}
75
+ data-testid="matrix-add-namespace-btn"
76
+ >
77
+ + Namespace
78
+ </Button>
79
+ </Toolbar.Actions>
80
+ </Toolbar>
77
81
 
78
- <div style={{ flex: 1, overflow: "auto", padding: 28, position: "relative" }}>
82
+ <div className="relative flex-1 overflow-auto p-7">
79
83
  {matrixLoading && (
80
- <div
81
- style={{
82
- position: "absolute",
83
- inset: 0,
84
- display: "flex",
85
- alignItems: "center",
86
- justifyContent: "center",
87
- background: `${theme.bg}dd`,
88
- zIndex: 10,
89
- borderRadius: 8,
90
- }}
91
- >
92
- <div
93
- style={{
94
- background: theme.surface,
95
- border: `1px solid ${theme.border}`,
96
- borderRadius: 10,
97
- padding: "24px 36px",
98
- textAlign: "center",
99
- }}
100
- >
101
- <div style={{ fontSize: 20, color: theme.accent, marginBottom: 8 }}>{"\u266A"}</div>
102
- <div style={{ fontFamily: theme.sans, fontSize: 13, color: theme.textMuted }}>
103
- Loading...
104
- </div>
84
+ <div className="absolute inset-0 z-10 flex items-center justify-center bg-ink-950/85 rounded-lg">
85
+ <div className="rounded-card border border-edge bg-ink-850 px-9 py-6 text-center">
86
+ <div className="mb-2 text-[20px] text-gold-500">{"♪"}</div>
87
+ <div className="font-sans text-[13px] text-ash">Loading...</div>
105
88
  </div>
106
89
  </div>
107
90
  )}
108
- {/* Summary pills */}
109
- <div style={{ display: "flex", gap: 10, marginBottom: 28 }}>
110
- {[
111
- { label: `${healthyCount} healthy`, color: theme.green },
112
- { label: `${missingCount} missing keys`, color: theme.red },
113
- {
114
- label: `${warnCount} schema warning${warnCount !== 1 ? "s" : ""}`,
115
- color: theme.yellow,
116
- },
117
- ...(totalPending > 0
118
- ? [
119
- {
120
- label: `${totalPending} pending value${totalPending !== 1 ? "s" : ""}`,
121
- color: theme.accent,
122
- },
123
- ]
124
- : []),
125
- ].map((p) => (
126
- <div
127
- key={p.label}
128
- style={{
129
- fontFamily: theme.sans,
130
- fontSize: 12,
131
- fontWeight: 500,
132
- color: p.color,
133
- background: `${p.color}14`,
134
- border: `1px solid ${p.color}33`,
135
- borderRadius: 20,
136
- padding: "4px 14px",
137
- }}
138
- >
139
- {p.label}
140
- </div>
141
- ))}
142
- </div>
91
+
92
+ <SummaryPills
93
+ healthy={healthyCount}
94
+ missing={missingCount}
95
+ warn={warnCount}
96
+ pending={totalPending}
97
+ />
143
98
 
144
99
  <MatrixGrid
145
100
  namespaces={namespaces}
@@ -165,8 +120,7 @@ export function MatrixView({
165
120
  />
166
121
  )}
167
122
 
168
- {/* Quick actions */}
169
- <div style={{ marginTop: 20, display: "flex", gap: 10 }}>
123
+ <div className="mt-5 flex gap-2.5">
170
124
  <Button data-testid="diff-environments-btn" onClick={() => setView("diff")}>
171
125
  Diff environments
172
126
  </Button>
@@ -175,3 +129,33 @@ export function MatrixView({
175
129
  </div>
176
130
  );
177
131
  }
132
+
133
+ interface SummaryPillsProps {
134
+ healthy: number;
135
+ missing: number;
136
+ warn: number;
137
+ pending: number;
138
+ }
139
+
140
+ const PILL_BASE = "rounded-pill border px-3.5 py-1 font-sans text-[12px] font-medium";
141
+
142
+ function SummaryPills({ healthy, missing, warn, pending }: SummaryPillsProps) {
143
+ return (
144
+ <div className="mb-7 flex gap-2.5">
145
+ <span className={`${PILL_BASE} text-go-500 bg-go-500/10 border-go-500/20`}>
146
+ {healthy} healthy
147
+ </span>
148
+ <span className={`${PILL_BASE} text-stop-500 bg-stop-500/10 border-stop-500/20`}>
149
+ {missing} missing keys
150
+ </span>
151
+ <span className={`${PILL_BASE} text-warn-500 bg-warn-500/10 border-warn-500/20`}>
152
+ {warn} schema warning{warn !== 1 ? "s" : ""}
153
+ </span>
154
+ {pending > 0 && (
155
+ <span className={`${PILL_BASE} text-gold-500 bg-gold-500/10 border-gold-500/20`}>
156
+ {pending} pending value{pending !== 1 ? "s" : ""}
157
+ </span>
158
+ )}
159
+ </div>
160
+ );
161
+ }