@fougere/admin 0.3.0-alpha.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 (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +71 -0
  3. package/dist/dashboard.d.ts +74 -0
  4. package/dist/dashboard.d.ts.map +1 -0
  5. package/dist/dashboard.js +334 -0
  6. package/dist/dashboard.js.map +1 -0
  7. package/dist/extensions.d.ts +27 -0
  8. package/dist/extensions.d.ts.map +1 -0
  9. package/dist/extensions.js +74 -0
  10. package/dist/extensions.js.map +1 -0
  11. package/dist/facets.d.ts +60 -0
  12. package/dist/facets.d.ts.map +1 -0
  13. package/dist/facets.js +39 -0
  14. package/dist/facets.js.map +1 -0
  15. package/dist/index.d.ts +19 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +19 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/provider.d.ts +163 -0
  20. package/dist/provider.d.ts.map +1 -0
  21. package/dist/provider.js +205 -0
  22. package/dist/provider.js.map +1 -0
  23. package/dist/react.d.ts +70 -0
  24. package/dist/react.d.ts.map +1 -0
  25. package/dist/react.js +235 -0
  26. package/dist/react.js.map +1 -0
  27. package/dist/resources.d.ts +69 -0
  28. package/dist/resources.d.ts.map +1 -0
  29. package/dist/resources.js +92 -0
  30. package/dist/resources.js.map +1 -0
  31. package/dist/runtime.d.ts +22 -0
  32. package/dist/runtime.d.ts.map +1 -0
  33. package/dist/runtime.js +36 -0
  34. package/dist/runtime.js.map +1 -0
  35. package/dist/theme.d.ts +10 -0
  36. package/dist/theme.d.ts.map +1 -0
  37. package/dist/theme.js +419 -0
  38. package/dist/theme.js.map +1 -0
  39. package/dist/topology-page.d.ts +8 -0
  40. package/dist/topology-page.d.ts.map +1 -0
  41. package/dist/topology-page.js +69 -0
  42. package/dist/topology-page.js.map +1 -0
  43. package/dist/topology.d.ts +46 -0
  44. package/dist/topology.d.ts.map +1 -0
  45. package/dist/topology.js +58 -0
  46. package/dist/topology.js.map +1 -0
  47. package/package.json +76 -0
package/dist/theme.js ADDED
@@ -0,0 +1,419 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AppBar, Layout, Menu, TitlePortal, defaultDarkTheme, defaultLightTheme, useTranslate, } from 'react-admin';
3
+ import { SvgIcon } from '@mui/material';
4
+ /**
5
+ * The accent, and only the accent.
6
+ *
7
+ * One saturated colour in the whole panel: the primary action, the focus ring, the
8
+ * active menu item, the mark. Everything else is neutral, and a STATUS is semantic
9
+ * (green/amber/red/grey) rather than brand-tinted — the version before this painted
10
+ * every chip in brand green, so `draft`, `published` and `suspended` were one colour.
11
+ */
12
+ const fern = {
13
+ 50: '#EDF9F2', 100: '#D3F0E0', 200: '#A8E1C3', 300: '#74CDA1', 400: '#45B37F',
14
+ 500: '#22995F', 600: '#16794D', 700: '#116040', 800: '#0E4C34', 900: '#0B3D2B',
15
+ };
16
+ /**
17
+ * The neutrals, by ROLE rather than by lightness.
18
+ *
19
+ * Nine names that each answer one question — what is behind the page, what is behind a
20
+ * card, which line separates two things, which grey is text. Picking a grey per site is
21
+ * what produces borders that jump between components and hovers nobody can see, and it
22
+ * is the difference this file could not state while it held three hex values.
23
+ *
24
+ * Dark is not an inversion: it is the same roles, instantiated again. A dark canvas is
25
+ * `#0B0C0E`, never `#000` — pure black has no room for a surface above it.
26
+ */
27
+ const neutral = {
28
+ light: {
29
+ canvas: '#FCFCFD', surface: '#FFFFFF', subtle: '#F7F8F9', sunken: '#F1F3F5',
30
+ borderSubtle: '#ECEEF0', border: '#E1E4E8', borderStrong: '#D0D5DA',
31
+ muted: '#6E7781', text: '#1A1D21',
32
+ },
33
+ dark: {
34
+ canvas: '#0B0C0E', surface: '#141619', subtle: '#1A1D21', sunken: '#101215',
35
+ borderSubtle: '#212529', border: '#2A2F35', borderStrong: '#3A4048',
36
+ muted: '#969DA6', text: '#E6E9EC',
37
+ },
38
+ };
39
+ const createFougereTheme = (mode) => {
40
+ const dark = mode === 'dark';
41
+ const base = dark ? defaultDarkTheme : defaultLightTheme;
42
+ const c = neutral[mode];
43
+ const accent = dark ? '#4FC08D' : fern[600];
44
+ const ring = dark ? 'rgba(79,192,141,0.32)' : 'rgba(22,121,77,0.20)';
45
+ /**
46
+ * The one shadow in the file, and it is for what FLOATS — a menu, a popover, a dialog.
47
+ * A card is separated by its edge; a thing that hovers over the page is separated by
48
+ * the light it blocks, and removing that shadow too would make a menu unreadable.
49
+ */
50
+ const overlay = dark
51
+ ? '0 10px 30px -10px rgba(0,0,0,.70), 0 2px 8px -4px rgba(0,0,0,.60)'
52
+ : '0 8px 24px -8px rgba(16,24,32,.16), 0 2px 6px -2px rgba(16,24,32,.10)';
53
+ return {
54
+ ...base,
55
+ palette: {
56
+ ...base.palette,
57
+ mode,
58
+ primary: {
59
+ main: accent,
60
+ light: dark ? '#7AD3AA' : fern[500],
61
+ dark: dark ? '#22995F' : fern[700],
62
+ contrastText: dark ? '#06180F' : '#FFFFFF',
63
+ },
64
+ secondary: { main: dark ? '#C9A227' : '#8A6D1F', contrastText: dark ? '#171203' : '#FFFFFF' },
65
+ background: { default: c.canvas, paper: c.surface },
66
+ text: { primary: c.text, secondary: c.muted, disabled: c.borderStrong },
67
+ divider: c.border,
68
+ success: { main: dark ? '#4FC08D' : '#127A4C' },
69
+ warning: { main: dark ? '#E0B341' : '#9A6B10' },
70
+ error: { main: dark ? '#F0736A' : '#C1372F' },
71
+ info: { main: dark ? '#67A9F5' : '#1D6FD0' },
72
+ },
73
+ shape: { borderRadius: 8 },
74
+ sidebar: { width: 232, closedWidth: 56 },
75
+ spacing: 8,
76
+ /**
77
+ * A short scale, tightly set. A back-office is read at 13px, not 16 — the air
78
+ * belongs BETWEEN blocks, not inside the controls. Headings climb little (h1 is
79
+ * 24px, not 32) because nothing on an operator's screen needs to shout.
80
+ *
81
+ * The weights are 500/550/600/620, which only a VARIABLE font honours — the host
82
+ * must load one (`@fontsource-variable/inter`, or any variable family in the stack).
83
+ * With a static font every one of them rounds to 700, which is what the file did for
84
+ * its whole life: `Inter` was named here and loaded nowhere, so the panel ran on the
85
+ * system stack with four bold weights and read as a 2019 Material app.
86
+ */
87
+ typography: {
88
+ ...base.typography,
89
+ fontFamily: [
90
+ '"Inter Variable"', 'Inter', 'ui-sans-serif', '-apple-system',
91
+ 'BlinkMacSystemFont', '"Segoe UI"', 'sans-serif',
92
+ ].join(', '),
93
+ fontSize: 13.5,
94
+ h1: { fontSize: '1.5rem', lineHeight: 1.25, fontWeight: 620, letterSpacing: '-0.021em' },
95
+ h2: { fontSize: '1.25rem', lineHeight: 1.3, fontWeight: 620, letterSpacing: '-0.018em' },
96
+ h3: { fontSize: '1.0625rem', lineHeight: 1.35, fontWeight: 600, letterSpacing: '-0.014em' },
97
+ h4: { fontSize: '0.9375rem', lineHeight: 1.4, fontWeight: 600, letterSpacing: '-0.008em' },
98
+ h5: { fontSize: '0.875rem', lineHeight: 1.45, fontWeight: 600, letterSpacing: '-0.004em' },
99
+ h6: { fontSize: '0.8125rem', lineHeight: 1.45, fontWeight: 600, letterSpacing: 0 },
100
+ body1: { fontSize: '0.875rem', lineHeight: 1.55 },
101
+ body2: { fontSize: '0.8125rem', lineHeight: 1.5 },
102
+ caption: { fontSize: '0.75rem', lineHeight: 1.45, fontWeight: 500 },
103
+ button: { fontSize: '0.8125rem', fontWeight: 550, letterSpacing: '-0.004em', textTransform: 'none' },
104
+ },
105
+ components: {
106
+ ...base.components,
107
+ /** The shortest line in the file that stops this looking like Material. */
108
+ MuiButtonBase: { defaultProps: { disableRipple: true } },
109
+ MuiCssBaseline: {
110
+ styleOverrides: {
111
+ body: { backgroundImage: 'none', WebkitFontSmoothing: 'antialiased' },
112
+ '*::selection': { backgroundColor: dark ? 'rgba(79,192,141,.26)' : fern[100] },
113
+ '@media (prefers-reduced-motion: reduce)': {
114
+ '*': { transitionDuration: '0.01ms !important', animationDuration: '0.01ms !important' },
115
+ },
116
+ },
117
+ },
118
+ MuiAppBar: {
119
+ styleOverrides: {
120
+ root: {
121
+ color: c.text,
122
+ backgroundColor: dark ? 'rgba(11,12,14,.78)' : 'rgba(252,252,253,.78)',
123
+ backgroundImage: 'none',
124
+ borderBottom: `1px solid ${c.borderSubtle}`,
125
+ boxShadow: 'none',
126
+ backdropFilter: 'blur(12px) saturate(1.4)',
127
+ },
128
+ },
129
+ },
130
+ MuiDrawer: {
131
+ styleOverrides: {
132
+ paper: {
133
+ backgroundColor: c.canvas,
134
+ backgroundImage: 'none',
135
+ borderRight: `1px solid ${c.borderSubtle}`,
136
+ boxShadow: 'none',
137
+ },
138
+ },
139
+ },
140
+ MuiPaper: {
141
+ styleOverrides: {
142
+ root: { backgroundImage: 'none' },
143
+ elevation1: { border: `1px solid ${c.border}`, boxShadow: 'none' },
144
+ elevation8: { boxShadow: overlay, border: `1px solid ${c.border}` },
145
+ elevation24: { boxShadow: overlay, border: `1px solid ${c.border}` },
146
+ },
147
+ },
148
+ MuiCard: {
149
+ styleOverrides: {
150
+ root: { border: `1px solid ${c.border}`, borderRadius: 10, boxShadow: 'none' },
151
+ },
152
+ },
153
+ MuiCardContent: {
154
+ styleOverrides: { root: { padding: 16, '&:last-child': { paddingBottom: 16 } } },
155
+ },
156
+ /**
157
+ * Three weights, one hierarchy: `contained` is the action a screen is FOR,
158
+ * `outlined` an alternative to it, `text` everything else. A screen showing two
159
+ * contained buttons has answered no question for the reader.
160
+ */
161
+ MuiButton: {
162
+ defaultProps: { disableElevation: true, size: 'small' },
163
+ styleOverrides: {
164
+ root: {
165
+ minHeight: 32,
166
+ borderRadius: 6,
167
+ paddingInline: 12,
168
+ transition: 'background-color 120ms ease, border-color 120ms ease, color 120ms ease',
169
+ '&.Mui-focusVisible': { outline: `2px solid ${accent}`, outlineOffset: 1 },
170
+ },
171
+ contained: { boxShadow: 'none', '&:hover': { boxShadow: 'none' } },
172
+ outlined: {
173
+ borderColor: c.border,
174
+ color: c.text,
175
+ '&:hover': { borderColor: c.borderStrong, backgroundColor: c.subtle },
176
+ },
177
+ text: { color: c.muted, '&:hover': { color: c.text, backgroundColor: c.subtle } },
178
+ sizeSmall: { minHeight: 28, paddingInline: 10, fontSize: '.78125rem' },
179
+ sizeLarge: { minHeight: 36, paddingInline: 16 },
180
+ },
181
+ },
182
+ MuiIconButton: {
183
+ styleOverrides: {
184
+ root: {
185
+ borderRadius: 6,
186
+ padding: 6,
187
+ color: c.muted,
188
+ '&:hover': { color: c.text, backgroundColor: c.subtle },
189
+ '&.Mui-focusVisible': { outline: `2px solid ${accent}`, outlineOffset: 1 },
190
+ },
191
+ },
192
+ },
193
+ MuiTextField: { defaultProps: { variant: 'outlined', margin: 'dense', size: 'small', fullWidth: true } },
194
+ MuiFormControl: { defaultProps: { variant: 'outlined', margin: 'dense', size: 'small', fullWidth: true } },
195
+ MuiInputLabel: { styleOverrides: { root: { fontSize: '.8125rem', color: c.muted } } },
196
+ MuiOutlinedInput: {
197
+ styleOverrides: {
198
+ root: {
199
+ borderRadius: 6,
200
+ minHeight: 34,
201
+ fontSize: '.8125rem',
202
+ backgroundColor: dark ? 'rgba(255,255,255,.02)' : c.surface,
203
+ transition: 'box-shadow 120ms ease, border-color 120ms ease',
204
+ '& .MuiOutlinedInput-notchedOutline': { borderColor: c.border },
205
+ '&:hover .MuiOutlinedInput-notchedOutline': { borderColor: c.borderStrong },
206
+ '&.Mui-focused .MuiOutlinedInput-notchedOutline': { borderColor: accent, borderWidth: 1 },
207
+ '&.Mui-focused': { boxShadow: `0 0 0 3px ${ring}` },
208
+ },
209
+ input: { paddingBlock: 7 },
210
+ },
211
+ },
212
+ /** Neutral by default. A status earns its colour from `color`, at the call site. */
213
+ MuiChip: {
214
+ styleOverrides: {
215
+ root: {
216
+ borderRadius: 6,
217
+ height: 22,
218
+ fontSize: '.75rem',
219
+ fontWeight: 550,
220
+ backgroundColor: c.subtle,
221
+ color: c.text,
222
+ border: `1px solid ${c.borderSubtle}`,
223
+ },
224
+ label: { paddingInline: 8 },
225
+ colorPrimary: {
226
+ backgroundColor: dark ? 'rgba(79,192,141,.14)' : fern[50],
227
+ color: dark ? '#8FDCB8' : fern[700],
228
+ borderColor: dark ? 'rgba(79,192,141,.24)' : fern[200],
229
+ },
230
+ // The root above paints every chip neutral, so a chip asking for `error` used to
231
+ // come out identical to the count beside it — and a refusal count that reads like
232
+ // a total is the one number on a topology page that must not.
233
+ colorError: {
234
+ backgroundColor: dark ? 'rgba(240,115,106,.14)' : '#FDF0EF',
235
+ color: dark ? '#F0736A' : '#C1372F',
236
+ borderColor: dark ? 'rgba(240,115,106,.26)' : '#F3CFCC',
237
+ },
238
+ },
239
+ },
240
+ MuiTableCell: {
241
+ styleOverrides: {
242
+ root: { borderBottomColor: c.borderSubtle, paddingBlock: 8, paddingInline: 12, fontSize: '.8125rem' },
243
+ // Sentence case. Uppercase headers with positive tracking are the single most
244
+ // visible 2015-era Material signature, and they cost legibility to boot.
245
+ head: {
246
+ color: c.muted,
247
+ backgroundColor: c.subtle,
248
+ fontSize: '.75rem',
249
+ fontWeight: 550,
250
+ letterSpacing: 0,
251
+ textTransform: 'none',
252
+ paddingBlock: 9,
253
+ borderBottom: `1px solid ${c.border}`,
254
+ },
255
+ },
256
+ },
257
+ MuiTableRow: {
258
+ styleOverrides: {
259
+ root: {
260
+ transition: 'background-color 100ms ease',
261
+ '&:hover': { backgroundColor: c.subtle },
262
+ '&.Mui-selected, &.Mui-selected:hover': {
263
+ backgroundColor: dark ? 'rgba(79,192,141,.10)' : fern[50],
264
+ },
265
+ },
266
+ },
267
+ },
268
+ MuiTooltip: {
269
+ styleOverrides: {
270
+ tooltip: {
271
+ backgroundColor: dark ? '#2A2F35' : '#1A1D21',
272
+ fontSize: '.75rem',
273
+ borderRadius: 6,
274
+ paddingBlock: 5,
275
+ paddingInline: 8,
276
+ },
277
+ },
278
+ },
279
+ MuiMenu: {
280
+ styleOverrides: { paper: { borderRadius: 8, boxShadow: overlay, border: `1px solid ${c.border}` } },
281
+ },
282
+ MuiMenuItem: {
283
+ styleOverrides: { root: { fontSize: '.8125rem', minHeight: 32, borderRadius: 5, marginInline: 4 } },
284
+ },
285
+ MuiDivider: { styleOverrides: { root: { borderColor: c.borderSubtle } } },
286
+ MuiSkeleton: { styleOverrides: { root: { backgroundColor: c.sunken, borderRadius: 6 } } },
287
+ RaAppBar: {
288
+ styleOverrides: {
289
+ root: {
290
+ '& .RaAppBar-toolbar': { minHeight: 52, paddingInline: 14 },
291
+ '& .RaAppBar-menuButton': { marginRight: 6 },
292
+ },
293
+ },
294
+ },
295
+ RaLayout: {
296
+ styleOverrides: {
297
+ root: {
298
+ '& .RaLayout-appFrame': { marginTop: 52 },
299
+ '& .RaLayout-content': { padding: '20px 24px 28px', backgroundColor: c.canvas },
300
+ },
301
+ },
302
+ },
303
+ RaMenuItemLink: {
304
+ styleOverrides: {
305
+ root: {
306
+ minHeight: 34,
307
+ margin: '1px 8px',
308
+ paddingInline: 10,
309
+ borderRadius: 6,
310
+ fontSize: '.8125rem',
311
+ fontWeight: 500,
312
+ color: c.muted,
313
+ transition: 'background-color 100ms ease, color 100ms ease',
314
+ '& .MuiListItemIcon-root': {
315
+ minWidth: 30,
316
+ color: 'inherit',
317
+ '& .MuiSvgIcon-root': { fontSize: 18 },
318
+ },
319
+ '&:hover': { color: c.text, backgroundColor: c.subtle },
320
+ '&.RaMenuItemLink-active': {
321
+ color: dark ? '#8FDCB8' : fern[700],
322
+ fontWeight: 600,
323
+ backgroundColor: dark ? 'rgba(79,192,141,.11)' : fern[50],
324
+ '& .MuiSvgIcon-root': { color: accent },
325
+ },
326
+ },
327
+ },
328
+ },
329
+ RaDatagrid: {
330
+ styleOverrides: {
331
+ root: {
332
+ borderRadius: 10,
333
+ overflow: 'hidden',
334
+ border: `1px solid ${c.border}`,
335
+ '& .RaDatagrid-headerCell': { color: c.muted },
336
+ },
337
+ },
338
+ },
339
+ RaToolbar: {
340
+ styleOverrides: {
341
+ root: {
342
+ backgroundColor: 'transparent',
343
+ borderTop: `1px solid ${c.borderSubtle}`,
344
+ marginTop: 16,
345
+ paddingTop: 16,
346
+ },
347
+ },
348
+ },
349
+ },
350
+ };
351
+ };
352
+ export const fougereLightTheme = createFougereTheme('light');
353
+ export const fougereDarkTheme = createFougereTheme('dark');
354
+ const MAIN = { from: [14.5, 29.5], via: [11.5, 16.5], to: [18.4, 8.1] };
355
+ const SIDE = { from: [15.5, 26.5], via: [21, 21], to: [25.5, 13.5] };
356
+ function leaflets({ from, via, to }, count, maxLength, maxWidth, span) {
357
+ const [bx, by] = from;
358
+ const [cx, cy] = via;
359
+ const [tx, ty] = to;
360
+ const at = (t) => [
361
+ (1 - t) ** 2 * bx + 2 * (1 - t) * t * cx + t ** 2 * tx,
362
+ (1 - t) ** 2 * by + 2 * (1 - t) * t * cy + t ** 2 * ty,
363
+ ];
364
+ const along = (t) => {
365
+ const dx = 2 * (1 - t) * (cx - bx) + 2 * t * (tx - cx);
366
+ const dy = 2 * (1 - t) * (cy - by) + 2 * t * (ty - cy);
367
+ const n = Math.hypot(dx, dy);
368
+ return [dx / n, dy / n];
369
+ };
370
+ const r = (n) => n.toFixed(2);
371
+ const out = [];
372
+ for (let i = 0; i < count; i += 1) {
373
+ const t = span[0] + i * ((span[1] - span[0]) / (count - 1));
374
+ const [px, py] = at(t);
375
+ const [ax, ay] = along(t);
376
+ const length = maxLength * (1 - 0.55 * t);
377
+ const width = maxWidth * (1 - 0.35 * t);
378
+ for (const side of [1, -1]) {
379
+ // The leaflet's axis: the normal, leaned toward the tip. Both sides lean the same
380
+ // way, which is what stops a generated frond from looking like a fish bone.
381
+ const kx = -ay * side + ax * 0.52;
382
+ const ky = ax * side + ay * 0.52;
383
+ const k = Math.hypot(kx, ky);
384
+ const [dx, dy] = [kx / k, ky / k];
385
+ const [ex, ey] = [px + dx * length, py + dy * length];
386
+ const [mx, my] = [px + dx * length * 0.42, py + dy * length * 0.42];
387
+ out.push(`M${r(px)} ${r(py)}`
388
+ + `C${r(mx - dy * width)} ${r(my + dx * width)} ${r(ex - dy * width * 0.35)} ${r(ey + dx * width * 0.35)} ${r(ex)} ${r(ey)}`
389
+ + `C${r(ex + dy * width * 0.35)} ${r(ey - dx * width * 0.35)} ${r(mx + dy * width)} ${r(my - dx * width)} ${r(px)} ${r(py)}Z`);
390
+ }
391
+ }
392
+ return out;
393
+ }
394
+ const MAIN_LEAFLETS = leaflets(MAIN, 8, 6.2, 2.0, [0.06, 0.82]);
395
+ const SIDE_LEAFLETS = leaflets(SIDE, 5, 4.2, 1.6, [0.14, 0.86]);
396
+ const FERN_DEEP = '#5B9821';
397
+ const FERN_LIGHT = '#8DC02C';
398
+ export function FougereMark({ size = 28 }) {
399
+ return (_jsxs("svg", { "aria-hidden": "true", width: size, height: size, viewBox: "0 0 32 32", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [_jsxs("g", { fill: FERN_DEEP, children: [_jsx("path", { d: "M14.5 29.5Q11.5 16.5 18.4 8.1", fill: "none", stroke: FERN_DEEP, strokeWidth: "1.5", strokeLinecap: "round" }), _jsx("path", { d: "M18.4 8.1c1.1-1.5 3.7-1.7 4 .5c.25 1.85-2.1 2.55-2.75 1.1", fill: "none", stroke: FERN_DEEP, strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }), MAIN_LEAFLETS.map((d) => _jsx("path", { d: d }, d))] }), _jsxs("g", { fill: FERN_LIGHT, children: [_jsx("path", { d: "M15.5 26.5Q21 21 25.5 13.5", fill: "none", stroke: FERN_LIGHT, strokeWidth: "1.25", strokeLinecap: "round" }), SIDE_LEAFLETS.map((d) => _jsx("path", { d: d }, d))] })] }));
400
+ }
401
+ export function FougereAppBar(props) {
402
+ return (_jsxs(AppBar, { ...props, color: "inherit", elevation: 0, children: [_jsxs("span", { "aria-label": "Fougere", style: { display: 'inline-flex', alignItems: 'center', gap: 10, flexShrink: 0 }, children: [_jsx("span", { style: { display: 'inline-flex', color: 'var(--mui-palette-primary-main, #2d5933)' }, children: _jsx(FougereMark, {}) }), _jsx("span", { style: { fontSize: 16, fontWeight: 750, letterSpacing: '-0.025em' }, children: "Fougere" })] }), _jsx("span", { "aria-hidden": "true", style: { width: 1, height: 24, margin: '0 18px', background: 'currentColor', opacity: 0.12 } }), _jsx(TitlePortal, { style: { flex: 1, minWidth: 0, fontSize: 14, fontWeight: 600, opacity: 0.68 } })] }));
403
+ }
404
+ const TopologyIcon = (props) => (_jsx(SvgIcon, { ...props, children: _jsx("path", { d: "M12 2a3 3 0 0 1 1 5.83V10h4a3 3 0 0 1 3 3v1.17a3 3 0 1 1-2 0V13a1 1 0 0 0-1-1h-4v2.17a3 3 0 1 1-2 0V12H7a1 1 0 0 0-1 1v1.17a3 3 0 1 1-2 0V13a3 3 0 0 1 3-3h4V7.83A3 3 0 0 1 12 2Z" }) }));
405
+ /**
406
+ * The derived menu, plus the one entry that is not a door.
407
+ *
408
+ * `Menu.ResourceItems` keeps the resources the card produced — the menu stays derived, and
409
+ * this adds beside it rather than replacing it. The topology entry shows even when nothing
410
+ * answers: the page is the only place that can say what is missing.
411
+ */
412
+ const FougereMenu = () => {
413
+ const translate = useTranslate();
414
+ return (_jsxs(Menu, { children: [_jsx(Menu.DashboardItem, {}), _jsx(Menu.ResourceItems, {}), _jsx(Menu.Item, { to: "/topology", primaryText: translate('fougere.admin.topology.title', { _: 'Topology' }), leftIcon: _jsx(TopologyIcon, {}) })] }));
415
+ };
416
+ export function FougereLayout(props) {
417
+ return _jsx(Layout, { ...props, appBar: FougereAppBar, menu: FougereMenu });
418
+ }
419
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type ReactElement } from 'react';
2
+ import { type Fetcher } from '@fougere/app/client';
3
+ export interface FougereTopologyProps {
4
+ endpoint?: string;
5
+ fetcher?: Fetcher;
6
+ }
7
+ export declare function FougereTopology({ endpoint, fetcher }?: FougereTopologyProps): ReactElement;
8
+ //# sourceMappingURL=topology-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology-page.d.ts","sourceRoot":"","sources":["../src/topology-page.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAE/D,OAAO,EAA4C,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AA6E7F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,EAAE,QAAwB,EAAE,OAAwB,EAAE,GAAE,oBAAyB,GAAG,YAAY,CA6F/H"}
@@ -0,0 +1,69 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * The shape of the system, drawn from what the app says about itself.
5
+ *
6
+ * Every other page in this panel renders a DOOR — a list, a form, a row. This one renders
7
+ * the app: which fronds run in the process it is talking to, which answered from somewhere
8
+ * else, and who called whom. Nothing here is configured, and nothing is declared: a frond
9
+ * is remote because it answered a call nobody hosts.
10
+ *
11
+ * It is served by `@fougere/observability`, so its absence is a legible state and not an
12
+ * error — which is why the entry stays in the menu when nothing answers. Hiding it would
13
+ * hide the one place that can say what is missing.
14
+ */
15
+ import { Box, Card, CardContent, Chip, Skeleton, Typography } from '@mui/material';
16
+ import { useEffect, useState } from 'react';
17
+ import { Title, useTranslate } from 'react-admin';
18
+ import { CALL_ENDPOINT, fetcher as browserFetcher } from '@fougere/app/client';
19
+ import { fetchTopology, isOpaque, nodesOf } from './topology.js';
20
+ /**
21
+ * Every sentence this page draws goes through a key. Nothing under `@fougere/admin` is
22
+ * written in a language — the counts below carry `smart_count`, which is what lets a
23
+ * translation pick its own plural rather than inherit English's.
24
+ */
25
+ function useLabels() {
26
+ const translate = useTranslate();
27
+ return (key, fallback, options) => translate(`fougere.admin.${key}`, { _: fallback, ...options });
28
+ }
29
+ const Row = ({ children }) => (_jsx(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' }, children: children }));
30
+ /** One call path, with its refusals — the only number here that is a health signal. */
31
+ function EdgeLine({ edge, direction }) {
32
+ const label = useLabels();
33
+ return (_jsxs(Row, { children: [_jsx(Typography, { variant: "caption", sx: { fontFamily: 'monospace' }, children: direction === 'out' ? `→ ${edge.to}` : `← ${edge.from}` }), _jsx(Typography, { variant: "caption", color: "text.secondary", children: edge.count }), edge.errors > 0 && (_jsx(Chip, { size: "small", color: "error", label: label('topology.refused', `${edge.errors} refused`, { smart_count: edge.errors }) }))] }));
34
+ }
35
+ function FrondCard({ node }) {
36
+ const label = useLabels();
37
+ const here = node.placement === 'local';
38
+ return (_jsx(Card, { variant: "outlined", children: _jsxs(CardContent, { sx: { display: 'grid', gap: 1 }, children: [_jsxs(Row, { children: [_jsx(Typography, { variant: "h6", sx: { fontWeight: 700 }, children: node.frond }), _jsx(Chip, { size: "small", color: here ? 'primary' : 'default', label: here ? label('topology.here', 'here') : label('topology.elsewhere', 'elsewhere') })] }), _jsx(Typography, { variant: "body2", color: "text.secondary", children: isOpaque(node)
39
+ ? label('topology.opaque', 'Its shape is published by the process that owns it.')
40
+ : `${label('topology.entities', `${node.entities} entities`, { smart_count: node.entities })}`
41
+ + ` · ${label('topology.doors', `${node.doors} doors`, { smart_count: node.doors })}` }), node.calls.map((edge) => _jsx(EdgeLine, { edge: edge, direction: "out" }, `out-${edge.to}`)), node.calledBy.map((edge) => _jsx(EdgeLine, { edge: edge, direction: "in" }, `in-${edge.from}`))] }) }));
42
+ }
43
+ export function FougereTopology({ endpoint = CALL_ENDPOINT, fetcher = browserFetcher } = {}) {
44
+ const label = useLabels();
45
+ const [state, setState] = useState({ status: 'loading' });
46
+ useEffect(() => {
47
+ let live = true;
48
+ fetchTopology(endpoint, fetcher)
49
+ .then((report) => { if (live)
50
+ setState(report ? { status: 'served', report } : { status: 'unobserved' }); })
51
+ .catch((error) => { if (live)
52
+ setState({ status: 'failed', error }); });
53
+ return () => { live = false; };
54
+ }, [endpoint, fetcher]);
55
+ const title = _jsx(Title, { title: label('topology.title', 'Topology') });
56
+ if (state.status === 'loading') {
57
+ return _jsxs(Box, { sx: { p: 3 }, children: [title, _jsx(Skeleton, { height: 120 }), _jsx(Skeleton, { height: 120 })] });
58
+ }
59
+ if (state.status === 'unobserved') {
60
+ return (_jsxs(Box, { sx: { p: 3, maxWidth: 620 }, children: [title, _jsx(Card, { children: _jsxs(CardContent, { sx: { display: 'grid', gap: 1.5 }, children: [_jsx(Typography, { variant: "h6", children: label('topology.unobservedTitle', 'This app is not observing itself') }), _jsx(Typography, { variant: "body2", color: "text.secondary", children: label('topology.unobservedBody', 'The shape of a system is read from inside the process it describes, and this one publishes none. Install @fougere/observability and declare it as an extension of the boot.') }), _jsx(Typography, { component: "pre", variant: "caption", sx: { p: 1.5, borderRadius: 1.5, bgcolor: 'action.hover', overflowX: 'auto' }, children: "import { observability } from '@fougere/observability';\n\nextensions: [observability()]" })] }) })] }));
61
+ }
62
+ if (state.status === 'failed') {
63
+ return (_jsxs(Box, { sx: { p: 3, maxWidth: 620 }, children: [title, _jsx(Card, { children: _jsxs(CardContent, { sx: { display: 'grid', gap: 1.5 }, children: [_jsx(Typography, { variant: "h6", children: label('topology.failedTitle', 'The app did not answer') }), _jsx(Typography, { component: "pre", variant: "caption", sx: { p: 1.5, borderRadius: 1.5, bgcolor: 'action.hover', whiteSpace: 'pre-wrap', overflowWrap: 'anywhere' }, children: state.error?.message ?? String(state.error) })] }) })] }));
64
+ }
65
+ const nodes = nodesOf(state.report);
66
+ const elsewhere = nodes.filter((node) => node.placement === 'remote').length;
67
+ return (_jsxs(Box, { sx: { p: 3, display: 'grid', gap: 2 }, children: [title, _jsxs(Row, { children: [_jsxs(Typography, { variant: "body2", color: "text.secondary", children: [label('topology.here_count', `${nodes.length - elsewhere} here`, { smart_count: nodes.length - elsewhere }), ' · ', label('topology.elsewhere_count', `${elsewhere} elsewhere`, { smart_count: elsewhere }), ' · ', label('topology.paths', `${state.report.edges.length} observed call paths`, { smart_count: state.report.edges.length })] }), state.report.active > 0 && (_jsx(Chip, { size: "small", color: "primary", label: label('topology.inFlight', `${state.report.active} in flight`, { smart_count: state.report.active }) }))] }), _jsx(Box, { sx: { display: 'grid', gap: 2, gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))' }, children: nodes.map((node) => _jsx(FrondCard, { node: node }, node.frond)) }), state.report.edges.length === 0 && (_jsx(Typography, { variant: "caption", color: "text.secondary", children: label('topology.noEdges', 'No call between fronds observed yet — an edge appears the first time one calls another.') }))] }));
68
+ }
69
+ //# sourceMappingURL=topology-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology-page.js","sourceRoot":"","sources":["../src/topology-page.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * How the system is arranged, as the app itself reports it.
3
+ *
4
+ * The card answers what a process HOSTS; this answers what SHAPE it is in — which fronds
5
+ * run here, which answered from somewhere else, and who called whom. It is served by
6
+ * `@fougere/observability` on `rpc.topology`, so absence is an ordinary answer: an app
7
+ * that never installed the package has no topology to publish, and says so by refusing
8
+ * the op. Nothing here is declared — a frond is remote because it answered a call nobody
9
+ * hosts, never because a config line said so.
10
+ */
11
+ import { type Fetcher } from '@fougere/app/client';
12
+ import { type Edge, type FrondPlacement, type TopologyReport } from '@fougere/core/contract';
13
+ export type { TopologyReport, FrondPlacement, Edge };
14
+ /**
15
+ * The report, or `undefined` when the app serves no topology at all.
16
+ *
17
+ * The refusal is DISTINGUISHED, not swallowed: a `NOT_FOUND` on the op is the package not
18
+ * being wired — something the panel can explain — while anything else is a real failure
19
+ * and stays a failure. One reserved op that is absent must not read as an app that is down.
20
+ */
21
+ export declare function fetchTopology(endpoint?: string, fetcher?: Fetcher): Promise<TopologyReport | undefined>;
22
+ /** One frond as the page draws it: its placement, and the calls observed around it. */
23
+ export interface TopologyNode extends FrondPlacement {
24
+ /** Fronds this one called, with what it cost them. */
25
+ calls: Edge[];
26
+ /** Fronds that called this one. */
27
+ calledBy: Edge[];
28
+ }
29
+ /**
30
+ * The report read as a graph, local fronds first.
31
+ *
32
+ * Two passes over `edges` rather than one index per direction: a topology is bounded by
33
+ * fronds², so the whole thing is smaller than one page of rows and an index would be a
34
+ * second structure to keep true.
35
+ */
36
+ export declare function nodesOf(report: TopologyReport): TopologyNode[];
37
+ /**
38
+ * A frond this process called that publishes nothing of its own shape.
39
+ *
40
+ * The honest reading of `entities: 0, doors: 0` on a remote: its shape is published by the
41
+ * process that owns it, under its own service name — so a panel pointed here can say the
42
+ * frond is reachable and cannot say what it holds. Worth naming rather than drawing as an
43
+ * empty frond, which reads as a frond with nothing in it.
44
+ */
45
+ export declare function isOpaque(node: FrondPlacement): boolean;
46
+ //# sourceMappingURL=topology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology.d.ts","sourceRoot":"","sources":["../src/topology.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,IAAI,EACT,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;AAErD;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,QAAQ,SAAgB,EACxB,OAAO,GAAE,OAAwB,GAChC,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAYrC;AAED,uFAAuF;AACvF,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,sDAAsD;IACtD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,mCAAmC;IACnC,QAAQ,EAAE,IAAI,EAAE,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,YAAY,EAAE,CAS9D;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAEtD"}