-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathwikilabs-links.html
More file actions
559 lines (399 loc) · 347 KB
/
Copy pathwikilabs-links.html
File metadata and controls
559 lines (399 loc) · 347 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
<!doctype html>
<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->
<!-- saved from url=(0021)https://tiddlywiki.com -->
<html lang="`<$text text=en-GB/>`">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<!--~~ Raw markup for the top of the head section ~~-->
<meta http-equiv="X-UA-Compatible" content="IE=Edge"/>
<meta name="application-name" content="TiddlyWiki" />
<meta name="generator" content="TiddlyWiki" />
<meta name="tiddlywiki-version" content="5.4.1-prerelease" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="mobile-web-app-capable" content="yes"/>
<meta name="format-detection" content="telephone=no" />
<meta name="copyright" content="TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)
Copyright (c) 2004-2007, Jeremy Ruston
Copyright (c) 2007-2025, UnaMesa Association
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." />
<link id="faviconLink" rel="shortcut icon" href="favicon.ico">
<title>Wikilabs Home — A home for: Plugins, Editions and Themes!</title>
<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~--><!--~~ Raw markup ~~-->
<meta name="description" content="A home for: Plugins, Editions and Themes!">
<meta property="og:title" content="Wikilabs Home">
<meta property="og:description" content="A home for: Plugins, Editions and Themes!">
<meta name="twitter:title" content="Wikilabs Home">
<meta name="twitter:description" content="A home for: Plugins, Editions and Themes!">
</head>
<body class="tc-body">
<!--~~ Raw markup for the top of the body section ~~-->
<!--~~ Static styles ~~-->
<div id="styleArea">
<style data-tiddler-title="$:/boot/boot.css" data-tiddler-type="text/css" type="text/css">/*
Basic styles used before we boot up the parsing engine
*/
/*
Error message and password prompt
*/
.tc-error-form {
font-family: sans-serif;
color: #fff;
z-index: 20000;
position: fixed;
background-color: rgb(255, 75, 75);
border: 8px solid rgb(255, 0, 0);
border-radius: 8px;
width: 50%;
margin-left: 25%;
margin-top: 4em;
padding: 0 2em 1em 2em;
}
.tc-error-form h1 {
text-align: center;
}
.tc-error-prompt {
text-align: center;
color: #000;
}
.tc-error-message {
overflow: auto;
max-height: 40em;
padding-right: 1em;
margin: 1em 0;
white-space: pre-line;
}
.tc-password-wrapper {
font-family: sans-serif;
z-index: 20000;
position: fixed;
text-align: center;
width: 200px;
top: 4em;
left: 50%;
margin-left: -144px; /* - width/2 - paddingHorz/2 - border */
padding: 16px 16px 16px 16px;
border-radius: 8px;
}
.tc-password-wrapper {
color: #000;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
background-color: rgb(197, 235, 183);
border: 8px solid rgb(164, 197, 152);
}
.tc-password-wrapper form {
text-align: left;
}
.tc-password-wrapper h1 {
font-size: 16px;
line-height: 20px;
padding-bottom: 16px;
}
.tc-password-wrapper input {
width: 100%;
}
</style>
</div>
<!--~~ Static content for Google and browsers without JavaScript ~~-->
<noscript>
<div id="splashArea">
<p>This <a class="tc-tiddlylink-external" href="https://tiddlywiki.com" rel="noopener noreferrer" target="_blank">TiddlyWiki</a> contains the following tiddlers:</p><p><ul>
<li>$:/config/EmptyStoryMessage</li>
<li>$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home</li>
<li>$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme</li>
<li>$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info</li>
<li>$:/config/wikilabs/PluginLibraryWL/5.1.21</li>
<li>$:/config/wikilabs/PluginLibraryWL/5.1.23</li>
<li>$:/config/wikilabs/PluginLibraryWL/5.2.7</li>
<li>$:/config/wikilabs/PluginLibraryWL/5.3.1</li>
<li>$:/config/wikilabs/PluginLibraryWL/latest</li>
<li>$:/config/WikiParserRules/Inline/wikilink</li>
<li>$:/core-server</li>
<li>$:/core/templates/tiddlywiki5-external-js.html</li>
<li>$:/DefaultTiddlers</li>
<li>$:/favicon.ico</li>
<li>$:/isEncrypted</li>
<li>$:/palette</li>
<li>$:/plugins/wikilabs/info-tagmap</li>
<li>$:/SiteSubtitle</li>
<li>$:/SiteTitle</li>
<li>$:/status/RequireReloadDueToPluginChange</li>
<li>$:/StoryList</li>
<li>$:/theme</li>
<li>$:/themes/tiddlywiki/snowwhite</li>
<li>$:/themes/tiddlywiki/vanilla</li>
<li>$:/themes/tiddlywiki/vanilla/options/sidebarlayout</li>
<li>$:/themes/wikilabs/roundedtabs</li>
<li>$:/themes/wikilabs/slant-01</li>
<li>$:/themes/wikilabs/underlinedtabs</li>
<li>$:/warning</li>
<li>$:/wikilabs/save/community-links-big</li>
<li>$:/wikilabs/save/wikilabs-links</li>
<li>$:/wikilabs/template/theme</li>
<li>Advanced-Search</li>
<li>advanced-search-plus</li>
<li>advanced-search-plus/icon</li>
<li>Advanced-Tools</li>
<li>Alias</li>
<li>Animation</li>
<li>blue-button-style</li>
<li>bundler</li>
<li>cheatsheet</li>
<li>cheatsheet-f1.gif</li>
<li>click-effect</li>
<li>click-effect/icon</li>
<li>custom-markup</li>
<li>Details</li>
<li>Development</li>
<li>devtools</li>
<li>Dropdown</li>
<li>edit-tabs</li>
<li>edition</li>
<li>edition-template</li>
<li>Editor</li>
<li>Export</li>
<li>field-editor</li>
<li>field-search</li>
<li>field-search/icon</li>
<li>field-visibility</li>
<li>Filter</li>
<li>Formatting</li>
<li>GettingStarted</li>
<li>GitHub</li>
<li>How to use the Library Configuration Tiddler</li>
<li>Import</li>
<li>Info-Section</li>
<li>info-session</li>
<li>info-session/icon</li>
<li>info-tagmap</li>
<li>interactive-test-framework</li>
<li>JSON</li>
<li>keyvalues</li>
<li>kitchen-sink</li>
<li>library-configuration.png</li>
<li>link-to-tabs</li>
<li>link-to-tabs/icon</li>
<li>linked-list-with-description</li>
<li>Linking</li>
<li>Markdown</li>
<li>markdown-it</li>
<li>multicol-dropdown</li>
<li>Navigation</li>
<li>new-tiddler-from-search</li>
<li>new-tiddler-from-search/icon</li>
<li>Operators</li>
<li>Outline</li>
<li>palette-manager</li>
<li>palette-switcher</li>
<li>palette-watch</li>
<li>persistent-states</li>
<li>plugin-template</li>
<li>Popup</li>
<li>pragma-comment</li>
<li>Presentation</li>
<li>remove-states</li>
<li>rounded-tabs</li>
<li>Savers</li>
<li>script-manager</li>
<li>Search</li>
<li>Server</li>
<li>space-space-newline</li>
<li>speciallinks</li>
<li>Story</li>
<li>Story-River</li>
<li>Table-of-Contents</li>
<li>Tabs</li>
<li>Tagging</li>
<li>Tags</li>
<li>test-styles</li>
<li>test-thumb</li>
<li>theme-slant-01</li>
<li>thin-scrollbars</li>
<li>Tiddler-Creation</li>
<li>TiddlyWiki</li>
<li>tocP-parent-based-toc</li>
<li>Tools</li>
<li>trails</li>
<li>trigger</li>
<li>trim-whitespace</li>
<li>tw-mcp</li>
<li>UI</li>
<li>underlined-tabs</li>
<li>uni-link</li>
<li>uuidv7</li>
<li>Video</li>
<li>Videos</li>
<li>VideoThumbnail - Use the Library Configuration</li>
<li>webdav-lm</li>
<li>WikiLabs</li>
<li>wikilabs.github.io</li>
<li>Wikitex-Extensions</li>
<li>WikiText</li>
<li>wltm-open-story</li>
</ul>
</p>
<style>
.tc-remove-when-wiki-loaded {display: none;}
</style>
</div>
</noscript>
<!--~~ Ordinary tiddlers ~~-->
<script class="tiddlywiki-tiddler-store" type="application/json">[
{"title":"$:/config/EmptyStoryMessage","text":"{{GettingStarted||$:/core/ui/ViewTemplate}}"},
{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home","created":"20210328104403009","modified":"20240825144222562","type":"text/vnd.tiddlywiki","text":"hide"},
{"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme","created":"20260515074321524","modified":"20260515074321524","type":"text/vnd.tiddlywiki","text":"show"},
{"title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info","text":"show"},
{"title":"$:/config/wikilabs/PluginLibraryWL/5.1.21","caption":"Wikilabs 5.1.21 compatible Library","created":"20200605142858499","modified":"20231218155348983","tags":"$:/tags/PluginLibrary","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/pluginlibraryWL/library/v5.1.21-compatible/index.html","text":"~WikiLabs plugin library. Compatible with ~TiddlyWiki Version 5.1.21\n"},
{"title":"$:/config/wikilabs/PluginLibraryWL/5.1.23","caption":"Wikilabs 5.1.23 compatible Library","created":"20211006110404277","modified":"20231218155356610","tags":"$:/tags/PluginLibrary","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/pluginlibraryWL/library/v5.1.23-compatible/index.html","text":"~WikiLabs plugin library. Compatible with ~TiddlyWiki Version 5.1.23\n"},
{"title":"$:/config/wikilabs/PluginLibraryWL/5.2.7","caption":"Wikilabs 5.2.7 compatible Library","created":"20230702100607319","modified":"20231218155403389","tags":"$:/tags/PluginLibrary","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/pluginlibraryWL/library/v5.2.7-compatible/index.html","text":"~WikiLabs plugin library. Compatible with ~TiddlyWiki Version 5.2.7\n"},
{"title":"$:/config/wikilabs/PluginLibraryWL/5.3.1","caption":"Wikilabs 5.3.1 compatible Library","created":"20231218155036903","modified":"20231218155407764","tags":"$:/tags/PluginLibrary","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/pluginlibraryWL/library/v5.3.1-compatible/index.html","text":"~WikiLabs plugin library. Compatible with ~TiddlyWiki Version 5.3.1\n"},
{"title":"$:/config/wikilabs/PluginLibraryWL/latest","caption":"Wikilabs Library (latest)","created":"20200605142858499","modified":"20200611162358611","tags":"$:/tags/PluginLibrary","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/pluginlibraryWL/library/latest/index.html","text":"~WikiLabs plugin library latest version!\n"},
{"title":"$:/config/WikiParserRules/Inline/wikilink","created":"20231003102251324","modified":"20231003102251324","type":"text/vnd.tiddlywiki","text":"enable"},
{"title":"$:/core-server","name":"Core Server Components","description":"TiddlyWiki5 core server components","author":"JeremyRuston","core-version":">=5.0.0","platform":"server","plugin-priority":"0","list":"readme","stability":"STABILITY_2_STABLE","version":"5.4.1-prerelease","plugin-type":"plugin","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/core/modules/commander.js\":{\"title\":\"$:/core/modules/commander.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commander.js\\ntype: application/javascript\\nmodule-type: global\\n\\nThe $tw.Commander class is a command interpreter\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\n/*\\nParse a sequence of commands\\n\\tcommandTokens: an array of command string tokens\\n\\twiki: reference to the wiki store object\\n\\tstreams: {output:, error:}, each of which has a write(string) method\\n\\tcallback: a callback invoked as callback(err) where err is null if there was no error\\n*/\\nvar Commander = function(commandTokens,callback,wiki,streams) {\\n\\tvar path = require(\\\"path\\\");\\n\\tthis.commandTokens = commandTokens;\\n\\tthis.nextToken = 0;\\n\\tthis.callback = callback;\\n\\tthis.wiki = wiki;\\n\\tthis.streams = streams;\\n\\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\\n};\\n\\n/*\\nLog a string if verbose flag is set\\n*/\\nCommander.prototype.log = function(str) {\\n\\tif(this.verbose) {\\n\\t\\tthis.streams.output.write(str + \\\"\\\\n\\\");\\n\\t}\\n};\\n\\n/*\\nWrite a string if verbose flag is set\\n*/\\nCommander.prototype.write = function(str) {\\n\\tif(this.verbose) {\\n\\t\\tthis.streams.output.write(str);\\n\\t}\\n};\\n\\n/*\\nAdd a string of tokens to the command queue\\n*/\\nCommander.prototype.addCommandTokens = function(commandTokens) {\\n\\tvar params = commandTokens.slice(0);\\n\\tparams.unshift(0);\\n\\tparams.unshift(this.nextToken);\\n\\tArray.prototype.splice.apply(this.commandTokens,params);\\n};\\n\\n/*\\nExecute the sequence of commands and invoke a callback on completion\\n*/\\nCommander.prototype.execute = function() {\\n\\tthis.executeNextCommand();\\n};\\n\\n/*\\nExecute the next command in the sequence\\n*/\\nCommander.prototype.executeNextCommand = function() {\\n\\tvar self = this;\\n\\t// Invoke the callback if there are no more commands\\n\\tif(this.nextToken >= this.commandTokens.length) {\\n\\t\\tthis.callback(null);\\n\\t} else {\\n\\t\\t// Get and check the command token\\n\\t\\tvar commandName = this.commandTokens[this.nextToken++];\\n\\t\\tif(commandName.substr(0,2) !== \\\"--\\\") {\\n\\t\\t\\tthis.callback(\\\"Missing command: \\\" + commandName);\\n\\t\\t} else {\\n\\t\\t\\tcommandName = commandName.substr(2); // Trim off the --\\n\\t\\t\\t// Accumulate the parameters to the command\\n\\t\\t\\tvar params = [];\\n\\t\\t\\twhile(this.nextToken \u003C this.commandTokens.length && \\n\\t\\t\\t\\tthis.commandTokens[this.nextToken].substr(0,2) !== \\\"--\\\") {\\n\\t\\t\\t\\tparams.push(this.commandTokens[this.nextToken++]);\\n\\t\\t\\t}\\n\\t\\t\\t// Get the command info\\n\\t\\t\\tvar command = $tw.commands[commandName],\\n\\t\\t\\t\\tc,err;\\n\\t\\t\\tif(!command) {\\n\\t\\t\\t\\tthis.callback(\\\"Unknown command: \\\" + commandName);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif(this.verbose) {\\n\\t\\t\\t\\t\\tthis.streams.output.write(\\\"Executing command: \\\" + commandName + \\\" \\\" + params.join(\\\" \\\") + \\\"\\\\n\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Parse named parameters if required\\n\\t\\t\\t\\tif(command.info.namedParameterMode) {\\n\\t\\t\\t\\t\\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\\n\\t\\t\\t\\t\\tif(typeof params === \\\"string\\\") {\\n\\t\\t\\t\\t\\t\\treturn this.callback(params);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(command.info.synchronous) {\\n\\t\\t\\t\\t\\t// Synchronous command (await thenables)\\n\\t\\t\\t\\t\\tc = new command.Command(params,this);\\n\\t\\t\\t\\t\\terr = c.execute();\\n\\t\\t\\t\\t\\tif(err && typeof err.then === \\\"function\\\") {\\n\\t\\t\\t\\t\\t\\terr.then((e) => { e ? this.callback(e) : this.executeNextCommand(); });\\n\\t\\t\\t\\t\\t} else if(err) {\\n\\t\\t\\t\\t\\t\\tthis.callback(err);\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tthis.executeNextCommand();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t// Asynchronous command (await thenables)\\n\\t\\t\\t\\t\\tc = new command.Command(params,this,function(err) {\\n\\t\\t\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\t\\t\\tself.callback(err);\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tself.executeNextCommand();\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\terr = c.execute();\\n\\t\\t\\t\\t\\tif(err && typeof err.then === \\\"function\\\") {\\n\\t\\t\\t\\t\\t\\terr.then((e) => { if(e) this.callback(e); });\\n\\t\\t\\t\\t\\t} else if(err) {\\n\\t\\t\\t\\t\\t\\tthis.callback(err);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\\n*/\\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\\n\\tmandatoryParameters = mandatoryParameters || [];\\n\\tvar errors = [],\\n\\t\\tparamsByName = Object.create(null);\\n\\t// Extract the parameters\\n\\t$tw.utils.each(params,function(param) {\\n\\t\\tvar index = param.indexOf(\\\"=\\\");\\n\\t\\tif(index \u003C 1) {\\n\\t\\t\\terrors.push(\\\"malformed named parameter: '\\\" + param + \\\"'\\\");\\n\\t\\t}\\n\\t\\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\\n\\t});\\n\\t// Check the mandatory parameters are present\\n\\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\\n\\t\\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\\n\\t\\t\\terrors.push(\\\"missing mandatory parameter: '\\\" + mandatoryParameter + \\\"'\\\");\\n\\t\\t}\\n\\t});\\n\\t// Return any errors\\n\\tif(errors.length > 0) {\\n\\t\\treturn errors.join(\\\" and\\\\n\\\");\\n\\t} else {\\n\\t\\treturn paramsByName;\\n\\t}\\n};\\n\\nCommander.initCommands = function(moduleType) {\\n\\tmoduleType = moduleType || \\\"command\\\";\\n\\t$tw.commands = {};\\n\\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\\n\\t\\tvar c = $tw.commands[module.info.name] = {};\\n\\t\\t// Add the methods defined by the module\\n\\t\\tfor(var f in module) {\\n\\t\\t\\tif($tw.utils.hop(module,f)) {\\n\\t\\t\\t\\tc[f] = module[f];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n};\\n\\nexports.Commander = Commander;\\n\",\"type\":\"application/javascript\",\"module-type\":\"global\"},\"$:/core/modules/commands/build.js\":{\"title\":\"$:/core/modules/commands/build.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/build.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to build a build target\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"build\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\t// Get the build targets defined in the wiki\\n\\tvar buildTargets = $tw.boot.wikiInfo && $tw.boot.wikiInfo.build;\\n\\tif(!buildTargets) {\\n\\t\\treturn \\\"No build targets defined\\\";\\n\\t}\\n\\t// Loop through each of the specified targets\\n\\tvar targets;\\n\\tif(this.params.length > 0) {\\n\\t\\ttargets = this.params;\\n\\t} else {\\n\\t\\ttargets = Object.keys(buildTargets);\\n\\t}\\n\\tfor(var targetIndex=0; targetIndex\u003Ctargets.length; targetIndex++) {\\n\\t\\tvar target = targets[targetIndex],\\n\\t\\t\\tcommands = buildTargets[target];\\n\\t\\tif(!commands) {\\n\\t\\t\\treturn \\\"Build target '\\\" + target + \\\"' not found\\\";\\n\\t\\t}\\n\\t\\t// Add the commands to the queue\\n\\t\\tthis.commander.addCommandTokens(commands);\\n\\t}\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/clearpassword.js\":{\"title\":\"$:/core/modules/commands/clearpassword.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/clearpassword.js\\ntype: application/javascript\\nmodule-type: command\\n\\nClear password for crypto operations\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"clearpassword\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\t$tw.crypto.setPassword(null);\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/commands.js\":{\"title\":\"$:/core/modules/commands/commands.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/commands.js\\ntype: application/javascript\\nmodule-type: command\\n\\nRuns the commands returned from a filter\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"commands\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params, commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\t// Parse the filter\\n\\tvar filter = this.params[0];\\n\\tif(!filter) {\\n\\t\\treturn \\\"No filter specified\\\";\\n\\t}\\n\\tvar commands = this.commander.wiki.filterTiddlers(filter);\\n\\tif(commands.length === 0) {\\n\\t\\treturn \\\"No tiddlers found for filter '\\\" + filter + \\\"'\\\";\\n\\t}\\n\\tthis.commander.addCommandTokens(commands);\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/deletetiddlers.js\":{\"title\":\"$:/core/modules/commands/deletetiddlers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/deletetiddlers.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to delete tiddlers\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"deletetiddlers\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing filter\\\";\\n\\t}\\n\\tvar wiki = this.commander.wiki,\\n\\t\\tfilter = this.params[0],\\n\\t\\ttiddlers = wiki.filterTiddlers(filter);\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\twiki.deleteTiddler(title);\\n\\t});\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/editions.js\":{\"title\":\"$:/core/modules/commands/editions.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/editions.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to list the available editions\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"editions\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar self = this;\\n\\t// Output the list\\n\\tthis.commander.streams.output.write(\\\"Available editions:\\\\n\\\\n\\\");\\n\\tvar editionInfo = $tw.utils.getEditionInfo();\\n\\t$tw.utils.each(editionInfo,function(info,name) {\\n\\t\\tself.commander.streams.output.write(\\\" \\\" + name + \\\": \\\" + info.description + \\\"\\\\n\\\");\\n\\t});\\n\\tthis.commander.streams.output.write(\\\"\\\\n\\\");\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/fetch.js\":{\"title\":\"$:/core/modules/commands/fetch.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/fetch.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommands to fetch external tiddlers\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"fetch\\\",\\n\\tsynchronous: false\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 2) {\\n\\t\\treturn \\\"Missing subcommand and url\\\";\\n\\t}\\n\\tswitch(this.params[0]) {\\n\\t\\tcase \\\"raw-file\\\":\\n\\t\\t\\treturn this.fetchFiles({\\n\\t\\t\\t\\traw: true,\\n\\t\\t\\t\\turl: this.params[1],\\n\\t\\t\\t\\ttransformFilter: this.params[2] || \\\"\\\",\\n\\t\\t\\t\\tcallback: this.callback\\n\\t\\t\\t});\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"file\\\":\\n\\t\\t\\treturn this.fetchFiles({\\n\\t\\t\\t\\turl: this.params[1],\\n\\t\\t\\t\\timportFilter: this.params[2],\\n\\t\\t\\t\\ttransformFilter: this.params[3] || \\\"\\\",\\n\\t\\t\\t\\tcallback: this.callback\\n\\t\\t\\t});\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"raw-files\\\":\\n\\t\\t\\treturn this.fetchFiles({\\n\\t\\t\\t\\traw: true,\\n\\t\\t\\t\\turlFilter: this.params[1],\\n\\t\\t\\t\\ttransformFilter: this.params[2] || \\\"\\\",\\n\\t\\t\\t\\tcallback: this.callback\\n\\t\\t\\t});\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"files\\\":\\n\\t\\t\\treturn this.fetchFiles({\\n\\t\\t\\t\\turlFilter: this.params[1],\\n\\t\\t\\t\\timportFilter: this.params[2],\\n\\t\\t\\t\\ttransformFilter: this.params[3] || \\\"\\\",\\n\\t\\t\\t\\tcallback: this.callback\\n\\t\\t\\t});\\n\\t\\t\\tbreak;\\n\\t}\\n\\treturn null;\\n};\\n\\nCommand.prototype.fetchFiles = function(options) {\\n\\tvar self = this;\\n\\t// Get the list of URLs\\n\\tvar urls;\\n\\tif(options.url) {\\n\\t\\turls = [options.url];\\n\\t} else if(options.urlFilter) {\\n\\t\\turls = this.commander.wiki.filterTiddlers(options.urlFilter);\\n\\t} else {\\n\\t\\treturn \\\"Missing URL\\\";\\n\\t}\\n\\t// Process each URL in turn\\n\\tvar next = 0;\\n\\tvar getNextFile = function(err) {\\n\\t\\tif(err) {\\n\\t\\t\\treturn options.callback(err);\\n\\t\\t}\\n\\t\\tif(next \u003C urls.length) {\\n\\t\\t\\tself.fetchFile(urls[next++],options,getNextFile);\\n\\t\\t} else {\\n\\t\\t\\toptions.callback(null);\\n\\t\\t}\\n\\t};\\n\\tgetNextFile(null);\\n\\t// Success\\n\\treturn null;\\n};\\n\\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\\n\\tif(redirectCount > 10) {\\n\\t\\treturn callback(\\\"Error too many redirects retrieving \\\" + url);\\n\\t}\\n\\tvar self = this,\\n\\t\\tlib = url.substr(0,8) === \\\"https://\\\" ? require(\\\"https\\\") : require(\\\"http\\\");\\n\\tlib.get(url).on(\\\"response\\\",function(response) {\\n\\t\\tvar type = (response.headers[\\\"content-type\\\"] || \\\"\\\").split(\\\";\\\")[0],\\n\\t\\t\\tdata = [];\\n\\t\\tself.commander.write(\\\"Reading \\\" + url + \\\": \\\");\\n\\t\\tresponse.on(\\\"data\\\",function(chunk) {\\n\\t\\t\\tdata.push(chunk);\\n\\t\\t\\tself.commander.write(\\\".\\\");\\n\\t\\t});\\n\\t\\tresponse.on(\\\"end\\\",function() {\\n\\t\\t\\tself.commander.write(\\\"\\\\n\\\");\\n\\t\\t\\tif(response.statusCode === 200) {\\n\\t\\t\\t\\tself.processBody(Buffer.concat(data),type,options,url);\\n\\t\\t\\t\\tcallback(null);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\\n\\t\\t\\t\\t\\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\treturn callback(\\\"Error \\\" + response.statusCode + \\\" retrieving \\\" + url);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\tresponse.on(\\\"error\\\",function(e) {\\n\\t\\t\\tconsole.log(\\\"Error on GET request: \\\" + e);\\n\\t\\t\\tcallback(e);\\n\\t\\t});\\n\\t});\\n\\treturn null;\\n};\\n\\nCommand.prototype.processBody = function(body,type,options,url) {\\n\\tvar self = this;\\n\\t// Collect the tiddlers in a wiki\\n\\tvar incomingWiki = new $tw.Wiki();\\n\\tif(options.raw) {\\n\\t\\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\\n\\t\\t\\tencoding = typeInfo ? typeInfo.encoding : \\\"utf8\\\";\\n\\t\\tincomingWiki.addTiddler(new $tw.Tiddler({\\n\\t\\t\\ttitle: url,\\n\\t\\t\\ttype: type,\\n\\t\\t\\ttext: body.toString(encoding)\\n\\t\\t}));\\n\\t} else {\\n\\t\\t// Deserialise the file to extract the tiddlers\\n\\t\\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \\\"text/html\\\",body.toString(\\\"utf8\\\"),{});\\n\\t\\t$tw.utils.each(tiddlers,function(tiddler) {\\n\\t\\t\\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\\n\\t\\t});\\n\\t}\\n\\t// Filter the tiddlers to select the ones we want\\n\\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \\\"[all[tiddlers]]\\\");\\n\\t// Import the selected tiddlers\\n\\tvar count = 0;\\n\\tincomingWiki.each(function(tiddler,title) {\\n\\t\\tif(filteredTitles.indexOf(title) !== -1) {\\n\\t\\t\\tvar newTiddler;\\n\\t\\t\\tif(options.transformFilter) {\\n\\t\\t\\t\\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\\\"\\\"])[0];\\n\\t\\t\\t\\tif(transformedTitle) {\\n\\t\\t\\t\\t\\tself.commander.log(\\\"Importing \\\" + title + \\\" as \\\" + transformedTitle);\\n\\t\\t\\t\\t\\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tself.commander.log(\\\"Importing \\\" + title);\\n\\t\\t\\t\\tnewTiddler = tiddler;\\n\\t\\t\\t}\\n\\t\\t\\tself.commander.wiki.importTiddler(newTiddler);\\n\\t\\t\\tcount++;\\n\\t\\t}\\n\\t});\\n\\tself.commander.log(\\\"Imported \\\" + count + \\\" tiddlers\\\");\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/help.js\":{\"title\":\"$:/core/modules/commands/help.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/help.js\\ntype: application/javascript\\nmodule-type: command\\n\\nHelp command\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"help\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar subhelp = this.params[0] || \\\"default\\\",\\n\\t\\thelpBase = \\\"$:/language/Help/\\\",\\n\\t\\ttext;\\n\\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\\n\\t\\tsubhelp = \\\"notfound\\\";\\n\\t}\\n\\t// Wikify the help as formatted text (ie block elements generate newlines)\\n\\ttext = this.commander.wiki.renderTiddler(\\\"text/plain-formatted\\\",helpBase + subhelp);\\n\\t// Remove any leading linebreaks\\n\\ttext = text.replace(/^(\\\\r?\\\\n)*/g,\\\"\\\");\\n\\tthis.commander.streams.output.write(text);\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/import.js\":{\"title\":\"$:/core/modules/commands/import.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/import.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to import tiddlers from a file\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"import\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\");\\n\\tif(this.params.length \u003C 2) {\\n\\t\\treturn \\\"Missing parameters\\\";\\n\\t}\\n\\tvar filename = self.params[0],\\n\\t\\tdeserializer = self.params[1],\\n\\t\\ttitle = self.params[2] || filename,\\n\\t\\tencoding = self.params[3] || \\\"utf8\\\",\\n\\t\\ttext = fs.readFileSync(filename,encoding),\\n\\t\\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\\n\\t$tw.utils.each(tiddlers,function(tiddler) {\\n\\t\\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\\n\\t});\\n\\tthis.commander.log(tiddlers.length + \\\" tiddler(s) imported\\\");\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/init.js\":{\"title\":\"$:/core/modules/commands/init.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/init.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to initialise an empty wiki folder\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"init\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar fs = require(\\\"fs\\\");\\n\\t// Check that we don't already have a valid wiki folder\\n\\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\\n\\t\\treturn \\\"Wiki folder is not empty\\\";\\n\\t}\\n\\t// Loop through each of the specified editions\\n\\tvar editions = this.params.length > 0 ? this.params : [\\\"empty\\\"];\\n\\tfor(var editionIndex=0; editionIndex\u003Ceditions.length; editionIndex++) {\\n\\t\\tvar editionName = editions[editionIndex];\\n\\t\\t// Check the edition exists\\n\\t\\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\\n\\t\\tif(!$tw.utils.isDirectory(editionPath)) {\\n\\t\\t\\treturn \\\"Edition '\\\" + editionName + \\\"' not found\\\";\\n\\t\\t}\\n\\t\\t// Copy the edition content\\n\\t\\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\\n\\t\\tif(!err) {\\n\\t\\t\\tthis.commander.streams.output.write(\\\"Copied edition '\\\" + editionName + \\\"' to \\\" + $tw.boot.wikiPath + \\\"\\\\n\\\");\\n\\t\\t} else {\\n\\t\\t\\treturn err;\\n\\t\\t}\\n\\t}\\n\\t// Tweak the tiddlywiki.info to remove any included wikis\\n\\tvar packagePath = $tw.boot.wikiPath + \\\"/tiddlywiki.info\\\",\\n\\t\\tpackageJson = $tw.utils.parseJSONSafe(fs.readFileSync(packagePath));\\n\\tdelete packageJson.includeWikis;\\n\\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/listen.js\":{\"title\":\"$:/core/modules/commands/listen.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/listen.js\\ntype: application/javascript\\nmodule-type: command\\n\\nListen for HTTP requests and serve tiddlers\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nvar Server = require(\\\"$:/core/modules/server/server.js\\\").Server;\\n\\nexports.info = {\\n\\tname: \\\"listen\\\",\\n\\tsynchronous: true,\\n\\tnamedParameterMode: true,\\n\\tmandatoryParameters: []\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar self = this;\\n\\tif(!$tw.boot.wikiTiddlersPath) {\\n\\t\\t$tw.utils.warning(\\\"Warning: Wiki folder '\\\" + $tw.boot.wikiPath + \\\"' does not exist or is missing a tiddlywiki.info file\\\");\\n\\t}\\n\\t// Set up server\\n\\tthis.server = new Server({\\n\\t\\twiki: this.commander.wiki,\\n\\t\\tvariables: self.params\\n\\t});\\n\\tvar nodeServer = this.server.listen();\\n\\t$tw.hooks.invokeHook(\\\"th-server-command-post-start\\\",this.server,nodeServer,\\\"tiddlywiki\\\");\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/load.js\":{\"title\":\"$:/core/modules/commands/load.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/load.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to load tiddlers from a file or directory\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"load\\\",\\n\\tsynchronous: false\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar self = this;\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing filename\\\";\\n\\t}\\n\\tvar tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\\n\\t\\tcount = 0;\\n\\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\\n\\t\\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\\n\\t\\t\\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\\n\\t\\t\\tcount++;\\n\\t\\t});\\n\\t});\\n\\tif(!count && self.params[1] !== \\\"noerror\\\") {\\n\\t\\tself.callback(\\\"No tiddlers found in file \\\\\\\"\\\" + self.params[0] + \\\"\\\\\\\"\\\");\\n\\t} else {\\n\\t\\tself.callback(null);\\n\\t}\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/makelibrary.js\":{\"title\":\"$:/core/modules/commands/makelibrary.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/makelibrary.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to pack all of the plugins in the library into a plugin tiddler of type \\\"library\\\"\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"makelibrary\\\",\\n\\tsynchronous: true\\n};\\n\\nvar UPGRADE_LIBRARY_TITLE = \\\"$:/UpgradeLibrary\\\";\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar wiki = this.commander.wiki,\\n\\t\\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\\n\\t\\ttiddlers = $tw.utils.getAllPlugins();\\n\\t// Save the upgrade library tiddler\\n\\tvar pluginFields = {\\n\\t\\ttitle: upgradeLibraryTitle,\\n\\t\\ttype: \\\"application/json\\\",\\n\\t\\t\\\"plugin-type\\\": \\\"library\\\",\\n\\t\\t\\\"text\\\": JSON.stringify({tiddlers: tiddlers})\\n\\t};\\n\\twiki.addTiddler(new $tw.Tiddler(pluginFields));\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/output.js\":{\"title\":\"$:/core/modules/commands/output.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/output.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to set the default output location (defaults to current working directory)\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"output\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar path = require(\\\"path\\\");\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing output path\\\";\\n\\t}\\n\\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/password.js\":{\"title\":\"$:/core/modules/commands/password.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/password.js\\ntype: application/javascript\\nmodule-type: command\\n\\nSave password for crypto operations\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"password\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing password\\\";\\n\\t}\\n\\t$tw.crypto.setPassword(this.params[0]);\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/render.js\":{\"title\":\"$:/core/modules/commands/render.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/render.js\\ntype: application/javascript\\nmodule-type: command\\n\\nRender individual tiddlers and save the results to the specified files\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\t\\nexports.info = {\\n\\tname: \\\"render\\\",\\n\\tsynchronous: true\\n};\\n\\t\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\t\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing tiddler filter\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\twiki = this.commander.wiki,\\n\\t\\ttiddlerFilter = this.params[0],\\n\\t\\tfilenameFilter = this.params[1] || \\\"[is[tiddler]addsuffix[.html]]\\\",\\n\\t\\ttype = this.params[2] || \\\"text/html\\\",\\n\\t\\ttemplate = this.params[3],\\n\\t\\tvariableList = this.params.slice(4),\\n\\t\\ttiddlers = wiki.filterTiddlers(tiddlerFilter),\\n\\t\\tvariables = Object.create(null);\\n\\twhile(variableList.length >= 2) {\\n\\t\\tvariables[variableList[0]] = variableList[1];\\n\\t\\tvariableList = variableList.slice(2);\\n\\t}\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\tvar filenameResults = wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]));\\n\\t\\tif(filenameResults.length > 0) {\\n\\t\\t\\tvar filepath = path.resolve(self.commander.outputPath,filenameResults[0]);\\n\\t\\t\\tif(self.commander.verbose) {\\n\\t\\t\\t\\tconsole.log(\\\"Rendering \\\\\\\"\\\" + title + \\\"\\\\\\\" to \\\\\\\"\\\" + filepath + \\\"\\\\\\\"\\\");\\n\\t\\t\\t}\\n\\t\\t\\tvar parser = wiki.parseTiddler(template || title),\\n\\t\\t\\t\\twidgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},variables,{currentTiddler: title,storyTiddler: title})}),\\n\\t\\t\\t\\tcontainer = $tw.fakeDocument.createElement(\\\"div\\\");\\n\\t\\t\\twidgetNode.render(container,null);\\n\\t\\t\\tvar text = type === \\\"text/html\\\" ? container.innerHTML : container.textContent;\\n\\t\\t\\t$tw.utils.createFileDirectories(filepath);\\n\\t\\t\\tfs.writeFileSync(filepath,text,\\\"utf8\\\");\\n\\t\\t} else {\\n\\t\\t\\tconsole.log(\\\"Not rendering \\\\\\\"\\\" + title + \\\"\\\\\\\" because the filename filter returned an empty result\\\");\\n\\t\\t}\\n\\t});\\n\\treturn null;\\n};\\n\\t\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/rendertiddler.js\":{\"title\":\"$:/core/modules/commands/rendertiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/rendertiddler.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to render a tiddler and save it to a file\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"rendertiddler\\\",\\n\\tsynchronous: false\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 2) {\\n\\t\\treturn \\\"Missing filename\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\ttitle = this.params[0],\\n\\t\\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\\n\\t\\ttype = this.params[2] || \\\"text/html\\\",\\n\\t\\ttemplate = this.params[3],\\n\\t\\tname = this.params[4],\\n\\t\\tvalue = this.params[5],\\n\\t\\tvariables = {};\\n\\t$tw.utils.createFileDirectories(filename);\\n\\tif(template) {\\n\\t\\tvariables.currentTiddler = title;\\n\\t\\tvariables.storyTiddler = title;\\n\\t\\ttitle = template;\\n\\t}\\n\\tif(name && value) {\\n\\t\\tvariables[name] = value;\\n\\t}\\n\\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\\\"utf8\\\",function(err) {\\n\\t\\tself.callback(err);\\n\\t});\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/rendertiddlers.js\":{\"title\":\"$:/core/modules/commands/rendertiddlers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/rendertiddlers.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to render several tiddlers to a folder of files\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"rendertiddlers\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 2) {\\n\\t\\treturn \\\"Missing filename\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\twiki = this.commander.wiki,\\n\\t\\tfilter = this.params[0],\\n\\t\\ttemplate = this.params[1],\\n\\t\\toutputPath = this.commander.outputPath,\\n\\t\\tpathname = path.resolve(outputPath,this.params[2]),\\n\\t\\ttype = this.params[3] || \\\"text/html\\\",\\n\\t\\textension = this.params[4] || \\\".html\\\",\\n\\t\\tdeleteDirectory = (this.params[5] || \\\"\\\").toLowerCase() !== \\\"noclean\\\",\\n\\t\\ttiddlers = wiki.filterTiddlers(filter);\\n\\tif(deleteDirectory) {\\n\\t\\t$tw.utils.deleteDirectory(pathname);\\n\\t}\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\tvar parser = wiki.parseTiddler(template),\\n\\t\\t\\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title, storyTiddler: title}}),\\n\\t\\t\\tcontainer = $tw.fakeDocument.createElement(\\\"div\\\");\\n\\t\\twidgetNode.render(container,null);\\n\\t\\tvar text = type === \\\"text/html\\\" ? container.innerHTML : container.textContent,\\n\\t\\t\\texportPath = null;\\n\\t\\tif($tw.utils.hop($tw.macros,\\\"tv-get-export-path\\\")) {\\n\\t\\t\\tvar macroPath = $tw.macros[\\\"tv-get-export-path\\\"].run.apply(self,[title]);\\n\\t\\t\\tif(macroPath) {\\n\\t\\t\\t\\texportPath = path.resolve(outputPath,macroPath + extension);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tvar finalPath = exportPath || path.resolve(pathname,$tw.utils.encodeURIComponentExtended(title) + extension);\\n\\t\\t$tw.utils.createFileDirectories(finalPath);\\n\\t\\tfs.writeFileSync(finalPath,text,\\\"utf8\\\");\\n\\t});\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/save.js\":{\"title\":\"$:/core/modules/commands/save.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/save.js\\ntype: application/javascript\\nmodule-type: command\\n\\nSaves individual tiddlers in their raw text or binary format to the specified files\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\t\\nexports.info = {\\n\\tname: \\\"save\\\",\\n\\tsynchronous: true\\n};\\n\\t\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\t\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing filename filter\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\tresult = null,\\n\\t\\twiki = this.commander.wiki,\\n\\t\\ttiddlerFilter = this.params[0],\\n\\t\\tfilenameFilter = this.params[1] || \\\"[is[tiddler]]\\\",\\n\\t\\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\tif(!result) {\\n\\t\\t\\tvar tiddler = self.commander.wiki.getTiddler(title);\\n\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\\n\\t\\t\\t\\t\\tdirectory: path.resolve(self.commander.outputPath),\\n\\t\\t\\t\\t\\tpathFilters: [filenameFilter],\\n\\t\\t\\t\\t\\twiki: wiki,\\n\\t\\t\\t\\t\\tfileInfo: {\\n\\t\\t\\t\\t\\t\\toverwrite: true\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\tif(self.commander.verbose) {\\n\\t\\t\\t\\t\\tconsole.log(\\\"Saving \\\\\\\"\\\" + title + \\\"\\\\\\\" to \\\\\\\"\\\" + fileInfo.filepath + \\\"\\\\\\\"\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\\n\\t\\t\\t\\t} catch (err) {\\n\\t\\t\\t\\t\\tresult = \\\"Error saving tiddler \\\\\\\"\\\" + title + \\\"\\\\\\\", to file: \\\\\\\"\\\" + fileInfo.filepath + \\\"\\\\\\\"\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tresult = \\\"Tiddler '\\\" + title + \\\"' not found\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn result;\\n};\\n\\t\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/savelibrarytiddlers.js\":{\"title\":\"$:/core/modules/commands/savelibrarytiddlers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\\n\\n--savelibrarytiddlers \u003Ctiddler> \u003Ctiddler-filter> \u003Cpathname> \u003Cskinnylisting>\\n\\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\\n\\nThe tiddler filter specifies the plugins to be included.\\n\\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\\n\\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"savelibrarytiddlers\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 2) {\\n\\t\\treturn \\\"Missing filename\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\tcontainerTitle = this.params[0],\\n\\t\\tfilter = this.params[1],\\n\\t\\tbasepath = this.params[2],\\n\\t\\tskinnyListTitle = this.params[3];\\n\\t// Get the container tiddler as data\\n\\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\\n\\tif(!containerData) {\\n\\t\\treturn \\\"'\\\" + containerTitle + \\\"' is not a tiddler bundle\\\";\\n\\t}\\n\\t// Filter the list of plugins\\n\\tvar pluginList = [];\\n\\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\\n\\t\\tpluginList.push(title);\\n\\t});\\n\\tvar filteredPluginList;\\n\\tif(filter) {\\n\\t\\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\\n\\t} else {\\n\\t\\tfilteredPluginList = pluginList;\\n\\t}\\n\\t// Iterate through the plugins\\n\\tvar skinnyList = [];\\n\\t$tw.utils.each(filteredPluginList,function(title) {\\n\\t\\tvar tiddler = containerData.tiddlers[title];\\n\\t\\t// Save each JSON file and collect the skinny data\\n\\t\\tvar pathname = path.resolve(self.commander.outputPath,basepath + $tw.utils.encodeURIComponentExtended(title) + \\\".json\\\");\\n\\t\\t$tw.utils.createFileDirectories(pathname);\\n\\t\\tfs.writeFileSync(pathname,JSON.stringify(tiddler),\\\"utf8\\\");\\n\\t\\t// Collect the skinny list data\\n\\t\\tvar pluginTiddlers = $tw.utils.parseJSONSafe(tiddler.text),\\n\\t\\t\\treadmeContent = (pluginTiddlers.tiddlers[title + \\\"/readme\\\"] || {}).text,\\n\\t\\t\\tdoesRequireReload = !!self.commander.wiki.doesPluginInfoRequireReload(pluginTiddlers),\\n\\t\\t\\ticonTiddler = pluginTiddlers.tiddlers[title + \\\"/icon\\\"] || {},\\n\\t\\t\\ticonType = iconTiddler.type,\\n\\t\\t\\ticonText = iconTiddler.text,\\n\\t\\t\\ticonContent;\\n\\t\\tif(iconType && iconText) {\\n\\t\\t\\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\\n\\t\\t}\\n\\t\\tskinnyList.push($tw.utils.extend({},tiddler,{\\n\\t\\t\\ttext: undefined,\\n\\t\\t\\treadme: readmeContent,\\n\\t\\t\\t\\\"requires-reload\\\": doesRequireReload ? \\\"yes\\\" : \\\"no\\\",\\n\\t\\t\\ticon: iconContent\\n\\t\\t}));\\n\\t});\\n\\t// Save the catalogue tiddler\\n\\tif(skinnyListTitle) {\\n\\t\\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\\n\\t}\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/savetiddler.js\":{\"title\":\"$:/core/modules/commands/savetiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/savetiddler.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to save the content of a tiddler to a file\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"savetiddler\\\",\\n\\tsynchronous: false\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 2) {\\n\\t\\treturn \\\"Missing filename\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\ttitle = this.params[0],\\n\\t\\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\\n\\t\\ttiddler = this.commander.wiki.getTiddler(title);\\n\\tif(tiddler) {\\n\\t\\tvar type = tiddler.fields.type || \\\"text/vnd.tiddlywiki\\\",\\n\\t\\t\\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \\\"utf8\\\"};\\n\\t\\t$tw.utils.createFileDirectories(filename);\\n\\t\\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\\n\\t\\t\\tself.callback(err);\\n\\t\\t});\\n\\t} else {\\n\\t\\treturn \\\"Missing tiddler: \\\" + title;\\n\\t}\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/savetiddlers.js\":{\"title\":\"$:/core/modules/commands/savetiddlers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/savetiddlers.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to save several tiddlers to a folder of files\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"savetiddlers\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing filename\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\twiki = this.commander.wiki,\\n\\t\\tfilter = this.params[0],\\n\\t\\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\\n\\t\\tdeleteDirectory = (this.params[2] || \\\"\\\").toLowerCase() !== \\\"noclean\\\",\\n\\t\\ttiddlers = wiki.filterTiddlers(filter);\\n\\tif(deleteDirectory) {\\n\\t\\t$tw.utils.deleteDirectory(pathname);\\n\\t}\\n\\t$tw.utils.createDirectory(pathname);\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\tvar tiddler = self.commander.wiki.getTiddler(title),\\n\\t\\t\\ttype = tiddler.fields.type || \\\"text/vnd.tiddlywiki\\\",\\n\\t\\t\\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \\\"utf8\\\"},\\n\\t\\t\\tfilename = path.resolve(pathname,$tw.utils.encodeURIComponentExtended(title));\\n\\t\\tfs.writeFileSync(filename,tiddler.fields.text || \\\"\\\",contentTypeInfo.encoding);\\n\\t});\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/savewikifolder.js\":{\"title\":\"$:/core/modules/commands/savewikifolder.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/savewikifolder.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to save the current wiki as a wiki folder\\n\\n--savewikifolder \u003Cwikifolderpath> [ [\u003Cname>=\u003Cvalue>] ]*\\n\\nThe following options are supported:\\n\\n* ''filter'': a filter expression defining the tiddlers to be included in the output\\n* ''explodePlugins'': set to \\\"no\\\" to suppress exploding plugins into their constituent shadow tiddlers (defaults to \\\"yes\\\")\\n\\nSupports backward compatibility with --savewikifolder \u003Cwikifolderpath> [\u003Cfilter>] [ [\u003Cname>=\u003Cvalue>] ]*\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"savewikifolder\\\",\\n\\tsynchronous: true\\n};\\n\\nvar fs,path;\\nif($tw.node) {\\n\\tfs = require(\\\"fs\\\");\\n\\tpath = require(\\\"path\\\");\\n}\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing wiki folder path\\\";\\n\\t}\\n\\tvar regFilter = /^[a-zA-Z0-9\\\\.\\\\-_]+=/g, // dynamic parameters\\n\\t\\tnamedParames,\\n\\t\\ttiddlerFilter,\\n\\t\\toptions = {};\\n\\tif(regFilter.test(this.params[1])) { \\n\\t\\tnamedParames = this.commander.extractNamedParameters(this.params.slice(1));\\n\\t\\ttiddlerFilter = namedParames.filter || \\\"[all[tiddlers]]\\\";\\n\\t} else {\\n\\t\\tnamedParames = this.commander.extractNamedParameters(this.params.slice(2));\\n\\t\\ttiddlerFilter = this.params[1];\\n\\t}\\n\\ttiddlerFilter = tiddlerFilter || \\\"[all[tiddlers]]\\\";\\n\\toptions.explodePlugins = namedParames.explodePlugins || \\\"yes\\\";\\n\\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],tiddlerFilter,this.commander,options);\\n\\treturn wikifoldermaker.save();\\n};\\n\\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander,options) {\\n\\tthis.wikiFolderPath = wikiFolderPath;\\n\\tthis.wikiFilter = wikiFilter;\\n\\tthis.commander = commander;\\n\\tthis.explodePlugins = options.explodePlugins;\\n\\tthis.wiki = commander.wiki;\\n\\tthis.savedPaths = []; // So that we can detect filename clashes\\n}\\n\\nWikiFolderMaker.prototype.log = function(str) {\\n\\tif(this.commander.verbose) {\\n\\t\\tconsole.log(str);\\n\\t}\\n};\\n\\nWikiFolderMaker.prototype.tiddlersToIgnore = [\\n\\t\\\"$:/boot/boot.css\\\",\\n\\t\\\"$:/boot/boot.js\\\",\\n\\t\\\"$:/boot/bootprefix.js\\\",\\n\\t\\\"$:/core\\\",\\n\\t\\\"$:/core-server\\\",\\n\\t\\\"$:/library/sjcl.js\\\",\\n\\t\\\"$:/temp/info-plugin\\\"\\n];\\n\\n/*\\nReturns null if successful, or an error string if there was an error\\n*/\\nWikiFolderMaker.prototype.save = function() {\\n\\tvar self = this;\\n\\t// Check that the output directory doesn't exist\\n\\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\\n\\t\\treturn \\\"The unpackwiki command requires that the output wiki folder be empty\\\";\\n\\t}\\n\\t// Get the tiddlers from the source wiki\\n\\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\\n\\t// Initialise a new tiddlwiki.info file\\n\\tvar newWikiInfo = {};\\n\\t// Process each incoming tiddler in turn\\n\\t$tw.utils.each(tiddlerTitles,function(title) {\\n\\t\\tvar tiddler = self.wiki.getTiddler(title);\\n\\t\\tif(tiddler) {\\n\\t\\t\\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\\n\\t\\t\\t\\t// Ignore the core plugin and the ephemeral info plugin\\n\\t\\t\\t\\tself.log(\\\"Ignoring tiddler: \\\" + title);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tvar type = tiddler.fields.type,\\n\\t\\t\\t\\t\\tpluginType = tiddler.fields[\\\"plugin-type\\\"];\\n\\t\\t\\t\\tif(type === \\\"application/json\\\" && pluginType) {\\n\\t\\t\\t\\t\\t// Plugin tiddler\\n\\t\\t\\t\\t\\tvar libraryDetails = self.findPluginInLibrary(title);\\n\\t\\t\\t\\t\\tif(libraryDetails) {\\n\\t\\t\\t\\t\\t\\t// A plugin from the core library\\n\\t\\t\\t\\t\\t\\tself.log(\\\"Adding built-in plugin: \\\" + libraryDetails.name);\\n\\t\\t\\t\\t\\t\\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type] || [];\\n\\t\\t\\t\\t\\t\\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\\n\\t\\t\\t\\t\\t} else if(self.explodePlugins !== \\\"no\\\") {\\n\\t\\t\\t\\t\\t\\t// A custom plugin\\n\\t\\t\\t\\t\\t\\tself.log(\\\"Processing custom plugin: \\\" + title);\\n\\t\\t\\t\\t\\t\\tself.saveCustomPlugin(tiddler);\\n\\t\\t\\t\\t\\t} else if(self.explodePlugins === \\\"no\\\") {\\n\\t\\t\\t\\t\\t\\tself.log(\\\"Processing custom plugin to tiddlders folder: \\\" + title);\\n\\t\\t\\t\\t\\t\\tself.saveTiddler(\\\"tiddlers\\\", tiddler);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t// Ordinary tiddler\\n\\t\\t\\t\\t\\tself.saveTiddler(\\\"tiddlers\\\",tiddler);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\t// Save the tiddlywiki.info file\\n\\tthis.saveJSONFile(\\\"tiddlywiki.info\\\",newWikiInfo);\\n\\tself.log(\\\"Writing tiddlywiki.info: \\\" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\\n\\treturn null;\\n};\\n\\n/*\\nTest whether the specified tiddler is a plugin in the plugin library\\n*/\\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\\n\\tvar parts = title.split(\\\"/\\\"),\\n\\t\\tpluginPath, type, name;\\n\\tif(parts[0] === \\\"$:\\\") {\\n\\t\\tif(parts[1] === \\\"languages\\\" && parts.length === 3) {\\n\\t\\t\\tpluginPath = \\\"languages\\\" + path.sep + parts[2];\\n\\t\\t\\ttype = parts[1];\\n\\t\\t\\tname = parts[2];\\n\\t\\t} else if(parts[1] === \\\"plugins\\\" || parts[1] === \\\"themes\\\" && parts.length === 4) {\\n\\t\\t\\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\\n\\t\\t\\ttype = parts[1];\\n\\t\\t\\tname = parts[2] + \\\"/\\\" + parts[3];\\n\\t\\t}\\n\\t}\\n\\tif(pluginPath && type && name) {\\n\\t\\tpluginPath = path.resolve($tw.boot.bootPath,\\\"..\\\",pluginPath);\\n\\t\\tif(fs.existsSync(pluginPath)) {\\n\\t\\t\\treturn {\\n\\t\\t\\t\\tpluginPath: pluginPath,\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\tname: name\\n\\t\\t\\t};\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n};\\n\\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\\n\\tvar self = this,\\n\\t\\tpluginTitle = pluginTiddler.fields.title,\\n\\t\\ttitleParts = pluginTitle.split(\\\"/\\\"),\\n\\t\\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\\n\\t\\t\\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\\\"plugin-type\\\"] + \\\"s\\\")\\n\\t\\t}),\\n\\t\\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\\\"text\\\",\\\"type\\\"]});\\n\\tthis.saveJSONFile(directory + path.sep + \\\"plugin.info\\\",pluginInfo);\\n\\tself.log(\\\"Writing \\\" + directory + path.sep + \\\"plugin.info: \\\" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\\n\\tvar pluginTiddlers = $tw.utils.parseJSONSafe(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\\n\\t$tw.utils.each(pluginTiddlers,function(tiddler,title) {\\n\\t\\tif(!tiddler.title) {\\n\\t\\t\\ttiddler.title = title;\\n\\t\\t}\\n\\t\\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\\n\\t});\\n};\\n\\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\\n\\tvar fileInfo, pathFilters, extFilters;\\n\\tif(this.wiki.tiddlerExists(\\\"$:/config/FileSystemPaths\\\")) {\\n\\t\\tpathFilters = this.wiki.getTiddlerText(\\\"$:/config/FileSystemPaths\\\",\\\"\\\").split(\\\"\\\\n\\\");\\n\\t}\\n\\tif(this.wiki.tiddlerExists(\\\"$:/config/FileSystemExtensions\\\")) {\\n\\t\\textFilters = this.wiki.getTiddlerText(\\\"$:/config/FileSystemExtensions\\\",\\\"\\\").split(\\\"\\\\n\\\");\\n\\t}\\n\\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\\n\\t\\tdirectory: path.resolve(this.wikiFolderPath,directory),\\n\\t\\tpathFilters: pathFilters,\\n\\t\\textFilters: extFilters,\\n\\t\\twiki: this.wiki,\\n\\t\\tfileInfo: {}\\n\\t});\\n\\ttry {\\n\\t\\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\\n\\t} catch (err) {\\n\\t\\tconsole.log(\\\"SaveWikiFolder: Error saving file '\\\" + fileInfo.filepath + \\\"', tiddler: '\\\" + tiddler.fields.title);\\n\\t}\\n};\\n\\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\\n\\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\\n};\\n\\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\\n\\tthis.saveFile(filename,\\\"utf8\\\",data);\\n};\\n\\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\\n\\tvar filepath = path.resolve(this.wikiFolderPath,filename);\\n\\t$tw.utils.createFileDirectories(filepath);\\n\\tfs.writeFileSync(filepath,data,encoding);\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/server.js\":{\"title\":\"$:/core/modules/commands/server.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/server.js\\ntype: application/javascript\\nmodule-type: command\\n\\nDeprecated legacy command for serving tiddlers\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nvar Server = require(\\\"$:/core/modules/server/server.js\\\").Server;\\n\\nexports.info = {\\n\\tname: \\\"server\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(!$tw.boot.wikiTiddlersPath) {\\n\\t\\t$tw.utils.warning(\\\"Warning: Wiki folder '\\\" + $tw.boot.wikiPath + \\\"' does not exist or is missing a tiddlywiki.info file\\\");\\n\\t}\\n\\t// Set up server\\n\\tthis.server = new Server({\\n\\t\\twiki: this.commander.wiki,\\n\\t\\tvariables: {\\n\\t\\t\\tport: this.params[0],\\n\\t\\t\\thost: this.params[6],\\n\\t\\t\\t\\\"root-tiddler\\\": this.params[1],\\n\\t\\t\\t\\\"root-render-type\\\": this.params[2],\\n\\t\\t\\t\\\"root-serve-type\\\": this.params[3],\\n\\t\\t\\tusername: this.params[4],\\n\\t\\t\\tpassword: this.params[5],\\n\\t\\t\\t\\\"path-prefix\\\": this.params[7],\\n\\t\\t\\t\\\"debug-level\\\": this.params[8]\\n\\t\\t}\\n\\t});\\n\\tvar nodeServer = this.server.listen();\\n\\t$tw.hooks.invokeHook(\\\"th-server-command-post-start\\\",this.server,nodeServer,\\\"tiddlywiki\\\");\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/setfield.js\":{\"title\":\"$:/core/modules/commands/setfield.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/setfield.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"setfield\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 4) {\\n\\t\\treturn \\\"Missing parameters\\\";\\n\\t}\\n\\tvar wiki = this.commander.wiki,\\n\\t\\tfilter = this.params[0],\\n\\t\\tfieldname = this.params[1] || \\\"text\\\",\\n\\t\\ttemplatetitle = this.params[2],\\n\\t\\trendertype = this.params[3] || \\\"text/plain\\\",\\n\\t\\ttiddlers = wiki.filterTiddlers(filter);\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\tvar parser = wiki.parseTiddler(templatetitle),\\n\\t\\t\\tnewFields = {},\\n\\t\\t\\ttiddler = wiki.getTiddler(title);\\n\\t\\tif(parser) {\\n\\t\\t\\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\\n\\t\\t\\tvar container = $tw.fakeDocument.createElement(\\\"div\\\");\\n\\t\\t\\twidgetNode.render(container,null);\\n\\t\\t\\tnewFields[fieldname] = rendertype === \\\"text/html\\\" ? container.innerHTML : container.textContent;\\n\\t\\t} else {\\n\\t\\t\\tnewFields[fieldname] = undefined;\\n\\t\\t}\\n\\t\\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\\n\\t});\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/unpackplugin.js\":{\"title\":\"$:/core/modules/commands/unpackplugin.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/unpackplugin.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to extract the shadow tiddlers from within a plugin\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"unpackplugin\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing plugin name\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\ttitle = this.params[0],\\n\\t\\tpluginData = this.commander.wiki.getTiddlerDataCached(title);\\n\\tif(!pluginData) {\\n\\t\\treturn \\\"Plugin '\\\" + title + \\\"' not found\\\";\\n\\t}\\n\\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\\n\\t\\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\\n\\t});\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/verbose.js\":{\"title\":\"$:/core/modules/commands/verbose.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/verbose.js\\ntype: application/javascript\\nmodule-type: command\\n\\nVerbose command\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"verbose\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tthis.commander.verbose = true;\\n\\t// Output the boot message log\\n\\tthis.commander.streams.output.write(\\\"Boot log:\\\\n \\\" + $tw.boot.logMessages.join(\\\"\\\\n \\\") + \\\"\\\\n\\\");\\n\\treturn null; // No error\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/version.js\":{\"title\":\"$:/core/modules/commands/version.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/version.js\\ntype: application/javascript\\nmodule-type: command\\n\\nVersion command\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"version\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tthis.commander.streams.output.write($tw.version + \\\"\\\\n\\\");\\n\\treturn null; // No error\\n};\\n\\nexports.Command = Command;\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/utils/filesystem.js\":{\"title\":\"$:/core/modules/utils/filesystem.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/filesystem.js\\ntype: application/javascript\\nmodule-type: utils-node\\n\\nFile system utilities\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nvar fs = require(\\\"fs\\\"),\\n\\tpath = require(\\\"path\\\");\\n\\n/*\\nReturn the subdirectories of a path\\n*/\\nexports.getSubdirectories = function(dirPath) {\\n\\tif(!$tw.utils.isDirectory(dirPath)) {\\n\\t\\treturn null;\\n\\t}\\n\\tvar subdirs = [];\\n\\t$tw.utils.each(fs.readdirSync(dirPath),function(item) {\\n\\t\\tif($tw.utils.isDirectory(path.resolve(dirPath,item))) {\\n\\t\\t\\tsubdirs.push(item);\\n\\t\\t}\\n\\t});\\n\\treturn subdirs;\\n};\\n\\n/*\\nRecursively (and synchronously) copy a directory and all its content\\n*/\\nexports.copyDirectory = function(srcPath,dstPath) {\\n\\t// Remove any trailing path separators\\n\\tsrcPath = path.resolve($tw.utils.removeTrailingSeparator(srcPath));\\n\\tdstPath = path.resolve($tw.utils.removeTrailingSeparator(dstPath));\\n\\t// Check that neither director is within the other\\n\\tif(srcPath.substring(0,dstPath.length) === dstPath || dstPath.substring(0,srcPath.length) === srcPath) {\\n\\t\\treturn \\\"Cannot copy nested directories\\\";\\n\\t}\\n\\t// Create the destination directory\\n\\tvar err = $tw.utils.createDirectory(dstPath);\\n\\tif(err) {\\n\\t\\treturn err;\\n\\t}\\n\\t// Function to copy a folder full of files\\n\\tvar copy = function(srcPath,dstPath) {\\n\\t\\tvar srcStats = fs.lstatSync(srcPath);\\n\\t\\tif(srcStats.isFile()) {\\n\\t\\t\\t$tw.utils.copyFile(srcPath,dstPath);\\n\\t\\t} else if(srcStats.isDirectory()) {\\n\\t\\t\\tvar items = fs.readdirSync(srcPath);\\n\\t\\t\\tfor(var t=0; t\u003Citems.length; t++) {\\n\\t\\t\\t\\tvar item = items[t],\\n\\t\\t\\t\\t\\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn err;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\tcopy(srcPath,dstPath);\\n\\treturn null;\\n};\\n\\n/*\\nCopy a file\\n*/\\nvar FILE_BUFFER_LENGTH = 64 * 1024,\\n\\tfileBuffer;\\n\\nexports.copyFile = function(srcPath,dstPath) {\\n\\t// Create buffer if required\\n\\tif(!fileBuffer) {\\n\\t\\tfileBuffer = Buffer.alloc(FILE_BUFFER_LENGTH);\\n\\t}\\n\\t// Create any directories in the destination\\n\\t$tw.utils.createDirectory(path.dirname(dstPath));\\n\\t// Copy the file\\n\\tvar srcFile = fs.openSync(srcPath,\\\"r\\\"),\\n\\t\\tdstFile = fs.openSync(dstPath,\\\"w\\\"),\\n\\t\\tbytesRead = 1,\\n\\t\\tpos = 0;\\n\\twhile(bytesRead > 0) {\\n\\t\\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\\n\\t\\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\\n\\t\\tpos += bytesRead;\\n\\t}\\n\\tfs.closeSync(srcFile);\\n\\tfs.closeSync(dstFile);\\n\\treturn null;\\n};\\n\\n/*\\nRemove trailing path separator\\n*/\\nexports.removeTrailingSeparator = function(dirPath) {\\n\\tvar len = dirPath.length;\\n\\tif(dirPath.charAt(len-1) === path.sep) {\\n\\t\\tdirPath = dirPath.substr(0,len-1);\\n\\t}\\n\\treturn dirPath;\\n};\\n\\n/*\\nRecursively create a directory\\n*/\\nexports.createDirectory = function(dirPath) {\\n\\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\\n\\t\\tdirPath = dirPath + path.sep;\\n\\t}\\n\\tvar pos = 1;\\n\\tpos = dirPath.indexOf(path.sep,pos);\\n\\twhile(pos !== -1) {\\n\\t\\tvar subDirPath = dirPath.substr(0,pos);\\n\\t\\tif(!$tw.utils.isDirectory(subDirPath)) {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tfs.mkdirSync(subDirPath);\\n\\t\\t\\t} catch(e) {\\n\\t\\t\\t\\treturn \\\"Error creating directory '\\\" + subDirPath + \\\"'\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tpos = dirPath.indexOf(path.sep,pos + 1);\\n\\t}\\n\\treturn null;\\n};\\n\\n/*\\nRecursively create directories needed to contain a specified file\\n*/\\nexports.createFileDirectories = function(filePath) {\\n\\treturn $tw.utils.createDirectory(path.dirname(filePath));\\n};\\n\\n/*\\nRecursively delete a directory\\n*/\\nexports.deleteDirectory = function(dirPath) {\\n\\tif(fs.existsSync(dirPath)) {\\n\\t\\tvar entries = fs.readdirSync(dirPath);\\n\\t\\tfor(var entryIndex=0; entryIndex\u003Centries.length; entryIndex++) {\\n\\t\\t\\tvar currPath = dirPath + path.sep + entries[entryIndex];\\n\\t\\t\\tif(fs.lstatSync(currPath).isDirectory()) {\\n\\t\\t\\t\\t$tw.utils.deleteDirectory(currPath);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tfs.unlinkSync(currPath);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tfs.rmdirSync(dirPath);\\n\\t}\\n\\treturn null;\\n};\\n\\n/*\\nCheck if a path identifies a directory\\n*/\\nexports.isDirectory = function(dirPath) {\\n\\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\\n};\\n\\n/*\\nCheck if a path identifies a directory that is empty\\n*/\\nexports.isDirectoryEmpty = function(dirPath) {\\n\\tif(!$tw.utils.isDirectory(dirPath)) {\\n\\t\\treturn false;\\n\\t}\\n\\tvar files = fs.readdirSync(dirPath),\\n\\t\\tempty = true;\\n\\t$tw.utils.each(files,function(file,index) {\\n\\t\\tif(file.charAt(0) !== \\\".\\\") {\\n\\t\\t\\tempty = false;\\n\\t\\t}\\n\\t});\\n\\treturn empty;\\n};\\n\\n/*\\nRecursively delete a tree of empty directories\\n*/\\nexports.deleteEmptyDirs = function(dirpath,callback) {\\n\\tvar self = this;\\n\\tfs.readdir(dirpath,function(err,files) {\\n\\t\\tif(err) {\\n\\t\\t\\treturn callback(err);\\n\\t\\t}\\n\\t\\tif(files.length > 0) {\\n\\t\\t\\treturn callback(null);\\n\\t\\t}\\n\\t\\tfs.rmdir(dirpath,function(err) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t}\\n\\t\\t\\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\\n\\t\\t});\\n\\t});\\n};\\n\\n/*\\nCreate a fileInfo object for saving a tiddler:\\n\\tfilepath: the absolute path to the file containing the tiddler\\n\\ttype: the type of the tiddler file on disk (NOT the type of the tiddler)\\n\\thasMetaFile: true if the file also has a companion .meta file\\n\\tisEditableFile: true if the tiddler was loaded via non-standard options & marked editable\\nOptions include:\\n\\tdirectory: absolute path of root directory to which we are saving\\n\\tpathFilters: optional array of filters to be used to generate the base path\\n\\textFilters: optional array of filters to be used to generate the base path\\n\\twiki: optional wiki for evaluating the pathFilters,\\n\\tfileInfo: an existing fileInfo to check against\\n*/\\nexports.generateTiddlerFileInfo = function(tiddler,options) {\\n\\tvar fileInfo = {}, metaExt;\\n\\t// Propagate the isEditableFile flag\\n\\tif(options.fileInfo && !!options.fileInfo.isEditableFile) {\\n\\t\\tfileInfo.isEditableFile = true;\\n\\t\\tfileInfo.originalpath = options.fileInfo.originalpath;\\n\\t}\\n\\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\\n\\tvar hasUnsafeFields = false;\\n\\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\\n\\t\\tif(fieldName !== \\\"text\\\") {\\n\\t\\t\\thasUnsafeFields = hasUnsafeFields || /[\\\\x00-\\\\x1F]/mg.test(value);\\n\\t\\t\\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\\n\\t\\t}\\n\\t\\thasUnsafeFields = hasUnsafeFields || /:|#/mg.test(fieldName);\\n\\t});\\n\\t// Check for field values \\n\\tif(hasUnsafeFields) {\\n\\t\\t// Save as a JSON file\\n\\t\\tfileInfo.type = \\\"application/json\\\";\\n\\t\\tfileInfo.hasMetaFile = false;\\n\\t} else {\\n\\t\\t// Save as a .tid or a text/binary file plus a .meta file\\n\\t\\tvar tiddlerType = tiddler.fields.type || \\\"text/vnd.tiddlywiki\\\";\\n\\t\\tif(tiddlerType === \\\"text/vnd.tiddlywiki\\\" || tiddlerType === \\\"text/vnd.tiddlywiki-multiple\\\" || tiddler.hasField(\\\"_canonical_uri\\\")) {\\n\\t\\t\\t// Save as a .tid file\\n\\t\\t\\tfileInfo.type = \\\"application/x-tiddler\\\";\\n\\t\\t\\tfileInfo.hasMetaFile = false;\\n\\t\\t} else {\\n\\t\\t\\t// Save as a text/binary file and a .meta file\\n\\t\\t\\tfileInfo.type = tiddlerType;\\n\\t\\t\\tfileInfo.hasMetaFile = true;\\n\\t\\t}\\n\\t\\tif(options.extFilters) {\\n\\t\\t\\t// Check for extension overrides\\n\\t\\t\\tmetaExt = $tw.utils.generateTiddlerExtension(tiddler.fields.title,{\\n\\t\\t\\t\\textFilters: options.extFilters,\\n\\t\\t\\t\\twiki: options.wiki\\n\\t\\t\\t});\\n\\t\\t\\tif(metaExt) {\\n\\t\\t\\t\\tif(metaExt === \\\".tid\\\") {\\n\\t\\t\\t\\t\\t// Overriding to the .tid extension needs special handling\\n\\t\\t\\t\\t\\tfileInfo.type = \\\"application/x-tiddler\\\";\\n\\t\\t\\t\\t\\tfileInfo.hasMetaFile = false;\\n\\t\\t\\t\\t} else if(metaExt === \\\".json\\\") {\\n\\t\\t\\t\\t\\t// Overriding to the .json extension needs special handling\\n\\t\\t\\t\\t\\tfileInfo.type = \\\"application/json\\\";\\n\\t\\t\\t\\t\\tfileInfo.hasMetaFile = false;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t//If the new type matches a known extention, use that MIME type's encoding\\n\\t\\t\\t\\t\\tvar extInfo = $tw.utils.getFileExtensionInfo(metaExt);\\n\\t\\t\\t\\t\\tfileInfo.type = extInfo ? extInfo.type : null;\\n\\t\\t\\t\\t\\tfileInfo.encoding = $tw.utils.getTypeEncoding(metaExt);\\n\\t\\t\\t\\t\\tfileInfo.hasMetaFile = true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Take the file extension from the tiddler content type or metaExt\\n\\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \\\"\\\"};\\n\\t// Generate the filepath\\n\\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\\n\\t\\textension: metaExt || contentTypeInfo.extension,\\n\\t\\tdirectory: options.directory,\\n\\t\\tpathFilters: options.pathFilters,\\n\\t\\twiki: options.wiki,\\n\\t\\tfileInfo: options.fileInfo\\n\\t});\\n\\treturn fileInfo;\\n};\\n\\n/*\\nGenerate the file extension for saving a tiddler\\nOptions include:\\n\\textFilters: optional array of filters to be used to generate the extention\\n\\twiki: optional wiki for evaluating the extFilters\\n*/\\nexports.generateTiddlerExtension = function(title,options) {\\n\\tvar extension;\\n\\t// Check if any of the extFilters applies\\n\\tif(options.extFilters && options.wiki) { \\n\\t\\t$tw.utils.each(options.extFilters,function(filter) {\\n\\t\\t\\tif(!extension) {\\n\\t\\t\\t\\tvar source = options.wiki.makeTiddlerIterator([title]),\\n\\t\\t\\t\\t\\tresult = options.wiki.filterTiddlers(filter,null,source);\\n\\t\\t\\t\\tif(result.length > 0) {\\n\\t\\t\\t\\t\\textension = result[0];\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn extension;\\n};\\n\\n/*\\nGenerate the filepath for saving a tiddler\\nOptions include:\\n\\textension: file extension to be added the finished filepath\\n\\tdirectory: absolute path of root directory to which we are saving\\n\\tpathFilters: optional array of filters to be used to generate the base path\\n\\twiki: optional wiki for evaluating the pathFilters\\n\\tfileInfo: an existing fileInfo object to check against\\n\\tfileInfo.overwrite: if true, turns off filename clash numbers (defaults to false)\\n*/\\nexports.generateTiddlerFilepath = function(title,options) {\\n\\tvar directory = options.directory || \\\"\\\",\\n\\t\\textension = options.extension || \\\"\\\",\\n\\t\\toriginalpath = (options.fileInfo && options.fileInfo.originalpath) ? options.fileInfo.originalpath : \\\"\\\",\\n\\t\\toverwrite = options.fileInfo && options.fileInfo.overwrite || false,\\n\\t\\tfilepath;\\n\\t// Check if any of the pathFilters applies\\n\\tif(options.pathFilters && options.wiki) {\\n\\t\\t$tw.utils.each(options.pathFilters,function(filter) {\\n\\t\\t\\tif(!filepath) {\\n\\t\\t\\t\\tvar source = options.wiki.makeTiddlerIterator([title]),\\n\\t\\t\\t\\t\\tresult = options.wiki.filterTiddlers(filter,null,source);\\n\\t\\t\\t\\tif(result.length > 0) {\\n\\t\\t\\t\\t\\tfilepath = result[0];\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\tif(!filepath && !!originalpath) {\\n\\t\\t//Use the originalpath without the extension\\n\\t\\tvar ext = path.extname(originalpath);\\n\\t\\tfilepath = originalpath.substring(0,originalpath.length - ext.length);\\n\\t} else if(!filepath) {\\n\\t\\tfilepath = title;\\n\\t\\t// Remove any forward or backward slashes so we don't create directories\\n\\t\\tfilepath = filepath.replace(/\\\\/|\\\\\\\\/g,\\\"_\\\");\\n\\t}\\n\\t// Replace any Windows control codes\\n\\tfilepath = filepath.replace(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i,\\\"_$1_\\\");\\n\\t// Replace any leading spaces with the same number of underscores\\n\\tfilepath = filepath.replace(/^ +/,function (u) { return u.replace(/ /g, \\\"_\\\");});\\n\\t//If the path does not start with \\\".\\\" or \\\"..\\\" && a path seperator, then\\n\\tif(!/^\\\\.{1,2}[/\\\\\\\\]/g.test(filepath)) {\\n\\t\\t// Don't let the filename start with any dots because such files are invisible on *nix\\n\\t\\tfilepath = filepath.replace(/^\\\\.+/g,function (u) { return u.replace(/\\\\./g, \\\"_\\\");});\\n\\t}\\n\\t// Replace any Unicode control codes\\n\\tfilepath = filepath.replace(/[\\\\x00-\\\\x1f\\\\x80-\\\\x9f]/g,\\\"_\\\");\\n\\t// Replace any characters that can't be used in cross-platform filenames\\n\\tfilepath = $tw.utils.transliterate(filepath.replace(/\u003C|>|~|\\\\:|\\\\\\\"|\\\\||\\\\?|\\\\*|\\\\^/g,\\\"_\\\"));\\n\\t// Replace any dots or spaces at the end of the extension with the same number of underscores\\n\\textension = extension.replace(/[\\\\. ]+$/, function (u) { return u.replace(/[\\\\. ]/g, \\\"_\\\");});\\n\\t// Truncate the extension if it is too long\\n\\tif(extension.length > 32) {\\n\\t\\textension = extension.substr(0,32);\\n\\t}\\n\\t// If the filepath already ends in the extension then remove it\\n\\tif(filepath.substring(filepath.length - extension.length) === extension) {\\n\\t\\tfilepath = filepath.substring(0,filepath.length - extension.length);\\n\\t}\\n\\t// Truncate the filename if it is too long\\n\\tif(filepath.length > 200) {\\n\\t\\tfilepath = filepath.substr(0,200);\\n\\t}\\n\\t// If the resulting filename is blank (eg because the title is just punctuation)\\n\\tif(!filepath || /^_+$/g.test(filepath)) {\\n\\t\\t// ...then just use the character codes of the title\\n\\t\\tfilepath = \\\"\\\";\\n\\t\\t$tw.utils.each(title.split(\\\"\\\"),function(char) {\\n\\t\\t\\tif(filepath) {\\n\\t\\t\\t\\tfilepath += \\\"-\\\";\\n\\t\\t\\t}\\n\\t\\t\\tfilepath += char.charCodeAt(0).toString();\\n\\t\\t});\\n\\t}\\n\\t// Add a uniquifier if the file already exists (default)\\n\\tvar fullPath = path.resolve(directory, filepath + extension);\\n\\tif(!overwrite) {\\n\\t\\tvar oldPath = (options.fileInfo) ? options.fileInfo.filepath : undefined,\\n\\t\\t\\tcount = 0;\\n\\t\\tdo {\\n\\t\\t\\tfullPath = path.resolve(directory,filepath + (count ? \\\"_\\\" + count : \\\"\\\") + extension);\\n\\t\\t\\tif(oldPath && oldPath == fullPath) break;\\n\\t\\t\\tcount++;\\n\\t\\t} while(fs.existsSync(fullPath));\\n\\t}\\n\\t// If the last write failed with an error, or if path does not start with:\\n\\t//\\tthe resolved options.directory, the resolved wikiPath directory, the wikiTiddlersPath directory, \\n\\t//\\tor the 'originalpath' directory, then $tw.utils.encodeURIComponentExtended() and resolve to options.directory.\\n\\tvar writePath = $tw.hooks.invokeHook(\\\"th-make-tiddler-path\\\",fullPath,fullPath),\\n\\t\\tencode = (options.fileInfo || {writeError: false}).writeError == true;\\n\\tif(!encode) {\\n\\t\\tencode = !(writePath.indexOf($tw.boot.wikiTiddlersPath) == 0 ||\\n\\t\\t\\twritePath.indexOf(path.resolve(directory)) == 0 ||\\n\\t\\t\\twritePath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 ||\\n\\t\\t\\twritePath.indexOf(path.resolve($tw.boot.wikiTiddlersPath,originalpath)) == 0 );\\n\\t}\\n\\tif(encode) {\\n\\t\\twritePath = path.resolve(directory,$tw.utils.encodeURIComponentExtended(fullPath));\\n\\t}\\n\\t// Return the full path to the file\\n\\treturn writePath;\\n};\\n\\n/*\\nSave a tiddler to a file described by the fileInfo:\\n\\tfilepath: the absolute path to the file containing the tiddler\\n\\ttype: the type of the tiddler file (NOT the type of the tiddler)\\n\\thasMetaFile: true if the file also has a companion .meta file\\n*/\\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\\n\\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\\n\\tif(fileInfo.hasMetaFile) {\\n\\t\\t// Save the tiddler as a separate body and meta file\\n\\t\\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \\\"text/plain\\\"] || {encoding: \\\"utf8\\\"};\\n\\t\\tfs.writeFile(fileInfo.filepath,tiddler.fields.text || \\\"\\\",typeInfo.encoding,function(err) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t}\\n\\t\\t\\tfs.writeFile(fileInfo.filepath + \\\".meta\\\",tiddler.getFieldStringBlock({exclude: [\\\"text\\\",\\\"bag\\\"]}),\\\"utf8\\\",function(err) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn callback(null,fileInfo);\\n\\t\\t\\t});\\n\\t\\t});\\n\\t} else {\\n\\t\\t// Save the tiddler as a self contained templated file\\n\\t\\tif(fileInfo.type === \\\"application/x-tiddler\\\") {\\n\\t\\t\\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\\\"text\\\",\\\"bag\\\"]}) + (!!tiddler.fields.text ? \\\"\\\\n\\\\n\\\" + tiddler.fields.text : \\\"\\\"),\\\"utf8\\\",function(err) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn callback(null,fileInfo);\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\\\"bag\\\"]})],null,$tw.config.preferences.jsonSpaces),\\\"utf8\\\",function(err) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn callback(null,fileInfo);\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nSave a tiddler to a file described by the fileInfo:\\n\\tfilepath: the absolute path to the file containing the tiddler\\n\\ttype: the type of the tiddler file (NOT the type of the tiddler)\\n\\thasMetaFile: true if the file also has a companion .meta file\\n*/\\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\\n\\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\\n\\tif(fileInfo.hasMetaFile) {\\n\\t\\t// Save the tiddler as a separate body and meta file\\n\\t\\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \\\"text/plain\\\"] || {encoding: \\\"utf8\\\"};\\n\\t\\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text || \\\"\\\",typeInfo.encoding);\\n\\t\\tfs.writeFileSync(fileInfo.filepath + \\\".meta\\\",tiddler.getFieldStringBlock({exclude: [\\\"text\\\",\\\"bag\\\"]}),\\\"utf8\\\");\\n\\t} else {\\n\\t\\t// Save the tiddler as a self contained templated file\\n\\t\\tif(fileInfo.type === \\\"application/x-tiddler\\\") {\\n\\t\\t\\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\\\"text\\\",\\\"bag\\\"]}) + (!!tiddler.fields.text ? \\\"\\\\n\\\\n\\\" + tiddler.fields.text : \\\"\\\"),\\\"utf8\\\");\\n\\t\\t} else {\\n\\t\\t\\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\\\"bag\\\"]})],null,$tw.config.preferences.jsonSpaces),\\\"utf8\\\");\\n\\t\\t}\\n\\t}\\n\\treturn fileInfo;\\n};\\n\\n/*\\nDelete a file described by the fileInfo if it exits\\n*/\\nexports.deleteTiddlerFile = function(fileInfo,callback) {\\n\\t//Only attempt to delete files that exist on disk\\n\\tif(!fileInfo.filepath || !fs.existsSync(fileInfo.filepath)) {\\n\\t\\t//For some reason, the tiddler is only in memory or we can't modify the file at this path\\n\\t\\t$tw.syncer.displayError(\\\"Server deleteTiddlerFile task failed for filepath: \\\"+fileInfo.filepath);\\n\\t\\treturn callback(null,fileInfo);\\n\\t}\\n\\t// Delete the file\\n\\tfs.unlink(fileInfo.filepath,function(err) {\\n\\t\\tif(err) {\\n\\t\\t\\treturn callback(err);\\n\\t\\t}\\n\\t\\t// Delete the metafile if present\\n\\t\\tif(fileInfo.hasMetaFile && fs.existsSync(fileInfo.filepath + \\\".meta\\\")) {\\n\\t\\t\\tfs.unlink(fileInfo.filepath + \\\".meta\\\",function(err) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),function(err) {\\n\\t\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn callback(null,fileInfo);\\n\\t\\t\\t\\t});\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),function(err) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn callback(null,fileInfo);\\n\\t\\t\\t});\\n\\t\\t}\\n\\t});\\n};\\n\\n/*\\nCleanup old files on disk, by comparing the options values:\\n\\tadaptorInfo from $tw.syncer.tiddlerInfo\\n\\tbootInfo from $tw.boot.files\\n*/\\nexports.cleanupTiddlerFiles = function(options,callback) {\\n\\tvar adaptorInfo = options.adaptorInfo || {},\\n\\t\\tbootInfo = options.bootInfo || {},\\n\\t\\ttitle = options.title || \\\"undefined\\\";\\n\\tif(adaptorInfo.filepath && bootInfo.filepath && adaptorInfo.filepath !== bootInfo.filepath) {\\n\\t\\t$tw.utils.deleteTiddlerFile(adaptorInfo,function(err) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\tif((err.code == \\\"EPERM\\\" || err.code == \\\"EACCES\\\") && err.syscall == \\\"unlink\\\") {\\n\\t\\t\\t\\t\\t// Error deleting the previous file on disk, should fail gracefully\\n\\t\\t\\t\\t\\t$tw.syncer.displayError(\\\"Server desynchronized. Error cleaning up previous file for tiddler: \\\\\\\"\\\"+title+\\\"\\\\\\\"\\\",err);\\n\\t\\t\\t\\t\\treturn callback(null,bootInfo);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn callback(null,bootInfo);\\n\\t\\t});\\n\\t} else {\\n\\t\\treturn callback(null,bootInfo);\\n\\t}\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils-node\"},\"$:/core-server/readme\":{\"title\":\"$:/core-server/readme\",\"text\":\"This plugin contains TiddlyWiki's core components that are only needed on the server, comprising:\\n\\n* Commands\\n* HTTP server code\\n* Utility functions for server\\n\"},\"$:/core/modules/server/authenticators/basic.js\":{\"title\":\"$:/core/modules/server/authenticators/basic.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/authenticators/basic.js\\ntype: application/javascript\\nmodule-type: authenticator\\n\\nAuthenticator for WWW basic authentication\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nif($tw.node) {\\n\\tvar fs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\");\\n}\\n\\nfunction BasicAuthenticator(server) {\\n\\tthis.server = server;\\n\\tthis.credentialsData = [];\\n}\\n\\n/*\\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\\n*/\\nBasicAuthenticator.prototype.init = function() {\\n\\t// Read the credentials data\\n\\tthis.credentialsFilepath = this.server.get(\\\"credentials\\\");\\n\\tif(this.credentialsFilepath) {\\n\\t\\tvar resolveCredentialsFilepath = path.resolve(this.server.boot.wikiPath,this.credentialsFilepath);\\n\\t\\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\\n\\t\\t\\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\\\"utf8\\\"),\\n\\t\\t\\t\\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\\n\\t\\t\\tif(typeof credentialsData === \\\"string\\\") {\\n\\t\\t\\t\\treturn \\\"Error: \\\" + credentialsData + \\\" reading credentials from '\\\" + resolveCredentialsFilepath + \\\"'\\\";\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthis.credentialsData = credentialsData;\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\treturn \\\"Error: Unable to load user credentials from '\\\" + resolveCredentialsFilepath + \\\"'\\\";\\n\\t\\t}\\n\\t}\\n\\t// Add the hardcoded username and password if specified\\n\\tif(this.server.get(\\\"username\\\") && this.server.get(\\\"password\\\")) {\\n\\t\\tthis.credentialsData = this.credentialsData || [];\\n\\t\\tthis.credentialsData.push({\\n\\t\\t\\tusername: this.server.get(\\\"username\\\"),\\n\\t\\t\\tpassword: this.server.get(\\\"password\\\")\\n\\t\\t});\\n\\t}\\n\\treturn this.credentialsData.length > 0;\\n};\\n\\n/*\\nReturns true if the request is authenticated and assigns the \\\"authenticatedUsername\\\" state variable.\\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\\n*/\\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\\n\\t// Extract the incoming username and password from the request\\n\\tvar header = request.headers.authorization || \\\"\\\";\\n\\tif(!header && state.allowAnon) {\\n\\t\\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\\n\\t\\treturn true;\\n\\t}\\n\\tvar token = header.split(/\\\\s+/).pop() || \\\"\\\",\\n\\t\\tauth = $tw.utils.base64Decode(token),\\n\\t\\tparts = auth.split(/:/),\\n\\t\\tincomingUsername = parts[0],\\n\\t\\tincomingPassword = parts[1];\\n\\t// Check that at least one of the credentials matches\\n\\tvar matchingCredentials = this.credentialsData.find(function(credential) {\\n\\t\\treturn credential.username === incomingUsername && credential.password === incomingPassword;\\n\\t});\\n\\tif(matchingCredentials) {\\n\\t\\t// If so, add the authenticated username to the request state\\n\\t\\tstate.authenticatedUsername = incomingUsername;\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\t// If not, return an authentication challenge\\n\\t\\tresponse.writeHead(401,\\\"Authentication required\\\",{\\n\\t\\t\\t\\\"WWW-Authenticate\\\": 'Basic realm=\\\"Please provide your username and password to login to ' + state.server.servername + '\\\"'\\n\\t\\t});\\n\\t\\tresponse.end();\\n\\t\\treturn false;\\n\\t}\\n};\\n\\nexports.AuthenticatorClass = BasicAuthenticator;\\n\",\"type\":\"application/javascript\",\"module-type\":\"authenticator\"},\"$:/core/modules/server/authenticators/header.js\":{\"title\":\"$:/core/modules/server/authenticators/header.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/authenticators/header.js\\ntype: application/javascript\\nmodule-type: authenticator\\n\\nAuthenticator for trusted header authentication\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nfunction HeaderAuthenticator(server) {\\n\\tthis.server = server;\\n\\tthis.header = server.get(\\\"authenticated-user-header\\\") ? server.get(\\\"authenticated-user-header\\\").toLowerCase() : undefined;\\n}\\n\\n/*\\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\\n*/\\nHeaderAuthenticator.prototype.init = function() {\\n\\treturn !!this.header;\\n};\\n\\n/*\\nReturns true if the request is authenticated and assigns the \\\"authenticatedUsername\\\" state variable.\\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\\n*/\\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\\n\\t// Otherwise, authenticate as the username in the specified header\\n\\tvar username = request.headers[this.header];\\n\\tif(!username && !state.allowAnon) {\\n\\t\\tresponse.writeHead(401,\\\"Authorization header required to login to '\\\" + state.server.servername + \\\"'\\\");\\n\\t\\tresponse.end();\\n\\t\\treturn false;\\n\\t} else {\\n\\t\\t// authenticatedUsername will be undefined for anonymous users\\n\\t\\tif(username) {\\n\\t\\t\\tstate.authenticatedUsername = $tw.utils.decodeURIComponentSafe(username);\\n\\t\\t}\\n\\t\\treturn true;\\n\\t}\\n};\\n\\nexports.AuthenticatorClass = HeaderAuthenticator;\\n\\n\",\"type\":\"application/javascript\",\"module-type\":\"authenticator\"},\"$:/core/modules/server/routes/delete-tiddler.js\":{\"title\":\"$:/core/modules/server/routes/delete-tiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\\ntype: application/javascript\\nmodule-type: route\\n\\nDELETE /recipes/default/tiddlers/:title\\n\\n\\\\*/\\n\\\"use strict\\\";\\n\\nexports.methods = [\\\"DELETE\\\"];\\n\\nexports.path = /^\\\\/bags\\\\/default\\\\/tiddlers\\\\/(.+)$/;\\n\\nexports.info = {\\n\\tpriority: 100\\n};\\n\\nexports.handler = function(request,response,state) {\\n\\tvar title = $tw.utils.decodeURIComponentSafe(state.params[0]);\\n\\tstate.wiki.deleteTiddler(title);\\n\\tresponse.writeHead(204, \\\"OK\\\", {\\n\\t\\t\\\"Content-Type\\\": \\\"text/plain\\\"\\n\\t});\\n\\tresponse.end();\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-favicon.js\":{\"title\":\"$:/core/modules/server/routes/get-favicon.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-favicon.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /favicon.ico\\n\\n\\\\*/\\n\\\"use strict\\\";\\n\\nexports.methods = [\\\"GET\\\"];\\n\\nexports.path = /^\\\\/favicon.ico$/;\\n\\nexports.info = {\\n\\tpriority: 100\\n};\\n\\nexports.handler = function(request,response,state) {\\n\\tvar buffer = state.wiki.getTiddlerText(\\\"$:/favicon.ico\\\",\\\"\\\");\\n\\tstate.sendResponse(200,{\\\"Content-Type\\\": \\\"image/x-icon\\\"},buffer,\\\"base64\\\");\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-file.js\":{\"title\":\"$:/core/modules/server/routes/get-file.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-file.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /files/:filepath\\n\\n\\\\*/\\n\\\"use strict\\\";\\n\\nexports.methods = [\\\"GET\\\"];\\n\\nexports.path = /^\\\\/files\\\\/(.+)$/;\\n\\nexports.info = {\\n\\tpriority: 100\\n};\\n\\nexports.handler = function(request,response,state) {\\n\\tvar path = require(\\\"path\\\"),\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tsuppliedFilename = $tw.utils.decodeURIComponentSafe(state.params[0]),\\n\\t\\tbaseFilename = path.resolve(state.boot.wikiPath,\\\"files\\\"),\\n\\t\\tfilename = path.resolve(baseFilename,suppliedFilename),\\n\\t\\textension = path.extname(filename);\\n\\t// Check that the filename is inside the wiki files folder\\n\\tif(path.relative(baseFilename,filename).indexOf(\\\"..\\\") === 0) {\\n\\t\\treturn state.sendResponse(404,{\\\"Content-Type\\\": \\\"text/plain\\\"},\\\"File '\\\" + suppliedFilename + \\\"' not found\\\");\\n\\t}\\n\\tfs.stat(filename, function(err, stats) {\\n\\t\\tif(err) {\\n\\t\\t\\treturn state.sendResponse(404,{\\\"Content-Type\\\": \\\"text/plain\\\"},\\\"File '\\\" + suppliedFilename + \\\"' not found\\\");\\n\\t\\t} else {\\n\\t\\t\\tvar type = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \\\"application/octet-stream\\\"),\\n\\t\\t\\t\\tresponseHeaders = {\\n\\t\\t\\t\\t\\t\\\"Content-Type\\\": type,\\n\\t\\t\\t\\t\\t\\\"Accept-Ranges\\\": \\\"bytes\\\"\\n\\t\\t\\t\\t};\\n\\t\\t\\tvar rangeHeader = request.headers.range,\\n\\t\\t\\t\\tstream;\\n\\t\\t\\tif(rangeHeader) {\\n\\t\\t\\t\\t// Handle range requests\\n\\t\\t\\t\\tvar parts = rangeHeader.replace(/bytes=/, \\\"\\\").split(\\\"-\\\"),\\n\\t\\t\\t\\t\\tstart = parseInt(parts[0], 10),\\n\\t\\t\\t\\t\\tend = parts[1] ? parseInt(parts[1], 10) : stats.size - 1;\\n\\t\\t\\t\\t// Validate start and end\\n\\t\\t\\t\\tif(isNaN(start) || isNaN(end) || start \u003C 0 || end \u003C start || end >= stats.size) {\\n\\t\\t\\t\\t\\tresponseHeaders[\\\"Content-Range\\\"] = \\\"bytes */\\\" + stats.size;\\n\\t\\t\\t\\t\\treturn response.writeHead(416, responseHeaders).end();\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tvar chunksize = (end - start) + 1;\\n\\t\\t\\t\\tresponseHeaders[\\\"Content-Range\\\"] = \\\"bytes \\\" + start + \\\"-\\\" + end + \\\"/\\\" + stats.size;\\n\\t\\t\\t\\tresponseHeaders[\\\"Content-Length\\\"] = chunksize;\\n\\t\\t\\t\\tresponse.writeHead(206, responseHeaders);\\n\\t\\t\\t\\tstream = fs.createReadStream(filename, {start: start, end: end});\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tresponseHeaders[\\\"Content-Length\\\"] = stats.size;\\n\\t\\t\\t\\tresponse.writeHead(200, responseHeaders);\\n\\t\\t\\t\\tstream = fs.createReadStream(filename);\\n\\t\\t\\t}\\n\\t\\t\\t// Common stream error handling\\n\\t\\t\\tstream.on(\\\"error\\\", function(err) {\\n\\t\\t\\t\\tif(!response.headersSent) {\\n\\t\\t\\t\\t\\tresponse.writeHead(500, {\\\"Content-Type\\\": \\\"text/plain\\\"});\\n\\t\\t\\t\\t\\tresponse.end(\\\"Read error\\\");\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tresponse.destroy();\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t\\tstream.pipe(response);\\n\\t\\t}\\n\\t});\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-index.js\":{\"title\":\"$:/core/modules/server/routes/get-index.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-index.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /\\n\\n\\\\*/\\n\\\"use strict\\\";\\n\\nexports.methods = [\\\"GET\\\"];\\n\\nexports.path = /^\\\\/$/;\\n\\nexports.info = {\\n\\tpriority: 100\\n};\\n\\nexports.handler = function(request,response,state) {\\n\\tvar text = state.wiki.renderTiddler(state.server.get(\\\"root-render-type\\\"),state.server.get(\\\"root-tiddler\\\")),\\n\\t\\tresponseHeaders = {\\n\\t\\t\\t\\\"Content-Type\\\": state.server.get(\\\"root-serve-type\\\")\\n\\t\\t};\\n\\tstate.sendResponse(200,responseHeaders,text);\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-login-basic.js\":{\"title\":\"$:/core/modules/server/routes/get-login-basic.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /login-basic -- force a Basic Authentication challenge\\n\\n\\\\*/\\n\\\"use strict\\\";\\n\\nexports.methods = [\\\"GET\\\"];\\n\\nexports.path = /^\\\\/login-basic$/;\\n\\nexports.info = {\\n\\tpriority: 100\\n};\\n\\nexports.handler = function(request,response,state) {\\n\\tif(!state.authenticatedUsername) {\\n\\t\\t// Challenge if there's no username\\n\\t\\tresponse.writeHead(401,{\\n\\t\\t\\t\\\"WWW-Authenticate\\\": 'Basic realm=\\\"Please provide your username and password to login to ' + state.server.servername + '\\\"'\\n\\t\\t});\\n\\t\\tresponse.end();\\n\\t} else {\\n\\t\\t// Redirect to the root wiki if login worked\\n\\t\\tvar location = ($tw.syncadaptor && $tw.syncadaptor.host)? $tw.syncadaptor.host: `${state.pathPrefix}/`;\\n\\t\\tresponse.writeHead(302,{\\n\\t\\t\\tLocation: location\\n\\t\\t});\\n\\t\\tresponse.end();\\n\\t}\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-status.js\":{\"title\":\"$:/core/modules/server/routes/get-status.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-status.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /status\\n\\n\\\\*/\\n\\\"use strict\\\";\\n\\nexports.methods = [\\\"GET\\\"];\\n\\nexports.path = /^\\\\/status$/;\\n\\nexports.info = {\\n\\tpriority: 100\\n};\\n\\nexports.handler = function(request,response,state) {\\n\\tvar text = JSON.stringify({\\n\\t\\tusername: state.authenticatedUsername || state.server.get(\\\"anon-username\\\") || \\\"\\\",\\n\\t\\tanonymous: !state.authenticatedUsername,\\n\\t\\tread_only: !state.server.isAuthorized(\\\"writers\\\",state.authenticatedUsername),\\n\\t\\tlogout_is_available: false,\\n\\t\\tspace: {\\n\\t\\t\\trecipe: \\\"default\\\"\\n\\t\\t},\\n\\t\\ttiddlywiki_version: $tw.version\\n\\t});\\n\\tstate.sendResponse(200,{\\\"Content-Type\\\": \\\"application/json\\\"},text,\\\"utf8\\\");\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-tiddler-html.js\":{\"title\":\"$:/core/modules/server/routes/get-tiddler-html.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /:title\\n\\n\\\\*/\\n\\\"use strict\\\";\\n\\nexports.methods = [\\\"GET\\\"];\\n\\nexports.path = /^\\\\/([^\\\\/]+)$/;\\n\\nexports.info = {\\n\\tpriority: 100\\n};\\n\\nexports.handler = function(request,response,state) {\\n\\tvar title = $tw.utils.decodeURIComponentSafe(state.params[0]),\\n\\t\\ttiddler = state.wiki.getTiddler(title);\\n\\tif(tiddler) {\\n\\t\\tvar renderType = tiddler.getFieldString(\\\"_render_type\\\"),\\n\\t\\t\\trenderTemplate = tiddler.getFieldString(\\\"_render_template\\\");\\n\\t\\t// Tiddler fields '_render_type' and '_render_template' overwrite\\n\\t\\t// system wide settings for render type and template\\n\\t\\tif(state.wiki.isSystemTiddler(title)) {\\n\\t\\t\\trenderType = renderType || state.server.get(\\\"system-tiddler-render-type\\\");\\n\\t\\t\\trenderTemplate = renderTemplate || state.server.get(\\\"system-tiddler-render-template\\\");\\n\\t\\t} else {\\n\\t\\t\\trenderType = renderType || state.server.get(\\\"tiddler-render-type\\\");\\n\\t\\t\\trenderTemplate = renderTemplate || state.server.get(\\\"tiddler-render-template\\\");\\n\\t\\t}\\n\\t\\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\\n\\n\\t\\tvar headers = {\\\"Content-Type\\\": renderType};\\n\\t\\tstate.sendResponse(200,headers,text,\\\"utf8\\\");\\n\\t} else {\\n\\t\\tresponse.writeHead(404);\\n\\t\\tresponse.end();\\n\\t}\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-tiddler.js\":{\"title\":\"$:/core/modules/server/routes/get-tiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /recipes/default/tiddlers/:title\\n\\n\\\\*/\\n\\\"use strict\\\";\\n\\nexports.methods = [\\\"GET\\\"];\\n\\nexports.path = /^\\\\/recipes\\\\/default\\\\/tiddlers\\\\/(.+)$/;\\n\\nexports.info = {\\n\\tpriority: 100\\n};\\n\\nexports.handler = function(request,response,state) {\\n\\tvar title = $tw.utils.decodeURIComponentSafe(state.params[0]),\\n\\t\\ttiddler = state.wiki.getTiddler(title),\\n\\t\\ttiddlerFields = {},\\n\\t\\tknownFields = [\\n\\t\\t\\t\\\"bag\\\", \\\"created\\\", \\\"creator\\\", \\\"modified\\\", \\\"modifier\\\", \\\"permissions\\\", \\\"recipe\\\", \\\"revision\\\", \\\"tags\\\", \\\"text\\\", \\\"title\\\", \\\"type\\\", \\\"uri\\\"\\n\\t\\t];\\n\\tif(tiddler) {\\n\\t\\t$tw.utils.each(tiddler.fields,function(field,name) {\\n\\t\\t\\tvar value = tiddler.getFieldString(name);\\n\\t\\t\\tif(knownFields.indexOf(name) !== -1) {\\n\\t\\t\\t\\ttiddlerFields[name] = value;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\ttiddlerFields.fields = tiddlerFields.fields || {};\\n\\t\\t\\t\\ttiddlerFields.fields[name] = value;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\ttiddlerFields.revision = state.wiki.getChangeCount(title);\\n\\t\\ttiddlerFields.bag = \\\"default\\\";\\n\\t\\ttiddlerFields.type = tiddlerFields.type || \\\"text/vnd.tiddlywiki\\\";\\n\\t\\tstate.sendResponse(200,{\\\"Content-Type\\\": \\\"application/json\\\"},JSON.stringify(tiddlerFields),\\\"utf8\\\");\\n\\t} else {\\n\\t\\tresponse.writeHead(404);\\n\\t\\tresponse.end();\\n\\t}\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-tiddlers-json.js\":{\"title\":\"$:/core/modules/server/routes/get-tiddlers-json.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-tiddlers-json.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /recipes/default/tiddlers.json?filter=\u003Cfilter>\\n\\n\\\\*/\\n\\\"use strict\\\";\\n\\nvar DEFAULT_FILTER = \\\"[all[tiddlers]!is[system]sort[title]]\\\";\\n\\nexports.methods = [\\\"GET\\\"];\\n\\nexports.path = /^\\\\/recipes\\\\/default\\\\/tiddlers.json$/;\\n\\nexports.info = {\\n\\tpriority: 100\\n};\\n\\nexports.handler = function(request,response,state) {\\n\\tvar filter = state.queryParameters.filter || DEFAULT_FILTER;\\n\\tif(state.wiki.getTiddlerText(\\\"$:/config/Server/AllowAllExternalFilters\\\") !== \\\"yes\\\") {\\n\\t\\tif(state.wiki.getTiddlerText(\\\"$:/config/Server/ExternalFilters/\\\" + filter) !== \\\"yes\\\") {\\n\\t\\t\\tconsole.log(\\\"Blocked attempt to GET /recipes/default/tiddlers.json with filter: \\\" + filter);\\n\\t\\t\\tresponse.writeHead(403);\\n\\t\\t\\tresponse.end();\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t}\\n\\tif(state.wiki.getTiddlerText(\\\"$:/config/SyncSystemTiddlersFromServer\\\") === \\\"no\\\") {\\n\\t\\tfilter += \\\"+[!is[system]]\\\";\\n\\t}\\n\\tvar excludeFields = (state.queryParameters.exclude || \\\"text\\\").split(\\\",\\\"),\\n\\t\\ttitles = state.wiki.filterTiddlers(filter);\\n\\tvar tiddlers = [];\\n\\t$tw.utils.each(titles,function(title) {\\n\\t\\tvar tiddler = state.wiki.getTiddler(title);\\n\\t\\tif(tiddler) {\\n\\t\\t\\tvar tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields});\\n\\t\\t\\ttiddlerFields.revision = state.wiki.getChangeCount(title);\\n\\t\\t\\ttiddlerFields.type = tiddlerFields.type || \\\"text/vnd.tiddlywiki\\\";\\n\\t\\t\\ttiddlers.push(tiddlerFields);\\n\\t\\t}\\n\\t});\\n\\tvar text = JSON.stringify(tiddlers);\\n\\tstate.sendResponse(200,{\\\"Content-Type\\\": \\\"application/json\\\"},text,\\\"utf8\\\");\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/put-tiddler.js\":{\"title\":\"$:/core/modules/server/routes/put-tiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\\ntype: application/javascript\\nmodule-type: route\\n\\nPUT /recipes/default/tiddlers/:title\\n\\n\\\\*/\\n\\\"use strict\\\";\\n\\nexports.methods = [\\\"PUT\\\"];\\n\\nexports.path = /^\\\\/recipes\\\\/default\\\\/tiddlers\\\\/(.+)$/;\\n\\nexports.info = {\\n\\tpriority: 100\\n};\\n\\nexports.handler = function(request,response,state) {\\n\\tvar title = $tw.utils.decodeURIComponentSafe(state.params[0]),\\n\\t\\tfields = $tw.utils.parseJSONSafe(state.data);\\n\\t// Pull up any subfields in the `fields` object\\n\\tif(fields.fields) {\\n\\t\\t$tw.utils.each(fields.fields,function(field,name) {\\n\\t\\t\\tfields[name] = field;\\n\\t\\t});\\n\\t\\tdelete fields.fields;\\n\\t}\\n\\t// Remove any revision field\\n\\tif(fields.revision) {\\n\\t\\tdelete fields.revision;\\n\\t}\\n\\t// If this is a skinny tiddler, it means the client never got the full\\n\\t// version of the tiddler to edit. So we must preserve whatever text\\n\\t// already exists on the server, or else we'll inadvertently delete it.\\n\\tif(fields._is_skinny !== undefined) {\\n\\t\\tvar tiddler = state.wiki.getTiddler(title);\\n\\t\\tif(tiddler) {\\n\\t\\t\\tfields.text = tiddler.fields.text;\\n\\t\\t}\\n\\t\\tdelete fields._is_skinny;\\n\\t}\\n\\tstate.wiki.addTiddler(new $tw.Tiddler(fields,{title: title}));\\n\\tvar changeCount = state.wiki.getChangeCount(title).toString();\\n\\tresponse.writeHead(204, \\\"OK\\\",{\\n\\t\\tEtag: \\\"\\\\\\\"default/\\\" + encodeURIComponent(title) + \\\"/\\\" + changeCount + \\\":\\\\\\\"\\\",\\n\\t\\t\\\"Content-Type\\\": \\\"text/plain\\\"\\n\\t});\\n\\tresponse.end();\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/server.js\":{\"title\":\"$:/core/modules/server/server.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/server.js\\ntype: application/javascript\\nmodule-type: library\\n\\nServe tiddlers over http\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nlet fs, url, path, querystring, crypto, zlib;\\n\\nif($tw.node) {\\n\\tfs = require(\\\"fs\\\"),\\n\\turl = require(\\\"url\\\"),\\n\\tpath = require(\\\"path\\\"),\\n\\tquerystring = require(\\\"querystring\\\"),\\n\\tcrypto = require(\\\"crypto\\\"),\\n\\tzlib = require(\\\"zlib\\\");\\n}\\n\\n/*\\nA simple HTTP server with regexp-based routes\\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\\n\\t\\t routes - optional array of routes to use\\n\\t\\t wiki - reference to wiki object\\n*/\\nfunction Server(options) {\\n\\tvar self = this;\\n\\tthis.routes = options.routes || [];\\n\\tthis.authenticators = options.authenticators || [];\\n\\tthis.wiki = options.wiki;\\n\\tthis.boot = options.boot || $tw.boot;\\n\\t// Initialise the variables\\n\\tthis.variables = $tw.utils.extend({},this.defaultVariables);\\n\\tif(options.variables) {\\n\\t\\tfor(var variable in options.variables) {\\n\\t\\t\\tif(options.variables[variable]) {\\n\\t\\t\\t\\tthis.variables[variable] = options.variables[variable];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Setup the default required plugins\\n\\tthis.requiredPlugins = this.get(\\\"required-plugins\\\").split(\\\",\\\");\\n\\t// Initialise CORS\\n\\tthis.corsEnable = this.get(\\\"cors-enable\\\") === \\\"yes\\\";\\n\\t// Initialise CSRF\\n\\tthis.csrfDisable = this.get(\\\"csrf-disable\\\") === \\\"yes\\\";\\n\\t// Initialize Gzip compression\\n\\tthis.enableGzip = this.get(\\\"gzip\\\") === \\\"yes\\\";\\n\\t// Initialize browser-caching\\n\\tthis.enableBrowserCache = this.get(\\\"use-browser-cache\\\") === \\\"yes\\\";\\n\\t// Initialise authorization\\n\\tvar authorizedUserName;\\n\\tif(this.get(\\\"username\\\") && this.get(\\\"password\\\")) {\\n\\t\\tauthorizedUserName = this.get(\\\"username\\\");\\n\\t} else if(this.get(\\\"credentials\\\")) {\\n\\t\\tauthorizedUserName = \\\"(authenticated)\\\";\\n\\t} else {\\n\\t\\tauthorizedUserName = \\\"(anon)\\\";\\n\\t}\\n\\tthis.authorizationPrincipals = {\\n\\t\\treaders: (this.get(\\\"readers\\\") || authorizedUserName).split(\\\",\\\").map($tw.utils.trim),\\n\\t\\twriters: (this.get(\\\"writers\\\") || authorizedUserName).split(\\\",\\\").map($tw.utils.trim)\\n\\t};\\n\\tif(this.get(\\\"admin\\\") || authorizedUserName !== \\\"(anon)\\\") {\\n\\t\\tthis.authorizationPrincipals[\\\"admin\\\"] = (this.get(\\\"admin\\\") || authorizedUserName).split(\\\",\\\").map($tw.utils.trim);\\n\\t}\\n\\t// Load and initialise authenticators\\n\\t$tw.modules.forEachModuleOfType(\\\"authenticator\\\", function(title,authenticatorDefinition) {\\n\\t\\t// console.log(\\\"Loading authenticator \\\" + title);\\n\\t\\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\\n\\t});\\n\\t// Load route handlers\\n\\t$tw.modules.forEachModuleOfType(\\\"route\\\", function(title,routeDefinition) {\\n\\t\\t// console.log(\\\"Loading server route \\\" + title);\\n\\t\\tself.addRoute(routeDefinition);\\n\\t});\\n\\tthis.routes.sort((a, b) => {\\n\\t\\tconst priorityA = a.info?.priority ?? 100,\\n\\t\\t\\tpriorityB = b.info?.priority ?? 100;\\n\\t\\treturn priorityB - priorityA;\\n\\t});\\n\\t// Initialise the http vs https\\n\\tthis.listenOptions = null;\\n\\tthis.protocol = \\\"http\\\";\\n\\tvar tlsKeyFilepath = this.get(\\\"tls-key\\\"),\\n\\t\\ttlsCertFilepath = this.get(\\\"tls-cert\\\"),\\n\\t\\ttlsPassphrase = this.get(\\\"tls-passphrase\\\");\\n\\tif(tlsCertFilepath && tlsKeyFilepath) {\\n\\t\\tthis.listenOptions = {\\n\\t\\t\\tkey: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),\\\"utf8\\\"),\\n\\t\\t\\tcert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),\\\"utf8\\\"),\\n\\t\\t\\tpassphrase: tlsPassphrase || \\\"\\\"\\n\\t\\t};\\n\\t\\tthis.protocol = \\\"https\\\";\\n\\t}\\n\\tthis.transport = require(this.protocol);\\n\\t// Name the server and init the boot state\\n\\tthis.servername = $tw.utils.transliterateToSafeASCII(this.get(\\\"server-name\\\") || this.wiki.getTiddlerText(\\\"$:/SiteTitle\\\") || \\\"TiddlyWiki5\\\");\\n\\tthis.boot.origin = this.get(\\\"origin\\\")? this.get(\\\"origin\\\"): this.protocol+\\\"://\\\"+this.get(\\\"host\\\")+\\\":\\\"+this.get(\\\"port\\\");\\n\\tthis.boot.pathPrefix = this.get(\\\"path-prefix\\\") || \\\"\\\";\\n}\\n\\n/*\\nSend a response to the client. This method checks if the response must be sent\\nor if the client alrady has the data cached. If that's the case only a 304\\nresponse will be transmitted and the browser will use the cached data.\\nOnly requests with status code 200 are considdered for caching.\\nrequest: request instance passed to the handler\\nresponse: response instance passed to the handler\\nstatusCode: stauts code to send to the browser\\nheaders: response headers (they will be augmented with an `Etag` header)\\ndata: the data to send (passed to the end method of the response instance)\\nencoding: the encoding of the data to send (passed to the end method of the response instance)\\n*/\\nfunction sendResponse(request,response,statusCode,headers,data,encoding) {\\n\\tif(this.enableBrowserCache && (statusCode == 200)) {\\n\\t\\tvar hash = crypto.createHash(\\\"md5\\\");\\n\\t\\t// Put everything into the hash that could change and invalidate the data that\\n\\t\\t// the browser already stored. The headers the data and the encoding.\\n\\t\\thash.update(data);\\n\\t\\thash.update(JSON.stringify(headers));\\n\\t\\tif(encoding) {\\n\\t\\t\\thash.update(encoding);\\n\\t\\t}\\n\\t\\tvar contentDigest = hash.digest(\\\"hex\\\");\\n\\t\\t// RFC 7232 section 2.3 mandates for the etag to be enclosed in quotes\\n\\t\\theaders[\\\"Etag\\\"] = '\\\"' + contentDigest + '\\\"';\\n\\t\\theaders[\\\"Cache-Control\\\"] = \\\"max-age=0, must-revalidate\\\";\\n\\t\\t// Check if any of the hashes contained within the if-none-match header\\n\\t\\t// matches the current hash.\\n\\t\\t// If one matches, do not send the data but tell the browser to use the\\n\\t\\t// cached data.\\n\\t\\t// We do not implement \\\"*\\\" as it makes no sense here.\\n\\t\\tvar ifNoneMatch = request.headers[\\\"if-none-match\\\"];\\n\\t\\tif(ifNoneMatch) {\\n\\t\\t\\tvar matchParts = ifNoneMatch.split(\\\",\\\").map(function(etag) {\\n\\t\\t\\t\\treturn etag.replace(/^[ \\\"]+|[ \\\"]+$/g, \\\"\\\");\\n\\t\\t\\t});\\n\\t\\t\\tif(matchParts.indexOf(contentDigest) != -1) {\\n\\t\\t\\t\\tresponse.writeHead(304,headers);\\n\\t\\t\\t\\tresponse.end();\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} else {\\n\\t\\t// RFC 7231, 6.1. Overview of Status Codes:\\n\\t\\t// Browser clients may cache 200, 203, 204, 206, 300, 301, \\n\\t\\t// 404, 405, 410, 414, and 501 unless given explicit cache controls\\n\\t\\theaders[\\\"Cache-Control\\\"] = headers[\\\"Cache-Control\\\"] || \\\"no-store\\\";\\n\\t}\\n\\t/*\\n\\tIf the gzip=yes is set, check if the user agent permits compression. If so,\\n\\tcompress our response if the raw data is bigger than 2k. Compressing less\\n\\tdata is inefficient. Note that we use the synchronous functions from zlib\\n\\tto stay in the imperative style. The current `Server` doesn't depend on\\n\\tthis, and we may just as well use the async versions.\\n\\t*/\\n\\tif(this.enableGzip && (data.length > 2048)) {\\n\\t\\tvar acceptEncoding = request.headers[\\\"accept-encoding\\\"] || \\\"\\\";\\n\\t\\tif(/\\\\bdeflate\\\\b/.test(acceptEncoding)) {\\n\\t\\t\\theaders[\\\"Content-Encoding\\\"] = \\\"deflate\\\";\\n\\t\\t\\tdata = zlib.deflateSync(data);\\n\\t\\t} else if(/\\\\bgzip\\\\b/.test(acceptEncoding)) {\\n\\t\\t\\theaders[\\\"Content-Encoding\\\"] = \\\"gzip\\\";\\n\\t\\t\\tdata = zlib.gzipSync(data);\\n\\t\\t}\\n\\t}\\n\\n\\tresponse.writeHead(statusCode,headers);\\n\\tresponse.end(data,encoding);\\n}\\n\\nServer.prototype.defaultVariables = {\\n\\tport: \\\"8080\\\",\\n\\thost: \\\"127.0.0.1\\\",\\n\\t\\\"required-plugins\\\": \\\"$:/plugins/tiddlywiki/filesystem,$:/plugins/tiddlywiki/tiddlyweb\\\",\\n\\t\\\"root-tiddler\\\": \\\"$:/core/save/all\\\",\\n\\t\\\"root-render-type\\\": \\\"text/plain\\\",\\n\\t\\\"root-serve-type\\\": \\\"text/html\\\",\\n\\t\\\"tiddler-render-type\\\": \\\"text/html\\\",\\n\\t\\\"tiddler-render-template\\\": \\\"$:/core/templates/server/static.tiddler.html\\\",\\n\\t\\\"system-tiddler-render-type\\\": \\\"text/plain\\\",\\n\\t\\\"system-tiddler-render-template\\\": \\\"$:/core/templates/wikified-tiddler\\\",\\n\\t\\\"debug-level\\\": \\\"none\\\",\\n\\t\\\"gzip\\\": \\\"no\\\",\\n\\t\\\"use-browser-cache\\\": \\\"no\\\"\\n};\\n\\nServer.prototype.get = function(name) {\\n\\treturn this.variables[name];\\n};\\n\\nServer.prototype.addRoute = function(route) {\\n\\tthis.routes.push(route);\\n};\\n\\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\\n\\t// Instantiate and initialise the authenticator\\n\\tvar authenticator = new AuthenticatorClass(this),\\n\\t\\tresult = authenticator.init();\\n\\tif(typeof result === \\\"string\\\") {\\n\\t\\t$tw.utils.error(\\\"Error: \\\" + result);\\n\\t} else if(result) {\\n\\t\\t// Only use the authenticator if it initialised successfully\\n\\t\\tthis.authenticators.push(authenticator);\\n\\t}\\n};\\n\\nServer.prototype.findMatchingRoute = function(request,state) {\\n\\tfor(var t=0; t\u003Cthis.routes.length; t++) {\\n\\t\\tvar potentialRoute = this.routes[t],\\n\\t\\t\\tpathname = state.urlInfo.pathname,\\n\\t\\t\\tmatch;\\n\\t\\tif(state.pathPrefix) {\\n\\t\\t\\tif(pathname.substr(0,state.pathPrefix.length) === state.pathPrefix) {\\n\\t\\t\\t\\tpathname = pathname.substr(state.pathPrefix.length) || \\\"/\\\";\\n\\t\\t\\t\\tmatch = potentialRoute.path.exec(pathname);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tmatch = false;\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tmatch = potentialRoute.path.exec(pathname);\\n\\t\\t}\\n\\t\\tif(match && (potentialRoute.methods?.includes(request.method) || potentialRoute.method === request.method)) {\\n\\t\\t\\tstate.params = [];\\n\\t\\t\\tfor(var p=1; p\u003Cmatch.length; p++) {\\n\\t\\t\\t\\tstate.params.push(match[p]);\\n\\t\\t\\t}\\n\\t\\t\\treturn potentialRoute;\\n\\t\\t}\\n\\t}\\n\\treturn null;\\n};\\n\\nServer.prototype.methodMappings = {\\n\\t\\\"GET\\\": \\\"readers\\\",\\n\\t\\\"OPTIONS\\\": \\\"readers\\\",\\n\\t\\\"HEAD\\\": \\\"readers\\\",\\n\\t\\\"PUT\\\": \\\"writers\\\",\\n\\t\\\"POST\\\": \\\"writers\\\",\\n\\t\\\"DELETE\\\": \\\"writers\\\"\\n};\\n\\n/*\\nCheck whether a given user is authorized for the specified authorizationType (\\\"readers\\\" or \\\"writers\\\"). Pass null or undefined as the username to check for anonymous access\\n*/\\nServer.prototype.isAuthorized = function(authorizationType,username) {\\n\\tvar principals = this.authorizationPrincipals[authorizationType] || [];\\n\\treturn principals.indexOf(\\\"(anon)\\\") !== -1 || (username && (principals.indexOf(\\\"(authenticated)\\\") !== -1 || principals.indexOf(username) !== -1));\\n};\\n\\nServer.prototype.requestHandler = function(request,response,options) {\\n\\toptions = options || {};\\n\\t// Compose the state object\\n\\tvar self = this;\\n\\tvar state = {};\\n\\tstate.wiki = options.wiki || self.wiki;\\n\\tstate.boot = options.boot || self.boot;\\n\\tstate.server = self;\\n\\tstate.urlInfo = url.parse(request.url);\\n\\tstate.queryParameters = querystring.parse(state.urlInfo.query);\\n\\tstate.pathPrefix = options.pathPrefix || this.get(\\\"path-prefix\\\") || \\\"\\\";\\n\\t// Enable CORS\\n\\tif(this.corsEnable) {\\n\\t\\tresponse.setHeader(\\\"Access-Control-Allow-Origin\\\", \\\"*\\\");\\n\\t\\tresponse.setHeader(\\\"Access-Control-Allow-Headers\\\", \\\"*\\\");\\n\\t\\tresponse.setHeader(\\\"Access-Control-Allow-Methods\\\", \\\"*\\\");\\n\\t\\tresponse.setHeader(\\\"Access-Control-Expose-Headers\\\", \\\"*\\\");\\n\\t}\\n\\tstate.sendResponse = sendResponse.bind(self,request,response);\\n\\t// Get the principals authorized to access this resource\\n\\tstate.authorizationType = options.authorizationType || this.methodMappings[request.method] || \\\"readers\\\";\\n\\t// Check for the CSRF header if this is a write\\n\\tif(!this.csrfDisable && state.authorizationType === \\\"writers\\\" && request.headers[\\\"x-requested-with\\\"] !== \\\"TiddlyWiki\\\") {\\n\\t\\tresponse.writeHead(403,\\\"'X-Requested-With' header required to login to '\\\" + this.servername + \\\"'\\\");\\n\\t\\tresponse.end();\\n\\t\\treturn;\\n\\t}\\n\\t// Check whether anonymous access is granted\\n\\tstate.allowAnon = this.isAuthorized(state.authorizationType,null);\\n\\t// Authenticate with the first active authenticator\\n\\tif(this.authenticators.length > 0) {\\n\\t\\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\\n\\t\\t\\t// Bail if we failed (the authenticator will have sent the response)\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t}\\n\\t// Authorize with the authenticated username\\n\\tif(!this.isAuthorized(state.authorizationType,state.authenticatedUsername)) {\\n\\t\\tresponse.writeHead(401,\\\"'\\\" + state.authenticatedUsername + \\\"' is not authorized to access '\\\" + this.servername + \\\"'\\\");\\n\\t\\tresponse.end();\\n\\t\\treturn;\\n\\t}\\n\\t// Reply to OPTIONS\\n\\tif(this.corsEnable && request.method === \\\"OPTIONS\\\") {\\n\\t\\tresponse.writeHead(204);\\n\\t\\tresponse.end();\\n\\t\\treturn;\\n\\t}\\n\\t// Find the route that matches this path\\n\\tvar route = self.findMatchingRoute(request,state);\\n\\t// Optionally output debug info\\n\\tif(self.get(\\\"debug-level\\\") !== \\\"none\\\") {\\n\\t\\tconsole.log(\\\"Request path:\\\",JSON.stringify(state.urlInfo));\\n\\t\\tconsole.log(\\\"Request headers:\\\",JSON.stringify(request.headers));\\n\\t\\tconsole.log(\\\"authenticatedUsername:\\\",state.authenticatedUsername);\\n\\t}\\n\\t// Return a 404 if we didn't find a route\\n\\tif(!route) {\\n\\t\\tresponse.writeHead(404);\\n\\t\\tresponse.end();\\n\\t\\treturn;\\n\\t}\\n\\t// Receive the request body if necessary and hand off to the route handler\\n\\tif(route.bodyFormat === \\\"stream\\\" || request.method === \\\"GET\\\" || request.method === \\\"HEAD\\\") {\\n\\t\\t// Let the route handle the request stream itself\\n\\t\\troute.handler(request,response,state);\\n\\t} else if(route.bodyFormat === \\\"string\\\" || !route.bodyFormat) {\\n\\t\\t// Set the encoding for the incoming request\\n\\t\\trequest.setEncoding(\\\"utf8\\\");\\n\\t\\tvar data = \\\"\\\";\\n\\t\\trequest.on(\\\"data\\\",function(chunk) {\\n\\t\\t\\tdata += chunk.toString();\\n\\t\\t});\\n\\t\\trequest.on(\\\"end\\\",function() {\\n\\t\\t\\tstate.data = data;\\n\\t\\t\\troute.handler(request,response,state);\\n\\t\\t});\\n\\t} else if(route.bodyFormat === \\\"buffer\\\") {\\n\\t\\tvar data = [];\\n\\t\\trequest.on(\\\"data\\\",function(chunk) {\\n\\t\\t\\tdata.push(chunk);\\n\\t\\t});\\n\\t\\trequest.on(\\\"end\\\",function() {\\n\\t\\t\\tstate.data = Buffer.concat(data);\\n\\t\\t\\troute.handler(request,response,state);\\n\\t\\t});\\n\\t} else {\\n\\t\\tresponse.writeHead(400,\\\"Invalid bodyFormat \\\" + route.bodyFormat + \\\" in route \\\" + route.method + \\\" \\\" + route.path.source);\\n\\t\\tresponse.end();\\n\\t}\\n};\\n\\n/*\\nListen for requests\\nport: optional port number (falls back to value of \\\"port\\\" variable)\\nhost: optional host address (falls back to value of \\\"host\\\" variable)\\nprefix: optional prefix (falls back to value of \\\"path-prefix\\\" variable)\\n*/\\nServer.prototype.listen = function(port,host,prefix) {\\n\\tvar self = this;\\n\\t// Handle defaults for port and host\\n\\tport = port || this.get(\\\"port\\\");\\n\\thost = host || this.get(\\\"host\\\");\\n\\tprefix = prefix || this.get(\\\"path-prefix\\\") || \\\"\\\";\\n\\t// Check for the port being a string and look it up as an environment variable\\n\\tif(parseInt(port,10).toString() !== port) {\\n\\t\\tport = process.env[port] || 8080;\\n\\t}\\n\\t// Warn if required plugins are missing\\n\\tvar missing = [];\\n\\tfor(var index=0; index\u003Cthis.requiredPlugins.length; index++) {\\n\\t\\tif(!this.wiki.getTiddler(this.requiredPlugins[index])) {\\n\\t\\t\\tmissing.push(this.requiredPlugins[index]);\\n\\t\\t}\\n\\t}\\n\\tif(missing.length > 0) {\\n\\t\\tvar error = \\\"Warning: Plugin(s) required for client-server operation are missing.\\\\n\\\"+\\n\\t\\t\\t\\\"\\\\\\\"\\\"+ missing.join(\\\"\\\\\\\", \\\\\\\"\\\")+\\\"\\\\\\\"\\\";\\n\\t\\t$tw.utils.warning(error);\\n\\t}\\n\\t// Create the server\\n\\tvar server;\\n\\tif(this.listenOptions) {\\n\\t\\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\\n\\t} else {\\n\\t\\tserver = this.transport.createServer(this.requestHandler.bind(this));\\n\\t}\\n\\t// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)\\n\\tserver.on(\\\"listening\\\",function() {\\n\\t\\tvar address = server.address(),\\n\\t\\t\\turl = self.protocol + \\\"://\\\" + (address.family === \\\"IPv6\\\" ? \\\"[\\\" + address.address + \\\"]\\\" : address.address) + \\\":\\\" + address.port + prefix;\\n\\t\\t$tw.utils.log(\\\"Serving on \\\" + url,\\\"brown/orange\\\");\\n\\t\\t$tw.utils.log(\\\"(press ctrl-C to exit)\\\",\\\"red\\\");\\n\\t});\\n\\t// Listen\\n\\treturn server.listen(port,host);\\n};\\n\\nexports.Server = Server;\\n\",\"type\":\"application/javascript\",\"module-type\":\"library\"},\"$:/core/modules/startup/commands.js\":{\"title\":\"$:/core/modules/startup/commands.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/startup/commands.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nCommand processing\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"commands\\\";\\nexports.platforms = [\\\"node\\\"];\\nexports.after = [\\\"story\\\"];\\nexports.synchronous = false;\\n\\nexports.startup = function(callback) {\\n\\t// On the server, start a commander with the command line arguments\\n\\tvar commander = new $tw.Commander(\\n\\t\\t$tw.boot.argv,\\n\\t\\tfunction(err) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\treturn $tw.utils.error(\\\"Error: \\\" + err);\\n\\t\\t\\t}\\n\\t\\t\\tcallback();\\n\\t\\t},\\n\\t\\t$tw.wiki,\\n\\t\\t{output: process.stdout, error: process.stderr}\\n\\t);\\n\\tcommander.execute();\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core-modules/modules/utils/base64.js\":{\"title\":\"$:/core-modules/modules/utils/base64.js\",\"text\":\"/*\\\\\\ntitle: $:/core-modules/modules/utils/base64.js\\ntype: application/javascript\\nmodule-type: utils-node\\n\\nBase64 UTF-8 utlity functions.\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nconst { TextEncoder, TextDecoder } = require(\\\"node:util\\\");\\n\\nexports.btoa = (binstr) => Buffer.from(binstr, \\\"binary\\\").toString(\\\"base64\\\");\\n\\nexports.atob = (b64) => Buffer.from(b64, \\\"base64\\\").toString(\\\"binary\\\");\\n\\nfunction base64ToBytes(base64) {\\n\\tconst binString = exports.atob(base64);\\n\\treturn Uint8Array.from(binString, (m) => m.codePointAt(0));\\n};\\n\\nfunction bytesToBase64(bytes) {\\n\\tconst binString = Array.from(bytes, (byte) => String.fromCodePoint(byte)).join(\\\"\\\");\\n\\treturn exports.btoa(binString);\\n};\\n\\nexports.base64EncodeUtf8 = (str) => bytesToBase64(new TextEncoder().encode(str));\\n\\nexports.base64DecodeUtf8 = (str) => new TextDecoder().decode(base64ToBytes(str));\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils-node\"},\"$:/core/modules/utils/edition-info.js\":{\"title\":\"$:/core/modules/utils/edition-info.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/edition-info.js\\ntype: application/javascript\\nmodule-type: utils-node\\n\\nInformation about the available editions\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nvar fs = require(\\\"fs\\\"),\\n\\tpath = require(\\\"path\\\");\\n\\nvar editionInfo;\\n\\nexports.getEditionInfo = function() {\\n\\tif(!editionInfo) {\\n\\t\\t// Enumerate the edition paths\\n\\t\\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\\n\\t\\teditionInfo = {};\\n\\t\\tfor(var editionIndex=0; editionIndex\u003CeditionPaths.length; editionIndex++) {\\n\\t\\t\\tvar editionPath = editionPaths[editionIndex];\\n\\t\\t\\t// Enumerate the folders\\n\\t\\t\\tvar entries = fs.readdirSync(editionPath);\\n\\t\\t\\tfor(var entryIndex=0; entryIndex\u003Centries.length; entryIndex++) {\\n\\t\\t\\t\\tvar entry = entries[entryIndex];\\n\\t\\t\\t\\t// Check if directories have a valid tiddlywiki.info\\n\\t\\t\\t\\t// Check if the entry is a hidden directory\\n\\t\\t\\t\\tif((entry.charAt(0) !== \\\".\\\") && !editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\\n\\t\\t\\t\\t\\tvar file=path.resolve(editionPath,entry,\\\"tiddlywiki.info\\\");\\n\\t\\t\\t\\t\\tif(fs.existsSync(file)) {\\n\\t\\t\\t\\t\\t\\tvar info = $tw.utils.parseJSONSafe(fs.readFileSync(file,\\\"utf8\\\"),null);\\n\\t\\t\\t\\t\\t\\tif(info) {\\n\\t\\t\\t\\t\\t\\t\\teditionInfo[entry] = info;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn editionInfo;\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils-node\"},\"$:/core-server/modules/utils/escapecss.js\":{\"title\":\"$:/core-server/modules/utils/escapecss.js\",\"text\":\"/*\\\\\\ntitle: $:/core-server/modules/utils/escapecss.js\\ntype: application/javascript\\nmodule-type: utils-node\\n\\nProvides CSS.escape() functionality.\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nexports.escapeCSS = (function() {\\n\\t// see also https://drafts.csswg.org/cssom/#serialize-an-identifier\\n\\n\\t/* eslint-disable */\\n\\t/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\\n\\treturn function(value) {\\n\\t\\tif (arguments.length == 0) {\\n\\t\\t\\tthrow new TypeError('`CSS.escape` requires an argument.');\\n\\t\\t}\\n\\t\\tvar string = String(value);\\n\\t\\tvar length = string.length;\\n\\t\\tvar index = -1;\\n\\t\\tvar codeUnit;\\n\\t\\tvar result = '';\\n\\t\\tvar firstCodeUnit = string.charCodeAt(0);\\n\\t\\twhile (++index \u003C length) {\\n\\t\\t\\tcodeUnit = string.charCodeAt(index);\\n\\t\\t\\t// Note: there’s no need to special-case astral symbols, surrogate\\n\\t\\t\\t// pairs, or lone surrogates.\\n\\n\\t\\t\\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\\n\\t\\t\\t// (U+FFFD).\\n\\t\\t\\tif (codeUnit == 0x0000) {\\n\\t\\t\\t\\tresult += '\\\\uFFFD';\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif (\\n\\t\\t\\t\\t// If the character is in the range [\\\\1-\\\\1F] (U+0001 to U+001F) or is\\n\\t\\t\\t\\t// U+007F, […]\\n\\t\\t\\t\\t(codeUnit >= 0x0001 && codeUnit \u003C= 0x001F) || codeUnit == 0x007F ||\\n\\t\\t\\t\\t// If the character is the first character and is in the range [0-9]\\n\\t\\t\\t\\t// (U+0030 to U+0039), […]\\n\\t\\t\\t\\t(index == 0 && codeUnit >= 0x0030 && codeUnit \u003C= 0x0039) ||\\n\\t\\t\\t\\t// If the character is the second character and is in the range [0-9]\\n\\t\\t\\t\\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\\n\\t\\t\\t\\t(\\n\\t\\t\\t\\t\\tindex == 1 &&\\n\\t\\t\\t\\t\\tcodeUnit >= 0x0030 && codeUnit \u003C= 0x0039 &&\\n\\t\\t\\t\\t\\tfirstCodeUnit == 0x002D\\n\\t\\t\\t\\t)\\n\\t\\t\\t) {\\n\\t\\t\\t\\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\\n\\t\\t\\t\\tresult += '\\\\\\\\' + codeUnit.toString(16) + ' ';\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif (\\n\\t\\t\\t\\t// If the character is the first character and is a `-` (U+002D), and\\n\\t\\t\\t\\t// there is no second character, […]\\n\\t\\t\\t\\tindex == 0 &&\\n\\t\\t\\t\\tlength == 1 &&\\n\\t\\t\\t\\tcodeUnit == 0x002D\\n\\t\\t\\t) {\\n\\t\\t\\t\\tresult += '\\\\\\\\' + string.charAt(index);\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If the character is not handled by one of the above rules and is\\n\\t\\t\\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\\n\\t\\t\\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\\n\\t\\t\\t// U+005A), or [a-z] (U+0061 to U+007A), […]\\n\\t\\t\\tif (\\n\\t\\t\\t\\tcodeUnit >= 0x0080 ||\\n\\t\\t\\t\\tcodeUnit == 0x002D ||\\n\\t\\t\\t\\tcodeUnit == 0x005F ||\\n\\t\\t\\t\\tcodeUnit >= 0x0030 && codeUnit \u003C= 0x0039 ||\\n\\t\\t\\t\\tcodeUnit >= 0x0041 && codeUnit \u003C= 0x005A ||\\n\\t\\t\\t\\tcodeUnit >= 0x0061 && codeUnit \u003C= 0x007A\\n\\t\\t\\t) {\\n\\t\\t\\t\\t// the character itself\\n\\t\\t\\t\\tresult += string.charAt(index);\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Otherwise, the escaped character.\\n\\t\\t\\t// https://drafts.csswg.org/cssom/#escape-a-character\\n\\t\\t\\tresult += '\\\\\\\\' + string.charAt(index);\\n\\n\\t\\t}\\n\\t\\treturn result;\\n\\t};\\n\\t/* eslint-enable */\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils-node\"},\"$:/core/modules/utils/repository.js\":{\"title\":\"$:/core/modules/utils/repository.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/repository.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nUtilities for working with the TiddlyWiki repository file structure\\n\\n\\\\*/\\n\\\"use strict\\\";\\n\\n/*\\nGet an object containing all the plugins as a hashmap by title of the JSON representation of the plugin\\nOptions:\\n\\nignoreEnvironmentVariables: defaults to false\\n*/\\nexports.getAllPlugins = function(options) {\\n\\toptions = options || {};\\n\\tvar path = require(\\\"path\\\"),\\n\\t\\ttiddlers = {};\\n\\t// Collect up the library plugins\\n\\tvar collectPlugins = function(folder) {\\n\\t\\t\\tvar pluginFolders = $tw.utils.getSubdirectories(folder) || [];\\n\\t\\t\\tfor(var p=0; p\u003CpluginFolders.length; p++) {\\n\\t\\t\\t\\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\\n\\t\\t\\t\\t\\tvar pluginFields = $tw.loadPluginFolder(path.resolve(folder,\\\"./\\\" + pluginFolders[p]));\\n\\t\\t\\t\\t\\tif(pluginFields && pluginFields.title) {\\n\\t\\t\\t\\t\\t\\ttiddlers[pluginFields.title] = pluginFields;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tcollectPublisherPlugins = function(folder) {\\n\\t\\t\\tvar publisherFolders = $tw.utils.getSubdirectories(folder) || [];\\n\\t\\t\\tfor(var t=0; t\u003CpublisherFolders.length; t++) {\\n\\t\\t\\t\\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\\n\\t\\t\\t\\t\\tcollectPlugins(path.resolve(folder,\\\"./\\\" + publisherFolders[t]));\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,options.ignoreEnvironmentVariables ? undefined : $tw.config.pluginsEnvVar),collectPublisherPlugins);\\n\\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,options.ignoreEnvironmentVariables ? undefined : $tw.config.themesEnvVar),collectPublisherPlugins);\\n\\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,options.ignoreEnvironmentVariables ? undefined : $tw.config.languagesEnvVar),collectPlugins);\\n\\treturn tiddlers;\\n};\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"}}}"},
{"title":"$:/core/templates/tiddlywiki5-external-js.html","created":"20210323194843795","modified":"20210323194856993","type":"text/vnd.tiddlywiki","text":"\\rules only filteredtranscludeinline transcludeinline\n\u003C!doctype html>\n{{$:/core/templates/MOTW.html}}\u003Chtml lang=\"`\u003C$text text={{{ [{$:/language}get[name]] }}}/>`\">\n\u003Chead>\n\u003Cmeta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n\u003C!--~~ Raw markup for the top of the head section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}\n\u003Cmeta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n\u003Cmeta name=\"application-name\" content=\"TiddlyWiki\" />\n\u003Cmeta name=\"generator\" content=\"TiddlyWiki\" />\n\u003Cmeta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n\u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n\u003Cmeta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n\u003Cmeta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n\u003Cmeta name=\"mobile-web-app-capable\" content=\"yes\"/>\n\u003Cmeta name=\"format-detection\" content=\"telephone=no\" />\n\u003Cmeta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n\u003Clink id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n\u003Ctitle>{{$:/core/wiki/title}}\u003C/title>\n\u003C!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n\u003C!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}\n\u003C/head>\n\u003Cbody class=\"tc-body\">\n\u003C!--~~ Raw markup for the top of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}\n\u003C!--~~ Static styles ~~-->\n\u003Cdiv id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n\u003C/div>\n\u003C!--~~ Static content for Google and browsers without JavaScript ~~-->\n\u003Cnoscript>\n\u003Cdiv id=\"splashArea\">\n{{$:/core/templates/static.area}}\n\u003C/div>\n\u003C/noscript>\n\u003C!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n\u003C!--~~ Raw markup for the bottom of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}\n\u003C/body>\n\u003Cscript src=\"./tiddlywiki.js\" onerror=\"alert('Error: Cannot load tiddlywiki.js');\">\u003C/script>\n\u003C/html>\n"},
{"title":"$:/DefaultTiddlers","created":"20200611171322458","modified":"20200611171524048","type":"text/vnd.tiddlywiki","text":"GettingStarted Details"},
{"title":"$:/favicon.ico","created":"20210324150050449","modified":"20210324152839336","tags":"","description":"This icon is used for the community links edition","type":"image/svg+xml","text":"\u003Csvg width=\"128\" height=\"128\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n \u003Cg transform=\"matrix(.97 0 0 .97 .089 .911)\" style=\"stroke-width:1.03\">\n \u003Crect x=\"1.22\" y=\"14.6\" width=\"127\" height=\"104\" rx=\"4.37\" ry=\"4.37\" style=\"fill:#fff\"/>\n \u003Cpath d=\"m6.15-0.939c-3.42-1e-7 -6.24 2.82-6.24 6.24v120c0 3.42 2.82 6.24 6.24 6.24h120c3.42 0 6.24-2.82 6.24-6.24v-120c0-3.42-2.82-6.24-6.24-6.24zm71.9 22.6 10.7 18.5c0.358-2.89 1.19-5.34 2.49-7.36 1.29-2.03 3.14-3.74 5.54-5.13 4.25-2.46 8.72-2.78 13.4-0.965 4.68 1.79 8.56 5.35 11.6 10.7 3.07 5.32 4.22 10.5 3.44 15.4-0.787 4.95-3.31 8.65-7.56 11.1-2.4 1.39-4.8 2.14-7.2 2.26-2.41 0.102-4.95-0.413-7.63-1.55l2.88 4.99-11 6.37-27.7-48zm23.6 15.2c-1.42-0.0764-2.88 0.312-4.35 1.16-2.36 1.36-3.68 3.29-3.94 5.77-0.257 2.45 0.557 5.31 2.44 8.57 1.89 3.27 3.96 5.41 6.22 6.44 2.27 0.99 4.59 0.804 6.95-0.56 2.36-1.36 3.66-3.27 3.9-5.7 0.257-2.45-0.563-5.32-2.46-8.6-1.9-3.29-3.97-5.43-6.22-6.44-0.836-0.38-1.68-0.595-2.54-0.641zm-42.2 15.6c0.855 0.0071 1.67 0.0915 2.46 0.256 4.19 0.844 7.87 4.03 11.1 9.56l11.4 19.7-11.1 6.43-2.95-5.12c-0.269 2.95-1.05 5.44-2.34 7.48-1.3 2.01-3.28 3.78-5.93 5.31-3.58 2.06-7.08 2.71-10.5 1.92-3.43-0.815-6.1-2.88-8.03-6.21-2.34-4.05-2.67-7.82-0.983-11.3 1.7-3.5 5.54-6.97 11.5-10.4l6.5-3.75-0.497-0.864c-1.01-1.75-2.43-2.62-4.27-2.63-1.85-0.0271-4.23 0.801-7.15 2.49-2.36 1.36-4.43 2.87-6.19 4.52-1.76 1.65-3.24 3.45-4.44 5.4l-4.86-8.41c2.03-1.94 4.16-3.74 6.37-5.41 2.21-1.68 4.5-3.21 6.88-4.59 5.06-2.92 9.44-4.37 13.1-4.33zm-45.8 6.37 27.7 48-11 6.37-27.7-48zm50.6 14-5.73 3.31c-2.3 1.33-3.81 2.72-4.53 4.18-0.7 1.45-0.612 2.93 0.266 4.45 0.807 1.4 1.9 2.23 3.29 2.5 1.4 0.235 2.93-0.127 4.59-1.09 2.08-1.2 3.4-2.95 3.96-5.24 0.552-2.32 0.179-4.6-1.11-6.84z\" style=\"color-rendering:auto;color:#000000;fill:#ff7800;dominant-baseline:auto;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;image-rendering:auto;inline-size:0;isolation:auto;mix-blend-mode:normal;shape-margin:0;shape-padding:0;shape-rendering:auto;solid-color:#000000;stop-color:#000000;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal\"/>\n \u003C/g>\n\u003C/svg>\n"},
{"title":"$:/isEncrypted","text":"no"},
{"title":"$:/palette","created":"20240825144111729","modified":"20240825144207183","type":"text/vnd.tiddlywiki","text":"$:/palettes/Vanilla"},
{"title":"$:/plugins/wikilabs/info-tagmap","name":"Info TagMap","description":"Adds a Tag-Map tab to the tiddler info section","author":"Mario Pietsch","core-version":">=5.1.0","version":"0.4.0","list":"readme license history","stability":"STABILITY_2_STABLE","plugin-type":"plugin","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/wikilabs/ui/TiddlerInfo/TagMap\":{\"title\":\"$:/wikilabs/ui/TiddlerInfo/TagMap\",\"tags\":\"$:/tags/TiddlerInfo\",\"caption\":\"Tag Map\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class=\\\"flexbox\\\">\\n\\t\u003C$list filter=\\\"[all[current]tags[]sort[title]]\\\" emptyMessage=\\\"This tiddler has no tags\\\">\\n\\t\\t\u003C$let\\n\\t\\t\\thasPositional={{{ [all[shadows+tiddlers]!is[draft]tag\u003CcurrentTiddler>has:field[list-before]] [all[shadows+tiddlers]!is[draft]tag\u003CcurrentTiddler>has:field[list-after]] +[first[]] }}}\\n\\t\\t\\tlockState={{{ [[$:/state/wikilabs/info-tagmap/unlocked/]addsuffix\u003CcurrentTiddler>] }}}\\n\\t\\t>\\n\\t\\t\\t\u003Cdiv class=\\\"col\\\">\\n\\t\\t\\t\\t\u003Cspan class=\\\"tc-tag-label\\\">\\n\\t\\t\\t\\t\\t\u003C$transclude tiddler=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\\t\\t\\t\\t\u003C/span>\\n\\t\\t\\t\\t\u003C%if [\u003ChasPositional>!is[blank]] %>\\n\\t\\t\\t\\t\\t\u003C%if [\u003ClockState>get[text]match[yes]] %>\\n\\t\\t\\t\\t\\t\\t\u003C$button set=\u003C\u003ClockState>> setTo=\\\"\\\" tooltip=\\\"Lock to disable drag-and-drop sorting (preserves list-before / list-after fields)\\\" class=\\\"tc-btn-invisible tc-small-gap-left\\\">\\n\\t\\t\\t\\t\\t\\t\\t{{$:/core/images/unlocked-padlock}}\\n\\t\\t\\t\\t\\t\\t\u003C/$button>\\n\\t\\t\\t\\t\\t\u003C%else%>\\n\\t\\t\\t\\t\\t\\t\u003C$button set=\u003C\u003ClockState>> setTo=\\\"yes\\\" tooltip=\\\"Unlock to enable drag-and-drop sorting (will clear list-before / list-after on the first drop)\\\" class=\\\"tc-btn-invisible tc-small-gap-left\\\">\\n\\t\\t\\t\\t\\t\\t\\t{{$:/core/images/locked-padlock}}\\n\\t\\t\\t\\t\\t\\t\u003C/$button>\\n\\t\\t\\t\\t\\t\u003C%endif%>\\n\\t\\t\\t\\t\u003C%endif%>\\n\\t\\t\\t\\t\u003Chr>\\n\\t\\t\\t\\t\u003C%if [\u003ChasPositional>!is[blank]] %>\\n\\t\\t\\t\\t\\t\u003C%if [\u003ClockState>get[text]match[yes]] %>\\n\\t\\t\\t\\t\\t\\t\u003C$macrocall $name=\\\"list-tagged-draggable\\\" tag=\u003C\u003CcurrentTiddler>> subFilter=\\\"!is[draft]\\\" itemTemplate=\\\"$:/wikilabs/ui/TiddlerInfo/TagMap/ItemTemplate\\\"/>\\n\\t\\t\\t\\t\\t\u003C%else%>\\n\\t\\t\\t\\t\\t\\t\u003C$list filter=\\\"[all[shadows+tiddlers]!is[draft]sort[title]tag\u003CcurrentTiddler>]\\\" template=\\\"$:/wikilabs/ui/TiddlerInfo/TagMap/ItemTemplate\\\"/>\\n\\t\\t\\t\\t\\t\u003C%endif%>\\n\\t\\t\\t\\t\u003C%else%>\\n\\t\\t\\t\\t\\t\u003C$macrocall $name=\\\"list-tagged-draggable\\\" tag=\u003C\u003CcurrentTiddler>> subFilter=\\\"!is[draft]\\\" itemTemplate=\\\"$:/wikilabs/ui/TiddlerInfo/TagMap/ItemTemplate\\\"/>\\n\\t\\t\\t\\t\u003C%endif%>\\n\\t\\t\\t\u003C/div>\\n\\t\\t\u003C/$let>\\n\\t\u003C/$list>\\n\u003C/div>\\n\"},\"$:/wikilabs/ui/TiddlerInfo/TagMap/ItemTemplate\":{\"title\":\"$:/wikilabs/ui/TiddlerInfo/TagMap/ItemTemplate\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-menu-list-item\\\">\\n\\t\u003C$link to=\u003C\u003CcurrentTiddler>>>\\n\\t\\t\u003C$view field=\\\"title\\\"/>\\n\\t\u003C/$link>\\n\\t\u003C%if [\u003CcurrentTiddler>has:field[list-before]] %>\\n\\t\\t\u003Cspan class=\\\"wltc-list-pos\\\" title={{{ [[list-before: ]addsuffix{!!list-before}] }}}>↑\u003C/span>\\n\\t\u003C%endif%>\\n\\t\u003C%if [\u003CcurrentTiddler>has:field[list-after]] %>\\n\\t\\t\u003Cspan class=\\\"wltc-list-pos\\\" title={{{ [[list-after: ]addsuffix{!!list-after}] }}}>↓\u003C/span>\\n\\t\u003C%endif%>\\n\u003C/div>\\n\"},\"$:/wikilabs/ui/TiddlerInfo/TagMap/Styles\":{\"title\":\"$:/wikilabs/ui/TiddlerInfo/TagMap/Styles\",\"tags\":\"$:/tags/Stylesheet\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\".flexbox {\\n\\tdisplay: -webkit-flex;\\n\\tdisplay: -ms-flexbox;\\n\\tdisplay: flex;\\n\\toverflow: hidden;\\n\\tflex-direction: row;\\n\\tflex-flow: row wrap;\\n}\\n\\n.flexbox .col {\\n\\tflex: 1 1 33%;\\n\\tmargin-bottom: 1em;\\n}\\n\\n\u003C$let wltcBg=\u003C\u003Ccolour tag-background>> wltcColA=\u003C\u003Ccolour foreground>> wltcColB=\u003C\u003Ccolour background>>>\\n\\t\u003C$wikify name=\\\"wltcFg\\\" text=\\\"\\\"\\\"\u003C$macrocall $name=\\\"contrastcolour\\\" target=\u003C\u003CwltcBg>> fallbackTarget=\u003C\u003CwltcBg>> colourA=\u003C\u003CwltcColA>> colourB=\u003C\u003CwltcColB>>/>\\\"\\\"\\\">\\n\\t\\t.wltc-list-pos {\\n\\t\\t\\tfont-size: 0.85em;\\n\\t\\t\\tmargin-left: 0.5em;\\n\\t\\t\\tpadding: 0 0.4em;\\n\\t\\t\\tborder-radius: 4px;\\n\\t\\t\\tbackground: \u003C\u003CwltcBg>>;\\n\\t\\t\\tcolor: \u003C\u003CwltcFg>>;\\n\\t\\t}\\n\\t\u003C/$wikify>\\n\u003C/$let>\\n\"},\"$:/plugins/wikilabs/info-tagmap/history\":{\"title\":\"$:/plugins/wikilabs/info-tagmap/history\",\"text\":\"V 0.4.0 - 2026-05-15\\n\\n* Per-column padlock protects `list-before` / `list-after` fields; click to unlock drag-and-drop sorting.\\n* Badge tooltip now reads `list-before: \u003Cvalue>` instead of just the value.\\n\\nV 0.3.0 - 2026-05-15\\n\\n* Tagged items in the Tag Map now show a ↑ / ↓ badge when they carry a `list-before` or `list-after` field. Hover the badge to see the field value.\\n* Inner list switched to alphabetical sort with `list-before` / `list-after` positional fields applied via `tag[]`.\\n\\nV 0.2.2 - 2024-05-23\\n\\n* Add stability badges\\n** The development status of a plugin: deprecated, experimental, stable, or legacy\\n\\nV 0.2.1 - 2022-08-04\\n\\n* Fix whitespace handling for TW v5.2.3\\n\\nV 0.2.0 - 2022-03-27\\n\\n* ''Important'': Changed license to Attribution-NonCommercial-ShareAlike -- [[CC-BY-NC-SA|$:/plugins/wikilabs/info-tagmap/license]]\\n\\nV 0.1.3 - 2020-12-25\\n\\n* update license\\n\\nV 0.1.2 - 2020.01.19\\n\\n* Update license link/text\\n\\nV 0.1.1 - 2016\\n\\n* initial release\\n\"},\"$:/plugins/wikilabs/info-tagmap/license\":{\"title\":\"$:/plugins/wikilabs/info-tagmap/license\",\"license-text\":\"https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode\",\"text\":\"[[Info-Tag-Map|https://wikilabs.github.io/#info-tagmap]] (c) Mario Pietsch - 2016\u003C\u003Cnow YYYY>>\\n\\n[[Creative Commons Attribution-NonCommercial-ShareAlike|https://creativecommons.org/licenses/by-nc-sa/4.0/]]\\n\"},\"$:/plugins/wikilabs/info-tagmap/readme\":{\"title\":\"$:/plugins/wikilabs/info-tagmap/readme\",\"text\":\"This plugin adds a new tab to the tiddler info section. It's a multi column list of all tiddler tags plus all tagged tiddlers.\\n\\nThis plugin doesn't change any core templates.\\n\\nThe code below can be copied into the tag tiddlers.\\n\\n```\\nAll tiddlers tagged: {{!!title}}\\n\\n\u003C\u003Clist-links filter:\\\"[tag{!!title}]\\\">>\\n```\"}}}"},
{"title":"$:/SiteSubtitle","created":"20210324170724747","modified":"20210324170817337","type":"text/vnd.tiddlywiki","text":"A home for: Plugins, Editions and Themes!"},
{"title":"$:/SiteTitle","created":"20200921164953733","modified":"20200921165002199","type":"text/vnd.tiddlywiki","text":"Wikilabs Home"},
{"title":"$:/status/RequireReloadDueToPluginChange","text":"no"},
{"title":"$:/StoryList","text":"","list":"GettingStarted Details"},
{"title":"$:/theme","created":"20170203102042031","modified":"20260515075148342","type":"text/vnd.tiddlywiki","text":"$:/themes/wikilabs/slant-01"},
{"title":"$:/themes/tiddlywiki/snowwhite","name":"Snow White","author":"JeremyRuston","core-version":">=5.0.0","plugin-type":"theme","description":"Emphasises individual tiddlers","dependents":"$:/themes/tiddlywiki/vanilla","plugin-priority":"0","version":"5.4.1-prerelease","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/tiddlywiki/snowwhite/base\":{\"title\":\"$:/themes/tiddlywiki/snowwhite/base\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\define sidebarbreakpoint-minus-one()\\n\u003C$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\\n\\\\end\\n\\n\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\\n\\n.tc-sidebar-header {\\n\\ttext-shadow: 0 1px 0 \u003C\u003Ccolour sidebar-foreground-shadow>>;\\n}\\n\\n.tc-tiddler-info {\\n\\tbox-shadow: inset 1px 2px 3px rgba(0,0,0,0.1);\\n}\\n\\n@media screen {\\n\\t.tc-tiddler-frame {\\n\\t\\tbox-shadow: 1px 1px 5px rgba(0, 0, 0, 0.3);\\n\\t}\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\t.tc-tiddler-frame {\\n\\t\\tbox-shadow: none;\\n\\t}\\n}\\n\\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\\n\\ttransition: fill 150ms ease-in-out;\\n}\\n\\n.tc-tiddler-controls button.tc-selected,\\n.tc-page-controls button.tc-selected {\\n\\tfilter: drop-shadow(0px -1px 2px rgba(0,0,0,0.25));\\n}\\n\\n.tc-tiddler-frame input.tc-edit-texteditor,\\n.tc-tiddler-frame select.tc-edit-texteditor {\\n\\tbox-shadow: inset 0 1px 8px rgba(0, 0, 0, 0.15);\\n}\\n\\n.tc-edit-tags {\\n\\tbox-shadow: inset 0 1px 8px rgba(0, 0, 0, 0.15);\\n}\\n\\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\\n\\tbox-shadow: none;\\n\\tborder: none;\\n\\toutline: none;\\n}\\n\\ntextarea.tc-edit-texteditor {\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\\n}\\n\\ncanvas.tc-edit-bitmapeditor {\\n\\tbox-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5);\\n}\\n\\n.tc-drop-down {\\n\\tborder-radius: 4px;\\n\\tbox-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);\\n}\\n\\n.tc-block-dropdown {\\n\\tborder-radius: 4px;\\n\\tbox-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);\\n}\\n\\n.tc-modal {\\n\\tborder-radius: 6px;\\n\\tbox-shadow: 0 3px 7px rgba(0,0,0,0.3);\\n}\\n\\n.tc-modal-footer {\\n\\tborder-radius: 0 0 6px 6px;\\n\\tbox-shadow: inset 0 1px 0 #fff;\\n}\\n\\n\\n.tc-alert {\\n\\tborder-radius: 6px;\\n\\tbox-shadow: 0 3px 7px rgba(0,0,0,0.6);\\n}\\n\\n.tc-notification {\\n\\tborder-radius: 6px;\\n\\tbox-shadow: 0 3px 7px rgba(0,0,0,0.3);\\n\\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\\n}\\n\\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\\n\\tborder-top: none;\\n\\theight: 1px;\\n\\tbackground-image: linear-gradient(to right, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%); \\n}\\n\\n/* HACK: :dir should be used here. html[dir=\\\"rtl\\\"] rules are used to support browsers released before 2023 */\\n\\nhtml[dir=\\\"rtl\\\"] .tc-sidebar-lists .tc-tab-set .tc-tab-divider {\\n\\tbackground-image: linear-gradient(to left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%);\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\\n\\tbackground-image: linear-gradient(to right, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%);\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\\n\\tbackground-image: linear-gradient(to right, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%);\\n}\\n\\nhtml[dir=\\\"rtl\\\"] .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\\n background-image: linear-gradient(to right, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.01) 100%);\\n}\\n\\nhtml[dir=\\\"rtl\\\"] .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\\n background-image: linear-gradient(to right, rgba(255,255,255,0.05) 0%, rgba(0,0,0,0.05) 100%)\\n}\\n\\n.tc-message-box img {\\n\\tbox-shadow: 1px 1px 3px rgba(0,0,0,0.5);\\n}\\n\\n.tc-plugin-info {\\n\\tbox-shadow: 1px 1px 3px rgba(0,0,0,0.5)\\n}\\n\"}}}"},
{"title":"$:/themes/tiddlywiki/vanilla","name":"Vanilla","author":"JeremyRuston","core-version":">=5.0.0","plugin-type":"theme","description":"Basic theme","plugin-priority":"0","version":"5.4.1-prerelease","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/tiddlywiki/vanilla/base\":{\"title\":\"$:/themes/tiddlywiki/vanilla/base\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"list-before\":\"\",\"code-body\":\"yes\",\"text\":\"\\\\define custom-background-datauri()\\n\u003C$set name=\\\"background\\\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\\n\u003C$list filter=\\\"[\u003Cbackground>is[image]]\\\">\\n`background: url(`\\n\u003C$list filter=\\\"[\u003Cbackground>!has[_canonical_uri]]\\\">\\n`\\\"`\u003C$macrocall $name=\\\"datauri\\\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`\\\"`\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Cbackground>has[_canonical_uri]]\\\">\\n`\\\"`\u003C$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\\\"_canonical_uri\\\"/>`\\\"`\\n\u003C/$list>\\n`) center center;`\\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\\n\u003C/$list>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define sidebarbreakpoint()\\n\u003C$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/>\\n\\\\end\\n\\n\\\\define sidebarbreakpoint-minus-one()\\n\u003C$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\\n\\\\end\\n\\n\\\\define if-fluid-fixed(text,hiddenSidebarText)\\n\u003C$reveal state=\\\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\\\" type=\\\"match\\\" text=\\\"fluid-fixed\\\">\\n$text$\\n\u003C$reveal state=\\\"$:/state/sidebar\\\" type=\\\"nomatch\\\" text=\\\"yes\\\" default=\\\"yes\\\">\\n$hiddenSidebarText$\\n\u003C/$reveal>\\n\u003C/$reveal>\\n\\\\end\\n\\n\\\\define if-editor-height-fixed(then,else)\\n\u003C$reveal state=\\\"$:/config/TextEditor/EditorHeight/Mode\\\" type=\\\"match\\\" text=\\\"fixed\\\">\\n$then$\\n\u003C/$reveal>\\n\u003C$reveal state=\\\"$:/config/TextEditor/EditorHeight/Mode\\\" type=\\\"match\\\" text=\\\"auto\\\">\\n$else$\\n\u003C/$reveal>\\n\\\\end\\n\\n\\\\define set-type-selector-min-width()\\n\u003C$set name=\\\"typeLength\\\" value={{{ [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]get[name]length[]maxall[]] }}}>\\n\\n\\t.tc-type-selector-dropdown-wrapper {\\n\\t\\tmin-width: calc(\u003C\u003CtypeLength>>ch + 4em);\\n\\t}\\n\\n\\t.tc-type-selector-dropdown-wrapper input.tc-edit-typeeditor {\\n\\t\\tmin-width: \u003C\u003CtypeLength>>ch;\\n\\t}\\n\\n\u003C/$set>\\n\\\\end\\n\\n\\\\import [[$:/core/macros/CSS/property]]\\n\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\\n\\n/*\\n** Start with the normalize CSS reset, and then belay some of its effects\\n*/\\n\\n{{$:/themes/tiddlywiki/vanilla/reset}}\\n\\ninput[type=\\\"search\\\"] {\\n\\toutline-offset: initial;\\n}\\n\\nbutton:focus-visible, input:focus-visible, textarea:focus-visible, select:focus-visible {\\n\\toutline: 2px solid \u003C\u003Ccolour primary>>;\\n\\toutline-offset: -2px;\\n\\tborder-radius: 0.25em;\\n}\\n\\nbutton:-moz-focusring, input:-moz-focusring, textarea:-moz-focusring, select:-moz-focusring {\\n\\toutline: 2px solid \u003C\u003Ccolour primary>>;\\n\\toutline-offset: -2px;\\n\\tborder-radius: 0.25em;\\n}\\n\\n/*\\n** Button default styles. Makes them look consistent for all browsers\\n*/\\nhtml button {\\n\\tline-height: 1.2;\\n\\tcolor: \u003C\u003Ccolour button-foreground>>;\\n\\tfill: \u003C\u003Ccolour button-foreground>>;\\n\\tbackground: \u003C\u003Ccolour button-background>>;\\n\\tborder-color: \u003C\u003Ccolour button-border>>;\\n\\tcursor: pointer;\\n}\\n\\nbutton:disabled {\\n\\tcursor: default;\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\nbutton:disabled svg {\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n/*\\n** Basic element styles\\n*/\\n\\nhtml, body {\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\\n\\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\\n\\t-webkit-font-smoothing: antialiased;\\n\\t-moz-osx-font-smoothing: grayscale;\\n}\\n\\nhtml:-webkit-full-screen {\\n\\tbackground-color: \u003C\u003Ccolour page-background>>;\\n}\\n\\nbody.tc-body {\\n\\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\\n\\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\\n\\tword-wrap: break-word;\\n\\t\u003C\u003Ccustom-background-datauri>>\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour page-background>>;\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n}\\n\\n\u003C\u003Cif-background-attachment \\\"\\\"\\\"\\n\\nbody.tc-body {\\n\\tbackground-color: transparent;\\n}\\n\\n\\\"\\\"\\\">>\\n\\n/**\\n * Correct the font size and margin on `h1` elements within `section` and\\n * `article` contexts in Chrome, Firefox, and Safari.\\n */\\n\\nh1 {\\n\\tfont-size: 2em;\\n}\\n\\nh1, h2, h3, h4, h5, h6 {\\n\\tline-height: 1.2;\\n\\tfont-weight: normal;\\n}\\n\\npre {\\n\\tdisplay: block;\\n\\tmargin-top: 1em;\\n\\tmargin-bottom: 1em;\\n\\tword-break: normal;\\n\\tword-wrap: break-word;\\n\\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\\n\\tbackground-color: \u003C\u003Ccolour pre-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour pre-border>>;\\n\\tpadding: 0 3px 2px;\\n\\tborder-radius: 3px;\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\\n}\\n\\ncode {\\n\\tcolor: \u003C\u003Ccolour code-foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour code-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour code-border>>;\\n\\twhite-space: pre-wrap;\\n\\tpadding: 0 3px 2px;\\n\\tborder-radius: 3px;\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\\n}\\n\\nblockquote {\\n\\tborder-inline-start: 5px solid \u003C\u003Ccolour blockquote-bar>>;\\n\\t\u003C\u003Cmargin-start 25px>>\\n\\t\u003C\u003Cpadding-start 10px>>\\n\\tquotes: \\\"\\\\201C\\\"\\\"\\\\201D\\\"\\\"\\\\2018\\\"\\\"\\\\2019\\\";\\n}\\n\\nblockquote > div {\\n\\tmargin-top: 1em;\\n\\tmargin-bottom: 1em;\\n}\\n\\nblockquote.tc-big-quote {\\n\\tfont-family: Georgia, serif;\\n\\tposition: relative;\\n\\tbackground: \u003C\u003Ccolour pre-background>>;\\n\\tborder-inline-start: none;\\n\\t\u003C\u003Cmargin-inline 50px>>\\n\\tpadding: 10px;\\n\\tborder-radius: 8px;\\n}\\n\\nblockquote.tc-big-quote cite:before {\\n\\tcontent: \\\"\\\\2014 \\\\2009\\\";\\n}\\n\\nblockquote.tc-big-quote:before {\\n\\tfont-family: Georgia, serif;\\n\\tcolor: \u003C\u003Ccolour blockquote-bar>>;\\n\\tcontent: open-quote;\\n\\tfont-size: 8em;\\n\\tline-height: 0.1em;\\n\\tmargin-right: 0.25em;\\n\\tvertical-align: -0.4em;\\n\\tposition: absolute;\\n\\tleft: -50px;\\n\\ttop: 42px;\\n}\\n\\nblockquote.tc-big-quote:after {\\n\\tfont-family: Georgia, serif;\\n\\tcolor: \u003C\u003Ccolour blockquote-bar>>;\\n\\tcontent: close-quote;\\n\\tfont-size: 8em;\\n\\tline-height: 0.1em;\\n\\tmargin-right: 0.25em;\\n\\tvertical-align: -0.4em;\\n\\tposition: absolute;\\n\\tright: -80px;\\n\\tbottom: -20px;\\n}\\n\\ndl dt {\\n\\tfont-weight: bold;\\n\\tmargin-top: 6px;\\n}\\n\\ntextarea,\\ninput[type=text],\\ninput[type=search],\\ninput[type=number],\\ninput[type=password],\\ninput[type=email],\\ninput[type=tel],\\ninput[type=url],\\ninput[type=\\\"\\\"],\\ninput:not([type]) {\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n}\\n\\ninput[type=\\\"checkbox\\\"] {\\n\\tvertical-align: middle;\\n}\\n\\ninput[type=\\\"search\\\"]::-webkit-search-decoration,\\ninput[type=\\\"search\\\"]::-webkit-search-cancel-button,\\ninput[type=\\\"search\\\"]::-webkit-search-results-button,\\ninput[type=\\\"search\\\"]::-webkit-search-results-decoration {\\n\\t-webkit-appearance:none;\\n}\\n\\n.tc-muted {\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\nsvg.tc-image-button {\\n\\tpadding-top: 0px;\\n\\tpadding-bottom: 1px;\\n\\t\u003C\u003Cpadding-inline 0px 1px>>\\n}\\n\\n.tc-icon-wrapper > svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n}\\n\\nkbd {\\n\\tdisplay: inline-block;\\n\\tpadding: 3px 5px;\\n\\tfont-size: 0.8em;\\n\\tline-height: 1.2;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tvertical-align: middle;\\n\\tbackground-color: \u003C\u003Ccolour background>>;\\n\\tborder: solid 1px \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-bottom-color: \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-radius: 3px;\\n\\tbox-shadow: inset 0 -1px 0 \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n::selection {\\n\\tbackground-color: Highlight;\\n\\tcolor: HighlightText;\\n\\tbackground-color: \u003C\u003Ccolour selection-background>>;\\n\\tcolor: \u003C\u003Ccolour selection-foreground>>;\\n}\\n\\n.tc-inline-style {\\n\\tbackground: \u003C\u003Ccolour highlight-background>>;\\n\\tcolor: \u003C\u003Ccolour highlight-foreground>>;\\n}\\n\\n/* Markdown uses mark element to highlight */\\n\\nmark {\\n\\tbackground: \u003C\u003Ccolour highlight-background>>;\\n\\tcolor: \u003C\u003Ccolour highlight-foreground>>;\\n}\\n\\nform.tc-form-inline {\\n\\tdisplay: inline;\\n}\\n\\n/*\\nMarkdown likes putting code elements inside pre elements\\n*/\\npre > code {\\n\\tdisplay: block;\\n\\tpadding: 0.5em;\\n\\tborder: none;\\n\\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\\n\\tbackground-color: inherit;\\n\\tcolor: inherit;\\n\\toverflow-x: auto;\\n}\\n\\n/*\\nTable defaults\\n*/\\n\\ntable {\\n\\tborder: 1px solid \u003C\u003Ccolour table-border>>;\\n\\twidth: auto;\\n\\tmax-width: 100%;\\n\\tcaption-side: bottom;\\n\\tmargin-top: 1em;\\n\\tmargin-bottom: 1em;\\n\\t/* next 2 elements needed, since normalize 8.0.1 */\\n\\tborder-collapse: collapse;\\n\\tborder-spacing: 0;\\n}\\n\\ntable th, table td {\\n\\tpadding: 0 7px 0 7px;\\n\\tborder-top: 1px solid \u003C\u003Ccolour table-border>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour table-border>>;\\n}\\n\\ntable thead tr td, table th {\\n\\tbackground-color: \u003C\u003Ccolour table-header-background>>;\\n\\tfont-weight: bold;\\n}\\n\\ntable tfoot tr td {\\n\\tbackground-color: \u003C\u003Ccolour table-footer-background>>;\\n}\\n\\n/*\\nTable utility classes\\n*/\\n\\n/* Remove borders from table as used in eg: GettingStarted*/\\n.tc-table-no-border,\\n.tc-table-no-border th,\\n.tc-table-no-border td {\\n\\tborder: initial;\\n}\\n\\n/* First column in table width will fit to text.*/\\n/* This rule makes most sense with tc-first-link-nowrap*/\\n.tc-first-col-min-width td:nth-child(1) {\\n\\twidth: 1%;\\n}\\n\\n/*\\n** Utility classes work well with tables but also for other containers\\n*/\\n\\n/* First link A element will not wrap */\\n.tc-first-link-nowrap:first-of-type a {\\n\\twhite-space: nowrap;\\n}\\n\\n/* Move the table to the center of the container */\\n.tc-center {\\n\\tmargin-left: auto;\\n\\tmargin-right: auto;\\n}\\n\\n.tc-max-width {\\n\\twidth: 100%;\\n}\\n\\n.tc-max-width-80 {\\n\\tmax-width: 80%;\\n}\\n\\n/* Allow input and textarea to look like the ControlPanel inputs */\\n.tc-edit-max-width input,\\n.tc-edit-max-width textarea {\\n\\twidth: 100%;\\n\\tpadding: 3px;\\n}\\n\\n/*\\nCSV parser plugin\\n*/\\n\\n.tc-csv-table {\\n\\twhite-space: nowrap;\\n}\\n\\n.tc-csv-table th,\\n.tc-csv-table td {\\n\\twhite-space: pre-line;\\n}\\n\\n/*\\nTiddler frame in story river\\n*/\\n\\n.tc-tiddler-frame img,\\n.tc-tiddler-frame svg,\\n.tc-tiddler-frame canvas,\\n.tc-tiddler-frame embed,\\n.tc-tiddler-frame iframe {\\n\\tmax-width: 100%;\\n}\\n\\n.tc-tiddler-body > embed,\\n.tc-tiddler-body > iframe {\\n\\twidth: 100%;\\n\\theight: 600px;\\n}\\n\\n:root {\\n\\tcolor-scheme: {{{ [{$:/palette}get[color-scheme]] ~light }}};\\n\\ttext-autospace: normal;\\n}\\n\\n/*\\n** Links\\n*/\\n\\nbutton.tc-tiddlylink,\\na.tc-tiddlylink {\\n\\ttext-decoration: none;\\n\\tfont-weight: 500;\\n\\tcolor: \u003C\u003Ccolour tiddler-link-foreground>>;\\n\\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\\n\\t-webkit-touch-callout: none; /* Prevents long presses from bringing up a link preview */\\n}\\n\\n.tc-sidebar-lists a.tc-tiddlylink {\\n\\tcolor: \u003C\u003Ccolour sidebar-tiddler-link-foreground>>;\\n}\\n\\n.tc-sidebar-lists a.tc-tiddlylink:hover {\\n\\tcolor: \u003C\u003Ccolour sidebar-tiddler-link-foreground-hover>>;\\n}\\n\\nbutton.tc-tiddlylink:hover,\\na.tc-tiddlylink:hover {\\n\\ttext-decoration: underline;\\n}\\n\\na.tc-tiddlylink-resolves {\\n}\\n\\na.tc-tiddlylink-shadow {\\n\\tfont-weight: bold;\\n}\\n\\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\\n\\tfont-weight: normal;\\n}\\n\\na.tc-tiddlylink-missing {\\n\\tfont-style: italic;\\n}\\n\\na.tc-tiddlylink-external {\\n\\ttext-decoration: underline;\\n\\tcolor: \u003C\u003Ccolour external-link-foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour external-link-background>>;\\n}\\n\\na.tc-tiddlylink-external:visited {\\n\\tcolor: \u003C\u003Ccolour external-link-foreground-visited>>;\\n\\tbackground-color: \u003C\u003Ccolour external-link-background-visited>>;\\n}\\n\\na.tc-tiddlylink-external:hover {\\n\\tcolor: \u003C\u003Ccolour external-link-foreground-hover>>;\\n\\tbackground-color: \u003C\u003Ccolour external-link-background-hover>>;\\n}\\n\\n.tc-drop-down a.tc-tiddlylink:hover {\\n\\tcolor: \u003C\u003Ccolour tiddler-link-background>>;\\n}\\n\\n/*\\n** Drag and drop styles\\n*/\\n\\n.tc-tiddler-dragger {\\n\\tposition: relative;\\n\\tz-index: -10000;\\n}\\n\\n.tc-tiddler-dragger-inner {\\n\\tposition: absolute;\\n\\ttop: -1000px;\\n\\tleft: -1000px;\\n\\tdisplay: inline-block;\\n\\tpadding: 8px 20px;\\n\\tfont-size: 16.9px;\\n\\tfont-weight: bold;\\n\\tline-height: 20px;\\n\\tcolor: \u003C\u003Ccolour dragger-foreground>>;\\n\\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\\n\\twhite-space: nowrap;\\n\\tvertical-align: baseline;\\n\\tbackground-color: \u003C\u003Ccolour dragger-background>>;\\n\\tborder-radius: 20px;\\n}\\n\\n.tc-tiddler-dragger-cover {\\n\\tposition: absolute;\\n\\tbackground-color: \u003C\u003Ccolour page-background>>;\\n}\\n\\n.tc-page-container > .tc-dropzone {\\n\\tmin-height: 100vh;\\n}\\n\\n.tc-dropzone {\\n\\tposition: relative;\\n}\\n\\n.tc-dropzone.tc-dragover:before {\\n\\tz-index: 10000;\\n\\tdisplay: block;\\n\\tposition: fixed;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tbackground: \u003C\u003Ccolour dropzone-background>>;\\n\\ttext-align: center;\\n\\tcontent: \\\"\u003C\u003Clingo DropMessage>>\\\";\\n}\\n\\n.tc-droppable > .tc-droppable-placeholder {\\n\\tdisplay: none;\\n}\\n\\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\\n\\tdisplay: block;\\n\\tborder: 2px dashed \u003C\u003Ccolour dropzone-background>>;\\n}\\n\\n.tc-draggable {\\n\\tcursor: move;\\n}\\n\\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\\n.tc-links-draggable-list .tc-droppable-placeholder {\\n\\tline-height: 2em;\\n\\theight: 2em;\\n}\\n\\n.tc-sidebar-tab-open-item {\\n\\tposition: relative;\\n}\\n\\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\\n\\tfont-size: 0.7em;\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n/*\\n** Plugin reload warning\\n*/\\n\\n.tc-plugin-reload-warning {\\n\\tz-index: 1000;\\n\\tdisplay: block;\\n\\tposition: fixed;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tbackground: \u003C\u003Ccolour alert-background>>;\\n\\ttext-align: center;\\n}\\n\\n/*\\n** Buttons\\n*/\\n\\nbutton svg, button img, label svg, label img {\\n\\tvertical-align: middle;\\n}\\n\\n.tc-btn-invisible {\\n\\tpadding: 0;\\n\\tmargin: 0;\\n\\tbackground: none;\\n\\tborder: none;\\n\\tcursor: pointer;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n}\\n\\nbutton:disabled.tc-btn-invisible {\\n\\tcursor: default;\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-btn-boxed {\\n\\tfont-size: 0.6em;\\n\\tpadding: 0.2em;\\n\\tmargin: 1px;\\n\\tbackground: none;\\n\\tborder: 1px solid \u003C\u003Ccolour tiddler-controls-foreground>>;\\n\\tborder-radius: 0.25em;\\n}\\n\\nhtml body.tc-body .tc-btn-boxed svg {\\n\\tfont-size: 1.6666em;\\n}\\n\\n.tc-btn-boxed:hover {\\n\\tbackground: \u003C\u003Ccolour muted-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n}\\n\\nhtml body.tc-body .tc-btn-boxed:hover svg {\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-btn-rounded {\\n\\tfont-size: 0.5em;\\n\\tline-height: 2;\\n\\tpadding: 0em 0.3em 0.2em 0.4em;\\n\\tmargin: 1px;\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tbackground: \u003C\u003Ccolour muted-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tborder-radius: 2em;\\n}\\n\\nhtml body.tc-body .tc-btn-rounded svg {\\n\\tfont-size: 1.6666em;\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-btn-rounded:hover {\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\nhtml body.tc-body .tc-btn-rounded:hover svg {\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-btn-icon svg {\\n\\theight: 1em;\\n\\twidth: 1em;\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n\\n.tc-btn-text {\\n\\t\u003C\u003Cmargin-start 7px>>\\n}\\n\\n/* used for documentation \\\"fake\\\" buttons */\\n.tc-btn-standard {\\n\\tline-height: 1.8;\\n\\tcolor: #667;\\n\\tbackground-color: #e0e0e0;\\n\\tborder: 1px solid #888;\\n\\tpadding: 2px 1px 2px 1px;\\n\\tmargin: 1px 4px 1px 4px;\\n}\\n\\n.tc-btn-big-green {\\n\\tdisplay: inline-block;\\n\\tpadding: 8px;\\n\\tmargin: 4px 8px 4px 8px;\\n\\tbackground: \u003C\u003Ccolour download-background>>;\\n\\tcolor: \u003C\u003Ccolour download-foreground>>;\\n\\tfill: \u003C\u003Ccolour download-foreground>>;\\n\\tborder: none;\\n\\tborder-radius: 2px;\\n\\tfont-size: 1.2em;\\n\\tline-height: 1.4em;\\n\\ttext-decoration: none;\\n}\\n\\n.tc-btn-big-green svg,\\n.tc-btn-big-green img {\\n\\theight: 2em;\\n\\twidth: 2em;\\n\\tvertical-align: middle;\\n\\tfill: \u003C\u003Ccolour download-foreground>>;\\n}\\n\\n.tc-primary-btn {\\n\\tbackground: \u003C\u003Ccolour primary>>;\\n}\\n\\n.tc-sidebar-lists input {\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-sidebar-lists button {\\n\\tcolor: \u003C\u003Ccolour sidebar-button-foreground>>;\\n\\tfill: \u003C\u003Ccolour sidebar-button-foreground>>;\\n}\\n\\n.tc-sidebar-lists button.tc-btn-mini {\\n\\tcolor: \u003C\u003Ccolour sidebar-muted-foreground>>;\\n}\\n\\n.tc-sidebar-lists button.tc-btn-mini:hover {\\n\\tcolor: \u003C\u003Ccolour sidebar-muted-foreground-hover>>;\\n}\\n\\n.tc-sidebar-lists button small {\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n}\\n\\nbutton svg.tc-image-button, button .tc-image-button img {\\n\\theight: 1em;\\n\\twidth: 1em;\\n}\\n\\n.tc-unfold-banner {\\n\\tposition: absolute;\\n\\tpadding: 0;\\n\\tmargin: 0;\\n\\tbackground: none;\\n\\tborder: none;\\n\\twidth: 100%;\\n\\twidth: calc(100% + 2px);\\n\\t\u003C\u003Cmargin-start -43px>>\\n\\ttext-align: center;\\n\\tborder-top: 2px solid \u003C\u003Ccolour tiddler-info-background>>;\\n\\tmargin-top: 4px;\\n}\\n\\n.tc-unfold-banner:hover {\\n\\tbackground: \u003C\u003Ccolour tiddler-info-background>>;\\n\\tborder-top: 2px solid \u003C\u003Ccolour tiddler-info-border>>;\\n}\\n\\n.tc-unfold-banner svg, .tc-fold-banner svg {\\n\\theight: 0.75em;\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground>>;\\n}\\n\\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground-hover>>;\\n}\\n\\n.tc-fold-banner {\\n\\tposition: absolute;\\n\\tpadding: 0;\\n\\tmargin: 0;\\n\\tbackground: none;\\n\\tborder: none;\\n\\twidth: 23px;\\n\\ttext-align: center;\\n\\t\u003C\u003Cmargin-start -35px>>\\n\\ttop: 6px;\\n\\tbottom: 6px;\\n}\\n\\n.tc-fold-banner:hover {\\n\\tbackground: \u003C\u003Ccolour tiddler-info-background>>;\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t.tc-unfold-banner {\\n\\t\\tposition: static;\\n\\t\\twidth: calc(100% + 59px);\\n\\t}\\n\\n\\t.tc-fold-banner {\\n\\t\\twidth: 16px;\\n\\t\\t\u003C\u003Cmargin-start -16px>>\\n\\t\\tfont-size: 0.75em;\\n\\t}\\n\\n}\\n\\n/*\\n** Tags and missing tiddlers\\n*/\\n\\n.tc-tag-list-item {\\n\\tposition: relative;\\n\\tdisplay: inline-block;\\n}\\n\\n.tc-tags-wrapper {\\n\\tmargin: 4px 0 14px 0;\\n}\\n\\n.tc-tags-wrapper .tc-tag-list-item {\\n\\tmargin-right: 7px;\\n}\\n\\n.tc-missing-tiddler-label {\\n\\tfont-style: italic;\\n\\tfont-weight: normal;\\n\\tdisplay: inline-block;\\n\\tfont-size: 11.844px;\\n\\tline-height: 14px;\\n\\twhite-space: nowrap;\\n\\tvertical-align: baseline;\\n}\\n\\n.tc-block-tags-dropdown > .tc-btn-invisible:hover {\\n\\tbackground-color: \u003C\u003Ccolour primary>>;\\n}\\n\\nbutton.tc-tag-label, span.tc-tag-label {\\n\\tdisplay: inline-block;\\n\\tpadding: 0.16em 0.7em;\\n\\tfont-size: 0.9em;\\n\\tfont-weight: normal;\\n\\tline-height: 1.2em;\\n\\tcolor: \u003C\u003Ccolour tag-foreground>>;\\n\\twhite-space: break-spaces;\\n\\tvertical-align: baseline;\\n\\tbackground-color: \u003C\u003Ccolour tag-background>>;\\n\\tborder-radius: 1em;\\n}\\n\\n.tc-sidebar-scrollable .tc-tag-label {\\n\\ttext-shadow: none;\\n}\\n\\n.tc-untagged-separator {\\n\\tborder: 0;\\n\\theight: 1px;\\n\\tbackground: \u003C\u003Ccolour tab-divider>>;\\n}\\n\\nbutton.tc-untagged-label {\\n\\tbackground-color: \u003C\u003Ccolour untagged-background>>;\\n}\\n\\n.tc-tag-label svg, .tc-tag-label img {\\n\\theight: 1em;\\n\\twidth: 1em;\\n\\tmargin-right: 3px;\\n\\tmargin-bottom: 1px;\\n\\tvertical-align: bottom;\\n}\\n\\n.tc-edit-tags button.tc-remove-tag-button svg {\\n\\tfont-size: 0.7em;\\n\\tvertical-align: middle;\\n}\\n\\n.tc-tag-manager-table .tc-tag-label {\\n}\\n\\n.tc-tag-manager-tag {\\n\\twidth: 100%;\\n}\\n\\nbutton.tc-btn-invisible.tc-remove-tag-button {\\n\\toutline: none;\\n}\\n\\n.tc-tag-button-selected,\\n.tc-list-item-selected a.tc-tiddlylink, a.tc-list-item-selected {\\n\\tbackground-color: \u003C\u003Ccolour primary>>;\\n\\tcolor: \u003C\u003Ccolour tiddler-background>>;\\n}\\n\\n/*\\n** Page layout\\n*/\\n\\n.tc-topbar {\\n\\tposition: fixed;\\n\\tz-index: 1200;\\n}\\n\\n.tc-topbar-left {\\n\\tleft: 29px;\\n\\ttop: 5px;\\n}\\n\\n.tc-topbar-right {\\n\\ttop: 5px;\\n\\tright: 29px;\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t.tc-topbar-right {\\n\\t\\tright: 10px;\\n\\t}\\n\\n}\\n\\n.tc-topbar button {\\n\\tpadding: 8px;\\n}\\n\\n.tc-topbar svg {\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-topbar button:hover svg {\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t.tc-show-sidebar-btn svg.tc-image-chevron-left, .tc-hide-sidebar-btn svg.tc-image-chevron-right {\\n\\t\\ttransform: rotate(-90deg);\\n\\t}\\n\\n}\\n\\n.tc-sidebar-header {\\n\\tcolor: \u003C\u003Ccolour sidebar-foreground>>;\\n\\tfill: \u003C\u003Ccolour sidebar-foreground>>;\\n}\\n\\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\\n\\tfont-weight: normal;\\n}\\n\\n.tc-sidebar-header .tc-sidebar-lists p,\\n.tc-sidebar-tools-item {\\n\\tmargin-top: 3px;\\n\\tmargin-bottom: 3px;\\n}\\n\\n.tc-sidebar-header .tc-missing-tiddler-label {\\n\\tcolor: \u003C\u003Ccolour sidebar-foreground>>;\\n}\\n\\n.tc-advanced-search input {\\n\\twidth: 60%;\\n}\\n\\n.tc-search a svg {\\n\\twidth: 1.2em;\\n\\theight: 1.2em;\\n\\tvertical-align: middle;\\n}\\n\\n.tc-page-controls {\\n\\tmargin-top: 14px;\\n\\tmargin-bottom: 14px;\\n\\tfont-size: 1.5em;\\n}\\n\\n.tc-page-controls .tc-drop-down {\\n\\tfont-size: 1rem;\\n}\\n\\n.tc-page-controls button {\\n\\tmargin-right: 0.5em;\\n}\\n\\n.tc-page-controls a.tc-tiddlylink:hover {\\n\\ttext-decoration: none;\\n}\\n\\n.tc-page-controls img {\\n\\twidth: 1em;\\n}\\n\\n.tc-page-controls svg {\\n\\tfill: \u003C\u003Ccolour sidebar-controls-foreground>>;\\n}\\n\\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {\\n\\tfill: \u003C\u003Ccolour sidebar-controls-foreground-hover>>;\\n}\\n\\n.tc-sidebar-lists .tc-menu-list-item {\\n\\twhite-space: nowrap;\\n}\\n\\n.tc-menu-list-count {\\n\\tfont-weight: bold;\\n}\\n\\n.tc-menu-list-subitem {\\n\\tpadding-left: 7px;\\n}\\n\\n.tc-story-river {\\n\\tposition: relative;\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t.tc-sidebar-header {\\n\\t\\tpadding: 14px;\\n\\t\\tmin-height: 32px;\\n\\t\\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\\n\\t\\ttransition: min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out;\\n\\t}\\n\\n\\t\u003C\u003Cif-no-sidebar \\\"\\\"\\\"\\n\\n\\t\\t.tc-sidebar-header {\\n\\t\\t\\tmin-height: 0;\\n\\t\\t\\tpadding-top: 0;\\n\\t\\t\\tpadding-bottom: 0;\\n\\t\\t}\\n\\n\\t\\\"\\\"\\\">>\\n\\n\\t.tc-story-river {\\n\\t\\tposition: relative;\\n\\t\\tpadding: 0;\\n\\t}\\n}\\n\\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\n\\t.tc-message-box {\\n\\t\\tmargin: 21px -21px 21px -21px;\\n\\t}\\n\\n\\t.tc-sidebar-scrollable {\\n\\t\\tposition: fixed;\\n\\t\\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\\n\\t\\tinset-inline-start: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\\n\\t\\tbottom: 0;\\n\\t\\tinset-inline-end: 0;\\n\\t\\toverflow-y: auto;\\n\\t\\toverflow-x: auto;\\n\\t\\t-webkit-overflow-scrolling: touch;\\n\\t\\tmargin: 0 0 0 -42px;\\n\\t\\tpadding: 71px 0 28px 42px;\\n\\t}\\n\\n\\t@supports not (inset-inline-start: 0) {\\n\\t\\t.tc-sidebar-scrollable {\\n\\t\\t\\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\\n\\t\\t\\tright: 0;\\n\\t\\t}\\n\\n\\t\\thtml[dir=\\\"rtl\\\"] .tc-sidebar-scrollable {\\n\\t\\t\\tleft: auto;\\n\\t\\t\\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\\n\\t\\t}\\n\\t}\\n\\n\\t.tc-story-river {\\n\\t\\tposition: relative;\\n\\t\\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\\n\\t\\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\\n\\t\\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\\n\\t\\tpadding: 42px 42px 42px 42px;\\n\\t}\\n\\n\u003C\u003Cif-no-sidebar \\\"\\n\\n\\t.tc-story-river {\\n\\t\\twidth: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\\n\\t}\\n\\n\\\">>\\n\\n\\t.tc-story-river.tc-static-story-river {\\n\\t\\tmargin-right: 0;\\n\\t\\tpadding-right: 42px;\\n\\t}\\n\\n}\\n\\n@media print {\\n\\n\\tbody.tc-body {\\n\\t\\tbackground-color: transparent;\\n\\t}\\n\\n\\t.tc-sidebar-header, .tc-topbar {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n\\t.tc-story-river {\\n\\t\\tmargin: 0;\\n\\t\\tpadding: 0;\\n\\t}\\n\\n\\t.tc-story-river .tc-tiddler-frame {\\n\\t\\tmargin: 0;\\n\\t\\tborder: none;\\n\\t\\tpadding: 0;\\n\\t}\\n}\\n\\n/*\\n** Tiddler styles\\n*/\\n\\n.tc-tiddler-frame {\\n\\tposition: relative;\\n\\tmargin-bottom: 28px;\\n\\tbackground-color: \u003C\u003Ccolour tiddler-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour tiddler-border>>;\\n}\\n\\n{{$:/themes/tiddlywiki/vanilla/sticky}}\\n\\n.tc-tiddler-info {\\n\\tpadding: 14px 42px 14px 42px;\\n\\tbackground-color: \u003C\u003Ccolour tiddler-info-background>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour tiddler-info-border>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tiddler-info-border>>;\\n}\\n\\n.tc-tiddler-info p {\\n\\tmargin-top: 3px;\\n\\tmargin-bottom: 3px;\\n}\\n\\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\\n\\tbackground-color: \u003C\u003Ccolour tiddler-info-tab-background>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tiddler-info-tab-background>>;\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t.tc-tiddler-info {\\n\\t\\tpadding: 14px 14px 14px 14px;\\n\\t}\\n\\n}\\n\\n.tc-tiddler-info-controls {\\n\\tposition: absolute;\\n\\tinset-inline-end: 0;\\n}\\n\\n.tc-view-field-table {\\n\\twidth: 100%;\\n}\\n\\n.tc-view-field-name {\\n\\twidth: 1%; /* Makes this column be as narrow as possible */\\n\\tvertical-align: top;\\n\\ttext-align: right;\\n\\tfont-style: italic;\\n\\tfont-weight: normal;\\n}\\n\\n.tc-view-field-value {\\n\\tword-break: break-all;\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\t.tc-tiddler-frame {\\n\\t\\tpadding: 14px 14px 14px 14px;\\n\\t\\tmargin-bottom: .5em;\\n\\t}\\n\\n\\t.tc-tiddler-info {\\n\\t\\tmargin: 0 -14px 0 -14px;\\n\\t}\\n}\\n\\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\t.tc-tiddler-frame {\\n\\t\\tpadding: 28px 42px 42px 42px;\\n\\t\\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\\n\\t\\tborder-radius: 2px;\\n\\t}\\n\\n\u003C\u003Cif-no-sidebar \\\"\\n\\n\\t.tc-tiddler-frame {\\n\\t\\twidth: 100%;\\n\\t}\\n\\n\\\">>\\n\\n\\t.tc-tiddler-info {\\n\\t\\tmargin: 0 -42px 0 -42px;\\n\\t}\\n}\\n\\n.tc-site-title,\\n.tc-titlebar {\\n\\tfont-weight: normal;\\n\\tfont-size: 2.35em;\\n\\tline-height: 1.35em;\\n\\tcolor: \u003C\u003Ccolour tiddler-title-foreground>>;\\n\\tmargin: 0;\\n}\\n\\n.tc-site-title {\\n\\tcolor: \u003C\u003Ccolour site-title-foreground>>;\\n}\\n\\n.tc-tiddler-title-icon {\\n\\tvertical-align: middle;\\n\\t\u003C\u003Cmargin-end \\\".1em\\\">>\\n}\\n\\n.tc-tiddler-title-icon svg {\\n\\twidth: 0.9em;\\n\\theight: 0.9em;\\n}\\n\\n.tc-system-title-prefix {\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-tiddler-lazy-loading {\\n\\theight: 4px;\\n\\twidth: 100%;\\n\\tbackground: no-repeat linear-gradient(\u003C\u003Ccolour background>> 0 0),no-repeat linear-gradient(\u003C\u003Ccolour background>> 0 0),\u003C\u003Ccolour primary>>;\\n\\tbackground-size: 60% 100%;\\n\\tanimation: animation-loading-progress 3s infinite;\\n}\\n\\n@keyframes animation-loading-progress {\\n\\t0% {background-position:-150% 0,-150% 0}\\n\\t66% {background-position: 250% 0,-150% 0}\\n\\t100% {background-position: 250% 0, 250% 0}\\n}\\n\\n.tc-titlebar h2 {\\n\\tfont-size: 1em;\\n\\tdisplay: inline;\\n}\\n\\n.tc-titlebar img {\\n\\theight: 1em;\\n}\\n\\n.tc-subtitle {\\n\\tfont-size: 0.9em;\\n\\tcolor: \u003C\u003Ccolour tiddler-subtitle-foreground>>;\\n\\tfont-weight: normal;\\n}\\n\\n.tc-subtitle .tc-tiddlylink {\\n\\tmargin-right: .3em;\\n}\\n\\n.tc-tiddler-missing .tc-title {\\n\\tfont-style: italic;\\n\\tfont-weight: normal;\\n}\\n\\n.tc-tiddler-frame .tc-tiddler-controls {\\n\\tfloat: inline-end;\\n\\tpadding: 3px; /* make space for outline */\\n}\\n\\n.tc-tiddler-controls .tc-drop-down {\\n\\tfont-size: 0.6em;\\n}\\n\\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\\n\\tfont-size: 1em;\\n}\\n\\n.tc-tiddler-controls > span > button,\\n.tc-tiddler-controls > span > span > button,\\n.tc-tiddler-controls > span > span > span > button {\\n\\tvertical-align: baseline;\\n\\tmargin-left:5px;\\n}\\n\\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img,\\n.tc-search button svg, .tc-search a svg {\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground>>;\\n}\\n\\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\\n\\theight: 0.75em;\\n}\\n\\n.tc-search button svg, .tc-search a svg {\\n\\theight: 1.2em;\\n\\twidth: 1.2em;\\n\\tmargin: 0 0.25em;\\n}\\n\\n.tc-tiddler-controls button.tc-selected svg,\\n.tc-page-controls button.tc-selected svg {\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground-selected>>;\\n}\\n\\n.tc-tiddler-controls button.tc-btn-invisible:hover svg,\\n.tc-search button:hover svg, .tc-search a:hover svg {\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground-hover>>;\\n}\\n\\n@media print {\\n\\t.tc-tiddler-controls {\\n\\t\\tdisplay: none;\\n\\t}\\n}\\n\\n.tc-tiddler-help { /* Help prompts within tiddler template */\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n\\tmargin-top: 14px;\\n}\\n\\n.tc-tiddler-help a.tc-tiddlylink {\\n\\tcolor: \u003C\u003Ccolour very-muted-foreground>>;\\n}\\n\\n.tc-tiddler-frame .tc-edit-texteditor {\\n\\twidth: 100%;\\n\\tmargin: 4px 0 4px 0;\\n}\\n\\n.tc-tiddler-frame input.tc-edit-texteditor,\\n.tc-tiddler-frame textarea.tc-edit-texteditor,\\n.tc-tiddler-frame iframe.tc-edit-texteditor,\\n.tc-tiddler-frame select.tc-edit-texteditor {\\n\\tpadding: 3px 3px 3px 3px;\\n\\tborder: 1px solid \u003C\u003Ccolour tiddler-editor-border>>;\\n\\tline-height: 1.3em;\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\\n}\\n\\n.tc-tiddler-frame input.tc-edit-texteditor,\\n.tc-tiddler-frame textarea.tc-edit-texteditor,\\n.tc-tiddler-frame iframe.tc-edit-texteditor {\\n\\t-webkit-appearance: none;\\n}\\n\\n.tc-tiddler-frame input.tc-edit-texteditor,\\n.tc-tiddler-frame select.tc-edit-texteditor,\\n.tc-tiddler-frame textarea.tc-edit-texteditor {\\n\\tbackground-color: \u003C\u003Ccolour tiddler-editor-background>>;\\n}\\n\\n.tc-tiddler-frame iframe.tc-edit-texteditor {\\n\\tbackground-color: \u003C\u003Ccolour tiddler-background>>;\\n}\\n\\n.tc-tiddler-frame .tc-edit-fields input.tc-edit-fieldeditor,\\n.tc-tiddler-frame .tc-edit-fields select.tc-edit-fieldeditor,\\n.tc-tiddler-frame .tc-edit-fields textarea.tc-edit-fieldeditor {\\n\\tmargin: 0;\\n\\tpadding: 2px 3px;\\n}\\n\\n.tc-tiddler-frame .tc-binary-warning {\\n\\twidth: 100%;\\n\\theight: 5em;\\n\\ttext-align: center;\\n\\tpadding: 3em 3em 6em 3em;\\n\\tbackground: \u003C\u003Ccolour alert-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour alert-border>>;\\n}\\n\\ncanvas.tc-edit-bitmapeditor {\\n\\tborder: 6px solid \u003C\u003Ccolour tiddler-editor-border-image>>;\\n\\tcursor: crosshair;\\n\\t-moz-user-select: none;\\n\\t-webkit-user-select: none;\\n\\t-ms-user-select: none;\\n\\tmargin-top: 6px;\\n\\tmargin-bottom: 6px;\\n}\\n\\n.tc-edit-bitmapeditor-width {\\n\\tdisplay: block;\\n}\\n\\n.tc-edit-bitmapeditor-height {\\n\\tdisplay: block;\\n}\\n\\n.tc-single-tiddler-window .tc-tiddler-body,\\n.tc-tiddler-frame .tc-tiddler-body {\\n\\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\\n\\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\\n}\\n\\n.tc-titlebar, .tc-tiddler-edit-title {\\n\\toverflow: hidden; /* https://github.com/TiddlyWiki/TiddlyWiki5/issues/282 */\\n}\\n\\n/*\\n* Tiddler in a new window.\\n* Also see: .tc-single-tiddler-window .tc-tiddler-body, above\\n*/\\n\\nhtml body.tc-body.tc-single-tiddler-window {\\n\\tmargin: 1em;\\n\\tbackground: \u003C\u003Ccolour tiddler-background>>;\\n}\\n\\n.tc-single-tiddler-window img,\\n.tc-single-tiddler-window svg,\\n.tc-single-tiddler-window canvas,\\n.tc-single-tiddler-window embed,\\n.tc-single-tiddler-window iframe {\\n\\tmax-width: 100%;\\n}\\n\\n/*\\n** Editor\\n*/\\n\\n.tc-editor-toolbar {\\n\\tmargin-top: 8px;\\n}\\n\\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview .tc-editor-toolbar,\\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview-hidden .tc-editor-toolbar {\\n\\tgrid-area: toolbar;\\n}\\n\\n.tc-editor-toolbar button {\\n\\tvertical-align: middle;\\n\\tbackground-color: \u003C\u003Ccolour tiddler-controls-foreground>>;\\n\\tcolor: \u003C\u003Ccolour tiddler-controls-foreground-selected>>;\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground-selected>>;\\n\\tborder-radius: 4px;\\n\\tpadding: 3px;\\n\\tmargin: 2px 0 2px 4px;\\n}\\n\\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\\n\\tmargin-left: 1px;\\n\\twidth: 1em;\\n\\tborder-radius: 8px;\\n}\\n\\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\\n\\tmargin-left: 11px;\\n}\\n\\n.tc-editor-toolbar button.tc-selected {\\n\\tbackground-color: \u003C\u003Ccolour primary>>;\\n}\\n\\n.tc-editor-toolbar button svg {\\n\\twidth: 1.6em;\\n\\theight: 1.2em;\\n}\\n\\n.tc-editor-toolbar .tc-drop-down button.tc-btn-mini {\\n\\tpadding: 2px 4px;\\n}\\n\\n.tc-editor-toolbar button:hover {\\n\\tbackground-color: \u003C\u003Ccolour tiddler-controls-foreground-selected>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\\n\\twhite-space: normal;\\n}\\n\\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\\n\\tdisplay: inline-block;\\n\\tpadding: 3px;\\n\\twidth: auto;\\n}\\n\\n.tc-editor-toolbar .tc-search-results {\\n\\tpadding: 0;\\n}\\n\\n.tc-editor-toolbar button.tc-editortoolbar-stamp-button + .tc-popup .tc-drop-down > p {\\n\\tmargin: 0;\\n\\tpadding: 0;\\n}\\n\\n.tc-editor-toolbar button.tc-editortoolbar-stamp-button + .tc-popup .tc-drop-down a.tc-tiddlylink {\\n\\tfont-weight: normal;\\n}\\n\\n/*\\n** Adjustments for fluid-fixed mode\\n*/\\n\\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\n\u003C\u003Cif-fluid-fixed text:\\\"\\\"\\\"\\n\\n\\t.tc-story-river {\\n\\t\\tpadding-right: 0;\\n\\t\\tposition: relative;\\n\\t\\twidth: auto;\\n\\t\\tleft: 0;\\n\\t\\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\\n\\t\\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\\n\\t}\\n\\n\\t.tc-tiddler-frame {\\n\\t\\twidth: 100%;\\n\\t}\\n\\n\\t.tc-sidebar-scrollable {\\n\\t\\tleft: auto;\\n\\t\\tbottom: 0;\\n\\t\\tright: 0;\\n\\t\\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\\n\\t}\\n\\n\\tbody.tc-body .tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\\n\\t\\twidth: 100%;\\n\\t\\twidth: calc(100% - 42px);\\n\\t}\\n\\n\\\"\\\"\\\" hiddenSidebarText:\\\"\\\"\\\"\\n\\n\\t.tc-story-river {\\n\\t\\tpadding-right: 3em;\\n\\t\\tmargin-right: 0;\\n\\t}\\n\\n\\tbody.tc-body .tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\\n\\t\\twidth: 100%;\\n\\t\\twidth: calc(100% - 84px);\\n\\t}\\n\\n\\\"\\\"\\\">>\\n\\n}\\n\\n/*\\n** Toolbar buttons\\n*/\\n\\n.tc-page-controls svg.tc-image-new-button {\\n\\tfill: \u003C\u003Ccolour toolbar-new-button>>;\\n}\\n\\n.tc-page-controls svg.tc-image-options-button {\\n\\tfill: \u003C\u003Ccolour toolbar-options-button>>;\\n}\\n\\n.tc-page-controls svg.tc-image-save-button {\\n\\tfill: \u003C\u003Ccolour toolbar-save-button>>;\\n}\\n\\n.tc-tiddler-controls button svg.tc-image-info-button {\\n\\tfill: \u003C\u003Ccolour toolbar-info-button>>;\\n}\\n\\n.tc-tiddler-controls button svg.tc-image-edit-button {\\n\\tfill: \u003C\u003Ccolour toolbar-edit-button>>;\\n}\\n\\n.tc-tiddler-controls button svg.tc-image-close-button {\\n\\tfill: \u003C\u003Ccolour toolbar-close-button>>;\\n}\\n\\n.tc-tiddler-controls button svg.tc-image-delete-button {\\n\\tfill: \u003C\u003Ccolour toolbar-delete-button>>;\\n}\\n\\n.tc-tiddler-controls button svg.tc-image-cancel-button {\\n\\tfill: \u003C\u003Ccolour toolbar-cancel-button>>;\\n}\\n\\n.tc-tiddler-controls button svg.tc-image-done-button {\\n\\tfill: \u003C\u003Ccolour toolbar-done-button>>;\\n}\\n\\n.tc-page-controls svg.tc-image-layout-button {\\n\\tfill: \u003C\u003Ccolour toolbar-options-button>>;\\n}\\n\\n/*\\n** Tiddler edit mode\\n*/\\n\\n.tc-tiddler-edit-frame em.tc-edit {\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n\\tfont-style: normal;\\n}\\n\\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\\n\\tfont-style: normal;\\n}\\n\\n.tc-type-selector .tc-edit-typeeditor {\\n\\twidth: auto;\\n}\\n\\n.tc-type-selector-dropdown-wrapper {\\n\\tdisplay: inline-block;\\n}\\n\\n\u003C\u003Cset-type-selector-min-width>>\\n\\n.tc-edit-tags {\\n\\tborder: 1px solid \u003C\u003Ccolour tiddler-editor-border>>;\\n\\tpadding: 4px 8px 4px 8px;\\n}\\n\\n.tc-edit-add-tag {\\n\\tdisplay: inline-block;\\n}\\n\\n.tc-edit-add-tag .tc-add-tag-name input {\\n\\twidth: 50%;\\n}\\n\\n.tc-edit-add-tag .tc-keyboard {\\n\\tdisplay:inline;\\n}\\n\\n.tc-edit-tags .tc-tag-label {\\n\\tdisplay: inline-block;\\n}\\n\\n.tc-edit-tags-list {\\n\\tmargin: 14px 0 14px 0;\\n}\\n\\n.tc-remove-tag-button {\\n\\tpadding-left: 4px;\\n}\\n\\n.tc-tiddler-editor {\\n\\tdisplay: grid;\\n}\\n\\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview {\\n\\tgrid-template-areas:\\n\\t\\t\\\"toolbar toolbar\\\"\\n\\t\\t\\\"editor preview\\\";\\n\\tgrid-template-columns: repeat(2, minmax(0px, 1fr));\\n\\tgrid-template-rows: auto 1fr;\\n}\\n\\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview-hidden {\\n\\tgrid-template-areas:\\n\\t\\t\\\"toolbar\\\"\\n\\t\\t\\\"editor\\\";\\n\\tgrid-template-columns: 1fr;\\n\\tgrid-template-rows: auto 1fr;\\n}\\n\\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview .tc-tiddler-preview-preview {\\n\\tgrid-area: preview;\\n\\toverflow-wrap: anywhere;\\n\\tword-break: normal;\\n\\tborder: 1px solid \u003C\u003Ccolour tiddler-editor-border>>;\\n\\tmargin: 4px 0 3px 3px;\\n\\tpadding: 3px 3px 3px 3px;\\n}\\n\\n\u003C\u003Cif-editor-height-fixed then:\\\"\\\"\\\"\\n\\n.tc-tiddler-preview-preview {\\n\\toverflow-y: scroll;\\n\\theight: {{$:/config/TextEditor/EditorHeight/Height}};\\n}\\n\\n\\\"\\\"\\\">>\\n\\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview .tc-edit-texteditor,\\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview-hidden .tc-edit-texteditor {\\n\\tgrid-area: editor;\\n}\\n\\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview canvas.tc-edit-bitmapeditor,\\n.tc-tiddler-frame .tc-tiddler-editor.tc-tiddler-preview-hidden canvas.tc-edit-bitmapeditor {\\n\\tgrid-area: editor;\\n\\tmax-width: 100%;\\n}\\n\\n.tc-edit-fields {\\n\\twidth: 100%;\\n}\\n\\n.tc-edit-fields.tc-edit-fields-small {\\n\\tmargin-top: 0;\\n\\tmargin-bottom: 0;\\n}\\n\\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\\n\\tborder: none;\\n\\tpadding: 4px;\\n}\\n\\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\\n\\tbackground-color: \u003C\u003Ccolour tiddler-editor-fields-odd>>;\\n}\\n\\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\\n\\tbackground-color: \u003C\u003Ccolour tiddler-editor-fields-even>>;\\n}\\n\\n.tc-edit-field-name {\\n\\ttext-align: right;\\n}\\n\\n.tc-edit-field-value input {\\n\\twidth: 100%;\\n}\\n\\n.tc-edit-field-remove {\\n}\\n\\n.tc-edit-field-remove svg {\\n\\theight: 1em;\\n\\twidth: 1em;\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n\\tvertical-align: middle;\\n}\\n\\n.tc-edit-field-add-name-wrapper input.tc-edit-texteditor {\\n\\twidth: auto;\\n}\\n\\n.tc-edit-field-add-name-wrapper {\\n\\tdisplay: inline-block;\\n}\\n\\n.tc-edit-field-add-value {\\n\\tdisplay: inline-block;\\n}\\n\\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\n\\t.tc-edit-field-add-value {\\n\\t\\twidth: 35%;\\n\\t}\\n\\n}\\n\\n.tc-edit-field-add-button {\\n\\tdisplay: inline-block;\\n\\twidth: 10%;\\n}\\n\\n\\n/*\\n** Tiddler editor dropzone\\n*/\\n\\n.tc-dropzone-editor {\\n\\tposition:relative;\\n}\\n\\n.tc-dropzone-editor.tc-dragover .tc-editor-toolbar::after{\\n\\tz-index: 10000;\\n\\ttop:0;\\n\\tleft:0;\\n\\tright:0;\\n\\theight: 100%;\\n\\tbackground: \u003C\u003Ccolour dropzone-background>>;\\n\\tcontent: \\\"\u003C\u003Clingo DropMessage>>\\\";\\n\\tpointer-events: none;\\n\\tposition: absolute;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\tbackground-color: \u003C\u003Ccolor background>>;\\n\\tborder: 4px dashed \u003C\u003Ccolor modal-border>>;\\n\\tfont-weight: bold;\\n\\tfont-size: 150%;\\n\\topacity: 0.8;\\n\\tcolor: \u003C\u003Ccolor foreground>>;\\n}\\n\\n.tc-editor-importpopup {\\n\\twidth: 100%;\\n\\theight: 100%;\\n}\\n\\n.tc-editor-import {\\n\\tposition: absolute;\\n\\ttop: 50%;\\n\\tleft: 50%;\\n\\ttransform: translate(-50%, -50%);\\n\\tbackground: \u003C\u003Ccolor pre-background>>;\\n\\tbox-shadow: 2px 2px 10px \u003C\u003Ccolour foreground>>;\\n\\tpadding: 10px;\\n\\twidth: 96%;\\n\\tborder: 1px solid \u003C\u003Ccolor tiddler-controls-foreground>>;\\n\\ttext-align:center;\\n}\\n\\n.tc-editor-import img {\\n\\tmax-height: 500px;\\n}\\n\\n/*\\n** Storyview Classes\\n*/\\n\\n.tc-viewswitcher .tc-image-button {\\n\\t\u003C\u003Cmargin-end \\\".3em\\\">>\\n}\\n\\n.tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\\n\\tposition: absolute;\\n\\tdisplay: block;\\n\\twidth: 100%;\\n}\\n\\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\n\\t.tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\\n\\t\\twidth: calc(100% - 84px);\\n\\t}\\n\\n}\\n\\n/*\\n** Dropdowns\\n*/\\n\\n.tc-btn-dropdown {\\n\\ttext-align: left;\\n}\\n\\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\\n\\theight: 1em;\\n\\twidth: 1em;\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-drop-down-wrapper {\\n\\tposition: relative;\\n}\\n\\n.tc-drop-down {\\n\\tmin-width: 380px;\\n\\tborder: 1px solid \u003C\u003Ccolour dropdown-border>>;\\n\\tbackground-color: \u003C\u003Ccolour dropdown-background>>;\\n\\tpadding: 7px 0 7px 0;\\n\\tmargin: 4px 0 0 0;\\n\\twhite-space: nowrap;\\n\\ttext-shadow: none;\\n\\tline-height: 1.4;\\n}\\n\\n.tc-drop-down .tc-drop-down {\\n\\tmargin-left: 14px;\\n}\\n\\n.tc-drop-down button svg, .tc-drop-down a svg {\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-drop-down button:disabled svg {\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-drop-down button.tc-btn-invisible:hover svg {\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-drop-down .tc-drop-down-info {\\n\\tpadding-left: 14px;\\n}\\n\\n.tc-drop-down p {\\n\\tpadding: 0 14px 0 14px;\\n}\\n\\n.tc-drop-down svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n}\\n\\n.tc-drop-down img {\\n\\twidth: 1em;\\n}\\n\\n.tc-drop-down a, .tc-drop-down button {\\n\\tdisplay: block;\\n\\tpadding: 0 14px 0 14px;\\n\\twidth: 100%;\\n\\ttext-align: start;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tline-height: 1.4;\\n}\\n\\n.tc-drop-down .tc-tab-set .tc-tab-buttons button {\\n\\tdisplay: inline-block;\\n\\twidth: auto;\\n\\tmargin-bottom: 0px;\\n\\tborder-bottom-left-radius: 0;\\n\\tborder-bottom-right-radius: 0;\\n}\\n\\n.tc-drop-down .tc-prompt {\\n\\tpadding: 0 14px;\\n}\\n\\n.tc-drop-down .tc-chooser {\\n\\tborder: none;\\n}\\n\\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\\n\\tfont-size: 0.4em;\\n\\tpadding-left: 1.2em;\\n}\\n\\n.tc-drop-down .tc-file-input-wrapper {\\n\\twidth: 100%;\\n}\\n\\n.tc-drop-down .tc-file-input-wrapper button {\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\\n\\tcolor: \u003C\u003Ccolour tiddler-link-background>>;\\n\\tbackground-color: \u003C\u003Ccolour tiddler-link-foreground>>;\\n\\ttext-decoration: none;\\n}\\n\\n.tc-drop-down .tc-tab-buttons button {\\n\\tbackground-color: \u003C\u003Ccolour dropdown-tab-background>>;\\n}\\n\\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\\n\\tbackground-color: \u003C\u003Ccolour dropdown-tab-background-selected>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour dropdown-tab-background-selected>>;\\n}\\n\\n.tc-drop-down-bullet {\\n\\tdisplay: inline-block;\\n\\twidth: 0.5em;\\n}\\n\\n.tc-drop-down .tc-tab-contents a {\\n\\tpadding: 0 0.5em 0 0.5em;\\n}\\n\\n.tc-block-dropdown-wrapper {\\n\\tposition: relative;\\n}\\n\\n.tc-block-dropdown {\\n\\tposition: absolute;\\n\\tmin-width: 220px;\\n\\tborder: 1px solid \u003C\u003Ccolour dropdown-border>>;\\n\\tbackground-color: \u003C\u003Ccolour dropdown-background>>;\\n\\tpadding: 7px 0;\\n\\tmargin: 4px 0 0 0;\\n\\twhite-space: nowrap;\\n\\tz-index: 1000;\\n\\ttext-shadow: none;\\n}\\n\\n.tc-block-dropdown.tc-search-drop-down {\\n\\tmargin-left: -12px;\\n}\\n\\n.tc-block-dropdown a {\\n\\tdisplay: block;\\n\\tpadding: 4px 14px 4px 14px;\\n}\\n\\n.tc-block-dropdown.tc-search-drop-down a {\\n\\tdisplay: block;\\n\\tpadding: 0px 10px 0px 10px;\\n}\\n\\n.tc-drop-down .tc-dropdown-item-plain,\\n.tc-block-dropdown .tc-dropdown-item-plain {\\n\\tpadding: 4px 14px 4px 7px;\\n}\\n\\n.tc-drop-down .tc-dropdown-item,\\n.tc-block-dropdown .tc-dropdown-item {\\n\\tpadding: 4px 14px 4px 7px;\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-block-dropdown a.tc-tiddlylink:hover {\\n\\tcolor: \u003C\u003Ccolour tiddler-link-background>>;\\n\\tbackground-color: \u003C\u003Ccolour tiddler-link-foreground>>;\\n\\ttext-decoration: none;\\n}\\n\\n.tc-search-results {\\n\\tpadding: 0 7px 0 7px;\\n}\\n\\n.tc-image-chooser, .tc-colour-chooser {\\n\\twhite-space: normal;\\n}\\n\\n.tc-image-chooser a,\\n.tc-colour-chooser a {\\n\\tdisplay: inline-block;\\n\\tvertical-align: top;\\n\\ttext-align: center;\\n\\tposition: relative;\\n}\\n\\n.tc-image-chooser a {\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tpadding: 2px;\\n\\tmargin: 2px;\\n\\twidth: 4em;\\n\\theight: 4em;\\n}\\n\\n.tc-colour-chooser a {\\n\\tpadding: 3px;\\n\\twidth: 2em;\\n\\theight: 2em;\\n\\tvertical-align: middle;\\n}\\n\\n.tc-image-chooser a:hover,\\n.tc-colour-chooser a:hover {\\n\\tbackground: \u003C\u003Ccolour primary>>;\\n\\tpadding: 0px;\\n\\tborder: 3px solid \u003C\u003Ccolour primary>>;\\n}\\n\\n.tc-image-chooser a svg,\\n.tc-image-chooser a img {\\n\\tdisplay: inline-block;\\n\\twidth: auto;\\n\\theight: auto;\\n\\tmax-width: 3.5em;\\n\\tmax-height: 3.5em;\\n\\tposition: absolute;\\n\\ttop: 0;\\n\\tbottom: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tmargin: auto;\\n}\\n\\n/* Make search dropdown visible on small screens. issue #7003 */\\n@media (max-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\n\\t.tc-sidebar-search .tc-block-dropdown-wrapper {\\n\\t\\tposition: initial;\\n\\t}\\n\\n}\\n\\n/*\\n** Modals\\n*/\\n\\n.tc-modal-wrapper {\\n\\tposition: fixed;\\n\\toverflow: auto;\\n\\toverflow-y: scroll;\\n\\ttop: 0;\\n\\tright: 0;\\n\\tbottom: 0;\\n\\tleft: 0;\\n\\tz-index: 900;\\n}\\n\\n.tc-modal-backdrop {\\n\\tposition: fixed;\\n\\ttop: 0;\\n\\tright: 0;\\n\\tbottom: 0;\\n\\tleft: 0;\\n\\tz-index: 1000;\\n\\tbackground-color: \u003C\u003Ccolour modal-backdrop>>;\\n}\\n\\n.tc-modal {\\n\\tz-index: 1100;\\n\\tbackground-color: \u003C\u003Ccolour modal-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour modal-border>>;\\n}\\n\\n@media (max-width: 55em) {\\n\\t.tc-modal {\\n\\t\\tposition: fixed;\\n\\t\\ttop: 1em;\\n\\t\\tleft: 1em;\\n\\t\\tright: 1em;\\n\\t}\\n\\n\\t.tc-modal-body {\\n\\t\\toverflow-y: auto;\\n\\t\\tmax-height: 400px;\\n\\t\\tmax-height: 60vh;\\n\\t}\\n}\\n\\n@media (min-width: 55em) {\\n\\t.tc-modal {\\n\\t\\tposition: fixed;\\n\\t\\ttop: 2em;\\n\\t\\tleft: 25%;\\n\\t\\twidth: 50%;\\n\\t}\\n\\n\\t.tc-modal-body {\\n\\t\\toverflow-y: auto;\\n\\t\\tmax-height: 400px;\\n\\t\\tmax-height: 60vh;\\n\\t}\\n}\\n\\n.tc-modal-header {\\n\\tpadding: 9px 15px;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour modal-header-border>>;\\n}\\n\\n.tc-modal-header h3 {\\n\\tmargin: 0;\\n\\tline-height: 30px;\\n}\\n\\n.tc-modal-header img, .tc-modal-header svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n}\\n\\n.tc-modal-body {\\n\\tpadding: 15px;\\n}\\n\\n.tc-modal-footer {\\n\\tpadding: 14px 15px 15px;\\n\\tmargin-bottom: 0;\\n\\ttext-align: right;\\n\\tbackground-color: \u003C\u003Ccolour modal-footer-background>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour modal-footer-border>>;\\n}\\n\\n.tc-modal-prevent-scroll {\\n\\toverflow: hidden;\\n}\\n\\n/*\\n** Centered modals\\n*/\\n.tc-modal-centered .tc-modal {\\n\\twidth: auto;\\n\\ttop: 50%;\\n\\tleft: 50%;\\n\\ttransform: translate(-50%, -50%) !important;\\n}\\n\\n/*\\n** Notifications\\n*/\\n\\n.tc-notification {\\n\\tposition: fixed;\\n\\ttop: 14px;\\n\\tright: 42px;\\n\\tz-index: 1300;\\n\\tmax-width: 280px;\\n\\tpadding: 0 14px 0 14px;\\n\\tbackground-color: \u003C\u003Ccolour notification-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour notification-border>>;\\n}\\n\\n/*\\n** Tabs\\n*/\\n\\n.tc-tab-set.tc-vertical {\\n\\tdisplay: -webkit-flex;\\n\\tdisplay: flex;\\n}\\n\\n.tc-tab-buttons {\\n\\tfont-size: 0.85em;\\n\\tpadding-top: 1em;\\n\\tmargin-bottom: -2px;\\n}\\n\\n.tc-tab-buttons.tc-vertical {\\n\\tz-index: 100;\\n\\tdisplay: block;\\n\\tpadding-top: 14px;\\n\\tvertical-align: top;\\n\\ttext-align: end;\\n\\tmargin-bottom: inherit;\\n\\tmargin-right: -1px;\\n\\tmax-width: 33%;\\n\\t-webkit-flex: 0 0 auto;\\n\\tflex: 0 0 auto;\\n}\\n\\n.tc-tab-buttons button.tc-tab-selected {\\n\\tcolor: \u003C\u003Ccolour tab-foreground-selected>>;\\n\\tbackground-color: \u003C\u003Ccolour tab-background-selected>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-border-selected>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-border-selected>>;\\n\\tborder-right: 1px solid \u003C\u003Ccolour tab-border-selected>>;\\n}\\n\\n.tc-tab-buttons button {\\n\\tcolor: \u003C\u003Ccolour tab-foreground>>;\\n\\tpadding: 3px 5px 3px 5px;\\n\\tmargin-right: 0.3em;\\n\\tfont-weight: normal;\\n\\tborder: none;\\n\\tbackground: inherit;\\n\\tbackground-color: \u003C\u003Ccolour tab-background>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-right: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-top-left-radius: 2px;\\n\\tborder-top-right-radius: 2px;\\n\\tborder-bottom-left-radius: 0;\\n\\tborder-bottom-right-radius: 0;\\n}\\n\\n.tc-tab-buttons.tc-vertical button {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n\\tmargin-top: 3px;\\n\\tmargin-right: 0;\\n\\ttext-align: end;\\n\\tbackground-color: \u003C\u003Ccolour tab-background>>;\\n\\tborder-inline-start: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-inline-end: none;\\n\\tborder-start-start-radius: 2px;\\n\\tborder-end-start-radius: 2px;\\n\\tborder-start-end-radius: 0;\\n\\tborder-end-end-radius: 0;\\n}\\n\\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\\n\\tbackground-color: \u003C\u003Ccolour tab-background-selected>>;\\n\\tborder-inline-end: 1px solid \u003C\u003Ccolour tab-background-selected>>;\\n}\\n\\n.tc-tab-divider {\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-divider>>;\\n}\\n\\n.tc-tab-divider.tc-vertical {\\n\\tdisplay: none;\\n}\\n\\n.tc-tab-content {\\n\\tmargin-top: 14px;\\n}\\n\\n.tc-tab-content.tc-vertical {\\n\\tdisplay: inline-block;\\n\\tvertical-align: top;\\n\\tpadding-top: 0;\\n\\t\u003C\u003Cpadding-start 14px>>\\n\\tborder-inline-start: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\t-webkit-flex: 1 0 70%;\\n\\tflex: 1 0 70%;\\n\\toverflow: auto;\\n}\\n\\n.tc-sidebar-lists .tc-tab-buttons {\\n\\tmargin-bottom: -1px;\\n}\\n\\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\\n\\tbackground-color: \u003C\u003Ccolour sidebar-tab-background-selected>>;\\n\\tcolor: \u003C\u003Ccolour sidebar-tab-foreground-selected>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour sidebar-tab-border-selected>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour sidebar-tab-border-selected>>;\\n\\tborder-right: 1px solid \u003C\u003Ccolour sidebar-tab-border-selected>>;\\n}\\n\\n.tc-sidebar-lists .tc-tab-buttons button {\\n\\tbackground-color: \u003C\u003Ccolour sidebar-tab-background>>;\\n\\tcolor: \u003C\u003Ccolour sidebar-tab-foreground>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour sidebar-tab-border>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour sidebar-tab-border>>;\\n\\tborder-right: 1px solid \u003C\u003Ccolour sidebar-tab-border>>;\\n}\\n\\n.tc-sidebar-lists .tc-tab-divider {\\n\\tborder-top: 1px solid \u003C\u003Ccolour sidebar-tab-divider>>;\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n\\tbackground-color: \u003C\u003Ccolour sidebar-tab-background>>;\\n\\tborder-top: none;\\n\\tborder-left: none;\\n\\tborder-bottom: none;\\n\\tborder-right: 1px solid #ccc;\\n\\tmargin-bottom: inherit;\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\\n\\tbackground-color: \u003C\u003Ccolour sidebar-tab-background-selected>>;\\n\\tborder: none;\\n}\\n\\n/*\\n** Manager\\n*/\\n\\n.tc-manager-wrapper {\\n\\n}\\n\\n.tc-manager-controls {\\n\\n}\\n\\n.tc-manager-control {\\n\\tmargin: 0.5em 0;\\n}\\n\\n.tc-manager-control select {\\n\\tmax-width: 100%;\\n}\\n\\n.tc-manager-list {\\n\\twidth: 100%;\\n\\tborder-top: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-right: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-manager-list-item {\\n\\n}\\n\\n.tc-manager-list-item-heading {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n\\ttext-align: left;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tpadding: 3px;\\n}\\n\\n.tc-manager-list-item-heading-selected {\\n\\tfont-weight: bold;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tbackground-color: \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-manager-list-item-heading:hover {\\n\\tbackground: \u003C\u003Ccolour primary>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-manager-list-item-content {\\n\\tdisplay: flex;\\n}\\n\\n.tc-manager-list-item-content-sidebar {\\n\\tflex: 1 0;\\n\\tbackground: \u003C\u003Ccolour tiddler-editor-background>>;\\n\\tborder-right: 0.5em solid \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-bottom: 0.5em solid \u003C\u003Ccolour muted-foreground>>;\\n\\twhite-space: nowrap;\\n}\\n\\n.tc-manager-list-item-content-item-heading {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n\\ttext-align: left;\\n\\tbackground: \u003C\u003Ccolour muted-foreground>>;\\n\\ttext-transform: uppercase;\\n\\tfont-size: 0.6em;\\n\\tfont-weight: bold;\\n\\tpadding: 0.5em 0 0.5em 0;\\n}\\n\\n.tc-manager-list-item-content-item-body {\\n\\tpadding: 0 0.5em 0 0.5em;\\n}\\n\\n.tc-manager-list-item-content-item-body > pre {\\n\\tmargin: 0.5em 0 0.5em 0;\\n\\tborder: none;\\n\\tbackground: inherit;\\n}\\n\\n.tc-manager-list-item-content-tiddler {\\n\\tflex: 3 1;\\n\\tborder-left: 0.5em solid \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-right: 0.5em solid \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-bottom: 0.5em solid \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-manager-list-item-content-item-body > table {\\n\\tborder: none;\\n\\tpadding: 0;\\n\\tmargin: 0;\\n}\\n\\n.tc-manager-list-item-content-item-body > table td {\\n\\tborder: none;\\n}\\n\\n.tc-manager-icon-editor > button {\\n\\twidth: 100%;\\n}\\n\\n.tc-manager-icon-editor > button > svg,\\n.tc-manager-icon-editor > button > button {\\n\\twidth: 100%;\\n\\theight: auto;\\n}\\n\\n/*\\n** Import table\\n*/\\n\\n.tc-import-option {\\n\\tdisplay: flex;\\n\\tflex-direction: column;\\n\\tgap: 0.5em;\\n\\tmargin: 0.5em 0;\\n\\tpadding: 0.5em;\\n\\tbackground: \u003C\u003Ccolour tiddler-editor-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour tiddler-editor-border>>;\\n\\tborder-radius: 4px;\\n}\\n\\n.tc-import-table {\\n\\twidth: 100%;\\n}\\n\\n.tc-import-table svg.tc-image-edit-button {\\n\\tmax-width: unset;\\n}\\n\\n.tc-import-table th:first-of-type {\\n\\twidth: 10%;\\n}\\n\\n.tc-import-table th:last-of-type {\\n\\twidth: 30%;\\n}\\n\\n.tc-import-table .tc-row-disabled {\\n\\tbackground: \u003C\u003Ccolour very-muted-foreground>>10;\\n\\topacity: 0.8;\\n}\\n\\n.tc-import-table .tc-row-warning {\\n\\tbackground: \u003C\u003Ccolour diff-delete-background>>50;\\n}\\n\\n/*\\n** Alerts\\n*/\\n\\n.tc-alerts {\\n\\tposition: fixed;\\n\\ttop: 28px;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tmax-width: 50%;\\n\\tz-index: 20000;\\n}\\n\\n.tc-alert {\\n\\tposition: relative;\\n\\tmargin: 14px;\\n\\tpadding: 7px;\\n\\tborder: 1px solid \u003C\u003Ccolour alert-border>>;\\n\\tbackground-color: \u003C\u003Ccolour alert-background>>;\\n}\\n\\n.tc-alert-toolbar {\\n\\tposition: absolute;\\n\\ttop: 7px;\\n\\tinset-inline-end: 7px;\\n\\tline-height: 0;\\n}\\n\\n.tc-alert-toolbar svg {\\n\\tfill: \u003C\u003Ccolour alert-muted-foreground>>;\\n}\\n\\n.tc-alert-subtitle {\\n\\tcolor: \u003C\u003Ccolour alert-muted-foreground>>;\\n\\tfont-weight: bold;\\n\\tfont-size: 0.8em;\\n\\tmargin-bottom: 0.5em;\\n}\\n\\n.tc-alert-body > p {\\n\\tmargin: 0;\\n}\\n\\n.tc-alert-highlight {\\n\\tcolor: \u003C\u003Ccolour alert-highlight>>;\\n}\\n\\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\n\\t.tc-static-alert {\\n\\t\\tposition: relative;\\n\\t}\\n\\n\\t.tc-static-alert-inner {\\n\\t\\tposition: absolute;\\n\\t\\tz-index: 100;\\n\\t}\\n\\n}\\n\\n.tc-static-alert-inner {\\n\\tpadding: 0 2px 2px 42px;\\n\\tcolor: \u003C\u003Ccolour static-alert-foreground>>;\\n}\\n\\n/*\\n** Floating drafts list\\n*/\\n\\n.tc-drafts-list {\\n\\tz-index: 2000;\\n\\tposition: fixed;\\n\\tfont-size: 0.8em;\\n\\tleft: 0;\\n\\tbottom: 0;\\n}\\n\\n.tc-drafts-list a {\\n\\tmargin: 0 0.5em;\\n\\tpadding: 4px 4px;\\n\\tborder-top-left-radius: 4px;\\n\\tborder-top-right-radius: 4px;\\n\\tborder: 1px solid \u003C\u003Ccolour background>>;\\n\\tborder-bottom: none;\\n\\tbackground: \u003C\u003Ccolour dirty-indicator>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-drafts-list a:hover {\\n\\ttext-decoration: none;\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-drafts-list a svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n\\tvertical-align: text-bottom;\\n}\\n\\n/*\\n** Control panel\\n*/\\n\\n.tc-control-panel td {\\n\\tpadding: 4px;\\n}\\n\\n.tc-control-panel table > tbody > tr > td {\\n\\ttext-align: start;\\n}\\n\\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\\n\\twidth: 100%;\\n}\\n\\n.tc-control-panel-setting {\\n\\tborder-top: 1px solid \u003C\u003Ccolour blockquote-bar>>;\\n}\\n\\n.tc-plugin-info {\\n\\tdisplay: flex;\\n\\ttext-shadow: none;\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour background>>;\\n\\tmargin: 0.5em 0 0.5em 0;\\n\\tpadding: 4px;\\n\\talign-items: center;\\n}\\n\\n.tc-sidebar-lists a.tc-tiddlylink.tc-plugin-info {\\n\\tcolor: \u003C\u003Ccolour tiddler-link-foreground>>;\\n}\\n\\n\\n.tc-plugin-info-sub-plugins .tc-plugin-info {\\n\\tmargin: 0.5em;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-plugin-info-sub-plugin-indicator {\\n\\tmargin: -16px 1em 0 2em;\\n}\\n\\n.tc-plugin-info-sub-plugin-indicator button {\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tborder-radius: 8px;\\n\\tpadding: 2px 7px;\\n\\tfont-size: 0.75em;\\n}\\n\\n.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {\\n\\tmargin-left: 1em;\\n\\tmargin-right: 1em;\\n}\\n\\n.tc-plugin-info-disabled {\\n\\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\\n\\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\\n}\\n\\n.tc-plugin-info-disabled:hover {\\n\\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\\n\\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\\n}\\n\\na.tc-tiddlylink.tc-plugin-info:hover {\\n\\ttext-decoration: none;\\n\\tbackground-color: \u003C\u003Ccolour primary>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n}\\n\\na.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg {\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\na.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk .tc-plugin-info-stability {\\n\\tborder: 1px solid \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-plugin-info-chunk {\\n\\tmargin: 2px;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-toggle {\\n\\tflex-grow: 0;\\n\\tflex-shrink: 0;\\n\\tline-height: 1;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-icon {\\n\\tflex-grow: 0;\\n\\tflex-shrink: 0;\\n\\tline-height: 1;\\n\\theight: 2em;\\n\\twidth: 2em;\\n\\tdisplay: grid;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-description {\\n\\tflex-grow: 1;\\n}\\n\\n.tc-plugin-info-chunk .tc-plugin-info-stability {\\n\\tmargin-right: 4px;\\n\\tpadding: 1px 3px;\\n\\tfont-size: 0.8em;\\n\\tborder-radius: 4px;\\n\\tfont-weight: bold;\\n}\\n\\n.tc-plugin-info-chunk .tc-plugin-info-stability-stable {\\n\\tborder: 1px solid \u003C\u003Ccolour stability-stable>>;\\n\\tcolor: \u003C\u003Ccolour stability-stable>>;\\n}\\n\\n.tc-plugin-info-chunk .tc-plugin-info-stability-experimental {\\n\\tborder: 1px solid \u003C\u003Ccolour stability-experimental>>;\\n\\tcolor: \u003C\u003Ccolour stability-experimental>>;\\n}\\n\\n.tc-plugin-info-chunk .tc-plugin-info-stability-deprecated {\\n\\tborder: 1px solid \u003C\u003Ccolour stability-deprecated>>;\\n\\tcolor: \u003C\u003Ccolour stability-deprecated>>;\\n}\\n\\n.tc-plugin-info-chunk .tc-plugin-info-stability-legacy {\\n\\tborder: 1px solid \u003C\u003Ccolour stability-legacy>>;\\n\\tcolor: \u003C\u003Ccolour stability-legacy>>;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-buttons {\\n\\tfont-size: 0.8em;\\n\\tline-height: 1.2;\\n\\tflex-grow: 0;\\n\\tflex-shrink: 0;\\n\\ttext-align: right;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-description h1 {\\n\\tfont-size: 1em;\\n\\tline-height: 1.2;\\n\\tmargin: 2px 0 2px 0;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-description h2 {\\n\\tfont-size: 0.8em;\\n\\tline-height: 1.2;\\n\\tmargin: 2px 0 2px 0;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-description div {\\n\\tfont-size: 0.8em;\\n\\tline-height: 1.2;\\n\\tmargin: 2px 0 2px 0;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {\\n\\tmax-width: 2em;\\n\\tmax-height: 2em;\\n\\tmargin: auto;\\n}\\n\\n.tc-plugin-info-dropdown {\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tmargin-top: -8px;\\n}\\n\\n.tc-plugin-info-dropdown-message {\\n\\tbackground: \u003C\u003Ccolour message-background>>;\\n\\tpadding: 0.5em 1em 0.5em 1em;\\n\\tfont-weight: bold;\\n\\tfont-size: 0.8em;\\n}\\n\\n.tc-plugin-info-dropdown-body {\\n\\tpadding: 1em 1em 0 1em;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-plugin-info-sub-plugins {\\n\\tpadding: 0.5em;\\n\\tmargin: 0 1em 1em 1em;\\n\\tbackground: \u003C\u003Ccolour notification-background>>;\\n}\\n\\n.tc-install-plugin {\\n\\tfont-weight: bold;\\n\\tbackground: green;\\n\\tcolor: white;\\n\\tfill: white;\\n\\tborder-radius: 4px;\\n\\tpadding: 3px;\\n}\\n\\n.tc-install-plugin.tc-reinstall-downgrade {\\n\\tbackground: red;\\n}\\n\\n.tc-install-plugin.tc-reinstall {\\n\\tbackground: blue;\\n}\\n\\n.tc-install-plugin.tc-reinstall-upgrade {\\n\\tbackground: orange;\\n}\\n\\n.tc-check-list {\\n\\tline-height: 2em;\\n}\\n\\n.tc-check-list .tc-image-button {\\n\\theight: 1.5em;\\n}\\n\\n/*\\n** Message boxes\\n*/\\n\\n.tc-message-box {\\n\\tborder: 1px solid \u003C\u003Ccolour message-border>>;\\n\\tbackground: \u003C\u003Ccolour message-background>>;\\n\\tpadding: 0px 21px 0px 21px;\\n\\tfont-size: 12px;\\n\\tline-height: 18px;\\n\\tcolor: \u003C\u003Ccolour message-foreground>>;\\n}\\n\\n.tc-message-box svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n\\tvertical-align: text-bottom;\\n}\\n\\n/*\\n** Pictures\\n*/\\n\\n.tc-bordered-image {\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tpadding: 5px;\\n\\tmargin: 5px;\\n}\\n\\n/*\\n** Floats\\n*/\\n\\n.tc-float-right {\\n\\tfloat: right;\\n}\\n\\n/* Float tc-clearfix. Needs to be used by elements that allow float:right in their content.\\n** So the floating element does not overflow\\n*/\\n\\n.tc-clearfix:after {\\n\\tcontent: \\\"\\\";\\n\\tclear: both;\\n\\tdisplay: table;\\n}\\n\\n/* Fix overflow toc, manager and testcase output */\\n.tc-tiddler-body .tc-tabbed-table-of-contents, .tc-manager-list-item-content, .tc-test-case-output {\\n\\toverflow-x: auto;\\n}\\n\\n/* A wrapper to fix table overflow */\\n\\n.tc-table-wrapper {\\n\\toverflow-x: auto;\\n}\\n\\n/*\\n** Chooser\\n*/\\n\\n.tc-chooser {\\n\\tborder-right: 1px solid \u003C\u003Ccolour table-header-background>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour table-header-background>>;\\n}\\n\\n\\n.tc-chooser-item {\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour table-header-background>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour table-header-background>>;\\n\\tpadding-top: 2px;\\n\\tpadding-bottom: 2px;\\n\\t\u003C\u003Cpadding-inline 14px 4px>>\\n}\\n\\n.tc-drop-down .tc-chooser-item {\\n\\tpadding: 2px;\\n}\\n\\n.tc-chosen,\\n.tc-chooser-item:hover {\\n\\tbackground-color: \u003C\u003Ccolour table-header-background>>;\\n\\tborder-color: \u003C\u003Ccolour table-footer-background>>;\\n}\\n\\n.tc-chosen .tc-tiddlylink {\\n\\tcursor:default;\\n}\\n\\n.tc-chooser-item .tc-tiddlylink {\\n\\tdisplay: block;\\n\\ttext-decoration: none;\\n\\tbackground-color: transparent;\\n}\\n\\n.tc-chooser-item:hover .tc-tiddlylink:hover {\\n\\ttext-decoration: none;\\n}\\n\\n.tc-drop-down .tc-chosen .tc-tiddlylink,\\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-chosen > .tc-tiddlylink:before {\\n\\t\u003C\u003Cmargin-start \\\"-10px\\\">>\\n\\tposition: relative;\\n\\tcontent: \\\"» \\\";\\n}\\n\\n.tc-chooser-item svg,\\n.tc-chooser-item img{\\n\\tmax-width: 1em;\\n\\tmax-height: 1em;\\n\\tvertical-align: middle;\\n}\\n\\n.tc-language-chooser .tc-image-button img {\\n\\tmax-width: 2em;\\n\\tmax-height: 1em;\\n\\twidth: auto;\\n\\theight: auto;\\n\\tvertical-align: -0.15em;\\n}\\n\\n/*\\n** Palette swatches\\n*/\\n\\n.tc-swatches-horiz {\\n}\\n\\n.tc-swatches-horiz .tc-swatch {\\n\\tdisplay: inline-block;\\n}\\n\\n.tc-swatch {\\n\\twidth: 2em;\\n\\theight: 2em;\\n\\tmargin: 0.4em;\\n\\tborder: 1px solid #888;\\n}\\n\\ninput.tc-palette-manager-colour-input {\\n\\twidth: 100%;\\n\\tpadding: 0;\\n}\\n\\n/*\\n** Table of contents\\n*/\\n\\n.tc-sidebar-lists .tc-table-of-contents {\\n\\twhite-space: nowrap;\\n}\\n\\n.tc-table-of-contents button,\\n.tc-table-of-contents .toc-item-muted {\\n\\tcolor: \u003C\u003Ccolour sidebar-foreground>>;\\n}\\n\\n.tc-table-of-contents svg {\\n\\twidth: 0.7em;\\n\\theight: 0.7em;\\n\\tvertical-align: middle;\\n\\tfill: \u003C\u003Ccolour sidebar-foreground>>;\\n}\\n\\n.tc-table-of-contents ol {\\n\\tlist-style-type: none;\\n\\t\u003C\u003Cpadding-start 0>>\\n}\\n\\n.tc-table-of-contents ol ol {\\n\\t\u003C\u003Cpadding-start 1em>>\\n}\\n\\n.tc-table-of-contents li {\\n\\tfont-size: 1.0em;\\n\\tfont-weight: bold;\\n}\\n\\n.tc-table-of-contents li a {\\n\\tfont-weight: bold;\\n}\\n\\n.tc-table-of-contents li li {\\n\\tfont-size: 0.95em;\\n\\tfont-weight: normal;\\n\\tline-height: 1.4;\\n}\\n\\n.tc-table-of-contents li li a {\\n\\tfont-weight: normal;\\n}\\n\\n.tc-table-of-contents li li li {\\n\\tfont-size: 0.95em;\\n\\tfont-weight: normal;\\n\\tline-height: 1.5;\\n}\\n\\n.tc-table-of-contents li li li li {\\n\\tfont-size: 0.95em;\\n\\tfont-weight: normal;\\n}\\n\\n.tc-tabbed-table-of-contents {\\n\\tdisplay: -webkit-flex;\\n\\tdisplay: flex;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-table-of-contents {\\n\\tz-index: 100;\\n\\tdisplay: inline-block;\\n\\t\u003C\u003Cpadding-start 1em>>\\n\\tmax-width: 50%;\\n\\t-webkit-flex: 0 0 auto;\\n\\tflex: 0 0 auto;\\n\\tbackground: \u003C\u003Ccolour tab-background>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tab-border>>;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\\n\\tdisplay: block;\\n\\tpadding: 0.12em 1em 0.12em 0.25em;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-background>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-background>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tab-background>>;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\\n\\ttext-decoration: none;\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tbackground: \u003C\u003Ccolour tab-border>>;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tmargin-right: -1px;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\\n\\ttext-decoration: none;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\\n\\tdisplay: inline-block;\\n\\tvertical-align: top;\\n\\tpadding-left: 1.5em;\\n\\tpadding-right: 1.5em;\\n\\tborder: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\t-webkit-flex: 1 0 50%;\\n\\tflex: 1 0 50%;\\n}\\n\\n/*\\n** Dirty indicator\\n*/\\n\\nhtml body svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-clean {\\n\\tvisibility: visible;\\n}\\n\\nhtml body svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-dirty {\\n\\tvisibility: hidden;\\n}\\n\\nhtml body.tc-dirty svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-clean {\\n\\tvisibility: hidden;\\n}\\n\\nhtml body.tc-dirty svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-dirty {\\n\\tvisibility: visible;\\n}\\n\\nhtml body.tc-dirty span.tc-dirty-indicator, html body.tc-dirty span.tc-dirty-indicator svg {\\n\\tfill: \u003C\u003Ccolour dirty-indicator>>;\\n\\tcolor: \u003C\u003Ccolour dirty-indicator>>;\\n}\\n\\n/*\\n** File inputs\\n*/\\n\\n.tc-file-input-wrapper {\\n\\tposition: relative;\\n\\toverflow: hidden;\\n\\tdisplay: inline-block;\\n\\tvertical-align: middle;\\n}\\n\\n.tc-file-input-wrapper input[type=file] {\\n\\tposition: absolute;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tbottom: 0;\\n\\tfont-size: 999px;\\n\\tmax-width: 100%;\\n\\tmax-height: 100%;\\n\\tfilter: alpha(opacity=0);\\n\\topacity: 0;\\n\\toutline: none;\\n\\tbackground: white;\\n\\tcursor: pointer;\\n\\tdisplay: inline-block;\\n}\\n\\n::-webkit-file-upload-button {\\n\\tcursor:pointer;\\n}\\n\\n/*\\n** Thumbnail macros\\n*/\\n\\n.tc-thumbnail-wrapper {\\n\\tposition: relative;\\n\\tdisplay: inline-block;\\n\\tmargin: 6px;\\n\\tvertical-align: top;\\n}\\n\\n.tc-thumbnail-right-wrapper {\\n\\tfloat:right;\\n\\tmargin: 0.5em 0 0.5em 0.5em;\\n}\\n\\n.tc-thumbnail-image {\\n\\ttext-align: center;\\n\\toverflow: hidden;\\n\\tborder-radius: 3px;\\n}\\n\\n.tc-thumbnail-image svg,\\n.tc-thumbnail-image img {\\n\\tfilter: alpha(opacity=1);\\n\\topacity: 1;\\n\\tmin-width: 100%;\\n\\tmin-height: 100%;\\n\\tmax-width: 100%;\\n}\\n\\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\\n\\tfilter: alpha(opacity=0.8);\\n\\topacity: 0.8;\\n}\\n\\n.tc-thumbnail-background {\\n\\tposition: absolute;\\n\\tborder-radius: 3px;\\n}\\n\\n.tc-thumbnail-icon svg,\\n.tc-thumbnail-icon img {\\n\\twidth: 3em;\\n\\theight: 3em;\\n\\t\u003C\u003Cfilter \\\"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\\\">>\\n}\\n\\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\\n\\tfill: #fff;\\n\\t\u003C\u003Cfilter \\\"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\\\">>\\n}\\n\\n.tc-thumbnail-icon {\\n\\tposition: absolute;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tbottom: 0;\\n\\tdisplay: -webkit-flex;\\n\\t-webkit-align-items: center;\\n\\t-webkit-justify-content: center;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n}\\n\\n.tc-thumbnail-caption {\\n\\tposition: absolute;\\n\\tbackground-color: #777;\\n\\tcolor: #fff;\\n\\ttext-align: center;\\n\\tbottom: 0;\\n\\twidth: 100%;\\n\\tfilter: alpha(opacity=0.9);\\n\\topacity: 0.9;\\n\\tline-height: 1.4;\\n\\tborder-bottom-left-radius: 3px;\\n\\tborder-bottom-right-radius: 3px;\\n}\\n\\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\\n\\tfilter: alpha(opacity=1);\\n\\topacity: 1;\\n}\\n\\n/*\\n** Diffs\\n*/\\n\\n.tc-diff-equal {\\n\\tbackground-color: \u003C\u003Ccolour diff-equal-background>>;\\n\\tcolor: \u003C\u003Ccolour diff-equal-foreground>>;\\n}\\n\\n.tc-diff-insert {\\n\\tbackground-color: \u003C\u003Ccolour diff-insert-background>>;\\n\\tcolor: \u003C\u003Ccolour diff-insert-foreground>>;\\n}\\n\\n.tc-diff-delete {\\n\\tbackground-color: \u003C\u003Ccolour diff-delete-background>>;\\n\\tcolor: \u003C\u003Ccolour diff-delete-foreground>>;\\n}\\n\\n.tc-diff-invisible {\\n\\tbackground-color: \u003C\u003Ccolour diff-invisible-background>>;\\n\\tcolor: \u003C\u003Ccolour diff-invisible-foreground>>;\\n}\\n\\n.tc-diff-tiddlers th {\\n\\ttext-align: right;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tfont-weight: normal;\\n\\tfont-style: italic;\\n}\\n\\n.tc-diff-tiddlers pre {\\n\\tmargin: 0;\\n\\tpadding: 0;\\n\\tborder: none;\\n\\tbackground: none;\\n}\\n\\n/*\\n** Errors\\n*/\\n\\n.tc-error {\\n\\tbackground: #f00;\\n\\tcolor: #fff;\\n}\\n\\n/*\\n** Tree macro\\n*/\\n\\n.tc-tree div {\\n\\t\u003C\u003Cpadding-start \\\"14px\\\">>\\n}\\n\\n.tc-tree ol {\\n\\tlist-style-type: none;\\n\\t\u003C\u003Cpadding-start 0>>\\n\\tmargin-top: 0;\\n}\\n\\n.tc-tree ol ol {\\n\\t\u003C\u003Cpadding-start 1em>>\\n}\\n\\n.tc-tree button {\\n\\tcolor: #acacac;\\n}\\n\\n.tc-tree svg {\\n\\tfill: #acacac;\\n}\\n\\n.tc-tree span svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n\\tvertical-align: baseline;\\n}\\n\\n.tc-tree li span {\\n\\tcolor: lightgray;\\n}\\n\\nselect {\\n\\tcolor: \u003C\u003Ccolour select-tag-foreground>>;\\n\\tbackground: \u003C\u003Ccolour select-tag-background>>;\\n}\\n\\n/*\\n** Translink macro\\n*/\\n\\n.tc-translink {\\n\\tbackground-color: \u003C\u003Ccolour pre-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour pre-border>>;\\n\\tpadding: 0 3px;\\n\\tborder-radius: 3px;\\n}\\n\\ndiv.tc-translink > div {\\n\\tmargin: 1em;\\n}\\n\\ndiv.tc-translink > div > a:first-child > h1 {\\n\\tfont-size: 1.2em;\\n\\tfont-weight: bold;\\n}\\n\\nspan.tc-translink > a:first-child {\\n\\tfont-weight: bold;\\n}\\n\\n/*\\n** Classes for displaying globals\\n*/\\n\\n.tc-global-tiddler-body {\\n\\tpadding: 0.25em;\\n\\tborder: 1px solid \u003C\u003Ccolour foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-radius: 3px;\\n}\\n\\n.tc-global-tiddler-body-heading {\\n\\tmargin: 0 0 0.25em 0;\\n\\tfont-weight: normal;\\n}\\n\\n.tc-global-tiddler-body-type {\\n\\tmargin: 0 0 0.25em 0;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-global-tiddler-body-details {\\n\\tbackground-color: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-global-tiddler-body pre {\\n\\tmargin: 0;\\n\\tborder: 1px solid \u003C\u003Ccolour foreground>>;\\n}\\n\\n/*\\n** Utility classes for SVG icons\\n*/\\n\\n.tc-fill-background {\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-network-activity-background {\\n\\tfill: \u003C\u003Ccolour network-activity-foreground>>;\\n}\\n\\n/*\\n** Test Cases\\n*/\\n\\n.tc-test-case-wrapper {\\n\\tborder: 1px solid \u003C\u003Ccolour foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-radius: 6px;\\n}\\n\\n.tc-test-case-wrapper {\\n\\tbackground-color: \u003C\u003Ccolour testcase-accent-level-1>>;\\n}\\n\\n.tc-test-case-wrapper .tc-test-case-wrapper {\\n\\tbackground-color: \u003C\u003Ccolour testcase-accent-level-2>>;\\n}\\n\\n.tc-test-case-wrapper .tc-test-case-wrapper .tc-test-case-wrapper {\\n\\tbackground-color: \u003C\u003Ccolour testcase-accent-level-3>>;\\n}\\n\\n.tc-test-case-header {\\n\\tfont-weight: normal;\\n\\tmargin: 0.5em 0;\\n\\tpadding: 0 0.5em;\\n}\\n\\n.tc-test-case-divider {\\n\\tx-background-color: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-test-case-result-icon {\\n\\tfill: #fff;\\n\\tpadding: 0.25em;\\n\\tdisplay: inline-block;\\n\\tline-height: 0;\\n\\tborder-radius: 1em;\\n\\tvertical-align: text-bottom;\\n\\t\u003C\u003Cmargin-end \\\"0.25em\\\">>\\n}\\n\\n.tc-test-case-result-icon-pass {\\n\\tbackground-color: green;\\n}\\n\\n.tc-test-case-result-icon-fail {\\n\\tbackground-color: red;\\n}\\n\\n.tc-test-case-result-icon svg {\\n\\twidth: 0.5em;\\n\\theight: 0.5em;\\n}\\n\\n.tc-test-case-header > h2 {\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tborder-radius: 4px;\\n\\tpadding: 0.25em;\\n}\\n\\n.tc-test-case-header > h2,\\n.tc-test-case-source > pre {\\n\\tmargin: 0;\\n}\\n\\n.tc-test-case-header > h2 a.tc-tiddlylink-missing {\\n\\tfont-style: normal;\\n}\\n\\n.tc-test-case-toolbar {\\n\\tfloat: inline-end;\\n}\\n\\n.tc-test-case-toolbar svg {\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground>>;\\n}\\n\\n.tc-test-case-toolbar .tc-drop-down {\\n\\tfont-size: 0.8em;\\n}\\n\\n.tc-test-case-result-fail {\\n\\tborder: 1px solid \u003C\u003Ccolour foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour background>>;\\n\\tborder-radius: 4px;\\n\\tmargin: 0 0.5em;\\n\\tpadding: 0;\\n}\\n\\n.tc-test-case-result-fail-header {\\n\\tbackground: \u003C\u003Ccolour diff-delete-background>>;\\n\\tcolor: \u003C\u003Ccolour diff-delete-foreground>>;\\n\\tborder-top-left-radius: 4px;\\n\\tborder-top-right-radius: 4px;\\n\\tpadding: 4px;\\n}\\n\\n.tc-test-case-result-fail-body {\\n\\tpadding: 4px;\\n}\\n\\n.tc-test-case-source > pre {\\n\\theight: 100%;\\n}\\n\\n.tc-test-case-narrative {\\n\\tpadding: 0.5em;\\n}\\n\\n.tc-test-case-panes {\\n\\tdisplay: flex;\\n\\talign-items: stretch;\\n\\tflex-wrap: wrap;\\n\\tpadding: 0.5em;\\n\\tborder-bottom-left-radius: 6px;\\n\\tborder-bottom-right-radius: 6px;\\n}\\n\\n.tc-test-case-source {\\n\\tflex: 1 0 49%;\\n\\tmin-width: 250px;\\n}\\n\\n.tc-test-case-source .tc-tab-content {\\n\\tbackground: inherit;\\n\\tmargin: 0;\\n}\\n\\n.tc-test-case-source .tc-tab-content .tc-field-table {\\n\\tbackground: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-test-case-source .tc-field-table {\\n\\twidth: 100%;\\n}\\n\\n.tc-test-case-source table.tc-field-table {\\n\\tmargin: 0;\\n}\\n\\n.tc-test-case-source .tc-tiddler-frame .tc-edit-texteditor {\\n\\tmargin: 0;\\n}\\n\\n.tc-test-case-divider {\\n\\tflex: 0 0 1.5%;\\n}\\n\\n.tc-test-case-source .tc-tab-buttons {\\n\\tpadding-top: 0;\\n}\\n\\n.tc-test-case-footer-toolbar {\\n\\tdisplay: flex;\\n\\tjustify-content: flex-end;\\n}\\n\\n.tc-test-case-output {\\n\\tbox-shadow: inset 2px 2px 10px 0px \u003C\u003Ccolour muted-foreground>>;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tborder-radius: 4px;\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tflex: 1 0 49%;\\n\\tmin-width: 250px;\\n\\tpadding: 0.25em 1em;\\n}\\n\\n/*\\n** Flexbox utility classes\\n*/\\n\\n.tc-flex {\\n\\tdisplay: -webkit-flex;\\n\\tdisplay: flex;\\n}\\n\\n.tc-flex-column {\\n\\tflex-direction: column;\\n}\\n\\n.tc-flex-row {\\n\\tflex-direction: row;\\n}\\n\\n.tc-flex-grow-1 {\\n\\tflex-grow: 1;\\n}\\n\\n.tc-flex-grow-2 {\\n\\tflex-grow: 2;\\n}\\n\\n/*\\n** Other utility classes\\n*/\\n\\n/* Horizontal gaps */\\n\\n.tc-tiny-gap {\\n\\tmargin-left: .25em;\\n\\tmargin-right: .25em;\\n}\\n\\n.tc-tiny-gap-left {\\n\\t\u003C\u003Cmargin-start \\\".25em\\\">>\\n}\\n\\n.tc-tiny-gap-right {\\n\\t\u003C\u003Cmargin-end \\\".25em\\\">>\\n}\\n\\n.tc-small-gap {\\n\\tmargin-left: .5em;\\n\\tmargin-right: .5em;\\n}\\n\\n.tc-small-gap-left {\\n\\t\u003C\u003Cmargin-start \\\".5em\\\">>\\n}\\n\\n.tc-small-gap-right {\\n\\t\u003C\u003Cmargin-end \\\".5em\\\">>\\n}\\n\\n.tc-big-gap {\\n\\tmargin-left: 1em;\\n\\tmargin-right: 1em;\\n}\\n\\n.tc-big-gap-left {\\n\\t\u003C\u003Cmargin-start 1em>>\\n}\\n\\n.tc-big-gap-right {\\n\\t\u003C\u003Cmargin-end 1em>>\\n}\\n\\n.tc-word-break {\\n\\tword-break: break-all;\\n}\\n\\n/* Vertical gaps */\\n\\n.tc-tiny-v-gap-bottom {\\n\\tmargin-bottom: 3px;\\n}\\n\\n/* TODO: Remove the following rule once 2020 baseline is supported */\\n@supports not (border-inline-start: 1px solid #000000) {\\n\\tblockquote {\\n\\t\\tborder-left: 5px solid \u003C\u003Ccolour blockquote-bar>>;\\n\\t}\\n\\n\\tblockquote.tc-big-quote {\\n\\t\\tborder-left: none;\\n\\t}\\n\\n\\t.tc-tab-buttons.tc-vertical button {\\n\\t\\tborder-left: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\t\\tborder-right: none;\\n\\t}\\n\\n\\t.tc-tab-buttons.tc-vertical button.tc-tab-selected {\\n\\t\\tborder-right: 1px solid \u003C\u003Ccolour tab-background-selected>>;\\n\\t}\\n\\n\\t.tc-tab-content.tc-vertical {\\n\\t\\tborder-left: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\t}\\n}\\n\\n/* TODO: Remove the following rule once 2021 baseline is supported */\\n@supports not (border-start-start-radius: 0px) {\\n\\t.tc-tab-buttons.tc-vertical button {\\n\\t\\tborder-top-left-radius: 2px;\\n\\t\\tborder-bottom-left-radius: 2px;\\n\\t\\tborder-top-right-radius: 0;\\n\\t\\tborder-bottom-right-radius: 0;\\n\\t}\\n}\\n\\n/* TODO: Remove the following rule once 2021 baseline is supported */\\n@supports not (inset-inline-start: 0) {\\n\\t.tc-tiddler-info-controls {\\n\\t\\tright: 0;\\n\\t}\\n\\n\\t.tc-alert-toolbar {\\n\\t\\tright: 7px;\\n\\t}\\n}\\n\\n/* TODO: Remove the following rule once 2023 baseline is supported */\\n@supports not (float: inline-end) {\\n\\t.tc-test-case-toolbar {\\n\\t\\tfloat: right;\\n\\t}\\n\\n\\t.tc-tiddler-frame .tc-tiddler-controls {\\n\\t\\tfloat: right;\\n\\t}\\n}\"},\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\",\"text\":\"15px\"},\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\",\"text\":\"22px\"},\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\"text\":\"14px\"},\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\"text\":\"20px\"},\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\"text\":\"0px\"},\"$:/themes/tiddlywiki/vanilla/metrics/storytop\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\"text\":\"0px\"},\"$:/themes/tiddlywiki/vanilla/metrics/storyright\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\"text\":\"770px\"},\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\"text\":\"770px\"},\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\",\"text\":\"686px\"},\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\",\"text\":\"960px\"},\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\",\"text\":\"350px\"},\"$:/themes/tiddlywiki/vanilla/options/stickytitles\":{\"title\":\"$:/themes/tiddlywiki/vanilla/options/stickytitles\",\"text\":\"no\"},\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\":{\"title\":\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\",\"text\":\"fluid-fixed\"},\"$:/themes/tiddlywiki/vanilla/options/codewrapping\":{\"title\":\"$:/themes/tiddlywiki/vanilla/options/codewrapping\",\"text\":\"pre-wrap\"},\"$:/themes/tiddlywiki/vanilla/reset\":{\"title\":\"$:/themes/tiddlywiki/vanilla/reset\",\"type\":\"text/css\",\"text\":\"/*! modern-normalize v2.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\\n\\n/*\\nDocument\\n========\\n*/\\n\\n/**\\nUse a better box model (opinionated).\\n*/\\n\\n*,\\n::before,\\n::after {\\n\\tbox-sizing: border-box;\\n}\\n\\nhtml {\\n\\t/* Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) */\\n\\tfont-family:\\n\\t\\tsystem-ui,\\n\\t\\t'Segoe UI',\\n\\t\\tRoboto,\\n\\t\\tHelvetica,\\n\\t\\tArial,\\n\\t\\tsans-serif,\\n\\t\\t'Apple Color Emoji',\\n\\t\\t'Segoe UI Emoji';\\n\\tline-height: 1.15; /* 1. Correct the line height in all browsers. */\\n\\t-webkit-text-size-adjust: 100%; /* 2. Prevent adjustments of font size after orientation changes in iOS. */\\n\\t-moz-tab-size: 4; /* 3. Use a more readable tab size (opinionated). */\\n\\ttab-size: 4; /* 3 */\\n}\\n\\n/*\\nSections\\n========\\n*/\\n\\nbody {\\n\\tmargin: 0; /* Remove the margin in all browsers. */\\n}\\n\\n/*\\nGrouping content\\n================\\n*/\\n\\n/**\\n1. Add the correct height in Firefox.\\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\\n*/\\n\\nhr {\\n\\theight: 0; /* 1 */\\n\\tcolor: inherit; /* 2 */\\n}\\n\\n/*\\nText-level semantics\\n====================\\n*/\\n\\n/**\\nAdd the correct text decoration in Chrome, Edge, and Safari.\\n*/\\n\\nabbr[title] {\\n\\ttext-decoration: underline dotted;\\n}\\n\\n/**\\nAdd the correct font weight in Edge and Safari.\\n*/\\n\\nb,\\nstrong {\\n\\tfont-weight: bolder;\\n}\\n\\n/**\\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\\n2. Correct the odd 'em' font sizing in all browsers.\\n*/\\n\\ncode,\\nkbd,\\nsamp,\\npre {\\n\\tfont-family:\\n\\t\\tui-monospace,\\n\\t\\tSFMono-Regular,\\n\\t\\tConsolas,\\n\\t\\t'Liberation Mono',\\n\\t\\tMenlo,\\n\\t\\tmonospace; /* 1 */\\n\\tfont-size: 1em; /* 2 */\\n}\\n\\n/**\\nAdd the correct font size in all browsers.\\n*/\\n\\nsmall {\\n\\tfont-size: 80%;\\n}\\n\\n/**\\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\\n*/\\n\\nsub,\\nsup {\\n\\tfont-size: 75%;\\n\\tline-height: 0;\\n\\tposition: relative;\\n\\tvertical-align: baseline;\\n}\\n\\nsub {\\n\\tbottom: -0.25em;\\n}\\n\\nsup {\\n\\ttop: -0.5em;\\n}\\n\\n/*\\nTabular data\\n============\\n*/\\n\\n/**\\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\\n2. Correct table border color inheritance in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\\n*/\\n\\ntable {\\n\\ttext-indent: 0; /* 1 */\\n\\tborder-color: inherit; /* 2 */\\n}\\n\\n/*\\nForms\\n=====\\n*/\\n\\n/**\\n1. Change the font styles in all browsers.\\n2. Remove the margin in Firefox and Safari.\\n*/\\n\\nbutton,\\ninput,\\noptgroup,\\nselect,\\ntextarea {\\n\\tfont-family: inherit; /* 1 */\\n\\tfont-size: 100%; /* 1 */\\n\\tline-height: 1.15; /* 1 */\\n\\tmargin: 0; /* 2 */\\n}\\n\\n/**\\nRemove the inheritance of text transform in Edge and Firefox.\\n*/\\n\\nbutton,\\nselect {\\n\\ttext-transform: none;\\n}\\n\\n/**\\nCorrect the inability to style clickable types in iOS and Safari.\\n*/\\n\\nbutton,\\n[type='button'],\\n[type='reset'],\\n[type='submit'] {\\n\\t-webkit-appearance: button;\\n}\\n\\n/**\\nRemove the inner border and padding in Firefox.\\n*/\\n\\n::-moz-focus-inner {\\n\\tborder-style: none;\\n\\tpadding: 0;\\n}\\n\\n/**\\nRestore the focus styles unset by the previous rule.\\n*/\\n\\n:-moz-focusring {\\n\\toutline: 1px dotted ButtonText;\\n}\\n\\n/**\\nRemove the additional ':invalid' styles in Firefox.\\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\\n*/\\n\\n:-moz-ui-invalid {\\n\\tbox-shadow: none;\\n}\\n\\n/**\\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\\n*/\\n\\nlegend {\\n\\tpadding: 0;\\n}\\n\\n/**\\nAdd the correct vertical alignment in Chrome and Firefox.\\n*/\\n\\nprogress {\\n\\tvertical-align: baseline;\\n}\\n\\n/**\\nCorrect the cursor style of increment and decrement buttons in Safari.\\n*/\\n\\n::-webkit-inner-spin-button,\\n::-webkit-outer-spin-button {\\n\\theight: auto;\\n}\\n\\n/**\\n1. Correct the odd appearance in Chrome and Safari.\\n2. Correct the outline style in Safari.\\n*/\\n\\n[type='search'] {\\n\\t-webkit-appearance: textfield; /* 1 */\\n\\toutline-offset: -2px; /* 2 */\\n}\\n\\n/**\\nRemove the inner padding in Chrome and Safari on macOS.\\n*/\\n\\n::-webkit-search-decoration {\\n\\t-webkit-appearance: none;\\n}\\n\\n/**\\n1. Correct the inability to style clickable types in iOS and Safari.\\n2. Change font properties to 'inherit' in Safari.\\n*/\\n\\n::-webkit-file-upload-button {\\n\\t-webkit-appearance: button; /* 1 */\\n\\tfont: inherit; /* 2 */\\n}\\n\\n/*\\nInteractive\\n===========\\n*/\\n\\n/*\\nAdd the correct display in Chrome and Safari.\\n*/\\n\\nsummary {\\n\\tdisplay: list-item;\\n}\\n\"},\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\":{\"title\":\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\",\"text\":\"-apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", \\\"Noto Sans\\\", sans-serif, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\"},\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\":{\"title\":\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\",\"text\":\"ui-monospace, \\\"SFMono-Regular\\\", \\\"SF Mono\\\", Menlo, Consolas, \\\"Liberation Mono\\\", monospace\"},\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\":{\"title\":\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\",\"text\":\"fixed\"},\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\":{\"title\":\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\",\"text\":\"auto\"},\"$:/themes/tiddlywiki/vanilla/sticky\":{\"title\":\"$:/themes/tiddlywiki/vanilla/sticky\",\"code-body\":\"yes\",\"text\":\"\u003C$reveal state=\\\"$:/themes/tiddlywiki/vanilla/options/stickytitles\\\" type=\\\"match\\\" text=\\\"yes\\\">\\n``\\n.tc-tiddler-title {\\n\\tposition: -webkit-sticky;\\n\\tposition: -moz-sticky;\\n\\tposition: -o-sticky;\\n\\tposition: -ms-sticky;\\n\\tposition: sticky;\\n\\ttop: 0px;\\n\\tbackground: ``\u003C\u003Ccolour tiddler-background>>``;\\n\\tz-index: 500;\\n}\\n\\n``\\n\u003C$list filter=\\\"[range[100]]\\\">\\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`\u003C$text text=\u003C\u003CcurrentTiddler>>/>`) {\\nz-index: `\u003C$text text={{{ [[200]subtract\u003CcurrentTiddler>] }}}/>`;\\n}\\n`\\n\u003C/$list>\\n\u003C/$reveal>\\n\"},\"$:/themes/tiddlywiki/vanilla/themetweaks\":{\"title\":\"$:/themes/tiddlywiki/vanilla/themetweaks\",\"tags\":\"$:/tags/ControlPanel/Appearance\",\"caption\":\"{{$:/language/ThemeTweaks/ThemeTweaks}}\",\"text\":\"\\\\define lingo-base() $:/language/ThemeTweaks/\\n\\n\\\\define replacement-text()\\n[img[$(imageTitle)$]]\\n\\\\end\\n\\n\\\\define backgroundimage-dropdown()\\n\u003Cdiv class=\\\"tc-drop-down-wrapper\\\">\\n\u003C$set name=\\\"state\\\" value=\u003C\u003Cqualify \\\"$:/state/popup/themetweaks/backgroundimage\\\">>>\\n\u003C$button popup=\u003C\u003Cstate>> class=\\\"tc-btn-invisible tc-btn-dropdown\\\">{{$:/core/images/down-arrow}}\u003C/$button>\\n\u003C$reveal state=\u003C\u003Cstate>> type=\\\"popup\\\" position=\\\"belowleft\\\" text=\\\"\\\" default=\\\"\\\" class=\\\"tc-popup-keep\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\" style=\\\"text-align:center;\\\">\\n\u003C$macrocall $name=\\\"image-picker\\\" actions=\\\"\\\"\\\"\\n\\n\u003C$action-setfield\\n\\t$tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\\\"\\n\\t$value=\u003C\u003CimageTitle>>\\n/>\\n\\n\u003C$action-deletetiddler $tiddler=\u003C\u003Cstate>>/>\\n\\n\\\"\\\"\\\"/>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C/$set>\\n\u003C/div>\\n\\\\end\\n\\n\\\\define backgroundimageattachment-dropdown()\\n\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\\\" default=\\\"scroll\\\">\\n\u003Coption value=\\\"scroll\\\">\u003C\u003Clingo Settings/BackgroundImageAttachment/Scroll>>\u003C/option>\\n\u003Coption value=\\\"fixed\\\">\u003C\u003Clingo Settings/BackgroundImageAttachment/Fixed>>\u003C/option>\\n\u003C/$select>\\n\\\\end\\n\\n\\\\define backgroundimagesize-dropdown()\\n\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\\\" default=\\\"scroll\\\">\\n\u003Coption value=\\\"auto\\\">\u003C\u003Clingo Settings/BackgroundImageSize/Auto>>\u003C/option>\\n\u003Coption value=\\\"cover\\\">\u003C\u003Clingo Settings/BackgroundImageSize/Cover>>\u003C/option>\\n\u003Coption value=\\\"contain\\\">\u003C\u003Clingo Settings/BackgroundImageSize/Contain>>\u003C/option>\\n\u003C/$select>\\n\\\\end\\n\\n\u003C\u003Clingo ThemeTweaks/Hint>>\\n\\n! \u003C\u003Clingo Options>>\\n\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\\\">\u003C\u003Clingo Options/SidebarLayout>>\u003C/$link> |\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\\\">\u003Coption value=\\\"fixed-fluid\\\">\u003C\u003Clingo Options/SidebarLayout/Fixed-Fluid>>\u003C/option>\u003Coption value=\\\"fluid-fixed\\\">\u003C\u003Clingo Options/SidebarLayout/Fluid-Fixed>>\u003C/option>\u003C/$select> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/options/stickytitles\\\">\u003C\u003Clingo Options/StickyTitles>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Options/StickyTitles/Hint>>// |\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/options/stickytitles\\\">\u003Coption value=\\\"no\\\">{{$:/language/No}}\u003C/option>\u003Coption value=\\\"yes\\\">{{$:/language/Yes}}\u003C/option>\u003C/$select> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/options/codewrapping\\\">\u003C\u003Clingo Options/CodeWrapping>>\u003C/$link> |\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/options/codewrapping\\\">\u003Coption value=\\\"pre\\\">{{$:/language/No}}\u003C/option>\u003Coption value=\\\"pre-wrap\\\">{{$:/language/Yes}}\u003C/option>\u003C/$select> |\\n\\n! \u003C\u003Clingo Settings>>\\n\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\\\">\u003C\u003Clingo Settings/FontFamily>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\\\" default=\\\"\\\" tag=\\\"input\\\"/> | |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\\\">\u003C\u003Clingo Settings/CodeFontFamily>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\\\" default=\\\"\\\" tag=\\\"input\\\"/> | |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\\\">\u003C\u003Clingo Settings/EditorFontFamily>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\\\" default=\\\"\\\" tag=\\\"input\\\"/> | |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\\\">\u003C\u003Clingo Settings/BackgroundImage>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\u003C\u003Cbackgroundimage-dropdown>> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\\\">\u003C\u003Clingo Settings/BackgroundImageAttachment>>\u003C/$link> |\u003C\u003Cbackgroundimageattachment-dropdown>> | |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\\\">\u003C\u003Clingo Settings/BackgroundImageSize>>\u003C/$link> |\u003C\u003Cbackgroundimagesize-dropdown>> | |\\n\\n! \u003C\u003Clingo Metrics>>\\n\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\\\">\u003C\u003Clingo Metrics/FontSize>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\\\">\u003C\u003Clingo Metrics/LineHeight>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\\\">\u003C\u003Clingo Metrics/BodyFontSize>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\\\">\u003C\u003Clingo Metrics/BodyLineHeight>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\\\">\u003C\u003Clingo Metrics/StoryLeft>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/StoryLeft/Hint>>// |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/storytop\\\">\u003C\u003Clingo Metrics/StoryTop>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/StoryTop/Hint>>// |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/storytop\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/storyright\\\">\u003C\u003Clingo Metrics/StoryRight>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/StoryRight/Hint>>// |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/storyright\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\\\">\u003C\u003Clingo Metrics/StoryWidth>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/StoryWidth/Hint>>// |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\\\">\u003C\u003Clingo Metrics/TiddlerWidth>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/TiddlerWidth/Hint>>//\u003Cbr> |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\\\">\u003C\u003Clingo Metrics/SidebarBreakpoint>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/SidebarBreakpoint/Hint>>// |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\\\">\u003C\u003Clingo Metrics/SidebarWidth>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/SidebarWidth/Hint>>// |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n\"}}}"},
{"title":"$:/themes/tiddlywiki/vanilla/options/sidebarlayout","text":"fluid-fixed"},
{"title":"$:/themes/wikilabs/roundedtabs","name":"Rounded Tabs","author":"pmario","core-version":">=5.0.0","plugin-type":"theme","description":"Segmented-control style rounded tabs","dependents":"$:/themes/tiddlywiki/snowwhite","list":"readme license","plugin-priority":"10","version":"5.4.1-prerelease","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/wikilabs/roundedtabs/base\":{\"title\":\"$:/themes/wikilabs/roundedtabs/base\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\\n\\n/* Segmented control tabs */\\n\\n.tc-tab-buttons {\\n\\tdisplay: inline-flex;\\n\\tgap: 2px;\\n\\tpadding: 2px;\\n\\tbackground-color: \u003C\u003Ccolour tab-background>>;\\n\\tbackground-image: linear-gradient(rgba(128,128,128,0.12), rgba(128,128,128,0.12));\\n\\tborder-radius: 8px;\\n\\tborder: none;\\n\\tfont-size: 0.95em;\\n}\\n\\n.tc-tab-buttons button {\\n\\tbackground: transparent;\\n\\tborder: 1px solid transparent;\\n\\tborder-radius: 6px;\\n\\tpadding: 0.382em 0.618em;\\n\\tcolor: \u003C\u003Ccolour tab-foreground>>;\\n\\tborder-bottom-left-radius: 7px;\\n\\tborder-bottom-right-radius: 7px;\\n\\tmargin-right: 0;\\n}\\n\\n.tc-tab-buttons button.tc-tab-selected {\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tfont-weight: 600;\\n\\tborder: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tbox-shadow: inset 0 0 0 1px rgba(128,128,128,0.2);\\n}\\n\\n.tc-tab-buttons button:hover:not(.tc-tab-selected) {\\n\\tbackground: transparent;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-tab-divider {\\n\\tborder-top: none;\\n}\\n\\n/* Sidebar overrides — vanilla's .tc-sidebar-lists rules have higher specificity */\\n\\n.tc-sidebar-lists .tc-tab-buttons {\\n\\tmargin-top: .6em;\\n}\\n\\n.tc-sidebar-lists .tc-tab-buttons button {\\n\\tbackground: transparent;\\n\\tbackground-color: transparent;\\n\\tborder: 1px solid transparent;\\n\\tcolor: \u003C\u003Ccolour tab-foreground>>;\\n}\\n\\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tbackground-color: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tborder: 1px solid \u003C\u003Ccolour tab-border>>;\\n}\\n\\n.tc-sidebar-lists .tc-tab-buttons button:hover:not(.tc-tab-selected) {\\n\\tbackground: transparent;\\n\\tbackground-color: transparent;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n}\\n\\n/* link-to-tabs offset fix */\\n.wltc-link-to-tab {\\n\\ttop: -.6em;\\n\\tleft: -1.1em;\\n\\tfont-size: 0.6em;\\n}\"},\"$:/themes/wikilabs/roundedtabs/license\":{\"title\":\"$:/themes/wikilabs/roundedtabs/license\",\"license-text\":\"https://opensource.org/license/BSD-3-clause/\",\"text\":\"[[Rounded Tabs|https://wikilabs.github.io/#roundedtabs]] (c) Mario Pietsch - 2026-\u003C\u003Cnow YYYY>>\\n\\n[[https://opensource.org/license/BSD-3-clause/]]\\n\"},\"$:/themes/wikilabs/roundedtabs/readme\":{\"title\":\"$:/themes/wikilabs/roundedtabs/readme\",\"caption\":\"Rounded Tabs\",\"tags\":\"$:/tags/ControlPanel/WikiLabs\",\"text\":\"A theme that restyles the core `.tc-tab-buttons` markup as a ''segmented control'' — a rounded pill-shaped container holding the tab buttons, with the selected tab raised on the page background.\\n\\n!! Look and feel\\n\\n* Container with rounded corners (`8px`), a faint translucent overlay, and the palette's `tab-background` colour\\n* Inactive buttons are transparent with the `tab-foreground` colour\\n* The selected button sits on the page `background` colour, is bolded, and gets a 1-pixel inset highlight\\n* Sidebar tabs follow the same pattern but with sidebar-appropriate margins\\n* Includes a small offset fix for the [[link-to-tabs|$:/plugins/wikilabs/link-to-tabs]] indicator\\n\\n!! Dependencies\\n\\nDepends on `$:/themes/tiddlywiki/snowwhite` for default colours and base styling. Activate it from the Control Panel under ''Appearance → Theme''.\\n\"}}}"},
{"title":"$:/themes/wikilabs/slant-01","name":"Slant 01","author":"Mario Pietsch","core-version":">=5.1.10","version":"0.5.0","plugin-type":"theme","description":"slant-01 - an opinionated theme","dependents":"$:/themes/tiddlywiki/snowwhite $:/themes/wikilabs/underlinedtabs $:/plugins/wikilabs/info-tagmap $:/plugins/wikilabs/multicol-dropdown","list":"license readme history","type":"application/json","text":"{\"tiddlers\":{\"$:/config/ViewTemplateTagsFilters/hide\":{\"title\":\"$:/config/ViewTemplateTagsFilters/hide\",\"created\":\"20260514164505055\",\"list-before\":\"\",\"modified\":\"20260514223826307\",\"tags\":\"$:/tags/ViewTemplateTagsFilter\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"[\u003CtiddlerInfoState>get[text]!is[blank]] :filter[[$:/state/infotab/]addsuffix\u003CstoryTiddler>get[text]match[$:/wikilabs/ui/TiddlerInfo/TagMap]] :then[[ ]]\\n\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info\",\"created\":\"20160714085429897\",\"modified\":\"20160714085430957\",\"type\":\"text/vnd.tiddlywiki\",\"tags\":\"$:/wikilabs/ui\",\"text\":\"show\"},\"$:/themes/wikilabs/slant-01/history\":{\"title\":\"$:/themes/wikilabs/slant-01/history\",\"text\":\"V 0.5.0 2026.05.15\\n\\n* No longer deprecated. Modernised to use TW core templates as much as possible\\n* Slant look reduced to a compact title bar with controls absolutely positioned (CSS-only relative to core DOM)\\n* Subtitle (modifier + ISO modified date) is now rendered inline beside the title and wraps below when the title is long\\n* Tag pills now open the Tiddler Info panel on the Tag Map tab directly, instead of the core dropdown\\n* Standalone tag row hides while the Tag Map tab is open in the info panel, so tags are not duplicated\\n* Removed redundant overrides: ViewTemplate, ViewTemplate/controls, ViewTemplate/info, ViewTemplate/tags, $:/tags/ViewTemplate, wikilabs/macros/tabs-state\\n\\nV 0.4.0 2023.01.13\\n\\n* is still deprecated\\n* remove plugin dependency info-session, because it can be configured in TW now\\n\\nV 0.3.1 2022.08.04\\n\\n* is still deprecated\\n* update to TW v5.2.3\\n\\nV 0.3.0 2022.03.28\\n\\n* temporarily add deprecated to the version number\\n* update to TW v5.2.2\\n\\nV 0.3.0 2020.06.11\\n\\n* Fix SVG icon position in \\\"more\\\" dropdown\\n* Adjust tiddler toolbar icon positions\\n* Tag pill bottom margin made smaller\\n\\nV 0.2.1 2016.07.15\\n\\n* Initial version\\n\"},\"$:/themes/wikilabs/slant-01/license\":{\"title\":\"$:/themes/wikilabs/slant-01/license\",\"text\":\"Slant-01 Theme (c) Mario Pietsch - 2016 - \u003C\u003Cnow YYYY>>\\n\\nhttps://creativecommons.org/licenses/by-nc-sa/4.0/\"},\"$:/themes/wikilabs/slant-01/readme\":{\"title\":\"$:/themes/wikilabs/slant-01/readme\",\"text\":\"! Overview\\n\\nThis is an opinionated theme, used by pmario.\\n\\n* Compact title bar: subtitle (modifier + relative modified date) sits inline to the right of the title and wraps below when the title is long\\n* Tiddler toolbar controls float to the top right of the title row\\n* Clicking a tag pill opens the Tiddler Info panel and selects the //Tag Map// tab directly\\n\\n!! License\\n\\nCC-BY-NC-SA - {{$:/themes/wikilabs/slant-01/license}}\\n\\n''Important:'' This theme overrides the following core templates\\n\\n\u003Cul>\u003C$list filter=\\\"[[$:/themes/wikilabs/slant-01]plugintiddlers[]prefix[$:/core/]] \\\">\u003Cli>\u003C$link to=\u003C\u003CcurrentTiddler>>>\u003C\u003CcurrentTiddler>>\u003C/$link>\u003C/li>\u003C/$list>\u003C/ul>\\n\"},\"$:/themes/wikilabs/slant-01/Stylesheet\":{\"title\":\"$:/themes/wikilabs/slant-01/Stylesheet\",\"tags\":\"$:/tags/Stylesheet\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"/* slant-01: compact title row, controls floated to the top-right.\\n Scoped to .tc-tiddler-view-frame so the EditTemplate is left alone. */\\n\\n.tc-tiddler-view-frame .tc-tiddler-title {\\n\\tposition: relative;\\n}\\n\\n.tc-tiddler-view-frame .tc-tiddler-title .tc-titlebar {\\n\\tdisplay: flex;\\n\\tflex-wrap: wrap;\\n\\talign-items: baseline;\\n\\tcolumn-gap: 1em;\\n\\trow-gap: 0.1em;\\n\\tpadding-right: 7em;\\n\\tmargin-bottom: 1em;\\n\\tfont-size: 1.1em;\\n}\\n\\n.tc-tiddler-view-frame .tc-tiddler-title > .tc-tiddler-controls {\\n\\tposition: absolute;\\n\\ttop: 0;\\n\\tright: 0;\\n\\tfont-size: 2em;\\n}\\n\\n.tc-tiddler-view-frame .tc-tiddler-title .tc-tiddler-title-icon {\\n\\tmargin-inline-end: 0.35em;\\n}\\n\\n.tc-tiddler-view-frame .tc-tiddler-title > .tc-tiddler-controls .tc-image-button {\\n\\tvertical-align: top;\\n}\\n\\n.tc-tiddler-view-frame .tc-tiddler-title > .tc-tiddler-controls .tc-drop-down .tc-image-button {\\n\\tvertical-align: unset;\\n}\\n\\n.tc-tiddler-view-frame .tc-titlebar .wltc-subtitle {\\n\\tfont-size: 0.7em;\\n\\twhite-space: nowrap;\\n}\\n\\n.tc-tiddler-view-frame .tc-tags-wrapper {\\n\\tpadding-top: 2px;\\n\\tmargin-top: -0.4em;\\n\\tmargin-bottom: 0.3em;\\n}\\n\\n.tc-tiddler-view-frame .tc-tiddler-body {\\n\\tborder-top: thin solid lightgray;\\n}\\n\\n.tc-tiddler-view-frame .tc-tiddler-info {\\n\\tpadding-right: 12px;\\n}\\n\"},\"$:/core/ui/TagTemplate\":{\"title\":\"$:/core/ui/TagTemplate\",\"text\":\"\\\\whitespace trim\\n\u003Cspan class=\\\"tc-tag-list-item\\\" data-tag-title=\u003C\u003CcurrentTiddler>>>\\n\\t\u003C$let tabState={{{ [[$:/state/infotab/]addsuffix\u003CstoryTiddler>] }}}>\\n\\t\\t\u003C$macrocall $name=\\\"tag-pill-body\\\"\\n\\t\\t\\ttag=\u003C\u003CcurrentTiddler>>\\n\\t\\t\\ticon={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}\\n\\t\\t\\tcolour={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}\\n\\t\\t\\tpalette={{$:/palette}}\\n\\t\\t\\telement-tag=\\\"$button\\\"\\n\\t\\t\\telement-attributes=\\\"\\\"\\\"tag='span'\\\"\\\"\\\"\\n\\t\\t\\tactions=\\\"\\\"\\\"\u003C$action-setfield $tiddler=\u003C\u003CtiddlerInfoState>> text=\\\"yes\\\"/>\u003C$action-setfield $tiddler=\u003C\u003CtabState>> text=\\\"$:/wikilabs/ui/TiddlerInfo/TagMap\\\"/>\\\"\\\"\\\"\\n\\t\\t/>\\n\\t\u003C/$let>\\n\u003C/span>\\n\"},\"$:/core/ui/TiddlerInfo\":{\"title\":\"$:/core/ui/TiddlerInfo\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv style=\\\"position:relative;\\\">\\n\u003Cdiv class=\\\"tc-tiddler-controls tc-tiddler-info-controls\\\">\\n\u003C$reveal state=\\\"$:/config/TiddlerInfo/Mode\\\" type=\\\"match\\\" text=\\\"sticky\\\">\\n\u003C$button set=\u003C\u003CtiddlerInfoState>> setTo=\\\"\\\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/close-button}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/div>\\n\u003C/div>\\n\\n\u003C$let tabState={{{ [[$:/state/infotab/]addsuffix\u003CstoryTiddler>] }}}>\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\\\" default={{$:/config/TiddlerInfo/Default}} explicitState=\u003C\u003CtabState>>/>\\n\u003C/$let>\\n\\n\"},\"$:/core/ui/ViewTemplate/subtitle\":{\"title\":\"$:/core/ui/ViewTemplate/subtitle\"},\"$:/core/ui/ViewTemplate/title\":{\"title\":\"$:/core/ui/ViewTemplate/title\",\"tags\":\"$:/tags/ViewTemplate\",\"text\":\"\\\\whitespace trim\\n\\\\define title-styles() fill:$(foregroundColor)$;\\n\\n\u003Cdiv class=\\\"tc-tiddler-title tc-clearfix\\\">\\n\\t\u003Cspan class=\\\"tc-tiddler-controls\\\">\\n\\t\\t\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] :filter[lookup[$:/config/ViewToolbarButtons/Visibility/]!match[hide]]\\\"\\n\\t\\t\\tstoryview=\\\"pop\\\"\\n\\t\\t\\tvariable=\\\"listItem\\\"\\n\\t\\t>\\n\\t\\t\\t\u003C$let condition={{{ [\u003ClistItem>get[condition]] }}}>\\n\\t\\t\\t\\t\u003C%if [\u003Ccondition>!is[blank]] :and[\u003CcurrentTiddler>subfilter\u003Ccondition>limit[1]] :else[\u003Ccondition>is[blank]then[true]] %>\\n\\t\\t\\t\\t\\t\u003C$set name=\\\"tv-config-toolbar-class\\\" filter=\\\"[\u003Ctv-config-toolbar-class>] [\u003ClistItem>encodeuricomponent[]addprefix[tc-btn-]]\\\">\\n\\t\\t\\t\\t\\t\\t\u003C$transclude tiddler=\u003C\u003ClistItem>>/>\\n\\t\\t\\t\\t\\t\u003C/$set>\\n\\t\\t\\t\\t\u003C%endif%>\\n\\t\\t\\t\u003C/$let>\\n\\t\\t\u003C/$list>\\n\\t\u003C/span>\\n\\t\u003Cdiv class=\\\"tc-titlebar\\\">\\n\\t\\t\u003C$set name=\\\"tv-wikilinks\\\" value={{$:/config/Tiddlers/TitleLinks}}>\\n\\t\\t\\t\u003C$link>\\n\\t\\t\\t\\t\u003C$list filter=\\\"[\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] +[!is[blank]]\\\" variable=\\\"ignore\\\">\\n\\t\\t\\t\\t\\t\u003C$let foregroundColor={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}>\\n\\t\\t\\t\\t\\t\\t\u003Cspan class=\\\"tc-tiddler-title-icon\\\" style=\u003C\u003Ctitle-styles>>>\\n\\t\\t\\t\\t\\t\\t\\t{{||$:/core/ui/TiddlerIcon}}\\n\\t\\t\\t\\t\\t\\t\u003C/span>\\n\\t\\t\\t\\t\\t\u003C/$let>\\n\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\u003C$transclude tiddler={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateTitleFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/title/default]] }}}/>\\n\\t\\t\\t\u003C/$link>\\n\\t\\t\u003C/$set>\\n\\t\\t\u003Cspan class=\\\"tc-subtitle wltc-subtitle\\\">\\n\\t\\t\\t\u003C$link to={{!!modifier}}>\u003C$view field=\\\"modifier\\\"/>\u003C/$link> \u003C$view field=\\\"modified\\\" format=\\\"date\\\" template=\\\"YYYY-0MM-0DD\\\"/>\\n\\t\\t\u003C/span>\\n\\t\u003C/div>\\n\\t\u003C$reveal tag=\\\"div\\\" type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\" state=\u003C\u003CtiddlerInfoState>> class=\\\"tc-tiddler-info tc-popup-handle\\\" animate=\\\"yes\\\" retain=\\\"yes\\\">\\n\\t\\t\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\\\" variable=\\\"listItem\\\">\\n\\t\\t\\t\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"block\\\"/>\\n\\t\\t\u003C/$list>\\n\\t\u003C/$reveal>\\n\u003C/div>\\n\\n\"}}}"},
{"title":"$:/themes/wikilabs/underlinedtabs","name":"Underlined Tabs","author":"pmario","core-version":">=5.0.0","plugin-type":"theme","description":"Segmented-control style underlined tabs","dependents":"$:/themes/tiddlywiki/snowwhite $:/plugins/wikilabs/new-style","list":"readme license","plugin-priority":"10","version":"5.4.1-prerelease","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/wikilabs/underlinedtabs/base\":{\"title\":\"$:/themes/wikilabs/underlinedtabs/base\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\\n\\n/* Underlined tabs — flat buttons with a coloured underline on the selected tab */\\n\\n@keyframes tc-underlinedtabs-first-slide-in {\\n\\tfrom { padding-left: 0; }\\n}\\n\\n@keyframes tc-underlinedtabs-first-slide-out {\\n\\tfrom { padding-left: 8px; }\\n}\\n\\n.tc-tab-buttons {\\n\\tdisplay: flex;\\n\\tgap: 0;\\n\\tpadding: 0;\\n\\tbackground: transparent;\\n\\tborder: none;\\n\\tborder-bottom: none;\\n\\tborder-radius: 0;\\n\\tfont-size: 1em;\\n}\\n\\n.tc-tab-buttons button {\\n\\tbackground: transparent;\\n\\tborder: none;\\n\\tborder-bottom: 2px solid transparent;\\n\\tborder-radius: 0;\\n\\tpadding: 4px 8px;\\n\\tmargin-right: 8px;\\n\\tmargin-bottom: -1px;\\n\\tcolor: \u003C\u003Ccolour tab-foreground>>;\\n\\tfont-weight: normal;\\n}\\n\\n.tc-tab-buttons button.tc-tab-selected {\\n\\tbackground: transparent;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tfont-weight: 600;\\n\\tborder: none;\\n\\tborder-bottom: 2px solid \u003C\u003Ccolour primary>>;\\n}\\n\\n.tc-tab-buttons button:hover:not(.tc-tab-selected) {\\n\\tbackground: transparent;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tborder-bottom-color: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-tab-buttons button:first-child:not(.tc-tab-selected) {\\n\\tpadding-left: 0;\\n}\\n\\n.tc-tab-buttons button.tc-uit-anim-in {\\n\\tanimation: tc-underlinedtabs-first-slide-in 200ms ease-out;\\n}\\n\\n.tc-tab-buttons button.tc-uit-anim-out {\\n\\tanimation: tc-underlinedtabs-first-slide-out 300ms ease-out;\\n}\\n\\n.tc-tab-divider {\\n\\t\u003C!-- Devider needed for control panel nested tabs -->\\n\\t\u003C!-- display: none; -->\\n}\\n\\n/* Sidebar overrides — vanilla's .tc-sidebar-lists rules have higher specificity */\\n\\n.tc-sidebar-lists .tc-tab-buttons {\\n\\tmargin-top: 1em;\\n}\\n\\n.tc-sidebar-lists .tc-tab-buttons button {\\n\\tbackground: transparent;\\n\\tbackground-color: transparent;\\n\\tborder: none;\\n\\tborder-bottom: 2px solid transparent;\\n\\tcolor: \u003C\u003Ccolour tab-foreground>>;\\n\\tpadding: 6px 4px 4px;\\n\\tmargin-right: 4px;\\n}\\n\\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\\n\\tbackground: transparent;\\n\\tbackground-color: transparent;\\n\\tborder: none;\\n\\tborder-bottom: 2px solid \u003C\u003Ccolour primary>>;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-sidebar-lists .tc-tab-buttons button:hover:not(.tc-tab-selected) {\\n\\tbackground: transparent;\\n\\tbackground-color: transparent;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tborder-bottom-color: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n/* link-to-tabs offset fix */\\n.wltc-link-to-tab {\\n\\ttop: -.4em;\\n\\tleft: -1.1em;\\n\\tfont-size: 0.55em;\\n}\"},\"$:/themes/wikilabs/underlinedtabs/license\":{\"title\":\"$:/themes/wikilabs/underlinedtabs/license\",\"license-text\":\"https://opensource.org/license/BSD-3-clause/\",\"text\":\"[[Underlined Tabs|https://wikilabs.github.io/#underlinedtabs]] (c) Mario Pietsch - 2026-\u003C\u003Cnow YYYY>>\\n\\n[[https://opensource.org/license/BSD-3-clause/]]\\n\"},\"$:/themes/wikilabs/underlinedtabs/readme\":{\"title\":\"$:/themes/wikilabs/underlinedtabs/readme\",\"caption\":\"Underlined Tabs\",\"tags\":\"$:/tags/ControlPanel/WikiLabs\",\"text\":\"A theme that restyles the core `.tc-tab-buttons` markup as flat tab buttons over the page background, with the selected tab marked by a 2-pixel coloured underline.\\n\\n!! Look and feel\\n\\n* Flat tab buttons, no container background, no border\\n* The selected button is bolded and gets a 2-pixel underline in the palette's `primary` colour\\n* Hovering over an inactive tab shows a muted underline\\n* The first tab sits flush with the left edge when not selected\\n* Sidebar tabs follow the same pattern with sidebar-appropriate spacing\\n* Includes a small offset fix for the [[link-to-tabs|$:/plugins/wikilabs/link-to-tabs]] indicator\\n\\n!! Optional first-tab animation\\n\\nWhen the first tab's selected state changes, an optional slide-in / slide-out animation can be played. The matching keyframes (`tc-underlinedtabs-first-slide-in` and `tc-underlinedtabs-first-slide-out`) ship with this theme; the JavaScript that adds the trigger classes lives in the [[New Style|$:/plugins/wikilabs/new-style]] plugin. Install that plugin alongside this theme to enable the animation. Without it the theme still works — there is just no animation.\\n\\n!! Dependencies\\n\\nDepends on `$:/themes/tiddlywiki/snowwhite` for default colours and base styling, and optionally on `$:/plugins/wikilabs/new-style` for the first-tab animation. Activate it from the Control Panel under ''Appearance → Theme''.\\n\"}}}"},
{"title":"$:/warning","created":"20210324150050449","modified":"20210324152839336","tags":"$:/tags/AboveStory","text":"!! This wiki was automatically built, to be used by the community links aggregator: ~https://links.tiddlywiki.org\n\nThis wiki may not contain the latest or all the information\n\n! Please use: https://wikilabs.github.io/ instead!"},
{"title":"$:/wikilabs/save/community-links-big","created":"20210322130148311","modified":"20210322130159768","tags":"","type":"text/vnd.tiddlywiki","text":"\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[system]] [tag[$:/tags/Link]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[prefix[$:/plugins/]] -[prefix[$:/state/]] -[[$:/SiteTitle]] -[prefix[$:/themes/wikilabs/]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},
{"title":"$:/wikilabs/save/wikilabs-links","created":"20210323193740651","modified":"20210324145221220","type":"text/vnd.tiddlywiki","text":"\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[prefix[$:/plugins/]![$:/plugins/wikilabs/info-tagmap]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5-external-js.html}}\n"},
{"title":"$:/wikilabs/template/theme","created":"20170203113552821","modified":"20210324145654670","tags":"$:/tags/ViewTemplate","type":"text/vnd.tiddlywiki","text":"\u003C$list filter=\"[all[current]regexp:tags[plugin|edition|theme|EXPERIMENTAL]]\">\n\n! Demo\n\n* see: {{!!url}}\n\n! Feedback\n\n* Forum: {{!!forum}}\n* GitHub: {{!!git-issues}}\n\n! Repository\n\n* Source Code: {{!!git-repo}}\n\u003C/$list>"},
{"title":"Advanced-Search","created":"20210324163934427","modified":"20210324163943593","type":"text/vnd.tiddlywiki"},
{"title":"advanced-search-plus","created":"20170203102703314","description":"This plugin adds the advanced search tiddler to the right sidebar. To do so, the caption text is replaced by icons.","forum":"https://talk.tiddlywiki.org/t/intro-advanced-search-plus-asp-for-advanced-users-and-developers/5875","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/advanced-search-plus","modified":"20230113132056458","tags":"plugin $:/tags/Link Search Tools Development","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/advanced-search-plus","text":"! Advanced Search Plugin\n\nThis plugin adds the advanced search tiddler to the right sidebar. To do so, the caption text is replaced by icons.\n\n\u003Cp>\n\u003Cspan class=\"tc-big-gap\">\u003Csvg class=\"wlc-image-standard-search tc-image-button\" fill=\"#666\" height=\"22pt\" viewBox=\"0 0 128 128\" width=\"22pt\">\n\t\u003Cg fill-rule=\"evenodd\">\n\t\t\u003Cpath d=\"M47,0.91c-25,0-46,21-46,47s21,47,47,47,46-21,47-47h0.062v-0.56h-0.062c-1-25-21-46-48-46zm0,17c18,0,30,13,30,30-0.15,17-14,30-30,30s-30-12-30-30c0-17,14-30,30-30z\">\u003C/path>\n\t\t\u003Cpath d=\"m73,68a8.4,8.4,0,0,0,-5.5,15l42,40a8.4,8.4,0,1,0,12,-12l-41-39a8.4,8.4,0,0,0,-6,-3z\">\u003C/path>\n\t\u003C/g>\n\u003C/svg>\n Standard\u003C/span>\u003Cspan class=\"tc-big-gap\">\u003Csvg class=\"wlc-image-system-search tc-image-button\" height=\"22pt\" viewBox=\"0 0 128 128\" width=\"22pt\">\n\t\u003Cg fill-rule=\"evenodd\" transform=\"matrix(3.0903637,0,0,3.0903637,-479.01263,-89.708399)\">\n\t\t\u003Cg>\n\t\t\t\u003Cpath d=\"m170,60,0-9.5c-3-0.85-5.1-2.1-6.5-3.9-1.4-1.7-2.1-3.8-2.1-6.3s0.78-4.6,2.4-6.3,3.7-2.7,6.3-2.9v-2.2h3.3v2.2c2.4,0.29,4.3,1.1,5.8,2.5,1.4,1.4,2.3,3.2,2.7,5.4l-5.8,0.75c-0.35-1.8-1.3-3-2.7-3.6v8.9c3.6,0.98,6.1,2.3,7.4,3.8,1.3,1.6,2,3.6,2,6-0.00003,2.7-0.83,5.1-2.5,6.9-1.7,1.9-4,3-6.9,3.5v4.2h-3.3v-4.1c-2.6-0.32-4.8-1.3-6.4-2.9s-2.7-3.9-3.1-6.9l5.9-0.64c0.24,1.2,0.7,2.3,1.4,3.1,0.67,0.88,1.4,1.5,2.2,1.9zm0-24c-0.89,0.3-1.6,0.82-2.1,1.5-0.53,0.73-0.8,1.5-0.8,2.4-0.00001,0.8,0.24,1.5,0.73,2.2,0.48,0.69,1.2,1.2,2.2,1.7zm3.3,24c1.1-0.21,2.1-0.74,2.8-1.6,0.71-0.84,1.1-1.8,1.1-3-0.00002-1-0.3-1.9-0.9-2.6-0.6-0.73-1.6-1.3-2.9-1.7z\">\u003C/path>\n\t\t\u003C/g>\n\t\u003C/g>\n\u003C/svg>\n\n System\u003C/span>\u003Cspan class=\"tc-big-gap\">\u003Csvg class=\"wlc-image-shadow-search tc-image-button\" width=\"22pt\" height=\"22pt\" version=\"1.1\" viewBox=\"0 0 128 128\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\">\u003Cg transform=\"matrix(.738 .28 -.28 .738 99.3 -9.09)\" style=\"fill-rule:evenodd;fill:#999;stroke-width:1.27\">\u003Cg transform=\"translate(-37.8 10.8)\" fill-rule=\"evenodd\" style=\"fill:#999;stroke-width:1.44\">\u003Cpath d=\"m1 47.9c0 26 21 47 47 47s46-21 47-47h0.062v-0.56h-0.062c-1-25-21-46-47-46.2s-47 20.8-47 46.8zm46-30c18 0 30 13 30 30-0.15 17-14 30-30 30s-30-12-30-30c0-17 14-30 30-30z\" style=\"fill:#999;stroke-width:1.27\"/>\u003Cpath d=\"m73 68a8.4 8.4 0 0 0-5.5 15l42 40a8.49 8.49 0 1 0 12-12l-41-39a8.4 8.4 0 0 0-6-3z\" style=\"fill:#999;stroke-width:1.27\"/>\u003C/g>\u003C/g>\u003Cg transform=\"matrix(.92 0 0 .92 34.8 2.49)\" style=\"fill-rule:evenodd;stroke-width:1.09\">\u003Cg transform=\"translate(-37.8 10.8)\" fill-rule=\"evenodd\" style=\"stroke-width:1.24\">\u003Cpath d=\"m1 47.9c0 26 21 47 47 47s46-21 47-47h0.062v-0.56h-0.062c-1-25-21-46-47-46.2s-47 20.8-47 46.8zm46-30c18 0 30 13 30 30-0.15 17-14 30-30 30s-30-12-30-30c0-17 14-30 30-30z\" style=\"stroke-width:1.09\"/>\u003Cpath d=\"m73 68a8.4 8.4 0 0 0-5.5 15l42 40a8.49 8.49 0 1 0 12-12l-41-39a8.4 8.4 0 0 0-6-3z\" style=\"stroke-width:1.09\"/>\u003C/g>\u003C/g>\u003C/svg>\n\n Shadows\u003C/span>\u003Cspan class=\"tc-big-gap\">\u003Csvg class=\"wlc-image-filter-search tc-image-button\" height=\"22pt\" viewBox=\"0 0 128 128\" width=\"22pt\">\n\t\u003Cg>\n\t\t\u003Cpath d=\"m6,5.7,0,7,0,96,0,7,7,0,27,0,0-14-20,0,0-82,19,0,0-14-26,0-7,0z\">\u003C/path>\n\t\t\u003Cpath d=\"m68,5.7,0,14,19,0,0,82-20,0,0,14,27,0,7,0,0-7,0-96,0-7-7,0-26,0z\">\u003C/path>\n\t\u003C/g>\n\u003C/svg>\n\n Filter\u003C/span>\u003C/p>"},
{"title":"advanced-search-plus/icon","created":"20211004092148965","modified":"20211004092150776","type":"text/vnd.tiddlywiki","text":"\u003Csvg width=\"22pt\" height=\"22pt\" version=\"1.1\" viewBox=\"0 0 128 128\">\n\u003Cpath transform=\"scale(4.36)\" d=\"m18.6 0-14.5 7.33-3.93 14.7 10.5 7.33 14.5-7.33 3.93-14.7-10.5-7.33zm-1.39 5.22c0.383 0 0.756 0.0393 1.12 0.102 0.518 0.0883 1.02 0.231 1.49 0.432 2.37 1.01 4.03 3.36 4.03 6.11 0 3.67-2.97 6.64-6.64 6.64-1.36 0-2.63-0.411-3.69-1.12l-4.75 4.75c-0.511 0.511-1.34 0.51-1.85 0-0.511-0.511-0.51-1.34 0-1.85l4.75-4.75c-0.701-1.05-1.11-2.32-1.11-3.68 0-3.67 2.97-6.64 6.64-6.64zm0 2.21c-2.44 0-4.43 1.98-4.43 4.43 0 2.44 1.98 4.43 4.43 4.43 2.44 0 4.43-1.98 4.43-4.43 0-2.44-1.98-4.43-4.43-4.43zm-2.83 3.32a1.11 1.11 0 0 1 0.0586 0 1.11 1.11 0 0 1 1.11 1.11 1.11 1.11 0 0 1-1.11 1.11 1.11 1.11 0 0 1-1.11-1.11 1.11 1.11 0 0 1 1.05-1.11zm2.77 0a1.11 1.11 0 0 1 0.0586 0 1.11 1.11 0 0 1 1.11 1.11 1.11 1.11 0 0 1-1.11 1.11 1.11 1.11 0 0 1-1.11-1.11 1.11 1.11 0 0 1 1.05-1.11zm2.77 0a1.11 1.11 0 0 1 0.00195 0 1.11 1.11 0 0 1 0.0566 0 1.11 1.11 0 0 1 1.11 1.11 1.11 1.11 0 0 1-1.11 1.11 1.11 1.11 0 0 1-1.11-1.11 1.11 1.11 0 0 1 1.05-1.11z\" style=\"stroke-width:.229\"/>\n\u003C/svg>"},
{"title":"Advanced-Tools","created":"20210324163259619","modified":"20210324163309189","type":"text/vnd.tiddlywiki"},
{"title":"Alias","created":"20210324163952498","modified":"20210324163959131","type":"text/vnd.tiddlywiki"},
{"title":"Animation","created":"20210324164846906","modified":"20210324164854603","type":"text/vnd.tiddlywiki"},
{"title":"blue-button-style","created":"20210328103644530","modified":"20210328104019883","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":".wltc-btn-big-blue{\n\tdisplay: inline-block;\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: #b5dafb;\n\tcolor: #ffffff;\n\tfill: #ffffff;\n\tborder: none;\n\tborder-radius: 2px;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n\ttext-decoration: none;\n}\n"},
{"title":"bundler","created":"20170612083932764","description":"This plugin allows you to create \"export/import\" configurations and save them as a bundle","forum":"https://talk.tiddlywiki.org/t/intro-bundler-plugin-allows-you-to-create-export-import-configurations-and-save-them-as-a-bundle/5958","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/bundler","modified":"20211004083148108","tags":"plugin $:/tags/Link Import Export Tools JSON","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/bundler","text":"! Bundler Plugin\n\nThis plugin allows you to create \"export/import\" configurations and save them as a bundle."},
{"title":"cheatsheet","created":"20230501144550483","description":"This plugin adds an editor and a page toolbar button F1 that opens a cheatsheet popup","forum":"https://talk.tiddlywiki.org/t/intro-tiddlywiki-wikitext-cheatsheet/6926","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/editions/tree/master/cheatsheet","modified":"20231007113508800","tags":"plugin $:/tags/Link Documentation Cheatsheet","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/cheatsheet","text":"! Wikitext Cheatsheet\n\nThis plugin adds an editor and a page toolbar help button \u003Ckbd>F1\u003C/kbd> that opens a cheatsheet popup, which gives you an overview about all TW wikitext rules and a lot more ..."},
{"title":"cheatsheet-f1.gif","_canonical_uri":"./files/images/cheatsheet-f1.gif","created":"20231007123016793","modified":"20231229165229970","tags":"","type":"image/gif"},
{"title":"click-effect","created":"20201226173139104","description":"This plugin starts a little animation if the left mouse button is released","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/click-effect","modified":"20211004083402788","tags":"plugin $:/tags/Link Animation Presentation","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/click-effect","text":"! Click Effect Plugin\n\nThis plugin starts a little animation if the left mouse button is released"},
{"title":"click-effect/icon","created":"20211004092140582","modified":"20211004092142756","type":"text/vnd.tiddlywiki","text":"\u003Csvg width=\"22pt\" height=\"22pt\" version=\"1.1\" viewBox=\"0 0 128 128\">\n\u003Cpath transform=\"scale(4.36)\" d=\"m18.6 0-14.5 7.33-3.93 14.7 10.5 7.33 14.5-7.33 3.93-14.7-10.5-7.33zm-4.23 5.56c5.17 3e-7 9.38 4.21 9.38 9.38s-4.21 9.38-9.38 9.38c-5.17 0-9.38-4.21-9.38-9.38 0-5.17 4.21-9.38 9.38-9.38zm0 0.441c-4.93 0-8.94 4.01-8.94 8.94s4.01 8.94 8.94 8.94c4.93 0 8.94-4.01 8.94-8.94s-4-8.94-8.94-8.94zm0 0.656c4.58 0 8.28 3.71 8.28 8.28s-3.7 8.28-8.28 8.28c-4.58 0-8.28-3.7-8.28-8.28s3.71-8.28 8.28-8.28zm0 0.441c-4.34 3e-7 -7.84 3.5-7.84 7.84s3.5 7.84 7.84 7.84c4.34 0 7.84-3.5 7.84-7.84s-3.5-7.84-7.84-7.84zm-0.145 3.26c2.4 0 4.36 1.96 4.36 4.36 0 2.4-1.96 4.36-4.36 4.36s-4.36-1.96-4.36-4.36c0-2.4 1.96-4.36 4.36-4.36zm0 1.15c-1.78 0-3.21 1.43-3.21 3.21s1.43 3.21 3.21 3.21 3.21-1.43 3.21-3.21-1.43-3.21-3.21-3.21zm-0.0625 2.04c0.625 0 1.15 0.519 1.15 1.14 1e-6 0.625-0.521 1.15-1.15 1.15-0.625-1e-6 -1.14-0.521-1.14-1.15 0-0.625 0.519-1.14 1.14-1.14z\" style=\"stroke-width:.229\"/>\n\u003C/svg>"},
{"title":"custom-markup","created":"20201226173051333","description":"This plugin can be used to apply new wikitext formatting to content. It allows you to improve the writing speed","forum":"https://talk.tiddlywiki.org/t/intro-the-custom-markup-plugin-beta/1219","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/custom-markup","modified":"20220422110032407","tags":"Wikitex-Extensions Editor Advanced-Tools EXPERIMENTAL WikiText $:/tags/Link","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/custom-markup","text":"! Custom Markup Plugin\n\nThis plugin can be used to apply new wikitext formatting to content, that is imported (copy / pasted) from other sites. It allows you to improve the writing speed and it improves plain text readability.\n\nThis is a \"power-user tool\"!"},
{"title":"Details","created":"20200611163410374","modified":"20231003102013296","tags":"","type":"text/vnd.tiddlywiki","text":"The ''~WikiLabs Pluginlibrary Configuration'' tiddlers can be found at: [[GettingStarted]]\n\n! Plugins\n\n\u003C\u003Clist-links-desc \"[tag[plugin]sort[]]\">>\n\n! Editions\n\n\u003C\u003Clist-links-desc \"[tag[edition]sort[]]\">>\n\n! Themes\n\n\u003C\u003Clist-links-desc \"[tag[theme]sort[]]\">>\n\n! Experimental\n\n\u003C\u003Clist-links-desc \"[tag[EXPERIMENTAL]sort[]]\">>\n\n! Deprecated\n\n\u003C\u003Clist-links-desc \"[tag[DEPRECATED]sort[]]\" emptyMessage:\"n/a\">>"},
{"title":"Development","created":"20210324163132417","modified":"20210324163141707","type":"text/vnd.tiddlywiki"},
{"title":"devtools","created":"20260331223756681","description":"Hover tooltips, context menu, variable inspector, source viewer. Useful for any TiddlyWiki developers","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/devtools","modified":"20260331224010218","tags":"plugin $:/tags/Link","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/devtools","text":"! Developer Tools Plugin\n\nHover tooltips, context menu, variable inspector, source viewer. Useful for any TiddlyWiki developers."},
{"title":"Dropdown","created":"20210324164416441","modified":"20210324164423703","type":"text/vnd.tiddlywiki"},
{"title":"edit-tabs","created":"20180328073119156","description":"This plugin adds internal tiddler links to every tab if selected. It allows you to activate \"non system\" tiddlers directly in edit mode","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/edit-tabs","modified":"20231229163546296","tags":"$:/tags/Link Tabs Development Tools DEPRECATED","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/edit-tabs","text":"! Deprecated\n\n''Use [[link-to-tabs]] instead''\n\n! Edit Tabs Plugin\n\nThis plugin adds internal tiddler links to every tab if selected. It adds a setting to the ~ControlPanel: Settings tab, that allows you to activate \"non system\" tiddlers directly in edit mode. This comes in handy, if you are creating a lot of new stuff."},
{"title":"edition","created":"20210324163720921","modified":"20210324163749925","type":"text/vnd.tiddlywiki"},
{"title":"edition-template","created":"20170203104234369","description":"This is an \"edition template\"","git-repo":"https://github.com/wikilabs/editions/tree/master/edition-template","modified":"20211004085708251","tags":"edition","type":"text/vnd.tiddlywiki","url":"n/a"},
{"title":"Editor","created":"20210324163315024","modified":"20210324163324116","type":"text/vnd.tiddlywiki"},
{"title":"Export","created":"20210324163534691","modified":"20210324163541326","type":"text/vnd.tiddlywiki"},
{"title":"field-editor","created":"20211115202510904","description":"This plugin adds a field selector above the text editor and a new button that allows you to edit different fields in multiline edit mode side by side","forum":"https://talk.tiddlywiki.org/t/intro-multiline-field-editor-plugin/1580","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/field-editor","modified":"20220330171911441","tags":"$:/tags/Link Tools Fields Editor plugin","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/field-editor","text":"! Multiline Field Editor\n\nThis plugin adds a field selector above the text editor and a new button that allows you to edit different fields in multiline edit mode side by side"},
{"title":"field-search","created":"20190218120000000","description":"This plugin adds several new tabs to the search dropdown. The elements, that should be used can be configured in the $:/ControlPanel","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/field-search","modified":"20211004083923578","tags":"plugin $:/tags/Link Search Tabs Advanced-Search Tools","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/field-search","text":"! Field Search Plugin\n\nThis plugin adds several new tabs to the search dropdown. The elements, that should be used can be configured in the ~$:/ControlPanel"},
{"title":"field-search/icon","created":"20211004092132253","modified":"20211004092133984","type":"text/vnd.tiddlywiki","text":"\u003Csvg width=\"22pt\" height=\"22pt\" version=\"1.1\" viewBox=\"0 0 128 128\">\n\u003Cpath transform=\"scale(4.36)\" d=\"m18.6 0-14.5 7.33-3.93 14.7 10.5 7.33 14.5-7.33 3.93-14.7-10.5-7.33zm-5.84 4.81c2.22 0 4.16 1.21 5.2 3h0.34v0.00195c0.277-0.0114 0.548 0.0881 0.744 0.273l2.8 2.64c0.182 0.171 0.287 0.402 0.291 0.645h0.00391v10.5c0 0.516-0.443 0.936-0.99 0.936h-9.91c-0.547 0-0.99-0.419-0.99-0.936v-5.56c-0.285-0.132-0.561-0.282-0.82-0.455l-4.3 4.3c-0.462 0.462-1.21 0.462-1.67 0-0.462-0.462-0.462-1.21 0-1.67l4.3-4.3c-0.656-0.985-1.01-2.14-1-3.33 0-3.32 2.69-6.01 6.01-6.01zm0 1.6c-2.07 0.0138-4.32 1.67-4.32 4.41 0 1.57 0.662 2.9 1.81 3.67v-5.73c0-0.516 0.443-0.936 0.99-0.936h4.71c-0.873-0.893-2.07-1.41-3.19-1.41zm-1.14 2.82v5.83c0.358 0.0841 0.734 0.143 1.14 0.143 2.36 0 4.44-1.74 4.44-4.38 0-0.577-0.115-1.11-0.309-1.59h-5.27zm1.26 1.45h3.12c0.508 0 0.916 0.443 0.916 0.992v0.0273c0 0.549-0.408 0.99-0.916 0.99h-3.12c-0.508 0-0.918-0.441-0.918-0.99v-0.0273c0-0.549 0.41-0.992 0.918-0.992zm5.86 0.531c-0.2 3.14-2.8 5.62-5.99 5.62-0.391 0-0.77-0.0497-1.14-0.121v4.62h9.05v-9.94h-1.38c-0.204 0-0.382-0.0727-0.539-0.172z\" style=\"stroke-width:.229\"/>\n\u003C/svg>"},
{"title":"field-visibility","created":"20211112131351465","description":"This plugin adds a toggle button to the \"visibility tab\" in the tiddler info area, which can be seen in tiddler view mode","forum":"https://talk.tiddlywiki.org/t/intro-field-visibility-plugin/1578","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/field-visibility","modified":"20220330171902215","tags":"plugin $:/tags/Link Tools Fields","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/field-visibility","text":"! Field Visibility Toggle\n\nThis plugin adds a toggle button to the \"visibility tab\" in the tiddler info area, which can be seen in tiddler view mode. "},
{"title":"Filter","created":"20210324164010453","modified":"20210324164017707","type":"text/vnd.tiddlywiki"},
{"title":"Formatting","created":"20210324164025462","modified":"20210324164033380","type":"text/vnd.tiddlywiki"},
{"title":"GettingStarted","created":"20190211002748002","modified":"20231218155012524","type":"text/vnd.tiddlywiki","text":"\u003Cstyle>\n.tc-thumbnail-icon {border:black 1px solid;}\n\u003C/style>\n\n! Welcome\n\nWelcome at [[WikiLabs|wikilabs.github.io]] ... with many useful ~TiddlyWiki ''editions'' , my personal ''themes'' and ''plugins''.\n\nDevelopment repositories can be found at GitHub\n\n! Library Configuration \n\n!! Latest Library Link\n\n''Drag / Import the following link into your wiki, to import the configuration tiddler!''\n\n\u003C$link class=\"tc-btn-big-green\" to=\"$:/config/wikilabs/PluginLibraryWL/latest\">\n~WikiLabs Plugin Configuration\n\u003C/$link>\n\n!! Video\n\nA short info video about how to use the \"~WikiLabs Plugin Configuration\" link shown above.\n\n\u003Cdiv style=\"font-size:0.8em;margin-top:2em;margin-bottom:2em;\">\n{{VideoThumbnail - Use the Library Configuration}}\n\u003C/div>\n\n! Plugin Details\n\nDetails can be found at: \u003C$link class=\"wltc-btn-big-blue\" to=\"Details\">Show Editions, Themes and Plugins\u003C/$link>\n\n----\n\n\u003Cdetails>\u003Csummary>OLD -- Compatible with TW v5.3.1 and down\u003C/summary>\n\u003Cp>\nImport the following link, if you want to install a stable version which is compatible with ~TiddlyWiki version v5.3.1 down to v5.2.7\n\u003C/p>\n\u003Cp>\n[[WikiLabs Plugin Configuration 5.3.1|$:/config/wikilabs/PluginLibraryWL/5.3.1]]\n\u003C/p>\n\u003C/details>\n\n\u003Cdetails>\u003Csummary>OLD -- Compatible with TW v5.2.7 and down\u003C/summary>\n\u003Cp>\nImport the following link, if you want to install a stable version which is compatible with ~TiddlyWiki version v5.2.7 down to v5.1.23\n\u003C/p>\n\u003Cp>\n[[WikiLabs Plugin Configuration 5.2.7|$:/config/wikilabs/PluginLibraryWL/5.2.7]]\n\u003C/p>\n\u003C/details>\n\n\u003Cdetails>\u003Csummary>OLD -- Compatible with TW v5.1.23 and down\u003C/summary>\n\u003Cp>\nImport the following link, if you want to install a stable version which is compatible with ~TiddlyWiki version 5.1.22 and 5.1.23!!\n\u003C/p>\n\u003Cp>\n[[WikiLabs Plugin Configuration 5.1.23|$:/config/wikilabs/PluginLibraryWL/5.1.23]]\n\u003C/p>\n\u003C/details>\n\n\u003Cdetails>\u003Csummary>OLD -- Compatible with TW v5.1.21 and down\u003C/summary>\n\u003Cp>\nImport the following link, if you want to install a stable version which is compatible with ~TiddlyWiki version \u003C= 5.1.21!!\n\u003C/p>\n\u003Cp>\n[[WikiLabs Plugin Configuration \u003C= 5.1.21|$:/config/wikilabs/PluginLibraryWL/5.1.21]]\n\u003C/p>\n\u003C/details>"},
{"title":"GitHub","created":"20220628120329938","modified":"20220628120730337","tags":"","type":"text/vnd.tiddlywiki","text":"! ~GitHub Repositories\n\n* Editions: https://github.com/wikilabs/editions\n\n* Plugins: https://github.com/wikilabs/plugins\n** Zipped plugin folders: https://github.com/wikilabs/plugins/releases"},
{"title":"How to use the Library Configuration Tiddler","created":"20210122180642057","modified":"20210122184606806","tags":"Video","type":"text/vnd.tiddlywiki","text":"Youtube will start collecting user-info, if you play the video!\n\n\u003Ciframe width=\"560\" height=\"315\" src=\"https://www.youtube-nocookie.com/embed/0QwGUGckiwI\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen>\u003C/iframe>"},
{"title":"Import","created":"20210324163554167","modified":"20210324163603674","type":"text/vnd.tiddlywiki"},
{"title":"Info-Section","created":"20210324164726157","modified":"20210324164735105","type":"text/vnd.tiddlywiki"},
{"title":"info-session","created":"20170203102751368","description":"This plugin provides a tiddler info button, with a persistent open/close status for one browser session","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issuesgit-repo: https://github.com/wikilabs/plugins/tree/master/wikilabs/info-session","modified":"20230702102039640","tags":"$:/tags/Link UI Tabs Info-Section Navigation DEPRECATED","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/info-session","text":"! Deprecated\n\nA similar function is part of the TW core since v5.1.14 see: [[ControlPanel : Settings|https://tiddlywiki.com/#%24%3A%2Fcore%2Fui%2FControlPanel%2FSettings%2FInfoPanelMode]]\n\n! Info Session Plugin\n\nThis plugin provides a tiddler info button, with a persistent open/close status for one browser session.\n"},
{"title":"info-session/icon","created":"20211004092123766","modified":"20211004092125405","type":"text/vnd.tiddlywiki","text":"\u003Csvg width=\"22pt\" height=\"22pt\" version=\"1.1\" viewBox=\"0 0 128 128\">\n\u003Cpath transform=\"scale(4.36)\" d=\"m18.6 0-14.5 7.33-3.93 14.7 10.5 7.33 14.5-7.33 3.93-14.7-10.5-7.33zm-4.02 5.82c4.79 0 8.67 3.88 8.67 8.67 0 4.79-3.88 8.67-8.67 8.67-4.79 0-8.67-3.88-8.67-8.67 0-4.79 3.88-8.67 8.67-8.67zm0 2.17c-3.59 0-6.5 2.91-6.5 6.5 0 3.59 2.91 6.5 6.5 6.5s6.5-2.91 6.5-6.5c0-3.59-2.91-6.5-6.5-6.5zm-0.0391 1.08a1.08 1.08 0 0 1 0.0391 0 1.08 1.08 0 0 1 1.08 1.08 1.08 1.08 0 0 1-1.08 1.08 1.08 1.08 0 0 1-1.08-1.08 1.08 1.08 0 0 1 1.04-1.08zm0.0391 3.25c0.601 0 1.08 0.483 1.08 1.08v5.42c0 0.601-0.483 1.08-1.08 1.08s-1.08-0.483-1.08-1.08v-5.42c0-0.601 0.483-1.08 1.08-1.08z\" style=\"stroke-width:.229\"/>\n\u003C/svg>"},
{"title":"info-tagmap","created":"20170203102805644","description":"This plugin adds a \"tag map\" to the tiddler info area","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/info-tagmap","modified":"20211004084002885","tags":"plugin $:/tags/Link Info-Section Tags Tagging","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/info-tagmap","text":"! Info ~TagMap Plugin\n\nThis plugin adds a \"tag map\" to the tiddler info area."},
{"title":"interactive-test-framework","created":"20191101121217314","description":"This plugin allows you to create an interactive test framework for advanced developers","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/trigger","modified":"20211004085801686","tags":"edition $:/tags/Link Advanced-Tools Development","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/trigger","text":"! Trigger Plugin\n\nThis plugin allows you to create an interactive test framework for advanced developers. \n\n''Warning'': It can brick your wiki if used wrong!"},
{"title":"JSON","created":"20210324164818941","modified":"20210324164825997","type":"text/vnd.tiddlywiki"},
{"title":"keyvalues","created":"20201226173418498","description":"This plugin adds new filter operators that improves and simplifies Data-Tiddler handling","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/keyvalues","modified":"20211004084019280","tags":"plugin $:/tags/Link Development Advanced-Tools Search Operators Filter","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/keyvalues","text":"! Key Values Plugin\n\nThis plugin adds new filter operators that improves and simplifies Data-Tiddler handling. "},
{"title":"kitchen-sink","created":"20170203104213958","description":"This page / edition contains most WikiLabs plugins","modified":"20211004085835125","tags":"edition","type":"text/vnd.tiddlywiki","text":"\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define plugin-table(type)\n\u003C$set name=\"plugin-type\" value=\"\"\"$type$\"\"\">\n\u003C$set name=\"qualified-state\" value=\u003C\u003Cqualify \"$:/state/plugin-info\">>>\n\u003C$list filter=\"[!has[draft.of]plugin-type[$type$]sort[description]]\" emptyMessage=\u003C\u003Clingo \"Empty/Hint\">> template=\"$:/core/ui/Components/plugin-info\"/>\n\u003C/$set>\n\u003C/$set>\n\\end\n\nThis page / edition contains most plugins.\n\n\u003C\u003Clingo Installed/Hint>>\n\n\u003C\u003Ctabs \"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\">>\n"},
{"title":"library-configuration.png","text":"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","type":"image/png","created":"20210122181956318","modified":"20210122182011210"},
{"title":"link-to-tabs","created":"20170203103021609","description":"This plugin adds internal tiddler links to every tab if selected","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/link-to-tabs","modified":"20220422105744855","tags":"plugin Tabs UI Development $:/tags/Link","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/link-to-tabs","text":"! Link to Tabs Pugin\n\nThis plugin adds internal tiddler links to every tab if selected. This comes in handy, if you are creating a lot of new stuff."},
{"title":"link-to-tabs/icon","created":"20211004092115789","modified":"20211004092117557","type":"text/vnd.tiddlywiki","text":"\u003Csvg width=\"22pt\" height=\"22pt\" version=\"1.1\" viewBox=\"0 0 128 128\">\n\u003Cpath transform=\"scale(4.36)\" d=\"m18.6 0-14.5 7.33-3.93 14.7 10.5 7.33 14.5-7.33 3.93-14.7-10.5-7.33zm0.0371 4.98c1.26-7.68e-5 2.52 0.479 3.48 1.44 1.92 1.92 1.92 5.03 0 6.96l-3.48 3.48c-1.92 1.92-5.03 1.92-6.96 0a4.9 4.9 0 0 1-1.05-1.56l0.943-0.943a1.84 1.84 0 0 1 1.17-0.535 2.45 2.45 0 0 0 0.68 1.3c0.96 0.96 2.52 0.958 3.48-0.00195l3.47-3.47c0.962-0.962 0.962-2.52 0.00195-3.48-0.96-0.96-2.52-0.958-3.48 0.00195l-2.25 2.25a5.56 5.56 0 0 0-3.37-0.0508 4.97 4.97 0 0 1 0.41-0.465l3.48-3.48c0.96-0.96 2.22-1.44 3.48-1.44zm-5.76 5.76c1.26-5.8e-5 2.52 0.481 3.48 1.44a4.9 4.9 0 0 1 1.05 1.56l-0.941 0.943a1.84 1.84 0 0 1-1.17 0.533 2.45 2.45 0 0 0-0.68-1.29c-0.96-0.96-2.52-0.96-3.48 0l-3.48 3.48c-0.962 0.962-0.96 2.52 0 3.48 0.96 0.96 2.52 0.96 3.48 0l2.25-2.25a5.56 5.56 0 0 0 3.37 0.0527 4.97 4.97 0 0 1-0.41 0.463l-3.48 3.48c-1.92 1.92-5.03 1.92-6.96 0-1.92-1.92-1.92-5.03 0-6.95l3.48-3.48c0.96-0.96 2.22-1.44 3.48-1.44z\" style=\"stroke-width:.229\"/>\n\u003C/svg>\n\n\n\n"},
{"title":"linked-list-with-description","created":"20211004081905819","modified":"20211004095745228","tags":"$:/tags/Macro","type":"text/vnd.tiddlywiki","text":"\\define list-links-desc(filter,type:\"ul\",subtype:\"li\",class:\"\",emptyMessage)\n\\whitespace trim\n\u003C$type$ class=\"$class$\">\n \u003C$list filter=\"$filter$\" emptyMessage=\u003C\u003C__emptyMessage__>>>\n \u003C$subtype$ class=\"wltc-list\">\n \u003C$link to={{!!title}} class=\"wltc-list-title\">\n \u003C$transclude field=\"caption\">\n \u003C$view field=\"title\"/>\n \u003C/$transclude>\n \u003C/$link>\n \u003Cblockquote class=\"wltc-list-description\">\u003C$transclude field=\"description\" mode=block/>\u003C/blockquote>\n \u003C/$subtype$>\n \u003C/$list>\n\u003C/$type$>\n\\end\n\n\u003Cpre>\u003Ccode>\u003C$view />\u003C/code>\u003C/pre>"},
{"title":"Linking","created":"20210324164123282","modified":"20210324164130954","type":"text/vnd.tiddlywiki"},
{"title":"Markdown","created":"20210324164600101","modified":"20210324164607677","type":"text/vnd.tiddlywiki"},
{"title":"markdown-it","created":"20180328090723502","description":"This is a demo of TiddlyWiki5 incorporating a plugin for the \"markdown-it\" markdown parser","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/markdown-it","modified":"20230622062400480","tags":"$:/tags/Link Markdown WikiText Formatting DEPRECATED","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/markdown-it","text":"! Deprecated\n\nThis plugin uses a 3rd party markdown-it library V 9.1.1\n\n! Markdown-it Plugin\n\nThis is a demo of ~TiddlyWiki5 incorporating a plugin for the \"markdown-it\" markdown parser. "},
{"title":"multicol-dropdown","created":"20170203102828029","description":"This plugin changes most dropdown dialogs into multi column dialogs, with CSS only","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/multicol-dropdown","modified":"20211004084115828","tags":"plugin $:/tags/Link UI Tags Editor Dropdown Popup CSS","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/multicol-dropdown","text":"! Multicolumn Dropdown Plugin\n\nThis plugin changes most dropdown dialogs into multi column dialogs, with CSS only. This plugin is handy, if you have a lot of tags"},
{"title":"Navigation","created":"20210324164156820","modified":"20210324164205370","type":"text/vnd.tiddlywiki"},
{"title":"new-tiddler-from-search","created":"20170203102848440","description":"This plugin adds a \"New Tiddler\" template, into the default search input element, that uses the \"search term\" as title","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/new-tiddler-from-search","modified":"20211004084133271","tags":"plugin $:/tags/Link Search Navigation Dropdown Popup Tiddler-Creation","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/new-tiddler-from-search","text":"! New Tiddler from Search\n\nThis plugin adds a \"New Tiddler\" template, into the default search input element, that uses the \"search term\" as title"},
{"title":"new-tiddler-from-search/icon","created":"20211004092107845","modified":"20211004092109581","type":"text/vnd.tiddlywiki","text":"\u003Csvg width=\"22pt\" height=\"22pt\" version=\"1.1\" viewBox=\"0 0 128 128\">\n\u003Cpath transform=\"scale(4.36)\" d=\"m18.6 0-14.5 7.32-3.93 14.7 10.5 7.32 14.5-7.32 3.93-14.7-10.5-7.32zm-9.44 5.74h2.04l2.57 4.85v-4.85h1.73v7.08h-2.04l-2.57-4.85v4.85h-1.73v-7.08zm7.29 0h6.52v1.38h-2.35v5.7h-1.83v-5.7h-2.35v-1.38zm0.553 7.92c0.519-0.0206 1.05 0.0364 1.58 0.178 2.81 0.754 4.48 3.65 3.73 6.46-0.754 2.81-3.65 4.48-6.46 3.73-1.05-0.28-1.93-0.856-2.6-1.61l-4.62 2.67c-0.497 0.287-1.13 0.116-1.42-0.381-0.287-0.497-0.116-1.13 0.381-1.42l4.62-2.67c-0.333-0.984-0.364-2.04-0.0938-3.05 0.613-2.29 2.64-3.82 4.88-3.91zm0.533 1.42c-1.63-0.104-3.45 0.837-3.99 2.87-0.569 2.12 0.426 4.1 2.67 4.7 2 0.536 4.16-0.463 4.76-2.71 0.608-2.27-1-4.29-2.76-4.75-0.22-0.0574-0.449-0.0926-0.682-0.107z\" style=\"stroke-width:.229\"/>\n\u003C/svg>"},
{"title":"Operators","created":"20210324164646725","modified":"20210324164653247","type":"text/vnd.tiddlywiki"},
{"title":"Outline","created":"20210324164154228","modified":"20210324164213123","type":"text/vnd.tiddlywiki"},
{"title":"palette-manager","created":"20220830111939991","description":"This plugin/edition implements preview elements to the [[$:/PaletteManager|https://wikilabs.github.io/editions/palette-manager]], to make is easier to see how colour changes effect the UI.","forum":"https://talk.tiddlywiki.org/t/palette-manager-feature-complete/5095","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/palette-manager","modified":"20240112153638642","tags":"$:/tags/Link Palette-Manager Colour palette plugin edition","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/palette-manager","text":"! Palette Manager\n\n{{!!description}}\n\nIt should be a \"quality of live\" improvement ;)"},
{"title":"palette-switcher","created":"20240825143643663","description":"This plugin replaces the ControlPanel -> Appearence -> Palette tab","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/palette-switcher","modified":"20240825144046992","tags":"plugin UI $:/tags/Link palette theme","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/palette-switcher","text":"! Palette Switcher\n\nThis plugin replaces the ''ControlPanel -> Appearence -> Palette'' tab -- You can have a look here at this page."},
{"title":"palette-watch","created":"20240825145420723","description":"This plugin listens to browser or OS light/dark theme changes","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/palette-watch","modified":"20240825145657263","tags":"plugin UI $:/tags/Link palette theme","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/palette-switcher","text":"! Palette watch\n\nThis plugin adds a new watch-event to the wiki, that allows you do dynamically change the palette, if the browser or OS theme changes between \"light\" and \"dark\"."},
{"title":"persistent-states","created":"20170203102859229","description":"This plugin saves all $:/state/ tiddlers and creates a simple UI, to remove them manually","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/persistent-states","modified":"20230702102932156","tags":"EXPERIMENTAL","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/persistent-states"},
{"title":"plugin-template","created":"20170314150049582","description":"This is a \"plugin template\"","git-repo":"https://github.com/wikilabs/editions/tree/master/plugin-template","modified":"20211004085928106","tags":"edition","type":"text/vnd.tiddlywiki","url":"n/a"},
{"title":"Popup","created":"20210324164458323","modified":"20210324164506267","type":"text/vnd.tiddlywiki"},
{"title":"pragma-comment","created":"20201226173504500","description":"This plugin allows developers to add comments outside of \"macro definitions\"","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/pragma-comment","modified":"20260515072926023","tags":"$:/tags/Link Development Editor Advanced-Tools WikiText Wikitex-Extensions DEPRECATED","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/pragma-comment","text":"! Deprecated\n\nA similar function is part of the TW core since V5.2.0 See: https://tiddlywiki.com/#HTML%20in%20WikiText : ''Pragma Comments''\n\n! Pragma Comment\n\nThis plugin allows developers to add comments outside of \"macro definitions\", so they don't waste any time during execution. This is _not_ possible with the default wikitext\n\n```\n\\\\ comment comes here till the end of the line\n\\define test() Hello World\n```\n\n"},
{"title":"Presentation","created":"20210324164844639","modified":"20210324164903436","type":"text/vnd.tiddlywiki"},
{"title":"remove-states","created":"20170203102912765","description":"This plugin creates a simple UI, to remove all state tiddlers","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/remove-states","modified":"20211004084801354","tags":"plugin $:/tags/Link UI Tools Development Editor","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/remove-states","text":"! Remove States\n\nThis plugin creates a simple UI, to remove all state tiddlers."},
{"title":"rounded-tabs","created":"20260515074301783","description":"Segmented-control style rounded tabs","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/rounded-tabs","modified":"20260515075049817","tags":"plugin UI $:/tags/Link theme Tabs","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/","text":"! Rounded Tabs\n\nA theme that restyles the core `.tc-tab-buttons` markup as a ''segmented control'' — a rounded pill-shaped container holding the tab buttons, with the selected tab raised on the page background.\n"},
{"title":"Savers","created":"20210324163846058","modified":"20210324163855131","type":"text/vnd.tiddlywiki"},
{"title":"script-manager","created":"20171215212502872","description":"This edition is very handy to collect links to different topics","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/script-manager","modified":"20230702102323837","tags":"edition $:/tags/Link HowTo WikiText Development","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/script-manager","text":"! Script Manager Edition\n\nThis edition was mainly created to support a video series, that shows, how the edition was created: ''Step by Step''\n\nI do use a sightly \"pimped\" version as my day to day link and idea manager. \n\n"},
{"title":"Search","created":"20210324163153733","modified":"20210324163200131","type":"text/vnd.tiddlywiki"},
{"title":"Server","created":"20210324163843644","modified":"20210324163918359","type":"text/vnd.tiddlywiki"},
{"title":"space-space-newline","created":"20201226173536908","description":"This plugin adds the possibility to add hard linebreaks into prose wikitext","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/space-space-newline","modified":"20211004084930280","tags":"plugin $:/tags/Link WikiText Editor Wikitex-Extensions","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/space-space-newline","text":"! Space Space Newline\n\nThis plugin adds the possibility to add hard linebreaks into prose wikitext."},
{"title":"speciallinks","created":"20200225173859549","description":"This plugin adds the possibility to have Camel_Case links, that are otherwise not supported by default wikitext","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/speciallinks","modified":"20240523094543000","tags":"$:/tags/Link Wikitex-Extensions WikiText Editor EXPERIMENTAL","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/speciallinks","text":"! Special Links Plugin\n\nThis plugin adds the possibility to have Camel_Case links, that are otherwise not supported by default wikitext"},
{"title":"Story","created":"20210324163610964","modified":"20210324163619157","type":"text/vnd.tiddlywiki"},
{"title":"Story-River","created":"20210324163625781","modified":"20210324163634419","type":"text/vnd.tiddlywiki"},
{"title":"Table-of-Contents","created":"20210324164151679","modified":"20210324164257029","type":"text/vnd.tiddlywiki"},
{"title":"Tabs","created":"20210324164621061","modified":"20210324164627484","type":"text/vnd.tiddlywiki"},
{"title":"Tagging","created":"20210324164716331","modified":"20210324164723445","type":"text/vnd.tiddlywiki"},
{"title":"Tags","created":"20210324164536355","modified":"20210324164543168","type":"text/vnd.tiddlywiki"},
{"title":"test-styles","created":"20211004083711948","modified":"20211004083734378","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":".wltc-list-description {\n margin-top: -1em;\n}"},
{"title":"test-thumb","created":"20210122181241592","modified":"20210122181414020","tags":"","type":"text/vnd.tiddlywiki","text":"\u003Cdiv style=\"font-size:0.7em;text-align:center;margin-top:2em;margin-bottom:2em;\">\n\u003C\u003Clist-thumbnails filter:\"[tag[VideoThumbnail]]\" width:\"168\" height:\"95\">>\n\u003C/div>"},
{"title":"theme-slant-01","caption":"slant-01","created":"20170203113430786","description":"This is an opinionated TiddlyWiki Theme designed for my personal use","git-repo":"https://github.com/wikilabs/themes/tree/master/wikilabs/slant-01","modified":"20211004085643708","tags":"theme","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/slant-01","text":"Slant is a theme, that also includes several plugins. So if you want to use the theme, you should import it, using the ~TiddlyWiki plugin-library import mechanism. \n\n''Drag the following link into your wiki, to import the configuration tiddler!''\n\n\u003Cspan class=\"tc-btn-big-green\">\n[[WikiLabs Plugin Configuration|$:/config/wikilabs/PluginLibraryWL/latest]]\n\u003C/span>\n\n"},
{"title":"thin-scrollbars","created":"20170203103021609","description":"This plugin adds a little bit of CSS to create thin scrollbars for FireFox and WebKit-based browsers","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/thin-scrollbars","modified":"20260515072957669","tags":"$:/tags/Link CSS UI Tools DEPRECATED","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/thin-scrollbars","text":"! Deprecated\n\nAll major browsers have thin scrollbars now.\n\n! Thin Scrollbars Plugin\n\nThis plugin adds a little bit of CSS to create thin scrollbars for ~FireFox and ~WebKit-based browsers"},
{"title":"Tiddler-Creation","created":"20210324164444857","modified":"20210324164455511","type":"text/vnd.tiddlywiki"},
{"title":"TiddlyWiki","created":"20170203102523927","modified":"20170203102533399","type":"text/vnd.tiddlywiki","text":"see: http://tiddlyiki.com"},
{"title":"tocP-parent-based-toc","created":"20170203104721932","description":"This plugin creates the same UI as the TW core \"Table of Contents\" macro, but it uses a different field, to create the outline structure","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/tocP","modified":"20211004085050469","tags":"plugin $:/tags/Link TOC Table-of-Contents Outline Linking Navigation Editor","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/tocP","text":"! tocP - Parent Based TOC\n\nThis plugin creates the same UI as the TW core \"Table of Contents\" macro, ''but'' it uses a different field, to create the outline structure."},
{"title":"Tools","created":"20210324163207147","modified":"20210324163213702","type":"text/vnd.tiddlywiki"},
{"title":"trails","created":"20230825081033089","description":"Breadcrumbs & Trails -- Visualize your Context Structure","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/trails","modified":"20230825081350554","tags":"plugin $:/tags/Link TOC Table-of-Contents Outline Linking Navigation Editor Breadcrumbs Trails","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/trails","text":"! trails -- Breadcrumbs & Trails -- Visualize your Context\n\nBreadcrumbs and Trails are used as a navigational aid in user interfaces and on web pages. It allows users to keep track and maintain awareness of their locations within programs, documents, or websites."},
{"title":"trigger","created":"20191101121318449","description":"This plugin allows you have mouse \"click animations\"","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/trigger","modified":"20220422105947294","tags":"EXPERIMENTAL Advanced-Tools Development $:/tags/Link","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/trigger/","text":"!! Backup\n\nIf you use the `\u003C$trigger>` widget, with variables defined in the wrong way, it has the potential to \"brick\" your wiki!\n\nSo having ''backups'' is extremely important!\n\nThis plugin allows you have mouse \"click animations\""},
{"title":"trim-whitespace","created":"20230505100258343","description":"This plugin adds a new editor toolbar button, that allows you to trim whitespace from a selected text area","forum":"https://talk.tiddlywiki.org/t/intro-trim-whitespace-plugin-edit-toolbar-button/6925","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/trim-whitespace","modified":"20230505105742483","tags":"$:/tags/Link Tools Editor plugin","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/trim-whitespace","text":"! Whitespave Trim (Editor toolbar button)\n\nThis plugin adds a new editor toolbar button, that allows you to trim whitespace from a selected text area"},
{"title":"tw-mcp","created":"20260404141725864","description":"Connects AI assistants to TiddlyWiki via the Model Context Protocol","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/tw-mcp","modified":"20260404143102143","tags":"plugin $:/tags/Link Development mcp llm","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/tw-mcp","text":"! MCP Server Plugin\n\nThe TW MCP plugin turns any TiddlyWiki into an AI-accessible knowledge base. It lets Claude, Gemini, and other AI assistants read, search, render, and edit your wiki through a standardised protocol. With built-in safety features, proxy mode for multi-client access, and hashline edits for token-efficient conflict-free editing, it bridges the gap between personal wikis and AI workflows."},
{"title":"UI","created":"20210324164041175","modified":"20210324164057261","type":"text/vnd.tiddlywiki"},
{"title":"underlined-tabs","created":"20260515074657284","description":"Segmented-control style underlined tabs","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/underlined-tabs","modified":"20260515075133098","tags":"plugin UI $:/tags/Link theme Tabs","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/","text":"! Underlined Tabs\n\nA theme that restyles the core `.tc-tab-buttons` markup as flat tab buttons over the page background, with the selected tab marked by a 2-pixel coloured underline."},
{"title":"uni-link","created":"20170622132619091","description":"This plugin add several new options to use the TW \"link-syntax\" in an extended way. It also adds an \"aliasing\" system to the wiki","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/uni-link","modified":"20211004085105281","tags":"plugin $:/tags/Link Alias Wikitex-Extensions WikiText Editor UI Filter Formatting Advanced-Search","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/uni-link","text":"! Uni-link Plugin\n\nThis plugin add several new options to use the TW \"link-syntax\" in an extended way. It also adds an \"aliasing\" system to the wiki."},
{"title":"uuidv7","created":"20260326220604071","modified":"20260326221241650","description":"This plugin allows you to assign a UUIDv7 to the c7 field and a ULID-like value to a c32 field","forum":"","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/uuid7","tags":"Advanced-Tools EXPERIMENTAL $:/tags/Link UUIDv7","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/uuid7","text":"! UUID v7 Plugin\n\n''This is for experiments only. It's not sure, that all functions are kept in the plugin''\n\nWith this plugin, if you create a new tiddler\n\n* Open the fields editor — notice the c32 field with a value like 01KMNH-72WK-FM8S1A277T55-S8DK\n* The c32 badge at the bottom-right shows the value with its check symbol\n* The phrase badge at the bottom-left shows its mnemonic encoding\n"},
{"title":"Video","created":"20210122182624489","list":"[[How to use the Library Configuration Tiddler]]","modified":"20210122182624553","type":"text/vnd.tiddlywiki"},
{"title":"Videos","created":"20210122180544177","modified":"20210122182548896","tags":"","type":"text/vnd.tiddlywiki","text":"! List all Videos\n\n\u003C\u003Clist-links-draggable tiddler:\"Video\">>"},
{"title":"VideoThumbnail - Use the Library Configuration","background-color":"#fff","caption":"Use ~WikiLabs Library Link","color":"red","created":"20210122181308949","icon":"{{$:/core/images/video}}","image":"library-configuration.png","link":"How to use the Library Configuration Tiddler","modified":"20210122185015078","tags":"VideoThumbnail","type":"text/vnd.tiddlywiki","text":"\u003C\u003Clist-thumbnails filter:\"[all[current]]\" width:\"336\" height:\"190\">>"},
{"title":"webdav-lm","created":"20190318132812383","description":"This saver uses last-modified and if-unmodified-since HTTP header attributes, to detect file inconsistencies, which allows the server to activate server-side file compression","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/webdav-lm","modified":"20211004085139077","tags":"plugin $:/tags/Link WebDav Savers Development Server Tools","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/webdav-lm","text":"! ~WebDav last-modified Plugin\n\nThis saver uses `last-modified` and `if-unmodified-since` HTTP header attributes, to detect file inconsistencies, which allows the server to activate server-side file compression.\n\nThe core PUT saver uses etags, which don't work, if server-side file compression is active. "},
{"title":"WikiLabs","created":"20211004085857996","modified":"20211004085902477","type":"text/vnd.tiddlywiki","text":"This page: https://wikilabs.github.io/"},
{"title":"wikilabs.github.io","created":"20170203104800549","modified":"20170206130654696","tags":"main","type":"text/vnd.tiddlywiki","text":"! Main Page\n\nWork in progress!\n\nsee: https://wikilabs.github.io/"},
{"title":"Wikitex-Extensions","created":"20210324163428099","modified":"20210324163518780","type":"text/vnd.tiddlywiki"},
{"title":"WikiText","created":"20210324163405070","modified":"20210324163418345","type":"text/vnd.tiddlywiki"},
{"title":"wltm-open-story","created":"20201226173619022","description":"This plugin will allow you to create / save / reload \"story river\" configurations.","forum":"TODO","git-issues":"https://github.com/wikilabs/plugins/issues","git-repo":"https://github.com/wikilabs/plugins/tree/master/wikilabs/wltm-open-story","modified":"20211004085607794","tags":"EXPERIMENTAL Advanced-Tools Search Story-River Story Import Export","type":"text/vnd.tiddlywiki","url":"https://wikilabs.github.io/editions/wltm-open-story","text":"! Open Story River\n\nThis plugin will allow you to create / save / reload \"story river\" configurations. The UI is way to complicated atm. There is a lot TODO ;)"}
]</script><div id="storeArea" style="display:none;"></div>
<!--~~ Raw markup for the bottom of the body section ~~-->
</body>
<script src="./tiddlywiki.js" onerror="alert('Error: Cannot load tiddlywiki.js');"></script>
</html>