appclean 1.9.0 → 2.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 (212) hide show
  1. package/.github/workflows/npm-publish.yml +61 -0
  2. package/DEVELOPMENT.md +84 -0
  3. package/GUI_IMPLEMENTATION_STATUS.md +143 -0
  4. package/MD_Files/INDEX.md +51 -0
  5. package/PHASE2_COMPLETION.md +281 -0
  6. package/PHASE3_COMPLETION.md +364 -0
  7. package/README.md +411 -91
  8. package/RELEASE_GUIDE.md +236 -0
  9. package/assets/logo.svg +34 -0
  10. package/dist/core/appUpdateChecker.js +12 -16
  11. package/dist/core/appUpdateChecker.js.map +1 -1
  12. package/dist/core/detector.js +14 -18
  13. package/dist/core/detector.js.map +1 -1
  14. package/dist/core/duplicateFileFinder.js +12 -19
  15. package/dist/core/duplicateFileFinder.js.map +1 -1
  16. package/dist/core/orphanedDependencyDetector.js +19 -26
  17. package/dist/core/orphanedDependencyDetector.js.map +1 -1
  18. package/dist/core/performanceOptimizer.js +6 -10
  19. package/dist/core/performanceOptimizer.js.map +1 -1
  20. package/dist/core/permissionHandler.js +21 -25
  21. package/dist/core/permissionHandler.js.map +1 -1
  22. package/dist/core/pluginSystem.js +9 -13
  23. package/dist/core/pluginSystem.js.map +1 -1
  24. package/dist/core/removalRecorder.js +12 -19
  25. package/dist/core/removalRecorder.js.map +1 -1
  26. package/dist/core/remover.js +59 -66
  27. package/dist/core/remover.js.map +1 -1
  28. package/dist/core/reportGenerator.d.ts +1 -1
  29. package/dist/core/reportGenerator.d.ts.map +1 -1
  30. package/dist/core/reportGenerator.js +27 -34
  31. package/dist/core/reportGenerator.js.map +1 -1
  32. package/dist/core/scheduledCleanup.js +23 -30
  33. package/dist/core/scheduledCleanup.js.map +1 -1
  34. package/dist/core/serviceFileDetector.js +24 -31
  35. package/dist/core/serviceFileDetector.js.map +1 -1
  36. package/dist/core/verificationModule.js +10 -14
  37. package/dist/core/verificationModule.js.map +1 -1
  38. package/dist/index.js +118 -156
  39. package/dist/index.js.map +1 -1
  40. package/dist/managers/brewManager.js +30 -37
  41. package/dist/managers/brewManager.js.map +1 -1
  42. package/dist/managers/customManager.js +23 -30
  43. package/dist/managers/customManager.js.map +1 -1
  44. package/dist/managers/linuxManager.js +29 -36
  45. package/dist/managers/linuxManager.js.map +1 -1
  46. package/dist/managers/npmManager.js +27 -34
  47. package/dist/managers/npmManager.js.map +1 -1
  48. package/dist/types/index.js +1 -2
  49. package/dist/ui/client/api/client.d.ts +24 -0
  50. package/dist/ui/client/api/client.d.ts.map +1 -0
  51. package/dist/ui/client/api/client.js +100 -0
  52. package/dist/ui/client/api/client.js.map +1 -0
  53. package/dist/ui/client/app.d.ts +7 -0
  54. package/dist/ui/client/app.d.ts.map +1 -0
  55. package/dist/ui/client/app.js +75 -0
  56. package/dist/ui/client/app.js.map +1 -0
  57. package/dist/ui/client/index.html +107 -0
  58. package/dist/ui/client/pages/appDetails.d.ts +8 -0
  59. package/dist/ui/client/pages/appDetails.d.ts.map +1 -0
  60. package/dist/ui/client/pages/appDetails.js +287 -0
  61. package/dist/ui/client/pages/appDetails.js.map +1 -0
  62. package/dist/ui/client/pages/appSearch.d.ts +2 -0
  63. package/dist/ui/client/pages/appSearch.d.ts.map +1 -0
  64. package/dist/ui/client/pages/appSearch.js +221 -0
  65. package/dist/ui/client/pages/appSearch.js.map +1 -0
  66. package/dist/ui/client/pages/dashboard.d.ts +2 -0
  67. package/dist/ui/client/pages/dashboard.d.ts.map +1 -0
  68. package/dist/ui/client/pages/dashboard.js +175 -0
  69. package/dist/ui/client/pages/dashboard.js.map +1 -0
  70. package/dist/ui/client/pages/settings.d.ts +7 -0
  71. package/dist/ui/client/pages/settings.d.ts.map +1 -0
  72. package/dist/ui/client/pages/settings.js +279 -0
  73. package/dist/ui/client/pages/settings.js.map +1 -0
  74. package/dist/ui/client/state/appStore.d.ts +38 -0
  75. package/dist/ui/client/state/appStore.d.ts.map +1 -0
  76. package/dist/ui/client/state/appStore.js +130 -0
  77. package/dist/ui/client/state/appStore.js.map +1 -0
  78. package/dist/ui/client/state/dashboardStore.d.ts +31 -0
  79. package/dist/ui/client/state/dashboardStore.d.ts.map +1 -0
  80. package/dist/ui/client/state/dashboardStore.js +76 -0
  81. package/dist/ui/client/state/dashboardStore.js.map +1 -0
  82. package/dist/ui/client/state/uiStore.d.ts +43 -0
  83. package/dist/ui/client/state/uiStore.d.ts.map +1 -0
  84. package/dist/ui/client/state/uiStore.js +109 -0
  85. package/dist/ui/client/state/uiStore.js.map +1 -0
  86. package/dist/ui/client/styles/animations.css +349 -0
  87. package/dist/ui/client/styles/base.css +214 -0
  88. package/dist/ui/client/styles/components.css +400 -0
  89. package/dist/ui/client/styles/layout.css +224 -0
  90. package/dist/ui/client/styles/variables.css +140 -0
  91. package/dist/ui/client/utils/events.d.ts +19 -0
  92. package/dist/ui/client/utils/events.d.ts.map +1 -0
  93. package/dist/ui/client/utils/events.js +54 -0
  94. package/dist/ui/client/utils/events.js.map +1 -0
  95. package/dist/ui/client/utils/formatting.d.ts +11 -0
  96. package/dist/ui/client/utils/formatting.d.ts.map +1 -0
  97. package/dist/ui/client/utils/formatting.js +104 -0
  98. package/dist/ui/client/utils/formatting.js.map +1 -0
  99. package/dist/ui/client/utils/router.d.ts +25 -0
  100. package/dist/ui/client/utils/router.d.ts.map +1 -0
  101. package/dist/ui/client/utils/router.js +90 -0
  102. package/dist/ui/client/utils/router.js.map +1 -0
  103. package/dist/ui/guiServer.d.ts +11 -5
  104. package/dist/ui/guiServer.d.ts.map +1 -1
  105. package/dist/ui/guiServer.js +180 -501
  106. package/dist/ui/guiServer.js.map +1 -1
  107. package/dist/ui/menu.js +18 -27
  108. package/dist/ui/menu.js.map +1 -1
  109. package/dist/ui/prompts.js +34 -47
  110. package/dist/ui/prompts.js.map +1 -1
  111. package/dist/ui/server/middleware/errorHandler.d.ts +19 -0
  112. package/dist/ui/server/middleware/errorHandler.d.ts.map +1 -0
  113. package/dist/ui/server/middleware/errorHandler.js +100 -0
  114. package/dist/ui/server/middleware/errorHandler.js.map +1 -0
  115. package/dist/ui/server/routes/apps.d.ts +8 -0
  116. package/dist/ui/server/routes/apps.d.ts.map +1 -0
  117. package/dist/ui/server/routes/apps.js +74 -0
  118. package/dist/ui/server/routes/apps.js.map +1 -0
  119. package/dist/ui/server/routes/dashboard.d.ts +4 -0
  120. package/dist/ui/server/routes/dashboard.d.ts.map +1 -0
  121. package/dist/ui/server/routes/dashboard.js +57 -0
  122. package/dist/ui/server/routes/dashboard.js.map +1 -0
  123. package/dist/ui/server/routes/settings.d.ts +6 -0
  124. package/dist/ui/server/routes/settings.d.ts.map +1 -0
  125. package/dist/ui/server/routes/settings.js +31 -0
  126. package/dist/ui/server/routes/settings.js.map +1 -0
  127. package/dist/ui/server/services/appService.d.ts +45 -0
  128. package/dist/ui/server/services/appService.d.ts.map +1 -0
  129. package/dist/ui/server/services/appService.js +114 -0
  130. package/dist/ui/server/services/appService.js.map +1 -0
  131. package/dist/ui/server/services/removalService.d.ts +24 -0
  132. package/dist/ui/server/services/removalService.d.ts.map +1 -0
  133. package/dist/ui/server/services/removalService.js +83 -0
  134. package/dist/ui/server/services/removalService.js.map +1 -0
  135. package/dist/utils/filesystem.js +32 -49
  136. package/dist/utils/filesystem.js.map +1 -1
  137. package/dist/utils/logger.js +9 -18
  138. package/dist/utils/logger.js.map +1 -1
  139. package/dist/utils/platform.js +10 -22
  140. package/dist/utils/platform.js.map +1 -1
  141. package/dist/utils/upgrade.d.ts +2 -1
  142. package/dist/utils/upgrade.d.ts.map +1 -1
  143. package/dist/utils/upgrade.js +24 -15
  144. package/dist/utils/upgrade.js.map +1 -1
  145. package/package.json +4 -2
  146. package/scripts/publish-npm.sh +64 -0
  147. package/src/core/appUpdateChecker.ts +1 -1
  148. package/src/core/detector.ts +6 -6
  149. package/src/core/duplicateFileFinder.ts +1 -1
  150. package/src/core/orphanedDependencyDetector.ts +2 -2
  151. package/src/core/performanceOptimizer.ts +1 -1
  152. package/src/core/permissionHandler.ts +2 -2
  153. package/src/core/pluginSystem.ts +1 -1
  154. package/src/core/removalRecorder.ts +2 -2
  155. package/src/core/remover.ts +11 -11
  156. package/src/core/reportGenerator.ts +2 -2
  157. package/src/core/scheduledCleanup.ts +2 -2
  158. package/src/core/serviceFileDetector.ts +2 -2
  159. package/src/core/verificationModule.ts +2 -2
  160. package/src/index.ts +8 -8
  161. package/src/managers/brewManager.ts +3 -3
  162. package/src/managers/customManager.ts +2 -2
  163. package/src/managers/linuxManager.ts +3 -3
  164. package/src/managers/npmManager.ts +3 -3
  165. package/src/ui/client/api/client.ts +168 -0
  166. package/src/ui/client/app.ts +125 -0
  167. package/src/ui/client/index.html +107 -0
  168. package/src/ui/client/pages/appDetails.ts +356 -0
  169. package/src/ui/client/pages/appSearch.ts +283 -0
  170. package/src/ui/client/pages/dashboard.ts +211 -0
  171. package/src/ui/client/pages/settings.ts +342 -0
  172. package/src/ui/client/state/appStore.ts +181 -0
  173. package/src/ui/client/state/dashboardStore.ts +123 -0
  174. package/src/ui/client/state/uiStore.ts +166 -0
  175. package/src/ui/client/styles/animations.css +349 -0
  176. package/src/ui/client/styles/base.css +214 -0
  177. package/src/ui/client/styles/components.css +400 -0
  178. package/src/ui/client/styles/layout.css +224 -0
  179. package/src/ui/client/styles/variables.css +140 -0
  180. package/src/ui/client/utils/events.ts +74 -0
  181. package/src/ui/client/utils/formatting.ts +157 -0
  182. package/src/ui/client/utils/router.ts +161 -0
  183. package/src/ui/guiServer.ts +245 -498
  184. package/src/ui/prompts.ts +1 -1
  185. package/src/ui/server/middleware/errorHandler.ts +174 -0
  186. package/src/ui/server/routes/apps.ts +132 -0
  187. package/src/ui/server/routes/dashboard.ts +93 -0
  188. package/src/ui/server/routes/settings.ts +63 -0
  189. package/src/ui/server/services/appService.ts +184 -0
  190. package/src/ui/server/services/removalService.ts +138 -0
  191. package/src/utils/upgrade.ts +19 -2
  192. package/tsconfig.json +3 -2
  193. package/INDEX.md +0 -165
  194. /package/{ACTION_CHECKLIST.md → MD_Files/ACTION_CHECKLIST.md} +0 -0
  195. /package/{APPCLEAN_SUMMARY.md → MD_Files/APPCLEAN_SUMMARY.md} +0 -0
  196. /package/{CHANGELOG.md → MD_Files/CHANGELOG.md} +0 -0
  197. /package/{CODE_OF_CONDUCT.md → MD_Files/CODE_OF_CONDUCT.md} +0 -0
  198. /package/{CODE_REVIEW_REPORT.md → MD_Files/CODE_REVIEW_REPORT.md} +0 -0
  199. /package/{COMMUNITY_POSTS.md → MD_Files/COMMUNITY_POSTS.md} +0 -0
  200. /package/{DEPLOYMENT_GUIDE.md → MD_Files/DEPLOYMENT_GUIDE.md} +0 -0
  201. /package/{DEPLOYMENT_STATUS.md → MD_Files/DEPLOYMENT_STATUS.md} +0 -0
  202. /package/{EXECUTIVE_REPORT.md → MD_Files/EXECUTIVE_REPORT.md} +0 -0
  203. /package/{GITHUB_OPTIMIZATION.md → MD_Files/GITHUB_OPTIMIZATION.md} +0 -0
  204. /package/{MARKETING_SUMMARY.md → MD_Files/MARKETING_SUMMARY.md} +0 -0
  205. /package/{NPM_PACKAGE_OPTIMIZATION.md → MD_Files/NPM_PACKAGE_OPTIMIZATION.md} +0 -0
  206. /package/{NPM_PUBLISH.md → MD_Files/NPM_PUBLISH.md} +0 -0
  207. /package/{PROJECT_SUMMARY.txt → MD_Files/PROJECT_SUMMARY.txt} +0 -0
  208. /package/{PUBLICATION_SUCCESS_REPORT.md → MD_Files/PUBLICATION_SUCCESS_REPORT.md} +0 -0
  209. /package/{QUICKSTART.md → MD_Files/QUICKSTART.md} +0 -0
  210. /package/{SETUP_GITHUB.md → MD_Files/SETUP_GITHUB.md} +0 -0
  211. /package/{TESTING_SUMMARY.md → MD_Files/TESTING_SUMMARY.md} +0 -0
  212. /package/{setup-github.sh → MD_Files/setup-github.sh} +0 -0
