@chrysb/alphaclaw 0.3.4 → 0.3.5-beta.1

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 (55) hide show
  1. package/bin/alphaclaw.js +82 -3
  2. package/lib/public/css/explorer.css +385 -9
  3. package/lib/public/css/theme.css +1 -1
  4. package/lib/public/js/app.js +102 -8
  5. package/lib/public/js/components/channels.js +1 -0
  6. package/lib/public/js/components/file-tree.js +74 -38
  7. package/lib/public/js/components/file-viewer/constants.js +6 -0
  8. package/lib/public/js/components/file-viewer/diff-viewer.js +46 -0
  9. package/lib/public/js/components/file-viewer/editor-surface.js +120 -0
  10. package/lib/public/js/components/file-viewer/frontmatter-panel.js +56 -0
  11. package/lib/public/js/components/file-viewer/index.js +164 -0
  12. package/lib/public/js/components/file-viewer/markdown-split-view.js +51 -0
  13. package/lib/public/js/components/file-viewer/media-preview.js +44 -0
  14. package/lib/public/js/components/file-viewer/scroll-sync.js +95 -0
  15. package/lib/public/js/components/file-viewer/sqlite-viewer.js +167 -0
  16. package/lib/public/js/components/file-viewer/status-banners.js +59 -0
  17. package/lib/public/js/components/file-viewer/storage.js +58 -0
  18. package/lib/public/js/components/file-viewer/toolbar.js +77 -0
  19. package/lib/public/js/components/file-viewer/use-editor-selection-restore.js +87 -0
  20. package/lib/public/js/components/file-viewer/use-file-diff.js +49 -0
  21. package/lib/public/js/components/file-viewer/use-file-loader.js +302 -0
  22. package/lib/public/js/components/file-viewer/use-file-viewer-draft-sync.js +32 -0
  23. package/lib/public/js/components/file-viewer/use-file-viewer-hotkeys.js +25 -0
  24. package/lib/public/js/components/file-viewer/use-file-viewer.js +379 -0
  25. package/lib/public/js/components/file-viewer/utils.js +11 -0
  26. package/lib/public/js/components/gateway.js +95 -48
  27. package/lib/public/js/components/icons.js +26 -0
  28. package/lib/public/js/components/sidebar-git-panel.js +219 -31
  29. package/lib/public/js/components/sidebar.js +1 -1
  30. package/lib/public/js/components/usage-tab.js +4 -1
  31. package/lib/public/js/components/watchdog-tab.js +6 -2
  32. package/lib/public/js/lib/api.js +31 -0
  33. package/lib/public/js/lib/browse-file-policies.js +34 -0
  34. package/lib/scripts/git +40 -0
  35. package/lib/scripts/git-askpass +6 -0
  36. package/lib/server/constants.js +8 -0
  37. package/lib/server/helpers.js +18 -5
  38. package/lib/server/internal-files-migration.js +93 -0
  39. package/lib/server/onboarding/cron.js +6 -4
  40. package/lib/server/onboarding/index.js +7 -0
  41. package/lib/server/onboarding/openclaw.js +6 -1
  42. package/lib/server/routes/browse/constants.js +51 -0
  43. package/lib/server/routes/browse/file-helpers.js +43 -0
  44. package/lib/server/routes/browse/git.js +131 -0
  45. package/lib/server/routes/browse/index.js +572 -0
  46. package/lib/server/routes/browse/path-utils.js +53 -0
  47. package/lib/server/routes/browse/sqlite.js +140 -0
  48. package/lib/server/routes/pairings.js +8 -2
  49. package/lib/server/routes/proxy.js +11 -5
  50. package/lib/server/routes/system.js +5 -1
  51. package/lib/server.js +7 -0
  52. package/lib/setup/core-prompts/TOOLS.md +0 -4
  53. package/package.json +1 -1
  54. package/lib/public/js/components/file-viewer.js +0 -864
  55. package/lib/server/routes/browse.js +0 -295
package/bin/alphaclaw.js CHANGED
@@ -10,6 +10,9 @@ const {
10
10
  validateGitSyncFilePath,
11
11
  } = require("../lib/cli/git-sync");
12
12
  const { buildSecretReplacements } = require("../lib/server/helpers");
13
+ const {
14
+ migrateManagedInternalFiles,
15
+ } = require("../lib/server/internal-files-migration");
13
16
 
