@stacksjs/ts-cloud 0.6.0 → 0.6.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 (35) hide show
  1. package/dist/bin/cli.js +119 -119
  2. package/dist/drivers/shared/compute-deploy.d.ts +7 -0
  3. package/dist/index.js +5 -2
  4. package/dist/ui/index.html +4 -4
  5. package/dist/ui/server/actions.html +4 -4
  6. package/dist/ui/server/activity.html +1 -1
  7. package/dist/ui/server/backups.html +4 -4
  8. package/dist/ui/server/database.html +4 -4
  9. package/dist/ui/server/deployments.html +4 -4
  10. package/dist/ui/server/diagnostics.html +1 -1
  11. package/dist/ui/server/firewall.html +4 -4
  12. package/dist/ui/server/logs.html +4 -4
  13. package/dist/ui/server/metrics.html +1 -1
  14. package/dist/ui/server/security.html +1 -1
  15. package/dist/ui/server/services.html +4 -4
  16. package/dist/ui/server/sites.html +4 -4
  17. package/dist/ui/server/ssh-keys.html +4 -4
  18. package/dist/ui/server/terminal.html +4 -4
  19. package/dist/ui/server/workers.html +4 -4
  20. package/dist/ui/serverless/alarms.html +4 -4
  21. package/dist/ui/serverless/assets.html +4 -4
  22. package/dist/ui/serverless/cost.html +1 -1
  23. package/dist/ui/serverless/data.html +4 -4
  24. package/dist/ui/serverless/deployments.html +4 -4
  25. package/dist/ui/serverless/firewall.html +1 -1
  26. package/dist/ui/serverless/functions.html +4 -4
  27. package/dist/ui/serverless/logs.html +4 -4
  28. package/dist/ui/serverless/metrics.html +1 -1
  29. package/dist/ui/serverless/queues.html +4 -4
  30. package/dist/ui/serverless/scheduler.html +4 -4
  31. package/dist/ui/serverless/secrets.html +4 -4
  32. package/dist/ui/serverless/traces.html +4 -4
  33. package/dist/ui/serverless.html +4 -4
  34. package/dist/ui-src/pages/partials/head.stx +42 -30
  35. package/package.json +3 -3
@@ -1,36 +1,45 @@
1
1
  <meta charset="UTF-8">
2
2
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
3
3
  <title>{{ title ?? 'ts-cloud' }}</title>
4
- <!-- Inline SVG favicon (brand gradient tile) - declaring it stops the browser requesting /favicon.ico. -->
5
- <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='%235b8cff'/%3E%3Cstop offset='1' stop-color='%238b5cf6'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='url(%23g)'/%3E%3C/svg%3E">
4
+ <!-- Inline SVG favicon (single-accent tile) - declaring it stops the browser requesting /favicon.ico. -->
5
+ <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E">
6
6
  <link rel="preconnect" href="https://fonts.googleapis.com">
7
7
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
8
8
  <style>
9
9
  :root {
10
- --bg: #0b1020; --bg2: #0f1730; --panel: rgba(255,255,255,0.04); --panel-br: rgba(255,255,255,0.08);
11
- --txt: #e8edf7; --txt2: #9fb0cc; --txt3: #64748b;
12
- --accent: #5b8cff; --ok: #34d399; --okbg: rgba(52,211,153,0.12);
13
- --bad: #f87171; --badbg: rgba(248,113,113,0.12); --warn: #fbbf24; --warnbg: rgba(251,191,36,0.12);
10
+ --bg: #0a0e15; --bg2: #0b0f18; --panel: rgba(255,255,255,0.03); --panel-br: rgba(255,255,255,0.072);
11
+ --txt: #e9edf5; --txt2: #94a1b8; --txt3: #5a6577;
12
+ --accent: #5a8be0; --accent-dim: rgba(90,139,224,0.14); --accent-ink: #061019;
13
+ --ok: #35d19b; --okbg: rgba(53,209,155,0.11);
14
+ --bad: #f0736e; --badbg: rgba(240,115,110,0.11); --warn: #edb949; --warnbg: rgba(237,185,73,0.11);
15
+ --mono: ui-monospace, 'SF Mono', SFMono-Regular, Menlo, Consolas, monospace;
14
16
  }
