jtcsv 3.0.0 → 3.1.1

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 (258) hide show
  1. package/README.md +205 -146
  2. package/bin/jtcsv.ts +280 -202
  3. package/browser.d.ts +142 -0
  4. package/dist/benchmark.js +446 -0
  5. package/dist/benchmark.js.map +1 -0
  6. package/dist/bin/jtcsv.js +1940 -0
  7. package/dist/bin/jtcsv.js.map +1 -0
  8. package/dist/csv-to-json.js +1261 -0
  9. package/dist/csv-to-json.js.map +1 -0
  10. package/dist/errors.js +291 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/eslint.config.js +147 -0
  13. package/dist/eslint.config.js.map +1 -0
  14. package/dist/index-core.js +95 -0
  15. package/dist/index-core.js.map +1 -0
  16. package/dist/index.js +93 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/json-save.js +229 -0
  19. package/dist/json-save.js.map +1 -0
  20. package/dist/json-to-csv.js +576 -0
  21. package/dist/json-to-csv.js.map +1 -0
  22. package/dist/jtcsv-core.cjs.js +336 -7
  23. package/dist/jtcsv-core.cjs.js.map +1 -1
  24. package/dist/jtcsv-core.esm.js +336 -7
  25. package/dist/jtcsv-core.esm.js.map +1 -1
  26. package/dist/jtcsv-core.umd.js +336 -7
  27. package/dist/jtcsv-core.umd.js.map +1 -1
  28. package/dist/jtcsv-full.cjs.js +336 -7
  29. package/dist/jtcsv-full.cjs.js.map +1 -1
  30. package/dist/jtcsv-full.esm.js +336 -7
  31. package/dist/jtcsv-full.esm.js.map +1 -1
  32. package/dist/jtcsv-full.umd.js +336 -7
  33. package/dist/jtcsv-full.umd.js.map +1 -1
  34. package/dist/jtcsv-workers.esm.js +9 -0
  35. package/dist/jtcsv-workers.esm.js.map +1 -1
  36. package/dist/jtcsv-workers.umd.js +9 -0
  37. package/dist/jtcsv-workers.umd.js.map +1 -1
  38. package/dist/jtcsv.cjs.js +1998 -2092
  39. package/dist/jtcsv.cjs.js.map +1 -1
  40. package/dist/jtcsv.esm.js +1994 -2092
  41. package/dist/jtcsv.esm.js.map +1 -1
  42. package/dist/jtcsv.umd.js +2157 -2251
  43. package/dist/jtcsv.umd.js.map +1 -1
  44. package/dist/plugins/express-middleware/index.js +350 -0
  45. package/dist/plugins/express-middleware/index.js.map +1 -0
  46. package/dist/plugins/fastify-plugin/index.js +315 -0
  47. package/dist/plugins/fastify-plugin/index.js.map +1 -0
  48. package/dist/plugins/hono/index.js +111 -0
  49. package/dist/plugins/hono/index.js.map +1 -0
  50. package/dist/plugins/nestjs/index.js +192 -0
  51. package/dist/plugins/nestjs/index.js.map +1 -0
  52. package/dist/plugins/nuxt/index.js +53 -0
  53. package/dist/plugins/nuxt/index.js.map +1 -0
  54. package/dist/plugins/remix/index.js +133 -0
  55. package/dist/plugins/remix/index.js.map +1 -0
  56. package/dist/plugins/sveltekit/index.js +155 -0
  57. package/dist/plugins/sveltekit/index.js.map +1 -0
  58. package/dist/plugins/trpc/index.js +136 -0
  59. package/dist/plugins/trpc/index.js.map +1 -0
  60. package/dist/run-demo.js +49 -0
  61. package/dist/run-demo.js.map +1 -0
  62. package/dist/src/browser/browser-functions.js +193 -0
  63. package/dist/src/browser/browser-functions.js.map +1 -0
  64. package/dist/src/browser/core.js +123 -0
  65. package/dist/src/browser/core.js.map +1 -0
  66. package/dist/src/browser/csv-to-json-browser.js +353 -0
  67. package/dist/src/browser/csv-to-json-browser.js.map +1 -0
  68. package/dist/src/browser/errors-browser.js +219 -0
  69. package/dist/src/browser/errors-browser.js.map +1 -0
  70. package/dist/src/browser/extensions/plugins.js +106 -0
  71. package/dist/src/browser/extensions/plugins.js.map +1 -0
  72. package/dist/src/browser/extensions/workers.js +66 -0
  73. package/dist/src/browser/extensions/workers.js.map +1 -0
  74. package/dist/src/browser/index.js +140 -0
  75. package/dist/src/browser/index.js.map +1 -0
  76. package/dist/src/browser/json-to-csv-browser.js +225 -0
  77. package/dist/src/browser/json-to-csv-browser.js.map +1 -0
  78. package/dist/src/browser/streams.js +340 -0
  79. package/dist/src/browser/streams.js.map +1 -0
  80. package/dist/src/browser/workers/csv-parser.worker.js +264 -0
  81. package/dist/src/browser/workers/csv-parser.worker.js.map +1 -0
  82. package/dist/src/browser/workers/worker-pool.js +338 -0
  83. package/dist/src/browser/workers/worker-pool.js.map +1 -0
  84. package/dist/src/core/delimiter-cache.js +196 -0
  85. package/dist/src/core/delimiter-cache.js.map +1 -0
  86. package/dist/src/core/node-optimizations.js +279 -0
  87. package/dist/src/core/node-optimizations.js.map +1 -0
  88. package/dist/src/core/plugin-system.js +399 -0
  89. package/dist/src/core/plugin-system.js.map +1 -0
  90. package/dist/src/core/transform-hooks.js +348 -0
  91. package/dist/src/core/transform-hooks.js.map +1 -0
  92. package/dist/src/engines/fast-path-engine-new.js +262 -0
  93. package/dist/src/engines/fast-path-engine-new.js.map +1 -0
  94. package/dist/src/engines/fast-path-engine.js +671 -0
  95. package/dist/src/engines/fast-path-engine.js.map +1 -0
  96. package/dist/src/errors.js +18 -0
  97. package/dist/src/errors.js.map +1 -0
  98. package/dist/src/formats/ndjson-parser.js +332 -0
  99. package/dist/src/formats/ndjson-parser.js.map +1 -0
  100. package/dist/src/formats/tsv-parser.js +230 -0
  101. package/dist/src/formats/tsv-parser.js.map +1 -0
  102. package/dist/src/index-with-plugins.js +259 -0
  103. package/dist/src/index-with-plugins.js.map +1 -0
  104. package/dist/src/types/index.js +3 -0
  105. package/dist/src/types/index.js.map +1 -0
  106. package/dist/src/utils/bom-utils.js +267 -0
  107. package/dist/src/utils/bom-utils.js.map +1 -0
  108. package/dist/src/utils/encoding-support.js +77 -0
  109. package/dist/src/utils/encoding-support.js.map +1 -0
  110. package/dist/src/utils/schema-validator.js +609 -0
  111. package/dist/src/utils/schema-validator.js.map +1 -0
  112. package/dist/src/utils/transform-loader.js +281 -0
  113. package/dist/src/utils/transform-loader.js.map +1 -0
  114. package/dist/src/utils/validators.js +40 -0
  115. package/dist/src/utils/validators.js.map +1 -0
  116. package/dist/src/utils/zod-adapter.js +144 -0
  117. package/dist/src/utils/zod-adapter.js.map +1 -0
  118. package/{src → dist/src}/web-server/index.js +251 -286
  119. package/dist/src/web-server/index.js.map +1 -0
  120. package/dist/src/workers/csv-multithreaded.js +211 -0
  121. package/dist/src/workers/csv-multithreaded.js.map +1 -0
  122. package/dist/src/workers/csv-parser.worker.js +179 -0
  123. package/dist/src/workers/csv-parser.worker.js.map +1 -0
  124. package/dist/src/workers/worker-pool.js +228 -0
  125. package/dist/src/workers/worker-pool.js.map +1 -0
  126. package/dist/stream-csv-to-json.js +664 -0
  127. package/dist/stream-csv-to-json.js.map +1 -0
  128. package/dist/stream-json-to-csv.js +389 -0
  129. package/dist/stream-json-to-csv.js.map +1 -0
  130. package/examples/advanced/conditional-transformations.ts +2 -2
  131. package/examples/advanced/performance-optimization.ts +2 -2
  132. package/examples/cli-advanced-usage.md +2 -0
  133. package/examples/cli-tool.ts +1 -1
  134. package/examples/large-dataset-example.ts +2 -2
  135. package/examples/simple-usage.ts +2 -2
  136. package/examples/streaming-example.ts +1 -1
  137. package/index.d.ts +186 -15
  138. package/package.json +243 -305
  139. package/plugins.d.ts +37 -0
  140. package/schema.d.ts +103 -0
  141. package/src/browser/csv-to-json-browser.ts +233 -3
  142. package/src/browser/errors-browser.ts +45 -28
  143. package/src/browser/json-to-csv-browser.ts +81 -5
  144. package/src/browser/streams.ts +73 -6
  145. package/src/core/delimiter-cache.ts +21 -11
  146. package/src/core/plugin-system.ts +343 -155
  147. package/src/core/transform-hooks.ts +20 -12
  148. package/src/engines/fast-path-engine.ts +48 -32
  149. package/src/errors.ts +1 -72
  150. package/src/formats/ndjson-parser.ts +6 -0
  151. package/src/formats/tsv-parser.ts +6 -0
  152. package/src/types/index.ts +21 -1
  153. package/src/utils/validators.ts +35 -0
  154. package/src/web-server/index.ts +1 -1
  155. package/bin/jtcsv.js +0 -2532
  156. package/csv-to-json.js +0 -711
  157. package/errors.js +0 -394
  158. package/examples/advanced/conditional-transformations.js +0 -446
  159. package/examples/advanced/csv-parser.worker.js +0 -89
  160. package/examples/advanced/nested-objects-example.js +0 -306
  161. package/examples/advanced/performance-optimization.js +0 -504
  162. package/examples/advanced/run-demo-server.js +0 -116
  163. package/examples/cli-batch-processing.js +0 -38
  164. package/examples/cli-tool.js +0 -183
  165. package/examples/error-handling.js +0 -338
  166. package/examples/express-api.js +0 -164
  167. package/examples/large-dataset-example.js +0 -182
  168. package/examples/ndjson-processing.js +0 -434
  169. package/examples/plugin-excel-exporter.js +0 -406
  170. package/examples/schema-validation.js +0 -640
  171. package/examples/simple-usage.js +0 -282
  172. package/examples/streaming-example.js +0 -418
  173. package/examples/web-workers-advanced.js +0 -28
  174. package/index.js +0 -82
  175. package/json-save.js +0 -255
  176. package/json-to-csv.js +0 -668
  177. package/plugins/README.md +0 -91
  178. package/plugins/express-middleware/README.md +0 -83
  179. package/plugins/express-middleware/example.js +0 -135
  180. package/plugins/express-middleware/example.ts +0 -135
  181. package/plugins/express-middleware/index.d.ts +0 -114
  182. package/plugins/express-middleware/index.js +0 -512
  183. package/plugins/express-middleware/index.ts +0 -557
  184. package/plugins/express-middleware/package.json +0 -52
  185. package/plugins/fastify-plugin/index.js +0 -404
  186. package/plugins/fastify-plugin/index.ts +0 -443
  187. package/plugins/fastify-plugin/package.json +0 -55
  188. package/plugins/hono/README.md +0 -28
  189. package/plugins/hono/index.d.ts +0 -12
  190. package/plugins/hono/index.js +0 -36
  191. package/plugins/hono/index.ts +0 -226
  192. package/plugins/hono/package.json +0 -35
  193. package/plugins/nestjs/README.md +0 -35
  194. package/plugins/nestjs/index.d.ts +0 -25
  195. package/plugins/nestjs/index.js +0 -77
  196. package/plugins/nestjs/index.ts +0 -201
  197. package/plugins/nestjs/package.json +0 -37
  198. package/plugins/nextjs-api/README.md +0 -57
  199. package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
  200. package/plugins/nextjs-api/examples/ConverterComponent.tsx +0 -386
  201. package/plugins/nextjs-api/examples/api-convert.js +0 -67
  202. package/plugins/nextjs-api/examples/api-convert.ts +0 -67
  203. package/plugins/nextjs-api/index.js +0 -387
  204. package/plugins/nextjs-api/index.tsx +0 -339
  205. package/plugins/nextjs-api/package.json +0 -63
  206. package/plugins/nextjs-api/route.js +0 -370
  207. package/plugins/nextjs-api/route.ts +0 -370
  208. package/plugins/nuxt/README.md +0 -24
  209. package/plugins/nuxt/index.js +0 -21
  210. package/plugins/nuxt/index.ts +0 -94
  211. package/plugins/nuxt/package.json +0 -35
  212. package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
  213. package/plugins/nuxt/runtime/composables/useJtcsv.ts +0 -100
  214. package/plugins/nuxt/runtime/plugin.js +0 -6
  215. package/plugins/nuxt/runtime/plugin.ts +0 -71
  216. package/plugins/remix/README.md +0 -26
  217. package/plugins/remix/index.d.ts +0 -16
  218. package/plugins/remix/index.js +0 -62
  219. package/plugins/remix/index.ts +0 -260
  220. package/plugins/remix/package.json +0 -35
  221. package/plugins/sveltekit/README.md +0 -28
  222. package/plugins/sveltekit/index.d.ts +0 -17
  223. package/plugins/sveltekit/index.js +0 -54
  224. package/plugins/sveltekit/index.ts +0 -301
  225. package/plugins/sveltekit/package.json +0 -33
  226. package/plugins/trpc/README.md +0 -25
  227. package/plugins/trpc/index.d.ts +0 -7
  228. package/plugins/trpc/index.js +0 -32
  229. package/plugins/trpc/index.ts +0 -267
  230. package/plugins/trpc/package.json +0 -34
  231. package/src/browser/browser-functions.js +0 -219
  232. package/src/browser/core.js +0 -92
  233. package/src/browser/csv-to-json-browser.js +0 -722
  234. package/src/browser/errors-browser.js +0 -212
  235. package/src/browser/extensions/plugins.js +0 -92
  236. package/src/browser/extensions/workers.js +0 -39
  237. package/src/browser/index.js +0 -113
  238. package/src/browser/json-to-csv-browser.js +0 -319
  239. package/src/browser/streams.js +0 -403
  240. package/src/browser/workers/csv-parser.worker.js +0 -377
  241. package/src/browser/workers/worker-pool.js +0 -527
  242. package/src/core/delimiter-cache.js +0 -200
  243. package/src/core/node-optimizations.js +0 -408
  244. package/src/core/plugin-system.js +0 -494
  245. package/src/core/transform-hooks.js +0 -350
  246. package/src/engines/fast-path-engine-new.js +0 -338
  247. package/src/engines/fast-path-engine.js +0 -844
  248. package/src/errors.js +0 -26
  249. package/src/formats/ndjson-parser.js +0 -467
  250. package/src/formats/tsv-parser.js +0 -339
  251. package/src/index-with-plugins.js +0 -378
  252. package/src/utils/bom-utils.js +0 -259
  253. package/src/utils/encoding-support.js +0 -124
  254. package/src/utils/schema-validator.js +0 -594
  255. package/src/utils/transform-loader.js +0 -205
  256. package/src/utils/zod-adapter.js +0 -170
  257. package/stream-csv-to-json.js +0 -560
  258. package/stream-json-to-csv.js +0 -465
