@stacksjs/defaults 0.75.73 → 0.75.75

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 (31) hide show
  1. package/ai/skills/stacks-actions/SKILL.md +1 -1
  2. package/ai/skills/stacks-ai/SKILL.md +18 -0
  3. package/ai/skills/stacks-dashboard/SKILL.md +42 -7
  4. package/ai/skills/stacks-payments/SKILL.md +11 -0
  5. package/app/Actions/Dashboard/DashboardHomeAction.test.ts +33 -1
  6. package/app/Actions/Dashboard/DashboardHomeAction.ts +63 -25
  7. package/app/Actions/Dashboard/Remote/RemoteCommandIndexAction.ts +3 -0
  8. package/app/Actions/Dashboard/Remote/RemoteTerminalCloseAction.ts +25 -0
  9. package/app/Actions/Dashboard/Remote/RemoteTerminalInputAction.ts +25 -0
  10. package/app/Actions/Dashboard/Remote/RemoteTerminalOpenAction.ts +39 -0
  11. package/app/Actions/Dashboard/Remote/RemoteTerminalResizeAction.ts +25 -0
  12. package/app/Actions/Dashboard/Remote/RemoteTerminalStreamAction.ts +36 -0
  13. package/app/Actions/Dashboard/Remote/remote-commands.ts +30 -1
  14. package/app/Actions/Dashboard/Remote/remote-routes.test.ts +4 -4
  15. package/app/Actions/Dashboard/Remote/remote-terminal.test.ts +463 -0
  16. package/app/Actions/Dashboard/Remote/remote-terminal.ts +399 -0
  17. package/app/Actions/Dashboard/Remote/ssh-runner.ts +82 -1
  18. package/app/Actions/Dashboard/Remote/terminal-sessions.ts +80 -0
  19. package/functions/dashboard-api.ts +13 -0
  20. package/functions/remote-terminal-element.ts +287 -0
  21. package/functions/remote.test.ts +52 -0
  22. package/functions/remote.ts +136 -0
  23. package/functions/xterm-styles.d.ts +9 -0
  24. package/ide/vscode/package.json +1 -1
  25. package/package.json +5 -3
  26. package/resources/components/Dashboard/Remote/RemoteConsole.stx +162 -0
  27. package/resources/components/NativeAppShell.stx +14 -0
  28. package/resources/components/NativeComponents.test.ts +6 -0
  29. package/resources/functions/dashboard/sidebar.ts +3 -0
  30. package/routes/dashboard-api.ts +7 -0
  31. package/views/dashboard/remote/index.stx +8 -0
@@ -148,6 +148,20 @@ const shellClass = derived(() => `${nativeMobile() ? 'native-mobile ' : ''}${cla
148
148
  padding-bottom: var(--native-safe-area-bottom);
149
149
  }
150
150
 
151
+ /* While the keyboard is up, the tab bar steps aside, as iOS does: left in
152
+ place it rode up on top of the keyboard and took a fifth of the screen
153
+ from whatever was being typed. Hidden rather than removed, so the
154
+ content's clearance below stays and nothing jumps when it comes back. */
155
+ .native-app-shell.native-mobile:has(:is(input:not([type=checkbox], [type=radio], [type=range], [type=button], [type=submit], [type=file]), textarea, select, [contenteditable=true]):focus) .native-app-tab-slot {
156
+ visibility: hidden;
157
+ }
158
+
159
+ @media (max-width: 767.98px) and (pointer: coarse) {
160
+ .native-app-shell:has(:is(input:not([type=checkbox], [type=radio], [type=range], [type=button], [type=submit], [type=file]), textarea, select, [contenteditable=true]):focus) .native-app-tab-slot {
161
+ visibility: hidden;
162
+ }
163
+ }
164
+
151
165
  /* A phone app does not select its chrome on a long press, or flash it grey
152
166
  on a tap. Text inside the content is left selectable. */
153
167
  .native-app-shell.native-mobile .native-app-tab-slot,
@@ -40,6 +40,12 @@ describe('Native components', () => {
40
40
  expect(bar).toContain("useReactiveProp<string>('title', '')")
41
41
  })
42
42
 
43
+ it('steps the tab bar aside while the keyboard is up', () => {
44
+ const shell = read('NativeAppShell')
45
+ expect(shell).toContain('textarea, select, [contenteditable=true]):focus) .native-app-tab-slot')
46
+ expect(shell).toContain('visibility: hidden;')
47
+ })
48
+
43
49
  it('keeps every text field big enough that iOS does not zoom into it', () => {
44
50
  expect(read('NativeAppShell')).toContain('.native-app-shell :is(input, textarea, select) { font-size: max(16px, 1em); }')
45
51
  })
@@ -477,6 +477,9 @@ export function buildNavSections(
477
477
  const managementItems: NavItem[] = [
478
478
  { to: '/cloud', icon: 'cloud', text: 'Cloud' },
479
479
  { to: '/servers', icon: 'server', text: 'Servers' },
480
+ // Named commands and terminals on configured hosts (stacksjs/stacks#960).
481
+ // Hidden from client-role viewers; the gates decide who may use it.
482
+ { to: '/remote', icon: 'terminal', text: 'Remote', roles: ['admin', 'dev'] },
480
483
  { to: '/serverless', icon: 'zap', text: 'Serverless' },
481
484
  { to: '/dns', icon: 'globe-search', text: 'DNS' },
482
485
  { to: '/management/permissions', icon: 'lock', text: 'Permissions' },
@@ -282,6 +282,13 @@ route.group({ prefix: '/api/dashboard', apiResponse: true }, () => {
282
282
  */
283
283
  authenticatedGuard(route.get('/remote/commands', 'Actions/Dashboard/Remote/RemoteCommandIndexAction'))
284
284
  authenticatedGuard(route.post('/remote/run', 'Actions/Dashboard/Remote/RemoteCommandRunAction'))
285
+ // Interactive terminals into hosts that opt in with `terminal: true`,
286
+ // authorized by the `open-remote-terminal` gate. Same guard, same reason.
287
+ authenticatedGuard(route.post('/remote/terminals', 'Actions/Dashboard/Remote/RemoteTerminalOpenAction'))
288
+ authenticatedGuard(route.get('/remote/terminals/{id}/stream', 'Actions/Dashboard/Remote/RemoteTerminalStreamAction'))
289
+ authenticatedGuard(route.post('/remote/terminals/{id}/input', 'Actions/Dashboard/Remote/RemoteTerminalInputAction'))
290
+ authenticatedGuard(route.post('/remote/terminals/{id}/resize', 'Actions/Dashboard/Remote/RemoteTerminalResizeAction'))
291
+ authenticatedGuard(route.delete('/remote/terminals/{id}', 'Actions/Dashboard/Remote/RemoteTerminalCloseAction'))
285
292
 
286
293
  guard(route.get('/ci/status', 'Actions/Dashboard/Ci/StatusAction'))
287
294
  // CI drilldown (stacksjs/stacks#1848): per-repo run history + per-run
@@ -0,0 +1,8 @@
1
+ @extends('layouts/default')
2
+
3
+ @section('content')
4
+ @title('Dashboard - Remote')
5
+ <PageLayout>
6
+ <RemoteConsole />
7
+ </PageLayout>
8
+ @endsection