ai-i18n-tools 1.0.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 (260) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +157 -0
  3. package/dist/api/openrouter.d.ts +115 -0
  4. package/dist/api/openrouter.d.ts.map +1 -0
  5. package/dist/api/openrouter.js +399 -0
  6. package/dist/api/openrouter.js.map +1 -0
  7. package/dist/cli/doc-translate.d.ts +90 -0
  8. package/dist/cli/doc-translate.d.ts.map +1 -0
  9. package/dist/cli/doc-translate.js +1153 -0
  10. package/dist/cli/doc-translate.js.map +1 -0
  11. package/dist/cli/export-ui-xliff.d.ts +32 -0
  12. package/dist/cli/export-ui-xliff.d.ts.map +1 -0
  13. package/dist/cli/export-ui-xliff.js +153 -0
  14. package/dist/cli/export-ui-xliff.js.map +1 -0
  15. package/dist/cli/extract-strings.d.ts +12 -0
  16. package/dist/cli/extract-strings.d.ts.map +1 -0
  17. package/dist/cli/extract-strings.js +80 -0
  18. package/dist/cli/extract-strings.js.map +1 -0
  19. package/dist/cli/file-utils.d.ts +10 -0
  20. package/dist/cli/file-utils.d.ts.map +1 -0
  21. package/dist/cli/file-utils.js +77 -0
  22. package/dist/cli/file-utils.js.map +1 -0
  23. package/dist/cli/format.d.ts +21 -0
  24. package/dist/cli/format.d.ts.map +1 -0
  25. package/dist/cli/format.js +75 -0
  26. package/dist/cli/format.js.map +1 -0
  27. package/dist/cli/helpers.d.ts +27 -0
  28. package/dist/cli/helpers.d.ts.map +1 -0
  29. package/dist/cli/helpers.js +84 -0
  30. package/dist/cli/helpers.js.map +1 -0
  31. package/dist/cli/index.d.ts +3 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/index.js +772 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/cli/log-output.d.ts +13 -0
  36. package/dist/cli/log-output.d.ts.map +1 -0
  37. package/dist/cli/log-output.js +75 -0
  38. package/dist/cli/log-output.js.map +1 -0
  39. package/dist/cli/translate-svg.d.ts +7 -0
  40. package/dist/cli/translate-svg.d.ts.map +1 -0
  41. package/dist/cli/translate-svg.js +167 -0
  42. package/dist/cli/translate-svg.js.map +1 -0
  43. package/dist/cli/translate-ui-strings.d.ts +27 -0
  44. package/dist/cli/translate-ui-strings.d.ts.map +1 -0
  45. package/dist/cli/translate-ui-strings.js +357 -0
  46. package/dist/cli/translate-ui-strings.js.map +1 -0
  47. package/dist/core/cache-tracking-keys.d.ts +12 -0
  48. package/dist/core/cache-tracking-keys.d.ts.map +1 -0
  49. package/dist/core/cache-tracking-keys.js +20 -0
  50. package/dist/core/cache-tracking-keys.js.map +1 -0
  51. package/dist/core/cache.d.ts +153 -0
  52. package/dist/core/cache.d.ts.map +1 -0
  53. package/dist/core/cache.js +546 -0
  54. package/dist/core/cache.js.map +1 -0
  55. package/dist/core/config.d.ts +58 -0
  56. package/dist/core/config.d.ts.map +1 -0
  57. package/dist/core/config.js +392 -0
  58. package/dist/core/config.js.map +1 -0
  59. package/dist/core/doc-file-tracking.d.ts +8 -0
  60. package/dist/core/doc-file-tracking.d.ts.map +1 -0
  61. package/dist/core/doc-file-tracking.js +27 -0
  62. package/dist/core/doc-file-tracking.js.map +1 -0
  63. package/dist/core/errors.d.ts +19 -0
  64. package/dist/core/errors.d.ts.map +1 -0
  65. package/dist/core/errors.js +23 -0
  66. package/dist/core/errors.js.map +1 -0
  67. package/dist/core/locale-utils.d.ts +20 -0
  68. package/dist/core/locale-utils.d.ts.map +1 -0
  69. package/dist/core/locale-utils.js +75 -0
  70. package/dist/core/locale-utils.js.map +1 -0
  71. package/dist/core/output-paths.d.ts +22 -0
  72. package/dist/core/output-paths.d.ts.map +1 -0
  73. package/dist/core/output-paths.js +130 -0
  74. package/dist/core/output-paths.js.map +1 -0
  75. package/dist/core/prompt-builder.d.ts +62 -0
  76. package/dist/core/prompt-builder.d.ts.map +1 -0
  77. package/dist/core/prompt-builder.js +232 -0
  78. package/dist/core/prompt-builder.js.map +1 -0
  79. package/dist/core/prompts.d.ts +27 -0
  80. package/dist/core/prompts.d.ts.map +1 -0
  81. package/dist/core/prompts.js +57 -0
  82. package/dist/core/prompts.js.map +1 -0
  83. package/dist/core/svg-asset-paths.d.ts +40 -0
  84. package/dist/core/svg-asset-paths.d.ts.map +1 -0
  85. package/dist/core/svg-asset-paths.js +107 -0
  86. package/dist/core/svg-asset-paths.js.map +1 -0
  87. package/dist/core/types.d.ts +388 -0
  88. package/dist/core/types.d.ts.map +1 -0
  89. package/dist/core/types.js +265 -0
  90. package/dist/core/types.js.map +1 -0
  91. package/dist/core/ui-languages.d.ts +66 -0
  92. package/dist/core/ui-languages.d.ts.map +1 -0
  93. package/dist/core/ui-languages.js +277 -0
  94. package/dist/core/ui-languages.js.map +1 -0
  95. package/dist/core/user-edited-model.d.ts +3 -0
  96. package/dist/core/user-edited-model.d.ts.map +1 -0
  97. package/dist/core/user-edited-model.js +3 -0
  98. package/dist/core/user-edited-model.js.map +1 -0
  99. package/dist/edit-cache-app/app.js +1326 -0
  100. package/dist/edit-cache-app/index.html +287 -0
  101. package/dist/edit-cache-app/styles.css +664 -0
  102. package/dist/extractors/base-extractor.d.ts +15 -0
  103. package/dist/extractors/base-extractor.d.ts.map +1 -0
  104. package/dist/extractors/base-extractor.js +23 -0
  105. package/dist/extractors/base-extractor.js.map +1 -0
  106. package/dist/extractors/classify-segment.d.ts +6 -0
  107. package/dist/extractors/classify-segment.d.ts.map +1 -0
  108. package/dist/extractors/classify-segment.js +20 -0
  109. package/dist/extractors/classify-segment.js.map +1 -0
  110. package/dist/extractors/json-extractor.d.ts +16 -0
  111. package/dist/extractors/json-extractor.d.ts.map +1 -0
  112. package/dist/extractors/json-extractor.js +128 -0
  113. package/dist/extractors/json-extractor.js.map +1 -0
  114. package/dist/extractors/markdown-extractor.d.ts +15 -0
  115. package/dist/extractors/markdown-extractor.d.ts.map +1 -0
  116. package/dist/extractors/markdown-extractor.js +205 -0
  117. package/dist/extractors/markdown-extractor.js.map +1 -0
  118. package/dist/extractors/svg-extractor.d.ts +19 -0
  119. package/dist/extractors/svg-extractor.d.ts.map +1 -0
  120. package/dist/extractors/svg-extractor.js +132 -0
  121. package/dist/extractors/svg-extractor.js.map +1 -0
  122. package/dist/extractors/ui-string-extractor.d.ts +40 -0
  123. package/dist/extractors/ui-string-extractor.d.ts.map +1 -0
  124. package/dist/extractors/ui-string-extractor.js +146 -0
  125. package/dist/extractors/ui-string-extractor.js.map +1 -0
  126. package/dist/extractors/ui-string-locations.d.ts +23 -0
  127. package/dist/extractors/ui-string-locations.d.ts.map +1 -0
  128. package/dist/extractors/ui-string-locations.js +138 -0
  129. package/dist/extractors/ui-string-locations.js.map +1 -0
  130. package/dist/glossary/glossary.d.ts +34 -0
  131. package/dist/glossary/glossary.d.ts.map +1 -0
  132. package/dist/glossary/glossary.js +260 -0
  133. package/dist/glossary/glossary.js.map +1 -0
  134. package/dist/glossary/matcher.d.ts +10 -0
  135. package/dist/glossary/matcher.d.ts.map +1 -0
  136. package/dist/glossary/matcher.js +12 -0
  137. package/dist/glossary/matcher.js.map +1 -0
  138. package/dist/index.d.ts +44 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +44 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/processors/admonition-placeholders.d.ts +8 -0
  143. package/dist/processors/admonition-placeholders.d.ts.map +1 -0
  144. package/dist/processors/admonition-placeholders.js +59 -0
  145. package/dist/processors/admonition-placeholders.js.map +1 -0
  146. package/dist/processors/anchor-placeholders.d.ts +8 -0
  147. package/dist/processors/anchor-placeholders.d.ts.map +1 -0
  148. package/dist/processors/anchor-placeholders.js +37 -0
  149. package/dist/processors/anchor-placeholders.js.map +1 -0
  150. package/dist/processors/batch-processor.d.ts +10 -0
  151. package/dist/processors/batch-processor.d.ts.map +1 -0
  152. package/dist/processors/batch-processor.js +33 -0
  153. package/dist/processors/batch-processor.js.map +1 -0
  154. package/dist/processors/bold-code-placeholders.d.ts +14 -0
  155. package/dist/processors/bold-code-placeholders.d.ts.map +1 -0
  156. package/dist/processors/bold-code-placeholders.js +116 -0
  157. package/dist/processors/bold-code-placeholders.js.map +1 -0
  158. package/dist/processors/doc-postprocess.d.ts +51 -0
  159. package/dist/processors/doc-postprocess.d.ts.map +1 -0
  160. package/dist/processors/doc-postprocess.js +215 -0
  161. package/dist/processors/doc-postprocess.js.map +1 -0
  162. package/dist/processors/emphasis-placeholders.d.ts +6 -0
  163. package/dist/processors/emphasis-placeholders.d.ts.map +1 -0
  164. package/dist/processors/emphasis-placeholders.js +262 -0
  165. package/dist/processors/emphasis-placeholders.js.map +1 -0
  166. package/dist/processors/flat-link-rewrite.d.ts +32 -0
  167. package/dist/processors/flat-link-rewrite.d.ts.map +1 -0
  168. package/dist/processors/flat-link-rewrite.js +90 -0
  169. package/dist/processors/flat-link-rewrite.js.map +1 -0
  170. package/dist/processors/glossary-force-placeholders.d.ts +12 -0
  171. package/dist/processors/glossary-force-placeholders.d.ts.map +1 -0
  172. package/dist/processors/glossary-force-placeholders.js +58 -0
  173. package/dist/processors/glossary-force-placeholders.js.map +1 -0
  174. package/dist/processors/inline-code-placeholders.d.ts +11 -0
  175. package/dist/processors/inline-code-placeholders.d.ts.map +1 -0
  176. package/dist/processors/inline-code-placeholders.js +87 -0
  177. package/dist/processors/inline-code-placeholders.js.map +1 -0
  178. package/dist/processors/placeholder-handler.d.ts +38 -0
  179. package/dist/processors/placeholder-handler.d.ts.map +1 -0
  180. package/dist/processors/placeholder-handler.js +55 -0
  181. package/dist/processors/placeholder-handler.js.map +1 -0
  182. package/dist/processors/translation-placeholder-leaks.d.ts +2 -0
  183. package/dist/processors/translation-placeholder-leaks.d.ts.map +1 -0
  184. package/dist/processors/translation-placeholder-leaks.js +9 -0
  185. package/dist/processors/translation-placeholder-leaks.js.map +1 -0
  186. package/dist/processors/url-placeholders.d.ts +10 -0
  187. package/dist/processors/url-placeholders.d.ts.map +1 -0
  188. package/dist/processors/url-placeholders.js +29 -0
  189. package/dist/processors/url-placeholders.js.map +1 -0
  190. package/dist/processors/validator.d.ts +23 -0
  191. package/dist/processors/validator.d.ts.map +1 -0
  192. package/dist/processors/validator.js +186 -0
  193. package/dist/processors/validator.js.map +1 -0
  194. package/dist/runtime/i18next-helpers.d.ts +146 -0
  195. package/dist/runtime/i18next-helpers.d.ts.map +1 -0
  196. package/dist/runtime/i18next-helpers.js +192 -0
  197. package/dist/runtime/i18next-helpers.js.map +1 -0
  198. package/dist/runtime/index.d.ts +4 -0
  199. package/dist/runtime/index.d.ts.map +1 -0
  200. package/dist/runtime/index.js +4 -0
  201. package/dist/runtime/index.js.map +1 -0
  202. package/dist/runtime/template.d.ts +21 -0
  203. package/dist/runtime/template.d.ts.map +1 -0
  204. package/dist/runtime/template.js +28 -0
  205. package/dist/runtime/template.js.map +1 -0
  206. package/dist/runtime/ui-language-display.d.ts +16 -0
  207. package/dist/runtime/ui-language-display.d.ts.map +1 -0
  208. package/dist/runtime/ui-language-display.js +26 -0
  209. package/dist/runtime/ui-language-display.js.map +1 -0
  210. package/dist/server/translation-editor.d.ts +25 -0
  211. package/dist/server/translation-editor.d.ts.map +1 -0
  212. package/dist/server/translation-editor.js +583 -0
  213. package/dist/server/translation-editor.js.map +1 -0
  214. package/dist/utils/concurrency.d.ts +31 -0
  215. package/dist/utils/concurrency.d.ts.map +1 -0
  216. package/dist/utils/concurrency.js +103 -0
  217. package/dist/utils/concurrency.js.map +1 -0
  218. package/dist/utils/hash.d.ts +5 -0
  219. package/dist/utils/hash.d.ts.map +1 -0
  220. package/dist/utils/hash.js +9 -0
  221. package/dist/utils/hash.js.map +1 -0
  222. package/dist/utils/ignore-parser.d.ts +7 -0
  223. package/dist/utils/ignore-parser.d.ts.map +1 -0
  224. package/dist/utils/ignore-parser.js +26 -0
  225. package/dist/utils/ignore-parser.js.map +1 -0
  226. package/dist/utils/logger.d.ts +45 -0
  227. package/dist/utils/logger.d.ts.map +1 -0
  228. package/dist/utils/logger.js +158 -0
  229. package/dist/utils/logger.js.map +1 -0
  230. package/docs/GETTING_STARTED.md +697 -0
  231. package/docs/PACKAGE_OVERVIEW.md +427 -0
  232. package/docs/ai-i18n-tools-context.md +481 -0
  233. package/package.json +117 -0
  234. package/translated-docs/README.de.md +157 -0
  235. package/translated-docs/README.es.md +157 -0
  236. package/translated-docs/README.fr.md +157 -0
  237. package/translated-docs/README.hi.md +157 -0
  238. package/translated-docs/README.ja.md +157 -0
  239. package/translated-docs/README.ko.md +157 -0
  240. package/translated-docs/README.pt-BR.md +157 -0
  241. package/translated-docs/README.zh-CN.md +157 -0
  242. package/translated-docs/README.zh-TW.md +157 -0
  243. package/translated-docs/docs/GETTING_STARTED.de.md +682 -0
  244. package/translated-docs/docs/GETTING_STARTED.es.md +682 -0
  245. package/translated-docs/docs/GETTING_STARTED.fr.md +682 -0
  246. package/translated-docs/docs/GETTING_STARTED.hi.md +682 -0
  247. package/translated-docs/docs/GETTING_STARTED.ja.md +682 -0
  248. package/translated-docs/docs/GETTING_STARTED.ko.md +682 -0
  249. package/translated-docs/docs/GETTING_STARTED.pt-BR.md +682 -0
  250. package/translated-docs/docs/GETTING_STARTED.zh-CN.md +682 -0
  251. package/translated-docs/docs/GETTING_STARTED.zh-TW.md +682 -0
  252. package/translated-docs/docs/PACKAGE_OVERVIEW.de.md +428 -0
  253. package/translated-docs/docs/PACKAGE_OVERVIEW.es.md +428 -0
  254. package/translated-docs/docs/PACKAGE_OVERVIEW.fr.md +428 -0
  255. package/translated-docs/docs/PACKAGE_OVERVIEW.hi.md +428 -0
  256. package/translated-docs/docs/PACKAGE_OVERVIEW.ja.md +428 -0
  257. package/translated-docs/docs/PACKAGE_OVERVIEW.ko.md +428 -0
  258. package/translated-docs/docs/PACKAGE_OVERVIEW.pt-BR.md +428 -0
  259. package/translated-docs/docs/PACKAGE_OVERVIEW.zh-CN.md +428 -0
  260. package/translated-docs/docs/PACKAGE_OVERVIEW.zh-TW.md +428 -0