14
17
  const kUsageTrackerPluginPath = path.resolve(
15
18
  __dirname,
@@ -143,6 +146,10 @@ if (portFlag) {
143
146
 
144
147
  const openclawDir = path.join(rootDir, ".openclaw");
145
148
  fs.mkdirSync(openclawDir, { recursive: true });
149
+ const { hourlyGitSyncPath } = migrateManagedInternalFiles({
150
+ fs,
151
+ openclawDir,
152
+ });
146
153
  console.log(`[alphaclaw] Root directory: ${rootDir}`);
147
154
 
148
155
  // Check for pending update marker (written by the update endpoint before restart).
@@ -542,7 +549,6 @@ if (!fs.existsSync(gogConfigFile)) {
542
549
  // 8. Install/reconcile system cron entry
543
550
  // ---------------------------------------------------------------------------
544
551
 
545
- const hourlyGitSyncPath = path.join(openclawDir, "hourly-git-sync.sh");
546
552
  const packagedHourlyGitSyncPath = path.join(setupDir, "hourly-git-sync.sh");
547
553
 
548
554
  try {
@@ -747,6 +753,25 @@ if (fs.existsSync(configPath)) {
747
753
  stdio: "ignore",
748
754
  env: gitEnv,
749
755
  });
756
+ try {
757
+ execSync("git show-ref --verify --quiet refs/heads/main", {
758
+ cwd: openclawDir,
759
+ stdio: "ignore",
760
+ });
761
+ try {
762
+ execSync("git rev-parse --abbrev-ref --symbolic-full-name main@{upstream}", {
763
+ cwd: openclawDir,
764
+ stdio: "ignore",
765
+ });
766
+ } catch {
767
+ execSync("git branch --set-upstream-to=origin/main main", {
768
+ cwd: openclawDir,
769
+ stdio: "ignore",
770
+ env: gitEnv,
771
+ });
772
+ console.log("[alphaclaw] Set main upstream to origin/main");
773
+ }
774
+ } catch {}
750
775
  const remoteConfig = String(
751
776
  execSync(`git show "origin/${branch}:openclaw.json"`, {
752
777
  cwd: openclawDir,
@@ -822,7 +847,16 @@ if (fs.existsSync(configPath)) {
822
847
  const replacements = buildSecretReplacements(process.env);
823
848
  for (const [secret, envRef] of replacements) {
824
849
  if (secret) {
825
- content = content.split(secret).join(envRef);
850
+ // Only replace the secret if it is an exact match for a JSON string value
851
+ // This ensures we do not replace substrings inside other strings
852
+ const secretJson = JSON.stringify(secret);
853
+ content = content.replace(
854
+ new RegExp(
855
+ secretJson.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"),
856
+ "g",
857
+ ),
858
+ JSON.stringify(envRef),
859
+ );
826
860
  }
827
861
  }
828
862
  fs.writeFileSync(configPath, content);
@@ -856,7 +890,52 @@ try {
856
890
  }
857
891
 
858
892
  // ---------------------------------------------------------------------------
859
- // 13. Start Express server
893
+ // 13. Install git auth shim
894
+ // ---------------------------------------------------------------------------
895
+
896
+ try {
897
+ const gitAskPassSrc = path.join(__dirname, "..", "lib", "scripts", "git-askpass");
898
+ const gitAskPassDest = "/tmp/alphaclaw-git-askpass.sh";
899
+ const gitShimTemplatePath = path.join(__dirname, "..", "lib", "scripts", "git");
900
+ const gitShimDest = "/usr/local/bin/git";
901
+
902
+ if (fs.existsSync(gitAskPassSrc)) {
903
+ fs.copyFileSync(gitAskPassSrc, gitAskPassDest);
904
+ fs.chmodSync(gitAskPassDest, 0o755);
905
+ }
906
+
907
+ if (fs.existsSync(gitShimTemplatePath)) {
908
+ let realGitPath = "/usr/bin/git";
909
+ try {
910
+ const gitCandidates = String(
911
+ execSync("which -a git", {
912
+ stdio: ["ignore", "pipe", "ignore"],
913
+ encoding: "utf8",
914
+ }),
915
+ )
916
+ .split("\n")
917
+ .map((candidate) => candidate.trim())
918
+ .filter(Boolean);
919
+ const normalizedShimDest = path.resolve(gitShimDest);
920
+ const selectedCandidate = gitCandidates.find(
921
+ (candidatePath) => path.resolve(candidatePath) !== normalizedShimDest,
922
+ );
923
+ if (selectedCandidate) realGitPath = selectedCandidate;
924
+ } catch {}
925
+
926
+ const gitShimTemplate = fs.readFileSync(gitShimTemplatePath, "utf8");
927
+ const gitShimContent = gitShimTemplate
928
+ .replace("@@REAL_GIT@@", realGitPath)
929
+ .replace("@@OPENCLAW_REPO_ROOT@@", openclawDir);
930
+ fs.writeFileSync(gitShimDest, gitShimContent, { mode: 0o755 });
931
+ console.log("[alphaclaw] git auth shim installed");
932
+ }
933
+ } catch (e) {
934
+ console.log(`[alphaclaw] git auth shim skipped: ${e.message}`);
935
+ }
936
+
937
+ // ---------------------------------------------------------------------------
938
+ // 14. Start Express server
860
939
  // ---------------------------------------------------------------------------
861
940
 
862
941
  console.log("[alphaclaw] Setup complete -- starting server");
@@ -105,6 +105,11 @@
105
105
  padding: 6px 0 8px;
106
106
  }
107
107
 
108
+ .file-tree-wrap-loading {
109
+ min-height: 100%;
110
+ display: flex;
111
+ }
112
+
108
113
  .file-tree-search {
109
114
  padding: 0 8px 6px;
110
115
  }
@@ -254,6 +259,10 @@
254
259
  color: #ff7ac6;
255
260
  }
256
261
 
262
+ .file-icon-audio {
263
+ color: #f5a6ff;
264
+ }
265
+
257
266
  .file-icon-shell {
258
267
  color: #71f8a7;
259
268
  }
@@ -281,6 +290,14 @@
281
290
  box-shadow: 0 0 6px rgba(45, 226, 255, 0.75);
282
291
  }
283
292
 
293
+ .tree-lock-icon {
294
+ flex: 0 0 auto;
295
+ margin-left: auto;
296
+ width: 11px;
297
+ height: 11px;
298
+ color: var(--text-dim);
299
+ }
300
+
284
301
  .tree-children {
285
302
  list-style: none;
286
303
  }
@@ -295,6 +312,15 @@
295
312
  color: var(--text-muted);
296
313
  }
297
314
 
315
+ .file-tree-state-loading {
316
+ width: 100%;
317
+ flex: 1 1 auto;
318
+ min-height: 100%;
319
+ display: flex;
320
+ align-items: center;
321
+ justify-content: center;
322
+ }
323
+
298
324
  .file-tree-state-error {
299
325
  color: #f87171;
300
326
  }
@@ -331,6 +357,21 @@
331
357
  background: rgba(234, 179, 8, 0.08);
332
358
  }
333
359
 
360
+ .file-viewer-protected-banner.is-locked {
361
+ background: rgba(220, 38, 38, 0.16);
362
+ }
363
+
364
+ .file-viewer-protected-banner-icon {
365
+ width: 14px;
366
+ height: 14px;
367
+ color: #fca5a5;
368
+ flex-shrink: 0;
369
+ }
370
+
371
+ .file-viewer-protected-banner.is-locked .file-viewer-protected-banner-text {
372
+ color: #fecaca;
373
+ }
374
+
334
375
  .file-viewer-protected-banner-text {
335
376
  font-size: 12px;
336
377
  color: #f7cc5e;
@@ -344,6 +385,15 @@
344
385
  letter-spacing: 0.01em;
345
386
  }
346
387
 
388
+ .file-viewer-diff-banner {
389
+ background: rgba(59, 130, 246, 0.12);
390
+ }
391
+
392
+ .file-viewer-diff-banner .file-viewer-protected-banner-text,
393
+ .file-viewer-diff-banner {
394
+ color: #bfdbfe;
395
+ }
396
+
347
397
  .file-viewer-tabbar-spacer {
348
398
  flex: 1;
349
399
  }
@@ -559,6 +609,48 @@
559
609
  align-items: stretch;
560
610
  }
561
611
 
612
+ .file-viewer-diff-shell {
613
+ width: 100%;
614
+ min-height: 0;
615
+ height: 100%;
616
+ overflow: auto;
617
+ padding: 8px 0;
618
+ }
619
+
620
+ .file-viewer-diff-pre {
621
+ margin: 0;
622
+ padding: 0 12px 12px;
623
+ font-family: inherit;
624
+ font-size: 12px;
625
+ line-height: 1.45;
626
+ color: var(--text-muted);
627
+ }
628
+
629
+ .file-viewer-diff-line {
630
+ white-space: pre-wrap;
631
+ word-break: break-word;
632
+ padding: 1px 8px;
633
+ border-radius: 4px;
634
+ }
635
+
636
+ .file-viewer-diff-line.is-added {
637
+ color: #86efac;
638
+ background: rgba(34, 197, 94, 0.1);
639
+ }
640
+
641
+ .file-viewer-diff-line.is-removed {
642
+ color: #fca5a5;
643
+ background: rgba(239, 68, 68, 0.1);
644
+ }
645
+
646
+ .file-viewer-diff-line.is-hunk {
647
+ color: #93c5fd;
648
+ }
649
+
650
+ .file-viewer-diff-line.is-header {
651
+ color: var(--text-dim);
652
+ }
653
+
562
654
  .file-viewer-editor-line-num-col {
563
655
  width: 56px;
564
656
  flex-shrink: 0;
@@ -841,6 +933,187 @@
841
933
  color: var(--text-muted);
842
934
  }
843
935
 
936
+ .file-viewer-image-shell {
937
+ flex: 1 1 auto;
938
+ min-height: 0;
939
+ height: 100%;
940
+ display: flex;
941
+ align-items: center;
942
+ justify-content: center;
943
+ padding: 18px;
944
+ overflow: auto;
945
+ }
946
+
947
+ .file-viewer-image {
948
+ max-width: 100%;
949
+ max-height: 100%;
950
+ width: auto;
951
+ height: auto;
952
+ border-radius: 8px;
953
+ border: 1px solid var(--border);
954
+ background: rgba(255, 255, 255, 0.02);
955
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.35);
956
+ }
957
+
958
+ .file-viewer-audio-shell {
959
+ flex: 1 1 auto;
960
+ min-height: 0;
961
+ height: 100%;
962
+ display: flex;
963
+ align-items: center;
964
+ justify-content: center;
965
+ padding: 18px;
966
+ overflow: auto;
967
+ }
968
+
969
+ .file-viewer-audio-player {
970
+ width: min(640px, 100%);
971
+ }
972
+
973
+ .file-viewer-sqlite-shell {
974
+ flex: 1 1 auto;
975
+ min-height: 0;
976
+ height: 100%;
977
+ overflow: auto;
978
+ padding: 14px 16px 22px;
979
+ }
980
+
981
+ .file-viewer-sqlite-header {
982
+ font-size: 12px;
983
+ color: var(--text-dim);
984
+ margin-bottom: 10px;
985
+ }
986
+
987
+ .file-viewer-sqlite-footer {
988
+ margin-top: 10px;
989
+ text-align: center;
990
+ font-size: 12px;
991
+ color: var(--text-dim);
992
+ }
993
+
994
+ .file-viewer-sqlite-list {
995
+ flex: 0 0 240px;
996
+ display: flex;
997
+ flex-direction: column;
998
+ gap: 8px;
999
+ }
1000
+
1001
+ .file-viewer-sqlite-layout {
1002
+ display: flex;
1003
+ gap: 12px;
1004
+ align-items: stretch;
1005
+ min-height: 0;
1006
+ }
1007
+
1008
+ .file-viewer-sqlite-card {
1009
+ width: 100%;
1010
+ text-align: left;
1011
+ cursor: pointer;
1012
+ display: flex;
1013
+ align-items: center;
1014
+ border: 1px solid var(--border);
1015
+ border-radius: 8px;
1016
+ padding: 7px 10px;
1017
+ background: rgba(255, 255, 255, 0.02);
1018
+ font: inherit;
1019
+ }
1020
+
1021
+ .file-viewer-sqlite-card:hover {
1022
+ background: rgba(255, 255, 255, 0.04);
1023
+ }
1024
+
1025
+ .file-viewer-sqlite-card.is-active {
1026
+ border-color: rgba(99, 235, 255, 0.45);
1027
+ background: rgba(99, 235, 255, 0.08);
1028
+ }
1029
+
1030
+ .file-viewer-sqlite-title {
1031
+ width: 100%;
1032
+ display: flex;
1033
+ align-items: center;
1034
+ justify-content: space-between;
1035
+ gap: 10px;
1036
+ font-size: 12px;
1037
+ color: var(--text);
1038
+ margin-bottom: 0;
1039
+ }
1040
+
1041
+ .file-viewer-sqlite-type {
1042
+ font-size: 10px;
1043
+ letter-spacing: 0.06em;
1044
+ text-transform: uppercase;
1045
+ color: var(--text-dim);
1046
+ }
1047
+
1048
+ .file-viewer-sqlite-table-shell {
1049
+ flex: 1;
1050
+ min-width: 0;
1051
+ border: 1px solid var(--border);
1052
+ border-radius: 8px;
1053
+ padding: 10px;
1054
+ background: rgba(255, 255, 255, 0.015);
1055
+ display: flex;
1056
+ flex-direction: column;
1057
+ min-height: 0;
1058
+ }
1059
+
1060
+ .file-viewer-sqlite-table-header {
1061
+ display: flex;
1062
+ align-items: center;
1063
+ justify-content: space-between;
1064
+ gap: 10px;
1065
+ }
1066
+
1067
+ .file-viewer-sqlite-table-name {
1068
+ font-size: 12px;
1069
+ color: var(--text);
1070
+ font-weight: 600;
1071
+ }
1072
+
1073
+ .file-viewer-sqlite-table-nav {
1074
+ display: inline-flex;
1075
+ gap: 6px;
1076
+ }
1077
+
1078
+ .file-viewer-sqlite-table-meta {
1079
+ margin-top: 4px;
1080
+ margin-bottom: 8px;
1081
+ font-size: 11px;
1082
+ color: var(--text-dim);
1083
+ }
1084
+
1085
+ .file-viewer-sqlite-table-wrap {
1086
+ min-height: 0;
1087
+ overflow: auto;
1088
+ }
1089
+
1090
+ .file-viewer-sqlite-table {
1091
+ width: 100%;
1092
+ border-collapse: collapse;
1093
+ table-layout: fixed;
1094
+ }
1095
+
1096
+ .file-viewer-sqlite-table th,
1097
+ .file-viewer-sqlite-table td {
1098
+ border: 1px solid var(--border);
1099
+ padding: 6px 8px;
1100
+ font-size: 11px;
1101
+ color: var(--text-muted);
1102
+ text-align: left;
1103
+ white-space: nowrap;
1104
+ overflow: hidden;
1105
+ text-overflow: ellipsis;
1106
+ }
1107
+
1108
+ .file-viewer-sqlite-table th {
1109
+ color: var(--text);
1110
+ background: rgba(255, 255, 255, 0.04);
1111
+ }
1112
+
1113
+ .file-viewer-sqlite-table-empty {
1114
+ color: var(--text-dim);
1115
+ }
1116
+
844
1117
  .file-viewer-state-error {
845
1118
  color: #f87171;
846
1119
  }
