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.
- package/README.md +31 -863
- package/dist/commands/interactive.d.ts +0 -42
- package/dist/commands/interactive.d.ts.map +1 -1
- package/dist/commands/interactive.js +59 -182
- package/dist/commands/interactive.js.map +1 -1
- package/dist/commands/user.d.ts.map +1 -1
- package/dist/commands/user.js +23 -14
- package/dist/commands/user.js.map +1 -1
- package/dist/components/dashboard-widget.d.ts +18 -0
- package/dist/components/dashboard-widget.d.ts.map +1 -0
- package/dist/components/dashboard-widget.js +159 -0
- package/dist/components/dashboard-widget.js.map +1 -0
- package/dist/components/user-table.d.ts +8 -0
- package/dist/components/user-table.d.ts.map +1 -0
- package/dist/components/user-table.js +86 -0
- package/dist/components/user-table.js.map +1 -0
- package/dist/constants/theme.d.ts +34 -0
- package/dist/constants/theme.d.ts.map +1 -0
- package/dist/constants/theme.js +52 -0
- package/dist/constants/theme.js.map +1 -0
- package/dist/services/layout-manager.d.ts +8 -0
- package/dist/services/layout-manager.d.ts.map +1 -1
- package/dist/services/layout-manager.js +11 -0
- package/dist/services/layout-manager.js.map +1 -1
- package/dist/services/navigation-manager.d.ts +23 -0
- package/dist/services/navigation-manager.d.ts.map +1 -0
- package/dist/services/navigation-manager.js +39 -0
- package/dist/services/navigation-manager.js.map +1 -0
- package/dist/services/screen-manager.d.ts +13 -0
- package/dist/services/screen-manager.d.ts.map +1 -0
- package/dist/services/screen-manager.js +42 -0
- package/dist/services/screen-manager.js.map +1 -0
- package/dist/types/ui-components.d.ts +53 -0
- package/dist/types/ui-components.d.ts.map +1 -0
- package/dist/types/ui-components.js +3 -0
- package/dist/types/ui-components.js.map +1 -0
- package/dist/types/user.d.ts +11 -0
- package/dist/types/user.d.ts.map +1 -1
- 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;
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"ui-components.js","sourceRoot":"","sources":["../../src/types/ui-components.ts"],"names":[],"mappings":""}
|