15
17
  * { box-sizing: border-box; margin: 0; padding: 0; }
16
18
  html { background: var(--bg); min-height: 100%; }
17
19
  body {
18
20
  font-family: 'Inter', system-ui, sans-serif; color: var(--txt); min-height: 100vh;
19
- background: radial-gradient(1200px 600px at 80% -10%, rgba(91,140,255,0.12), transparent 60%), linear-gradient(160deg, var(--bg), var(--bg2));
21
+ /* One calm accent wash, no AI blue-purple mesh. */
22
+ background:
23
+ radial-gradient(900px 460px at 88% -8%, rgba(90,139,224,0.06), transparent 62%),
24
+ linear-gradient(175deg, var(--bg), var(--bg2));
20
25
  -webkit-font-smoothing: antialiased;
26
+ font-feature-settings: 'tnum' 1, 'ss01' 1;
21
27
  }
28
+ /* Tabular monospaced numerals wherever a value is read at a glance (density 7). */
29
+ .stat, .gauge .pct, .vital .vval, .health-hero .hmeta .item b, .kv > b, td.mono { font-variant-numeric: tabular-nums; }
30
+ .stat, .gauge .pct { font-family: var(--mono); letter-spacing: -0.03em; }
22
31
  a { color: inherit; text-decoration: none; }
23
32
  .wrap { max-width: 1180px; margin: 0 auto; padding: 0 24px 64px; }
24
33
 
25
34
  nav {
26
- display: flex; align-items: center; gap: 16px; padding: 18px 24px; position: sticky; top: 0; z-index: 10;
27
- background: rgba(11,16,32,0.7); backdrop-filter: blur(14px); border-bottom: 1px solid var(--panel-br);
35
+ display: flex; align-items: center; gap: 16px; padding: 16px 24px; position: sticky; top: 0; z-index: 10;
36
+ background: rgba(10,14,21,0.72); backdrop-filter: blur(14px); border-bottom: 1px solid var(--panel-br);
28
37
  }
29
- .brand { display: flex; align-items: center; gap: 10px; font-weight: 800; font-size: 18px; letter-spacing: -0.02em; }
30
- .brand .dot { width: 22px; height: 22px; border-radius: 7px; background: linear-gradient(135deg, var(--accent), #8b5cf6); box-shadow: 0 0 18px rgba(91,140,255,0.6); }
38
+ .brand { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 17px; letter-spacing: -0.02em; }
39
+ .brand .dot { width: 20px; height: 20px; border-radius: 6px; background: var(--accent); box-shadow: inset 0 1px 0 rgba(255,255,255,0.35); }
31
40
  .tabs { display: flex; gap: 4px; margin-left: 18px; }
32
41
  .tabs a { padding: 6px 12px; border-radius: 8px; font-size: 13px; font-weight: 600; color: var(--txt2); }
33
- .tabs a.active { background: rgba(91,140,255,0.14); color: var(--accent); }
42
+ .tabs a.active { background: rgba(90,139,224,0.14); color: var(--accent); }
34
43
  .nav-meta { margin-left: auto; display: flex; align-items: center; gap: 14px; color: var(--txt2); font-size: 13px; }
35
44
  .env { padding: 4px 10px; border-radius: 999px; background: var(--okbg); color: var(--ok); font-weight: 600; font-size: 12px; }
36
45
  .env-switch { display: inline-flex; gap: 2px; padding: 3px; border: 1px solid var(--panel-br); background: rgba(255,255,255,0.035); border-radius: 999px; }
@@ -58,12 +67,12 @@
58
67
  @media (max-width: 880px) { .cards, .cards-3, .cards-2 { grid-template-columns: repeat(2, 1fr); } }
59
68
  .panel { background: var(--panel); border: 1px solid var(--panel-br); border-radius: 16px; padding: 18px; backdrop-filter: blur(6px); }
60
69
  a.panel { display: block; transition: border-color .15s, transform .15s; }
61
- a.panel:hover { border-color: rgba(91,140,255,0.5); transform: translateY(-1px); }
70
+ a.panel:hover { border-color: rgba(90,139,224,0.5); transform: translateY(-1px); }
62
71
  .panel h3 { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--txt3); font-weight: 700; }
63
72
  .stat { font-size: 28px; font-weight: 800; margin-top: 8px; letter-spacing: -0.02em; }
64
73
  .stat small { font-size: 14px; color: var(--txt2); font-weight: 500; }
65
74
  .bar { height: 7px; border-radius: 999px; background: rgba(255,255,255,0.07); margin-top: 12px; overflow: hidden; }
66
- .bar > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--accent), #8b5cf6); }
75
+ .bar > i { display: block; height: 100%; border-radius: 999px; background: var(--accent); }
67
76
 
