extwee 2.3.11 → 2.3.13

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 (186) hide show
  1. package/CHANGELOG.md +219 -0
  2. package/CONTRIBUTING.md +305 -0
  3. package/README.md +16 -0
  4. package/build/extwee.core.min.js +1 -1
  5. package/build/extwee.twine1html.min.js +1 -1
  6. package/build/extwee.twine2archive.min.js +1 -1
  7. package/build/extwee.tws.min.js +1 -1
  8. package/logs/arrays.html +79 -0
  9. package/logs/arrays.twee +64 -0
  10. package/logs/example.html +47 -0
  11. package/logs/fixing.js +23 -0
  12. package/logs/format-fixed.js +8 -0
  13. package/logs/format.js +8 -0
  14. package/logs/test-entities.cjs +40 -0
  15. package/package.json +19 -16
  16. package/src/Story.js +2 -2
  17. package/types/src/Story.d.ts +1 -1
  18. package/.github/FUNDING.yml +0 -3
  19. package/.github/codeql-analysis.yml +0 -51
  20. package/.github/dependabot.yml +0 -11
  21. package/.github/workflows/dependabot-automerge.yml +0 -23
  22. package/.github/workflows/nodejs.yml +0 -28
  23. package/.travis.yml +0 -13
  24. package/babel.config.json +0 -18
  25. package/docs/.nojekyll +0 -0
  26. package/docs/README.md +0 -224
  27. package/docs/_sidebar.md +0 -19
  28. package/docs/build/extwee.core.min.js +0 -1
  29. package/docs/build/extwee.twine1html.min.js +0 -1
  30. package/docs/build/extwee.twine2archive.min.js +0 -1
  31. package/docs/build/extwee.tws.min.js +0 -1
  32. package/docs/demos/compiler/extwee.core.min.js +0 -1
  33. package/docs/demos/compiler/index.css +0 -105
  34. package/docs/demos/compiler/index.html +0 -359
  35. package/docs/demos/decompile/extwee.core.min.js +0 -1
  36. package/docs/demos/decompile/index.css +0 -584
  37. package/docs/demos/decompile/index.html +0 -468
  38. package/docs/examples/dynamicPassages.md +0 -28
  39. package/docs/examples/jsonToTwee.md +0 -23
  40. package/docs/examples/twsToTwee.md +0 -25
  41. package/docs/formats/json.md +0 -17
  42. package/docs/formats/twee.md +0 -13
  43. package/docs/formats/twine1HTML.md +0 -13
  44. package/docs/formats/twine2ArchiveHTML.md +0 -13
  45. package/docs/formats/twine2HTML.md +0 -13
  46. package/docs/formats/tws.md +0 -9
  47. package/docs/index.html +0 -26
  48. package/docs/install/npm.md +0 -16
  49. package/docs/install/npx.md +0 -79
  50. package/docs/objects/passage.md +0 -47
  51. package/docs/objects/story.md +0 -69
  52. package/docs/objects/storyformat.md +0 -27
  53. package/eslint.config.js +0 -28
  54. package/extwee.config.json +0 -6
  55. package/extwee.config.md +0 -67
  56. package/jest.config.json +0 -5
  57. package/test/CLI/CLI.test.js +0 -49
  58. package/test/CLI/files/example.json +0 -1
  59. package/test/CLI/files/example6.twee +0 -22
  60. package/test/CLI/files/harlowe.js +0 -3
  61. package/test/CLI/files/input.html +0 -47
  62. package/test/CLI/files/output/test.twee +0 -0
  63. package/test/CLI/files/test.twee +0 -18
  64. package/test/CLI/files/tweeExample.twee +0 -17
  65. package/test/CLI/files/twine1/LICENSE.txt +0 -32
  66. package/test/CLI/files/twine1/code.js +0 -5
  67. package/test/CLI/files/twine1/engine.js +0 -43
  68. package/test/CLI/files/twine1/header.html +0 -325
  69. package/test/CLI/files/twine1Test.html +0 -371
  70. package/test/CLI/files/twineExample.html +0 -16
  71. package/test/Config/Config.test.js +0 -76
  72. package/test/Config/files/empty.json +0 -3
  73. package/test/Config/files/full.json +0 -8
  74. package/test/Config/files/invalid.json +0 -1
  75. package/test/Config/files/valid.json +0 -6
  76. package/test/Config/isDirectory.test.js +0 -50
  77. package/test/Config/isFile.test.js +0 -53
  78. package/test/Config/loadStoryFormat.test.js +0 -117
  79. package/test/Config/readDirectories.test.js +0 -78
  80. package/test/IFID/IFID.Generate.test.js +0 -10
  81. package/test/JSON/JSON.Parse.test.js +0 -316
  82. package/test/Objects/Passage.test.js +0 -274
  83. package/test/Objects/SnowmanCompatibility.test.js +0 -111
  84. package/test/Objects/Story.test.js +0 -1075
  85. package/test/Objects/StoryFormat.test.js +0 -219
  86. package/test/Roundtrip/Files/Example1.html +0 -64
  87. package/test/Roundtrip/Files/LICENSE +0 -19
  88. package/test/Roundtrip/Files/example1.twee +0 -10
  89. package/test/Roundtrip/Files/example2.twee +0 -27
  90. package/test/Roundtrip/Files/example4.twee +0 -27
  91. package/test/Roundtrip/Files/harlowe.js +0 -3
  92. package/test/Roundtrip/Files/round.html +0 -49
  93. package/test/Roundtrip/Roundtrip.test.js +0 -54
  94. package/test/StoryFormat/StoryFormat.Parse.test.js +0 -479
  95. package/test/TWS/Parse.test.js +0 -56
  96. package/test/TWS/TWSParser/Example5.tws +0 -414
  97. package/test/TWS/TWSParser/noscale.tws +0 -0
  98. package/test/TWS/TWSParser/nostory.tws +0 -0
  99. package/test/Twee/Twee.Escaping.test.js +0 -200
  100. package/test/Twee/Twee.Parse.test.js +0 -108
  101. package/test/Twee/TweeParser/cursed.twee +0 -16
  102. package/test/Twee/TweeParser/cycling.twee +0 -75
  103. package/test/Twee/TweeParser/emptytags.twee +0 -2
  104. package/test/Twee/TweeParser/example.twee +0 -32
  105. package/test/Twee/TweeParser/malformed.twee +0 -2
  106. package/test/Twee/TweeParser/missing.twee +0 -19
  107. package/test/Twee/TweeParser/multipleScriptPassages.twee +0 -19
  108. package/test/Twee/TweeParser/multipleStyleTag.twee +0 -19
  109. package/test/Twee/TweeParser/multipletags.twee +0 -10
  110. package/test/Twee/TweeParser/noTitle.twee +0 -2
  111. package/test/Twee/TweeParser/notes.twee +0 -16
  112. package/test/Twee/TweeParser/pasagemetadataerror.twee +0 -2
  113. package/test/Twee/TweeParser/scriptPassage.twee +0 -16
  114. package/test/Twee/TweeParser/singletag.twee +0 -13
  115. package/test/Twee/TweeParser/start.twee +0 -2
  116. package/test/Twee/TweeParser/startMetadata.twee +0 -14
  117. package/test/Twee/TweeParser/storydataerror.twee +0 -25
  118. package/test/Twee/TweeParser/style.twee +0 -16
  119. package/test/Twee/TweeParser/stylePassage.twee +0 -16
  120. package/test/Twee/TweeParser/test.twee +0 -25
  121. package/test/Twine1HTML/Twine1HTML.Compile.test.js +0 -180
  122. package/test/Twine1HTML/Twine1HTML.Parse.Web.test.js +0 -484
  123. package/test/Twine1HTML/Twine1HTML.Parse.test.js +0 -183
  124. package/test/Twine1HTML/Twine1HTMLCompiler/Twine1/LICENSE +0 -674
  125. package/test/Twine1HTML/Twine1HTMLCompiler/Twine1/engine.js +0 -43
  126. package/test/Twine1HTML/Twine1HTMLCompiler/Twine1/jquery.js +0 -4
  127. package/test/Twine1HTML/Twine1HTMLCompiler/Twine1/modernizr.js +0 -4
  128. package/test/Twine1HTML/Twine1HTMLCompiler/engineTest.html +0 -1
  129. package/test/Twine1HTML/Twine1HTMLCompiler/jonah-1.4.2/LICENSE +0 -32
  130. package/test/Twine1HTML/Twine1HTMLCompiler/jonah-1.4.2/code.js +0 -4
  131. package/test/Twine1HTML/Twine1HTMLCompiler/jonah-1.4.2/header.html +0 -327
  132. package/test/Twine1HTML/Twine1HTMLCompiler/test.html +0 -0
  133. package/test/Twine1HTML/Twine1HTMLCompiler/test1.html +0 -6
  134. package/test/Twine1HTML/Twine1HTMLCompiler/test2.html +0 -6
  135. package/test/Twine1HTML/Twine1HTMLCompiler/test3.html +0 -43
  136. package/test/Twine1HTML/Twine1HTMLCompiler/test4.html +0 -372
  137. package/test/Twine1HTML/Twine1HTMLCompiler/test5.html +0 -372
  138. package/test/Twine2ArchiveHTML/Twine2ArchiveHTML.Compile.test.js +0 -35
  139. package/test/Twine2ArchiveHTML/Twine2ArchiveHTML.Parse.Web.test.js +0 -293
  140. package/test/Twine2ArchiveHTML/Twine2ArchiveHTML.Parse.test.js +0 -42
  141. package/test/Twine2ArchiveHTML/Twine2ArchiveHTMLCompiler/test1.html +0 -6
  142. package/test/Twine2ArchiveHTML/Twine2ArchiveHTMLParser/test1.html +0 -3
  143. package/test/Twine2HTML/Twine2HTML.Compile.test.js +0 -139
  144. package/test/Twine2HTML/Twine2HTML.Parse.Web.test.js +0 -329
  145. package/test/Twine2HTML/Twine2HTML.Parse.test.js +0 -192
  146. package/test/Twine2HTML/Twine2HTMLCompiler/TestTags.html +0 -42
  147. package/test/Twine2HTML/Twine2HTMLCompiler/creator.html +0 -50
  148. package/test/Twine2HTML/Twine2HTMLCompiler/example6.twee +0 -16
  149. package/test/Twine2HTML/Twine2HTMLCompiler/format.js +0 -9
  150. package/test/Twine2HTML/Twine2HTMLCompiler/missingStoryTitle.twee +0 -29
  151. package/test/Twine2HTML/Twine2HTMLCompiler/test11.html +0 -121
  152. package/test/Twine2HTML/Twine2HTMLCompiler/test2.html +0 -58
  153. package/test/Twine2HTML/Twine2HTMLCompiler/test3.html +0 -49
  154. package/test/Twine2HTML/Twine2HTMLCompiler/test4.html +0 -50
  155. package/test/Twine2HTML/Twine2HTMLCompiler/test6.html +0 -49
  156. package/test/Twine2HTML/Twine2HTMLParser/Example1.html +0 -53
  157. package/test/Twine2HTML/Twine2HTMLParser/Tags.html +0 -15
  158. package/test/Twine2HTML/Twine2HTMLParser/lyingStartnode.html +0 -15
  159. package/test/Twine2HTML/Twine2HTMLParser/lyingTagColors.html +0 -48
  160. package/test/Twine2HTML/Twine2HTMLParser/missingCreator.html +0 -11
  161. package/test/Twine2HTML/Twine2HTMLParser/missingCreatorVersion.html +0 -11
  162. package/test/Twine2HTML/Twine2HTMLParser/missingFormat.html +0 -11
  163. package/test/Twine2HTML/Twine2HTMLParser/missingFormatVersion.html +0 -11
  164. package/test/Twine2HTML/Twine2HTMLParser/missingIFID.html +0 -11
  165. package/test/Twine2HTML/Twine2HTMLParser/missingPassageTags.html +0 -15
  166. package/test/Twine2HTML/Twine2HTMLParser/missingPosition.html +0 -15
  167. package/test/Twine2HTML/Twine2HTMLParser/missingScript.html +0 -14
  168. package/test/Twine2HTML/Twine2HTMLParser/missingSize.html +0 -35
  169. package/test/Twine2HTML/Twine2HTMLParser/missingStartnode.html +0 -11
  170. package/test/Twine2HTML/Twine2HTMLParser/missingStyle.html +0 -14
  171. package/test/Twine2HTML/Twine2HTMLParser/missingZoom.html +0 -11
  172. package/test/Twine2HTML/Twine2HTMLParser/tagColors.html +0 -31
  173. package/test/Twine2HTML/Twine2HTMLParser/twineExample.html +0 -23
  174. package/test/Twine2HTML/Twine2HTMLParser/twineExample2.html +0 -15
  175. package/test/Twine2HTML/Twine2HTMLParser/twineExample3.html +0 -15
  176. package/test/Twine2HTML/Twine2HTMLParser/unescaping.html +0 -33
  177. package/test/Web/web-core-coverage.test.js +0 -175
  178. package/test/Web/web-core-global.test.js +0 -93
  179. package/test/Web/web-core.test.js +0 -156
  180. package/test/Web/web-exports.test.js +0 -136
  181. package/test/Web/web-twine1html.test.js +0 -105
  182. package/test/Web/web-twine2archive.test.js +0 -96
  183. package/test/Web/web-tws.test.js +0 -77
  184. package/test/Web/window.Extwee.test.js +0 -97
  185. package/tsconfig.json +0 -21
  186. package/webpack.config.js +0 -47