@@ -957,35 +1230,138 @@
957
1230
  text-overflow: ellipsis;
958
1231
  }
959
1232
 
960
- .sidebar-git-dirty {
961
- font-size: 10px;
962
- text-transform: uppercase;
963
- letter-spacing: 0.06em;
1233
+ .sidebar-git-sync-status {
1234
+ font-size: 12px;
1235
+ font-weight: 600;
1236
+ line-height: 1;
964
1237
  }
965
1238
 
966
- .sidebar-git-dirty.is-clean {
1239
+ .sidebar-git-sync-status.is-up-to-date {
967
1240
  color: #71f8a7;
968
1241
  }
969
1242
 
970
- .sidebar-git-dirty.is-dirty {
1243
+ .sidebar-git-sync-status.is-ahead,
1244
+ .sidebar-git-sync-status.is-diverged {
971
1245
  color: #f3a86a;
972
1246
  }
973
1247
 
1248
+ .sidebar-git-sync-status.is-behind {
1249
+ color: #93c5fd;
1250
+ }
1251
+
1252
+ .sidebar-git-sync-status.is-no-upstream,
1253
+ .sidebar-git-sync-status.is-upstream-gone {
1254
+ color: var(--text-dim);
1255
+ }
1256
+
974
1257
  .sidebar-git-meta {
975
1258
  color: var(--text-muted);
976
1259
  }
977
1260
 
978
- .sidebar-git-list {
1261
+ .sidebar-git-changes-label {
1262
+ padding: 7px 10px 4px;
1263
+ font-size: 10px;
1264
+ letter-spacing: 0.06em;
1265
+ text-transform: uppercase;
1266
+ color: var(--text-dim);
1267
+ }
1268
+
1269
+ .sidebar-git-changes-list {
979
1270
  list-style: none;
980
1271
  display: flex;
981
1272
  flex-direction: column;
982
- gap: 3px;
983
- padding: 6px 10px 0;
1273
+ gap: 2px;
1274
+ padding: 0 6px;
1275
+ }
1276
+
1277
+ .sidebar-git-change-row {
1278
+ display: flex;
1279
+ align-items: center;
1280
+ justify-content: space-between;
1281
+ gap: 8px;
1282
+ min-height: 22px;
1283
+ padding: 2px 6px;
1284
+ border-radius: 6px;
1285
+ line-height: 1.25;
1286
+ }
1287
+
1288
+ .sidebar-git-change-row.is-clickable {
1289
+ cursor: pointer;
1290
+ }
1291
+
1292
+ .sidebar-git-change-row.is-clickable:hover {
1293
+ background: rgba(255, 255, 255, 0.04);
1294
+ }
1295
+
1296
+ .sidebar-git-change-path {
1297
+ min-width: 0;
1298
+ white-space: nowrap;
1299
+ overflow: hidden;
1300
+ text-overflow: ellipsis;
1301
+ color: var(--text-muted);
1302
+ font-weight: 400;
1303
+ }
1304
+
1305
+ .sidebar-git-change-meta {
1306
+ display: inline-flex;
1307
+ align-items: center;
1308
+ gap: 6px;
1309
+ flex-shrink: 0;
1310
+ font-size: 10px;
1311
+ }
1312
+
1313
+ .sidebar-git-change-plus {
1314
+ color: #71f8a7;
1315
+ }
1316
+
1317
+ .sidebar-git-change-minus {
1318
+ color: #f3a86a;
1319
+ }
1320
+
1321
+ .sidebar-git-change-status {
1322
+ font-size: 10px;
1323
+ letter-spacing: 0.06em;
1324
+ }
1325
+
1326
+ .sidebar-git-change-row.is-untracked .sidebar-git-change-status {
1327
+ color: #71f8a7;
1328
+ }
1329
+
1330
+ .sidebar-git-change-row.is-modified .sidebar-git-change-status {
1331
+ color: #63ebff;
1332
+ }
1333
+
1334
+ .sidebar-git-change-row.is-deleted .sidebar-git-change-status {
1335
+ color: #f87171;
1336
+ }
1337
+
1338
+ .sidebar-git-change-row.is-deleted .sidebar-git-change-path {
1339
+ text-decoration: line-through;
1340
+ text-decoration-thickness: 1px;
1341
+ }
1342
+
1343
+ .sidebar-git-scroll {
984
1344
  overflow-y: auto;
985
1345
  min-height: 0;
986
1346
  flex: 1 1 auto;
987
1347
  }
988
1348
 
1349
+ .sidebar-git-actions {
1350
+ padding: 8px 10px 6px;
1351
+ }
1352
+
1353
+ .sidebar-git-sync-button {
1354
+ width: 100%;
1355
+ }
1356
+
1357
+ .sidebar-git-list {
1358
+ list-style: none;
1359
+ display: flex;
1360
+ flex-direction: column;
1361
+ gap: 3px;
1362
+ padding: 6px 10px 0;
1363
+ }
1364
+
989
1365
  .sidebar-git-list li {
990
1366
  display: flex;
991
1367
  align-items: baseline;
@@ -8,7 +8,7 @@
8
8
  --border-strong: rgba(255, 255, 255, 0.11);
9
9
  --text: #c9d1d9;
10
10
  --text-muted: #6e7681;
11
- --text-dim: #383d47;
11
+ --text-dim: #424854;
12
12
  --accent: #63ebff;
13
13
  --accent-dim: rgba(99, 235, 255, 0.4);
14
14
  --accent-link: rgba(99, 235, 255, 0.6);