@abelfubu/dv 0.1.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 (118) hide show
  1. package/dist/ansi-html.d.ts +42 -0
  2. package/dist/ansi-html.d.ts.map +1 -0
  3. package/dist/ansi-html.js +327 -0
  4. package/dist/ansi-output.d.ts +22 -0
  5. package/dist/ansi-output.d.ts.map +1 -0
  6. package/dist/ansi-output.js +154 -0
  7. package/dist/balance-delimiters.d.ts +25 -0
  8. package/dist/balance-delimiters.d.ts.map +1 -0
  9. package/dist/balance-delimiters.js +539 -0
  10. package/dist/balance-delimiters.test.d.ts +2 -0
  11. package/dist/balance-delimiters.test.d.ts.map +1 -0
  12. package/dist/balance-delimiters.test.js +1029 -0
  13. package/dist/cli-copy-notification.test.d.ts +2 -0
  14. package/dist/cli-copy-notification.test.d.ts.map +1 -0
  15. package/dist/cli-copy-notification.test.js +80 -0
  16. package/dist/cli-scroll.test.d.ts +2 -0
  17. package/dist/cli-scroll.test.d.ts.map +1 -0
  18. package/dist/cli-scroll.test.js +283 -0
  19. package/dist/cli.d.ts +9 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +976 -0
  22. package/dist/clipboard.d.ts +16 -0
  23. package/dist/clipboard.d.ts.map +1 -0
  24. package/dist/clipboard.js +128 -0
  25. package/dist/components/diff-view.d.ts +32 -0
  26. package/dist/components/diff-view.d.ts.map +1 -0
  27. package/dist/components/diff-view.js +123 -0
  28. package/dist/components/diff-view.test.d.ts +5 -0
  29. package/dist/components/diff-view.test.d.ts.map +1 -0
  30. package/dist/components/diff-view.test.js +312 -0
  31. package/dist/components/directory-tree-view.d.ts +33 -0
  32. package/dist/components/directory-tree-view.d.ts.map +1 -0
  33. package/dist/components/directory-tree-view.js +262 -0
  34. package/dist/components/index.d.ts +4 -0
  35. package/dist/components/index.d.ts.map +1 -0
  36. package/dist/components/index.js +5 -0
  37. package/dist/components/toast.d.ts +21 -0
  38. package/dist/components/toast.d.ts.map +1 -0
  39. package/dist/components/toast.js +47 -0
  40. package/dist/diff-cursor-utils.d.ts +20 -0
  41. package/dist/diff-cursor-utils.d.ts.map +1 -0
  42. package/dist/diff-cursor-utils.js +105 -0
  43. package/dist/diff-cursor-utils.test.d.ts +2 -0
  44. package/dist/diff-cursor-utils.test.d.ts.map +1 -0
  45. package/dist/diff-cursor-utils.test.js +40 -0
  46. package/dist/diff-surface-copy.d.ts +23 -0
  47. package/dist/diff-surface-copy.d.ts.map +1 -0
  48. package/dist/diff-surface-copy.js +64 -0
  49. package/dist/diff-surface-copy.test.d.ts +5 -0
  50. package/dist/diff-surface-copy.test.d.ts.map +1 -0
  51. package/dist/diff-surface-copy.test.js +142 -0
  52. package/dist/diff-utils.d.ts +196 -0
  53. package/dist/diff-utils.d.ts.map +1 -0
  54. package/dist/diff-utils.js +682 -0
  55. package/dist/diff-utils.test.d.ts +2 -0
  56. package/dist/diff-utils.test.d.ts.map +1 -0
  57. package/dist/diff-utils.test.js +727 -0
  58. package/dist/directory-tree.d.ts +72 -0
  59. package/dist/directory-tree.d.ts.map +1 -0
  60. package/dist/directory-tree.js +161 -0
  61. package/dist/directory-tree.test.d.ts +2 -0
  62. package/dist/directory-tree.test.d.ts.map +1 -0
  63. package/dist/directory-tree.test.js +383 -0
  64. package/dist/dropdown.d.ts +26 -0
  65. package/dist/dropdown.d.ts.map +1 -0
  66. package/dist/dropdown.js +172 -0
  67. package/dist/dropdown.test.d.ts +2 -0
  68. package/dist/dropdown.test.d.ts.map +1 -0
  69. package/dist/dropdown.test.js +106 -0
  70. package/dist/filter-submodule.e2e.test.d.ts +2 -0
  71. package/dist/filter-submodule.e2e.test.d.ts.map +1 -0
  72. package/dist/filter-submodule.e2e.test.js +109 -0
  73. package/dist/hooks/use-copy-selection.d.ts +29 -0
  74. package/dist/hooks/use-copy-selection.d.ts.map +1 -0
  75. package/dist/hooks/use-copy-selection.js +46 -0
  76. package/dist/kv-codec.d.ts +16 -0
  77. package/dist/kv-codec.d.ts.map +1 -0
  78. package/dist/kv-codec.js +36 -0
  79. package/dist/license.d.ts +14 -0
  80. package/dist/license.d.ts.map +1 -0
  81. package/dist/license.js +63 -0
  82. package/dist/logger.d.ts +9 -0
  83. package/dist/logger.d.ts.map +1 -0
  84. package/dist/logger.js +78 -0
  85. package/dist/monochrome.d.ts +34 -0
  86. package/dist/monochrome.d.ts.map +1 -0
  87. package/dist/monochrome.js +613 -0
  88. package/dist/monotone.d.ts +22 -0
  89. package/dist/monotone.d.ts.map +1 -0
  90. package/dist/monotone.js +185 -0
  91. package/dist/parsers-config.d.ts +19 -0
  92. package/dist/parsers-config.d.ts.map +1 -0
  93. package/dist/parsers-config.js +271 -0
  94. package/dist/patch-terminal-dimensions.d.ts +2 -0
  95. package/dist/patch-terminal-dimensions.d.ts.map +1 -0
  96. package/dist/patch-terminal-dimensions.js +45 -0
  97. package/dist/stdin-pager.test.d.ts +2 -0
  98. package/dist/stdin-pager.test.d.ts.map +1 -0
  99. package/dist/stdin-pager.test.js +497 -0
  100. package/dist/store.d.ts +16 -0
  101. package/dist/store.d.ts.map +1 -0
  102. package/dist/store.js +48 -0
  103. package/dist/themes/github.json +247 -0
  104. package/dist/themes.d.ts +59 -0
  105. package/dist/themes.d.ts.map +1 -0
  106. package/dist/themes.js +248 -0
  107. package/dist/tree-icons.d.ts +4 -0
  108. package/dist/tree-icons.d.ts.map +1 -0
  109. package/dist/tree-icons.js +18 -0
  110. package/dist/utils.d.ts +2 -0
  111. package/dist/utils.d.ts.map +1 -0
  112. package/dist/utils.js +13 -0
  113. package/dist/web-utils.d.ts +56 -0
  114. package/dist/web-utils.d.ts.map +1 -0
  115. package/dist/web-utils.js +363 -0
  116. package/package.json +37 -0
  117. package/public/jetbrains-mono-nerd.ttf +0 -0
  118. package/public/jetbrains-mono-nerd.woff2 +0 -0