@@ -0,0 +1,224 @@
1
+ /* Layout - Grid, Flexbox, Container Utilities */
2
+
3
+ .container {
4
+ width: 100%;
5
+ max-width: var(--max-width-lg);
6
+ margin-left: auto;
7
+ margin-right: auto;
8
+ padding-left: var(--space-4);
9
+ padding-right: var(--space-4);
10
+ }
11
+
12
+ .container-xl {
13
+ max-width: var(--max-width-xl);
14
+ }
15
+
16
+ .container-md {
17
+ max-width: var(--max-width-md);
18
+ }
19
+
20
+ /* Flexbox */
21
+ .flex {
22
+ display: flex;
23
+ }
24
+
25
+ .flex-col {
26
+ flex-direction: column;
27
+ }
28
+
29
+ .flex-wrap {
30
+ flex-wrap: wrap;
31
+ }
32
+
33
+ .flex-center {
34
+ align-items: center;
35
+ justify-content: center;
36
+ }
37
+
38
+ .flex-between {
39
+ align-items: center;
40
+ justify-content: space-between;
41
+ }
42
+
43
+ .flex-start {
44
+ align-items: flex-start;
45
+ justify-content: flex-start;
46
+ }
47
+
48
+ .flex-end {
49
+ align-items: flex-end;
50
+ justify-content: flex-end;
51
+ }
52
+
53
+ .justify-center {
54
+ justify-content: center;
55
+ }
56
+
57
+ .justify-between {
58
+ justify-content: space-between;
59
+ }
60
+
61
+ .justify-start {
62
+ justify-content: flex-start;
63
+ }
64
+
65
+ .justify-end {
66
+ justify-content: flex-end;
67
+ }
68
+
69
+ .justify-around {
70
+ justify-content: space-around;
71
+ }
72
+
73
+ .justify-evenly {
74
+ justify-content: space-evenly;
75
+ }
76
+
77
+ .items-center {
78
+ align-items: center;
79
+ }
80
+
81
+ .items-start {
82
+ align-items: flex-start;
83
+ }
84
+
85
+ .items-end {
86
+ align-items: flex-end;
87
+ }
88
+
89
+ .items-stretch {
90
+ align-items: stretch;
91
+ }
92
+
93
+ .flex-1 {
94
+ flex: 1;
95
+ min-width: 0;
96
+ }
97
+
98
+ .flex-none {
99
+ flex: none;
100
+ }
101
+
102
+ .gap-1 { gap: var(--space-1); }
103
+ .gap-2 { gap: var(--space-2); }
104
+ .gap-3 { gap: var(--space-3); }
105
+ .gap-4 { gap: var(--space-4); }
106
+ .gap-6 { gap: var(--space-6); }
107
+ .gap-8 { gap: var(--space-8); }
108
+
109
+ /* Grid */
110
+ .grid {
111
+ display: grid;
112
+ }
113
+
114
+ .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
115
+ .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
116
+ .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
117
+ .grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
118
+
119
+ .gap-1 { gap: var(--space-1); }
120
+ .gap-2 { gap: var(--space-2); }
121
+ .gap-3 { gap: var(--space-3); }
122
+ .gap-4 { gap: var(--space-4); }
123
+ .gap-6 { gap: var(--space-6); }
124
+ .gap-8 { gap: var(--space-8); }
125
+
126
+ /* Spacing Utilities */
127
+ .m-0 { margin: var(--space-0); }
128
+ .m-1 { margin: var(--space-1); }
129
+ .m-2 { margin: var(--space-2); }
130
+ .m-3 { margin: var(--space-3); }
131
+ .m-4 { margin: var(--space-4); }
132
+ .m-6 { margin: var(--space-6); }
133
+ .m-8 { margin: var(--space-8); }
134
+
135
+ .mb-0 { margin-bottom: var(--space-0); }
136
+ .mb-1 { margin-bottom: var(--space-1); }
137
+ .mb-2 { margin-bottom: var(--space-2); }
138
+ .mb-3 { margin-bottom: var(--space-3); }
139
+ .mb-4 { margin-bottom: var(--space-4); }
140
+ .mb-6 { margin-bottom: var(--space-6); }
141
+ .mb-8 { margin-bottom: var(--space-8); }
142
+
143
+ .mt-0 { margin-top: var(--space-0); }
144
+ .mt-1 { margin-top: var(--space-1); }
145
+ .mt-2 { margin-top: var(--space-2); }
146
+ .mt-3 { margin-top: var(--space-3); }
147
+ .mt-4 { margin-top: var(--space-4); }
148
+ .mt-6 { margin-top: var(--space-6); }
149
+ .mt-8 { margin-top: var(--space-8); }
150
+
151
+ .mx-auto { margin-left: auto; margin-right: auto; }
152
+
153
+ .p-0 { padding: var(--space-0); }
154
+ .p-1 { padding: var(--space-1); }
155
+ .p-2 { padding: var(--space-2); }
156
+ .p-3 { padding: var(--space-3); }
157
+ .p-4 { padding: var(--space-4); }
158
+ .p-6 { padding: var(--space-6); }
159
+ .p-8 { padding: var(--space-8); }
160
+
161
+ .px-4 { padding-left: var(--space-4); padding-right: var(--space-4); }
162
+ .py-4 { padding-top: var(--space-4); padding-bottom: var(--space-4); }
163
+
164
+ /* Display */
165
+ .hidden { display: none; }
166
+ .block { display: block; }
167
+ .inline { display: inline; }
168
+ .inline-block { display: inline-block; }
169
+
170
+ .w-full { width: 100%; }
171
+ .h-full { height: 100%; }
172
+ .h-screen { height: 100vh; }
173
+
174
+ .overflow-hidden { overflow: hidden; }
175
+ .overflow-auto { overflow: auto; }
176
+ .overflow-x-auto { overflow-x: auto; }
177
+ .overflow-y-auto { overflow-y: auto; }
178
+
179
+ /* Text */
180
+ .text-center { text-align: center; }
181
+ .text-left { text-align: left; }
182
+ .text-right { text-align: right; }
183
+
184
+ .text-xs { font-size: var(--font-xs); }
185
+ .text-sm { font-size: var(--font-sm); }
186
+ .text-base { font-size: var(--font-base); }
187
+ .text-lg { font-size: var(--font-lg); }
188
+ .text-xl { font-size: var(--font-xl); }
189
+ .text-2xl { font-size: var(--font-2xl); }
190
+ .text-3xl { font-size: var(--font-3xl); }
191
+
192
+ .font-normal { font-weight: var(--fw-regular); }
193
+ .font-medium { font-weight: var(--fw-medium); }
194
+ .font-semibold { font-weight: var(--fw-semibold); }
195
+ .font-bold { font-weight: var(--fw-bold); }
196
+
197
+ .text-primary { color: var(--text-primary); }
198
+ .text-secondary { color: var(--text-secondary); }
199
+ .text-muted { color: var(--text-muted); }
200
+
201
+ /* Responsive */
202
+ @media (max-width: 768px) {
203
+ .container {
204
+ padding-left: var(--space-3);
205
+ padding-right: var(--space-3);
206
+ }
207
+
208
+ .grid-cols-2 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
209
+ .grid-cols-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
210
+ .grid-cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
211
+ }
212
+
213
+ @media (max-width: 480px) {
214
+ .grid-cols-2 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
215
+ .grid-cols-3 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
216
+ .grid-cols-4 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
217
+
218
+ .flex-col-mobile {
219
+ flex-direction: column;
220
+ }
221
+
222
+ .text-2xl { font-size: var(--font-xl); }
223
+ .text-3xl { font-size: var(--font-2xl); }
224
+ }
@@ -0,0 +1,140 @@
1
+ /* Design System - CSS Variables */
2
+
3
+ :root {
4
+ /* Colors - Primary */
5
+ --color-primary: #3b82f6;
6
+ --color-primary-hover: #2563eb;
7
+ --color-primary-light: #dbeafe;
8
+ --color-primary-dark: #1e40af;
9
+
10
+ /* Colors - Semantic */
11
+ --color-success: #10b981;
12
+ --color-success-light: #d1fae5;
13
+ --color-warning: #f59e0b;
14
+ --color-warning-light: #fef3c7;
15
+ --color-danger: #ef4444;
16
+ --color-danger-light: #fee2e2;
17
+ --color-info: #0ea5e9;
18
+ --color-info-light: #cffafe;
19
+
20
+ /* Colors - Neutral */
21
+ --color-neutral-0: #ffffff;
22
+ --color-neutral-50: #f9fafb;
23
+ --color-neutral-100: #f3f4f6;
24
+ --color-neutral-200: #e5e7eb;
25
+ --color-neutral-300: #d1d5db;
26
+ --color-neutral-400: #9ca3af;
27
+ --color-neutral-500: #6b7280;
28
+ --color-neutral-600: #4b5563;
29
+ --color-neutral-700: #374151;
30
+ --color-neutral-800: #1f2937;
31
+ --color-neutral-900: #111827;
32
+
33
+ /* Background & Surface */
34
+ --bg-primary: var(--color-neutral-0);
35
+ --bg-secondary: var(--color-neutral-50);
36
+ --bg-hover: var(--color-neutral-100);
37
+ --text-primary: var(--color-neutral-900);
38
+ --text-secondary: var(--color-neutral-600);
39
+ --text-muted: var(--color-neutral-500);
40
+ --border-color: var(--color-neutral-200);
41
+ --border-color-hover: var(--color-neutral-300);
42
+
43
+ /* Dark Mode */
44
+ --dark-bg-primary: var(--color-neutral-900);
45
+ --dark-bg-secondary: var(--color-neutral-800);
46
+ --dark-bg-hover: var(--color-neutral-700);
47
+ --dark-text-primary: var(--color-neutral-0);
48
+ --dark-text-secondary: var(--color-neutral-300);
49
+ --dark-text-muted: var(--color-neutral-400);
50
+ --dark-border-color: var(--color-neutral-700);
51
+ --dark-border-color-hover: var(--color-neutral-600);
52
+
53
+ /* Typography */
54
+ --font-family: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;
55
+ --font-family-mono: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, monospace;
56
+
57
+ /* Font Sizes */
58
+ --font-xs: 0.75rem; /* 12px */
59
+ --font-sm: 0.875rem; /* 14px */
60
+ --font-base: 1rem; /* 16px */
61
+ --font-lg: 1.125rem; /* 18px */
62
+ --font-xl: 1.25rem; /* 20px */
63
+ --font-2xl: 1.5rem; /* 24px */
64
+ --font-3xl: 1.875rem; /* 30px */
65
+
66
+ /* Font Weights */
67
+ --fw-regular: 400;
68
+ --fw-medium: 500;
69
+ --fw-semibold: 600;
70
+ --fw-bold: 700;
71
+
72
+ /* Line Heights */
73
+ --lh-tight: 1.25;
74
+ --lh-normal: 1.5;
75
+ --lh-relaxed: 1.625;
76
+ --lh-loose: 2;
77
+
78
+ /* Spacing Scale (4px base unit) */
79
+ --space-0: 0;
80
+ --space-1: 0.25rem; /* 4px */
81
+ --space-2: 0.5rem; /* 8px */
82
+ --space-3: 0.75rem; /* 12px */
83
+ --space-4: 1rem; /* 16px */
84
+ --space-6: 1.5rem; /* 24px */
85
+ --space-8: 2rem; /* 32px */
86
+ --space-12: 3rem; /* 48px */
87
+ --space-16: 4rem; /* 64px */
88
+
89
+ /* Border Radius */
90
+ --radius-none: 0;
91
+ --radius-sm: 0.375rem; /* 6px */
92
+ --radius-md: 0.5rem; /* 8px */
93
+ --radius-lg: 0.75rem; /* 12px */
94
+ --radius-xl: 1rem; /* 16px */
95
+ --radius-2xl: 1.5rem; /* 24px */
96
+ --radius-full: 9999px; /* Pill-shaped */
97
+
98
+ /* Shadows */
99
+ --shadow-none: 0 0 0 0 rgba(0, 0, 0, 0);
100
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
101
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
102
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
103
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
104
+
105
+ /* Transitions */
106
+ --transition-fast: 150ms ease-out;
107
+ --transition-normal: 250ms ease-out;
108
+ --transition-slow: 350ms ease-out;
109
+
110
+ /* Layout */
111
+ --max-width-sm: 640px;
112
+ --max-width-md: 768px;
113
+ --max-width-lg: 1024px;
114
+ --max-width-xl: 1280px;
115
+ --max-width-2xl: 1536px;
116
+
117
+ /* Z-index */
118
+ --z-hide: -1;
119
+ --z-auto: auto;
120
+ --z-base: 0;
121
+ --z-dropdown: 1000;
122
+ --z-sticky: 1020;
123
+ --z-fixed: 1030;
124
+ --z-modal-backdrop: 1040;
125
+ --z-modal: 1050;
126
+ --z-popover: 1060;
127
+ --z-tooltip: 1070;
128
+ }
129
+
130
+ /* Dark mode */
131
+ body.dark-mode {
132
+ --bg-primary: var(--dark-bg-primary);
133
+ --bg-secondary: var(--dark-bg-secondary);
134
+ --bg-hover: var(--dark-bg-hover);
135
+ --text-primary: var(--dark-text-primary);
136
+ --text-secondary: var(--dark-text-secondary);
137
+ --text-muted: var(--dark-text-muted);
138
+ --border-color: var(--dark-border-color);
139
+ --border-color-hover: var(--dark-border-color-hover);
140
+ }
@@ -0,0 +1,19 @@
1
+ export type EventListener<T = any> = (data: T) => void;
2
+ export declare class EventEmitter<T = any> {
3
+ private listeners;
4
+ on(listener: EventListener<T>): () => void;
5
+ once(listener: EventListener<T>): void;
6
+ emit(data: T): void;
7
+ clear(): void;
8
+ getListenerCount(): number;
9
+ }
10
+ export declare abstract class Store<T> {
11
+ protected state: T;
12
+ protected stateChanged: EventEmitter<T>;
13
+ constructor(initialState: T);
14
+ getState(): T;
15
+ setState(newState: Partial<T>): void;
16
+ subscribe(listener: EventListener<T>): () => void;
17
+ protected updateState(updater: (state: T) => T): void;
18
+ }
19
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../../src/ui/client/utils/events.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAEvD,qBAAa,YAAY,CAAC,CAAC,GAAG,GAAG;IAC/B,OAAO,CAAC,SAAS,CAA0B;IAE3C,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAS1C,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;IAOtC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAUnB,KAAK,IAAI,IAAI;IAIb,gBAAgB,IAAI,MAAM;CAG3B;AAKD,8BAAsB,KAAK,CAAC,CAAC;IAC3B,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IACnB,SAAS,CAAC,YAAY,kBAAyB;gBAEnC,YAAY,EAAE,CAAC;IAI3B,QAAQ,IAAI,CAAC;IAIb,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAKpC,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAIjD,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI;CAItD"}
@@ -0,0 +1,54 @@
1
+ export class EventEmitter {
2
+ constructor() {
3
+ this.listeners = [];
4
+ }
5
+ on(listener) {
6
+ this.listeners.push(listener);
7
+ return () => {
8
+ this.listeners = this.listeners.filter((l) => l !== listener);
9
+ };
10
+ }
11
+ once(listener) {
12
+ const unsubscribe = this.on((data) => {
13
+ listener(data);
14
+ unsubscribe();
15
+ });
16
+ }
17
+ emit(data) {
18
+ this.listeners.forEach((listener) => {
19
+ try {
20
+ listener(data);
21
+ }
22
+ catch (error) {
23
+ console.error('Event listener error:', error);
24
+ }
25
+ });
26
+ }
27
+ clear() {
28
+ this.listeners = [];
29
+ }
30
+ getListenerCount() {
31
+ return this.listeners.length;
32
+ }
33
+ }
34
+ export class Store {
35
+ constructor(initialState) {
36
+ this.stateChanged = new EventEmitter();
37
+ this.state = initialState;
38
+ }
39
+ getState() {
40
+ return this.state;
41
+ }
42
+ setState(newState) {
43
+ this.state = { ...this.state, ...newState };
44
+ this.stateChanged.emit(this.state);
45
+ }
46
+ subscribe(listener) {
47
+ return this.stateChanged.on(listener);
48
+ }
49
+ updateState(updater) {
50
+ this.state = updater(this.state);
51
+ this.stateChanged.emit(this.state);
52
+ }
53
+ }
54
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/ui/client/utils/events.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,YAAY;IAAzB;QACU,cAAS,GAAuB,EAAE,CAAC;IAmC7C,CAAC;IAjCC,EAAE,CAAC,QAA0B;QAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAG9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAChE,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAA0B;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAO,EAAE,EAAE;YACtC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,IAAO;QACV,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAClC,IAAI,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IAC/B,CAAC;CACF;AAKD,MAAM,OAAgB,KAAK;IAIzB,YAAY,YAAe;QAFjB,iBAAY,GAAG,IAAI,YAAY,EAAK,CAAC;QAG7C,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;IAC5B,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,QAAoB;QAC3B,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC5C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,SAAS,CAAC,QAA0B;QAClC,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAES,WAAW,CAAC,OAAwB;QAC5C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export declare function formatBytes(bytes: number, decimals?: number): string;
2
+ export declare function formatDate(timestamp: number | string | Date): string;
3
+ export declare function formatRelativeTime(timestamp: number | string | Date): string;
4
+ export declare function truncate(str: string, maxLength: number): string;
5
+ export declare function capitalize(str: string): string;
6
+ export declare function formatInstallMethod(method: string): string;
7
+ export declare function getMethodBadgeColor(method: string): string;
8
+ export declare function formatPercent(value: number, decimals?: number): string;
9
+ export declare function debounce<T extends (...args: any[]) => any>(func: T, wait: number): (...args: Parameters<T>) => void;
10
+ export declare function throttle<T extends (...args: any[]) => any>(func: T, limit: number): (...args: Parameters<T>) => void;
11
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../../../src/ui/client/utils/formatting.ts"],"names":[],"mappings":"AAOA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAS/D;AAKD,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAsBpE;AAKD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAe5E;AAKD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/D;AAKD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAKD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAa1D;AAKD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAa1D;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAEjE;AAKD,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,MAAM,GACX,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CASlC;AAKD,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAUlC"}
@@ -0,0 +1,104 @@
1
+ export function formatBytes(bytes, decimals = 2) {
2
+ if (bytes === 0)
3
+ return '0 Bytes';
4
+ const k = 1024;
5
+ const dm = decimals < 0 ? 0 : decimals;
6
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
7
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
8
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
9
+ }
10
+ export function formatDate(timestamp) {
11
+ const date = new Date(timestamp);
12
+ const today = new Date();
13
+ const yesterday = new Date(today);
14
+ yesterday.setDate(yesterday.getDate() - 1);
15
+ const isToday = date.toDateString() === today.toDateString();
16
+ const isYesterday = date.toDateString() === yesterday.toDateString();
17
+ if (isToday) {
18
+ return 'Today at ' + date.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });
19
+ }
20
+ if (isYesterday) {
21
+ return 'Yesterday at ' + date.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });
22
+ }
23
+ return date.toLocaleDateString('en-US', {
24
+ month: 'short',
25
+ day: 'numeric',
26
+ year: date.getFullYear() !== today.getFullYear() ? 'numeric' : undefined,
27
+ });
28
+ }
29
+ export function formatRelativeTime(timestamp) {
30
+ const date = new Date(timestamp);
31
+ const now = new Date();
32
+ const diffMs = now.getTime() - date.getTime();
33
+ const diffSecs = Math.floor(diffMs / 1000);
34
+ const diffMins = Math.floor(diffSecs / 60);
35
+ const diffHours = Math.floor(diffMins / 60);
36
+ const diffDays = Math.floor(diffHours / 24);
37
+ if (diffSecs < 60)
38
+ return 'just now';
39
+ if (diffMins < 60)
40
+ return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`;
41
+ if (diffHours < 24)
42
+ return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;
43
+ if (diffDays < 7)
44
+ return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;
45
+ return formatDate(timestamp);
46
+ }
47
+ export function truncate(str, maxLength) {
48
+ if (str.length <= maxLength)
49
+ return str;
50
+ return str.slice(0, maxLength - 3) + '...';
51
+ }
52
+ export function capitalize(str) {
53
+ return str.charAt(0).toUpperCase() + str.slice(1);
54
+ }
55
+ export function formatInstallMethod(method) {
56
+ const methodMap = {
57
+ npm: 'npm',
58
+ yarn: 'Yarn',
59
+ pnpm: 'pnpm',
60
+ brew: 'Homebrew',
61
+ apt: 'apt',
62
+ yum: 'yum',
63
+ dnf: 'dnf',
64
+ custom: 'Custom',
65
+ };
66
+ return methodMap[method] || capitalize(method);
67
+ }
68
+ export function getMethodBadgeColor(method) {
69
+ const colorMap = {
70
+ npm: 'badge-primary',
71
+ yarn: 'badge-primary',
72
+ pnpm: 'badge-primary',
73
+ brew: 'badge-success',
74
+ apt: 'badge-warning',
75
+ yum: 'badge-warning',
76
+ dnf: 'badge-warning',
77
+ custom: 'badge-neutral',
78
+ };
79
+ return colorMap[method] || 'badge-neutral';
80
+ }
81
+ export function formatPercent(value, decimals = 1) {
82
+ return parseFloat(value.toFixed(decimals)) + '%';
83
+ }
84
+ export function debounce(func, wait) {
85
+ let timeout = null;
86
+ return function (...args) {
87
+ if (timeout)
88
+ clearTimeout(timeout);
89
+ timeout = setTimeout(() => {
90
+ func(...args);
91
+ }, wait);
92
+ };
93
+ }
94
+ export function throttle(func, limit) {
95
+ let lastRun = 0;
96
+ return function (...args) {
97
+ const now = Date.now();
98
+ if (now - lastRun >= limit) {
99
+ lastRun = now;
100
+ func(...args);
101
+ }
102
+ };
103
+ }
104
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../../../src/ui/client/utils/formatting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export type RouteHandler = (params: Record<string, string>) => void;
2
+ export interface Route {
3
+ path: string;
4
+ handler: RouteHandler;
5
+ title?: string;
6
+ }
7
+ export declare class Router {
8
+ private routes;
9
+ private currentRoute;
10
+ private onRouteChange;
11
+ constructor();
12
+ register(path: string, handler: RouteHandler, title?: string): void;
13
+ navigate(path: string): void;
14
+ getCurrentPath(): string;
15
+ private listenToHashChanges;
16
+ private route;
17
+ private matchRoute;
18
+ private pathMatches;
19
+ private extractParams;
20
+ onchange(callback: (route: Route) => void): void;
21
+ getRoutes(): Route[];
22
+ getCurrentRoute(): Route | null;
23
+ }
24
+ export declare const router: Router;
25
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../src/ui/client/utils/router.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;AAEpE,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,aAAa,CAAyC;;IAS9D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAOnE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO5B,cAAc,IAAI,MAAM;IAOxB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,KAAK;IA6Bb,OAAO,CAAC,UAAU;IAmBlB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,aAAa;IAkBrB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAOhD,SAAS,IAAI,KAAK,EAAE;IAOpB,eAAe,IAAI,KAAK,GAAG,IAAI;CAGhC;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC"}