@@ -1,386 +0,0 @@
1
- /**
2
- * Пример React компонента для конвертации CSV/JSON
3
- * Использование в Next.js приложении
4
- */
5
-
6
- import React, { useState } from 'react';
7
- import { useJtcsv, CsvFileUploader, downloadCsv } from '../index';
8
-
9
- /**
10
- * Компонент для конвертации CSV ↔ JSON
11
- */
12
- export default function ConverterComponent() {
13
- const [input, setInput] = useState('');
14
- const [output, setOutput] = useState('');
15
- const [format, setFormat] = useState('csv'); // 'csv' или 'json'
16
- const [delimiter, setDelimiter] = useState(',');
17
-
18
- const {
19
- convertCsvToJson,
20
- convertJsonToCsv,
21
- isLoading,
22
- error,
23
- stats
24
- } = useJtcsv({
25
- delimiter,
26
- parseNumbers: true,
27
- parseBooleans: true,
28
- preventCsvInjection: true
29
- });
30
-
31
- const handleConvert = async () => {
32
- if (!input.trim()) return;
33
-
34
- try {
35
- if (format === 'csv') {
36
- // Конвертируем CSV в JSON
37
- const result = await convertCsvToJson(input);
38
- setOutput(JSON.stringify(result, null, 2));
39
- } else {
40
- // Конвертируем JSON в CSV
41
- const json = JSON.parse(input);
42
- const result = await convertJsonToCsv(json);
43
- setOutput(result);
44
- }
45
- } catch (err) {
46
- setOutput(`Error: ${err.message}`);
47
- }
48
- };
49
-
50
- const handleFileUpload = (result, fileStats) => {
51
- setInput(JSON.stringify(result, null, 2));
52
- setFormat('json');
53
-
54
- console.log('File converted:', fileStats);
55
- };
56
-
57
- const handleDownload = async () => {
58
- if (!output) return;
59
-
60
- try {
61
- if (format === 'csv') {
62
- // Скачиваем как CSV
63
- const json = JSON.parse(input);
64
- await downloadCsv(json, 'converted.csv', { delimiter });
65
- } else {
66
- // Скачиваем как JSON
67
- const blob = new Blob([output], { type: 'application/json' });
68
- const url = URL.createObjectURL(blob);
69
- const link = document.createElement('a');
70
- link.href = url;
71
- link.download = 'converted.json';
72
- link.click();
73
- URL.revokeObjectURL(url);
74
- }
75
- } catch (err) {
76
- console.error('Download error:', err);
77
- }
78
- };
79
-
80
- const handleExample = () => {
81
- if (format === 'csv') {
82
- setInput('name,email,age\nJohn Doe,john@example.com,30\nJane Smith,jane@example.com,25');
83
- } else {
84
- setInput(JSON.stringify([
85
- { name: 'John Doe', email: 'john@example.com', age: 30 },
86
- { name: 'Jane Smith', email: 'jane@example.com', age: 25 }
87
- ], null, 2));
88
- }
89
- };
90
-
91
- const handleClear = () => {
92
- setInput('');
93
- setOutput('');
94
- };
95
-
96
- return (
97
- <div style={styles.container}>
98
- <h1 style={styles.title}>🔄 JTCSV Converter</h1>
99
-
100
- <div style={styles.controls}>
101
- <div style={styles.formatSelector}>
102
- <label>
103
- <input
104
- type="radio"
105
- value="csv"
106
- checked={format === 'csv'}
107
- onChange={(e) => setFormat(e.target.value)}
108
- />
109
- CSV → JSON
110
- </label>
111
- <label>
112
- <input
113
- type="radio"
114
- value="json"
115
- checked={format === 'json'}
116
- onChange={(e) => setFormat(e.target.value)}
117
- />
118
- JSON → CSV
119
- </label>
120
- </div>
121
-
122
- <div style={styles.delimiterSelector}>
123
- <label>
124
- Разделитель:
125
- <select
126
- value={delimiter}
127
- onChange={(e) => setDelimiter(e.target.value)}
128
- style={styles.select}
129
- >
130
- <option value=",">Запятая (,)</option>
131
- <option value=";">Точка с запятой (;)</option>
132
- <option value="\t">Табуляция (\t)</option>
133
- <option value="|">Вертикальная черта (|)</option>
134
- </select>
135
- </label>
136
- </div>
137
- </div>
138
-
139
- <div style={styles.inputSection}>
140
- <div style={styles.inputHeader}>
141
- <h3 style={styles.sectionTitle}>
142
- {format === 'csv' ? 'CSV Input' : 'JSON Input'}
143
- </h3>
144
- <div style={styles.inputActions}>
145
- <CsvFileUploader
146
- onConvert={handleFileUpload}
147
- options={{ delimiter }}
148
- >
149
- <button style={styles.buttonSecondary}>📁 Upload CSV</button>
150
- </CsvFileUploader>
151
- <button
152
- onClick={handleExample}
153
- style={styles.buttonSecondary}
154
- >
155
- 📋 Example
156
- </button>
157
- <button
158
- onClick={handleClear}
159
- style={styles.buttonSecondary}
160
- >
161
- 🗑️ Clear
162
- </button>
163
- </div>
164
- </div>
165
-
166
- <textarea
167
- value={input}
168
- onChange={(e) => setInput(e.target.value)}
169
- placeholder={format === 'csv'
170
- ? 'Введите CSV данные...\nПример:\nname,email,age\nJohn,john@example.com,30'
171
- : 'Введите JSON данные...\nПример:\n[{"name":"John","age":30}]'
172
- }
173
- style={styles.textarea}
174
- rows={10}
175
- />
176
- </div>
177
-
178
- <div style={styles.convertButtonContainer}>
179
- <button
180
- onClick={handleConvert}
181
- disabled={isLoading || !input.trim()}
182
- style={{
183
- ...styles.buttonPrimary,
184
- opacity: isLoading || !input.trim() ? 0.6 : 1,
185
- cursor: isLoading || !input.trim() ? 'not-allowed' : 'pointer'
186
- }}
187
- >
188
- {isLoading ? '🔄 Converting...' : '🚀 Convert'}
189
- </button>
190
-
191
- {stats && (
192
- <div style={styles.stats}>
193
- <span>⏱️ {stats.processingTime}ms</span>
194
- <span>📊 {stats.rows || stats.size} {stats.rows ? 'rows' : 'chars'}</span>
195
- </div>
196
- )}
197
- </div>
198
-
199
- {error && (
200
- <div style={styles.error}>
201
- ❌ Error: {error}
202
- </div>
203
- )}
204
-
205
- <div style={styles.outputSection}>
206
- <div style={styles.outputHeader}>
207
- <h3 style={styles.sectionTitle}>
208
- {format === 'csv' ? 'JSON Output' : 'CSV Output'}
209
- </h3>
210
- <div style={styles.outputActions}>
211
- <button
212
- onClick={handleDownload}
213
- disabled={!output}
214
- style={styles.buttonSecondary}
215
- >
216
- ⬇️ Download
217
- </button>
218
- <button
219
- onClick={() => navigator.clipboard.writeText(output)}
220
- disabled={!output}
221
- style={styles.buttonSecondary}
222
- >
223
- 📋 Copy
224
- </button>
225
- </div>
226
- </div>
227
-
228
- <pre style={styles.output}>
229
- {output || 'Результат появится здесь...'}
230
- </pre>
231
- </div>
232
-
233
- <div style={styles.info}>
234
- <p>💡 <strong>Подсказки:</strong></p>
235
- <ul style={styles.tipsList}>
236
- <li>Используйте кнопку "Example" для быстрого заполнения</li>
237
- <li>Загружайте CSV файлы через кнопку "Upload CSV"</li>
238
- <li>Выберите разделитель соответствующий вашим данным</li>
239
- <li>Скачивайте результат в нужном формате</li>
240
- </ul>
241
- </div>
242
- </div>
243
- );
244
- }
245
-
246
- const styles = {
247
- container: {
248
- maxWidth: '1200px',
249
- margin: '0 auto',
250
- padding: '20px',
251
- fontFamily: 'system-ui, -apple-system, sans-serif'
252
- },
253
- title: {
254
- color: '#333',
255
- textAlign: 'center',
256
- marginBottom: '30px'
257
- },
258
- controls: {
259
- display: 'flex',
260
- justifyContent: 'space-between',
261
- alignItems: 'center',
262
- marginBottom: '20px',
263
- flexWrap: 'wrap',
264
- gap: '20px'
265
- },
266
- formatSelector: {
267
- display: 'flex',
268
- gap: '20px'
269
- },
270
- delimiterSelector: {
271
- display: 'flex',
272
- alignItems: 'center',
273
- gap: '10px'
274
- },
275
- select: {
276
- padding: '5px 10px',
277
- marginLeft: '10px',
278
- borderRadius: '4px',
279
- border: '1px solid #ccc'
280
- },
281
- inputSection: {
282
- marginBottom: '20px'
283
- },
284
- inputHeader: {
285
- display: 'flex',
286
- justifyContent: 'space-between',
287
- alignItems: 'center',
288
- marginBottom: '10px'
289
- },
290
- inputActions: {
291
- display: 'flex',
292
- gap: '10px'
293
- },
294
- sectionTitle: {
295
- margin: '0',
296
- color: '#555'
297
- },
298
- textarea: {
299
- width: '100%',
300
- padding: '15px',
301
- border: '1px solid #ddd',
302
- borderRadius: '8px',
303
- fontFamily: 'monospace',
304
- fontSize: '14px',
305
- resize: 'vertical',
306
- boxSizing: 'border-box'
307
- },
308
- convertButtonContainer: {
309
- display: 'flex',
310
- flexDirection: 'column',
311
- alignItems: 'center',
312
- gap: '10px',
313
- margin: '20px 0'
314
- },
315
- buttonPrimary: {
316
- padding: '12px 30px',
317
- background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
318
- color: 'white',
319
- border: 'none',
320
- borderRadius: '25px',
321
- fontSize: '16px',
322
- fontWeight: 'bold',
323
- cursor: 'pointer',
324
- transition: 'transform 0.2s'
325
- },
326
- buttonSecondary: {
327
- padding: '8px 16px',
328
- background: '#f0f0f0',
329
- color: '#333',
330
- border: '1px solid #ddd',
331
- borderRadius: '4px',
332
- cursor: 'pointer',
333
- transition: 'background 0.2s'
334
- },
335
- stats: {
336
- display: 'flex',
337
- gap: '20px',
338
- color: '#666',
339
- fontSize: '14px'
340
- },
341
- error: {
342
- padding: '15px',
343
- background: '#fee',
344
- border: '1px solid #f99',
345
- borderRadius: '8px',
346
- color: '#c00',
347
- marginBottom: '20px'
348
- },
349
- outputSection: {
350
- marginTop: '20px'
351
- },
352
- outputHeader: {
353
- display: 'flex',
354
- justifyContent: 'space-between',
355
- alignItems: 'center',
356
- marginBottom: '10px'
357
- },
358
- outputActions: {
359
- display: 'flex',
360
- gap: '10px'
361
- },
362
- output: {
363
- padding: '15px',
364
- background: '#f8f8f8',
365
- border: '1px solid #ddd',
366
- borderRadius: '8px',
367
- minHeight: '200px',
368
- overflow: 'auto',
369
- whiteSpace: 'pre-wrap',
370
- wordBreak: 'break-all',
371
- fontFamily: 'monospace',
372
- fontSize: '14px'
373
- },
374
- info: {
375
- marginTop: '30px',
376
- padding: '20px',
377
- background: '#f0f8ff',
378
- border: '1px solid #cce5ff',
379
- borderRadius: '8px'
380
- },
381
- tipsList: {
382
- margin: '10px 0 0 20px',
383
- color: '#555'
384
- }
385
- };
386
-