legal-markdown-js 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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +168 -0
  3. package/dist/browser.d.ts +87 -0
  4. package/dist/browser.d.ts.map +1 -0
  5. package/dist/browser.js +157 -0
  6. package/dist/browser.js.map +1 -0
  7. package/dist/cli/index.d.ts +34 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +221 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/service.d.ts +128 -0
  12. package/dist/cli/service.d.ts.map +1 -0
  13. package/dist/cli/service.js +284 -0
  14. package/dist/cli/service.js.map +1 -0
  15. package/dist/constants/index.d.ts +229 -0
  16. package/dist/constants/index.d.ts.map +1 -0
  17. package/dist/constants/index.js +232 -0
  18. package/dist/constants/index.js.map +1 -0
  19. package/dist/core/exporters/metadata-exporter.d.ts +104 -0
  20. package/dist/core/exporters/metadata-exporter.d.ts.map +1 -0
  21. package/dist/core/exporters/metadata-exporter.js +201 -0
  22. package/dist/core/exporters/metadata-exporter.js.map +1 -0
  23. package/dist/core/index.d.ts +40 -0
  24. package/dist/core/index.d.ts.map +1 -0
  25. package/dist/core/index.js +56 -0
  26. package/dist/core/index.js.map +1 -0
  27. package/dist/core/parsers/yaml-parser.d.ts +149 -0
  28. package/dist/core/parsers/yaml-parser.d.ts.map +1 -0
  29. package/dist/core/parsers/yaml-parser.js +321 -0
  30. package/dist/core/parsers/yaml-parser.js.map +1 -0
  31. package/dist/core/processors/clause-processor.d.ts +74 -0
  32. package/dist/core/processors/clause-processor.d.ts.map +1 -0
  33. package/dist/core/processors/clause-processor.js +213 -0
  34. package/dist/core/processors/clause-processor.js.map +1 -0
  35. package/dist/core/processors/date-processor.d.ts +90 -0
  36. package/dist/core/processors/date-processor.d.ts.map +1 -0
  37. package/dist/core/processors/date-processor.js +336 -0
  38. package/dist/core/processors/date-processor.js.map +1 -0
  39. package/dist/core/processors/header-processor.d.ts +104 -0
  40. package/dist/core/processors/header-processor.d.ts.map +1 -0
  41. package/dist/core/processors/header-processor.js +585 -0
  42. package/dist/core/processors/header-processor.js.map +1 -0
  43. package/dist/core/processors/import-processor.d.ts +116 -0
  44. package/dist/core/processors/import-processor.d.ts.map +1 -0
  45. package/dist/core/processors/import-processor.js +236 -0
  46. package/dist/core/processors/import-processor.js.map +1 -0
  47. package/dist/core/processors/mixin-processor.d.ts +93 -0
  48. package/dist/core/processors/mixin-processor.d.ts.map +1 -0
  49. package/dist/core/processors/mixin-processor.js +378 -0
  50. package/dist/core/processors/mixin-processor.js.map +1 -0
  51. package/dist/core/processors/reference-processor.d.ts +115 -0
  52. package/dist/core/processors/reference-processor.d.ts.map +1 -0
  53. package/dist/core/processors/reference-processor.js +273 -0
  54. package/dist/core/processors/reference-processor.js.map +1 -0
  55. package/dist/errors/index.d.ts +234 -0
  56. package/dist/errors/index.d.ts.map +1 -0
  57. package/dist/errors/index.js +267 -0
  58. package/dist/errors/index.js.map +1 -0
  59. package/dist/extensions/batch-processor.d.ts +197 -0
  60. package/dist/extensions/batch-processor.d.ts.map +1 -0
  61. package/dist/extensions/batch-processor.js +392 -0
  62. package/dist/extensions/batch-processor.js.map +1 -0
  63. package/dist/extensions/formatters/index.d.ts +99 -0
  64. package/dist/extensions/formatters/index.d.ts.map +1 -0
  65. package/dist/extensions/formatters/index.js +128 -0
  66. package/dist/extensions/formatters/index.js.map +1 -0
  67. package/dist/extensions/index.d.ts +53 -0
  68. package/dist/extensions/index.d.ts.map +1 -0
  69. package/dist/extensions/index.js +71 -0
  70. package/dist/extensions/index.js.map +1 -0
  71. package/dist/extensions/latex-parser.d.ts +111 -0
  72. package/dist/extensions/latex-parser.d.ts.map +1 -0
  73. package/dist/extensions/latex-parser.js +563 -0
  74. package/dist/extensions/latex-parser.js.map +1 -0
  75. package/dist/extensions/rst-parser.d.ts +112 -0
  76. package/dist/extensions/rst-parser.d.ts.map +1 -0
  77. package/dist/extensions/rst-parser.js +268 -0
  78. package/dist/extensions/rst-parser.js.map +1 -0
  79. package/dist/extensions/template-loops.d.ts +61 -0
  80. package/dist/extensions/template-loops.d.ts.map +1 -0
  81. package/dist/extensions/template-loops.js +418 -0
  82. package/dist/extensions/template-loops.js.map +1 -0
  83. package/dist/extensions/utilities/index.d.ts +114 -0
  84. package/dist/extensions/utilities/index.d.ts.map +1 -0
  85. package/dist/extensions/utilities/index.js +137 -0
  86. package/dist/extensions/utilities/index.js.map +1 -0
  87. package/dist/extensions/validators/index.d.ts +65 -0
  88. package/dist/extensions/validators/index.d.ts.map +1 -0
  89. package/dist/extensions/validators/index.js +88 -0
  90. package/dist/extensions/validators/index.js.map +1 -0
  91. package/dist/generators/html-generator.d.ts +184 -0
  92. package/dist/generators/html-generator.d.ts.map +1 -0
  93. package/dist/generators/html-generator.js +361 -0
  94. package/dist/generators/html-generator.js.map +1 -0
  95. package/dist/generators/pdf-generator.d.ts +165 -0
  96. package/dist/generators/pdf-generator.d.ts.map +1 -0
  97. package/dist/generators/pdf-generator.js +275 -0
  98. package/dist/generators/pdf-generator.js.map +1 -0
  99. package/dist/helpers/date-helpers.d.ts +216 -0
  100. package/dist/helpers/date-helpers.d.ts.map +1 -0
  101. package/dist/helpers/date-helpers.js +402 -0
  102. package/dist/helpers/date-helpers.js.map +1 -0
  103. package/dist/helpers/index.d.ts +87 -0
  104. package/dist/helpers/index.d.ts.map +1 -0
  105. package/dist/helpers/index.js +149 -0
  106. package/dist/helpers/index.js.map +1 -0
  107. package/dist/helpers/number-helpers.d.ts +269 -0
  108. package/dist/helpers/number-helpers.d.ts.map +1 -0
  109. package/dist/helpers/number-helpers.js +406 -0
  110. package/dist/helpers/number-helpers.js.map +1 -0
  111. package/dist/helpers/string-helpers.d.ts +391 -0
  112. package/dist/helpers/string-helpers.d.ts.map +1 -0
  113. package/dist/helpers/string-helpers.js +549 -0
  114. package/dist/helpers/string-helpers.js.map +1 -0
  115. package/dist/index.d.ts +229 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +384 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/legal-markdown.umd.min.js +2 -0
  120. package/dist/legal-markdown.umd.min.js.LICENSE.txt +14 -0
  121. package/dist/legal-markdown.umd.min.js.map +1 -0
  122. package/dist/lib/index.d.ts +150 -0
  123. package/dist/lib/index.d.ts.map +1 -0
  124. package/dist/lib/index.js +265 -0
  125. package/dist/lib/index.js.map +1 -0
  126. package/dist/parsers/content-detector.d.ts +131 -0
  127. package/dist/parsers/content-detector.d.ts.map +1 -0
  128. package/dist/parsers/content-detector.js +220 -0
  129. package/dist/parsers/content-detector.js.map +1 -0
  130. package/dist/parsers/fallback-parsers.d.ts +14 -0
  131. package/dist/parsers/fallback-parsers.d.ts.map +1 -0
  132. package/dist/parsers/fallback-parsers.js +188 -0
  133. package/dist/parsers/fallback-parsers.js.map +1 -0
  134. package/dist/parsers/implementations/pandoc-native.d.ts +13 -0
  135. package/dist/parsers/implementations/pandoc-native.d.ts.map +1 -0
  136. package/dist/parsers/implementations/pandoc-native.js +63 -0
  137. package/dist/parsers/implementations/pandoc-native.js.map +1 -0
  138. package/dist/parsers/implementations/pandoc-wasm.d.ts +14 -0
  139. package/dist/parsers/implementations/pandoc-wasm.d.ts.map +1 -0
  140. package/dist/parsers/implementations/pandoc-wasm.js +64 -0
  141. package/dist/parsers/implementations/pandoc-wasm.js.map +1 -0
  142. package/dist/parsers/pandoc-factory.d.ts +97 -0
  143. package/dist/parsers/pandoc-factory.d.ts.map +1 -0
  144. package/dist/parsers/pandoc-factory.js +146 -0
  145. package/dist/parsers/pandoc-factory.js.map +1 -0
  146. package/dist/parsers/pandoc-loader.d.ts +24 -0
  147. package/dist/parsers/pandoc-loader.d.ts.map +1 -0
  148. package/dist/parsers/pandoc-loader.js +124 -0
  149. package/dist/parsers/pandoc-loader.js.map +1 -0
  150. package/dist/parsers/pandoc-parser.d.ts +27 -0
  151. package/dist/parsers/pandoc-parser.d.ts.map +1 -0
  152. package/dist/parsers/pandoc-parser.js +3 -0
  153. package/dist/parsers/pandoc-parser.js.map +1 -0
  154. package/dist/styles/default.css +125 -0
  155. package/dist/styles/headers.css +146 -0
  156. package/dist/styles/highlight.css +171 -0
  157. package/dist/tracking/field-tracker.d.ts +206 -0
  158. package/dist/tracking/field-tracker.d.ts.map +1 -0
  159. package/dist/tracking/field-tracker.js +247 -0
  160. package/dist/tracking/field-tracker.js.map +1 -0
  161. package/dist/types.d.ts +186 -0
  162. package/dist/types.d.ts.map +1 -0
  163. package/dist/types.js +33 -0
  164. package/dist/types.js.map +1 -0
  165. package/dist/utils/logger.d.ts +107 -0
  166. package/dist/utils/logger.d.ts.map +1 -0
  167. package/dist/utils/logger.js +122 -0
  168. package/dist/utils/logger.js.map +1 -0
  169. package/dist/web/bundle-standalone.js +28 -0
  170. package/dist/web/bundle.js +17 -0
  171. package/dist/web/index.html +1465 -0
  172. package/dist/web/legal-markdown.umd.min.js +2 -0
  173. package/dist/web/standalone.html +390 -0
  174. package/dist/web/styles.css +874 -0
  175. package/package.json +118 -0