@@ -0,0 +1,664 @@
1
+ :root {
2
+ --bg-page: #1a1a1a;
3
+ --bg-card: #161B22;
4
+ --bg-input: #2d2d2d;
5
+ --text-primary: #e0e0e0;
6
+ --text-secondary: #a0a0a0;
7
+ --border: #404040;
8
+ --accent: #4a9eff;
9
+ --accent-hover: #6bb3ff;
10
+ --danger: #e74c3c;
11
+ --danger-hover: #ec7063;
12
+ }
13
+
14
+ * {
15
+ box-sizing: border-box;
16
+ }
17
+
18
+ body {
19
+ margin: 0;
20
+ padding: 0;
21
+ font-family: system-ui, -apple-system, sans-serif;
22
+ background: var(--bg-page);
23
+ color: var(--text-primary);
24
+ line-height: 1.5;
25
+ min-height: 100vh;
26
+ }
27
+
28
+ .page {
29
+ min-height: 100vh;
30
+ display: flex;
31
+ flex-direction: column;
32
+ }
33
+
34
+ .top {
35
+ padding: 1rem 1.25rem;
36
+ border-bottom: 1px solid var(--border);
37
+ background: #161b22;
38
+ }
39
+ .top-bar {
40
+ display: flex;
41
+ align-items: flex-start;
42
+ justify-content: space-between;
43
+ gap: 1rem;
44
+ margin-bottom: 0.75rem;
45
+ }
46
+ .top h1 {
47
+ margin: 0;
48
+ font-size: 1.1rem;
49
+ font-weight: 600;
50
+ flex: 1;
51
+ min-width: 0;
52
+ }
53
+ .top-github-brand {
54
+ flex-shrink: 0;
55
+ display: inline-flex;
56
+ flex-direction: column;
57
+ align-items: center;
58
+ justify-content: flex-start;
59
+ gap: 0.2rem;
60
+ text-decoration: none;
61
+ color: var(--text-secondary);
62
+ }
63
+ .top-github-brand:hover {
64
+ color: var(--accent);
65
+ }
66
+ .top-github-brand:focus-visible {
67
+ outline: 2px solid var(--accent);
68
+ outline-offset: 2px;
69
+ border-radius: 4px;
70
+ }
71
+ .top-github-icon {
72
+ display: block;
73
+ line-height: 0;
74
+ }
75
+ .top-github-repo {
76
+ display: block;
77
+ font-size: 0.65rem;
78
+ line-height: 1.2;
79
+ text-align: center;
80
+ white-space: nowrap;
81
+ }
82
+
83
+ .site-footer {
84
+ margin-top: auto;
85
+ padding: 0.75rem 1.25rem;
86
+ border-top: 1px solid var(--border);
87
+ background: #161b22;
88
+ text-align: center;
89
+ }
90
+ .site-footer p {
91
+ margin: 0;
92
+ font-size: 0.65rem;
93
+ color: var(--text-secondary);
94
+ }
95
+ .tabs button {
96
+ background: transparent;
97
+ border: 1px solid var(--border);
98
+ color: var(--text-secondary);
99
+ padding: 0.35rem 0.75rem;
100
+ margin-right: 0.35rem;
101
+ border-radius: 6px;
102
+ cursor: pointer;
103
+ }
104
+ .tabs button.active {
105
+ color: var(--accent);
106
+ border-color: var(--accent);
107
+ }
108
+
109
+ main {
110
+ flex: 1 0 auto;
111
+ max-width: 1600px;
112
+ margin: 0 auto;
113
+ padding: 1rem 1.25rem 2rem;
114
+ width: 100%;
115
+ }
116
+
117
+ .panel {
118
+ display: none;
119
+ }
120
+ .panel.active {
121
+ display: block;
122
+ }
123
+
124
+ .hint {
125
+ color: var(--text-secondary);
126
+ font-size: 0.9rem;
127
+ margin: 0 0 1rem;
128
+ }
129
+
130
+ #panel-glossary .gl-meta-row {
131
+ margin-bottom: 1rem;
132
+ }
133
+ #panel-glossary .gl-meta-row .hint {
134
+ display: inline;
135
+ margin: 0;
136
+ vertical-align: baseline;
137
+ }
138
+ #panel-glossary .gl-meta-row .status {
139
+ display: inline-block;
140
+ margin: 0 0 0 0.5rem;
141
+ vertical-align: baseline;
142
+ text-align: left;
143
+ }
144
+
145
+ .container-inner {
146
+ max-width: 1600px;
147
+ }
148
+
149
+ .filters {
150
+ margin-bottom: 1rem;
151
+ }
152
+ .filters.seg-filters {
153
+ display: flex;
154
+ flex-direction: column;
155
+ gap: 0.5rem;
156
+ }
157
+ .filter-row-seg-primary select#seg-filter-filepath-select {
158
+ flex: 0 1 420px;
159
+ min-width: 180px;
160
+ max-width: 420px;
161
+ }
162
+ .filter-row-ui-primary input[type="text"]#ui-filter-filename {
163
+ flex: 1 1 160px;
164
+ min-width: 140px;
165
+ max-width: none;
166
+ width: 0;
167
+ }
168
+ .filter-row-ui-primary input[type="text"]#ui-filter-id {
169
+ max-width: 100px;
170
+ }
171
+ .filter-row-ui-primary select#ui-filter-filepath-select {
172
+ flex: 0 0 auto;
173
+ width: max-content;
174
+ max-width: 100%;
175
+ }
176
+ .filter-row-ui-primary select#ui-filter-model {
177
+ flex: 0 1 280px;
178
+ min-width: 8rem;
179
+ max-width: min(420px, 45vw);
180
+ }
181
+ .filter-row-seg-primary select#seg-filter-locale {
182
+ flex: 0 1 auto;
183
+ min-width: 7.5rem;
184
+ }
185
+ .filter-row-seg-primary select#seg-filter-model {
186
+ flex: 0 1 280px;
187
+ min-width: 8rem;
188
+ max-width: min(420px, 45vw);
189
+ }
190
+ .filter-row-seg-primary input[type="text"]#seg-filter-filename {
191
+ flex: 1 1 160px;
192
+ min-width: 140px;
193
+ max-width: none;
194
+ width: 0;
195
+ }
196
+ .filter-row-seg-primary-actions {
197
+ display: flex;
198
+ flex-wrap: wrap;
199
+ align-items: center;
200
+ gap: 0.5rem;
201
+ margin-left: auto;
202
+ }
203
+ .filter-row-seg-primary-actions select#seg-filter-last-hit {
204
+ min-width: 9.5rem;
205
+ }
206
+ .filter-row-seg-secondary input[type="text"]#seg-filter-translated-text {
207
+ flex: 1 1 200px;
208
+ min-width: 160px;
209
+ max-width: 560px;
210
+ }
211
+ .filter-row-seg-secondary .seg-btn-delete-filtered {
212
+ margin-left: auto;
213
+ }
214
+ .filter-row {
215
+ display: flex;
216
+ flex-wrap: wrap;
217
+ gap: 0.5rem;
218
+ align-items: center;
219
+ }
220
+ .filter-row input[type="text"] {
221
+ flex: 1;
222
+ min-width: 100px;
223
+ padding: 0.5rem 0.75rem;
224
+ background: var(--bg-input);
225
+ border: 1px solid var(--border);
226
+ border-radius: 4px;
227
+ color: var(--text-primary);
228
+ font-size: 0.9rem;
229
+ }
230
+ .filter-row input:focus {
231
+ outline: none;
232
+ border-color: var(--accent);
233
+ }
234
+ .filter-row select {
235
+ min-width: 100px;
236
+ padding: 0.5rem 0.75rem;
237
+ background: var(--bg-input);
238
+ border: 1px solid var(--border);
239
+ border-radius: 4px;
240
+ color: var(--text-primary);
241
+ font-size: 0.9rem;
242
+ }
243
+ .filter-row .filter-stale-label {
244
+ display: inline-flex;
245
+ align-items: center;
246
+ gap: 0.25rem;
247
+ white-space: nowrap;
248
+ cursor: pointer;
249
+ color: var(--text-secondary);
250
+ font-size: 0.9rem;
251
+ }
252
+ .filter-row button {
253
+ padding: 0.5rem 1rem;
254
+ background: var(--accent);
255
+ color: #fff;
256
+ border: none;
257
+ border-radius: 4px;
258
+ cursor: pointer;
259
+ font-size: 0.9rem;
260
+ }
261
+ .filter-row button:hover {
262
+ background: var(--accent-hover);
263
+ }
264
+ .filter-row button.seg-btn-clear {
265
+ background: var(--bg-input);
266
+ border: 1px solid var(--border);
267
+ color: var(--text-primary);
268
+ }
269
+ .filter-row button.seg-btn-clear:hover {
270
+ background: var(--border);
271
+ }
272
+ .filter-row button.seg-btn-delete-filtered {
273
+ background: var(--danger);
274
+ }
275
+ .filter-row button.seg-btn-delete-filtered:hover {
276
+ background: var(--danger-hover);
277
+ }
278
+
279
+ .delete-by-filepath {
280
+ display: flex;
281
+ flex-wrap: wrap;
282
+ gap: 0.5rem;
283
+ align-items: center;
284
+ margin-bottom: 1rem;
285
+ }
286
+ .delete-by-filepath label {
287
+ color: var(--text-secondary);
288
+ font-size: 0.9rem;
289
+ }
290
+ .delete-by-filepath select {
291
+ min-width: 240px;
292
+ padding: 0.5rem 0.75rem;
293
+ background: var(--bg-input);
294
+ border: 1px solid var(--border);
295
+ border-radius: 4px;
296
+ color: var(--text-primary);
297
+ }
298
+ .delete-by-filepath button {
299
+ padding: 0.5rem 1rem;
300
+ background: var(--danger);
301
+ color: #fff;
302
+ border: none;
303
+ border-radius: 4px;
304
+ cursor: pointer;
305
+ font-size: 0.9rem;
306
+ }
307
+ .delete-by-filepath button:hover:not(:disabled) {
308
+ background: var(--danger-hover);
309
+ }
310
+ .delete-by-filepath button:disabled {
311
+ opacity: 0.5;
312
+ cursor: not-allowed;
313
+ }
314
+
315
+ .pagination-top,
316
+ .pagination-bottom {
317
+ display: flex;
318
+ flex-wrap: wrap;
319
+ justify-content: space-between;
320
+ align-items: center;
321
+ gap: 1rem;
322
+ margin-bottom: 1rem;
323
+ }
324
+ .pagination-controls {
325
+ display: flex;
326
+ align-items: center;
327
+ gap: 0.75rem;
328
+ }
329
+ .pagination-controls button {
330
+ padding: 0.4rem 0.8rem;
331
+ background: var(--bg-input);
332
+ border: 1px solid var(--border);
333
+ border-radius: 4px;
334
+ color: var(--text-primary);
335
+ cursor: pointer;
336
+ font-size: 0.85rem;
337
+ }
338
+ .pagination-controls button:hover:not(:disabled) {
339
+ background: var(--border);
340
+ }
341
+ .pagination-controls button:disabled {
342
+ opacity: 0.5;
343
+ cursor: not-allowed;
344
+ }
345
+ .pagination-controls select {
346
+ padding: 0.4rem 0.6rem;
347
+ background: var(--bg-input);
348
+ border: 1px solid var(--border);
349
+ border-radius: 4px;
350
+ color: var(--text-primary);
351
+ font-size: 0.85rem;
352
+ }
353
+ #seg-pagination-info,
354
+ #seg-pagination-info-bottom,
355
+ #ui-pagination-info,
356
+ #ui-pagination-info-bottom,
357
+ #gl-pagination-info,
358
+ #gl-pagination-info-bottom {
359
+ color: var(--text-secondary);
360
+ font-size: 0.9rem;
361
+ }
362
+
363
+ .table-wrapper {
364
+ overflow-x: auto;
365
+ margin-bottom: 1rem;
366
+ border: 1px solid var(--border);
367
+ border-radius: 4px;
368
+ background: var(--bg-card);
369
+ }
370
+ table {
371
+ width: 100%;
372
+ border-collapse: collapse;
373
+ }
374
+ th {
375
+ text-align: left;
376
+ padding: 0.75rem 1rem;
377
+ background: var(--bg-input);
378
+ border-bottom: 1px solid var(--border);
379
+ font-weight: 600;
380
+ font-size: 0.85rem;
381
+ white-space: nowrap;
382
+ }
383
+ td {
384
+ padding: 0.6rem 1rem;
385
+ border-bottom: 1px solid var(--border);
386
+ font-size: 0.9rem;
387
+ vertical-align: top;
388
+ }
389
+ tr:last-child td {
390
+ border-bottom: none;
391
+ }
392
+ tr:hover td {
393
+ background: rgba(255, 255, 255, 0.02);
394
+ }
395
+ td.source-text,
396
+ td.translated-text {
397
+ max-width: 240px;
398
+ word-break: break-word;
399
+ }
400
+ td.actions {
401
+ white-space: nowrap;
402
+ }
403
+ td.last-hit-at {
404
+ font-size: 0.85rem;
405
+ color: var(--text-secondary);
406
+ }
407
+ td.last-hit-at.stale {
408
+ color: var(--danger);
409
+ }
410
+
411
+ .icon-btn {
412
+ display: inline-flex;
413
+ align-items: center;
414
+ justify-content: center;
415
+ width: 28px;
416
+ height: 28px;
417
+ padding: 0;
418
+ margin: 0 2px;
419
+ background: transparent;
420
+ border: 1px solid var(--border);
421
+ border-radius: 4px;
422
+ color: var(--text-primary);
423
+ cursor: pointer;
424
+ font-size: 0.9rem;
425
+ }
426
+ .icon-btn:hover {
427
+ background: var(--border);
428
+ color: var(--accent);
429
+ }
430
+ .icon-btn.delete-btn:hover {
431
+ color: var(--danger);
432
+ }
433
+
434
+ .modal-overlay {
435
+ position: fixed;
436
+ inset: 0;
437
+ background: rgba(0, 0, 0, 0.7);
438
+ display: flex;
439
+ align-items: center;
440
+ justify-content: center;
441
+ z-index: 1000;
442
+ }
443
+ .modal-overlay.hidden {
444
+ display: none;
445
+ }
446
+ #ui-modal-overlay {
447
+ z-index: 1001;
448
+ }
449
+ .modal {
450
+ background: var(--bg-card);
451
+ border: 1px solid var(--border);
452
+ border-radius: 8px;
453
+ padding: 1.5rem;
454
+ max-width: 560px;
455
+ width: 90%;
456
+ }
457
+ .modal h2 {
458
+ margin: 0 0 1rem;
459
+ font-size: 1.1rem;
460
+ }
461
+ .modal textarea {
462
+ width: 100%;
463
+ padding: 0.75rem;
464
+ background: var(--bg-input);
465
+ border: 1px solid var(--border);
466
+ border-radius: 4px;
467
+ color: var(--text-primary);
468
+ font-size: 0.9rem;
469
+ font-family: inherit;
470
+ resize: vertical;
471
+ min-height: 8rem;
472
+ }
473
+ .modal textarea:focus {
474
+ outline: none;
475
+ border-color: var(--accent);
476
+ }
477
+ .modal-actions {
478
+ display: flex;
479
+ justify-content: flex-end;
480
+ gap: 0.5rem;
481
+ margin-top: 1rem;
482
+ }
483
+ .modal-actions button {
484
+ padding: 0.5rem 1rem;
485
+ border-radius: 4px;
486
+ font-size: 0.9rem;
487
+ cursor: pointer;
488
+ }
489
+ .modal-actions .btn-cancel {
490
+ background: var(--bg-input);
491
+ border: 1px solid var(--border);
492
+ color: var(--text-primary);
493
+ }
494
+ .modal-actions .btn-save {
495
+ background: var(--accent);
496
+ border: none;
497
+ color: #fff;
498
+ }
499
+
500
+ .status {
501
+ min-height: 1.25rem;
502
+ color: #d29922;
503
+ font-size: 0.85rem;
504
+ margin: 0.25rem 0;
505
+ }
506
+ .status.ok {
507
+ color: #3fb950;
508
+ }
509
+
510
+ .row-add {
511
+ display: flex;
512
+ flex-wrap: wrap;
513
+ gap: 0.5rem;
514
+ align-items: center;
515
+ margin-bottom: 1rem;
516
+ }
517
+ #gl-add-row {
518
+ width: fit-content;
519
+ max-width: 100%;
520
+ box-sizing: border-box;
521
+ border: 1px solid var(--border);
522
+ border-radius: 8px;
523
+ background: var(--bg-card);
524
+ padding: 0.5rem 0.75rem;
525
+ }
526
+ #gl-add-row select#gl-new-locale {
527
+ min-width: 11rem;
528
+ }
529
+ .row-add input,
530
+ .row-add select {
531
+ padding: 0.4rem 0.6rem;
532
+ background: var(--bg-input);
533
+ border: 1px solid var(--border);
534
+ border-radius: 4px;
535
+ color: var(--text-primary);
536
+ font-size: 0.85rem;
537
+ }
538
+ .row-add button {
539
+ padding: 0.4rem 0.75rem;
540
+ background: #238636;
541
+ border: none;
542
+ color: #fff;
543
+ border-radius: 4px;
544
+ cursor: pointer;
545
+ }
546
+
547
+ .grid-inline input,
548
+ .grid-inline select {
549
+ width: 100%;
550
+ min-width: 4rem;
551
+ padding: 0.35rem 0.5rem;
552
+ background: var(--bg-input);
553
+ border: 1px solid var(--border);
554
+ border-radius: 4px;
555
+ color: var(--text-primary);
556
+ font-size: 0.85rem;
557
+ }
558
+ .grid-inline .btn-small {
559
+ font-size: 0.75rem;
560
+ padding: 0.25rem 0.5rem;
561
+ margin-right: 0.25rem;
562
+ border-radius: 4px;
563
+ cursor: pointer;
564
+ border: 1px solid var(--border);
565
+ background: var(--bg-input);
566
+ color: var(--accent);
567
+ }
568
+ .grid-inline .btn-delete {
569
+ color: var(--danger);
570
+ }
571
+
572
+ .hidden-ui {
573
+ display: none !important;
574
+ }
575
+
576
+ /* Statistics tab */
577
+ #panel-stats .stats-grid {
578
+ display: grid;
579
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
580
+ gap: 2rem;
581
+ align-items: start;
582
+ }
583
+ #panel-stats .stats-column {
584
+ display: flex;
585
+ flex-direction: column;
586
+ gap: 2rem;
587
+ }
588
+ #panel-stats .stats-section {
589
+ padding-bottom: 1.5rem;
590
+ border-bottom: 1px solid var(--border);
591
+ }
592
+ #panel-stats .stats-section:last-child {
593
+ border-bottom: none;
594
+ margin-bottom: 0;
595
+ padding-bottom: 0;
596
+ }
597
+ #panel-stats .stats-section-title {
598
+ margin: 0 0 1rem;
599
+ font-size: 1rem;
600
+ font-weight: 600;
601
+ color: var(--text-primary);
602
+ }
603
+ #panel-stats .stats-subtitle {
604
+ margin: 1.25rem 0 0.5rem;
605
+ font-size: 0.9rem;
606
+ font-weight: 600;
607
+ color: var(--text-secondary);
608
+ }
609
+ #panel-stats .stats-cards {
610
+ display: flex;
611
+ flex-wrap: wrap;
612
+ gap: 0.75rem;
613
+ margin-bottom: 1.25rem;
614
+ }
615
+ #panel-stats .stats-card {
616
+ background: var(--bg-card);
617
+ border: 1px solid var(--border);
618
+ border-radius: 8px;
619
+ padding: 0.75rem 1rem;
620
+ min-width: 7rem;
621
+ display: flex;
622
+ flex-direction: column;
623
+ gap: 0.25rem;
624
+ }
625
+ #panel-stats .stats-card-value {
626
+ font-size: 1.35rem;
627
+ font-weight: 600;
628
+ color: var(--accent);
629
+ line-height: 1.2;
630
+ }
631
+ #panel-stats .stats-card-label {
632
+ font-size: 0.75rem;
633
+ color: var(--text-secondary);
634
+ text-transform: uppercase;
635
+ letter-spacing: 0.02em;
636
+ }
637
+ #panel-stats .stats-table {
638
+ width: 100%;
639
+ max-width: 720px;
640
+ border-collapse: collapse;
641
+ font-size: 0.85rem;
642
+ }
643
+ #panel-stats .stats-table th,
644
+ #panel-stats .stats-table td {
645
+ border: 1px solid var(--border);
646
+ padding: 0.45rem 0.65rem;
647
+ text-align: left;
648
+ }
649
+ #panel-stats .stats-table thead {
650
+ background: var(--bg-card);
651
+ color: var(--text-secondary);
652
+ }
653
+ #panel-stats .stats-table tfoot {
654
+ border-top: 2px solid var(--border);
655
+ }
656
+ #panel-stats .stats-table tfoot th,
657
+ #panel-stats .stats-table tfoot td {
658
+ font-weight: 600;
659
+ color: var(--text-primary);
660
+ background: var(--bg-card);
661
+ }
662
+ #panel-stats .stats-unavailable {
663
+ margin: 0;
664
+ }
@@ -0,0 +1,15 @@
1
+ import type { ContentExtractor, Segment, SegmentTranslationMapValue } from "../core/types.js";
2
+ /**
3
+ * Shared helpers for content extractors (doc hash = SHA-256 prefix, same as {@link TranslationCache}).
4
+ */
5
+ export declare abstract class BaseExtractor implements ContentExtractor {
6
+ abstract readonly name: string;
7
+ abstract canHandle(filepath: string): boolean;
8
+ abstract extract(content: string, filepath: string): Segment[];
9
+ abstract reassemble(segments: Segment[], translations: Map<string, SegmentTranslationMapValue>): string;
10
+ protected computeHash(content: string): string;
11
+ protected normalizeWhitespace(text: string): string;
12
+ /** Apply translations by segment hash; non-translatable segments keep original content. */
13
+ protected mergeTranslations(segments: Segment[], translations: Map<string, SegmentTranslationMapValue>): Segment[];
14
+ }
15
+ //# sourceMappingURL=base-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-extractor.d.ts","sourceRoot":"","sources":["../../src/extractors/base-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAI9F;;GAEG;AACH,8BAAsB,aAAc,YAAW,gBAAgB;IAC7D,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAC7C,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE;IAC9D,QAAQ,CAAC,UAAU,CACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,GACpD,MAAM;IAET,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI9C,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAInD,2FAA2F;IAC3F,SAAS,CAAC,iBAAiB,CACzB,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,GACpD,OAAO,EAAE;CAQb"}
@@ -0,0 +1,23 @@
1
+ import { segmentTranslationText } from "../core/types.js";
2
+ import { computeSegmentHash } from "../utils/hash.js";
3
+ /**
4
+ * Shared helpers for content extractors (doc hash = SHA-256 prefix, same as {@link TranslationCache}).
5
+ */
6
+ export class BaseExtractor {
7
+ computeHash(content) {
8
+ return computeSegmentHash(content);
9
+ }
10
+ normalizeWhitespace(text) {
11
+ return text.replace(/\s+/g, " ").trim();
12
+ }
13
+ /** Apply translations by segment hash; non-translatable segments keep original content. */
14
+ mergeTranslations(segments, translations) {
15
+ return segments.map((s) => ({
16
+ ...s,
17
+ content: s.translatable
18
+ ? (segmentTranslationText(translations.get(s.hash)) ?? s.content)
19
+ : s.content,
20
+ }));
21
+ }
22
+ }
23
+ //# sourceMappingURL=base-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-extractor.js","sourceRoot":"","sources":["../../src/extractors/base-extractor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;GAEG;AACH,MAAM,OAAgB,aAAa;IASvB,WAAW,CAAC,OAAe;QACnC,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAES,mBAAmB,CAAC,IAAY;QACxC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,2FAA2F;IACjF,iBAAiB,CACzB,QAAmB,EACnB,YAAqD;QAErD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1B,GAAG,CAAC;YACJ,OAAO,EAAE,CAAC,CAAC,YAAY;gBACrB,CAAC,CAAC,CAAC,sBAAsB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;gBACjE,CAAC,CAAC,CAAC,CAAC,OAAO;SACd,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { SegmentType } from "../core/types.js";
2
+ /**
3
+ * Lightweight line/block classifier (plan §2.3 reference). For full markdown splitting use {@link MarkdownExtractor}.
4
+ */
5
+ export declare function classifySegmentType(text: string): SegmentType;
6
+ //# sourceMappingURL=classify-segment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-segment.d.ts","sourceRoot":"","sources":["../../src/extractors/classify-segment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAe7D"}