@@ -0,0 +1,247 @@
1
+ {
2
+ "$schema": "https://opencode.ai/theme.json",
3
+ "defs": {
4
+ "darkBg": "#000000",
5
+ "darkBgPanel": "#0d1117",
6
+ "darkBgElement": "#161b22",
7
+ "darkFg": "#e6edf3",
8
+ "darkFgMuted": "#8b949e",
9
+ "darkConceal": "#484f58",
10
+ "darkBorder": "#30363d",
11
+ "darkBorderSubtle": "#21262d",
12
+ "darkKeyword": "#ff7b72",
13
+ "darkString": "#a5d6ff",
14
+ "darkConstant": "#79c0ff",
15
+ "darkVariable": "#ffa657",
16
+ "darkFunction": "#d2a8ff",
17
+ "darkTag": "#7ee787",
18
+ "darkGreen": "#3fb950",
19
+ "darkRed": "#f85149",
20
+ "darkOrange": "#d29922",
21
+ "darkYellow": "#e3b341",
22
+ "darkCyan": "#39c5cf",
23
+ "lightBg": "#ffffff",
24
+ "lightBgAlt": "#f6f8fa",
25
+ "lightBgPanel": "#f0f3f6",
26
+ "lightFg": "#24292f",
27
+ "lightFgMuted": "#57606a",
28
+ "lightConceal": "#8c959f",
29
+ "lightKeyword": "#cf222e",
30
+ "lightString": "#0a3069",
31
+ "lightConstant": "#0550ae",
32
+ "lightVariable": "#953800",
33
+ "lightFunction": "#8250df",
34
+ "lightTag": "#116329",
35
+ "lightGreen": "#1a7f37",
36
+ "lightRed": "#cf222e",
37
+ "lightOrange": "#bc4c00",
38
+ "lightYellow": "#9a6700",
39
+ "lightCyan": "#1b7c83"
40
+ },
41
+ "theme": {
42
+ "primary": {
43
+ "dark": "darkConstant",
44
+ "light": "lightConstant"
45
+ },
46
+ "secondary": {
47
+ "dark": "darkFunction",
48
+ "light": "lightFunction"
49
+ },
50
+ "accent": {
51
+ "dark": "darkCyan",
52
+ "light": "lightCyan"
53
+ },
54
+ "error": {
55
+ "dark": "darkRed",
56
+ "light": "lightRed"
57
+ },
58
+ "warning": {
59
+ "dark": "darkYellow",
60
+ "light": "lightYellow"
61
+ },
62
+ "success": {
63
+ "dark": "darkGreen",
64
+ "light": "lightGreen"
65
+ },
66
+ "info": {
67
+ "dark": "darkOrange",
68
+ "light": "lightOrange"
69
+ },
70
+ "text": {
71
+ "dark": "darkFg",
72
+ "light": "lightFg"
73
+ },
74
+ "textMuted": {
75
+ "dark": "darkFgMuted",
76
+ "light": "lightFgMuted"
77
+ },
78
+ "background": {
79
+ "dark": "darkBg",
80
+ "light": "lightBg"
81
+ },
82
+ "backgroundPanel": {
83
+ "dark": "darkBg",
84
+ "light": "lightBgAlt"
85
+ },
86
+ "backgroundElement": {
87
+ "dark": "darkBgPanel",
88
+ "light": "lightBgPanel"
89
+ },
90
+ "border": {
91
+ "dark": "darkBorderSubtle",
92
+ "light": "#d0d7de"
93
+ },
94
+ "borderActive": {
95
+ "dark": "darkConstant",
96
+ "light": "lightConstant"
97
+ },
98
+ "borderSubtle": {
99
+ "dark": "#161b22",
100
+ "light": "#d8dee4"
101
+ },
102
+ "diffAdded": {
103
+ "dark": "darkTag",
104
+ "light": "lightTag"
105
+ },
106
+ "diffRemoved": {
107
+ "dark": "#ffa198",
108
+ "light": "lightRed"
109
+ },
110
+ "diffContext": {
111
+ "dark": "darkFgMuted",
112
+ "light": "lightFgMuted"
113
+ },
114
+ "diffHunkHeader": {
115
+ "dark": "darkFunction",
116
+ "light": "lightFunction"
117
+ },
118
+ "diffHighlightAdded": {
119
+ "dark": "darkTag",
120
+ "light": "lightTag"
121
+ },
122
+ "diffHighlightRemoved": {
123
+ "dark": "#ffa198",
124
+ "light": "lightRed"
125
+ },
126
+ "diffAddedBg": {
127
+ "dark": "#080f0b",
128
+ "light": "#f0fff4"
129
+ },
130
+ "diffRemovedBg": {
131
+ "dark": "#120a0a",
132
+ "light": "#fff7f6"
133
+ },
134
+ "diffContextBg": {
135
+ "dark": "darkBg",
136
+ "light": "lightBgAlt"
137
+ },
138
+ "diffLineNumber": {
139
+ "dark": "#6e7681",
140
+ "light": "#afb8c1"
141
+ },
142
+ "diffAddedLineNumberBg": {
143
+ "dark": "#0c1c10",
144
+ "light": "#e4f9e9"
145
+ },
146
+ "diffRemovedLineNumberBg": {
147
+ "dark": "#1c0d0e",
148
+ "light": "#ffe8e6"
149
+ },
150
+ "markdownText": {
151
+ "dark": "darkFg",
152
+ "light": "lightFg"
153
+ },
154
+ "markdownHeading": {
155
+ "dark": "darkConstant",
156
+ "light": "lightConstant"
157
+ },
158
+ "markdownLink": {
159
+ "dark": "darkString",
160
+ "light": "lightString"
161
+ },
162
+ "markdownLinkText": {
163
+ "dark": "darkCyan",
164
+ "light": "lightCyan"
165
+ },
166
+ "markdownCode": {
167
+ "dark": "darkConstant",
168
+ "light": "lightConstant"
169
+ },
170
+ "markdownBlockQuote": {
171
+ "dark": "darkTag",
172
+ "light": "lightTag"
173
+ },
174
+ "markdownEmph": {
175
+ "dark": "darkFg",
176
+ "light": "lightFg"
177
+ },
178
+ "markdownStrong": {
179
+ "dark": "darkFg",
180
+ "light": "lightFg"
181
+ },
182
+ "markdownHorizontalRule": {
183
+ "dark": "darkBorder",
184
+ "light": "#d0d7de"
185
+ },
186
+ "markdownListItem": {
187
+ "dark": "darkVariable",
188
+ "light": "lightVariable"
189
+ },
190
+ "markdownListEnumeration": {
191
+ "dark": "darkVariable",
192
+ "light": "lightVariable"
193
+ },
194
+ "markdownImage": {
195
+ "dark": "darkString",
196
+ "light": "lightString"
197
+ },
198
+ "markdownImageText": {
199
+ "dark": "darkCyan",
200
+ "light": "lightCyan"
201
+ },
202
+ "markdownCodeBlock": {
203
+ "dark": "darkFg",
204
+ "light": "lightFg"
205
+ },
206
+ "syntaxComment": {
207
+ "dark": "darkFgMuted",
208
+ "light": "lightFgMuted"
209
+ },
210
+ "syntaxKeyword": {
211
+ "dark": "darkKeyword",
212
+ "light": "lightKeyword"
213
+ },
214
+ "syntaxFunction": {
215
+ "dark": "darkFunction",
216
+ "light": "lightFunction"
217
+ },
218
+ "syntaxVariable": {
219
+ "dark": "darkVariable",
220
+ "light": "lightVariable"
221
+ },
222
+ "syntaxString": {
223
+ "dark": "darkString",
224
+ "light": "lightString"
225
+ },
226
+ "syntaxNumber": {
227
+ "dark": "darkConstant",
228
+ "light": "lightConstant"
229
+ },
230
+ "syntaxType": {
231
+ "dark": "darkVariable",
232
+ "light": "lightVariable"
233
+ },
234
+ "syntaxOperator": {
235
+ "dark": "darkKeyword",
236
+ "light": "lightKeyword"
237
+ },
238
+ "syntaxPunctuation": {
239
+ "dark": "darkFg",
240
+ "light": "lightFg"
241
+ },
242
+ "conceal": {
243
+ "dark": "darkConceal",
244
+ "light": "lightConceal"
245
+ }
246
+ }
247
+ }
@@ -0,0 +1,59 @@
1
+ import { RGBA } from "@opentuah/core";
2
+ export interface ResolvedTheme {
3
+ primary: RGBA;
4
+ success: RGBA;
5
+ error: RGBA;
6
+ warning: RGBA;
7
+ info: RGBA;
8
+ syntaxComment: RGBA;
9
+ syntaxKeyword: RGBA;
10
+ syntaxFunction: RGBA;
11
+ syntaxVariable: RGBA;
12
+ syntaxString: RGBA;
13
+ syntaxNumber: RGBA;
14
+ syntaxType: RGBA;
15
+ syntaxOperator: RGBA;
16
+ syntaxPunctuation: RGBA;
17
+ text: RGBA;
18
+ textMuted: RGBA;
19
+ conceal: RGBA;
20
+ diffAdded: RGBA;
21
+ diffRemoved: RGBA;
22
+ diffAddedBg: RGBA;
23
+ diffRemovedBg: RGBA;
24
+ diffContextBg: RGBA;
25
+ diffAddedLineNumberBg: RGBA;
26
+ diffRemovedLineNumberBg: RGBA;
27
+ diffLineNumber: RGBA;
28
+ background: RGBA;
29
+ backgroundPanel: RGBA;
30
+ markdownText: RGBA;
31
+ markdownHeading: RGBA;
32
+ markdownLink: RGBA;
33
+ markdownLinkText: RGBA;
34
+ markdownCode: RGBA;
35
+ markdownBlockQuote: RGBA;
36
+ markdownEmph: RGBA;
37
+ markdownStrong: RGBA;
38
+ markdownHorizontalRule: RGBA;
39
+ markdownListItem: RGBA;
40
+ markdownListEnumeration: RGBA;
41
+ markdownImage: RGBA;
42
+ markdownImageText: RGBA;
43
+ markdownCodeBlock: RGBA;
44
+ }
45
+ export interface SyntaxThemeStyle {
46
+ fg: RGBA;
47
+ bold?: boolean;
48
+ italic?: boolean;
49
+ underline?: boolean;
50
+ }
51
+ export interface SyntaxTheme {
52
+ [key: string]: SyntaxThemeStyle;
53
+ }
54
+ export declare function getResolvedTheme(name: string, mode?: "dark" | "light"): ResolvedTheme;
55
+ export declare function getSyntaxTheme(name: string, mode?: "dark" | "light", italicsEnabled?: boolean): SyntaxTheme;
56
+ export declare const themeNames: string[];
57
+ export declare const defaultThemeName = "github";
58
+ export declare function rgbaToHex(rgba: RGBA): string;
59
+ //# sourceMappingURL=themes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"AAIA,OAAO,EAAc,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAsBlD,MAAM,WAAW,aAAa;IAE5B,OAAO,EAAE,IAAI,CAAC;IAEd,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IAEX,aAAa,EAAE,IAAI,CAAC;IACpB,aAAa,EAAE,IAAI,CAAC;IACpB,cAAc,EAAE,IAAI,CAAC;IACrB,cAAc,EAAE,IAAI,CAAC;IACrB,YAAY,EAAE,IAAI,CAAC;IACnB,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC;IACjB,cAAc,EAAE,IAAI,CAAC;IACrB,iBAAiB,EAAE,IAAI,CAAC;IAExB,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IAEd,SAAS,EAAE,IAAI,CAAC;IAChB,WAAW,EAAE,IAAI,CAAC;IAElB,WAAW,EAAE,IAAI,CAAC;IAClB,aAAa,EAAE,IAAI,CAAC;IACpB,aAAa,EAAE,IAAI,CAAC;IACpB,qBAAqB,EAAE,IAAI,CAAC;IAC5B,uBAAuB,EAAE,IAAI,CAAC;IAC9B,cAAc,EAAE,IAAI,CAAC;IAErB,UAAU,EAAE,IAAI,CAAC;IACjB,eAAe,EAAE,IAAI,CAAC;IAEtB,YAAY,EAAE,IAAI,CAAC;IACnB,eAAe,EAAE,IAAI,CAAC;IACtB,YAAY,EAAE,IAAI,CAAC;IACnB,gBAAgB,EAAE,IAAI,CAAC;IACvB,YAAY,EAAE,IAAI,CAAC;IACnB,kBAAkB,EAAE,IAAI,CAAC;IACzB,YAAY,EAAE,IAAI,CAAC;IACnB,cAAc,EAAE,IAAI,CAAC;IACrB,sBAAsB,EAAE,IAAI,CAAC;IAC7B,gBAAgB,EAAE,IAAI,CAAC;IACvB,uBAAuB,EAAE,IAAI,CAAC;IAC9B,aAAa,EAAE,IAAI,CAAC;IACpB,iBAAiB,EAAE,IAAI,CAAC;IACxB,iBAAiB,EAAE,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC;CACjC;AAgKD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,GAAG,OAAgB,GAC9B,aAAa,CAGf;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,GAAG,OAAgB,EAC/B,cAAc,GAAE,OAAc,GAC7B,WAAW,CA6Eb;AAED,eAAO,MAAM,UAAU,UAAkC,CAAC;AAE1D,eAAO,MAAM,gBAAgB,WAAW,CAAC;AAGzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAW5C"}
package/dist/themes.js ADDED
@@ -0,0 +1,248 @@
1
+ // Syntax highlighting theme system with 30+ themes from OpenCode.
2
+ // Loads JSON theme files lazily on demand, resolves color references,
3
+ // and provides both UI colors and Tree-sitter compatible syntax styles.
4
+ import { parseColor, RGBA } from "@opentuah/core";
5
+ import path from "path";
6
+ import { fileURLToPath } from "url";
7
+ // Only import the default theme statically for fast startup
8
+ // Other themes are loaded on-demand when selected
9
+ import github from "./themes/github.json";
10
+ // Theme name to file mapping for lazy loading
11
+ const THEME_FILES = {
12
+ aura: "aura.json",
13
+ ayu: "ayu.json",
14
+ catppuccin: "catppuccin.json",
15
+ "catppuccin-frappe": "catppuccin-frappe.json",
16
+ "catppuccin-macchiato": "catppuccin-macchiato.json",
17
+ cobalt2: "cobalt2.json",
18
+ cursor: "cursor.json",
19
+ dracula: "dracula.json",
20
+ everforest: "everforest.json",
21
+ flexoki: "flexoki.json",
22
+ github: "github.json",
23
+ "github-light": "github-light.json",
24
+ gruvbox: "gruvbox.json",
25
+ kanagawa: "kanagawa.json",
26
+ "lucent-orng": "lucent-orng.json",
27
+ material: "material.json",
28
+ matrix: "matrix.json",
29
+ mercury: "mercury.json",
30
+ "muted-slate": "muted-slate.json",
31
+ monokai: "monokai.json",
32
+ nightowl: "nightowl.json",
33
+ nord: "nord.json",
34
+ "one-dark": "one-dark.json",
35
+ opencode: "opencode.json",
36
+ "opencode-light": "opencode-light.json",
37
+ orng: "orng.json",
38
+ palenight: "palenight.json",
39
+ rosepine: "rosepine.json",
40
+ solarized: "solarized.json",
41
+ synthwave84: "synthwave84.json",
42
+ tokyonight: "tokyonight.json",
43
+ vercel: "vercel.json",
44
+ vesper: "vesper.json",
45
+ zenburn: "zenburn.json",
46
+ };
47
+ // Cache for loaded themes
48
+ const themeCache = {
49
+ github, // Pre-loaded default theme
50
+ };
51
+ // Synchronously load a theme (themes are small JSON files)
52
+ function loadTheme(name) {
53
+ if (themeCache[name]) {
54
+ return themeCache[name];
55
+ }
56
+ const fileName = THEME_FILES[name];
57
+ if (!fileName) {
58
+ return github; // Fallback to default
59
+ }
60
+ try {
61
+ // Resolve to src/themes/ — when built, import.meta.url is dist/, so ../src/ gets back to source
62
+ const srcDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../src");
63
+ const themePath = path.resolve(srcDir, "themes", fileName);
64
+ const fs = require("fs");
65
+ const content = fs.readFileSync(themePath, "utf-8");
66
+ const themeJson = JSON.parse(content);
67
+ themeCache[name] = themeJson;
68
+ return themeJson;
69
+ }
70
+ catch {
71
+ return github; // Fallback to default
72
+ }
73
+ }
74
+ function resolveTheme(themeJson, mode) {
75
+ const defs = themeJson.defs ?? {};
76
+ function resolveColor(c) {
77
+ if (typeof c === "string") {
78
+ if (c === "transparent" || c === "none")
79
+ return RGBA.fromInts(0, 0, 0, 0);
80
+ if (c.startsWith("#"))
81
+ return parseColor(c);
82
+ // Reference to defs
83
+ if (defs[c] != null) {
84
+ return resolveColor(defs[c]);
85
+ }
86
+ // Reference to another theme property
87
+ if (themeJson.theme[c] !== undefined) {
88
+ return resolveColor(themeJson.theme[c]);
89
+ }
90
+ // Fallback
91
+ return RGBA.fromInts(128, 128, 128, 255);
92
+ }
93
+ // Variant with dark/light
94
+ return resolveColor(c[mode]);
95
+ }
96
+ const t = themeJson.theme;
97
+ const fallbackGray = "#808080";
98
+ const fallbackBg = "#1e1e1e";
99
+ const fallbackText = "#d4d4d4";
100
+ const text = resolveColor(t.text ?? fallbackText);
101
+ // Fallback colors for status (green, red, yellow, orange)
102
+ const fallbackGreen = "#3fb950";
103
+ const fallbackRed = "#f85149";
104
+ const fallbackYellow = "#e3b341";
105
+ const fallbackOrange = "#d29922";
106
+ return {
107
+ primary: resolveColor(t.primary ?? t.syntaxFunction ?? fallbackGray),
108
+ // Status colors
109
+ success: resolveColor(t.success ?? fallbackGreen),
110
+ error: resolveColor(t.error ?? fallbackRed),
111
+ warning: resolveColor(t.warning ?? fallbackYellow),
112
+ info: resolveColor(t.info ?? fallbackOrange),
113
+ // Syntax colors
114
+ syntaxComment: resolveColor(t.syntaxComment ?? fallbackGray),
115
+ syntaxKeyword: resolveColor(t.syntaxKeyword ?? fallbackGray),
116
+ syntaxFunction: resolveColor(t.syntaxFunction ?? fallbackGray),
117
+ syntaxVariable: resolveColor(t.syntaxVariable ?? fallbackGray),
118
+ syntaxString: resolveColor(t.syntaxString ?? fallbackGray),
119
+ syntaxNumber: resolveColor(t.syntaxNumber ?? fallbackGray),
120
+ syntaxType: resolveColor(t.syntaxType ?? fallbackGray),
121
+ syntaxOperator: resolveColor(t.syntaxOperator ?? fallbackGray),
122
+ syntaxPunctuation: resolveColor(t.syntaxPunctuation ?? fallbackGray),
123
+ text,
124
+ textMuted: resolveColor(t.textMuted ?? fallbackGray),
125
+ conceal: resolveColor(t.conceal ?? t.textMuted ?? fallbackGray),
126
+ // Diff foreground colors
127
+ diffAdded: resolveColor(t.diffAdded ?? t.success ?? fallbackGreen),
128
+ diffRemoved: resolveColor(t.diffRemoved ?? t.error ?? fallbackRed),
129
+ // Diff background colors
130
+ diffAddedBg: resolveColor(t.diffAddedBg ?? "#1e3a1e"),
131
+ diffRemovedBg: resolveColor(t.diffRemovedBg ?? "#3a1e1e"),
132
+ diffContextBg: resolveColor(t.diffContextBg ?? fallbackBg),
133
+ diffAddedLineNumberBg: resolveColor(t.diffAddedLineNumberBg ?? "#1e3a1e"),
134
+ diffRemovedLineNumberBg: resolveColor(t.diffRemovedLineNumberBg ?? "#3a1e1e"),
135
+ diffLineNumber: resolveColor(t.diffLineNumber ?? fallbackGray),
136
+ background: resolveColor(t.background ?? fallbackBg),
137
+ backgroundPanel: resolveColor(t.backgroundPanel ?? fallbackBg),
138
+ // Markdown colors - fallback to text/syntax colors if not defined
139
+ markdownText: resolveColor(t.markdownText ?? t.text ?? fallbackText),
140
+ markdownHeading: resolveColor(t.markdownHeading ?? t.primary ?? fallbackGray),
141
+ markdownLink: resolveColor(t.markdownLink ?? t.syntaxString ?? fallbackGray),
142
+ markdownLinkText: resolveColor(t.markdownLinkText ?? t.primary ?? fallbackGray),
143
+ markdownCode: resolveColor(t.markdownCode ?? t.syntaxString ?? fallbackGray),
144
+ markdownBlockQuote: resolveColor(t.markdownBlockQuote ?? t.syntaxComment ?? fallbackGray),
145
+ markdownEmph: resolveColor(t.markdownEmph ?? t.text ?? fallbackText),
146
+ markdownStrong: resolveColor(t.markdownStrong ?? t.text ?? fallbackText),
147
+ markdownHorizontalRule: resolveColor(t.markdownHorizontalRule ?? fallbackGray),
148
+ markdownListItem: resolveColor(t.markdownListItem ?? t.syntaxKeyword ?? fallbackGray),
149
+ markdownListEnumeration: resolveColor(t.markdownListEnumeration ?? t.syntaxNumber ?? fallbackGray),
150
+ markdownImage: resolveColor(t.markdownImage ?? t.syntaxString ?? fallbackGray),
151
+ markdownImageText: resolveColor(t.markdownImageText ?? t.primary ?? fallbackGray),
152
+ markdownCodeBlock: resolveColor(t.markdownCodeBlock ?? t.text ?? fallbackText),
153
+ };
154
+ }
155
+ export function getResolvedTheme(name, mode = "dark") {
156
+ const themeJson = loadTheme(name);
157
+ return resolveTheme(themeJson, mode);
158
+ }
159
+ export function getSyntaxTheme(name, mode = "dark", italicsEnabled = true) {
160
+ const resolved = getResolvedTheme(name, mode);
161
+ const style = (s) => {
162
+ if (italicsEnabled)
163
+ return s;
164
+ const { italic, ...rest } = s;
165
+ return rest;
166
+ };
167
+ return {
168
+ // Default text style
169
+ default: { fg: resolved.text },
170
+ // Code syntax styles
171
+ keyword: style({ fg: resolved.syntaxKeyword, italic: true }),
172
+ "keyword.import": { fg: resolved.syntaxKeyword },
173
+ "keyword.return": style({ fg: resolved.syntaxKeyword, italic: true }),
174
+ "keyword.conditional": style({ fg: resolved.syntaxKeyword, italic: true }),
175
+ "keyword.repeat": style({ fg: resolved.syntaxKeyword, italic: true }),
176
+ "keyword.type": style({ fg: resolved.syntaxType, bold: true, italic: true }),
177
+ "keyword.function": { fg: resolved.syntaxFunction },
178
+ "keyword.operator": { fg: resolved.syntaxOperator },
179
+ "keyword.modifier": style({ fg: resolved.syntaxKeyword, italic: true }),
180
+ "keyword.exception": style({ fg: resolved.syntaxKeyword, italic: true }),
181
+ string: { fg: resolved.syntaxString },
182
+ symbol: { fg: resolved.syntaxString },
183
+ comment: style({ fg: resolved.syntaxComment, italic: true }),
184
+ "comment.documentation": style({ fg: resolved.syntaxComment, italic: true }),
185
+ number: { fg: resolved.syntaxNumber },
186
+ boolean: { fg: resolved.syntaxNumber },
187
+ constant: { fg: resolved.syntaxNumber },
188
+ function: { fg: resolved.syntaxFunction },
189
+ "function.call": { fg: resolved.syntaxFunction },
190
+ "function.method": { fg: resolved.syntaxFunction },
191
+ "function.method.call": { fg: resolved.syntaxVariable },
192
+ constructor: { fg: resolved.syntaxFunction },
193
+ type: { fg: resolved.syntaxType },
194
+ module: { fg: resolved.syntaxType },
195
+ class: { fg: resolved.syntaxType },
196
+ operator: { fg: resolved.syntaxOperator },
197
+ variable: { fg: resolved.syntaxVariable },
198
+ "variable.parameter": { fg: resolved.syntaxVariable },
199
+ "variable.member": { fg: resolved.syntaxFunction },
200
+ property: { fg: resolved.syntaxVariable },
201
+ parameter: { fg: resolved.syntaxVariable },
202
+ bracket: { fg: resolved.syntaxPunctuation },
203
+ punctuation: { fg: resolved.syntaxPunctuation },
204
+ "punctuation.bracket": { fg: resolved.syntaxPunctuation },
205
+ "punctuation.delimiter": { fg: resolved.syntaxOperator },
206
+ "punctuation.special": { fg: resolved.syntaxOperator },
207
+ // Markdown styles - these are the Tree-sitter scope names for markdown
208
+ "markup.heading": { fg: resolved.markdownHeading, bold: true },
209
+ "markup.heading.1": { fg: resolved.markdownHeading, bold: true },
210
+ "markup.heading.2": { fg: resolved.markdownHeading, bold: true },
211
+ "markup.heading.3": { fg: resolved.markdownHeading, bold: true },
212
+ "markup.heading.4": { fg: resolved.markdownHeading, bold: true },
213
+ "markup.heading.5": { fg: resolved.markdownHeading, bold: true },
214
+ "markup.heading.6": { fg: resolved.markdownHeading, bold: true },
215
+ "markup.bold": { fg: resolved.markdownStrong, bold: true },
216
+ "markup.strong": { fg: resolved.markdownStrong, bold: true },
217
+ "markup.italic": style({ fg: resolved.markdownEmph, italic: true }),
218
+ "markup.list": { fg: resolved.markdownListItem },
219
+ "markup.quote": style({ fg: resolved.markdownBlockQuote, italic: true }),
220
+ "markup.raw": { fg: resolved.markdownCode },
221
+ "markup.raw.block": { fg: resolved.markdownCode },
222
+ "markup.raw.inline": { fg: resolved.markdownCode },
223
+ "markup.link": { fg: resolved.markdownLink, underline: true },
224
+ "markup.link.label": { fg: resolved.markdownLinkText, underline: true },
225
+ "markup.link.url": { fg: resolved.markdownLink, underline: true },
226
+ label: { fg: resolved.markdownLinkText },
227
+ spell: { fg: resolved.text },
228
+ nospell: { fg: resolved.text },
229
+ conceal: { fg: resolved.conceal || resolved.textMuted },
230
+ "string.special": { fg: resolved.markdownLink, underline: true },
231
+ "string.special.url": { fg: resolved.markdownLink, underline: true },
232
+ };
233
+ }
234
+ export const themeNames = Object.keys(THEME_FILES).sort();
235
+ export const defaultThemeName = "github";
236
+ // Helper to convert RGBA to hex string
237
+ export function rgbaToHex(rgba) {
238
+ const r = Math.round(rgba.r * 255)
239
+ .toString(16)
240
+ .padStart(2, "0");
241
+ const g = Math.round(rgba.g * 255)
242
+ .toString(16)
243
+ .padStart(2, "0");
244
+ const b = Math.round(rgba.b * 255)
245
+ .toString(16)
246
+ .padStart(2, "0");
247
+ return `#${r}${g}${b}`;
248
+ }
@@ -0,0 +1,4 @@
1
+ export declare const FOLDER_ICON_CLOSED = "\uDB80\uDE4B";
2
+ export declare const FOLDER_ICON_OPEN = "\uDB81\uDF70";
3
+ export declare function getFileIcon(path: string): string;
4
+ //# sourceMappingURL=tree-icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-icons.d.ts","sourceRoot":"","sources":["../src/tree-icons.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,iBAAO,CAAA;AACtC,eAAO,MAAM,gBAAgB,iBAAO,CAAA;AAapC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhD"}
@@ -0,0 +1,18 @@
1
+ // Tree icon utilities for sidebar file/folder nerd font icons
2
+ // Structured for easy future fallback to ASCII icons
3
+ export const FOLDER_ICON_CLOSED = "󰉋";
4
+ export const FOLDER_ICON_OPEN = "󰝰";
5
+ const extensionToIcon = {
6
+ ts: "󰛦",
7
+ tsx: "󰜈",
8
+ js: "󰌠",
9
+ jsx: "󰜈",
10
+ json: "󰘦",
11
+ md: "󰍔",
12
+ css: "󰌜",
13
+ html: "󰌝",
14
+ };
15
+ export function getFileIcon(path) {
16
+ const ext = path.split(".").pop()?.toLowerCase();
17
+ return ext ? (extensionToIcon[ext] ?? "󰈙") : "󰈙";
18
+ }
@@ -0,0 +1,2 @@
1
+ export declare function debounce<T extends (...args: any[]) => any>(fn: T, delay: number): (...args: Parameters<T>) => void;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAWlC"}
package/dist/utils.js ADDED
@@ -0,0 +1,13 @@
1
+ // General utility functions used across the application.
2
+ // Currently provides debounce for rate-limiting file watcher callbacks.
3
+ export function debounce(fn, delay) {
4
+ let timeoutId;
5
+ return (...args) => {
6
+ if (timeoutId) {
7
+ clearTimeout(timeoutId);
8
+ }
9
+ timeoutId = setTimeout(() => {
10
+ fn(...args);
11
+ }, delay);
12
+ };
13
+ }
@@ -0,0 +1,56 @@
1
+ import type { CapturedFrame, CapturedLine } from "@opentuah/core";
2
+ export interface CaptureOptions {
3
+ cols: number;
4
+ maxRows: number;
5
+ themeName: string;
6
+ title?: string;
7
+ /** Wrap mode for long lines (default: "word") */
8
+ wrapMode?: "word" | "char" | "none";
9
+ /** Force split or unified view mode, bypassing auto-detection */
10
+ viewMode?: "split" | "unified";
11
+ /** Show privacy/expiry notice block at top (default: false, enabled for web uploads) */
12
+ showNotice?: boolean;
13
+ /** How long to wait for async rendering (tree-sitter) to stabilize.
14
+ * Default: 500ms for interactive TUI, use 100ms for batch/web mode. */
15
+ stabilizeMs?: number;
16
+ }
17
+ export declare function renderDiffToFrame(diffContent: string, options: CaptureOptions): Promise<CapturedFrame>;
18
+ /**
19
+ * Convert a file path to a URL-safe anchor slug.
20
+ * e.g. "src/components/foo-bar.tsx" → "src-components-foo-bar-tsx"
21
+ */
22
+ export declare function slugifyFileName(name: string): string;
23
+ /**
24
+ * Extract line numbers from a captured diff line's spans.
25
+ * In split view each row has two line number columns (old + new):
26
+ * " " "29" " - " ...content... " " "29" " + " ...content...
27
+ * In unified view there's only one.
28
+ *
29
+ * Returns the new-file (right) line number when available,
30
+ * falling back to the old-file (left) number for deleted-only rows.
31
+ * Returns null for non-diff lines (headers, hunk markers, etc.).
32
+ */
33
+ export declare function extractLineNumber(line: CapturedLine): string | null;
34
+ /**
35
+ * Match a rendered tree file row and extract the file path label.
36
+ * Examples:
37
+ * "│ ├── index.ts (+5,-2)"
38
+ * "└── README.md (-15)"
39
+ */
40
+ export declare function extractTreeFilePath(lineText: string): string | null;
41
+ /**
42
+ * Build line-indexed anchors from file section layout positions.
43
+ * This avoids regex detection on rendered text, which can produce
44
+ * false positives when code lines mimic file-header patterns.
45
+ */
46
+ export declare function buildAnchorMap(sections: Array<{
47
+ lineIndex: number;
48
+ fileName: string;
49
+ }>): Map<number, {
50
+ id: string;
51
+ label: string;
52
+ }>;
53
+ /**
54
+ * Capture diff and convert to HTML using test renderer
55
+ */
56
+ //# sourceMappingURL=web-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-utils.d.ts","sourceRoot":"","sources":["../src/web-utils.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAiB,aAAa,EAAE,YAAY,EAA+B,MAAM,gBAAgB,CAAA;AAG7G,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IACnC,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC9B,wFAAwF;IACxF,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;4EACwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AA2UD,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAGxB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD;AAYD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAwBnE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAInE;AAUD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GACvD,GAAG,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB5C;AAiCD;;GAEG"}