@volter/teams 0.1.36 → 0.1.37

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volter/teams",
3
- "version": "0.1.36",
3
+ "version": "0.1.37",
4
4
  "type": "module",
5
5
  "description": "Volter Teams, the neutral team plane: machine identity and daemon core, the local door and server link, admission from machine grants, product doors, and the Teams server's neutral routes (company RFC 0008).",
6
6
  "license": "MIT",
package/viewer/index.html CHANGED
@@ -18,7 +18,7 @@
18
18
  #status { padding: 4px 10px; color: var(--muted); font-size: 12px; border-bottom: 1px solid var(--line); }
19
19
  #status:empty { display: none; }
20
20
  main { flex: 1; min-height: 0; display: flex; }
21
- #terminal { flex: 1; min-width: 0; padding: 4px; }
21
+ #terminal { flex: 1; min-width: 0; padding: 4px; color-scheme: light dark; background: var(--volter-terminal-background); }
22
22
  #folder { flex: 1; min-width: 0; display: none; }
23
23
  #folder.open { display: flex; }
24
24
  #entries { width: 280px; flex: none; border-right: 1px solid var(--line); overflow: auto; }
package/viewer/viewer.mjs CHANGED
@@ -61,12 +61,37 @@ function useLayout(layout) {
61
61
  const rows = layout === 'rows';
62
62
  $('session').classList.toggle('layout-rows', rows);
63
63
  if (rows && !document.getElementById('brand-tokens')) {
64
- const link = Object.assign(document.createElement('link'), { id: 'brand-tokens', rel: 'stylesheet', href: 'https://brand.volter.ai/tokens.css' });
65
- document.head.append(link);
64
+ brandTokens();
66
65
  // A chat's rows are light unless the host's theme names a scheme.
67
66
  if (!themed) document.documentElement.style.setProperty('--scui-color-scheme', 'light');
68
67
  }
69
68
  }
69
+ // The brand's tokens stylesheet, loaded once; resolves when it has loaded (or failed to).
70
+ let brandLoaded = null;
71
+ function brandTokens() {
72
+ if (brandLoaded) return brandLoaded;
73
+ const link = Object.assign(document.createElement('link'), { id: 'brand-tokens', rel: 'stylesheet', href: 'https://brand.volter.ai/tokens.css' });
74
+ brandLoaded = new Promise((resolve) => { link.onload = link.onerror = resolve; });
75
+ document.head.append(link);
76
+ return brandLoaded;
77
+ }
78
+ // A pane looks like Terminal.app's Basic profile: the brand's terminal roles, resolved on the terminal element, which
79
+ // (like Terminal.app) follows the system's appearance. xterm takes concrete values, so each is read through a probe.
80
+ const TERMINAL_SLOTS = { background: 'background', foreground: 'foreground', cursor: 'cursor', selectionBackground: 'selection', black: 'black', red: 'red', green: 'green', yellow: 'yellow', blue: 'blue', magenta: 'magenta', cyan: 'cyan', white: 'white', brightBlack: 'bright-black', brightRed: 'bright-red', brightGreen: 'bright-green', brightYellow: 'bright-yellow', brightBlue: 'bright-blue', brightMagenta: 'bright-magenta', brightCyan: 'bright-cyan', brightWhite: 'bright-white' };
81
+ function terminalLook(element) {
82
+ const probe = document.createElement('span');
83
+ probe.hidden = true;
84
+ element.append(probe);
85
+ const theme = {};
86
+ for (const [slot, role] of Object.entries(TERMINAL_SLOTS)) {
87
+ probe.style.color = `var(--volter-terminal-${role})`;
88
+ theme[slot] = getComputedStyle(probe).color;
89
+ }
90
+ probe.style.font = 'var(--volter-font-size-terminal, 11px) var(--volter-font-terminal, ui-monospace, Menlo, monospace)';
91
+ const { fontFamily, fontSize } = getComputedStyle(probe);
92
+ probe.remove();
93
+ return { fontFamily, fontSize: Number.parseFloat(fontSize), theme };
94
+ }
70
95
  // A fragment value that is base64url JSON (UTF-8), or null.
71
96
  function fragmentJson(name) {
72
97
  try {
@@ -189,9 +214,10 @@ async function showPane(connect, key, control) {
189
214
  import('https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/+esm'),
190
215
  import('https://cdn.jsdelivr.net/npm/@xterm/addon-fit@0.10.0/+esm'),
191
216
  ]);
217
+ await brandTokens();
192
218
  const element = $('terminal');
193
219
  element.hidden = false;
194
- const terminal = new Terminal({ cursorBlink: control, disableStdin: !control, fontFamily: 'ui-monospace, Menlo, monospace', fontSize: 13, scrollback: 5000, theme: { background: '#0b0d10' } });
220
+ const terminal = new Terminal({ disableStdin: !control, scrollback: 5000, ...terminalLook(element) });
195
221
  const fit = new FitAddon();
196
222
  terminal.loadAddon(fit);
197
223
  terminal.open(element);