@via-dev/via 0.1.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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -0
  3. package/dist/cli.js +136 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/config.js +124 -0
  6. package/dist/commands/config.js.map +1 -0
  7. package/dist/commands/learn.js +112 -0
  8. package/dist/commands/learn.js.map +1 -0
  9. package/dist/commands/list.js +38 -0
  10. package/dist/commands/list.js.map +1 -0
  11. package/dist/commands/remove.js +82 -0
  12. package/dist/commands/remove.js.map +1 -0
  13. package/dist/commands/ui/index.js +23 -0
  14. package/dist/commands/ui/index.js.map +1 -0
  15. package/dist/commands/ui/server.js +47 -0
  16. package/dist/commands/ui/server.js.map +1 -0
  17. package/dist/commands/ui/static/script.js +101 -0
  18. package/dist/commands/ui/static/script.js.map +1 -0
  19. package/dist/commands/ui/static/styles.js +245 -0
  20. package/dist/commands/ui/static/styles.js.map +1 -0
  21. package/dist/commands/ui/templates/layout.js +51 -0
  22. package/dist/commands/ui/templates/layout.js.map +1 -0
  23. package/dist/commands/use.js +236 -0
  24. package/dist/commands/use.js.map +1 -0
  25. package/dist/schema.js +12 -0
  26. package/dist/schema.js.map +1 -0
  27. package/dist/types.js +3 -0
  28. package/dist/types.js.map +1 -0
  29. package/dist/utils/add/file-scanner.js +99 -0
  30. package/dist/utils/add/file-scanner.js.map +1 -0
  31. package/dist/utils/add/get-dependencies.js +75 -0
  32. package/dist/utils/add/get-dependencies.js.map +1 -0
  33. package/dist/utils/add/meta.js +22 -0
  34. package/dist/utils/add/meta.js.map +1 -0
  35. package/dist/utils/add/module-processor.js +140 -0
  36. package/dist/utils/add/module-processor.js.map +1 -0
  37. package/dist/utils/ai/blocks.js +22 -0
  38. package/dist/utils/ai/blocks.js.map +1 -0
  39. package/dist/utils/ai/detection-prompt.js +173 -0
  40. package/dist/utils/ai/detection-prompt.js.map +1 -0
  41. package/dist/utils/ai/models.js +17 -0
  42. package/dist/utils/ai/models.js.map +1 -0
  43. package/dist/utils/ai/sdk.js +36 -0
  44. package/dist/utils/ai/sdk.js.map +1 -0
  45. package/dist/utils/branding.js +82 -0
  46. package/dist/utils/branding.js.map +1 -0
  47. package/dist/utils/constants.js +56 -0
  48. package/dist/utils/constants.js.map +1 -0
  49. package/dist/utils/paths.js +14 -0
  50. package/dist/utils/paths.js.map +1 -0
  51. package/dist/utils/use/text.js +31 -0
  52. package/dist/utils/use/text.js.map +1 -0
  53. package/package.json +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ui/index.ts"],"names":[],"mappings":";;;;;;AACA,mDAA0C;AAC1C,gDAAwB;AACxB,kDAA0B;AAC1B,qCAAqC;AAE9B,MAAM,EAAE,GAAG,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE;IACpC,MAAM,GAAG,GAAG,IAAA,kBAAS,GAAE,CAAC;IAExB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gDAAgD,IAAI,KAAK,CAAC,CAAC,CAAC;IAEnF,IAAA,mBAAK,EAAC;QACF,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI;KACP,EAAE,CAAC,IAAI,EAAE,EAAE;QACR,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,8DAA8D,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzG,IAAA,cAAI,EAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAZW,QAAA,EAAE,MAYb"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createApp = void 0;