@@ -1,584 +0,0 @@
1
- /* Reset and Base Styles */
2
- * {
3
- margin: 0;
4
- padding: 0;
5
- box-sizing: border-box;
6
- }
7
-
8
- body {
9
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
10
- line-height: 1.6;
11
- color: #333;
12
- background-color: #f5f5f5;
13
- }
14
-
15
- /* Container */
16
- .container {
17
- max-width: 1200px;
18
- margin: 0 auto;
19
- padding: 20px;
20
- }
21
-
22
- /* Header */
23
- header {
24
- text-align: center;
25
- margin-bottom: 40px;
26
- padding: 30px 0;
27
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
28
- color: white;
29
- border-radius: 10px;
30
- box-shadow: 0 4px 15px rgba(0,0,0,0.1);
31
- }
32
-
33
- header h1 {
34
- font-size: 2.5rem;
35
- margin-bottom: 10px;
36
- font-weight: 300;
37
- }
38
-
39
- header p {
40
- font-size: 1.1rem;
41
- opacity: 0.9;
42
- max-width: 600px;
43
- margin: 0 auto;
44
- }
45
-
46
- /* Upload Section */
47
- .upload-section {
48
- background: white;
49
- padding: 40px;
50
- border-radius: 10px;
51
- box-shadow: 0 2px 20px rgba(0,0,0,0.1);
52
- margin-bottom: 30px;
53
- text-align: center;
54
- }
55
-
56
- .file-input-container {
57
- position: relative;
58
- display: inline-block;
59
- }
60
-
61
- #fileInput {
62
- position: absolute;
63
- opacity: 0;
64
- width: 100%;
65
- height: 100%;
66
- cursor: pointer;
67
- }
68
-
69
- .file-input-label {
70
- display: flex;
71
- align-items: center;
72
- justify-content: center;
73
- gap: 10px;
74
- padding: 15px 30px;
75
- background: #667eea;
76
- color: white;
77
- border-radius: 8px;
78
- cursor: pointer;
79
- font-size: 1.1rem;
80
- font-weight: 500;
81
- transition: all 0.3s ease;
82
- border: 2px dashed transparent;
83
- }
84
-
85
- .file-input-label:hover {
86
- background: #5a67d8;
87
- transform: translateY(-2px);
88
- box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
89
- }
90
-
91
- .file-input-icon {
92
- font-size: 1.3rem;
93
- }
94
-
95
- .file-info {
96
- margin-top: 20px;
97
- padding: 15px;
98
- background: #f8f9fa;
99
- border-radius: 6px;
100
- font-size: 0.9rem;
101
- color: #666;
102
- border-left: 4px solid #667eea;
103
- }
104
-
105
- /* Results Section */
106
- .results-section {
107
- background: white;
108
- border-radius: 10px;
109
- box-shadow: 0 2px 20px rgba(0,0,0,0.1);
110
- overflow: hidden;
111
- }
112
-
113
- /* Tabs */
114
- .tabs {
115
- display: flex;
116
- background: #f8f9fa;
117
- border-bottom: 1px solid #e9ecef;
118
- }
119
-
120
- .tab-button {
121
- flex: 1;
122
- padding: 15px 20px;
123
- background: none;
124
- border: none;
125
- cursor: pointer;
126
- font-size: 1rem;
127
- font-weight: 500;
128
- color: #666;
129
- transition: all 0.3s ease;
130
- position: relative;
131
- }
132
-
133
- .tab-button:hover {
134
- background: #e9ecef;
135
- color: #333;
136
- }
137
-
138
- .tab-button.active {
139
- color: #667eea;
140
- background: white;
141
- }
142
-
143
- .tab-button.active::after {
144
- content: '';
145
- position: absolute;
146
- bottom: 0;
147
- left: 0;
148
- right: 0;
149
- height: 3px;
150
- background: #667eea;
151
- }
152
-
153
- /* Tab Content */
154
- .tab-content {
155
- display: none;
156
- padding: 30px;
157
- }
158
-
159
- .tab-content.active {
160
- display: block;
161
- }
162
-
163
- /* Stats Grid */
164
- .stats-grid {
165
- display: grid;
166
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
167
- gap: 20px;
168
- margin-bottom: 40px;
169
- }
170
-
171
- .stat-card {
172
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
173
- color: white;
174
- padding: 25px;
175
- border-radius: 10px;
176
- text-align: center;
177
- box-shadow: 0 4px 15px rgba(0,0,0,0.1);
178
- transition: transform 0.3s ease;
179
- }
180
-
181
- .stat-card:hover {
182
- transform: translateY(-5px);
183
- }
184
-
185
- .stat-number {
186
- font-size: 2.5rem;
187
- font-weight: bold;
188
- margin-bottom: 5px;
189
- }
190
-
191
- .stat-label {
192
- font-size: 1rem;
193
- opacity: 0.9;
194
- font-weight: 300;
195
- }
196
-
197
- /* Story Info */
198
- .story-info {
199
- background: #f8f9fa;
200
- padding: 25px;
201
- border-radius: 8px;
202
- border-left: 4px solid #667eea;
203
- }
204
-
205
- .story-info h3 {
206
- margin-bottom: 20px;
207
- color: #333;
208
- font-weight: 600;
209
- }
210
-
211
- .info-grid {
212
- display: grid;
213
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
214
- gap: 15px;
215
- }
216
-
217
- .info-item {
218
- display: flex;
219
- flex-direction: column;
220
- gap: 5px;
221
- }
222
-
223
- .info-item label {
224
- font-weight: 600;
225
- color: #555;
226
- font-size: 0.9rem;
227
- text-transform: uppercase;
228
- letter-spacing: 0.5px;
229
- }
230
-
231
- .info-item span {
232
- color: #333;
233
- font-size: 1rem;
234
- word-break: break-all;
235
- }
236
-
237
- /* Passages */
238
- .passages-header {
239
- display: flex;
240
- justify-content: space-between;
241
- align-items: center;
242
- margin-bottom: 25px;
243
- flex-wrap: wrap;
244
- gap: 15px;
245
- }
246
-
247
- .passages-header h3 {
248
- color: #333;
249
- font-weight: 600;
250
- }
251
-
252
- .search-container input {
253
- padding: 10px 15px;
254
- border: 2px solid #e9ecef;
255
- border-radius: 6px;
256
- font-size: 1rem;
257
- width: 250px;
258
- transition: border-color 0.3s ease;
259
- }
260
-
261
- .search-container input:focus {
262
- outline: none;
263
- border-color: #667eea;
264
- }
265
-
266
- .passages-list {
267
- display: flex;
268
- flex-direction: column;
269
- gap: 15px;
270
- }
271
-
272
- .passage-item {
273
- background: #f8f9fa;
274
- border: 1px solid #e9ecef;
275
- border-radius: 8px;
276
- padding: 20px;
277
- transition: all 0.3s ease;
278
- }
279
-
280
- .passage-item:hover {
281
- border-color: #667eea;
282
- box-shadow: 0 2px 10px rgba(102, 126, 234, 0.1);
283
- }
284
-
285
- .passage-header {
286
- display: flex;
287
- justify-content: space-between;
288
- align-items: center;
289
- margin-bottom: 10px;
290
- flex-wrap: wrap;
291
- gap: 10px;
292
- }
293
-
294
- .passage-name {
295
- color: #333;
296
- font-weight: 600;
297
- font-size: 1.1rem;
298
- margin: 0;
299
- }
300
-
301
- .passage-stats {
302
- display: flex;
303
- gap: 15px;
304
- }
305
-
306
- .passage-stats .stat {
307
- font-size: 0.9rem;
308
- color: #666;
309
- background: white;
310
- padding: 4px 8px;
311
- border-radius: 4px;
312
- border: 1px solid #e9ecef;
313
- }
314
-
315
- .passage-tags {
316
- margin-bottom: 15px;
317
- display: flex;
318
- flex-wrap: wrap;
319
- gap: 6px;
320
- }
321
-
322
- .tag {
323
- background: #667eea;
324
- color: white;
325
- padding: 4px 10px;
326
- border-radius: 15px;
327
- font-size: 0.8rem;
328
- font-weight: 500;
329
- }
330
-
331
- .no-tags {
332
- color: #999;
333
- font-style: italic;
334
- font-size: 0.9rem;
335
- }
336
-
337
- .passage-preview {
338
- color: #555;
339
- line-height: 1.5;
340
- font-size: 0.95rem;
341
- }
342
-
343
- /* Tags */
344
- .tags-header {
345
- margin-bottom: 25px;
346
- }
347
-
348
- .tags-header h3 {
349
- color: #333;
350
- font-weight: 600;
351
- }
352
-
353
- .tags-container {
354
- display: flex;
355
- flex-direction: column;
356
- gap: 15px;
357
- }
358
-
359
- .tag-stat {
360
- background: #f8f9fa;
361
- border: 1px solid #e9ecef;
362
- border-radius: 8px;
363
- padding: 20px;
364
- }
365
-
366
- .tag-stat-header {
367
- display: flex;
368
- justify-content: space-between;
369
- align-items: center;
370
- margin-bottom: 10px;
371
- flex-wrap: wrap;
372
- gap: 10px;
373
- }
374
-
375
- .tag-name {
376
- font-weight: 600;
377
- font-size: 1.1rem;
378
- color: #333;
379
- padding-left: 10px;
380
- border-left: 4px solid #667eea;
381
- }
382
-
383
- .tag-count {
384
- background: #667eea;
385
- color: white;
386
- padding: 4px 12px;
387
- border-radius: 15px;
388
- font-size: 0.9rem;
389
- font-weight: 500;
390
- }
391
-
392
- .tag-passages {
393
- color: #666;
394
- line-height: 1.5;
395
- }
396
-
397
- .passage-link {
398
- color: #667eea;
399
- font-weight: 500;
400
- cursor: pointer;
401
- transition: color 0.3s ease;
402
- }
403
-
404
- .passage-link:hover {
405
- color: #5a67d8;
406
- text-decoration: underline;
407
- }
408
-
409
- /* Metadata */
410
- .metadata-container h3 {
411
- margin-bottom: 25px;
412
- color: #333;
413
- font-weight: 600;
414
- }
415
-
416
- .metadata-content {
417
- display: flex;
418
- flex-direction: column;
419
- gap: 30px;
420
- }
421
-
422
- .metadata-section h4 {
423
- color: #667eea;
424
- font-weight: 600;
425
- margin-bottom: 15px;
426
- font-size: 1.1rem;
427
- border-bottom: 2px solid #e9ecef;
428
- padding-bottom: 8px;
429
- }
430
-
431
- .metadata-list {
432
- display: grid;
433
- grid-template-columns: 200px 1fr;
434
- gap: 10px 20px;
435
- align-items: start;
436
- }
437
-
438
- .metadata-list dt {
439
- font-weight: 600;
440
- color: #555;
441
- text-align: right;
442
- padding-top: 5px;
443
- }
444
-
445
- .metadata-list dd {
446
- color: #333;
447
- padding: 5px 0;
448
- word-break: break-word;
449
- }
450
-
451
- /* Error Section */
452
- .error-section {
453
- background: white;
454
- border-radius: 10px;
455
- box-shadow: 0 2px 20px rgba(0,0,0,0.1);
456
- padding: 40px;
457
- text-align: center;
458
- }
459
-
460
- .error-message {
461
- background: #fff5f5;
462
- border: 1px solid #fed7d7;
463
- border-radius: 8px;
464
- padding: 25px;
465
- border-left: 4px solid #e53e3e;
466
- }
467
-
468
- .error-message h3 {
469
- color: #e53e3e;
470
- margin-bottom: 10px;
471
- font-weight: 600;
472
- }
473
-
474
- .error-message p {
475
- color: #c53030;
476
- font-size: 1rem;
477
- }
478
-
479
- /* No Data */
480
- .no-data {
481
- text-align: center;
482
- color: #999;
483
- font-style: italic;
484
- padding: 40px;
485
- font-size: 1.1rem;
486
- }
487
-
488
- /* Responsive Design */
489
- @media (max-width: 768px) {
490
- .container {
491
- padding: 15px;
492
- }
493
-
494
- header h1 {
495
- font-size: 2rem;
496
- }
497
-
498
- .upload-section {
499
- padding: 25px;
500
- }
501
-
502
- .tab-content {
503
- padding: 20px;
504
- }
505
-
506
- .stats-grid {
507
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
508
- gap: 15px;
509
- }
510
-
511
- .stat-number {
512
- font-size: 2rem;
513
- }
514
-
515
- .info-grid {
516
- grid-template-columns: 1fr;
517
- }
518
-
519
- .metadata-list {
520
- grid-template-columns: 1fr;
521
- gap: 5px 0;
522
- }
523
-
524
- .metadata-list dt {
525
- text-align: left;
526
- font-weight: 600;
527
- color: #667eea;
528
- }
529
-
530
- .passages-header {
531
- flex-direction: column;
532
- align-items: stretch;
533
- }
534
-
535
- .search-container input {
536
- width: 100%;
537
- }
538
-
539
- .passage-header {
540
- flex-direction: column;
541
- align-items: flex-start;
542
- }
543
-
544
- .tabs {
545
- flex-wrap: wrap;
546
- }
547
-
548
- .tab-button {
549
- flex: none;
550
- min-width: 25%;
551
- }
552
- }
553
-
554
- @media (max-width: 480px) {
555
- header {
556
- padding: 20px 15px;
557
- }
558
-
559
- header h1 {
560
- font-size: 1.8rem;
561
- }
562
-
563
- .upload-section {
564
- padding: 20px;
565
- }
566
-
567
- .file-input-label {
568
- padding: 12px 20px;
569
- font-size: 1rem;
570
- }
571
-
572
- .stats-grid {
573
- grid-template-columns: 1fr;
574
- }
575
-
576
- .stat-card {
577
- padding: 20px;
578
- }
579
-
580
- .tab-button {
581
- padding: 12px 15px;
582
- font-size: 0.9rem;
583
- }
584
- }