xray-manager 1.2.0 → 1.3.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 (39) hide show
  1. package/README.md +31 -863
  2. package/dist/commands/interactive.d.ts +0 -42
  3. package/dist/commands/interactive.d.ts.map +1 -1
  4. package/dist/commands/interactive.js +59 -182
  5. package/dist/commands/interactive.js.map +1 -1
  6. package/dist/commands/user.d.ts.map +1 -1
  7. package/dist/commands/user.js +23 -14
  8. package/dist/commands/user.js.map +1 -1
  9. package/dist/components/dashboard-widget.d.ts +18 -0
  10. package/dist/components/dashboard-widget.d.ts.map +1 -0
  11. package/dist/components/dashboard-widget.js +159 -0
  12. package/dist/components/dashboard-widget.js.map +1 -0
  13. package/dist/components/user-table.d.ts +8 -0
  14. package/dist/components/user-table.d.ts.map +1 -0
  15. package/dist/components/user-table.js +86 -0
  16. package/dist/components/user-table.js.map +1 -0
  17. package/dist/constants/theme.d.ts +34 -0
  18. package/dist/constants/theme.d.ts.map +1 -0
  19. package/dist/constants/theme.js +52 -0
  20. package/dist/constants/theme.js.map +1 -0
  21. package/dist/services/layout-manager.d.ts +8 -0
  22. package/dist/services/layout-manager.d.ts.map +1 -1
  23. package/dist/services/layout-manager.js +11 -0
  24. package/dist/services/layout-manager.js.map +1 -1
  25. package/dist/services/navigation-manager.d.ts +23 -0
  26. package/dist/services/navigation-manager.d.ts.map +1 -0
  27. package/dist/services/navigation-manager.js +39 -0
  28. package/dist/services/navigation-manager.js.map +1 -0
  29. package/dist/services/screen-manager.d.ts +13 -0
  30. package/dist/services/screen-manager.d.ts.map +1 -0
  31. package/dist/services/screen-manager.js +42 -0
  32. package/dist/services/screen-manager.js.map +1 -0
  33. package/dist/types/ui-components.d.ts +53 -0
  34. package/dist/types/ui-components.d.ts.map +1 -0
  35. package/dist/types/ui-components.js +3 -0
  36. package/dist/types/ui-components.js.map +1 -0
  37. package/dist/types/user.d.ts +11 -0
  38. package/dist/types/user.d.ts.map +1 -1
  39. package/package.json +2 -2
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.DashboardWidget = void 0;
40
+ const systemd_manager_1 = require("../services/systemd-manager");
41
+ const user_manager_1 = require("../services/user-manager");
42
+ const cli_table3_1 = __importDefault(require("cli-table3"));
43
+ const os = __importStar(require("os"));
44
+ const ui_symbols_1 = require("../constants/ui-symbols");
45
+ const theme_1 = require("../constants/theme");
46
+ class DashboardWidget {
47
+ constructor(serviceName = 'xray', configPath) {
48
+ this.status = {
49
+ serviceActive: false,
50
+ serviceSubState: 'unknown',
51
+ uptime: '0s',
52
+ userCount: 0,
53
+ systemLoad: '0.00',
54
+ memoryUsage: '0/0 MB',
55
+ osInfo: 'Unknown',
56
+ };
57
+ this.systemdManager = new systemd_manager_1.SystemdManager(serviceName);
58
+ this.userManager = new user_manager_1.UserManager(configPath, serviceName);
59
+ }
60
+ /**
61
+ * Refreshes the internal data snapshot
62
+ */
63
+ async refresh() {
64
+ try {
65
+ const [serviceStatus, users] = await Promise.all([
66
+ this.systemdManager.getStatus(),
67
+ this.userManager.listUsers().catch(() => []),
68
+ ]);
69
+ const load = os.loadavg();
70
+ const totalMem = Math.round(os.totalmem() / 1024 / 1024);
71
+ const freeMem = Math.round(os.freemem() / 1024 / 1024);
72
+ const usedMem = totalMem - freeMem;
73
+ const uptime = os.uptime();
74
+ this.status = {
75
+ serviceActive: serviceStatus.active,
76
+ serviceSubState: serviceStatus.subState,
77
+ uptime: this.formatUptime(uptime),
78
+ userCount: users.length,
79
+ systemLoad: load[0].toFixed(2),
80
+ memoryUsage: `${usedMem}/${totalMem} MB`,
81
+ osInfo: `${os.type()} ${os.release()}`,
82
+ };
83
+ }
84
+ catch (error) {
85
+ // Graceful degradation
86
+ console.error('Failed to refresh dashboard:', error);
87
+ }
88
+ }
89
+ /**
90
+ * Renders the dashboard
91
+ */
92
+ render(width) {
93
+ // Determine layout based on width
94
+ const table = new cli_table3_1.default({
95
+ head: [],
96
+ colWidths: this.calculateColWidths(width),
97
+ style: {
98
+ head: [],
99
+ border: ['gray'], // Apply neutral color to borders
100
+ },
101
+ // Use standard single line characters for cleaner look
102
+ chars: {
103
+ 'top': '─', 'top-mid': '┬', 'top-left': '┌', 'top-right': '┐',
104
+ 'bottom': '─', 'bottom-mid': '┴', 'bottom-left': '└', 'bottom-right': '┘',
105
+ 'left': '│', 'left-mid': '├', 'mid': '─', 'mid-mid': '┼',
106
+ 'right': '│', 'right-mid': '┤', 'middle': '│'
107
+ }
108
+ });
109
+ // Use indicators instead of coloring full text
110
+ const statusIcon = this.status.serviceActive
111
+ ? theme_1.THEME.success(theme_1.UI_CONSTANTS.INDICATOR.ACTIVE)
112
+ : theme_1.THEME.error(theme_1.UI_CONSTANTS.INDICATOR.ACTIVE); // Use dot for inactive too, just red
113
+ const statusText = this.status.serviceActive
114
+ ? theme_1.THEME.neutral('Active')
115
+ : theme_1.THEME.neutral(this.status.serviceSubState);
116
+ if (width < 60) {
117
+ // Compact Layout
118
+ table.push([`${theme_1.THEME.primary('Service')}: ${statusIcon} ${statusText}`], [`${theme_1.THEME.primary('Users')}: ${theme_1.THEME.highlight(String(this.status.userCount))}`], [`${theme_1.THEME.primary('Uptime')}: ${theme_1.THEME.neutral(this.status.uptime)}`]);
119
+ }
120
+ else {
121
+ // Standard/Wide Layout
122
+ const col1 = [
123
+ `${theme_1.THEME.primary('Service Status')}`,
124
+ `${statusIcon} ${statusText} ${theme_1.THEME.neutral(`(${this.status.uptime})`)}`
125
+ ].join('\n');
126
+ const col2 = [
127
+ `${theme_1.THEME.primary('System Resources')}`,
128
+ `${theme_1.THEME.neutral('Load:')} ${theme_1.THEME.highlight(this.status.systemLoad)}`,
129
+ `${theme_1.THEME.neutral('Mem:')} ${theme_1.THEME.highlight(this.status.memoryUsage)}`
130
+ ].join('\n');
131
+ const col3 = [
132
+ `${theme_1.THEME.primary('Users')}`,
133
+ `${theme_1.THEME.secondary(ui_symbols_1.menuIcons.USER)} ${theme_1.THEME.highlight(String(this.status.userCount))} ${theme_1.THEME.neutral('Active')}`
134
+ ].join('\n');
135
+ table.push([col1, col2, col3]);
136
+ }
137
+ return table.toString();
138
+ }
139
+ calculateColWidths(width) {
140
+ if (width < 60) {
141
+ return [width - 4]; // Single column accounting for borders
142
+ }
143
+ const contentWidth = width - 4; // Borders take ~4 chars
144
+ const colWidth = Math.floor(contentWidth / 3);
145
+ return [colWidth, colWidth, contentWidth - (colWidth * 2)];
146
+ }
147
+ formatUptime(seconds) {
148
+ const days = Math.floor(seconds / (3600 * 24));
149
+ const hours = Math.floor((seconds % (3600 * 24)) / 3600);
150
+ const minutes = Math.floor((seconds % 3600) / 60);
151
+ if (days > 0)
152
+ return `${days}d ${hours}h`;
153
+ if (hours > 0)
154
+ return `${hours}h ${minutes}m`;
155
+ return `${minutes}m`;
156
+ }
157
+ }
158
+ exports.DashboardWidget = DashboardWidget;
159
+ //# sourceMappingURL=dashboard-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-widget.js","sourceRoot":"","sources":["../../src/components/dashboard-widget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { UserConfig } from '../types/user';
2
+ /**
3
+ * Renders a list of users as a formatted table
4
+ * @param users - List of user configurations
5
+ * @param width - Available terminal width
6
+ */
7
+ export declare function renderUserTable(users: UserConfig[], width: number): string;
8
+ //# sourceMappingURL=user-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-table.d.ts","sourceRoot":"","sources":["../../src/components/user-table.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA+E1E"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.renderUserTable = renderUserTable;
7
+ const cli_table3_1 = __importDefault(require("cli-table3"));
8
+ const theme_1 = require("../constants/theme");
9
+ /**
10
+ * Renders a list of users as a formatted table
11
+ * @param users - List of user configurations
12
+ * @param width - Available terminal width
13
+ */
14
+ function renderUserTable(users, width) {
15
+ // Determine if we can show extra columns
16
+ const isWide = width >= 100;
17
+ const head = isWide
18
+ ? ['Username', 'UUID Prefix', 'Port', 'Protocol', 'Status']
19
+ : ['Username', 'UUID Prefix', 'Status'];
20
+ // Calculate adaptive column widths
21
+ // Standard: [20%, 30%, 20%] approx
22
+ // Wide: [15%, 25%, 10%, 10%, 15%] approx
23
+ const colWidths = isWide
24
+ ? [
25
+ Math.floor(width * 0.15),
26
+ Math.floor(width * 0.25),
27
+ Math.floor(width * 0.10),
28
+ Math.floor(width * 0.10),
29
+ Math.floor(width * 0.15)
30
+ ]
31
+ : [
32
+ Math.floor(width * 0.25),
33
+ Math.floor(width * 0.40),
34
+ Math.floor(width * 0.25)
35
+ ];
36
+ const table = new cli_table3_1.default({
37
+ head: head.map(h => theme_1.THEME.primary(h)), // Use theme color for headers
38
+ colWidths,
39
+ style: {
40
+ head: [],
41
+ border: ['gray'], // Apply neutral color to borders
42
+ },
43
+ // Use theme border style
44
+ chars: theme_1.UI_CONSTANTS.BORDER_STYLE === 'single' ? {
45
+ 'top': '─', 'top-mid': '┬', 'top-left': '┌', 'top-right': '┐',
46
+ 'bottom': '─', 'bottom-mid': '┴', 'bottom-left': '└', 'bottom-right': '┘',
47
+ 'left': '│', 'left-mid': '├', 'mid': '─', 'mid-mid': '┼',
48
+ 'right': '│', 'right-mid': '┤', 'middle': '│'
49
+ } : undefined
50
+ });
51
+ // Limit rows and show summary if too many
52
+ const MAX_ROWS = 10;
53
+ const showSummary = users.length > MAX_ROWS;
54
+ const displayUsers = showSummary ? users.slice(0, MAX_ROWS) : users;
55
+ displayUsers.forEach(user => {
56
+ const uuidPrefix = user.uuid ? `${user.uuid.substring(0, 8)}...` : 'N/A';
57
+ // Use theme indicator
58
+ const status = theme_1.THEME.success(`${theme_1.UI_CONSTANTS.INDICATOR.ACTIVE} Active`);
59
+ if (isWide) {
60
+ table.push([
61
+ user.username,
62
+ uuidPrefix,
63
+ String(user.port || 'N/A'),
64
+ user.protocol || 'vless',
65
+ status
66
+ ]);
67
+ }
68
+ else {
69
+ table.push([
70
+ user.username,
71
+ uuidPrefix,
72
+ status
73
+ ]);
74
+ }
75
+ });
76
+ if (showSummary) {
77
+ const remaining = users.length - MAX_ROWS;
78
+ const summaryText = `... and ${remaining} more users`;
79
+ // Create a row that spans all columns
80
+ const summaryRow = new Array(head.length).fill('');
81
+ summaryRow[0] = theme_1.THEME.neutral(summaryText);
82
+ table.push(summaryRow);
83
+ }
84
+ return table.toString();
85
+ }
86
+ //# sourceMappingURL=user-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-table.js","sourceRoot":"","sources":["../../src/components/user-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * UI Theme Configuration
3
+ *
4
+ * Defines the color palette and visual constants for the CLI.
5
+ *
6
+ * @module constants/theme
7
+ */
8
+ import chalk from 'chalk';
9
+ /**
10
+ * Semantic Color Theme
11
+ */
12
+ export declare const THEME: {
13
+ primary: chalk.Chalk;
14
+ secondary: chalk.Chalk;
15
+ success: chalk.Chalk;
16
+ warning: chalk.Chalk;
17
+ error: chalk.Chalk;
18
+ neutral: chalk.Chalk;
19
+ highlight: chalk.Chalk;
20
+ text: chalk.Chalk;
21
+ };
22
+ /**
23
+ * UI Visual Constants
24
+ */
25
+ export declare const UI_CONSTANTS: {
26
+ BORDER_STYLE: string;
27
+ INDICATOR: {
28
+ ACTIVE: string;
29
+ INACTIVE: string;
30
+ PENDING: string;
31
+ };
32
+ PADDING: number;
33
+ };
34
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/constants/theme.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,eAAO,MAAM,KAAK;;;;;;;;;CAwBjB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;CAcxB,CAAC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * UI Theme Configuration
4
+ *
5
+ * Defines the color palette and visual constants for the CLI.
6
+ *
7
+ * @module constants/theme
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.UI_CONSTANTS = exports.THEME = void 0;
14
+ const chalk_1 = __importDefault(require("chalk"));
15
+ /**
16
+ * Semantic Color Theme
17
+ */
18
+ exports.THEME = {
19
+ // Primary: Branding, interactive elements, headers
20
+ primary: chalk_1.default.cyan,
21
+ // Secondary: Subtitles, less critical info
22
+ secondary: chalk_1.default.blue,
23
+ // Success: Positive status, success messages
24
+ success: chalk_1.default.green,
25
+ // Warning: Warning messages, caution states
26
+ warning: chalk_1.default.yellow,
27
+ // Error: Error messages, failure states
28
+ error: chalk_1.default.red,
29
+ // Neutral: Static labels, borders, normal text
30
+ neutral: chalk_1.default.gray,
31
+ // Highlight: Selected items, focused elements
32
+ highlight: chalk_1.default.bold.cyan,
33
+ // Text: Standard text
34
+ text: chalk_1.default.white,
35
+ };
36
+ /**
37
+ * UI Visual Constants
38
+ */
39
+ exports.UI_CONSTANTS = {
40
+ // Border style for cli-table3
41
+ // 'single' provides a cleaner look than default double/heavy
42
+ BORDER_STYLE: 'single',
43
+ // Status Indicators
44
+ INDICATOR: {
45
+ ACTIVE: '●',
46
+ INACTIVE: '○',
47
+ PENDING: '◌',
48
+ },
49
+ // Spacing
50
+ PADDING: 1,
51
+ };
52
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/constants/theme.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;AAEH,kDAA0B;AAE1B;;GAEG;AACU,QAAA,KAAK,GAAG;IACnB,mDAAmD;IACnD,OAAO,EAAE,eAAK,CAAC,IAAI;IAEnB,2CAA2C;IAC3C,SAAS,EAAE,eAAK,CAAC,IAAI;IAErB,6CAA6C;IAC7C,OAAO,EAAE,eAAK,CAAC,KAAK;IAEpB,4CAA4C;IAC5C,OAAO,EAAE,eAAK,CAAC,MAAM;IAErB,wCAAwC;IACxC,KAAK,EAAE,eAAK,CAAC,GAAG;IAEhB,+CAA+C;IAC/C,OAAO,EAAE,eAAK,CAAC,IAAI;IAEnB,8CAA8C;IAC9C,SAAS,EAAE,eAAK,CAAC,IAAI,CAAC,IAAI;IAE1B,sBAAsB;IACtB,IAAI,EAAE,eAAK,CAAC,KAAK;CAClB,CAAC;AAEF;;GAEG;AACU,QAAA,YAAY,GAAG;IAC1B,8BAA8B;IAC9B,6DAA6D;IAC7D,YAAY,EAAE,QAAQ;IAEtB,oBAAoB;IACpB,SAAS,EAAE;QACT,MAAM,EAAE,GAAG;QACX,QAAQ,EAAE,GAAG;QACb,OAAO,EAAE,GAAG;KACb;IAED,UAAU;IACV,OAAO,EAAE,CAAC;CACX,CAAC"}
@@ -69,6 +69,14 @@ export declare class LayoutManager {
69
69
  * Handle resize event with debounce
70
70
  */
71
71
  private handleResize;
72
+ /**
73
+ * Calculate usable content size excluding reserved header space
74
+ * @param reservedRows - Number of rows reserved for header/dashboard
75
+ */
76
+ getContentSize(reservedRows?: number): {
77
+ width: number;
78
+ height: number;
79
+ };
72
80
  /**
73
81
  * Validate terminal size meets minimum requirements
74
82
  */
@@ -1 +1 @@
1
- {"version":3,"file":"layout-manager.d.ts","sourceRoot":"","sources":["../../src/services/layout-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EACL,UAAU,EAKX,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;AAO9D;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,WAAW,CAAyE;IAC5F,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,WAAW,CAA+B;IAElD;;OAEG;IACI,kBAAkB,IAAI,YAAY;IAmBzC;;OAEG;IACI,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAUrD;;OAEG;IACI,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,cAAc;IAqCxG;;OAEG;IACI,gBAAgB,IAAI,cAAc,GAAG,IAAI;IAIhD;;OAEG;IACI,UAAU,IAAI,IAAI;IAIzB;;OAEG;IACI,aAAa,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,cAAc;IAQxF;;OAEG;IACI,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI;IAsBrD;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACI,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG;QAC/C,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;CAqBF;AAED;;GAEG;;AACH,wBAAmC"}
1
+ {"version":3,"file":"layout-manager.d.ts","sourceRoot":"","sources":["../../src/services/layout-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EACL,UAAU,EAKX,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;AAO9D;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,WAAW,CAAyE;IAC5F,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,WAAW,CAA+B;IAElD;;OAEG;IACI,kBAAkB,IAAI,YAAY;IAmBzC;;OAEG;IACI,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAUrD;;OAEG;IACI,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,cAAc;IAqCxG;;OAEG;IACI,gBAAgB,IAAI,cAAc,GAAG,IAAI;IAIhD;;OAEG;IACI,UAAU,IAAI,IAAI;IAIzB;;OAEG;IACI,aAAa,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,cAAc;IAQxF;;OAEG;IACI,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI;IAsBrD;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;;OAGG;IACI,cAAc,CAAC,YAAY,GAAE,MAAU,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAQlF;;OAEG;IACI,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG;QAC/C,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;CAqBF;AAED;;GAEG;;AACH,wBAAmC"}
@@ -150,6 +150,17 @@ class LayoutManager {
150
150
  this.resizeTimer = null;
151
151
  }, RESIZE_DEBOUNCE_MS);
152
152
  }
153
+ /**
154
+ * Calculate usable content size excluding reserved header space
155
+ * @param reservedRows - Number of rows reserved for header/dashboard
156
+ */
157
+ getContentSize(reservedRows = 0) {
158
+ const size = this.detectTerminalSize();
159
+ return {
160
+ width: size.width,
161
+ height: Math.max(0, size.height - reservedRows),
162
+ };
163
+ }
153
164
  /**
154
165
  * Validate terminal size meets minimum requirements
155
166
  */
@@ -1 +1 @@
1
- {"version":3,"file":"layout-manager.js","sourceRoot":"","sources":["../../src/services/layout-manager.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAGH,4CAMyB;AA2BzB;;GAEG;AACH,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B;;;;GAIG;AACH,MAAa,aAAa;IAA1B;QACU,kBAAa,GAA0B,IAAI,CAAC;QAC5C,gBAAW,GAA+D,IAAI,GAAG,EAAE,CAAC;QACpF,oBAAe,GAAqB,EAAE,CAAC;QACvC,gBAAW,GAA0B,IAAI,CAAC;IAiLpD,CAAC;IA/KC;;OAEG;IACI,kBAAkB;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;QAE5C,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC3D,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;gBAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;gBAC3B,KAAK,EAAE,IAAI;aACZ,CAAC;QACJ,CAAC;QAED,2BAA2B;QAC3B,OAAO;YACL,KAAK,EAAE,uBAAc,CAAC,KAAK;YAC3B,MAAM,EAAE,uBAAc,CAAC,MAAM;YAC7B,KAAK;SACN,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,KAAa;QACtC,IAAI,KAAK,GAAG,+BAAsB,CAAC,YAAY,EAAE,CAAC;YAChD,OAAO,mBAAU,CAAC,OAAO,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,GAAG,+BAAsB,CAAC,YAAY,EAAE,CAAC;YACvD,OAAO,mBAAU,CAAC,IAAI,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,OAAO,mBAAU,CAAC,QAAQ,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,IAAgB,EAAE,OAAwB,EAAE,OAAuB;QACrF,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAEvC,kCAAkC;QAClC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,IAAI,KAAK,mBAAU,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,CAAC,CAAC,qCAAqC;QACpD,CAAC;QAED,4BAA4B;QAC5B,MAAM,UAAU,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;QAE9C,MAAM,MAAM,GAAmB;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,UAAU;YAChB,OAAO;YACP,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,4BAA4B;QAC5B,IAAA,uBAAc,EAAC,MAAM,CAAC,CAAC;QAEvB,mBAAmB;QACnB,IAAI,OAAO,EAAE,WAAW,KAAK,KAAK,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,GAAG,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAC7B,MAAM;gBACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,gBAAgB;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,UAAU;QACf,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,OAAyB,EAAE,OAAuB;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,OAAO,IAAI,EAAE,CAAC;QAElE,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACI,QAAQ,CAAC,QAAwB;QACtC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpC,uDAAuD;QACvD,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACxC,CAAC;YAED,uCAAuC;YACvC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,uBAAuB;QACvB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YACjC,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAEvC,uBAAuB;YACvB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC5C,QAAQ,CAAC,SAAS,CAAC,CAAC;YACtB,CAAC;YAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,oBAAoB,CAAC,IAAkB;QAK5C,IAAI,IAAI,CAAC,KAAK,GAAG,0BAAiB,CAAC,KAAK,EAAE,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,wBAAwB,IAAI,CAAC,KAAK,oBAAoB,0BAAiB,CAAC,KAAK,QAAQ;gBAC9F,UAAU,EAAE,2CAA2C,0BAAiB,CAAC,KAAK,IAAI,0BAAiB,CAAC,MAAM,uBAAuB;aAClI,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,0BAAiB,CAAC,MAAM,EAAE,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,uBAAuB,IAAI,CAAC,MAAM,oBAAoB,0BAAiB,CAAC,MAAM,QAAQ;gBAC/F,UAAU,EAAE,2CAA2C,0BAAiB,CAAC,KAAK,IAAI,0BAAiB,CAAC,MAAM,uBAAuB;aAClI,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;CACF;AArLD,sCAqLC;AAED;;GAEG;AACH,kBAAe,IAAI,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"layout-manager.js","sourceRoot":"","sources":["../../src/services/layout-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { INavigationManager } from '../types/ui-components';
2
+ export declare class NavigationManager implements INavigationManager {
3
+ private stack;
4
+ /**
5
+ * Pushes a new menu level onto the stack.
6
+ * @param label - The display label for the new level.
7
+ */
8
+ push(label: string): void;
9
+ /**
10
+ * Pops the current level off the stack.
11
+ * @returns The label of the popped level, or undefined if at root.
12
+ */
13
+ pop(): string | undefined;
14
+ /**
15
+ * Returns the formatted breadcrumb string (e.g., "Home > User Management")
16
+ */
17
+ getBreadcrumb(): string;
18
+ /**
19
+ * Gets the current depth of the stack.
20
+ */
21
+ getDepth(): number;
22
+ }
23
+ //# sourceMappingURL=navigation-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation-manager.d.ts","sourceRoot":"","sources":["../../src/services/navigation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,qBAAa,iBAAkB,YAAW,kBAAkB;IAC1D,OAAO,CAAC,KAAK,CAAsB;IAEnC;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB;;;OAGG;IACH,GAAG,IAAI,MAAM,GAAG,SAAS;IAOzB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,QAAQ,IAAI,MAAM;CAGnB"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NavigationManager = void 0;
4
+ class NavigationManager {
5
+ constructor() {
6
+ this.stack = ['Home'];
7
+ }
8
+ /**
9
+ * Pushes a new menu level onto the stack.
10
+ * @param label - The display label for the new level.
11
+ */
12
+ push(label) {
13
+ this.stack.push(label);
14
+ }
15
+ /**
16
+ * Pops the current level off the stack.
17
+ * @returns The label of the popped level, or undefined if at root.
18
+ */
19
+ pop() {
20
+ if (this.stack.length <= 1) {
21
+ return undefined;
22
+ }
23
+ return this.stack.pop();
24
+ }
25
+ /**
26
+ * Returns the formatted breadcrumb string (e.g., "Home > User Management")
27
+ */
28
+ getBreadcrumb() {
29
+ return this.stack.join(' > ');
30
+ }
31
+ /**
32
+ * Gets the current depth of the stack.
33
+ */
34
+ getDepth() {
35
+ return this.stack.length;
36
+ }
37
+ }
38
+ exports.NavigationManager = NavigationManager;
39
+ //# sourceMappingURL=navigation-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation-manager.js","sourceRoot":"","sources":["../../src/services/navigation-manager.ts"],"names":[],"mappings":";;;AAEA,MAAa,iBAAiB;IAA9B;QACU,UAAK,GAAa,CAAC,MAAM,CAAC,CAAC;IAkCrC,CAAC;IAhCC;;;OAGG;IACH,IAAI,CAAC,KAAa;QAChB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,GAAG;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;CACF;AAnCD,8CAmCC"}
@@ -0,0 +1,13 @@
1
+ import { IScreenManager, IDashboardWidget } from '../types/ui-components';
2
+ export declare class ScreenManager implements IScreenManager {
3
+ /**
4
+ * Clears the terminal screen and scrollback
5
+ */
6
+ clear(): void;
7
+ /**
8
+ * Renders the complete frame: Dashboard + Breadcrumb
9
+ */
10
+ renderHeader(dashboard: IDashboardWidget, breadcrumb: string): void;
11
+ private renderBreadcrumb;
12
+ }
13
+ //# sourceMappingURL=screen-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-manager.d.ts","sourceRoot":"","sources":["../../src/services/screen-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI1E,qBAAa,aAAc,YAAW,cAAc;IAClD;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAcnE,OAAO,CAAC,gBAAgB;CAWzB"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScreenManager = void 0;
4
+ const terminal_1 = require("../utils/terminal");
5
+ const theme_1 = require("../constants/theme");
6
+ class ScreenManager {
7
+ /**
8
+ * Clears the terminal screen and scrollback
9
+ */
10
+ clear() {
11
+ // Standard ANSI sequence to clear screen and scrollback
12
+ // \x1b[2J: Clear entire screen
13
+ // \x1b[3J: Clear scrollback buffer (supported by xterm, GNOME Terminal, etc.)
14
+ // \x1b[H: Move cursor to home position (0,0)
15
+ process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
16
+ }
17
+ /**
18
+ * Renders the complete frame: Dashboard + Breadcrumb
19
+ */
20
+ renderHeader(dashboard, breadcrumb) {
21
+ const caps = (0, terminal_1.detectTerminalCapabilities)();
22
+ const width = caps.width;
23
+ // Render dashboard
24
+ const dashboardOutput = dashboard.render(width);
25
+ console.log(dashboardOutput);
26
+ // Render breadcrumb if present
27
+ if (breadcrumb) {
28
+ this.renderBreadcrumb(breadcrumb);
29
+ }
30
+ }
31
+ renderBreadcrumb(breadcrumb) {
32
+ // Minimalist breadcrumb: Just text with padding, no heavy lines
33
+ // Add vertical padding
34
+ console.log('');
35
+ // Add horizontal padding (space) and color
36
+ const padding = ' '.repeat(theme_1.UI_CONSTANTS.PADDING);
37
+ console.log(`${padding}${theme_1.THEME.primary(breadcrumb)}`);
38
+ console.log('');
39
+ }
40
+ }
41
+ exports.ScreenManager = ScreenManager;
42
+ //# sourceMappingURL=screen-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-manager.js","sourceRoot":"","sources":["../../src/services/screen-manager.ts"],"names":[],"mappings":";;;AACA,gDAA+D;AAC/D,8CAAyD;AAEzD,MAAa,aAAa;IACxB;;OAEG;IACH,KAAK;QACH,wDAAwD;QACxD,+BAA+B;QAC/B,8EAA8E;QAC9E,6CAA6C;QAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,SAA2B,EAAE,UAAkB;QAC1D,MAAM,IAAI,GAAG,IAAA,qCAA0B,GAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzB,mBAAmB;QACnB,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAE7B,+BAA+B;QAC/B,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,UAAkB;QACzC,gEAAgE;QAChE,uBAAuB;QACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,2CAA2C;QAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,oBAAY,CAAC,OAAO,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,aAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEtD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF;AAxCD,sCAwCC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Interface for the Dashboard Widget
3
+ * Responsible for rendering the persistent status header.
4
+ */
5
+ export interface IDashboardWidget {
6
+ /**
7
+ * Refreshes the internal data snapshot (service status, user count, etc.)
8
+ */
9
+ refresh(): Promise<void>;
10
+ /**
11
+ * Renders the dashboard as a formatted string string suitable for printing.
12
+ * Should respect terminal width and use box-drawing characters.
13
+ * @param width - The available width in columns.
14
+ */
15
+ render(_width: number): string;
16
+ }
17
+ export interface IScreenManager {
18
+ /**
19
+ * Clears the terminal screen and scrollback (if supported/configured).
20
+ */
21
+ clear(): void;
22
+ /**
23
+ * Renders the complete frame: Dashboard + Breadcrumb + Content Placeholder
24
+ * @param dashboard - The dashboard widget instance
25
+ * @param breadcrumb - The current breadcrumb string
26
+ */
27
+ renderHeader(_dashboard: IDashboardWidget, _breadcrumb: string): void;
28
+ }
29
+ /**
30
+ * Interface for Navigation Manager
31
+ * Tracks the user's current location in the menu hierarchy.
32
+ */
33
+ export interface INavigationManager {
34
+ /**
35
+ * Pushes a new menu level onto the stack.
36
+ * @param label - The display label for the new level.
37
+ */
38
+ push(_label: string): void;
39
+ /**
40
+ * Pops the current level off the stack.
41
+ * @returns The label of the popped level.
42
+ */
43
+ pop(): string | undefined;
44
+ /**
45
+ * Returns the formatted breadcrumb string (e.g., "Home > User Management")
46
+ */
47
+ getBreadcrumb(): string;
48
+ /**
49
+ * Gets the current depth of the stack.
50
+ */
51
+ getDepth(): number;
52
+ }
53
+ //# sourceMappingURL=ui-components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-components.d.ts","sourceRoot":"","sources":["../../src/types/ui-components.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;;;OAIG;IACH,YAAY,CAAC,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACvE;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B;;;OAGG;IACH,GAAG,IAAI,MAAM,GAAG,SAAS,CAAC;IAE1B;;OAEG;IACH,aAAa,IAAI,MAAM,CAAC;IAExB;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC;CACpB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ui-components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-components.js","sourceRoot":"","sources":["../../src/types/ui-components.ts"],"names":[],"mappings":""}