pilotswarm 0.5.32 → 0.5.34
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.
- package/package.json +2 -2
- package/tui/src/app.js +10 -0
- package/tui/src/node-sdk-transport.js +11 -0
- package/ui/core/src/controller.js +381 -12
- package/ui/core/src/reducer.js +125 -28
- package/ui/core/src/selectors.js +158 -268
- package/ui/core/src/state.js +6 -1
- package/ui/core/src/themes/catppuccin-mocha.js +2 -1
- package/ui/core/src/themes/cobalt2.js +2 -1
- package/ui/core/src/themes/doom.js +2 -1
- package/ui/core/src/themes/dracula.js +2 -1
- package/ui/core/src/themes/github-dark.js +2 -1
- package/ui/core/src/themes/github-light.js +2 -1
- package/ui/core/src/themes/gruvbox-dark.js +2 -1
- package/ui/core/src/themes/hacker-x-matrix.js +2 -1
- package/ui/core/src/themes/hacker-x-orion-prime.js +2 -1
- package/ui/core/src/themes/helpers.js +22 -4
- package/ui/core/src/themes/high-contrast-mono.js +2 -1
- package/ui/core/src/themes/index.js +24 -5
- package/ui/core/src/themes/ms-dos.js +2 -1
- package/ui/core/src/themes/noctis-obscuro.js +2 -1
- package/ui/core/src/themes/noctis.js +2 -1
- package/ui/core/src/themes/rust.js +125 -0
- package/ui/core/src/themes/spongebob.js +110 -0
- package/ui/core/src/themes/terminal-green.js +2 -1
- package/ui/core/src/themes/win95.js +2 -1
- package/ui/core/src/themes/winamp.js +2 -1
- package/ui/core/src/themes/workspace-dark.js +2 -1
- package/ui/react/src/web-app.js +240 -266
- package/web/dist/assets/{abnfDiagram-VRR7QNED-mXFQ4a3c.js → abnfDiagram-VRR7QNED-BFOimVWK.js} +1 -1
- package/web/dist/assets/{arc-BPuuvbge.js → arc-uUHjvwEo.js} +1 -1
- package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-Dt4uUYIe.js → architectureDiagram-ZJ3FMSHR-CxeX_vea.js} +1 -1
- package/web/dist/assets/{blockDiagram-677ZJIJ3-Ax8Q22vV.js → blockDiagram-677ZJIJ3-Cno8kltG.js} +1 -1
- package/web/dist/assets/{c4Diagram-LMCZKHZV-CPiukyHt.js → c4Diagram-LMCZKHZV-viONVybf.js} +1 -1
- package/web/dist/assets/channel-IURmSsjn.js +1 -0
- package/web/dist/assets/{chunk-2Q5K7J3B-VJLqCZJX.js → chunk-2Q5K7J3B-CKfICIGD.js} +1 -1
- package/web/dist/assets/{chunk-32BRIVSS-DqOshxhf.js → chunk-32BRIVSS-CxmwEY56.js} +1 -1
- package/web/dist/assets/{chunk-5VM5RSS4-KPqV21jV.js → chunk-5VM5RSS4-_eVYLGll.js} +1 -1
- package/web/dist/assets/{chunk-EX3LRPZG-DfhiCVl_.js → chunk-EX3LRPZG-C4aqbjrf.js} +1 -1
- package/web/dist/assets/{chunk-JWPE2WC7-H6khJPuW.js → chunk-JWPE2WC7-Bh8ZxrI8.js} +1 -1
- package/web/dist/assets/{chunk-MOJQB5TN-BKMAzQxj.js → chunk-MOJQB5TN-BXgLlWVP.js} +1 -1
- package/web/dist/assets/{chunk-RYQCIY6F-DNXRTxtj.js → chunk-RYQCIY6F-B1rMIdfF.js} +1 -1
- package/web/dist/assets/{chunk-V7JOEXUC-B56PM6Gv.js → chunk-V7JOEXUC-C3AnSHXk.js} +1 -1
- package/web/dist/assets/{chunk-VR4S4FIN-Boi3hGkB.js → chunk-VR4S4FIN-CeoMJIBs.js} +1 -1
- package/web/dist/assets/{chunk-XXDRQBXY-DmJyn890.js → chunk-XXDRQBXY-DzaxQ9iP.js} +1 -1
- package/web/dist/assets/classDiagram-OUVF2IWQ-FsfpM3iu.js +1 -0
- package/web/dist/assets/classDiagram-v2-EOCWNBFH-FsfpM3iu.js +1 -0
- package/web/dist/assets/{cose-bilkent-JH36ORCC-BRdFlFWt.js → cose-bilkent-JH36ORCC-G46fvUOx.js} +1 -1
- package/web/dist/assets/{cynefin-VYW2F7L2-DqE-xib2.js → cynefin-VYW2F7L2-DXwqVhWA.js} +1 -1
- package/web/dist/assets/{cynefinDiagram-TSTJHNR4-D-QBZjIL.js → cynefinDiagram-TSTJHNR4-DNNFmaXb.js} +1 -1
- package/web/dist/assets/{dagre-VKFMJZFB-DYu9oQV6.js → dagre-VKFMJZFB-BCfh-h3o.js} +1 -1
- package/web/dist/assets/{diagram-FQU43EPY-DOwYccCg.js → diagram-FQU43EPY-CyG9b6bj.js} +1 -1
- package/web/dist/assets/{diagram-G47NLZAW-DTSEmrPr.js → diagram-G47NLZAW-DdxDahK3.js} +1 -1
- package/web/dist/assets/{diagram-NH7WQ7WH-OqbzzquA.js → diagram-NH7WQ7WH-CjrZ_eja.js} +1 -1
- package/web/dist/assets/{diagram-OA4YK3LP-BMVG6A8I.js → diagram-OA4YK3LP-5NAjQpk2.js} +1 -1
- package/web/dist/assets/{diagram-WEI45ONY-Rn2Q5xaz.js → diagram-WEI45ONY-fLuDb54-.js} +1 -1
- package/web/dist/assets/{ebnfDiagram-CCIWWBDH-aL32_v5y.js → ebnfDiagram-CCIWWBDH-DL9qnZpa.js} +1 -1
- package/web/dist/assets/{erDiagram-Q63AITRT-DKCpyczx.js → erDiagram-Q63AITRT-C_ynfrWY.js} +1 -1
- package/web/dist/assets/{flowDiagram-23GEKE2U-CrZTPgR_.js → flowDiagram-23GEKE2U-dYuH8HYv.js} +1 -1
- package/web/dist/assets/{ganttDiagram-NO4QXBWP-DnSE1OtC.js → ganttDiagram-NO4QXBWP-e8Meh3f3.js} +1 -1
- package/web/dist/assets/{gitGraphDiagram-IHSO6WYX-C5SeYPUR.js → gitGraphDiagram-IHSO6WYX-D_tZ4VL9.js} +1 -1
- package/web/dist/assets/index-Ct7SQv1M.css +1 -0
- package/web/dist/assets/{index-B-TEKrRB.js → index-DcQes9h8.js} +6 -6
- package/web/dist/assets/{infoDiagram-FWYZ7A6U-DDnJZp0X.js → infoDiagram-FWYZ7A6U-Dffhqp73.js} +1 -1
- package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-ewhzfFkq.js → ishikawaDiagram-FXEZZL3T-DYt9H7kU.js} +1 -1
- package/web/dist/assets/{journeyDiagram-5HDEW3XC-T0iWWkLM.js → journeyDiagram-5HDEW3XC-Qv1vVu0F.js} +1 -1
- package/web/dist/assets/{kanban-definition-HUTT4EX6-D1MFQZjb.js → kanban-definition-HUTT4EX6-CTAUo40G.js} +1 -1
- package/web/dist/assets/{linear-BKfPK9wE.js → linear-CqLsWFLj.js} +1 -1
- package/web/dist/assets/{mermaid.core-CyzD7dTc.js → mermaid.core-okRCGPQQ.js} +4 -4
- package/web/dist/assets/{mindmap-definition-LN4V7U3C-CWXtcTlP.js → mindmap-definition-LN4V7U3C-DVOOrIwD.js} +1 -1
- package/web/dist/assets/{papaparse.min-DLUoV5k5.js → papaparse.min-Ddflu8oC.js} +1 -1
- package/web/dist/assets/{pegDiagram-2B236MQR-BFjZun-r.js → pegDiagram-2B236MQR-BLJlC0MZ.js} +1 -1
- package/web/dist/assets/{pieDiagram-ENE6RG2P-DMDtW4g7.js → pieDiagram-ENE6RG2P-DdOwICOg.js} +1 -1
- package/web/dist/assets/pilotswarm-CKh2MxfL.js +99 -0
- package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-CAwPVaYL.js → quadrantDiagram-ABIIQ3AL-B0Th1YO5.js} +1 -1
- package/web/dist/assets/{railroadDiagram-RFXS5EU6-Co102PkQ.js → railroadDiagram-RFXS5EU6-BF2XKMKf.js} +1 -1
- package/web/dist/assets/{requirementDiagram-TGXJPOKE-D19VlRSl.js → requirementDiagram-TGXJPOKE-Mr1iSwbS.js} +1 -1
- package/web/dist/assets/{sankeyDiagram-HTMAVEWB-Sd_a3ukL.js → sankeyDiagram-HTMAVEWB-CrOjVZyg.js} +1 -1
- package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-CojDRK1c.js → sequenceDiagram-DBY2YBRQ-H0X4Lydk.js} +1 -1
- package/web/dist/assets/{sizeCapture-X5ZJPWSS-XqXcxnDo.js → sizeCapture-X5ZJPWSS-Dus1QEqh.js} +1 -1
- package/web/dist/assets/{stateDiagram-2N3HPSRC-BcN_w699.js → stateDiagram-2N3HPSRC-BOBUSwdR.js} +1 -1
- package/web/dist/assets/stateDiagram-v2-6OUMAXLB-DABTDwFh.js +1 -0
- package/web/dist/assets/{swimlanes-5IMT3BWC-BcO6ai_I.js → swimlanes-5IMT3BWC-BoqT-Lh7.js} +2 -2
- package/web/dist/assets/swimlanesDiagram-G3AALYLV-BF5mFN4t.js +8 -0
- package/web/dist/assets/{timeline-definition-FHXFAJF6-DOPfYxUq.js → timeline-definition-FHXFAJF6-BOrqUQHX.js} +1 -1
- package/web/dist/assets/{vennDiagram-L72KCM5P-BSKLkEOC.js → vennDiagram-L72KCM5P-DDkNL-Oo.js} +1 -1
- package/web/dist/assets/{wardleyDiagram-EHGQE667-BdcYAVw2.js → wardleyDiagram-EHGQE667-XUAJQ2X0.js} +1 -1
- package/web/dist/assets/{xychartDiagram-FW5EYKEG-C6EJT4jB.js → xychartDiagram-FW5EYKEG-ph69PV9y.js} +1 -1
- package/web/dist/index.html +3 -3
- package/ui/core/src/themes/dark-high-contrast.js +0 -56
- package/ui/core/src/themes/workspace-dark-rich.js +0 -65
- package/web/dist/assets/channel-BCzDctYg.js +0 -1
- package/web/dist/assets/classDiagram-OUVF2IWQ-ChqjVZil.js +0 -1
- package/web/dist/assets/classDiagram-v2-EOCWNBFH-ChqjVZil.js +0 -1
- package/web/dist/assets/index-D2B5bzSN.css +0 -1
- package/web/dist/assets/pilotswarm-DA0u7Cq_.js +0 -99
- package/web/dist/assets/stateDiagram-v2-6OUMAXLB-BV_w1D3C.js +0 -1
- package/web/dist/assets/swimlanesDiagram-G3AALYLV-BnYdP0qP.js +0 -8
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { createTheme } from "./helpers.js";
|
|
1
|
+
import { createTheme, THEME_GROUP_VSCODE } from "./helpers.js";
|
|
2
2
|
|
|
3
3
|
const hackerXMatrixTheme = createTheme({
|
|
4
4
|
id: "hacker-x-matrix",
|
|
5
5
|
label: "Hacker X - Matrix",
|
|
6
6
|
description: "Black-and-phosphor terminal palette with vivid green glow and CRT-style contrast.",
|
|
7
|
+
group: THEME_GROUP_VSCODE,
|
|
7
8
|
page: {
|
|
8
9
|
background: "#030603",
|
|
9
10
|
foreground: "#c8ffc8",
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { createTheme } from "./helpers.js";
|
|
1
|
+
import { createTheme, THEME_GROUP_VSCODE } from "./helpers.js";
|
|
2
2
|
|
|
3
3
|
const hackerXOrionPrimeTheme = createTheme({
|
|
4
4
|
id: "hacker-x-orion-prime",
|
|
5
5
|
label: "Hacker X - Orion Prime",
|
|
6
6
|
description: "Deep-space navy palette with electric cyan, violet, and amber accents.",
|
|
7
|
+
group: THEME_GROUP_VSCODE,
|
|
7
8
|
page: {
|
|
8
9
|
background: "#0a0f1e",
|
|
9
10
|
foreground: "#e8f2ff",
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
// Picker groups. These sort by PROVENANCE, not by look: "VS Code" is a port of
|
|
2
|
+
// a theme people already know from their editor, "Retro" is an homage to a
|
|
3
|
+
// specific machine or piece of software, and everything PilotSwarm made for
|
|
4
|
+
// itself falls to "Others". Sorting by look instead would put Terminal Green
|
|
5
|
+
// and Hacker X - Matrix together and then have nowhere to put GitHub Light.
|
|
6
|
+
export const THEME_GROUP_VSCODE = "VS Code";
|
|
7
|
+
export const THEME_GROUP_RETRO = "Retro";
|
|
8
|
+
export const THEME_GROUP_OTHER = "Others";
|
|
9
|
+
|
|
10
|
+
// Display order for the picker. Not alphabetical: "Others" is the leftover
|
|
11
|
+
// bucket and reads wrong anywhere but last.
|
|
12
|
+
export const THEME_GROUP_ORDER = Object.freeze([
|
|
13
|
+
THEME_GROUP_VSCODE,
|
|
14
|
+
THEME_GROUP_RETRO,
|
|
15
|
+
THEME_GROUP_OTHER,
|
|
16
|
+
]);
|
|
17
|
+
|
|
1
18
|
function freezeTheme(theme) {
|
|
2
19
|
return Object.freeze({
|
|
3
20
|
...theme,
|
|
@@ -41,7 +58,7 @@ export function isThemeLight(theme) {
|
|
|
41
58
|
return getRelativeLuminance(background) >= 0.5;
|
|
42
59
|
}
|
|
43
60
|
|
|
44
|
-
export function createTheme({ id, label, description, page, terminal, tui = {},
|
|
61
|
+
export function createTheme({ id, label, description, group = THEME_GROUP_OTHER, page, terminal, tui = {}, icon = null }) {
|
|
45
62
|
const baseTui = {
|
|
46
63
|
background: page?.background || terminal?.background || "#000000",
|
|
47
64
|
surface: terminal?.background || page?.background || "#000000",
|
|
@@ -73,9 +90,10 @@ export function createTheme({ id, label, description, page, terminal, tui = {},
|
|
|
73
90
|
id,
|
|
74
91
|
label,
|
|
75
92
|
description,
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
|
|
93
|
+
// Which section of the picker this theme lands in. Defaulting to
|
|
94
|
+
// "Others" rather than throwing means a theme added without a group
|
|
95
|
+
// still shows up — it just shows up in the leftover bucket.
|
|
96
|
+
group,
|
|
79
97
|
// Portal-only: an optional brand mark carried BY the theme. When set it
|
|
80
98
|
// outranks the deployment's own logo, because a theme that restyles the
|
|
81
99
|
// whole shell and then leaves a foreign logo in the corner reads as
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { createTheme } from "./helpers.js";
|
|
1
|
+
import { createTheme, THEME_GROUP_OTHER } from "./helpers.js";
|
|
2
2
|
|
|
3
3
|
const highContrastMonoTheme = createTheme({
|
|
4
4
|
id: "high-contrast-mono",
|
|
5
5
|
label: "High Contrast Mono",
|
|
6
6
|
description: "Accessibility-first monochrome theme with cobalt selection and severity colors only where they matter.",
|
|
7
|
+
group: THEME_GROUP_OTHER,
|
|
7
8
|
page: {
|
|
8
9
|
background: "#000000",
|
|
9
10
|
foreground: "#f8f8f2",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { THEME_GROUP_ORDER } from "./helpers.js";
|
|
1
2
|
import githubDarkTheme from "./github-dark.js";
|
|
2
3
|
import githubLightTheme from "./github-light.js";
|
|
3
4
|
import workspaceDarkTheme from "./workspace-dark.js";
|
|
4
|
-
import workspaceDarkRichTheme from "./workspace-dark-rich.js";
|
|
5
5
|
import cobalt2Theme from "./cobalt2.js";
|
|
6
6
|
import draculaTheme from "./dracula.js";
|
|
7
7
|
import catppuccinMochaTheme from "./catppuccin-mocha.js";
|
|
@@ -10,17 +10,33 @@ import hackerXOrionPrimeTheme from "./hacker-x-orion-prime.js";
|
|
|
10
10
|
import gruvboxDarkTheme from "./gruvbox-dark.js";
|
|
11
11
|
import noctisTheme from "./noctis.js";
|
|
12
12
|
import noctisObscuroTheme from "./noctis-obscuro.js";
|
|
13
|
-
import darkHighContrastTheme from "./dark-high-contrast.js";
|
|
14
13
|
import terminalGreenTheme from "./terminal-green.js";
|
|
15
14
|
import highContrastMonoTheme from "./high-contrast-mono.js";
|
|
16
15
|
import win95Theme from "./win95.js";
|
|
17
16
|
import msDosTheme from "./ms-dos.js";
|
|
18
17
|
import doomTheme from "./doom.js";
|
|
19
18
|
import winampTheme from "./winamp.js";
|
|
19
|
+
import rustTheme from "./rust.js";
|
|
20
|
+
import spongebobTheme from "./spongebob.js";
|
|
21
|
+
|
|
22
|
+
// Themes are ordered by GROUP first, then alphabetically inside it — the
|
|
23
|
+
// picker renders a heading whenever the group changes, so this sort IS the
|
|
24
|
+
// picker's structure. Sorting alphabetically across the whole list (which is
|
|
25
|
+
// what this did before groups existed) would interleave the sections and the
|
|
26
|
+
// headings would repeat.
|
|
27
|
+
function byGroupThenLabel(left, right) {
|
|
28
|
+
const leftGroup = THEME_GROUP_ORDER.indexOf(left.group);
|
|
29
|
+
const rightGroup = THEME_GROUP_ORDER.indexOf(right.group);
|
|
30
|
+
// An unknown group sorts last rather than first: indexOf gives -1, which
|
|
31
|
+
// would otherwise float a mis-tagged theme above every real section.
|
|
32
|
+
const leftRank = leftGroup === -1 ? Number.MAX_SAFE_INTEGER : leftGroup;
|
|
33
|
+
const rightRank = rightGroup === -1 ? Number.MAX_SAFE_INTEGER : rightGroup;
|
|
34
|
+
if (leftRank !== rightRank) return leftRank - rightRank;
|
|
35
|
+
return left.label.localeCompare(right.label, undefined, { sensitivity: "base" });
|
|
36
|
+
}
|
|
20
37
|
|
|
21
38
|
const THEMES = Object.freeze([
|
|
22
39
|
workspaceDarkTheme,
|
|
23
|
-
workspaceDarkRichTheme,
|
|
24
40
|
draculaTheme,
|
|
25
41
|
githubDarkTheme,
|
|
26
42
|
githubLightTheme,
|
|
@@ -31,19 +47,22 @@ const THEMES = Object.freeze([
|
|
|
31
47
|
gruvboxDarkTheme,
|
|
32
48
|
noctisTheme,
|
|
33
49
|
noctisObscuroTheme,
|
|
34
|
-
darkHighContrastTheme,
|
|
35
50
|
terminalGreenTheme,
|
|
36
51
|
highContrastMonoTheme,
|
|
37
52
|
win95Theme,
|
|
38
53
|
msDosTheme,
|
|
39
54
|
doomTheme,
|
|
40
55
|
winampTheme,
|
|
41
|
-
|
|
56
|
+
rustTheme,
|
|
57
|
+
spongebobTheme,
|
|
58
|
+
].sort(byGroupThenLabel));
|
|
42
59
|
|
|
43
60
|
const THEME_MAP = new Map(THEMES.map((theme) => [theme.id, theme]));
|
|
44
61
|
|
|
45
62
|
export const DEFAULT_THEME_ID = noctisObscuroTheme.id;
|
|
46
63
|
|
|
64
|
+
export { THEME_GROUP_ORDER } from "./helpers.js";
|
|
65
|
+
|
|
47
66
|
export function listThemes() {
|
|
48
67
|
return THEMES;
|
|
49
68
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createTheme } from "./helpers.js";
|
|
1
|
+
import { createTheme, THEME_GROUP_RETRO } from "./helpers.js";
|
|
2
2
|
|
|
3
3
|
// MS-DOS 2.0 (1983) — MDA/CGA, text only, no windows.
|
|
4
4
|
//
|
|
@@ -19,6 +19,7 @@ const msDosTheme = createTheme({
|
|
|
19
19
|
id: "ms-dos",
|
|
20
20
|
label: "MS-DOS 2.0",
|
|
21
21
|
description: "CGA light-grey on black, the 16-colour CGA palette with brown, and CP437 box framing.",
|
|
22
|
+
group: THEME_GROUP_RETRO,
|
|
22
23
|
page: {
|
|
23
24
|
background: "#000000",
|
|
24
25
|
foreground: "#aaaaaa",
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { createTheme } from "./helpers.js";
|
|
1
|
+
import { createTheme, THEME_GROUP_VSCODE } from "./helpers.js";
|
|
2
2
|
|
|
3
3
|
const noctisObscuroTheme = createTheme({
|
|
4
4
|
id: "noctis-obscuro",
|
|
5
5
|
label: "Noctis Obscuro",
|
|
6
6
|
description: "Deep obsidian palette with cool blue accents and restrained contrast for long sessions.",
|
|
7
|
+
group: THEME_GROUP_VSCODE,
|
|
7
8
|
page: {
|
|
8
9
|
background: "#0b1117",
|
|
9
10
|
foreground: "#c7d1da",
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { createTheme } from "./helpers.js";
|
|
1
|
+
import { createTheme, THEME_GROUP_VSCODE } from "./helpers.js";
|
|
2
2
|
|
|
3
3
|
const noctisTheme = createTheme({
|
|
4
4
|
id: "noctis",
|
|
5
5
|
label: "Noctis",
|
|
6
6
|
description: "Dark cyan-tinted palette with warm and cold medium contrast accents.",
|
|
7
|
+
group: THEME_GROUP_VSCODE,
|
|
7
8
|
page: {
|
|
8
9
|
background: "#052529",
|
|
9
10
|
foreground: "#b2cacd",
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { createTheme, THEME_GROUP_OTHER } from "./helpers.js";
|
|
2
|
+
|
|
3
|
+
// Rust (2010–) — oxidised iron, and the compiler that talks to you.
|
|
4
|
+
//
|
|
5
|
+
// The obvious move is "orange theme". The better one is to notice that Rust's
|
|
6
|
+
// real visual signature is not the logo, it is RUSTC OUTPUT: a warm accent on
|
|
7
|
+
// cold graphite, a blue gutter rail down the left of every diagnostic, and a
|
|
8
|
+
// strict three-level vocabulary — error red, warning yellow, help cyan — with
|
|
9
|
+
// cargo's green reserved for the two lines that mean "it worked". That is a
|
|
10
|
+
// status palette a session list can use directly, so it is the one this theme
|
|
11
|
+
// adopts wholesale.
|
|
12
|
+
//
|
|
13
|
+
// The ground is stone graphite rather than the brown DOOM already owns. Iron
|
|
14
|
+
// oxide is the ACCENT here, not the chrome; the frame stays cold so the orange
|
|
15
|
+
// has something to be warm against. That single decision is what keeps the two
|
|
16
|
+
// warm-dark themes from collapsing into each other.
|
|
17
|
+
//
|
|
18
|
+
// Note the cyan slot carries Ferris orange. The portal derives `--ps-accent`
|
|
19
|
+
// from `tui.cyan` (see applyDocumentTheme), so the accent role travels on that
|
|
20
|
+
// slot regardless of its name — and an orange accent is the entire point of a
|
|
21
|
+
// Rust theme. rustc's cyan `help:` register is given to `blue` instead, which
|
|
22
|
+
// is where the gutter rail lives anyway.
|
|
23
|
+
const rustTheme = createTheme({
|
|
24
|
+
id: "rust",
|
|
25
|
+
label: "Rust",
|
|
26
|
+
description: "Graphite and iron oxide, Ferris in the corner, and rustc's diagnostic levels as the status palette.",
|
|
27
|
+
group: THEME_GROUP_OTHER,
|
|
28
|
+
// Ferris, drawn in blocks rather than curves — the repo's other marks are
|
|
29
|
+
// pixel art (see doom.js, winamp.js), and a smooth crab beside a 32px
|
|
30
|
+
// DOOM face would read as a different set. Blocks also survive favicon
|
|
31
|
+
// size, which a thin-limbed vector crab does not.
|
|
32
|
+
icon: {
|
|
33
|
+
viewBox: "0 0 32 32",
|
|
34
|
+
paths: [
|
|
35
|
+
{ d: "M0 0h32v32H0z", fill: "#241f1c" }, // recessed bay
|
|
36
|
+
// Eyes sit just clear of the shell on stubby stalks. They were
|
|
37
|
+
// tall at first and the whole mark read as a Space Invader —
|
|
38
|
+
// Ferris is WIDE and LOW, and the silhouette only says crab once
|
|
39
|
+
// the shell is much broader than the gap above it.
|
|
40
|
+
{ d: "M11.5 9.5h1.5v2h-1.5z", fill: "#d63a00" },
|
|
41
|
+
{ d: "M19 9.5h1.5v2h-1.5z", fill: "#d63a00" },
|
|
42
|
+
{ d: "M10.5 6h3.5v3.5h-3.5z", fill: "#ffe9dd" },
|
|
43
|
+
{ d: "M18 6h3.5v3.5H18z", fill: "#ffe9dd" },
|
|
44
|
+
{ d: "M11.5 7h1.5v1.5h-1.5z", fill: "#1a1210" },
|
|
45
|
+
{ d: "M19 7h1.5v1.5H19z", fill: "#1a1210" },
|
|
46
|
+
// Shell, stepped out to a flat oval.
|
|
47
|
+
{ d: "M10 11.5h12v2H10z", fill: "#ff7a3d" }, // top-lit dome
|
|
48
|
+
{ d: "M7 13.5h18v3H7z", fill: "#f74c00" },
|
|
49
|
+
{ d: "M5 16.5h22v4H5z", fill: "#f74c00" },
|
|
50
|
+
{ d: "M7 20.5h18v1.8H7z", fill: "#f74c00" },
|
|
51
|
+
{ d: "M14.5 18h3v1.4h-3z", fill: "#c23c00" }, // mouth
|
|
52
|
+
// Pincers: a solid block with the opening cut back out in the
|
|
53
|
+
// ground colour, which is cheaper than describing a C in one path.
|
|
54
|
+
// They are held ABOVE the shell's widest row with a sliver of
|
|
55
|
+
// ground between — butted straight onto it they merged into one
|
|
56
|
+
// wide mass and stopped reading as claws at all.
|
|
57
|
+
{ d: "M0 11h4.5v6.5H0z", fill: "#d63a00" },
|
|
58
|
+
{ d: "M0 13.2h3v2H0z", fill: "#241f1c" },
|
|
59
|
+
{ d: "M27.5 11h4.5v6.5h-4.5z", fill: "#d63a00" },
|
|
60
|
+
{ d: "M29 13.2h3v2h-3z", fill: "#241f1c" },
|
|
61
|
+
// Legs
|
|
62
|
+
{ d: "M8.5 22.3h2.5v2.4H8.5z", fill: "#d63a00" },
|
|
63
|
+
{ d: "M14.75 22.3h2.5v2.4h-2.5z", fill: "#d63a00" },
|
|
64
|
+
{ d: "M21 22.3h2.5v2.4H21z", fill: "#d63a00" },
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
page: {
|
|
68
|
+
background: "#1c1917",
|
|
69
|
+
foreground: "#e7e0d8",
|
|
70
|
+
overlayBackground: "#262220",
|
|
71
|
+
overlayForeground: "#e7e0d8",
|
|
72
|
+
hintColor: "#a39a8f",
|
|
73
|
+
modalBackdrop: "rgba(28, 25, 23, 0.82)",
|
|
74
|
+
modalBackground: "#262220",
|
|
75
|
+
modalBorder: "#4a4038",
|
|
76
|
+
modalForeground: "#e7e0d8",
|
|
77
|
+
modalMuted: "#a9a096",
|
|
78
|
+
// Selection is oxide, not a tint of the accent: a filled band of the
|
|
79
|
+
// colour iron actually goes when it rusts.
|
|
80
|
+
modalSelectedBackground: "#7c2d12",
|
|
81
|
+
modalSelectedBorder: "#ce422b",
|
|
82
|
+
modalSelectedForeground: "#ffeadf",
|
|
83
|
+
},
|
|
84
|
+
terminal: {
|
|
85
|
+
background: "#1c1917",
|
|
86
|
+
foreground: "#e7e0d8",
|
|
87
|
+
cursor: "#f74c00",
|
|
88
|
+
cursorAccent: "#1c1917",
|
|
89
|
+
selectionBackground: "#7c2d12",
|
|
90
|
+
black: "#1c1917",
|
|
91
|
+
red: "#f3554a", // error[E0382]
|
|
92
|
+
green: "#6cc24a", // Compiling / Finished
|
|
93
|
+
yellow: "#e5b02b", // warning:
|
|
94
|
+
blue: "#58a6ff", // the --> gutter rail and help:
|
|
95
|
+
magenta: "#c98bdf",
|
|
96
|
+
// Ferris, and therefore the portal accent. Measured at 5.0:1 on the
|
|
97
|
+
// ground, which clears the 4.5:1 the theme suite holds muted text to
|
|
98
|
+
// — so it stays usable for links and not just for decoration.
|
|
99
|
+
cyan: "#f74c00",
|
|
100
|
+
white: "#e7e0d8",
|
|
101
|
+
brightBlack: "#a39a8f",
|
|
102
|
+
brightRed: "#ff7b70",
|
|
103
|
+
brightGreen: "#8fdd6e",
|
|
104
|
+
brightYellow: "#ffcc55",
|
|
105
|
+
brightBlue: "#83c0ff",
|
|
106
|
+
brightMagenta: "#dcaaef",
|
|
107
|
+
brightCyan: "#ff7a3d",
|
|
108
|
+
brightWhite: "#fdf6ee",
|
|
109
|
+
},
|
|
110
|
+
tui: {
|
|
111
|
+
border: "#4a4038",
|
|
112
|
+
// Speakers keep the diagnostic register: the human is the amber
|
|
113
|
+
// `warning:` line, the accent stays reserved for the machine.
|
|
114
|
+
userChat: "#ffb454",
|
|
115
|
+
userChatLabel: "#ffd08a",
|
|
116
|
+
selectionBackground: "#7c2d12",
|
|
117
|
+
selectionForeground: "#ffeadf",
|
|
118
|
+
activeHighlightBackground: "#7c2d12",
|
|
119
|
+
activeHighlightForeground: "#ffeadf",
|
|
120
|
+
promptCursorBackground: "#f74c00",
|
|
121
|
+
promptCursorForeground: "#1c1917",
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
export default rustTheme;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { createTheme, THEME_GROUP_OTHER } from "./helpers.js";
|
|
2
|
+
|
|
3
|
+
// SpongeBob SquarePants (Stephen Hillenburg, 1999) — Bikini Bottom, not a
|
|
4
|
+
// yellow screen.
|
|
5
|
+
//
|
|
6
|
+
// The obvious version of this theme is a yellow background, and it is
|
|
7
|
+
// unusable: SpongeBob yellow is a 16:1 scream that no one can read a session
|
|
8
|
+
// list on for eight hours. The show itself never does that either — SpongeBob
|
|
9
|
+
// is yellow BECAUSE the ocean around him is deep blue-green. So the ground
|
|
10
|
+
// here is Bikini Bottom at depth and the yellow is spent only where a portal
|
|
11
|
+
// actually wants a bright accent.
|
|
12
|
+
//
|
|
13
|
+
// The cast supplies the status palette, which is the part that earns its keep:
|
|
14
|
+
// Patrick pink, Squidward teal, Krabby-Patty lettuce green, the tie's red, and
|
|
15
|
+
// the pineapple's orange are five hues that are already distinct in everyone's
|
|
16
|
+
// head, which is exactly what a column of status dots needs.
|
|
17
|
+
//
|
|
18
|
+
// Note the cyan slot carries the sponge yellow: the portal derives
|
|
19
|
+
// `--ps-accent` from `tui.cyan`, so that slot is the accent role regardless of
|
|
20
|
+
// its name. Squidward's actual teal takes `blue`.
|
|
21
|
+
const spongebobTheme = createTheme({
|
|
22
|
+
id: "spongebob",
|
|
23
|
+
label: "SpongeBob",
|
|
24
|
+
description: "Bikini Bottom at depth, sponge-yellow accents, and the cast as the status palette.",
|
|
25
|
+
group: THEME_GROUP_OTHER,
|
|
26
|
+
// The face. Big eyes and buck teeth are the whole silhouette — freckles
|
|
27
|
+
// and the nose are below the resolution that survives a 32px frame, so
|
|
28
|
+
// they are dropped rather than drawn as mud.
|
|
29
|
+
icon: {
|
|
30
|
+
viewBox: "0 0 32 32",
|
|
31
|
+
paths: [
|
|
32
|
+
{ d: "M0 0h32v32H0z", fill: "#1a7fa8" }, // the water
|
|
33
|
+
{ d: "M7 2h18a3 3 0 0 1 3 3v15a3 3 0 0 1-3 3H7a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3z", fill: "#ffe01b" },
|
|
34
|
+
// Pores. The one texture that says "sponge" rather than "square".
|
|
35
|
+
{ d: "M6.2 6.4a1.4 1.4 0 1 0 2.8 0a1.4 1.4 0 1 0-2.8 0z", fill: "#e3c00c" },
|
|
36
|
+
{ d: "M23.4 4.8a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0z", fill: "#e3c00c" },
|
|
37
|
+
{ d: "M5.4 18.2a1.5 1.5 0 1 0 3 0a1.5 1.5 0 1 0-3 0z", fill: "#e3c00c" },
|
|
38
|
+
{ d: "M24 19a1.3 1.3 0 1 0 2.6 0a1.3 1.3 0 1 0-2.6 0z", fill: "#e3c00c" },
|
|
39
|
+
// Eyes
|
|
40
|
+
{ d: "M7.3 10a4.2 4.2 0 1 0 8.4 0a4.2 4.2 0 1 0-8.4 0z", fill: "#ffffff" },
|
|
41
|
+
{ d: "M16.3 10a4.2 4.2 0 1 0 8.4 0a4.2 4.2 0 1 0-8.4 0z", fill: "#ffffff" },
|
|
42
|
+
{ d: "M9.4 10a2.1 2.1 0 1 0 4.2 0a2.1 2.1 0 1 0-4.2 0z", fill: "#3fa9d8" },
|
|
43
|
+
{ d: "M18.4 10a2.1 2.1 0 1 0 4.2 0a2.1 2.1 0 1 0-4.2 0z", fill: "#3fa9d8" },
|
|
44
|
+
{ d: "M10.5 10a1 1 0 1 0 2 0a1 1 0 1 0-2 0z", fill: "#10202b" },
|
|
45
|
+
{ d: "M19.5 10a1 1 0 1 0 2 0a1 1 0 1 0-2 0z", fill: "#10202b" },
|
|
46
|
+
// Smile and the two teeth
|
|
47
|
+
{ d: "M10 16.6c2 3.6 10 3.6 12 0c-1.2 5-10.8 5-12 0z", fill: "#6b4e00" },
|
|
48
|
+
{ d: "M14 17.6h1.9v2.1H14z", fill: "#ffffff" },
|
|
49
|
+
{ d: "M16.1 17.6H18v2.1h-1.9z", fill: "#ffffff" },
|
|
50
|
+
// Collar and tie
|
|
51
|
+
{ d: "M6 23h20v3H6z", fill: "#ffffff" },
|
|
52
|
+
{ d: "M14.4 24.6h3.2v2h-3.2z", fill: "#d2232a" },
|
|
53
|
+
{ d: "M13 26.4h6l-3 5.2z", fill: "#d2232a" },
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
page: {
|
|
57
|
+
background: "#07293c",
|
|
58
|
+
foreground: "#e6f4fb",
|
|
59
|
+
overlayBackground: "#0e3852",
|
|
60
|
+
overlayForeground: "#e6f4fb",
|
|
61
|
+
hintColor: "#8fb9cf",
|
|
62
|
+
modalBackdrop: "rgba(7, 41, 60, 0.84)",
|
|
63
|
+
modalBackground: "#0e3852",
|
|
64
|
+
modalBorder: "#1d6a8c",
|
|
65
|
+
modalForeground: "#e6f4fb",
|
|
66
|
+
modalMuted: "#95bed3",
|
|
67
|
+
// Selection is the sponge himself: a filled yellow block with the type
|
|
68
|
+
// knocked back to the water. Anything subtler on this ground reads as
|
|
69
|
+
// a bug rather than a highlight.
|
|
70
|
+
modalSelectedBackground: "#ffe01b",
|
|
71
|
+
modalSelectedBorder: "#fff08a",
|
|
72
|
+
modalSelectedForeground: "#07293c",
|
|
73
|
+
},
|
|
74
|
+
terminal: {
|
|
75
|
+
background: "#07293c",
|
|
76
|
+
foreground: "#e6f4fb",
|
|
77
|
+
cursor: "#ffe01b",
|
|
78
|
+
cursorAccent: "#07293c",
|
|
79
|
+
selectionBackground: "#ffe01b",
|
|
80
|
+
black: "#07293c",
|
|
81
|
+
red: "#ff6152", // the tie, lifted off #d2232a to clear 3:1
|
|
82
|
+
green: "#7ed957", // Krabby Patty lettuce
|
|
83
|
+
yellow: "#ffa62b", // the pineapple
|
|
84
|
+
blue: "#7fd4c1", // Squidward
|
|
85
|
+
magenta: "#ff9bd2", // Patrick
|
|
86
|
+
cyan: "#ffe01b", // SpongeBob, and therefore --ps-accent
|
|
87
|
+
white: "#e6f4fb",
|
|
88
|
+
brightBlack: "#8fb9cf",
|
|
89
|
+
brightRed: "#ff9084",
|
|
90
|
+
brightGreen: "#a5e888",
|
|
91
|
+
brightYellow: "#ffc46b",
|
|
92
|
+
brightBlue: "#a8e5d8",
|
|
93
|
+
brightMagenta: "#ffbde1",
|
|
94
|
+
brightCyan: "#fff08a",
|
|
95
|
+
brightWhite: "#ffffff",
|
|
96
|
+
},
|
|
97
|
+
tui: {
|
|
98
|
+
border: "#1d6a8c",
|
|
99
|
+
userChat: "#ffa62b",
|
|
100
|
+
userChatLabel: "#ffc46b",
|
|
101
|
+
selectionBackground: "#ffe01b",
|
|
102
|
+
selectionForeground: "#07293c",
|
|
103
|
+
activeHighlightBackground: "#ffe01b",
|
|
104
|
+
activeHighlightForeground: "#07293c",
|
|
105
|
+
promptCursorBackground: "#ffe01b",
|
|
106
|
+
promptCursorForeground: "#07293c",
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
export default spongebobTheme;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { createTheme } from "./helpers.js";
|
|
1
|
+
import { createTheme, THEME_GROUP_RETRO } from "./helpers.js";
|
|
2
2
|
|
|
3
3
|
const terminalGreenTheme = createTheme({
|
|
4
4
|
id: "terminal-green",
|
|
5
5
|
label: "Terminal Green",
|
|
6
6
|
description: "Classic black terminal with phosphor green text, amber warnings, and crisp operator contrast.",
|
|
7
|
+
group: THEME_GROUP_RETRO,
|
|
7
8
|
page: {
|
|
8
9
|
background: "#020503",
|
|
9
10
|
foreground: "#c9f7d3",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createTheme } from "./helpers.js";
|
|
1
|
+
import { createTheme, THEME_GROUP_RETRO } from "./helpers.js";
|
|
2
2
|
|
|
3
3
|
// Windows 95, as it actually was — not a pastel homage.
|
|
4
4
|
//
|
|
@@ -14,6 +14,7 @@ const win95Theme = createTheme({
|
|
|
14
14
|
id: "win95",
|
|
15
15
|
label: "Windows 95",
|
|
16
16
|
description: "Authentic 3D-bevelled grey, navy title bars, teal desktop, and the 16-colour VGA terminal set.",
|
|
17
|
+
group: THEME_GROUP_RETRO,
|
|
17
18
|
page: {
|
|
18
19
|
// Desktop teal behind the panes — the single most recognizable colour
|
|
19
20
|
// of the era, and it makes the grey panes read as raised windows.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createTheme } from "./helpers.js";
|
|
1
|
+
import { createTheme, THEME_GROUP_RETRO } from "./helpers.js";
|
|
2
2
|
|
|
3
3
|
// WinAMP 2.x (Nullsoft, 1997) — grey rack metal around a pane of lit glass.
|
|
4
4
|
//
|
|
@@ -19,6 +19,7 @@ const winampTheme = createTheme({
|
|
|
19
19
|
id: "winamp",
|
|
20
20
|
label: "WinAMP",
|
|
21
21
|
description: "Bevelled grey chrome, black glass panes, phosphor green, and the spectrum ramp as the status palette.",
|
|
22
|
+
group: THEME_GROUP_RETRO,
|
|
22
23
|
// The spectrum analyser: one bar per agent, coloured along the status
|
|
23
24
|
// ramp. Five rectangles, so it stays legible at favicon size — and it is
|
|
24
25
|
// the rare mark that could legitimately animate off live fleet load.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createTheme } from "./helpers.js";
|
|
1
|
+
import { createTheme, THEME_GROUP_OTHER } from "./helpers.js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Workspace Dark — the admin-console language as a theme: tone-separated
|
|
@@ -12,6 +12,7 @@ const workspaceDarkTheme = createTheme({
|
|
|
12
12
|
id: "workspace-dark",
|
|
13
13
|
label: "Workspace Dark",
|
|
14
14
|
description: "Flat workspace chrome: tone surfaces and hairlines instead of panel borders.",
|
|
15
|
+
group: THEME_GROUP_OTHER,
|
|
15
16
|
page: {
|
|
16
17
|
background: "#0d1117",
|
|
17
18
|
foreground: "#e6edf3",
|