68
77
  .section { margin-top: 30px; }
69
78
  .section > h2 { font-size: 15px; font-weight: 700; margin-bottom: 12px; display: flex; align-items: center; gap: 8px; }
@@ -83,7 +92,7 @@
83
92
  .pill.ok { background: var(--okbg); color: var(--ok); }
84
93
  .pill.bad { background: var(--badbg); color: var(--bad); }
85
94
  .pill.warn { background: var(--warnbg); color: var(--warn); }
86
- .tag { padding: 2px 8px; border-radius: 6px; background: rgba(91,140,255,0.12); color: var(--accent); font-size: 12px; font-weight: 600; }
95
+ .tag { padding: 2px 8px; border-radius: 6px; background: rgba(90,139,224,0.12); color: var(--accent); font-size: 12px; font-weight: 600; }
87
96
 
88
97
  .kv { display: flex; justify-content: space-between; padding: 9px 0; border-top: 1px solid rgba(255,255,255,0.05); font-size: 14px; gap: 16px; }
89
98
  .kv:first-of-type { border-top: 0; }
@@ -93,10 +102,13 @@
93
102
  .deploy:first-of-type { border-top: 0; }
94
103
  .deploy .when { margin-left: auto; color: var(--txt3); font-size: 12px; }
95
104
 