@@ -0,0 +1,874 @@
1
+ /**
2
+ * Legal Markdown Web UI Styles
3
+ * Based on contract.css with UI enhancements
4
+ */
5
+
6
+ /* Variables (from contract.css) */
7
+ :root {
8
+ /* Colors */
9
+ --color-primary: #353954;
10
+ --color-accent: #02370a;
11
+ --color-link: #41badf;
12
+ --color-text: #333;
13
+ --color-error: #c62828;
14
+ --color-success: #2e7d32;
15
+ --color-warning: #f57c00;
16
+
17
+ /* UI Colors */
18
+ --color-bg: #f8f9fa;
19
+ --color-surface: white;
20
+ --color-border: #e9ecef;
21
+ --color-input-focus: #4CAF50;
22
+
23
+ /* Typography */
24
+ --font-primary: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
25
+ --font-mono: 'JetBrains Mono', 'Consolas', 'Monaco', 'Courier New', monospace;
26
+
27
+ /* Spacing */
28
+ --spacing-xs: 4px;
29
+ --spacing-sm: 8px;
30
+ --spacing-md: 16px;
31
+ --spacing-lg: 24px;
32
+ --spacing-xl: 32px;
33
+
34
+ /* Sizes */
35
+ --font-size-base: 14px;
36
+ --font-size-lg: 16px;
37
+ --font-size-xl: 18px;
38
+ --border-radius: 8px;
39
+ --header-height: 60px;
40
+
41
+ /* Transitions */
42
+ --transition-fast: 0.15s ease;
43
+ --transition-base: 0.3s ease;
44
+ }
45
+
46
+ /* Dark theme */
47
+ [data-theme="dark"] {
48
+ --color-bg: #1a1a1a;
49
+ --color-surface: #2d2d2d;
50
+ --color-text: #e0e0e0;
51
+ --color-border: #404040;
52
+ --color-input-focus: #66bb6a;
53
+ --color-primary: #7c4dff;
54
+ --color-accent: #69f0ae;
55
+ --color-link: #64b5f6;
56
+ }
57
+
58
+ /* Base styles */
59
+ * {
60
+ box-sizing: border-box;
61
+ }
62
+
63
+ body {
64
+ margin: 0;
65
+ font-family: var(--font-primary);
66
+ font-size: var(--font-size-base);
67
+ line-height: 1.6;
68
+ color: var(--color-text);
69
+ background-color: var(--color-bg);
70
+ transition: background-color var(--transition-base), color var(--transition-base);
71
+ }
72
+
73
+ /* Theme transition animation */
74
+ * {
75
+ transition: background-color var(--transition-base),
76
+ color var(--transition-base),
77
+ border-color var(--transition-base);
78
+ }
79
+
80
+ /* App layout */
81
+ .app-container {
82
+ height: 100vh;
83
+ display: grid;
84
+ grid-template-rows: var(--header-height) 1fr auto;
85
+ overflow: hidden;
86
+ }
87
+
88
+ .app-header {
89
+ background: var(--color-surface);
90
+ border-bottom: 1px solid var(--color-border);
91
+ display: flex;
92
+ align-items: center;
93
+ justify-content: space-between;
94
+ padding: 0 var(--spacing-lg);
95
+ transition: background-color var(--transition-base);
96
+ }
97
+
98
+ .app-header h1 {
99
+ margin: 0;
100
+ color: var(--color-primary);
101
+ font-size: var(--font-size-xl);
102
+ font-weight: 600;
103
+ }
104
+
105
+ .header-actions {
106
+ display: flex;
107
+ gap: var(--spacing-sm);
108
+ }
109
+
110
+ .header-actions button {
111
+ background: none;
112
+ border: 1px solid var(--color-border);
113
+ padding: var(--spacing-sm) var(--spacing-md);
114
+ border-radius: var(--border-radius);
115
+ cursor: pointer;
116
+ transition: all var(--transition-fast);
117
+ font-size: var(--font-size-base);
118
+ }
119
+
120
+ .header-actions button:hover {
121
+ background: var(--color-border);
122
+ }
123
+
124
+ /* Main editor */
125
+ .editor-container {
126
+ display: grid;
127
+ grid-template-columns: 1fr 4px 1fr 4px 1fr;
128
+ gap: 0;
129
+ padding: var(--spacing-lg);
130
+ overflow: hidden;
131
+ }
132
+
133
+ /* Column resizer */
134
+ .column-resizer {
135
+ width: 4px;
136
+ background: var(--color-border);
137
+ cursor: col-resize;
138
+ transition: all var(--transition-fast);
139
+ position: relative;
140
+ user-select: none;
141
+ }
142
+
143
+ .column-resizer:hover {
144
+ background: var(--color-primary);
145
+ width: 6px;
146
+ box-shadow: 0 0 4px rgba(53, 57, 84, 0.3);
147
+ }
148
+
149
+ .column-resizer:active {
150
+ background: var(--color-accent);
151
+ width: 6px;
152
+ box-shadow: 0 0 8px rgba(2, 55, 10, 0.5);
153
+ }
154
+
155
+ .input-panel, .css-panel, .output-panel {
156
+ margin-right: var(--spacing-md);
157
+ }
158
+
159
+ .output-panel {
160
+ margin-right: 0;
161
+ }
162
+
163
+ /* CSS Panel */
164
+ .css-panel {
165
+ background: var(--color-surface);
166
+ border: 1px solid var(--color-border);
167
+ border-radius: var(--border-radius);
168
+ transition: background-color var(--transition-base);
169
+ display: flex;
170
+ flex-direction: column;
171
+ overflow: hidden;
172
+ }
173
+
174
+ .css-content {
175
+ border-top: 1px solid var(--color-border);
176
+ flex: 1;
177
+ overflow: hidden;
178
+ }
179
+
180
+ .css-editor {
181
+ width: 100%;
182
+ height: 100%;
183
+ font-family: var(--font-mono);
184
+ font-size: 13px;
185
+ line-height: 1.4;
186
+ border: none;
187
+ resize: none;
188
+ outline: none;
189
+ padding: var(--spacing-md);
190
+ background: var(--color-surface);
191
+ color: var(--color-text);
192
+ transition: background-color var(--transition-base), color var(--transition-base);
193
+ }
194
+
195
+ .css-editor:focus {
196
+ background: var(--color-bg);
197
+ }
198
+
199
+ .input-panel, .output-panel {
200
+ background: var(--color-surface);
201
+ border: 1px solid var(--color-border);
202
+ border-radius: var(--border-radius);
203
+ display: flex;
204
+ flex-direction: column;
205
+ overflow: hidden;
206
+ transition: background-color var(--transition-base);
207
+ }
208
+
209
+ .panel-header {
210
+ background: var(--color-bg);
211
+ border-bottom: 1px solid var(--color-border);
212
+ padding: var(--spacing-md) var(--spacing-lg);
213
+ display: flex;
214
+ justify-content: space-between;
215
+ align-items: center;
216
+ }
217
+
218
+ .panel-header h3 {
219
+ margin: 0;
220
+ font-size: var(--font-size-lg);
221
+ font-weight: 600;
222
+ color: var(--color-primary);
223
+ }
224
+
225
+ .panel-actions {
226
+ display: flex;
227
+ gap: var(--spacing-sm);
228
+ }
229
+
230
+ .panel-actions button {
231
+ background: var(--color-primary);
232
+ color: white;
233
+ border: none;
234
+ padding: 4px 8px;
235
+ border-radius: 4px;
236
+ cursor: pointer;
237
+ font-size: 11px;
238
+ transition: all var(--transition-fast);
239
+ }
240
+
241
+ .panel-actions button:hover {
242
+ background: var(--color-accent);
243
+ }
244
+
245
+ .panel-actions button.secondary {
246
+ background: var(--color-border);
247
+ color: var(--color-text);
248
+ }
249
+
250
+ .panel-actions button.secondary:hover {
251
+ background: var(--color-link);
252
+ color: white;
253
+ }
254
+
255
+ /* Editor */
256
+ .editor {
257
+ flex: 1;
258
+ font-family: var(--font-mono);
259
+ font-size: var(--font-size-base);
260
+ line-height: 1.5;
261
+ border: none;
262
+ resize: none;
263
+ outline: none;
264
+ padding: var(--spacing-lg);
265
+ background: var(--color-surface);
266
+ color: var(--color-text);
267
+ transition: background-color var(--transition-base), color var(--transition-base);
268
+ }
269
+
270
+ .editor:focus {
271
+ box-shadow: inset 0 0 0 2px var(--color-input-focus);
272
+ }
273
+
274
+ /* Preview */
275
+ .preview-container {
276
+ flex: 1;
277
+ overflow-y: auto;
278
+ padding: var(--spacing-lg);
279
+ background: var(--color-surface);
280
+ transition: background-color var(--transition-base);
281
+ }
282
+
283
+ /* Base preview without styles */
284
+ .preview-container {
285
+ /* Minimal base styles only */
286
+ color: var(--color-text);
287
+ }
288
+
289
+ /* Contract.css styles - applied conditionally via .styled-preview class */
290
+ .preview-container.styled-preview {
291
+ font-family: Helvetica, Arial, sans-serif;
292
+ font-size: 12pt;
293
+ line-height: 1.3;
294
+ }
295
+
296
+ .preview-container.styled-preview h1 {
297
+ color: var(--color-primary);
298
+ font-size: 1.6em;
299
+ line-height: 1.5em;
300
+ margin: 8px 8px 32px;
301
+ text-align: center;
302
+ border-bottom: solid var(--color-accent);
303
+ padding: 0 5% 0.3em;
304
+ }
305
+
306
+ .preview-container.styled-preview h2 {
307
+ font-size: 14pt;
308
+ margin-top: 20px;
309
+ margin-bottom: 15px;
310
+ border-bottom: 1px solid var(--color-link);
311
+ }
312
+
313
+ .preview-container.styled-preview h3 {
314
+ font-size: 10pt;
315
+ font-weight: bold;
316
+ border-bottom: 1px solid var(--color-link);
317
+ margin-top: 30px;
318
+ margin-bottom: 8px;
319
+ }
320
+
321
+ .preview-container.styled-preview p {
322
+ margin-bottom: 15px;
323
+ text-align: justify;
324
+ }
325
+
326
+ .preview-container.styled-preview ul, .preview-container.styled-preview ol {
327
+ margin-left: 8px;
328
+ margin-bottom: 15px;
329
+ padding-inline-start: 20px;
330
+ }
331
+
332
+ .preview-container.styled-preview li {
333
+ margin-bottom: 8px;
334
+ }
335
+
336
+ /* Dark theme preview styling - only for styled preview */
337
+ [data-theme="dark"] .preview-container {
338
+ color: var(--color-text);
339
+ }
340
+
341
+ [data-theme="dark"] .preview-container.styled-preview h1 {
342
+ color: var(--color-primary);
343
+ border-bottom-color: var(--color-accent);
344
+ }
345
+
346
+ [data-theme="dark"] .preview-container.styled-preview h2,
347
+ [data-theme="dark"] .preview-container.styled-preview h3 {
348
+ color: var(--color-text);
349
+ border-bottom-color: var(--color-link);
350
+ }
351
+
352
+ [data-theme="dark"] .preview-container.styled-preview strong {
353
+ color: var(--color-text);
354
+ }
355
+
356
+ [data-theme="dark"] .preview-container.styled-preview a {
357
+ color: var(--color-link);
358
+ }
359
+
360
+ [data-theme="dark"] .preview-placeholder {
361
+ color: var(--color-text);
362
+ opacity: 0.7;
363
+ }
364
+
365
+ /* Options panel */
366
+ .options-panel {
367
+ background: var(--color-surface);
368
+ border-top: 1px solid var(--color-border);
369
+ padding: var(--spacing-md) var(--spacing-lg);
370
+ transition: background-color var(--transition-base);
371
+ }
372
+
373
+ .options-toggle {
374
+ background: none;
375
+ border: none;
376
+ color: var(--color-primary);
377
+ cursor: pointer;
378
+ font-size: var(--font-size-base);
379
+ font-weight: 600;
380
+ padding: var(--spacing-sm) 0;
381
+ width: 100%;
382
+ text-align: left;
383
+ display: flex;
384
+ align-items: center;
385
+ gap: var(--spacing-sm);
386
+ }
387
+
388
+ .options-content {
389
+ display: none;
390
+ padding-top: var(--spacing-md);
391
+ }
392
+
393
+ .options-content.open {
394
+ display: block;
395
+ }
396
+
397
+ .options-grid {
398
+ display: grid;
399
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
400
+ gap: var(--spacing-md);
401
+ }
402
+
403
+ .option-group {
404
+ display: flex;
405
+ flex-direction: column;
406
+ gap: var(--spacing-sm);
407
+ }
408
+
409
+ .option-group label {
410
+ font-weight: 500;
411
+ color: var(--color-primary);
412
+ margin-bottom: var(--spacing-xs);
413
+ }
414
+
415
+ .checkbox-group {
416
+ display: flex;
417
+ flex-direction: column;
418
+ gap: var(--spacing-sm);
419
+ }
420
+
421
+ .checkbox-item {
422
+ display: flex;
423
+ align-items: center;
424
+ gap: var(--spacing-sm);
425
+ }
426
+
427
+ .checkbox-item input[type="checkbox"] {
428
+ width: 16px;
429
+ height: 16px;
430
+ accent-color: var(--color-primary);
431
+ }
432
+
433
+ .checkbox-item label {
434
+ font-weight: normal;
435
+ color: var(--color-text);
436
+ cursor: pointer;
437
+ }
438
+
439
+ /* Tooltip styles */
440
+ .tooltip {
441
+ position: relative;
442
+ display: inline-block;
443
+ margin-left: var(--spacing-xs);
444
+ cursor: help;
445
+ }
446
+
447
+ .tooltip .tooltip-icon {
448
+ color: var(--color-primary);
449
+ font-size: 12px;
450
+ opacity: 0.7;
451
+ transition: opacity var(--transition-fast);
452
+ }
453
+
454
+ .tooltip:hover .tooltip-icon {
455
+ opacity: 1;
456
+ }
457
+
458
+ .tooltip .tooltip-text {
459
+ visibility: hidden;
460
+ width: 280px;
461
+ background-color: var(--color-surface);
462
+ color: var(--color-text);
463
+ text-align: left;
464
+ border-radius: var(--border-radius);
465
+ padding: var(--spacing-sm);
466
+ position: absolute;
467
+ z-index: 1000;
468
+ bottom: 125%;
469
+ left: 50%;
470
+ margin-left: -140px;
471
+ opacity: 0;
472
+ transition: opacity var(--transition-fast);
473
+ border: 1px solid var(--color-border);
474
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
475
+ font-size: 12px;
476
+ line-height: 1.4;
477
+ font-weight: normal;
478
+ }
479
+
480
+ .tooltip .tooltip-text::after {
481
+ content: "";
482
+ position: absolute;
483
+ top: 100%;
484
+ left: 50%;
485
+ margin-left: -5px;
486
+ border-width: 5px;
487
+ border-style: solid;
488
+ border-color: var(--color-border) transparent transparent transparent;
489
+ }
490
+
491
+ .tooltip:hover .tooltip-text {
492
+ visibility: visible;
493
+ opacity: 1;
494
+ }
495
+
496
+ /* Dark theme tooltip */
497
+ [data-theme="dark"] .tooltip .tooltip-text {
498
+ background-color: var(--color-surface);
499
+ color: var(--color-text);
500
+ border-color: var(--color-border);
501
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
502
+ }
503
+
504
+ [data-theme="dark"] .tooltip .tooltip-text::after {
505
+ border-color: var(--color-border) transparent transparent transparent;
506
+ }
507
+
508
+ /* Form elements */
509
+ input[type="text"], input[type="file"], select {
510
+ width: 100%;
511
+ padding: var(--spacing-sm) var(--spacing-md);
512
+ border: 1px solid var(--color-border);
513
+ border-radius: var(--border-radius);
514
+ font-size: var(--font-size-base);
515
+ background: var(--color-surface);
516
+ color: var(--color-text);
517
+ transition: all var(--transition-fast);
518
+ }
519
+
520
+ input[type="text"]:focus, select:focus {
521
+ outline: none;
522
+ border-color: var(--color-input-focus);
523
+ box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.2);
524
+ }
525
+
526
+ /* Example dropdown */
527
+ .example-dropdown {
528
+ position: relative;
529
+ }
530
+
531
+ .example-select {
532
+ background: var(--color-border);
533
+ color: var(--color-text);
534
+ border: 1px solid var(--color-border);
535
+ padding: 4px 8px;
536
+ border-radius: 4px;
537
+ cursor: pointer;
538
+ font-size: 11px;
539
+ transition: all var(--transition-fast);
540
+ min-width: 100px;
541
+ }
542
+
543
+ .example-select:hover {
544
+ background: var(--color-surface);
545
+ border-color: var(--color-primary);
546
+ }
547
+
548
+ .example-select:focus {
549
+ outline: none;
550
+ box-shadow: 0 0 0 2px rgba(65, 186, 223, 0.3);
551
+ }
552
+
553
+ /* Dark theme dropdown */
554
+ [data-theme="dark"] .example-select {
555
+ background: var(--color-link);
556
+ color: var(--color-surface);
557
+ }
558
+
559
+ [data-theme="dark"] .example-select:hover {
560
+ background: #1976d2;
561
+ }
562
+
563
+ [data-theme="dark"] .example-select option {
564
+ background: var(--color-surface);
565
+ color: var(--color-text);
566
+ }
567
+
568
+ /* Messages */
569
+ .message {
570
+ padding: var(--spacing-md);
571
+ border-radius: var(--border-radius);
572
+ margin-top: var(--spacing-md);
573
+ animation: slideIn 0.3s ease;
574
+ transition: opacity 0.3s ease;
575
+ position: relative;
576
+ }
577
+
578
+ .message.error {
579
+ background: #ffebee;
580
+ color: var(--color-error);
581
+ border: 1px solid #ffcdd2;
582
+ border-left: 4px solid var(--color-error);
583
+ }
584
+
585
+ .message.success {
586
+ background: #e8f5e8;
587
+ color: var(--color-success);
588
+ border: 1px solid #c8e6c9;
589
+ border-left: 4px solid var(--color-success);
590
+ }
591
+
592
+ .message.warning {
593
+ background: #fff3e0;
594
+ color: var(--color-warning);
595
+ border: 1px solid #ffcc02;
596
+ border-left: 4px solid var(--color-warning);
597
+ }
598
+
599
+ .message.info {
600
+ background: #e3f2fd;
601
+ color: #1976d2;
602
+ border: 1px solid #bbdefb;
603
+ border-left: 4px solid #1976d2;
604
+ }
605
+
606
+ .message-main {
607
+ font-weight: 600;
608
+ margin-bottom: var(--spacing-xs);
609
+ }
610
+
611
+ .message-details {
612
+ font-size: 0.9em;
613
+ opacity: 0.9;
614
+ line-height: 1.4;
615
+ white-space: pre-line;
616
+ margin-top: var(--spacing-xs);
617
+ }
618
+
619
+ [data-theme="dark"] .message.error {
620
+ background: #3d1a1a;
621
+ color: #ff6b6b;
622
+ border-color: #5a2d2d;
623
+ }
624
+
625
+ [data-theme="dark"] .message.success {
626
+ background: #1a3d1a;
627
+ color: #69f0ae;
628
+ border-color: #2d5a2d;
629
+ }
630
+
631
+ [data-theme="dark"] .message.warning {
632
+ background: #3d2a1a;
633
+ color: #ffa726;
634
+ border-color: #5a3d2d;
635
+ }
636
+
637
+ [data-theme="dark"] .message.info {
638
+ background: #1a2d3d;
639
+ color: #64b5f6;
640
+ border-color: #2d4a5a;
641
+ }
642
+
643
+ /* Loading states */
644
+ .loading {
645
+ opacity: 0.6;
646
+ pointer-events: none;
647
+ }
648
+
649
+ .loading::after {
650
+ content: '';
651
+ position: absolute;
652
+ top: 50%;
653
+ left: 50%;
654
+ width: 20px;
655
+ height: 20px;
656
+ margin: -10px 0 0 -10px;
657
+ border: 2px solid var(--color-primary);
658
+ border-top: 2px solid transparent;
659
+ border-radius: 50%;
660
+ animation: spin 1s linear infinite;
661
+ }
662
+
663
+ /* Responsive design */
664
+ @media (max-width: 1024px) {
665
+ .editor-container {
666
+ grid-template-columns: 1fr 4px 1fr;
667
+ grid-template-rows: auto auto auto;
668
+ }
669
+
670
+ .css-panel {
671
+ grid-column: 1 / -1;
672
+ order: 2;
673
+ }
674
+
675
+ .input-panel {
676
+ order: 1;
677
+ }
678
+
679
+ .output-panel {
680
+ order: 3;
681
+ }
682
+
683
+ .column-resizer {
684
+ display: none;
685
+ }
686
+ }
687
+
688
+ @media (max-width: 768px) {
689
+ .editor-container {
690
+ grid-template-columns: 1fr;
691
+ grid-template-rows: auto auto auto;
692
+ }
693
+
694
+ .css-panel {
695
+ grid-column: 1;
696
+ order: 2;
697
+ }
698
+
699
+ .input-panel {
700
+ order: 1;
701
+ }
702
+
703
+ .output-panel {
704
+ order: 3;
705
+ }
706
+
707
+ .column-resizer {
708
+ display: none;
709
+ }
710
+
711
+ .app-header {
712
+ padding: 0 var(--spacing-md);
713
+ }
714
+
715
+ .app-header h1 {
716
+ font-size: var(--font-size-lg);
717
+ }
718
+
719
+ .options-grid {
720
+ grid-template-columns: 1fr;
721
+ }
722
+ }
723
+
724
+ /* Print styles (from contract.css) */
725
+ @media print {
726
+ @page {
727
+ size: A4;
728
+ margin: 20mm 10mm 10mm 10mm;
729
+ }
730
+
731
+ .app-header,
732
+ .options-panel {
733
+ display: none !important;
734
+ }
735
+
736
+ .editor-container {
737
+ grid-template-columns: 1fr;
738
+ padding: 0;
739
+ }
740
+
741
+ .input-panel {
742
+ display: none !important;
743
+ }
744
+
745
+ .output-panel {
746
+ border: none;
747
+ border-radius: 0;
748
+ height: auto;
749
+ }
750
+
751
+ .panel-header {
752
+ display: none;
753
+ }
754
+
755
+ .preview-container {
756
+ font-size: 11pt;
757
+ color: black;
758
+ padding: 0;
759
+ }
760
+
761
+ .preview-container h1 {
762
+ color: #353954;
763
+ border-bottom: solid #02370a;
764
+ }
765
+
766
+ .preview-container h2 {
767
+ border-bottom: 1px solid #41badf;
768
+ }
769
+
770
+ .preview-container h3 {
771
+ border-bottom: 1px solid #41badf;
772
+ }
773
+
774
+ .preview-container a {
775
+ color: #41badf;
776
+ text-decoration: none;
777
+ }
778
+
779
+ .preview-container a[href^='http']:after {
780
+ content: ' (' attr(href) ')';
781
+ font-size: 90%;
782
+ }
783
+
784
+ .preview-container p {
785
+ page-break-inside: avoid;
786
+ }
787
+
788
+ .preview-container h1,
789
+ .preview-container h2,
790
+ .preview-container h3 {
791
+ page-break-after: avoid;
792
+ page-break-inside: avoid;
793
+ }
794
+ }
795
+
796
+ /* Animations */
797
+ @keyframes slideIn {
798
+ from {
799
+ opacity: 0;
800
+ transform: translateY(-10px);
801
+ }
802
+ to {
803
+ opacity: 1;
804
+ transform: translateY(0);
805
+ }
806
+ }
807
+
808
+ @keyframes spin {
809
+ 0% { transform: rotate(0deg); }
810
+ 100% { transform: rotate(360deg); }
811
+ }
812
+
813
+ /* Scrollbar styling */
814
+ .editor::-webkit-scrollbar,
815
+ .preview-container::-webkit-scrollbar {
816
+ width: 8px;
817
+ }
818
+
819
+ .editor::-webkit-scrollbar-track,
820
+ .preview-container::-webkit-scrollbar-track {
821
+ background: var(--color-bg);
822
+ }
823
+
824
+ .editor::-webkit-scrollbar-thumb,
825
+ .preview-container::-webkit-scrollbar-thumb {
826
+ background: var(--color-border);
827
+ border-radius: 4px;
828
+ }
829
+
830
+ .editor::-webkit-scrollbar-thumb:hover,
831
+ .preview-container::-webkit-scrollbar-thumb:hover {
832
+ background: var(--color-primary);
833
+ }
834
+
835
+ /* Dark theme scrollbar */
836
+ [data-theme="dark"] .editor::-webkit-scrollbar-track,
837
+ [data-theme="dark"] .preview-container::-webkit-scrollbar-track {
838
+ background: var(--color-bg);
839
+ }
840
+
841
+ [data-theme="dark"] .editor::-webkit-scrollbar-thumb,
842
+ [data-theme="dark"] .preview-container::-webkit-scrollbar-thumb {
843
+ background: var(--color-border);
844
+ }
845
+
846
+ [data-theme="dark"] .editor::-webkit-scrollbar-thumb:hover,
847
+ [data-theme="dark"] .preview-container::-webkit-scrollbar-thumb:hover {
848
+ background: var(--color-primary);
849
+ }
850
+
851
+ /* Utilities */
852
+ .sr-only {
853
+ position: absolute;
854
+ width: 1px;
855
+ height: 1px;
856
+ padding: 0;
857
+ margin: -1px;
858
+ overflow: hidden;
859
+ clip: rect(0, 0, 0, 0);
860
+ white-space: nowrap;
861
+ border: 0;
862
+ }
863
+
864
+ .text-center {
865
+ text-align: center;
866
+ }
867
+
868
+ .mb-0 {
869
+ margin-bottom: 0 !important;
870
+ }
871
+
872
+ .mt-0 {
873
+ margin-top: 0 !important;
874
+ }