@floegence/floeterm-terminal-web 0.8.0 → 0.10.0

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 (32) hide show
  1. package/README.md +25 -1
  2. package/dist/core/TerminalCore.d.ts +8 -1
  3. package/dist/core/TerminalCore.d.ts.map +1 -1
  4. package/dist/core/TerminalCore.js +141 -69
  5. package/dist/core/TerminalCore.js.map +1 -1
  6. package/dist/core/TerminalScrollbarOverlay.d.ts +63 -0
  7. package/dist/core/TerminalScrollbarOverlay.d.ts.map +1 -0
  8. package/dist/core/TerminalScrollbarOverlay.js +493 -0
  9. package/dist/core/TerminalScrollbarOverlay.js.map +1 -0
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/internal/GhosttyScrollbackCompat.d.ts +16 -0
  14. package/dist/internal/GhosttyScrollbackCompat.d.ts.map +1 -0
  15. package/dist/internal/GhosttyScrollbackCompat.js +43 -0
  16. package/dist/internal/GhosttyScrollbackCompat.js.map +1 -0
  17. package/dist/internal/GhosttyScrollbarCompat.d.ts +10 -0
  18. package/dist/internal/GhosttyScrollbarCompat.d.ts.map +1 -0
  19. package/dist/internal/GhosttyScrollbarCompat.js +94 -0
  20. package/dist/internal/GhosttyScrollbarCompat.js.map +1 -0
  21. package/dist/internal/TerminalResourceLoader.d.ts +27 -2
  22. package/dist/internal/TerminalResourceLoader.d.ts.map +1 -1
  23. package/dist/internal/TerminalResourceLoader.js +112 -47
  24. package/dist/internal/TerminalResourceLoader.js.map +1 -1
  25. package/dist/types.d.ts +13 -0
  26. package/dist/types.d.ts.map +1 -1
  27. package/dist/types.js.map +1 -1
  28. package/dist/utils/themeColor.d.ts +12 -0
  29. package/dist/utils/themeColor.d.ts.map +1 -0
  30. package/dist/utils/themeColor.js +88 -0
  31. package/dist/utils/themeColor.js.map +1 -0
  32. package/package.json +4 -3
@@ -0,0 +1,88 @@
1
+ export function normalizeThemeColor(value) {
2
+ if (!value)
3
+ return null;
4
+ const trimmed = value.trim();
5
+ const shortHex = /^#([0-9a-fA-F]{3})$/.exec(trimmed);
6
+ if (shortHex) {
7
+ const [r, g, b] = shortHex[1].split('');
8
+ return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();
9
+ }
10
+ if (/^#[0-9a-fA-F]{6}$/.test(trimmed)) {
11
+ return trimmed.toLowerCase();
12
+ }
13
+ const rgb = /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/.exec(trimmed);
14
+ if (!rgb)
15
+ return null;
16
+ const channels = rgb.slice(1).map(channel => Number(channel));
17
+ if (channels.some(channel => !Number.isInteger(channel) || channel < 0 || channel > 255)) {
18
+ return null;
19
+ }
20
+ return `#${channels.map(channel => channel.toString(16).padStart(2, '0')).join('')}`;
21
+ }
22
+ export function parseThemeColor(value) {
23
+ const normalized = normalizeThemeColor(value);
24
+ if (!normalized)
25
+ return null;
26
+ const hex = normalized.slice(1);
27
+ return {
28
+ r: Number.parseInt(hex.slice(0, 2), 16),
29
+ g: Number.parseInt(hex.slice(2, 4), 16),
30
+ b: Number.parseInt(hex.slice(4, 6), 16),
31
+ };
32
+ }
33
+ export function formatThemeColor(color) {
34
+ return `rgb(${color.r}, ${color.g}, ${color.b})`;
35
+ }
36
+ export function relativeLuminance(color) {
37
+ const linear = [color.r, color.g, color.b].map(channel => {
38
+ const normalized = channel / 255;
39
+ return normalized <= 0.04045 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4;
40
+ });
41
+ return 0.2126 * linear[0] + 0.7152 * linear[1] + 0.0722 * linear[2];
42
+ }
43
+ export function contrastRatio(left, right) {
44
+ const lighter = Math.max(relativeLuminance(left), relativeLuminance(right));
45
+ const darker = Math.min(relativeLuminance(left), relativeLuminance(right));
46
+ return (lighter + 0.05) / (darker + 0.05);
47
+ }
48
+ function mixColor(source, target, amount) {
49
+ const channel = (left, right) => Math.round(left + (right - left) * amount);
50
+ return {
51
+ r: channel(source.r, target.r),
52
+ g: channel(source.g, target.g),
53
+ b: channel(source.b, target.b),
54
+ };
55
+ }
56
+ function closestContrastingMix(background, target, minimumRatio) {
57
+ if (contrastRatio(background, target) < minimumRatio)
58
+ return null;
59
+ let low = 0;
60
+ let high = 1;
61
+ for (let iteration = 0; iteration < 16; iteration += 1) {
62
+ const middle = (low + high) / 2;
63
+ if (contrastRatio(background, mixColor(background, target, middle)) >= minimumRatio) {
64
+ high = middle;
65
+ }
66
+ else {
67
+ low = middle;
68
+ }
69
+ }
70
+ return { color: mixColor(background, target, high), amount: high };
71
+ }
72
+ export function deriveContrastingThemeColor(background, minimumRatio) {
73
+ const blackTarget = { r: 0, g: 0, b: 0 };
74
+ const whiteTarget = { r: 255, g: 255, b: 255 };
75
+ const black = closestContrastingMix(background, blackTarget, minimumRatio);
76
+ const white = closestContrastingMix(background, whiteTarget, minimumRatio);
77
+ if (!black && !white) {
78
+ return contrastRatio(background, blackTarget) >= contrastRatio(background, whiteTarget)
79
+ ? blackTarget
80
+ : whiteTarget;
81
+ }
82
+ if (!black)
83
+ return white.color;
84
+ if (!white)
85
+ return black.color;
86
+ return black.amount <= white.amount ? black.color : white.color;
87
+ }
88
+ //# sourceMappingURL=themeColor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themeColor.js","sourceRoot":"","sources":["../../src/utils/themeColor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floegence/floeterm-terminal-web",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "Framework-neutral ghostty-web (xterm.js API-compatible) integration with terminal core, session, and data flow utilities.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -54,8 +54,9 @@
54
54
  ],
55
55
  "scripts": {
56
56
  "build": "node -e \"const fs=require('fs'); fs.rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json && node -e \"const fs=require('fs'); if (fs.existsSync('src/styles')) fs.cpSync('src/styles', 'dist/styles', { recursive: true })\"",
57
- "check:package-artifact": "node scripts/check-package-artifact.mjs",
58
- "test": "vitest run",
57
+ "check:ghostty-compat": "node scripts/check-ghostty-scrollback-compat.mjs",
58
+ "check:package-artifact": "npm run check:ghostty-compat && node scripts/check-package-artifact.mjs",
59
+ "test": "npm run check:ghostty-compat && vitest run",
59
60
  "test:browser": "node scripts/runVitestBrowser.mjs",
60
61
  "lint": "tsc --noEmit",
61
62
  "prepublishOnly": "npm run lint && npm test && npm run test:browser && npm run build && npm run check:package-artifact"