gsxdsm
e923b5e84d
FN-6527: add terminal shortcuts and preferences
Adds persistent terminal customization and keyboard-less navigation controls to the dashboard terminal.
- Add arrow shortcut buttons that send ANSI cursor sequences alongside existing Ctrl/Alt helpers.
- Add localStorage-backed terminal preferences for font family, size, cursor style, blink, and renderer with legacy font-size migration.
- Apply font and cursor preferences live, document renderer behavior, and cover preference parsing and modal controls with tests.
Files changed:
docs/dashboard-guide.md | 3 +
.../dashboard/app/components/TerminalModal.css | 57 ++++-
.../dashboard/app/components/TerminalModal.tsx | 271 ++++++++++++++++-----
.../components/__tests__/TerminalModal.test.tsx | 135 +++++++++-
.../utils/__tests__/terminalPreferences.test.ts | 90 +++++++
.../dashboard/app/utils/terminalPreferences.ts | 197 +++++++++++++++
6 files changed, 690 insertions(+), 63 deletions(-)
Fusion-Task-Id: FN-6527
Fusion-Task-Lineage: bc863486-9d2c-41d5-84a4-7b697e81a298
2026-06-17 00:06:24 -07:00
..
2026-06-17 00:06:24 -07:00
2026-06-09 01:57:16 -07:00
2026-06-16 20:59:30 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-16 15:08:24 -07:00
2026-06-16 15:08:24 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-14 15:29:35 -07:00
2026-06-12 22:55:01 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 17:14:42 -07:00
2026-06-03 20:56:05 -07:00
2026-05-16 18:40:03 -07:00
2026-06-03 20:52:44 -07:00
2026-06-08 13:32:58 -07:00
2026-06-12 10:00:08 -07:00
2026-05-30 14:20:12 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-07 23:30:16 -07:00
2026-06-12 09:46:46 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-11 22:11:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-10 06:02:12 -07:00
2026-06-05 01:16:13 -07:00
2026-05-19 03:21:17 -07:00
2026-06-13 09:08:43 -07:00
2026-06-08 13:32:58 -07:00
2026-06-01 16:24:21 -07:00
2026-06-03 20:56:05 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-04 08:00:33 -07:00
2026-06-16 20:13:13 -07:00
2026-06-16 20:13:13 -07:00
2026-06-16 22:44:16 -07:00
2026-06-16 23:21:14 -07:00
2026-06-15 12:43:08 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:06:53 -07:00
2026-06-05 02:38:38 -07:00
2026-06-14 15:29:35 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 01:08:09 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-07 22:07:47 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 19:48:40 -07:00
2026-06-12 07:13:00 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:48:40 -07:00
2026-06-03 20:52:44 -07:00
2026-05-20 14:28:45 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-06 01:32:06 -07:00
2026-06-06 07:01:48 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 19:48:40 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-07 23:30:16 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-10 09:21:48 -07:00
2026-06-10 09:21:48 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-09 12:51:20 -07:00
2026-06-09 12:51:20 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:48:40 -07:00
2026-06-03 19:06:53 -07:00
2026-05-17 08:22:26 -07:00
2026-06-13 16:30:28 -07:00
2026-06-13 16:30:28 -07:00
2026-06-03 22:35:28 -07:00
2026-06-03 22:35:28 -07:00
2026-06-03 20:52:44 -07:00
2026-06-16 15:08:24 -07:00
2026-06-16 15:08:24 -07:00
2026-06-01 05:15:14 -07:00
2026-06-03 20:56:05 -07:00
2026-06-16 17:52:51 -07:00
2026-06-09 03:39:14 -07:00
2026-06-03 20:52:44 -07:00
2026-06-12 17:57:19 -07:00
2026-06-12 17:57:19 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 19:48:40 -07:00
2026-06-13 16:30:28 -07:00
2026-06-13 09:08:43 -07:00
2026-06-10 01:10:11 -07:00
2026-06-03 17:33:16 -07:00
2026-06-07 23:30:16 -07:00
2026-06-11 22:11:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-10 00:25:10 -07:00
2026-06-03 20:52:44 -07:00
2026-06-10 00:25:10 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 01:08:09 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 20:52:44 -07:00
2026-06-02 23:47:32 -07:00
2026-06-03 20:52:44 -07:00
2026-06-16 15:08:24 -07:00
2026-06-16 15:08:24 -07:00
2026-06-12 11:39:01 -07:00
2026-06-08 14:22:03 -07:00
2026-06-09 17:56:24 -07:00
2026-06-09 08:30:35 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-09 12:51:20 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-05-29 09:44:17 -07:00
2026-06-04 23:47:24 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:06:53 -07:00
2026-06-09 23:52:37 -07:00
2026-06-03 20:52:44 -07:00
2026-05-27 21:31:12 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:48:40 -07:00
2026-06-03 19:48:40 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-05-31 21:59:06 -07:00
2026-06-03 20:52:44 -07:00
2026-06-09 07:00:05 -07:00
2026-06-09 07:00:05 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 01:08:09 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 22:35:28 -07:00
2026-06-07 18:51:46 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-07 23:30:16 -07:00
2026-06-09 03:39:14 -07:00
2026-05-28 23:31:03 -07:00
2026-06-03 20:52:44 -07:00
2026-06-10 06:02:12 -07:00
2026-06-05 22:18:34 -07:00
2026-06-16 22:44:16 -07:00
2026-06-16 23:54:29 -07:00
2026-06-09 22:13:54 -07:00
2026-06-13 16:30:28 -07:00
2026-06-09 12:51:20 -07:00
2026-06-09 12:50:26 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 20:52:44 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 20:52:44 -07:00
2026-06-13 11:03:30 -07:00
2026-06-03 20:52:44 -07:00
2026-06-14 15:29:35 -07:00
2026-06-03 20:52:44 -07:00
2026-06-15 02:29:08 -07:00
2026-06-15 02:29:08 -07:00
2026-06-08 13:32:58 -07:00
2026-06-11 19:37:25 -07:00
2026-06-13 16:30:28 -07:00
2026-06-13 16:30:28 -07:00
2026-06-03 19:06:53 -07:00
2026-06-09 18:49:02 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-03 19:48:40 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-02 19:10:50 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-05-23 13:06:48 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 19:06:53 -07:00
2026-06-16 21:37:32 -07:00
2026-06-03 19:48:40 -07:00
2026-06-03 20:52:44 -07:00
2026-06-13 19:58:14 -07:00
2026-06-14 15:29:35 -07:00
2026-06-02 07:40:37 -07:00
2026-06-07 18:51:46 -07:00
2026-06-16 23:04:45 -07:00
2026-06-16 23:04:45 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-16 22:39:06 -07:00
2026-06-15 16:51:04 +08:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-10 06:02:12 -07:00
2026-06-04 16:16:50 -07:00
2026-06-04 23:47:24 -07:00
2026-06-03 19:48:40 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 15:32:29 -07:00
2026-06-07 18:51:46 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-17 00:06:24 -07:00
2026-06-17 00:06:24 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 20:52:44 -07:00
2026-06-03 19:48:40 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-13 16:30:28 -07:00
2026-06-13 16:30:28 -07:00
2026-06-11 20:14:54 -07:00
2026-06-11 20:14:54 -07:00
2026-06-06 00:56:12 -07:00
2026-06-16 23:45:56 -07:00
2026-06-09 09:16:59 -07:00
2026-06-07 22:07:47 -07:00
2026-06-05 09:29:04 -07:00
2026-06-10 01:10:11 -07:00
2026-06-04 12:44:43 -07:00
2026-06-13 16:30:28 -07:00
2026-06-16 23:45:56 -07:00
2026-06-08 10:33:17 -07:00
2026-06-12 17:57:19 -07:00
2026-06-09 09:16:59 -07:00
2026-06-09 08:14:16 -07:00
2026-06-10 01:10:11 -07:00
2026-06-09 06:25:16 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00
2026-06-14 15:29:35 -07:00
2026-05-22 17:24:38 -07:00
2026-06-03 19:06:53 -07:00