4
+ const hono_1 = require("hono");
5
+ const cors_1 = require("hono/cors");
6
+ const fs_1 = require("fs");
7
+ const path_1 = require("path");
8
+ const paths_1 = require("../../utils/paths");
9
+ const zlib_1 = require("zlib");
10
+ const layout_1 = require("./templates/layout");
11
+ const createApp = () => {
12
+ const app = new hono_1.Hono();
13
+ app.use("/*", (0, cors_1.cors)());
14
+ const mappingPath = (0, paths_1.getViaDataPath)('mapping.json');
15
+ const modulesDir = (0, paths_1.getViaDataPath)('modules');
16
+ app.get("/api/modules", (c) => {
17
+ if (!(0, fs_1.existsSync)(mappingPath)) {
18
+ return c.json({ modules: [] });
19
+ }
20
+ try {
21
+ const mapping = JSON.parse((0, fs_1.readFileSync)(mappingPath, "utf-8"));
22
+ const modules = Object.entries(mapping).map(([name, id]) => {
23
+ const viaPath = (0, path_1.join)(modulesDir, `${id}.via`);
24
+ if ((0, fs_1.existsSync)(viaPath)) {
25
+ const compressed = (0, fs_1.readFileSync)(viaPath);
26
+ const data = JSON.parse((0, zlib_1.gunzipSync)(compressed).toString());
27
+ return {
28
+ name,
29
+ id,
30
+ ...data
31
+ };
32
+ }
33
+ return { name, id, error: "Module file missing" };
34
+ });
35
+ return c.json({ modules });
36
+ }
37
+ catch (e) {
38
+ return c.json({ error: "Failed to load modules", details: e.message }, 500);
39
+ }
40
+ });
41
+ app.get("/", (c) => {
42
+ return c.html((0, layout_1.getLayout)());
43
+ });
44
+ return app;
45
+ };
46
+ exports.createApp = createApp;
47
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/commands/ui/server.ts"],"names":[],"mappings":";;;AACA,+BAA4B;AAC5B,oCAAiC;AACjC,2BAA8C;AAC9C,+BAA4B;AAC5B,6CAAmD;AACnD,+BAAkC;AAClC,+CAA+C;AAExC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC1B,MAAM,GAAG,GAAG,IAAI,WAAI,EAAE,CAAC;IACvB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAA,WAAI,GAAE,CAAC,CAAC;IAEtB,MAAM,WAAW,GAAG,IAAA,sBAAc,EAAC,cAAc,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAA,sBAAc,EAAC,SAAS,CAAC,CAAC;IAE7C,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE;QAC1B,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;gBACvD,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC9C,IAAI,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;oBACtB,MAAM,UAAU,GAAG,IAAA,iBAAY,EAAC,OAAO,CAAC,CAAC;oBACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAU,EAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC3D,OAAO;wBACH,IAAI;wBACJ,EAAE;wBACF,GAAG,IAAI;qBACV,CAAC;gBACN,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,OAAO,EAAG,CAAW,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3F,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QACf,OAAO,CAAC,CAAC,IAAI,CAAC,IAAA,kBAAS,GAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACf,CAAC,CAAC;AAvCW,QAAA,SAAS,aAuCpB"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.script = void 0;
4
+ exports.script = `
5
+ let modules = [];
6
+ let selectedModule = null;
7
+
8
+ async function fetchModules() {
9
+ try {
10
+ const res = await fetch('/api/modules');
11
+ const data = await res.json();
12
+ modules = data.modules;
13
+ renderModuleList();
14
+ } catch (e) {
15
+ console.error("Failed to fetch modules", e);
16
+ }
17
+ }
18
+
19
+ function renderModuleList(filtered = modules) {
20
+ const list = document.getElementById('module-list');
21
+ list.innerHTML = filtered.map(m => {
22
+ const isActive = selectedModule?.id === m.id;
23
+ // Use simple string concatenation to accidental escape issues with backticks/template literals in the transpiled output
24
+ // if this string is injected into another template literal.
25
+ return '<div class="module-item ' + (isActive ? 'active' : '') + '" onclick="selectModule(\\'' + m.id + '\\')">' + m.name + '</div>';
26
+ }).join('');
27
+ }
28
+
29
+ function filterModules(query) {
30
+ const filtered = modules.filter(m => m.name.toLowerCase().includes(query.toLowerCase()));
31
+ renderModuleList(filtered);
32
+ }
33
+
34
+ function selectModule(id) {
35
+ selectedModule = modules.find(m => m.id === id);
36
+ renderModuleList();
37
+ renderContent();
38
+ }
39
+
40
+ function renderContent() {
41
+ if (!selectedModule) return;
42
+
43
+ const main = document.getElementById('main-content');
44
+ const allFiles = flattenDeps(selectedModule.deps || {});
45
+
46
+ let html = '<div class="module-header"><div class="module-title">' + selectedModule.name + '<span class="badge">Module</span></div><p style="color: var(--text-secondary)">ID: ' + selectedModule.id + '</p></div>';
47
+
48
+ html += '<div class="stats-grid">';
49
+ html += '<div class="stat-card"><div class="stat-label">Total Files</div><div class="stat-value">' + allFiles.length + '</div></div>';
50
+ html += '<div class="stat-card"><div class="stat-label">Original Name</div><div class="stat-value">' + (selectedModule.originalName || 'N/A') + '</div></div>';
51
+ html += '</div>';
52
+
53
+ html += '<div class="file-tree"><div class="tree-header"><span style="font-weight: 600">Module Structure</span></div><div class="tree-body">';
54
+ html += allFiles.map(f => {
55
+ return '<div class="file-item" onclick="showCode(\\'' + f.path + '\\')"><span class="file-icon">📄</span><span>' + f.path + '</span></div>';
56
+ }).join('');
57
+ html += '</div></div>';
58
+
59
+ html += '<div id="code-viewer" class="code-container"><div style="display: flex; justify-content: space-between; margin-bottom: 16px; border-bottom: 1px solid var(--border); padding-bottom: 12px;"><span id="filename-label" style="font-family: \\'JetBrains Mono\\', monospace; font-size: 12px; color: var(--accent)"></span><span style="font-size: 10px; color: var(--text-secondary); cursor: pointer;" onclick="hideCode()">Close</span></div><pre><code id="code-content"></code></pre></div>';
60
+
61
+ main.innerHTML = html;
62
+ }
63
+
64
+ function flattenDeps(node) {
65
+ if (!node || !node.path) return [];
66
+ let files = [{ path: node.path, content: node.content }];
67
+ if (node.dependencies) {
68
+ node.dependencies.forEach(dep => {
69
+ files = [...files, ...flattenDeps(dep)];
70
+ });
71
+ }
72
+ const seen = new Set();
73
+ return files.filter(f => {
74
+ if (seen.has(f.path)) return false;
75
+ seen.add(f.path);
76
+ return true;
77
+ });
78
+ }
79
+
80
+ function showCode(path) {
81
+ const allFiles = flattenDeps(selectedModule.deps || {});
82
+ const file = allFiles.find(f => f.path === path);
83
+ if (!file) return;
84
+
85
+ const viewer = document.getElementById('code-viewer');
86
+ const label = document.getElementById('filename-label');
87
+ const content = document.getElementById('code-content');
88
+
89
+ label.innerText = path;
90
+ content.innerText = file.content || '// No content available';
91
+ viewer.style.display = 'block';
92
+ viewer.scrollIntoView({ behavior: 'smooth' });
93
+ }
94
+
95
+ function hideCode() {
96
+ document.getElementById('code-viewer').style.display = 'none';
97
+ }
98
+
99
+ fetchModules();
100
+ `;
101
+ //# sourceMappingURL=script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script.js","sourceRoot":"","sources":["../../../../src/commands/ui/static/script.ts"],"names":[],"mappings":";;;AACa,QAAA,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgGrB,CAAC"}
@@ -0,0 +1,245 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.styles = void 0;
4
+ exports.styles = `
5
+ :root {
6
+ --bg: #0a0a0c;
7
+ --sidebar-bg: #111114;
8
+ --card-bg: #16161a;
9
+ --accent: #C13C62;
10
+ --accent-gradient: linear-gradient(135deg, #9621A1 0%, #C13C62 50%, #B6353B 100%);
11
+ --text-primary: #ffffff;
12
+ --text-secondary: #94a3b8;
13
+ --border: rgba(255, 255, 255, 0.05);
14
+ --border-hover: rgba(255, 255, 255, 0.1);
15
+ }
16
+
17
+ * {
18
+ box-sizing: border-box;
19
+ margin: 0;
20
+ padding: 0;
21
+ }
22
+
23
+ body {
24
+ font-family: 'Outfit', sans-serif;
25
+ background-color: var(--bg);
26
+ color: var(--text-primary);
27
+ display: flex;
28
+ height: 100vh;
29
+ overflow: hidden;
30
+ }
31
+
32
+ /* Sidebar */
33
+ aside {
34
+ width: 300px;
35
+ background-color: var(--sidebar-bg);
36
+ border-right: 1px solid var(--border);
37
+ display: flex;
38
+ flex-direction: column;
39
+ padding: 24px;
40
+ }
41
+
42
+ .logo {
43
+ font-size: 24px;
44
+ font-weight: 600;
45
+ margin-bottom: 32px;
46
+ background: var(--accent-gradient);
47
+ -webkit-background-clip: text;
48
+ -webkit-text-fill-color: transparent;
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 12px;
52
+ }
53
+
54
+ .search {
55
+ background: rgba(255, 255, 255, 0.03);
56
+ border: 1px solid var(--border);
57
+ padding: 12px 16px;
58
+ border-radius: 12px;
59
+ color: white;
60
+ margin-bottom: 24px;
61
+ outline: none;
62
+ transition: all 0.2s;
63
+ }
64
+
65
+ .search:focus {
66
+ border-color: var(--accent);
67
+ background: rgba(255, 255, 255, 0.05);
68
+ }
69
+
70
+ .module-list {
71
+ flex: 1;
72
+ overflow-y: auto;
73
+ }
74
+
75
+ .module-item {
76
+ padding: 12px 16px;
77
+ border-radius: 10px;
78
+ cursor: pointer;
79
+ transition: all 0.2s;
80
+ margin-bottom: 8px;
81
+ border: 1px solid transparent;
82
+ }
83
+
84
+ .module-item:hover {
85
+ background: rgba(255, 255, 255, 0.03);
86
+ border-color: var(--border-hover);
87
+ }
88
+
89
+ .module-item.active {
90
+ background: rgba(193, 60, 98, 0.1);
91
+ border-color: rgba(193, 60, 98, 0.2);
92
+ color: var(--accent);
93
+ }
94
+
95
+ /* Main Content */
96
+ main {
97
+ flex: 1;
98
+ padding: 40px;
99
+ overflow-y: auto;
100
+ position: relative;
101
+ }
102
+
103
+ .empty-state {
104
+ display: flex;
105
+ flex-direction: column;
106
+ align-items: center;
107
+ justify-content: center;
108
+ height: 100%;
109
+ color: var(--text-secondary);
110
+ text-align: center;
111
+ }
112
+
113
+ .empty-state h1 {
114
+ font-size: 48px;
115
+ margin-bottom: 16px;
116
+ opacity: 0.1;
117
+ }
118
+
119
+ .module-header {
120
+ margin-bottom: 40px;
121
+ }
122
+
123
+ .module-title {
124
+ font-size: 32px;
125
+ font-weight: 600;
126
+ margin-bottom: 12px;
127
+ display: flex;
128
+ align-items: center;
129
+ gap: 16px;
130
+ }
131
+
132
+ .badge {
133
+ font-size: 12px;
134
+ padding: 4px 10px;
135
+ border-radius: 20px;
136
+ background: rgba(255, 255, 255, 0.05);
137
+ border: 1px solid var(--border);
138
+ color: var(--text-secondary);
139
+ text-transform: uppercase;
140
+ letter-spacing: 0.5px;
141
+ }
142
+
143
+ .stats-grid {
144
+ display: grid;
145
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
146
+ gap: 20px;
147
+ margin-bottom: 40px;
148
+ }
149
+
150
+ .stat-card {
151
+ background: var(--card-bg);
152
+ padding: 24px;
153
+ border-radius: 16px;
154
+ border: 1px solid var(--border);
155
+ }
156
+
157
+ .stat-label {
158
+ font-size: 14px;
159
+ color: var(--text-secondary);
160
+ margin-bottom: 8px;
161
+ }
162
+
163
+ .stat-value {
164
+ font-size: 20px;
165
+ font-weight: 600;
166
+ }
167
+
168
+ .file-tree {
169
+ background: var(--card-bg);
170
+ border-radius: 16px;
171
+ border: 1px solid var(--border);
172
+ overflow: hidden;
173
+ }
174
+
175
+ .tree-header {
176
+ padding: 16px 24px;
177
+ background: rgba(255, 255, 255, 0.02);
178
+ border-bottom: 1px solid var(--border);
179
+ display: flex;
180
+ justify-content: space-between;
181
+ align-items: center;
182
+ }
183
+
184
+ .tree-body {
185
+ padding: 20px;
186
+ }
187
+
188
+ .file-item {
189
+ display: flex;
190
+ align-items: center;
191
+ gap: 10px;
192
+ padding: 8px 12px;
193
+ border-radius: 8px;
194
+ cursor: pointer;
195
+ transition: all 0.2s;
196
+ font-family: 'JetBrains Mono', monospace;
197
+ font-size: 14px;
198
+ }
199
+
200
+ .file-item:hover {
201
+ background: rgba(255, 255, 255, 0.03);
202
+ }
203
+
204
+ .file-icon {
205
+ opacity: 0.5;
206
+ }
207
+
208
+ .code-container {
209
+ margin-top: 40px;
210
+ background: #011627;
211
+ border-radius: 16px;
212
+ border: 1px solid var(--border);
213
+ padding: 24px;
214
+ overflow: auto;
215
+ max-height: 600px;
216
+ display: none;
217
+ }
218
+
219
+ pre {
220
+ font-family: 'JetBrains Mono', monospace;
221
+ font-size: 13px;
222
+ line-height: 1.6;
223
+ color: #d6deeb;
224
+ }
225
+
226
+ ::-webkit-scrollbar {
227
+ width: 8px;
228
+ }
229
+
230
+ ::-webkit-scrollbar-track {
231
+ background: transparent;
232
+ }
233
+
234
+ ::-webkit-scrollbar-thumb {
235
+ background: rgba(255, 255, 255, 0.1);
236
+ border-radius: 4px;
237
+ }
238
+
239
+ ::-webkit-scrollbar-thumb:hover {
240
+ background: rgba(255, 255, 255, 0.2);
241
+ }
242
+
243
+ .highlight-accent { color: var(--accent); }
244
+ `;
245
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../src/commands/ui/static/styles.ts"],"names":[],"mappings":";;;AACa,QAAA,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgPrB,CAAC"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLayout = void 0;
4
+ const styles_1 = require("../static/styles");
5
+ const script_1 = require("../static/script");
6
+ const getLayout = () => {
7
+ return `
8
+ <!DOCTYPE html>
9
+ <html lang="en">
10
+ <head>
11
+ <meta charset="UTF-8">
12
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
13
+ <title>Via UI — Module Explorer</title>
14
+ <link rel="preconnect" href="https://fonts.googleapis.com">
15
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
16
+ <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
17
+ <style>
18
+ ${styles_1.styles}
19
+ </style>
20
+ </head>
21
+ <body>
22
+ <aside>
23
+ <div class="logo">
24
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
25
+ <path d="M12 2L2 7L12 12L22 7L12 2Z" fill="currentColor"/>
26
+ <path d="M2 17L12 22L22 17M2 12L12 17L22 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
27
+ </svg>
28
+ Via UI
29
+ </div>
30
+ <input type="text" class="search" placeholder="Search modules..." oninput="filterModules(this.value)">
31
+ <div class="module-list" id="module-list">
32
+ <!-- Modules will be populated here -->
33
+ </div>
34
+ </aside>
35
+
36
+ <main id="main-content">
37
+ <div class="empty-state">
38
+ <h1>VIA</h1>
39
+ <p>Select a module to explore its details</p>
40
+ </div>
41
+ </main>
42
+
43
+ <script>
44
+ ${script_1.script}
45
+ </script>
46
+ </body>
47
+ </html>
48
+ `;
49
+ };
50
+ exports.getLayout = getLayout;
51
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../../src/commands/ui/templates/layout.ts"],"names":[],"mappings":";;;AACA,6CAA0C;AAC1C,6CAA0C;AAEnC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC1B,OAAO;;;;;;;;;;;UAWD,eAAM;;;;;;;;;;;;;;;;;;;;;;;;;;UA0BN,eAAM;;;;KAIX,CAAC;AACN,CAAC,CAAC;AA3CW,QAAA,SAAS,aA2CpB"}