96
- .btn { background: linear-gradient(135deg, var(--accent), #8b5cf6); color: #fff; border: 0; border-radius: 10px; padding: 10px 18px; font-weight: 700; font-size: 14px; cursor: pointer; font-family: inherit; white-space: nowrap; }
97
- .btn:hover { filter: brightness(1.08); }
98
- .btn.ghost { background: rgba(255,255,255,0.05); border: 1px solid var(--panel-br); color: var(--txt); }
99
- .btn.danger { background: var(--badbg); color: var(--bad); }
105
+ .btn { background: var(--accent); color: var(--accent-ink); border: 0; border-radius: 10px; padding: 9px 16px; font-weight: 700; font-size: 13.5px; cursor: pointer; font-family: inherit; white-space: nowrap; transition: filter .12s, transform .12s; }
106
+ .btn:hover { filter: brightness(1.06); }
107
+ .btn:active { transform: translateY(1px); }
108
+ .btn.ghost { background: rgba(255,255,255,0.045); border: 1px solid var(--panel-br); color: var(--txt); }
109
+ .btn.ghost:hover { background: rgba(255,255,255,0.075); filter: none; }
110
+ .btn.danger { background: transparent; border: 1px solid var(--badbg); color: var(--bad); }
111
+ .btn.danger:hover { background: var(--badbg); filter: none; }
100
112
  .btn.sm { padding: 6px 12px; font-size: 12px; }
101
113
 
102
114
  .data-item { display: flex; align-items: center; gap: 12px; padding: 11px 0; border-top: 1px solid rgba(255,255,255,0.05); font-size: 14px; }
@@ -109,7 +121,7 @@
109
121
 
110
122
  /* Drill-down extras */
111
123
  .spark { display: flex; align-items: flex-end; gap: 3px; height: 48px; margin-top: 12px; }
112
- .spark > i { flex: 1; background: linear-gradient(180deg, var(--accent), rgba(91,140,255,0.25)); border-radius: 3px 3px 0 0; min-height: 2px; }
124
+ .spark > i { flex: 1; background: linear-gradient(180deg, var(--accent), rgba(90,139,224,0.25)); border-radius: 3px 3px 0 0; min-height: 2px; }
113
125
  .logs { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12.5px; line-height: 1.7; color: var(--txt2); max-height: 360px; overflow: auto; }
114
126
  .logs .ts { color: var(--txt3); }
115
127
  .logs .err { color: var(--bad); }
@@ -166,7 +178,7 @@
166
178
  padding: 10px 12px; color: var(--txt); font-family: inherit; font-size: 14px;
167
179
  }
168
180
  .field-block textarea { resize: vertical; min-height: 92px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; line-height: 1.5; }
169
- .field-block input:focus, .field-block textarea:focus, .select-filter select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(91,140,255,0.12); }
181
+ .field-block input:focus, .field-block textarea:focus, .select-filter select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(90,139,224,0.12); }
170
182
  .form-actions { grid-column: 1 / -1; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
171
183
  .msg { color: var(--txt3); font-size: 13px; }
172
184
  .msg.ok { color: var(--ok); }
@@ -175,7 +187,7 @@
175
187
  .filters { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; margin: 16px 0; }
176
188
  .segmented { display: inline-flex; padding: 4px; border: 1px solid var(--panel-br); background: rgba(255,255,255,0.035); border-radius: 12px; gap: 2px; }
177
189
  .segmented button { appearance: none; border: 0; background: transparent; color: var(--txt2); border-radius: 9px; padding: 7px 12px; font: inherit; font-size: 13px; font-weight: 700; cursor: pointer; }
178
- .segmented button.active { background: rgba(91,140,255,0.18); color: var(--accent); box-shadow: inset 0 0 0 1px rgba(91,140,255,0.18); }
190
+ .segmented button.active { background: rgba(90,139,224,0.18); color: var(--accent); box-shadow: inset 0 0 0 1px rgba(90,139,224,0.18); }
179
191
  .select-filter { display: inline-flex; align-items: center; gap: 8px; }
180
192
  .select-filter select { min-width: 150px; padding: 8px 10px; }
181
193
  @media (max-width: 760px) {
@@ -189,7 +201,7 @@
189
201
  backend - the buttons would POST nowhere, so we show the exact command). */
190
202
  .cmd { display: inline-flex; align-items: center; gap: 8px; padding: 6px 12px; border-radius: 10px; background: rgba(255,255,255,0.05); border: 1px solid var(--panel-br); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12.5px; color: var(--txt); white-space: nowrap; }
191
203
  .cmd::before { content: '$'; color: var(--txt3); }
192
- .cmd.accent { border-color: rgba(91,140,255,0.4); color: var(--accent); }
204
+ .cmd.accent { border-color: rgba(90,139,224,0.4); color: var(--accent); }
193
205
  .cmds { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
194
206
 
195
207
  /* Server dashboard components */
@@ -210,7 +222,7 @@
210
222
  svg.chart .bar-mark.ok rect { fill: var(--ok); opacity: 0.85; }
211
223
  svg.chart .bar-mark.warn rect { fill: var(--warn); opacity: 0.88; }
212
224
  svg.chart .bar-mark.bad rect { fill: var(--bad); opacity: 0.9; }
213
- svg.chart .spark-path { fill: none; stroke: var(--accent); stroke-width: 3; stroke-linecap: round; stroke-linejoin: round; filter: drop-shadow(0 0 8px rgba(91,140,255,0.38)); }
225
+ svg.chart .spark-path { fill: none; stroke: var(--accent); stroke-width: 2.25; stroke-linecap: round; stroke-linejoin: round; }
214
226
  svg.chart circle.ok { fill: var(--ok); }
215
227
  svg.chart circle.bad { fill: var(--bad); }
216
228
  svg.chart.disabled { opacity: 0.86; }
@@ -230,7 +242,7 @@
230
242
  .health-hero .status { display: inline-flex; align-items: center; gap: 12px; font-weight: 800; font-size: 17px; letter-spacing: -0.01em; color: var(--hue); }
231
243
  .health-hero .status .led {
232
244
  width: 13px; height: 13px; border-radius: 50%; background: var(--hue);
233
- box-shadow: 0 0 0 4px var(--huebg), 0 0 16px var(--hue); animation: hb-pulse 2.4s ease-in-out infinite;
245
+ box-shadow: 0 0 0 4px var(--huebg); animation: hb-pulse 2.4s ease-in-out infinite;
234
246
  }
235
247
  .health-hero .status small { display: block; color: var(--txt3); font-size: 12px; font-weight: 500; margin-top: 2px; letter-spacing: 0; }
236
248
  @keyframes hb-pulse { 0%, 100% { opacity: 1 } 50% { opacity: 0.5 } }
@@ -260,7 +272,7 @@
260
272
  }
261
273
  .gauge .ring::after {
262
274
  content: ''; position: absolute; inset: 15px; border-radius: 50%;
263
- background: linear-gradient(160deg, rgba(20,28,52,0.98), rgba(14,20,40,0.98));
275
+ background: linear-gradient(160deg, #10151f, #0c1017);
264
276
  box-shadow: inset 0 0 0 1px rgba(255,255,255,0.035);
265
277
  }
266
278
  .gauge .center { position: absolute; inset: 0; z-index: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; }
@@ -282,14 +294,14 @@
282
294
  .vital .vnote { font-size: 12px; color: var(--txt3); margin-top: 3px; }
283
295
 
284
296
  /* Tone-colored progress bars (shared with index health cards). */
285
- .bar.ok > i { background: linear-gradient(90deg, var(--ok), #22c55e); }
286
- .bar.warn > i { background: linear-gradient(90deg, var(--warn), #f59e0b); }
287
- .bar.bad > i { background: linear-gradient(90deg, var(--bad), #ef4444); }
297
+ .bar.ok > i { background: var(--ok); }
298
+ .bar.warn > i { background: var(--warn); }
299
+ .bar.bad > i { background: var(--bad); }
288
300
 
289
301
  /* Load trend chart - sparkline with capacity guide + axis labels. */
290
302
  .chart { position: relative; }
291
303
  .chart .spark { height: 124px; align-items: flex-end; }
292
- .chart .spark > i { background: linear-gradient(180deg, var(--accent), rgba(91,140,255,0.22)); transition: height .6s ease; }
304
+ .chart .spark > i { background: linear-gradient(180deg, var(--accent), rgba(90,139,224,0.22)); transition: height .6s ease; }
293
305
  .chart .spark > i.hot { background: linear-gradient(180deg, var(--warn), rgba(251,191,36,0.22)); }
294
306
  .chart .spark > i.peak { background: linear-gradient(180deg, var(--bad), rgba(248,113,113,0.25)); }
295
307
  .chart .xaxis { display: flex; justify-content: space-between; margin-top: 9px; color: var(--txt3); font-size: 11px; }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stacksjs/ts-cloud",
3
3
  "type": "module",
4
- "version": "0.6.0",
4
+ "version": "0.6.2",
5
5
  "description": "A lightweight, performant infrastructure-as-code library and CLI for deploying both server-based (EC2) and serverless applications.",
6
6
  "author": "Chris Breuer <chris@stacksjs.com>",
7
7
  "license": "MIT",
@@ -89,8 +89,8 @@
89
89
  "test": "bun test"
90
90
  },
91
91
  "dependencies": {
92
- "@ts-cloud/aws-types": "0.6.0",
93
- "@ts-cloud/core": "0.6.0",
92
+ "@ts-cloud/aws-types": "0.6.2",
93
+ "@ts-cloud/core": "0.6.2",
94
94
  "@stacksjs/ts-xml": "^0.1.0"
95
95
  },
96
96
  "devDependencies": {