diff --git a/drag-and-drop-interop.html b/drag-and-drop-interop.html
new file mode 100644
index 000000000..ecd7aba12
--- /dev/null
+++ b/drag-and-drop-interop.html
@@ -0,0 +1,35 @@
+
+
+
+
+ Drag and Drop Interoperability with TiddlyWiki Demo
+
+
+
+
+ Drag me to a TiddlyWiki window
+
+
+
+
\ No newline at end of file
diff --git a/editions/dev/tiddlers/HelloThere.tid b/editions/dev/tiddlers/HelloThere.tid
index 50052f2c8..caa8ed435 100644
--- a/editions/dev/tiddlers/HelloThere.tid
+++ b/editions/dev/tiddlers/HelloThere.tid
@@ -14,6 +14,7 @@ Welcome to the developer documentation for TiddlyWiki (https://tiddlywiki.com/).
** HookMechanism
** [[Using ES2016 for Writing Plugins]]
** [[Adding Babel Polyfill to TiddlyWiki]]
+** [[TiddlyWiki Drag and Drop Interoperability]]
* The original developer documentation from https://tiddlywiki.com:
** [[TiddlyWiki for Developers]]
** [[TiddlyWiki Coding Style Guidelines]]
diff --git a/editions/dev/tiddlers/new/TiddlyWiki Drag and Drop Interop.tid b/editions/dev/tiddlers/new/TiddlyWiki Drag and Drop Interop.tid
new file mode 100644
index 000000000..6808de4dd
--- /dev/null
+++ b/editions/dev/tiddlers/new/TiddlyWiki Drag and Drop Interop.tid
@@ -0,0 +1,15 @@
+title: TiddlyWiki Drag and Drop Interoperability
+
+It is straightforward to allow any HTML file to interoperate with TiddlyWiki's drag and drop implementation.
+
+This example shows how to attach draggable data to a DOM element. The data is provided in two different forms:
+
+* the string data is used if the element is dragged onto a text editing area
+* the tiddler data is used if the element is dragged into TiddlyWiki's import area
+
+<$button>
+<$action-sendmessage $message="tm-download-file" $param="$:/dev/save/dragndropinterop" filename="index.html"/>
+Download this sample code
+$button>
+
+<$codeblock code={{DragAndDropInterop}} language="text/html"/>
diff --git a/editions/dev/tiddlers/new/dragndropinterop.html b/editions/dev/tiddlers/new/dragndropinterop.html
new file mode 100644
index 000000000..ecd7aba12
--- /dev/null
+++ b/editions/dev/tiddlers/new/dragndropinterop.html
@@ -0,0 +1,35 @@
+
+
+
+
+ Drag and Drop Interoperability with TiddlyWiki Demo
+
+
+
+
+ Drag me to a TiddlyWiki window
+
+
+
+
\ No newline at end of file
diff --git a/editions/dev/tiddlers/new/dragndropinterop.html.meta b/editions/dev/tiddlers/new/dragndropinterop.html.meta
new file mode 100644
index 000000000..d4adb96b9
--- /dev/null
+++ b/editions/dev/tiddlers/new/dragndropinterop.html.meta
@@ -0,0 +1,3 @@
+title: DragAndDropInterop
+type: text/html
+
diff --git a/editions/dev/tiddlers/new/save-dragndropinterop.tid b/editions/dev/tiddlers/new/save-dragndropinterop.tid
new file mode 100644
index 000000000..3e9eab89f
--- /dev/null
+++ b/editions/dev/tiddlers/new/save-dragndropinterop.tid
@@ -0,0 +1,3 @@
+title: $:/dev/save/dragndropinterop
+
+<$view tiddler="DragAndDropInterop" field="text"/>
diff --git a/editions/tw5.com/tiddlers/community/resources/Grok TiddlyWiki by Soren Bjornstad.tid b/editions/tw5.com/tiddlers/community/resources/Grok TiddlyWiki by Soren Bjornstad.tid
new file mode 100644
index 000000000..50f1972ef
--- /dev/null
+++ b/editions/tw5.com/tiddlers/community/resources/Grok TiddlyWiki by Soren Bjornstad.tid
@@ -0,0 +1,16 @@
+created: 20210519110226889
+modified: 20210519110226889
+tags: [[Other Resources]]
+title: "Grok TiddlyWiki" by Soren Bjornstad
+type: text/vnd.tiddlywiki
+url: https://groktiddlywiki.com/read/
+
+This new textbook from Soren Bjornstad is highly recommended for learning ~TiddlyWiki. The presentation and design are also a first class example of using ~TiddlyWiki.
+
+From the site:
+
+> Grok ~TiddlyWiki is a textbook that helps you build a deep, lasting understanding of and proficiency with ~TiddlyWiki through a combination of detailed explanations, practical exercises, and spaced-repetition reviews of prompts called takeaways.
+
+{{!!url}}
+
+
diff --git a/editions/tw5.com/tiddlers/community/resources/TW5-firebase_ TiddlyWiki5 for Google Firebase by Peter Neumark.tid b/editions/tw5.com/tiddlers/community/resources/TW5-firebase_ TiddlyWiki5 for Google Firebase by Peter Neumark.tid
index ec5d60f58..0458b4a55 100644
--- a/editions/tw5.com/tiddlers/community/resources/TW5-firebase_ TiddlyWiki5 for Google Firebase by Peter Neumark.tid
+++ b/editions/tw5.com/tiddlers/community/resources/TW5-firebase_ TiddlyWiki5 for Google Firebase by Peter Neumark.tid
@@ -1,4 +1,4 @@
-caption: ~TW5-firebase
+caption: TW5-firebase
color: #FFEB3B
community-author: Peter Neumark
created: 20210115121027582
diff --git a/editions/tw5.com/tiddlers/concepts/ShadowTiddlers.tid b/editions/tw5.com/tiddlers/concepts/ShadowTiddlers.tid
index 3e1336c1f..014bb5fe4 100644
--- a/editions/tw5.com/tiddlers/concepts/ShadowTiddlers.tid
+++ b/editions/tw5.com/tiddlers/concepts/ShadowTiddlers.tid
@@ -1,11 +1,19 @@
-title: ShadowTiddlers
-tags: Concepts
-modified: 201308091623
+\define actions()
+<$action-setfield $tiddler="$:/state/tab/moresidebar-1850697562" $field="text" $value="$:/core/ui/MoreSideBar/Shadows"/>
+<$action-setfield $tiddler="$:/state/tab/sidebar--595412856" $field="text" $value="$:/core/ui/SideBar/More"/>
+\end
+\define click(text)
+<$button actions=<>>$text$$button>
+\end
ShadowTiddlers are tiddlers that are loaded from within [[Plugins]]. Unlike ordinary tiddlers, they don't appear in most lists.
ShadowTiddlers can be overridden with an ordinary tiddler of the same name. If that tiddler is subsequently deleted then the original shadow tiddler is automatically restored.
-The current shadow tiddlers are:
+!! Overridden Shadow Tiddlers
-<$list filter="[all[shadows]sort[title]]"/>
+<>
+
+!! Shadow Tiddlers
+
+A full list of shadow tiddlers can be found in the sidebar in the "More" -> "Shadows" tab
diff --git a/editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/Demonstration_ keyboard-driven-input Macro.tid b/editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/Demonstration_ keyboard-driven-input Macro.tid
new file mode 100644
index 000000000..519f01c0f
--- /dev/null
+++ b/editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/Demonstration_ keyboard-driven-input Macro.tid
@@ -0,0 +1,121 @@
+created: 20210222140234737
+modified: 20210520174049056
+tags: Learning
+title: Demonstration: keyboard-driven-input Macro
+type: text/vnd.tiddlywiki
+
+\define allshortcuts(descriptor)
+<$wikify name=scutlist text=<> >
+<$list filter="[split[ ]join[ or ]addprefix[]addsuffix[]]" variable=scts><>$list>
+$wikify>
+\end
+
+\define kdi-demo-textmacrocall()
+```
+<$macrocall $name=keyboard-driven-input
+ tiddler="$(tiddler)$"
+ storeTitle="$(storeTitle)$"
+ selectionStateTitle="$(selectionStateTitle)$"
+ configTiddlerFilter="$(configTiddlerFilter)$"
+ />
+```
+\end
+
+<$vars configTiddlerFilter="[[kdi-demo-configtid]]" tiddler="kdi-demo-tiddler" storeTitle="kdi-demo-storeTitle" selectionStateTitle="kdi-demo-selectionStateTitle" >
+
+The [[keyboard-driven-input Macro]] is used to create filtered lists that update as the user types. It also allows navigating the lists, and invoking macros using list items, with the keyboard.
+
+It consists of an ''[[edit-text widget|EditTextWidget]]'' wrapped in [[keyboard widgets|KeyboardWidget]]. There are <<.def keyboard>> widgets to listen for `((input-accept))`, `((input-accept-variant))`, and `((input-cancel))` keyboard shortcuts, but there is no default behaviour in response to these events; macros must be written to suit the use-case. There is also no default visualisation of the filtered options list.
+
+!!Types of keyboard input handled by the <<.var keyboard-driven-input>> macro:
+
+!!!Non-configurable:
+
+The following keyboard events invoke macros defined alongside <<.var keyboard-driven-input>> in [[$:/core/macros/keyboard-driven-input]].
+
+|Input |Purpose |Macro |h
+|typing input |composing a string to be used within list filters |<<.var keyboard-input-actions>> |
+|`((input-up))` (<>) |temporarily selecting the previous item in the filtered list |<<.var input-next-actions>> with parameters <<.param afterOrBefore>>=`"before"`, <<.param reverse>>=`"reverse[]"` |
+|`((input-down))` (<>) |temporarily selecting the next item in the filtered list |<<.var input-next-actions>> with <<.param afterOrBefore>>=`"after"`, <<.param reverse>>=`""` |
+
+All of the above actions generate or modify data which <<.var keyboard-driven-input>> keeps in tiddlers specified using the macro's parameters. The data can then be accessed not only by the macros invoked by keyboard shortcuts, but also outside of these, e.g. a macro to display the filtered list(s).
+
+!!!Configurable through parameters:
+
+The following keyboard events invoke macros whose names are specified in parameters to <<.var keyboard-driven-input>>. The intended purpose is suggested by the parameter name, but there are no default macros defined within [[$:/core/macros/keyboard-driven-input]].
+
+|[[Keyboard shortcut descriptor |Keyboard Shortcut Descriptor]] |Key combination |Parameter |h
+|`((input-accept))` |<> |<<.param inputAcceptActions>> |
+|`((input-accept-variant))` |<> |<<.param inputAcceptVariantActions>> |
+|`((input-cancel))` |<> |<<.param inputCancelActions>> |
+
+<<.var keyboard-driven-input>> can be seen in action as part of various core features in TiddlyWiki, e.g.: the [[search feature|Searching in TiddlyWiki]], the [[tag-picker Macro]], and dropdown interfaces in the [[Editor toolbar]] such as [[Insert link]].
+
+!!Minimal ingredients for a demonstration
+
+Keeping in mind that the <<.var keyboard-driven-input>> macro does not, by itself, display list results, or do anything with a selected option, a minimal demonstration of the <<.var keyboard-driven-input>> macro requires:
+
+# ''a tiddler, containing a filter'' whose results depend on the user's text input, to generate the options from which the user can select
+# ''several parameters:''
+#*''a filter'' to return the title of the tiddler where the filter described in step 1 can be found, and
+#*''tiddler titles'' to use for storing state information in response to input events. These tiddlers do not need to exist already. If they do exist, the <<.var keyboard-driven-input>> macro will change their contents.
+
+!!The search filter(s)
+
+By default, <<.var keyboard-driven-input>> will look for filters in the <<.field first-search-filter>> and <<.field second-search-filter>> fields of a tiddler (whose title is specified by a parameter discussed below).
+
+This filter can refer to a variable called <<.var userInput>>, which shows the contents of the <<.def edit-text>> widget, as stored in a state tiddler (discussed below), at the time of the latest <> or <> event.
+
+''Note:'' If this filter is to be referred to in a context outside the <<.var keyboard-driven-input>> macro (such as in a popup showing the filtered options), the variable <<.var userInput>> has to be defined in those contexts as well (by reading it from a state tiddler).
+
+!!Minimal parameters
+
+|Parameter name |Notes |h
+|<<.param configTiddlerFilter>> |This is a filter, rather than a tiddler title, allowing conditional behaviour (e.g. checking for an active tab, or preferring a filter that may not be present, with a fallback).
The title returned must belong to an existing tiddler, containing at least one filter with which <<.var keyboard-driven-input>> can generate its results list. |
+|<<.param tiddler>> |This tiddler contains either the typed input, or the instantaneous result selection, depending upon the most recent event. It is updated with each keystroke in the ''edit-text'' widget, //and// when the user uses the <> or <> key to cycle through filtered results. |
+|<<.param storeTitle>> |This tiddler always reflects the user input (transcluded from the tiddler <<.param tiddler>> after each keystroke into the ''edit-text'' widget). |
+|<<.param selectionStateTitle>> |This tiddler is updated on <> or <> events and contains either the user input with the suffix `-userInput`, or the instantaneous selection with the suffix `-primaryList` or `-secondaryList`, depending on which of up to two filters generated the list it came from. |
+
+!!Demonstration setup
+
+I have created a tiddler called <$list filter=<> /> and put the following filter into its <<.field first-search-filter>> field:
+
+<$list filter=<> ><$text text={{!!first-search-filter}}/>$list>
.
+
+This filters for non-system tiddlers whose titles contain the text the user has typed.
+
+To use the above filter with <<.var keyboard-driven-input>>, the value of the parameter <<.param configTiddlerFilter>> should be a filter that returns <$list filter=<> />.
+
+I can select <<.param tiddler>>, <<.param storeTitle>>, and <<.param selectionStateTitle>> fairly arbitrarily (just making sure not to use titles of tiddlers that I do not want changed).
+
+This demonstration can now be invoked with the following macro call:
+
+<>
+
+!!Demo
+
+Try typing in here: <$macrocall $name=keyboard-driven-input
+ tiddler=<>
+ storeTitle=<>
+ selectionStateTitle=<>
+ configTiddlerFilter=<>
+ />
+
+Observe the changes in the various state tiddlers in the below table. Use <> and <> keys to navigate among filter results. If nothing changes, try a shorter input to widen the filter. If the input has zero length, the list will contain all non-system tiddlers.
+
+@@.tablestyle
+
+|Parameter name |Tiddler title |Contents of <<.field text>> field of the tiddler |h
+|<<.param tiddler>> |{{{[]}}} |<$text text={{{[get[text]]}}}/>
|
+|<<.param storeTitle>> |{{{[]}}} |<$text text= {{{[get[text]]}}}/>
|
+|<<.param selectionStateTitle>> |{{{[]}}} |<$text text={{{[get[text]]}}}/>
|
+@@
+
+The <<.var keyboard-driven-input>> macro has many parameters available, including all the attributes of the enclosed ''edit-text'' widget, which make it very flexible in how it is used and how results can be displayed and interacted with.
+
+See also: [[Customising search results]] and [[$:/core/ui/DefaultSearchResultList]]
+
+
\ No newline at end of file
diff --git a/editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/kdi-demo-configtid.tid b/editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/kdi-demo-configtid.tid
new file mode 100644
index 000000000..f13ff6b15
--- /dev/null
+++ b/editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/kdi-demo-configtid.tid
@@ -0,0 +1,6 @@
+created: 20210131043724146
+first-search-filter: [!is[system]search:titlesort[]]
+modified: 20210204012422020
+tags:
+title: kdi-demo-configtid
+type: text/vnd.tiddlywiki
\ No newline at end of file
diff --git a/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid b/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid
index 65296c033..e9171f190 100644
--- a/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid
+++ b/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid
@@ -18,7 +18,7 @@ The information above should be interpreted as follows:
* mainRender is the time taken for the initial display of the page template
* styleRefresh is the time taken to refresh the page stylesheet
-* mainRender is the time taken to refresh the main page template
+* mainRefresh is the time taken to refresh the main page template
As an example, try switching between the sidebar tabs to compare how long they take to render.
diff --git a/editions/tw5.com/tiddlers/filters/enlist Operator.tid b/editions/tw5.com/tiddlers/filters/enlist Operator.tid
index 18df375f6..e45e97c2a 100644
--- a/editions/tw5.com/tiddlers/filters/enlist Operator.tid
+++ b/editions/tw5.com/tiddlers/filters/enlist Operator.tid
@@ -1,6 +1,6 @@
caption: enlist
created: 20170221144241063
-modified: 20190610165246154
+modified: 20210505100241872
op-input: ignored
op-neg-input: a [[selection of titles|Title Selection]]
op-neg-output: those input titles that are <<.em not>> listed in <<.place L>>
@@ -14,7 +14,7 @@ tags: [[Filter Operators]] [[Field Operators]] [[Selection Constructors]] [[Nega
title: enlist Operator
type: text/vnd.tiddlywiki
-<<.tip " Literal filter operands cannot contain square brackets but you can work around the issue by using a variable:">>
+<<.tip """Literal filter operands cannot contain square brackets but you can work around the issue by using a variable. ''Learn more at:'' [[SetWidget]] documentation under the heading "Filtered List Variable Assignment" """>>
```
<$set name="myList" value="first [[second with a space]] third">
@@ -22,5 +22,4 @@ type: text/vnd.tiddlywiki
...
```
-
<<.operator-examples "enlist">>
diff --git a/editions/tw5.com/tiddlers/filters/examples/unique Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/unique Operator (Examples).tid
new file mode 100644
index 000000000..5a3f5d7c0
--- /dev/null
+++ b/editions/tw5.com/tiddlers/filters/examples/unique Operator (Examples).tid
@@ -0,0 +1,8 @@
+created: 20210216203925301
+modified: 20210217003209935
+tags: [[unique Operator]] [[Operator Examples]]
+title: unique Operator (Examples)
+
+To remove duplicate entries from a list where deduplication has been prevented using the [[filter run prefix|Filter Expression]] `=`:
+
+<<.operator-example 1 """=[[E]] =[[A]] =[[B]] =[[C]] =[[C]] =[[D]] =[[C]] +[unique[]]""">>
\ No newline at end of file
diff --git a/editions/tw5.com/tiddlers/filters/unique.tid b/editions/tw5.com/tiddlers/filters/unique.tid
new file mode 100644
index 000000000..672817968
--- /dev/null
+++ b/editions/tw5.com/tiddlers/filters/unique.tid
@@ -0,0 +1,10 @@
+caption: unique
+op-input: a list of items
+op-output: a list of unique items
+op-parameter: ignored
+op-purpose: remove all duplicate items from the current list
+tags: [[Filter Operators]] [[Order Operators]] [[Listops Operators]]
+title: unique Operator
+type: text/vnd.tiddlywiki
+
+<<.operator-examples "unique">>
diff --git a/editions/tw5.com/tiddlers/hellothere/A Gentle Guide to TiddlyWiki.tid b/editions/tw5.com/tiddlers/hellothere/A Gentle Guide to TiddlyWiki.tid
index ce3024414..9d2a93d34 100644
--- a/editions/tw5.com/tiddlers/hellothere/A Gentle Guide to TiddlyWiki.tid
+++ b/editions/tw5.com/tiddlers/hellothere/A Gentle Guide to TiddlyWiki.tid
@@ -1,5 +1,5 @@
created: 20150325170720682
-modified: 20150926171049725
+modified: 20210519110623819
tags: HelloThere
title: A Gentle Guide to TiddlyWiki
type: text/vnd.tiddlywiki
@@ -16,4 +16,7 @@ How can you make ~TiddlyWiki work for you? We recommend you start with our intro
<>
-Also see [[TiddlyWiki Video Tutorials by Francis Meetze]]
\ No newline at end of file
+Also see:
+
+* [["Grok TiddlyWiki" by Soren Bjornstad]]
+* [[TiddlyWiki Video Tutorials by Francis Meetze]]
\ No newline at end of file
diff --git a/editions/tw5.com/tiddlers/hellothere/HelloThumbnail.tid b/editions/tw5.com/tiddlers/hellothere/HelloThumbnail.tid
index bb42aa6a7..f50bccca6 100644
--- a/editions/tw5.com/tiddlers/hellothere/HelloThumbnail.tid
+++ b/editions/tw5.com/tiddlers/hellothere/HelloThumbnail.tid
@@ -1,5 +1,5 @@
created: 20150414070451144
-list: [[HelloThumbnail - Introduction Video]] [[HelloThumbnail - Gentle Guide]] [[HelloThumbnail - Firefox Apocalypse]] [[HelloThumbnail - Latest Version]] [[HelloThumbnail - TiddlyWikiLinks]] [[HelloThumbnail - TiddlyMap]] [[HelloThumbnail - HelpingTiddlyWiki]] [[HelloThumbnail - Developers]] [[HelloThumbnail - Classic]]
+list: [[HelloThumbnail - Introduction Video]] [[HelloThumbnail - Gentle Guide]] [[HelloThumbnail - Grok TiddlyWiki]] [[HelloThumbnail - Firefox Apocalypse]] [[HelloThumbnail - Latest Version]] [[HelloThumbnail - TiddlyWikiLinks]] [[HelloThumbnail - TiddlyMap]] [[HelloThumbnail - HelpingTiddlyWiki]] [[HelloThumbnail - Developers]] [[HelloThumbnail - Classic]]
modified: 20150414070948246
title: HelloThumbnail
type: text/vnd.tiddlywiki
diff --git a/editions/tw5.com/tiddlers/hellothere/thumbnails/HelloThumbnail - Grok TiddlyWiki.tid b/editions/tw5.com/tiddlers/hellothere/thumbnails/HelloThumbnail - Grok TiddlyWiki.tid
new file mode 100644
index 000000000..a8cb2d5be
--- /dev/null
+++ b/editions/tw5.com/tiddlers/hellothere/thumbnails/HelloThumbnail - Grok TiddlyWiki.tid
@@ -0,0 +1,6 @@
+title: HelloThumbnail - Grok TiddlyWiki
+tags: HelloThumbnail
+color: #D5B7EA
+image: Grok TiddlyWiki Banner
+caption: Grok ~TiddlyWiki
+link: "Grok TiddlyWiki" by Soren Bjornstad
diff --git a/editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png b/editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png
new file mode 100644
index 000000000..1a2bec578
Binary files /dev/null and b/editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png differ
diff --git a/editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png.meta b/editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png.meta
new file mode 100644
index 000000000..a0595cc9f
--- /dev/null
+++ b/editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png.meta
@@ -0,0 +1,3 @@
+title: Grok TiddlyWiki Banner
+type: image/png
+tags: picture
diff --git a/editions/tw5.com/tiddlers/macros/TabsMacro.tid b/editions/tw5.com/tiddlers/macros/TabsMacro.tid
index b55e43545..310103e23 100644
--- a/editions/tw5.com/tiddlers/macros/TabsMacro.tid
+++ b/editions/tw5.com/tiddlers/macros/TabsMacro.tid
@@ -1,10 +1,9 @@
caption: tabs
created: 20131228162203521
-modified: 20180408084453861
+modified: 20210525204556911
tags: Macros [[Core Macros]]
title: tabs Macro
type: text/vnd.tiddlywiki
-
The <<.def tabs>> [[macro|Macros]] presents a [[selection of tiddlers|Title Selection]] as a set of tabs that the user can switch between.
The tabs display the <<.field caption>> field of a tiddler if it has one, or the tiddler's title otherwise. If specified, the tabs display the <<.field tooltip>> field of a tiddler as the respective button tooltip.
@@ -28,7 +27,7 @@ By default the tabs are arranged horizontally above the content. To get vertical
;retain
: Optionally, "yes" specifies that the content of the tabs should be retained when switching to another tab, avoiding re-rendering it (this can be useful to avoid video or audio sources unexpectedly resetting)
;actions
-: Optionally, actions can be specified that are triggered when changing a tab
+: Optionally, actions can be specified that are triggered when changing a tab. Within the actions, the title of the selected tab is available in the <<.var currentTab>> variable and the `currentTiddler` variable from outside the tabs macro is available in the <<.var save-currentTiddler>>
;explicitState
: Optionally, an explicit state title can be specified. It will be preferred over the internally computed (qualified) state title
diff --git a/editions/tw5.com/tiddlers/macros/examples/qualify.tid b/editions/tw5.com/tiddlers/macros/examples/qualify.tid
index fc48ecf24..81a9764d0 100644
--- a/editions/tw5.com/tiddlers/macros/examples/qualify.tid
+++ b/editions/tw5.com/tiddlers/macros/examples/qualify.tid
@@ -15,6 +15,4 @@ eg=""""""/>
-
{{$:/editions/tw5.com/macro-examples/qualify-transcluded}}
-
diff --git a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid
index 720e612d1..8baff655c 100644
--- a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid
+++ b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid
@@ -20,3 +20,6 @@ The additional parameters are:
|secondSearchFilterField |the field of the configTiddler where the second search-filter is stored. Defaults to <<.field second-search-filter>> |
|filterMinLength |the minimum length of the user input after which items are filtered |
+See [[Demonstration: keyboard-driven-input Macro]] for further guidance on using this macro.
+
+
diff --git a/editions/tw5.com/tiddlers/saving/Saving on TiddlyHost.tid b/editions/tw5.com/tiddlers/saving/Saving on TiddlyHost.tid
new file mode 100644
index 000000000..7cb9a1ec7
--- /dev/null
+++ b/editions/tw5.com/tiddlers/saving/Saving on TiddlyHost.tid
@@ -0,0 +1,17 @@
+caption: ~TiddlyHost
+color: #29B6F6
+community-author: Simon Baird
+created: 20210422191232572
+delivery: Service
+description: Online service for creating and hosting TiddlyWikis
+method: save
+modified: 20210423003921468
+tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP Safari Saving Windows iOS Edge
+title: Saving on TiddlyHost
+type: text/vnd.tiddlywiki
+
+[img width=140 [https://github.com/simonbaird/tiddlyhost/raw/main/rails/app/assets/images/logo-800.png]]
+
+[[TiddlyHost.com|https://tiddlyhost.com/]] is a hosting service for TiddlyWiki created by Simon Baird. Once you sign up and confirm your email you can create "sites", (i.e. ~TiddlyWikis), with support for online saving. Sites can be private or public, and you can optionally list them on the taggable and searchable [[TiddlyHost Hub|https://tiddlyhost.com/hub]] where they'll be discoverable by others.
+
+Unlike [[TiddlySpot|Saving on TiddlySpot]], [[TiddlyHost|https://tiddlyhost.com]] is secure, open source, and has proper support for TiddlyWiki5. It also allows uploading existing ~TiddlyWiki files, supports TiddlyWikiClassic, and lets you claim ownership of your ~TiddlySpot sites. For more information see the [[FAQ|https://github.com/simonbaird/tiddlyhost/wiki/FAQ]] and the [[About|https://tiddlyhost.com/about]] page.
diff --git a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid
index 77361f307..e65d171ae 100644
--- a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid
+++ b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid
@@ -1,56 +1,46 @@
caption: ~TiddlySpot
color: #29B6F6
-community-author: Simon Baird and Daniel Baird
+community-author: Simon Baird & Daniel Baird
created: 20130825213500000
delivery: Service
-description: Free online service for hosting TiddlyWiki files
+description: Online TiddlyWiki hosting. (Deprecated in favour of TiddlyHost)
method: save
-modified: 20200507202953380
+modified: 20210423004027196
tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP Safari Saving Windows iOS Edge
title: Saving on TiddlySpot
type: text/vnd.tiddlywiki
-[[TiddlySpot|http://tiddlyspot.com]] is a free hosting service for TiddlyWiki documents from Simon Baird and Daniel Baird.
+----
+<<.warning "''Please note: ~TiddlySpot is in maintenance mode and no longer allows new sites to be created. Instead of ~TiddlySpot you can now use [[TiddlyHost|Saving on TiddlyHost]], a new service from the creator of ~TiddlySpot.''">>
+----
+[img[https://raw.githubusercontent.com/simonbaird/tiddlyhost/main/rails/app/assets/images/tiddlyspot-banner-logo.png]]
-! Setting up a TiddlyWiki on ~TiddlySpot
-To set up a [[TiddlyWiki Classic|TiddlyWikiClassic]], you merely create a new wiki at http://tiddlyspot.com
+[[TiddlySpot.com|http://tiddlyspot.com]] is a hosting service for TiddlyWiki created in 2006 by Simon Baird and Daniel Baird.
-!!TiddlyWiki5 on ~TiddlySpot
-~TiddlyWiki5 also functions well on ~TiddlySpot but this version is not offered directly in the ~TiddlySpot set-up.
+In early 2021 it was superseded by [[TiddlyHost|Saving on TiddlyHost]], a new, secure, modern reimagining of ~TiddlySpot. Creating new sites on ~TiddlySpot is no longer supported, (though sites created in 2020 or earlier are still functional).
-The simplest way to create a new ~TiddlySpot with ~TiddlyWiki5 is probably through the community created site http://tiddlywiki5.tiddlyspot.com
+!! Security warning for ~TiddlySpot
-Alternatively, you can upload an existing ~TiddlyWiki5 document from your local disc to ~TiddlySpot by following these steps:
-
-# Sign up for a new wiki at http://tiddlyspot.com/, and remember the wiki name and password
-# Open your locally stored TiddlyWiki document in your browser
-# Fill in the ~TiddlySpot wikiname and password in ''Saving'' tab of the ''control panel'' <<.icon $:/core/images/options-button>>
-# Click the <<.icon $:/core/images/save-button>> ''save changes'' button. You should get a confirmation notification at the top right saying ''Saved wiki''. Saving can take several seconds if you're on a slow connection or working with a large wiki.
-# Navigate to your ~TiddlySpot URL at http://{wikiname}.tiddlyspot.com/
-
-Note that your password is sent unencrypted when using ~TiddlySpot. From http://faq.tiddlyspot.com/:
+Note that your password is sent unencrypted when using ~TiddlySpot. From the [[FAQ|http://faq.tiddlyspot.com/]]:
<<<
''Is Tiddlyspot secure?''
-No. Tiddlyspot does not use SSL/https. Your password is sent in clear text when uploading and when authenticating to access a private site. This means that your Tiddlyspot is vulnerable to packet sniffing and your password could be discovered by a malicious third party. Also your data is transmitted unencrypted when you view your site, even if it is a private site. For this reason please don't put sensitive information such as banking details in your Tiddlyspot and don't use a password that you use for other high security sites.
+No. Tiddlyspot does not use SSL/https, so all ~TiddlySpot web traffic is vulnerable to packet sniffing. This means your password and site data could be intercepted by a malicious third party. For this reason, please don't keep sensitive information in your ~TiddlySpot site, and don't use a password that you use for other web sites.
<<<
-! Problems with saving on ~TiddlySpot
+!! Problems with saving on ~TiddlySpot
-In case you run into this error when uploading a new or freshly upgraded local TiddlyWiki to ~TiddlySpot :
+In case you run into this error when uploading a freshly upgraded local TiddlyWiki to ~TiddlySpot:
<<<
-Error while saving:
-
-Error:NS_ERROR_DOM_BAD_URI: Access to restricted URI denied
+Error: NS_ERROR_DOM_BAD_URI: Access to restricted URI denied
<<<
The upgrade operation falls foul of a security restriction in Firefox. Until this can be resolved, we suggest using Chrome.
-*# Use Chrome to open the local TiddlyWiki document you want to upload to ~TiddlySpot and follow the steps 1 through 5 described above
-*# Once you've checked the ~TiddlySpot-hosted TiddlyWiki loads properly in Chrome, you should be able to access, edit and [[save using TiddlyFox|Saving with TiddlyFox]] again
-* After you've uploaded your local document once, further editing and saving of the online version hosted on ~TiddlySpot should work with any modern browser of your choice.
-** Don't forget to fill in the ~TiddlySpot wikiname and password in your ~TiddlySpot TiddlyWiki control panel for any new browser you want to use for saving changes
+* Use Chrome to open the local TiddlyWiki document you want to upload to ~TiddlySpot and follow the steps 1 through 5 described at [[Upgrading]].
+* Once you've checked the ~TiddlySpot-hosted TiddlyWiki loads properly in Chrome, you should be able to access, edit and [[save using TiddlyFox|Saving with TiddlyFox]] again.
+* After you've uploaded your local document once, further editing and saving of the online version hosted on ~TiddlySpot should work with any modern browser of your choice. (Don't forget to fill in the ~TiddlySpot password in your ~TiddlySpot TiddlyWiki control panel for any new browser you want to use for saving changes.)
-* //See also : [[Upgrading]]//
+//See also: [[Upgrading]]//
diff --git a/editions/tw5.com/tiddlers/saving/TiddlyWiki in the Sky for Dropbox.tid b/editions/tw5.com/tiddlers/saving/TiddlyWiki in the Sky for Dropbox.tid
index 715a1f9c0..c3fbfcd2c 100644
--- a/editions/tw5.com/tiddlers/saving/TiddlyWiki in the Sky for Dropbox.tid
+++ b/editions/tw5.com/tiddlers/saving/TiddlyWiki in the Sky for Dropbox.tid
@@ -12,6 +12,6 @@ url: https://twcloud.github.io/tw5-dropbox/
Originally built by Jeremy Ruston and now maintained by Arlen Beiler, TiddlyWiki Cloud (formerly known as TiddlyWiki in the Sky for Dropbox) is an online service that lets you edit TiddlyWiki documents directly in your own Dropbox using just a browser.
-It works with TiddlyWiki 5 and Classic.
+It works with TiddlyWiki 5. As for TiddlyWiki Classic, the mainstream loader does not work, and a newer loader may work.
https://twcloud.github.io/
diff --git a/editions/tw5.com/tiddlers/widgets/$__docs_anyField.tid b/editions/tw5.com/tiddlers/widgets/$__docs_anyField.tid
new file mode 100644
index 000000000..3e0c7f434
--- /dev/null
+++ b/editions/tw5.com/tiddlers/widgets/$__docs_anyField.tid
@@ -0,0 +1,8 @@
+created: 20210505094244703
+field: list
+modified: 20210505094434740
+tags:
+title: $:/docs/anyField
+type: text/vnd.tiddlywiki
+
+This tiddler is needed for the last [[SetWidget]] example
\ No newline at end of file
diff --git a/editions/tw5.com/tiddlers/widgets/SetWidget.tid b/editions/tw5.com/tiddlers/widgets/SetWidget.tid
index d34fa1658..12ed35176 100644
--- a/editions/tw5.com/tiddlers/widgets/SetWidget.tid
+++ b/editions/tw5.com/tiddlers/widgets/SetWidget.tid
@@ -1,6 +1,6 @@
caption: set
created: 20131115182700000
-modified: 20180315165405442
+modified: 20210505095640228
tags: Widgets
title: SetWidget
type: text/vnd.tiddlywiki
@@ -15,79 +15,106 @@ The content of the `<$set>` widget is the scope for the value assigned to the va
|!Attribute |!Description |
|name |The name of the variable to assign (defaults to "currentTiddler") |
-|value |The value to assign to the variable if the filter is missing or not empty |
+|value |The value to assign to the variable if the <<.attr filter>> attribute is missing or not empty |
|tiddler |<<.from-version "5.1.15">> Optional title of the tiddler from which to read the value |
|subtiddler |<<.from-version "5.1.16">> Optionally specifies the title of a subtiddler within a plugin tiddler identified by the ''tiddler'' attribute |
|field |<<.from-version "5.1.15">> Optional field of the tiddler from which to read the value (only used if ''tiddler'' is used) |
|index |<<.from-version "5.1.15">> Optional index of the tiddler from which to read the value (only used if ''tiddler'' is used) |
-|filter |An optional filter to be evaluated and assigned to the variable (see below) |
+|filter |An optional filter to be evaluated and assigned to the variable (see "Filtered List Variable Assignment" below). The variable can be used with the <<.olink enlist>> operator |
|select |<<.from-version "5.1.14">> An optional zero-based index of the item to return from the filter output (see below) |
|emptyValue |The value to assign to the variable if the specified value is missing or empty (see below) |
<<.tip """If the value of your variable is enclosed in double square brackets this might indicate that you are returning a list of values from the filter. To use a single title from the filter output without the double square brackets see ''Filtered Item Variable Assignment'' below.""">>
+! Examples
+
!! Simple Variable Assignment
The simplest way of using set variable widget assigns a string to a variable. The following example assigns a literal string
-```
-<$set name="myVariable" value="Some text">
+<<<
+
+<$macrocall $name='wikitext-example-without-html'
+src='<$set name="myVariable" value="Some text">
<$text text=<>/>
-$set>
-```
+$set>' />
+
+<<<
Both the name and value attributes can be transcluded. For example:
-```
-<$set name=<> value={{template!!text}}>
-<$text text=<>/>
-$set>
-```
+<<<
+
+<$macrocall $name='wikitext-example-without-html'
+src='<$set name=anotherVariable value="myVariable">
+ <$set name=<> value={{$:/language/DefaultNewTiddlerTitle}}>
+ <$text text=<>/>
+ $set>
+$set>' />
+
+<<<
!! Conditional Variable Assignment
This form of the set variable widget chooses one of two specified values according to whether a filter evaluates to an empty list. Here's an example that sets a variable according to whether the current tiddler is called "myMagicTitle":
-```
-<$set name="myVariable" filter="[all[current]field:title[myMagicTitle]]" value="It's magic" emptyValue="It's not magic">
+<<<
+
+<$macrocall $name='wikitext-example-without-html'
+src="""<$set name="myVariable" filter="[all[current]field:title[myMagicTitle]]" value="It's magic" emptyValue="It's not magic">
<$text text=<>/>
-$set>
-```
+$set>""" />
+
+<<<
!! Filtered List Variable Assignment
This form of the set variable widget evaluates the filter and assigns the result to the variable as a space-separated list (using double square brackets for titles containing spaces).
-```
-<$set name="myVariable" filter="[tag[HelloThere]]">
-<$text text=<>/>
-$set>
-```
+<<<
-!! Filtered Item Variable Assignment
+<$macrocall $name='wikitext-example-without-html'
+src='<$set name="myVariable" filter="[tag[HelloThere]]">
+<$text text=<>/>
+$set>' />
+
+<<<
+
+!! Filtered Item Variable Assignment Single Element
<<.from-version "5.1.14">> This form of the set variable widget evaluates the filter and assigns the specified result to the variable as a single item (ie, not using double square brackets for titles containing spaces).
-```
-<$set name="myVariable" filter="[tag[HelloThere]]" select="0">
+<<<
+
+<$macrocall $name='wikitext-example-without-html'
+src='<$set name="myVariable" filter="[tag[HelloThere]]" select="0">
<$text text=<>/>
-$set>
-```
+$set>'/>
+
+<<<
!! Transcluded Variable Assignment
<<.from-version "5.1.15">> This form of the set variable widget obtains the value to assign to the variable from a value in a tiddler field or index. For example:
-```
-<$set name="myVariable" tiddler="HelloThere" field="text">
-<$text text=<>/>
-$set>
-```
+<<<
-The example above could also be written as `<$set name="myVariable" value={{HelloThere!!text}}>`. The advantage of using the ''tiddler'' attribute is that the tiddler title and field or index can themselves be computed. For example:
-
-```
-<$set name="myVariable" tiddler=<> field={{$:/currentField}}>
+<$macrocall $name='wikitext-example-without-html'
+src='<$set name="myVariable" tiddler="HelloThere" field="list">
<$text text=<>/>
-$set>
-```
+$set>'/>
+
+<<<
+
+The example above could also be written as `<$set name="myVariable" value={{HelloThere!!list}}>`. The advantage of using the ''tiddler'' attribute is that the tiddler title and field or index can themselves be computed. For example:
+
+<<<
+
+<$macrocall $name='wikitext-example-without-html'
+src='<$set name="myTiddler" value="HelloThere">
+ <$set name="myVariable" tiddler=<> field={{$:/docs/anyField!!field}}>
+ <$text text=<>/>
+ $set>
+$set>'/>
+
+<<<
diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md
index c633abdbd..16909354b 100644
--- a/licenses/cla-individual.md
+++ b/licenses/cla-individual.md
@@ -449,3 +449,13 @@ J. Wilhelm, @jeremyredhead, 2021/01/27
Quentin Minster, @laomaiweng, 2021/03/10
Cindy Ruan, @cdruan, 2021/03/18
+
+Urban Alič, @ualich, 2021/05/06
+
+Joe Bordes, @joebordes, 2021/05/30
+
+Frank Bruns-Ballhausen, @FBB-de, 2021/06/09
+
+Álvaro González Rincón, @Alzacon, 2021/06/10
+
+RJ Skerry-Ryan, @rryan, 2021/07/03