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,400 @@
1
+ /* Component Styles - Buttons, Cards, Inputs, Badges, Modals */
2
+
3
+ /* Buttons */
4
+ .btn {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ gap: var(--space-2);
9
+ padding: var(--space-2) var(--space-4);
10
+ font-size: var(--font-sm);
11
+ font-weight: var(--fw-medium);
12
+ line-height: var(--lh-normal);
13
+ border: 1px solid transparent;
14
+ border-radius: var(--radius-md);
15
+ cursor: pointer;
16
+ transition: all var(--transition-fast);
17
+ user-select: none;
18
+ text-decoration: none;
19
+ white-space: nowrap;
20
+ }
21
+
22
+ .btn:disabled {
23
+ opacity: 0.5;
24
+ cursor: not-allowed;
25
+ }
26
+
27
+ /* Button Sizes */
28
+ .btn-sm {
29
+ padding: var(--space-1) var(--space-3);
30
+ font-size: var(--font-xs);
31
+ }
32
+
33
+ .btn-lg {
34
+ padding: var(--space-3) var(--space-6);
35
+ font-size: var(--font-base);
36
+ }
37
+
38
+ /* Button Variants */
39
+ .btn-primary {
40
+ background-color: var(--color-primary);
41
+ color: white;
42
+ border-color: var(--color-primary);
43
+ }
44
+
45
+ .btn-primary:hover:not(:disabled) {
46
+ background-color: var(--color-primary-hover);
47
+ border-color: var(--color-primary-hover);
48
+ transform: translateY(-1px);
49
+ box-shadow: var(--shadow-md);
50
+ }
51
+
52
+ .btn-primary:active:not(:disabled) {
53
+ transform: translateY(0);
54
+ box-shadow: var(--shadow-sm);
55
+ }
56
+
57
+ .btn-secondary {
58
+ background-color: var(--color-neutral-200);
59
+ color: var(--text-primary);
60
+ border-color: var(--color-neutral-200);
61
+ }
62
+
63
+ .btn-secondary:hover:not(:disabled) {
64
+ background-color: var(--color-neutral-300);
65
+ border-color: var(--color-neutral-300);
66
+ transform: translateY(-1px);
67
+ box-shadow: var(--shadow-md);
68
+ }
69
+
70
+ .btn-danger {
71
+ background-color: var(--color-danger);
72
+ color: white;
73
+ border-color: var(--color-danger);
74
+ }
75
+
76
+ .btn-danger:hover:not(:disabled) {
77
+ background-color: #dc2626;
78
+ border-color: #dc2626;
79
+ transform: translateY(-1px);
80
+ box-shadow: var(--shadow-md);
81
+ }
82
+
83
+ .btn-ghost {
84
+ background-color: transparent;
85
+ color: var(--text-secondary);
86
+ border-color: transparent;
87
+ }
88
+
89
+ .btn-ghost:hover:not(:disabled) {
90
+ background-color: var(--bg-secondary);
91
+ border-color: var(--border-color);
92
+ }
93
+
94
+ .btn-ghost-primary {
95
+ background-color: var(--color-primary-light);
96
+ color: var(--color-primary);
97
+ border-color: transparent;
98
+ }
99
+
100
+ .btn-ghost-primary:hover:not(:disabled) {
101
+ background-color: var(--color-primary);
102
+ color: white;
103
+ }
104
+
105
+ /* Cards */
106
+ .card {
107
+ background-color: var(--bg-primary);
108
+ border: 1px solid var(--border-color);
109
+ border-radius: var(--radius-lg);
110
+ padding: var(--space-4);
111
+ transition: all var(--transition-normal);
112
+ }
113
+
114
+ .card:hover {
115
+ border-color: var(--border-color-hover);
116
+ box-shadow: var(--shadow-md);
117
+ transform: translateY(-2px);
118
+ }
119
+
120
+ .card-header {
121
+ display: flex;
122
+ align-items: center;
123
+ justify-content: space-between;
124
+ padding-bottom: var(--space-3);
125
+ border-bottom: 1px solid var(--border-color);
126
+ margin-bottom: var(--space-3);
127
+ }
128
+
129
+ .card-body {
130
+ flex: 1;
131
+ }
132
+
133
+ .card-footer {
134
+ display: flex;
135
+ gap: var(--space-2);
136
+ padding-top: var(--space-3);
137
+ border-top: 1px solid var(--border-color);
138
+ margin-top: var(--space-3);
139
+ }
140
+
141
+ /* Input Fields */
142
+ .form-group {
143
+ margin-bottom: var(--space-4);
144
+ }
145
+
146
+ .form-label {
147
+ display: block;
148
+ margin-bottom: var(--space-2);
149
+ font-weight: var(--fw-medium);
150
+ color: var(--text-primary);
151
+ font-size: var(--font-sm);
152
+ }
153
+
154
+ .form-input {
155
+ width: 100%;
156
+ padding: var(--space-2) var(--space-3);
157
+ border: 1px solid var(--border-color);
158
+ border-radius: var(--radius-md);
159
+ background-color: var(--bg-primary);
160
+ color: var(--text-primary);
161
+ font-size: var(--font-base);
162
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
163
+ }
164
+
165
+ .form-input::placeholder {
166
+ color: var(--text-muted);
167
+ }
168
+
169
+ .form-input:focus {
170
+ outline: none;
171
+ border-color: var(--color-primary);
172
+ box-shadow: 0 0 0 3px var(--color-primary-light);
173
+ }
174
+
175
+ .form-input:disabled {
176
+ background-color: var(--bg-secondary);
177
+ color: var(--text-muted);
178
+ cursor: not-allowed;
179
+ opacity: 0.5;
180
+ }
181
+
182
+ /* Badges */
183
+ .badge {
184
+ display: inline-flex;
185
+ align-items: center;
186
+ gap: var(--space-1);
187
+ padding: var(--space-1) var(--space-2);
188
+ border-radius: var(--radius-sm);
189
+ font-size: var(--font-xs);
190
+ font-weight: var(--fw-medium);
191
+ white-space: nowrap;
192
+ }
193
+
194
+ .badge-primary {
195
+ background-color: var(--color-primary-light);
196
+ color: var(--color-primary);
197
+ }
198
+
199
+ .badge-success {
200
+ background-color: var(--color-success-light);
201
+ color: var(--color-success);
202
+ }
203
+
204
+ .badge-warning {
205
+ background-color: var(--color-warning-light);
206
+ color: var(--color-warning);
207
+ }
208
+
209
+ .badge-danger {
210
+ background-color: var(--color-danger-light);
211
+ color: var(--color-danger);
212
+ }
213
+
214
+ .badge-neutral {
215
+ background-color: var(--color-neutral-100);
216
+ color: var(--color-neutral-700);
217
+ }
218
+
219
+ /* Modals */
220
+ .modal-backdrop {
221
+ display: none;
222
+ position: fixed;
223
+ top: 0;
224
+ left: 0;
225
+ right: 0;
226
+ bottom: 0;
227
+ background-color: rgba(0, 0, 0, 0.5);
228
+ z-index: var(--z-modal-backdrop);
229
+ }
230
+
231
+ .modal-backdrop.active {
232
+ display: flex;
233
+ align-items: center;
234
+ justify-content: center;
235
+ }
236
+
237
+ .modal {
238
+ background-color: var(--bg-primary);
239
+ border-radius: var(--radius-xl);
240
+ box-shadow: var(--shadow-xl);
241
+ padding: var(--space-6);
242
+ max-width: 500px;
243
+ width: 90%;
244
+ max-height: 90vh;
245
+ overflow-y: auto;
246
+ z-index: var(--z-modal);
247
+ position: relative;
248
+ }
249
+
250
+ .modal-header {
251
+ display: flex;
252
+ align-items: center;
253
+ justify-content: space-between;
254
+ margin-bottom: var(--space-4);
255
+ padding-bottom: var(--space-3);
256
+ border-bottom: 1px solid var(--border-color);
257
+ }
258
+
259
+ .modal-title {
260
+ font-size: var(--font-xl);
261
+ font-weight: var(--fw-bold);
262
+ margin: 0;
263
+ }
264
+
265
+ .modal-close {
266
+ background: none;
267
+ border: none;
268
+ font-size: var(--font-xl);
269
+ cursor: pointer;
270
+ color: var(--text-muted);
271
+ padding: 0;
272
+ width: 32px;
273
+ height: 32px;
274
+ display: flex;
275
+ align-items: center;
276
+ justify-content: center;
277
+ border-radius: var(--radius-md);
278
+ transition: all var(--transition-fast);
279
+ }
280
+
281
+ .modal-close:hover {
282
+ background-color: var(--bg-secondary);
283
+ color: var(--text-primary);
284
+ }
285
+
286
+ .modal-body {
287
+ margin-bottom: var(--space-4);
288
+ }
289
+
290
+ .modal-footer {
291
+ display: flex;
292
+ gap: var(--space-2);
293
+ justify-content: flex-end;
294
+ padding-top: var(--space-4);
295
+ border-top: 1px solid var(--border-color);
296
+ }
297
+
298
+ /* Alerts */
299
+ .alert {
300
+ padding: var(--space-3) var(--space-4);
301
+ border-radius: var(--radius-md);
302
+ margin-bottom: var(--space-4);
303
+ display: flex;
304
+ gap: var(--space-2);
305
+ align-items: flex-start;
306
+ }
307
+
308
+ .alert-success {
309
+ background-color: var(--color-success-light);
310
+ color: var(--color-success);
311
+ border: 1px solid var(--color-success);
312
+ }
313
+
314
+ .alert-danger {
315
+ background-color: var(--color-danger-light);
316
+ color: var(--color-danger);
317
+ border: 1px solid var(--color-danger);
318
+ }
319
+
320
+ .alert-warning {
321
+ background-color: var(--color-warning-light);
322
+ color: var(--color-warning);
323
+ border: 1px solid var(--color-warning);
324
+ }
325
+
326
+ .alert-info {
327
+ background-color: var(--color-info-light);
328
+ color: var(--color-info);
329
+ border: 1px solid var(--color-info);
330
+ }
331
+
332
+ /* Tabs */
333
+ .tabs {
334
+ display: flex;
335
+ gap: 0;
336
+ border-bottom: 1px solid var(--border-color);
337
+ margin-bottom: var(--space-4);
338
+ }
339
+
340
+ .tab-button {
341
+ padding: var(--space-3) var(--space-4);
342
+ background: none;
343
+ border: none;
344
+ cursor: pointer;
345
+ font-size: var(--font-base);
346
+ font-weight: var(--fw-medium);
347
+ color: var(--text-secondary);
348
+ border-bottom: 2px solid transparent;
349
+ transition: all var(--transition-fast);
350
+ }
351
+
352
+ .tab-button:hover {
353
+ color: var(--text-primary);
354
+ }
355
+
356
+ .tab-button.active {
357
+ color: var(--color-primary);
358
+ border-bottom-color: var(--color-primary);
359
+ }
360
+
361
+ .tab-content {
362
+ display: none;
363
+ }
364
+
365
+ .tab-content.active {
366
+ display: block;
367
+ }
368
+
369
+ /* Status Indicator */
370
+ .status {
371
+ display: inline-flex;
372
+ align-items: center;
373
+ gap: var(--space-2);
374
+ font-size: var(--font-sm);
375
+ font-weight: var(--fw-medium);
376
+ }
377
+
378
+ .status::before {
379
+ content: '';
380
+ display: inline-block;
381
+ width: 8px;
382
+ height: 8px;
383
+ border-radius: 50%;
384
+ }
385
+
386
+ .status-success::before {
387
+ background-color: var(--color-success);
388
+ }
389
+
390
+ .status-warning::before {
391
+ background-color: var(--color-warning);
392
+ }
393
+
394
+ .status-danger::before {
395
+ background-color: var(--color-danger);
396
+ }
397
+
398
+ .status-neutral::before {
399
+ background-color: var(--text-muted);
400
+ }
@@ -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
+ }