@arch-cadre/panel 0.0.1 → 1.0.2

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 (63) hide show
  1. package/dist/actions/activity-log/index.cjs +19 -0
  2. package/dist/actions/activity-log/index.d.ts +1 -0
  3. package/dist/actions/activity-log/index.mjs +10 -0
  4. package/dist/actions/rbac/index.cjs +130 -0
  5. package/dist/actions/rbac/index.d.ts +35 -0
  6. package/dist/actions/rbac/index.mjs +92 -0
  7. package/dist/actions/session-manager/index.cjs +99 -0
  8. package/dist/actions/session-manager/index.d.ts +21 -0
  9. package/dist/actions/session-manager/index.mjs +73 -0
  10. package/dist/index.cjs +68 -1
  11. package/dist/index.d.ts +6 -0
  12. package/dist/index.mjs +90 -0
  13. package/dist/navigation.cjs +15 -1
  14. package/dist/navigation.mjs +17 -1
  15. package/dist/routes.cjs +31 -6
  16. package/dist/routes.mjs +34 -6
  17. package/dist/schema/activity-log.cjs +23 -0
  18. package/dist/schema/activity-log.d.ts +103 -0
  19. package/dist/schema/activity-log.mjs +15 -0
  20. package/dist/schema.cjs +16 -0
  21. package/dist/schema.d.ts +1 -0
  22. package/dist/schema.mjs +1 -0
  23. package/dist/ui/activity-log/components/ActivityStatsWidget.cjs +35 -0
  24. package/dist/ui/activity-log/components/ActivityStatsWidget.d.ts +2 -0
  25. package/dist/ui/activity-log/components/ActivityStatsWidget.mjs +15 -0
  26. package/dist/ui/activity-log/components/RecentLogsWidget.cjs +50 -0
  27. package/dist/ui/activity-log/components/RecentLogsWidget.d.ts +2 -0
  28. package/dist/ui/activity-log/components/RecentLogsWidget.mjs +29 -0
  29. package/dist/ui/activity-log/pages/log-list.cjs +61 -0
  30. package/dist/ui/activity-log/pages/log-list.d.ts +2 -0
  31. package/dist/ui/activity-log/pages/log-list.mjs +36 -0
  32. package/dist/ui/components/app-user.cjs +4 -5
  33. package/dist/ui/components/app-user.mjs +5 -7
  34. package/dist/ui/components/profile/components.cjs +4 -1
  35. package/dist/ui/components/profile/components.d.ts +4 -3
  36. package/dist/ui/components/profile/components.mjs +1 -0
  37. package/dist/ui/components/profile/link.cjs +10 -1
  38. package/dist/ui/components/profile/link.d.ts +2 -1
  39. package/dist/ui/components/profile/link.mjs +2 -1
  40. package/dist/ui/components/profile/page.cjs +4 -1
  41. package/dist/ui/components/profile/page.d.ts +2 -1
  42. package/dist/ui/components/profile/page.mjs +9 -2
  43. package/dist/ui/dashboard/page.cjs +6 -16
  44. package/dist/ui/dashboard/page.d.ts +1 -1
  45. package/dist/ui/dashboard/page.mjs +14 -6
  46. package/dist/ui/dashboard/widgets/WelcomeBackUserWidget.cjs +43 -0
  47. package/dist/ui/dashboard/widgets/WelcomeBackUserWidget.d.ts +2 -0
  48. package/dist/ui/dashboard/widgets/WelcomeBackUserWidget.mjs +18 -0
  49. package/dist/ui/rbac/pages/rbac-admin.cjs +328 -0
  50. package/dist/ui/rbac/pages/rbac-admin.d.ts +2 -0
  51. package/dist/ui/rbac/pages/rbac-admin.mjs +375 -0
  52. package/dist/ui/session-manager/components/sessions-list.cjs +160 -0
  53. package/dist/ui/session-manager/components/sessions-list.d.ts +13 -0
  54. package/dist/ui/session-manager/components/sessions-list.mjs +193 -0
  55. package/dist/ui/session-manager/pages/sessions-page.cjs +29 -0
  56. package/dist/ui/session-manager/pages/sessions-page.d.ts +2 -0
  57. package/dist/ui/session-manager/pages/sessions-page.mjs +9 -0
  58. package/locales/en/global.json +109 -1
  59. package/locales/pl/global.json +188 -0
  60. package/package.json +7 -6
  61. package/dist/ui/[...catchAll]/page.cjs +0 -127
  62. package/dist/ui/[...catchAll]/page.d.ts +0 -13
  63. package/dist/ui/[...catchAll]/page.mjs +0 -88
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+ "use client";
3
+
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ module.exports = RbacAdminPage;
8
+ var _intl = require("@arch-cadre/intl");
9
+ var _ui = require("@arch-cadre/ui");
10
+ var _button = require("@arch-cadre/ui/components/button");
11
+ var _card = require("@arch-cadre/ui/components/card");
12
+ var _dialog = require("@arch-cadre/ui/components/dialog");
13
+ var _input = require("@arch-cadre/ui/components/input");
14
+ var _table = require("@arch-cadre/ui/components/table");
15
+ var _react = _interopRequireWildcard(require("react"));
16
+ var React = _react;
17
+ var _rbac = require("../../../actions/rbac/index.cjs");
18
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
19
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
20
+ function RbacAdminPage() {
21
+ const [roles, setRoles] = (0, _react.useState)([]);
22
+ const [permissions, setPermissions] = (0, _react.useState)([]);
23
+ const [users, setUsers] = (0, _react.useState)([]);
24
+ const [loading, setLoading] = (0, _react.useState)(true);
25
+ const {
26
+ t
27
+ } = (0, _intl.useTranslation)();
28
+ const [newRoleName, setNewRoleName] = (0, _react.useState)("");
29
+ const [newPermissionName, setNewPermissionName] = (0, _react.useState)("");
30
+ const [selectedRole, setSelectedRole] = (0, _react.useState)(null);
31
+ const [rolePermissions, setRolePermissions] = (0, _react.useState)([]);
32
+ const [selectedUser, setSelectedUser] = (0, _react.useState)(null);
33
+ const [userRbacData, setUserRbacData] = (0, _react.useState)({
34
+ roles: [],
35
+ directPermissions: [],
36
+ effectivePermissions: []
37
+ });
38
+ const loadData = (0, _react.useCallback)(async () => {
39
+ setLoading(true);
40
+ try {
41
+ const [r, p, u] = await Promise.all([(0, _rbac.getRoles)(), (0, _rbac.getPermissions)(), (0, _rbac.getUsers)()]);
42
+ setRoles(r);
43
+ setPermissions(p);
44
+ setUsers(u);
45
+ } catch (e) {
46
+ console.error("[RBAC] Failed to load initial data:", e);
47
+ _ui.toast.error(t("Failed to load RBAC data."));
48
+ } finally {
49
+ setLoading(false);
50
+ }
51
+ }, []);
52
+ const loadRolePermissions = (0, _react.useCallback)(async roleId => {
53
+ try {
54
+ const p = await (0, _rbac.getRolePermissions)(roleId);
55
+ setRolePermissions(p);
56
+ } catch (e) {
57
+ console.error(`[RBAC] Failed to load permissions for role ${roleId}:`, e);
58
+ _ui.toast.error(t("Failed to load permissions for role."));
59
+ }
60
+ }, []);
61
+ const loadUserRbacData = (0, _react.useCallback)(async userId => {
62
+ try {
63
+ const data = await (0, _rbac.getUserRbacData)(userId);
64
+ setUserRbacData(data);
65
+ } catch (e) {
66
+ console.error(`[RBAC] Failed to load RBAC data for user ${userId}:`, e);
67
+ _ui.toast.error(t("Failed to load user RBAC data."));
68
+ }
69
+ }, []);
70
+ (0, _react.useEffect)(() => {
71
+ loadData();
72
+ }, [loadData]);
73
+ (0, _react.useEffect)(() => {
74
+ if (selectedRole?.id) {
75
+ loadRolePermissions(selectedRole.id);
76
+ }
77
+ }, [selectedRole?.id, loadRolePermissions]);
78
+ (0, _react.useEffect)(() => {
79
+ if (selectedUser?.id) {
80
+ loadUserRbacData(selectedUser.id);
81
+ }
82
+ }, [selectedUser?.id, loadUserRbacData]);
83
+ const handleCreateRole = (0, _react.useCallback)(async () => {
84
+ if (!newRoleName) return;
85
+ try {
86
+ await (0, _rbac.createRole)(newRoleName);
87
+ setNewRoleName("");
88
+ _ui.toast.success(t("Role created."));
89
+ loadData();
90
+ } catch (_e) {
91
+ _ui.toast.error(t("Failed to create role."));
92
+ }
93
+ }, [newRoleName, loadData]);
94
+ const handleCreatePermission = (0, _react.useCallback)(async () => {
95
+ if (!newPermissionName) return;
96
+ try {
97
+ await (0, _rbac.createPermission)(newPermissionName);
98
+ setNewPermissionName("");
99
+ _ui.toast.success(t("Permission created."));
100
+ loadData();
101
+ } catch (_e) {
102
+ _ui.toast.error(t("Failed to create permission."));
103
+ }
104
+ }, [newPermissionName, loadData]);
105
+ const handleDeleteRole = (0, _react.useCallback)(async id => {
106
+ try {
107
+ await (0, _rbac.deleteRole)(id);
108
+ _ui.toast.success(t("Role deleted."));
109
+ if (selectedRole?.id === id) setSelectedRole(null);
110
+ loadData();
111
+ } catch (_e) {
112
+ _ui.toast.error(t("Failed to delete role."));
113
+ }
114
+ }, [selectedRole, loadData]);
115
+ const handleDeletePermission = (0, _react.useCallback)(async id => {
116
+ try {
117
+ await (0, _rbac.deletePermission)(id);
118
+ _ui.toast.success(t("Permission deleted."));
119
+ loadData();
120
+ } catch (_e) {
121
+ _ui.toast.error(t("Failed to delete permission."));
122
+ }
123
+ }, [loadData]);
124
+ const togglePermissionForRole = (0, _react.useCallback)(async (permId, hasIt) => {
125
+ if (!selectedRole) return;
126
+ try {
127
+ if (hasIt) {
128
+ await (0, _rbac.revokePermissionFromRole)(selectedRole.id, permId);
129
+ } else {
130
+ await (0, _rbac.assignPermissionToRole)(selectedRole.id, permId);
131
+ }
132
+ loadRolePermissions(selectedRole.id);
133
+ } catch (_e) {
134
+ _ui.toast.error(t("Action failed."));
135
+ }
136
+ }, [selectedRole, loadRolePermissions]);
137
+ const toggleRoleForUser = (0, _react.useCallback)(async (roleId, hasIt) => {
138
+ if (!selectedUser) return;
139
+ try {
140
+ if (hasIt) {
141
+ await (0, _rbac.revokeRoleFromUser)(selectedUser.id, roleId);
142
+ } else {
143
+ await (0, _rbac.assignRoleToUser)(selectedUser.id, roleId);
144
+ }
145
+ loadUserRbacData(selectedUser.id);
146
+ } catch (_e) {
147
+ _ui.toast.error(t("Action failed."));
148
+ }
149
+ }, [selectedUser, loadUserRbacData]);
150
+ const togglePermissionForUser = (0, _react.useCallback)(async (permId, hasIt) => {
151
+ if (!selectedUser) return;
152
+ try {
153
+ if (hasIt) {
154
+ await (0, _rbac.revokePermissionFromUser)(selectedUser.id, permId);
155
+ } else {
156
+ await (0, _rbac.assignPermissionToUser)(selectedUser.id, permId);
157
+ }
158
+ loadUserRbacData(selectedUser.id);
159
+ } catch (_e) {
160
+ _ui.toast.error(t("Action failed."));
161
+ }
162
+ }, [selectedUser, loadUserRbacData]);
163
+ return /* @__PURE__ */React.createElement("div", {
164
+ className: "space-y-6"
165
+ }, /* @__PURE__ */React.createElement("div", {
166
+ className: "space-y-1"
167
+ }, /* @__PURE__ */React.createElement("h1", {
168
+ className: "text-3xl font-black tracking-tight flex items-center gap-2"
169
+ }, t("Role-Based Access Control Manager")), /* @__PURE__ */React.createElement("p", {
170
+ className: "text-muted-foreground"
171
+ }, t("Manage roles, permissions, and their relationships."))), /* @__PURE__ */React.createElement("div", {
172
+ className: "grid gap-6 lg:grid-cols-3"
173
+ }, /* @__PURE__ */React.createElement(_card.Card, {
174
+ className: "border-primary/5 shadow-sm"
175
+ }, /* @__PURE__ */React.createElement(_card.CardHeader, null, /* @__PURE__ */React.createElement(_card.CardTitle, null, t("Roles")), /* @__PURE__ */React.createElement(_card.CardDescription, null, t("System roles."))), /* @__PURE__ */React.createElement(_card.CardContent, {
176
+ className: "space-y-4"
177
+ }, /* @__PURE__ */React.createElement("div", {
178
+ className: "flex gap-2"
179
+ }, /* @__PURE__ */React.createElement(_input.Input, {
180
+ placeholder: t("New role..."),
181
+ value: newRoleName,
182
+ onChange: e => setNewRoleName(e.target.value)
183
+ }), /* @__PURE__ */React.createElement(_button.Button, {
184
+ onClick: handleCreateRole
185
+ }, t("Add"))), /* @__PURE__ */React.createElement("div", {
186
+ className: "border rounded-md max-h-[300px] overflow-auto"
187
+ }, /* @__PURE__ */React.createElement(_table.Table, null, /* @__PURE__ */React.createElement(_table.TableBody, null, roles.map(role => /* @__PURE__ */React.createElement(_table.TableRow, {
188
+ key: role.id,
189
+ className: selectedRole?.id === role.id ? "bg-primary/5" : ""
190
+ }, /* @__PURE__ */React.createElement(_table.TableCell, {
191
+ className: "font-medium cursor-pointer",
192
+ onClick: () => setSelectedRole(role)
193
+ }, role.name), /* @__PURE__ */React.createElement(_table.TableCell, {
194
+ className: "text-right"
195
+ }, /* @__PURE__ */React.createElement(_button.Button, {
196
+ variant: "ghost",
197
+ size: "icon",
198
+ onClick: () => handleDeleteRole(role.id)
199
+ }, /* @__PURE__ */React.createElement(_ui.Icon, {
200
+ icon: "solar:trash-bin-trash-bold",
201
+ className: "size-4 text-destructive"
202
+ })))))))))), /* @__PURE__ */React.createElement(_card.Card, {
203
+ className: "border-primary/5 shadow-sm"
204
+ }, /* @__PURE__ */React.createElement(_card.CardHeader, null, /* @__PURE__ */React.createElement(_card.CardTitle, null, t("Permissions")), /* @__PURE__ */React.createElement(_card.CardDescription, null, t("System permissions."))), /* @__PURE__ */React.createElement(_card.CardContent, {
205
+ className: "space-y-4"
206
+ }, /* @__PURE__ */React.createElement("div", {
207
+ className: "flex gap-2"
208
+ }, /* @__PURE__ */React.createElement(_input.Input, {
209
+ placeholder: t("New permission..."),
210
+ value: newPermissionName,
211
+ onChange: e => setNewPermissionName(e.target.value)
212
+ }), /* @__PURE__ */React.createElement(_button.Button, {
213
+ onClick: handleCreatePermission
214
+ }, t("Add"))), /* @__PURE__ */React.createElement("div", {
215
+ className: "border rounded-md max-h-[300px] overflow-auto"
216
+ }, /* @__PURE__ */React.createElement(_table.Table, null, /* @__PURE__ */React.createElement(_table.TableBody, null, permissions.map(perm => /* @__PURE__ */React.createElement(_table.TableRow, {
217
+ key: perm.id
218
+ }, /* @__PURE__ */React.createElement(_table.TableCell, {
219
+ className: "font-medium"
220
+ }, perm.name), /* @__PURE__ */React.createElement(_table.TableCell, {
221
+ className: "text-right"
222
+ }, /* @__PURE__ */React.createElement(_button.Button, {
223
+ variant: "ghost",
224
+ size: "icon",
225
+ onClick: () => handleDeletePermission(perm.id)
226
+ }, /* @__PURE__ */React.createElement(_ui.Icon, {
227
+ icon: "solar:trash-bin-trash-bold",
228
+ className: "size-4 text-destructive"
229
+ })))))))))), /* @__PURE__ */React.createElement(_card.Card, {
230
+ className: "border-primary/5 shadow-sm"
231
+ }, /* @__PURE__ */React.createElement(_card.CardHeader, null, /* @__PURE__ */React.createElement(_card.CardTitle, null, t("Users")), /* @__PURE__ */React.createElement(_card.CardDescription, null, t("Manage user roles."))), /* @__PURE__ */React.createElement(_card.CardContent, {
232
+ className: "space-y-4"
233
+ }, /* @__PURE__ */React.createElement("div", {
234
+ className: "border rounded-md max-h-[358px] overflow-auto"
235
+ }, /* @__PURE__ */React.createElement(_table.Table, null, /* @__PURE__ */React.createElement(_table.TableBody, null, users.map(user => /* @__PURE__ */React.createElement(_table.TableRow, {
236
+ key: user.id,
237
+ className: selectedUser?.id === user.id ? "bg-primary/5" : ""
238
+ }, /* @__PURE__ */React.createElement(_table.TableCell, {
239
+ className: "font-medium cursor-pointer",
240
+ onClick: () => setSelectedUser(user)
241
+ }, /* @__PURE__ */React.createElement("div", null, user.name), /* @__PURE__ */React.createElement("div", {
242
+ className: "text-[10px] text-muted-foreground"
243
+ }, user.email)))))))))), /* @__PURE__ */React.createElement(_dialog.Dialog, {
244
+ open: !!selectedRole,
245
+ onOpenChange: open => !open && setSelectedRole(null)
246
+ }, /* @__PURE__ */React.createElement(_dialog.DialogContent, null, /* @__PURE__ */React.createElement(_dialog.DialogHeader, null, /* @__PURE__ */React.createElement(_dialog.DialogTitle, null, t("Edit Role: {roleName}", {
247
+ roleName: selectedRole?.name
248
+ })), /* @__PURE__ */React.createElement(_dialog.DialogDescription, null, t("Manage permissions for role {roleName}", {
249
+ roleName: selectedRole?.name
250
+ })), /* @__PURE__ */React.createElement("div", {
251
+ className: "grid grid-cols-1 sm:grid-cols-2 gap-2"
252
+ }, permissions.map(perm => {
253
+ const hasIt = rolePermissions.some(rp => rp.id === perm.id);
254
+ return /* @__PURE__ */React.createElement(_button.Button, {
255
+ key: perm.id,
256
+ variant: hasIt ? "default" : "outline",
257
+ size: "sm",
258
+ className: "justify-start gap-2 h-auto py-2 px-3 overflow-hidden",
259
+ onClick: () => togglePermissionForRole(perm.id, hasIt)
260
+ }, /* @__PURE__ */React.createElement(_ui.Icon, {
261
+ icon: hasIt ? "solar:check-circle-bold" : "solar:circle-linear",
262
+ className: hasIt ? "text-primary-foreground" : "text-muted-foreground"
263
+ }), /* @__PURE__ */React.createElement("span", {
264
+ className: "truncate text-xs"
265
+ }, perm.name));
266
+ }))))), /* @__PURE__ */React.createElement(_dialog.Dialog, {
267
+ open: !!selectedUser,
268
+ onOpenChange: open => !open && setSelectedUser(null)
269
+ }, /* @__PURE__ */React.createElement(_dialog.DialogContent, null, /* @__PURE__ */React.createElement(_dialog.DialogHeader, null, /* @__PURE__ */React.createElement(_dialog.DialogTitle, null, t("Management for {selectedUser}", {
270
+ selectedUser: selectedUser?.name
271
+ })), /* @__PURE__ */React.createElement(_dialog.DialogDescription, null, t("Manage roles and permissions for {selectedUser}", {
272
+ selectedUser: selectedUser?.name
273
+ })), /* @__PURE__ */React.createElement("div", {
274
+ className: "space-y-6"
275
+ }, /* @__PURE__ */React.createElement("div", null, /* @__PURE__ */React.createElement("p", {
276
+ className: "text-[10px] font-black uppercase text-muted-foreground tracking-widest mb-3"
277
+ }, t("User Roles")), /* @__PURE__ */React.createElement("div", {
278
+ className: "grid grid-cols-1 sm:grid-cols-2 gap-2"
279
+ }, roles.map(role => {
280
+ const hasIt = userRbacData.roles.some(ur => ur.id === role.id);
281
+ return /* @__PURE__ */React.createElement(_button.Button, {
282
+ key: role.id,
283
+ variant: hasIt ? "default" : "outline",
284
+ size: "sm",
285
+ className: "justify-start gap-2 h-auto py-2 px-3 overflow-hidden",
286
+ onClick: () => toggleRoleForUser(role.id, hasIt)
287
+ }, /* @__PURE__ */React.createElement(_ui.Icon, {
288
+ icon: hasIt ? "solar:check-circle-bold" : "solar:circle-linear",
289
+ className: hasIt ? "text-primary-foreground" : "text-muted-foreground"
290
+ }), /* @__PURE__ */React.createElement("span", {
291
+ className: "truncate text-xs"
292
+ }, role.name));
293
+ }))), /* @__PURE__ */React.createElement("div", null, /* @__PURE__ */React.createElement("p", {
294
+ className: "text-[10px] font-black uppercase text-muted-foreground tracking-widest mb-3"
295
+ }, t("Direct Permissions (User-specific)")), /* @__PURE__ */React.createElement("div", {
296
+ className: "grid grid-cols-1 sm:grid-cols-2 gap-2"
297
+ }, permissions.map(perm => {
298
+ const isDirect = userRbacData.directPermissions.some(up => up.id === perm.id);
299
+ return /* @__PURE__ */React.createElement(_button.Button, {
300
+ key: perm.id,
301
+ variant: isDirect ? "default" : "outline",
302
+ size: "sm",
303
+ className: "justify-start gap-2 h-auto py-2 px-3 overflow-hidden",
304
+ onClick: () => togglePermissionForUser(perm.id, isDirect)
305
+ }, /* @__PURE__ */React.createElement(_ui.Icon, {
306
+ icon: isDirect ? "solar:check-circle-bold" : "solar:circle-linear",
307
+ className: isDirect ? "text-primary-foreground" : "text-muted-foreground"
308
+ }), /* @__PURE__ */React.createElement("span", {
309
+ className: "truncate text-xs"
310
+ }, perm.name));
311
+ }))), /* @__PURE__ */React.createElement("div", {
312
+ className: "pt-4 border-t"
313
+ }, /* @__PURE__ */React.createElement("p", {
314
+ className: "text-[10px] font-black uppercase text-muted-foreground tracking-widest mb-2"
315
+ }, t("Effective Permissions (inherited + direct)")), /* @__PURE__ */React.createElement("div", {
316
+ className: "flex flex-wrap gap-1"
317
+ }, userRbacData.effectivePermissions.map(p => /* @__PURE__ */React.createElement("div", {
318
+ key: p.id,
319
+ className: "bg-muted px-2 py-0.5 rounded text-[9px] font-mono"
320
+ }, p.name)), userRbacData.effectivePermissions.length === 0 && /* @__PURE__ */React.createElement("span", {
321
+ className: "text-[10px] italic"
322
+ }, t("No permissions")))))))), loading && /* @__PURE__ */React.createElement("div", {
323
+ className: "fixed inset-0 bg-background/50 backdrop-blur-sm flex items-center justify-center z-50"
324
+ }, /* @__PURE__ */React.createElement(_ui.Icon, {
325
+ icon: "svg-spinners:18-dots-indicator",
326
+ className: "size-12 text-primary"
327
+ })));
328
+ }
@@ -0,0 +1,2 @@
1
+ import * as React from "react";
2
+ export default function RbacAdminPage(): React.JSX.Element;