This community exists because TiddlyWiki is more useful when people share and work together.
This community is a beautiful but fragile thing: a collection of diverse people from all over the planet, united in their interest in the project, and their commitment to helping one another achieve and learn more.
We try to make the community as broad and welcoming as possible by remembering some basic principles of culture and behaviour.
These principles guide technical and non-technical decisions, and help contributors and leaders support our project and community.
We are optimistic and hopeful
We aim to foster a learning environment that is collaborative and safe for everyone
We recognise that the motivation for sharing and helping is usually for appreciation, and not financial gain, and so we take care to acknowledge and thank the people who enrich the community by sharing what they have created
While we are united in our interest in TiddlyWiki, we differ in every other conceivable way. We choose to focus on what unites us, and avoid unnecessarily mixing contentious topics like religion and politics
We treat each other with respect, and start with the assumption that others are acting in good faith
We avoid discriminatory language
We try to use our strength as a community to help others
We avoid responding when angry or upset because we try to de-escalate conflict
We make sure we critique ideas, not people
When we disagree with others we do so graciously, and treat others with dignity and respoect
We do not tolerate intolerance towards others
We seek first to understand others, and then to be understood
We have fun
Our discussions are in English. It is not the first language of many people in the community, nor do we all share the same cultural background and reference points. So we take care to use language that is clear and unambigous, and avoid cultural references or jokes that will not be widely understood.
It is not acceptable to make jokes or other comments that discriminate by race, gender, sexuality, or other protected characteristic.
As an inclusive community, we are committed to making sure that TiddlyWiki is an accessible tool that understands the needs of people with disabilities.
\ No newline at end of file
diff --git a/core/images/discord.tid b/core/images/discord.tid
new file mode 100644
index 000000000..7510babb4
--- /dev/null
+++ b/core/images/discord.tid
@@ -0,0 +1,5 @@
+title: $:/core/images/discord
+tags: $:/tags/Image
+
+\parameters (size:"22pt")
+
\ No newline at end of file
diff --git a/core/language/en-GB/Buttons.multids b/core/language/en-GB/Buttons.multids
index 15273d18e..2fa732fd9 100644
--- a/core/language/en-GB/Buttons.multids
+++ b/core/language/en-GB/Buttons.multids
@@ -80,6 +80,7 @@ NewMarkdown/Caption: new Markdown tiddler
NewMarkdown/Hint: Create a new Markdown tiddler
NewTiddler/Caption: new tiddler
NewTiddler/Hint: Create a new tiddler
+OpenControlPanel/Hint: Open control panel
OpenWindow/Caption: open in new window
OpenWindow/Hint: Open tiddler in new window
Palette/Caption: palette
@@ -132,6 +133,7 @@ Excise/Caption/Replace/Link: link
Excise/Caption/Replace/Transclusion: transclusion
Excise/Caption/Tag: Tag new tiddler with the title of this tiddler
Excise/Caption/TiddlerExists: Warning: tiddler already exists
+Excise/DefaultTitle: New Excision
Excise/Hint: Excise the selected text into a new tiddler
Heading1/Caption: heading 1
Heading1/Hint: Apply heading level 1 formatting to lines containing selection
diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids
index 93cfc3c10..a1b164c5c 100644
--- a/core/language/en-GB/ControlPanel.multids
+++ b/core/language/en-GB/ControlPanel.multids
@@ -198,6 +198,12 @@ Settings/TitleLinks/Yes/Description: Display tiddler titles as links
Settings/MissingLinks/Caption: Wiki Links
Settings/MissingLinks/Hint: Choose whether to link to tiddlers that do not exist yet
Settings/MissingLinks/Description: Enable links to missing tiddlers
+SocialCard/Caption: Social Media Card
+SocialCard/Domain/Prompt: Domain name to display for the link (for example, ''tiddlywiki.com'')
+SocialCard/Hint: This information is used by social and messaging services to display a preview card for links to this TiddlyWiki when hosted online
+SocialCard/PreviewUrl/Prompt: Full URL to preview image for this TiddlyWiki
+SocialCard/PreviewUrl/Preview: Preview image:
+SocialCard/Url/Prompt: Full URL of this TiddlyWiki
StoryTiddler/Caption: Story Tiddler
StoryTiddler/Hint: This rule cascade is used to dynamically choose the template for displaying a tiddler in the story river.
StoryView/Caption: Story View
@@ -235,3 +241,7 @@ ViewTemplateBody/Caption: View Template Body
ViewTemplateBody/Hint: This rule cascade is used by the default view template to dynamically choose the template for displaying the body of a tiddler.
ViewTemplateTitle/Caption: View Template Title
ViewTemplateTitle/Hint: This rule cascade is used by the default view template to dynamically choose the template for displaying the title of a tiddler.
+ViewTemplateSubtitle/Caption: View Template Subtitle
+ViewTemplateSubtitle/Hint: This rule cascade is used by the default view template to dynamically choose the template for displaying the subtitle of a tiddler.
+ViewTemplateTags/Caption: View Template Tags
+ViewTemplateTags/Hint: This rule cascade is used by the default view template to dynamically choose the template for displaying the tags area of a tiddler.
diff --git a/core/language/en-GB/EditTemplate.multids b/core/language/en-GB/EditTemplate.multids
index c4bfa5e56..9b61f71ec 100644
--- a/core/language/en-GB/EditTemplate.multids
+++ b/core/language/en-GB/EditTemplate.multids
@@ -26,6 +26,7 @@ Tags/ClearInput/Caption: clear input
Tags/ClearInput/Hint: Clear tag input
Tags/Dropdown/Caption: tag list
Tags/Dropdown/Hint: Show tag list
+Tags/EmptyMessage: (no search result)
Title/BadCharacterWarning: Warning: avoid using any of the characters <> in tiddler titles
Title/Exists/Prompt: Target tiddler already exists
Title/Relink/Prompt: Update ''<$text text=<>/>'' to ''<$text text=<>/>'' in the //tags// and //list// fields of other tiddlers
diff --git a/core/language/en-GB/Search.multids b/core/language/en-GB/Search.multids
index 2a57a6416..f5aa478bf 100644
--- a/core/language/en-GB/Search.multids
+++ b/core/language/en-GB/Search.multids
@@ -6,6 +6,8 @@ Filter/Hint: Search via a [[filter expression|https://tiddlywiki.com/static/Filt
Filter/Matches: //<> matches//
Matches: //<> matches//
Matches/All: All matches:
+Matches/NoMatch: //No match//
+Matches/NoResult: //No search result//
Matches/Title: Title matches:
Search: Search
Search/TooShort: Search text too short
diff --git a/core/language/en-GB/Snippets/FunctionDefinition.tid b/core/language/en-GB/Snippets/FunctionDefinition.tid
new file mode 100644
index 000000000..e000e38b1
--- /dev/null
+++ b/core/language/en-GB/Snippets/FunctionDefinition.tid
@@ -0,0 +1,7 @@
+title: $:/language/Snippets/FunctionDefinition
+tags: $:/tags/TextEditor/Snippet
+caption: Function definition
+
+\function f.name(param1,param2:"default value") [!is[blank]else]
+
+<>
diff --git a/core/language/en-GB/Snippets/ProcedureDefinition.tid b/core/language/en-GB/Snippets/ProcedureDefinition.tid
new file mode 100644
index 000000000..632abcc01
--- /dev/null
+++ b/core/language/en-GB/Snippets/ProcedureDefinition.tid
@@ -0,0 +1,7 @@
+title: $:/language/Snippets/ProcedureDefinition
+tags: $:/tags/TextEditor/Snippet
+caption: Procedure definition
+
+\procedure procName(param1:"default value",param2)
+Your text comes here.
+\end
diff --git a/core/language/en-GB/Types/image_x-icon.tid b/core/language/en-GB/Types/image_x-icon.tid
deleted file mode 100644
index 55420387a..000000000
--- a/core/language/en-GB/Types/image_x-icon.tid
+++ /dev/null
@@ -1,5 +0,0 @@
-title: $:/language/Docs/Types/image/x-icon
-description: ICO icon
-name: image/x-icon
-group: Image
-group-sort: 1
diff --git a/core/language/en-GB/Types/text_vnd.tiddlywiki_multiple.tid b/core/language/en-GB/Types/text_vnd.tiddlywiki_multiple.tid
new file mode 100644
index 000000000..af15d7ac3
--- /dev/null
+++ b/core/language/en-GB/Types/text_vnd.tiddlywiki_multiple.tid
@@ -0,0 +1,5 @@
+title: $:/language/Docs/Types/text/vnd.tiddlywiki-multiple
+description: Compound tiddler
+name: text/vnd.tiddlywiki-multiple
+group: Developer
+group-sort: 2
diff --git a/core/modules/commands/render.js b/core/modules/commands/render.js
index b396deef9..bd8b23171 100644
--- a/core/modules/commands/render.js
+++ b/core/modules/commands/render.js
@@ -45,17 +45,22 @@ Render individual tiddlers and save the results to the specified files
variableList = variableList.slice(2);
}
$tw.utils.each(tiddlers,function(title) {
- var filepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);
- if(self.commander.verbose) {
- console.log("Rendering \"" + title + "\" to \"" + filepath + "\"");
+ var filenameResults = wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]));
+ if(filenameResults.length > 0) {
+ var filepath = path.resolve(self.commander.outputPath,filenameResults[0]);
+ if(self.commander.verbose) {
+ console.log("Rendering \"" + title + "\" to \"" + filepath + "\"");
+ }
+ var parser = wiki.parseTiddler(template || title),
+ widgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},variables,{currentTiddler: title,storyTiddler: title})}),
+ container = $tw.fakeDocument.createElement("div");
+ widgetNode.render(container,null);
+ var text = type === "text/html" ? container.innerHTML : container.textContent;
+ $tw.utils.createFileDirectories(filepath);
+ fs.writeFileSync(filepath,text,"utf8");
+ } else {
+ console.log("Not rendering \"" + title + "\" because the filename filter returned an empty result");
}
- var parser = wiki.parseTiddler(template || title),
- widgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},variables,{currentTiddler: title,storyTiddler: title})}),
- container = $tw.fakeDocument.createElement("div");
- widgetNode.render(container,null);
- var text = type === "text/html" ? container.innerHTML : container.textContent;
- $tw.utils.createFileDirectories(filepath);
- fs.writeFileSync(filepath,text,"utf8");
});
return null;
};
diff --git a/core/modules/editor/operations/text/excise.js b/core/modules/editor/operations/text/excise.js
index ced771719..8cb3a8486 100644
--- a/core/modules/editor/operations/text/excise.js
+++ b/core/modules/editor/operations/text/excise.js
@@ -14,11 +14,12 @@ Text editor operation to excise the selection to a new tiddler
exports["excise"] = function(event,operation) {
var editTiddler = this.wiki.getTiddler(this.editTitle),
- editTiddlerTitle = this.editTitle;
+ editTiddlerTitle = this.editTitle,
+ excisionBaseTitle = $tw.language.getString("Buttons/Excise/DefaultTitle");
if(editTiddler && editTiddler.fields["draft.of"]) {
editTiddlerTitle = editTiddler.fields["draft.of"];
}
- var excisionTitle = event.paramObject.title || this.wiki.generateNewTitle("New Excision");
+ var excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(excisionBaseTitle);
this.wiki.addTiddler(new $tw.Tiddler(
this.wiki.getCreationFields(),
this.wiki.getModificationFields(),
diff --git a/core/modules/parsers/wikiparser/rules/table.js b/core/modules/parsers/wikiparser/rules/table.js
index 59aa81e91..fbdbb4f9d 100644
--- a/core/modules/parsers/wikiparser/rules/table.js
+++ b/core/modules/parsers/wikiparser/rules/table.js
@@ -93,11 +93,12 @@ var processRow = function(prevColumns) {
}
// Check whether this is a heading cell
var cell;
+ var start = this.parser.pos;
if(chr === "!") {
this.parser.pos++;
- cell = {type: "element", tag: "th", children: []};
+ cell = {type: "element", tag: "th", start: start, children: []};
} else {
- cell = {type: "element", tag: "td", children: []};
+ cell = {type: "element", tag: "td", start: start, children: []};
}
tree.push(cell);
// Record information about this cell
@@ -121,6 +122,7 @@ var processRow = function(prevColumns) {
}
// Move back to the closing `|`
this.parser.pos--;
+ cell.end = this.parser.pos;
}
col++;
cellRegExp.lastIndex = this.parser.pos;
@@ -169,12 +171,13 @@ exports.parse = function() {
rowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});
} else {
// Create the row
- var theRow = {type: "element", tag: "tr", children: []};
+ var theRow = {type: "element", tag: "tr", children: [], start: rowMatch.index};
$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? "oddRow" : "evenRow");
rowContainer.children.push(theRow);
// Process the row
theRow.children = processRow.call(this,prevColumns);
this.parser.pos = rowMatch.index + rowMatch[0].length;
+ theRow.end = this.parser.pos;
// Increment the row count
rowCount++;
}
diff --git a/core/modules/savers/put.js b/core/modules/savers/put.js
index a1ebef4bb..87fe5f710 100644
--- a/core/modules/savers/put.js
+++ b/core/modules/savers/put.js
@@ -55,7 +55,7 @@ var PutSaver = function(wiki) {
callback: function(err,data,xhr) {
// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1
if(!err) {
- self.serverAcceptsPuts = xhr.status === 200 && !!xhr.getResponseHeader("dav");
+ self.serverAcceptsPuts = xhr.status >= 200 && xhr.status < 300 && !!xhr.getResponseHeader("dav");
}
}
});
diff --git a/core/modules/storyviews/classic.js b/core/modules/storyviews/classic.js
index 044cd97f0..a85e458c5 100644
--- a/core/modules/storyviews/classic.js
+++ b/core/modules/storyviews/classic.js
@@ -30,12 +30,8 @@ ClassicStoryView.prototype.navigateTo = function(historyInfo) {
if(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {
return;
}
- if(duration) {
- // Scroll the node into view
- this.listWidget.dispatchEvent({type: "tm-scroll", target: targetElement});
- } else {
- targetElement.scrollIntoView();
- }
+ // Scroll the node into view
+ this.listWidget.dispatchEvent({type: "tm-scroll", target: targetElement});
};
ClassicStoryView.prototype.insert = function(widget) {
diff --git a/core/modules/upgraders/system.js b/core/modules/upgraders/system.js
index a93a57712..a653a75b1 100644
--- a/core/modules/upgraders/system.js
+++ b/core/modules/upgraders/system.js
@@ -12,7 +12,7 @@ Upgrader module that suppresses certain system tiddlers that shouldn't be import
/*global $tw: false */
"use strict";
-var DONT_IMPORT_LIST = ["$:/Import"],
+var DONT_IMPORT_LIST = ["$:/Import", "$:/build"],
UNSELECT_PREFIX_LIST = ["$:/temp/","$:/state/","$:/StoryList","$:/HistoryList"],
WARN_IMPORT_PREFIX_LIST = ["$:/core/modules/"];
diff --git a/core/modules/utils/edition-info.js b/core/modules/utils/edition-info.js
index f8a5cab06..b9d97f962 100644
--- a/core/modules/utils/edition-info.js
+++ b/core/modules/utils/edition-info.js
@@ -29,10 +29,14 @@ exports.getEditionInfo = function() {
for(var entryIndex=0; entryIndex 0 && !!item.title) {
return [new $tw.Tiddler(item)];
} else {
@@ -112,7 +123,6 @@ DataWidget.prototype.computeDataTiddlerValues = function() {
}
} else {
// Apply the item fields to each of the tiddlers
- delete item.title; // Do not overwrite the title
if(Object.keys(item).length > 0) {
$tw.utils.each(tiddlers,function(tiddler,index) {
tiddlers[index] = new $tw.Tiddler(tiddler,item);
diff --git a/core/modules/widgets/keyboard.js b/core/modules/widgets/keyboard.js
index ce3162f51..9515f5a3b 100644
--- a/core/modules/widgets/keyboard.js
+++ b/core/modules/widgets/keyboard.js
@@ -96,13 +96,15 @@ KeyboardWidget.prototype.execute = function() {
this.param = this.getAttribute("param","");
this.key = this.getAttribute("key","");
this.tag = this.getAttribute("tag","");
- this.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);
- if(this.key.substr(0,2) === "((" && this.key.substr(-2,2) === "))") {
- this.shortcutTiddlers = [];
- var name = this.key.substring(2,this.key.length -2);
- $tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {
- self.shortcutTiddlers.push("$:/config/" + platformDescriptor + "/" + name);
- });
+ if($tw.keyboardManager) {
+ this.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);
+ if(this.key.substr(0,2) === "((" && this.key.substr(-2,2) === "))") {
+ this.shortcutTiddlers = [];
+ var name = this.key.substring(2,this.key.length -2);
+ $tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {
+ self.shortcutTiddlers.push("$:/config/" + platformDescriptor + "/" + name);
+ });
+ }
}
// Make child widgets
this.makeChildWidgets();
@@ -126,7 +128,7 @@ KeyboardWidget.prototype.refresh = function(changedTiddlers) {
this.assignDomNodeClasses();
}
// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed
- if(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) {
+ if(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) && $tw.keyboardManager) {
this.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);
}
return this.refreshChildren(changedTiddlers);
diff --git a/core/palettes/Blanca.tid b/core/palettes/Blanca.tid
index 0fd8e2da3..7a6e7d97b 100644
--- a/core/palettes/Blanca.tid
+++ b/core/palettes/Blanca.tid
@@ -33,6 +33,7 @@ external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
+footnote-target-background: #ecf2ff
foreground: #333333
highlight-background: #ffff00
highlight-foreground: #000000
diff --git a/core/palettes/Blue.tid b/core/palettes/Blue.tid
index cc3846b50..b5bdecb8a 100644
--- a/core/palettes/Blue.tid
+++ b/core/palettes/Blue.tid
@@ -33,6 +33,7 @@ external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
+footnote-target-background: #ecf2ff
foreground: #333353
highlight-background: #ffff00
highlight-foreground: #000000
diff --git a/core/palettes/BrightMute.tid b/core/palettes/BrightMute.tid
index ddbd6b3cd..2762a995d 100644
--- a/core/palettes/BrightMute.tid
+++ b/core/palettes/BrightMute.tid
@@ -33,6 +33,7 @@ external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
+footnote-target-background: #ecf2ff
foreground: #333333
highlight-background: #ffff00
highlight-foreground: #000000
diff --git a/core/palettes/ContrastDark.tid b/core/palettes/ContrastDark.tid
index 850a5863b..67552b30e 100644
--- a/core/palettes/ContrastDark.tid
+++ b/core/palettes/ContrastDark.tid
@@ -1,7 +1,7 @@
-title: $:/palettes/ContrastLight
-name: Contrast (Light)
-color-scheme: light
-description: High contrast and unambiguous (light version)
+title: $:/palettes/ContrastDark
+name: Contrast (Dark)
+color-scheme: dark
+description: High contrast and unambiguous (dark version)
tags: $:/tags/Palette
type: application/x-tiddler-dictionary
@@ -9,7 +9,7 @@ alert-background: #f00
alert-border: <>
alert-highlight: <>
alert-muted-foreground: #800
-background: #fff
+background: #000
blockquote-bar: <>
button-background: <>
button-foreground: <>
@@ -33,7 +33,8 @@ external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #00a
external-link-foreground: #00e
-foreground: #000
+footnote-target-background: #4c4c4c
+foreground: #fff
highlight-background: #ffff00
highlight-foreground: #000000
message-background: <>
@@ -82,8 +83,8 @@ tab-foreground: <>
table-border: #dddddd
table-footer-background: #a8a8a8
table-header-background: #f0f0f0
-tag-background: #000
-tag-foreground: #fff
+tag-background: #fff
+tag-foreground: #000
tiddler-background: <>
tiddler-border: <>
tiddler-controls-foreground-hover: #ddd
diff --git a/core/palettes/ContrastLight.tid b/core/palettes/ContrastLight.tid
index ade9f43f8..a10a1b8eb 100644
--- a/core/palettes/ContrastLight.tid
+++ b/core/palettes/ContrastLight.tid
@@ -1,7 +1,7 @@
-title: $:/palettes/ContrastDark
-name: Contrast (Dark)
-color-scheme: dark
-description: High contrast and unambiguous (dark version)
+title: $:/palettes/ContrastLight
+name: Contrast (Light)
+color-scheme: light
+description: High contrast and unambiguous (light version)
tags: $:/tags/Palette
type: application/x-tiddler-dictionary
@@ -9,7 +9,7 @@ alert-background: #f00
alert-border: <>
alert-highlight: <>
alert-muted-foreground: #800
-background: #000
+background: #fff
blockquote-bar: <>
button-background: <>
button-foreground: <>
@@ -33,7 +33,8 @@ external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #00a
external-link-foreground: #00e
-foreground: #fff
+footnote-target-background: #e5e5e5
+foreground: #000
highlight-background: #ffff00
highlight-foreground: #000000
message-background: <>
@@ -82,8 +83,8 @@ tab-foreground: <>
table-border: #dddddd
table-footer-background: #a8a8a8
table-header-background: #f0f0f0
-tag-background: #fff
-tag-foreground: #000
+tag-background: #000
+tag-foreground: #fff
tiddler-background: <>
tiddler-border: <>
tiddler-controls-foreground-hover: #ddd
diff --git a/core/palettes/CupertinoDark.tid b/core/palettes/CupertinoDark.tid
index 7f08f4100..f13fc1e16 100644
--- a/core/palettes/CupertinoDark.tid
+++ b/core/palettes/CupertinoDark.tid
@@ -31,6 +31,7 @@ external-link-background: transparent
external-link-foreground-hover:
external-link-foreground-visited: #BF5AF2
external-link-foreground: #32D74B
+footnote-target-background: #747474
foreground: #FFFFFF
highlight-background: #ffff78
highlight-foreground: #000000
diff --git a/core/palettes/DarkPhotos.tid b/core/palettes/DarkPhotos.tid
index 71fa40f2f..5d086fc27 100644
--- a/core/palettes/DarkPhotos.tid
+++ b/core/palettes/DarkPhotos.tid
@@ -35,6 +35,7 @@ external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
+footnote-target-background: #ecf2ff
foreground: #333333
highlight-background: #ffff00
highlight-foreground: #000000
diff --git a/core/palettes/DesertSand.tid b/core/palettes/DesertSand.tid
index ddce80e27..12b06c948 100644
--- a/core/palettes/DesertSand.tid
+++ b/core/palettes/DesertSand.tid
@@ -39,6 +39,7 @@ external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #313163
external-link-foreground: #555592
+footnote-target-background: #fff7d9
foreground: #2D2A23
highlight-background: #ffff00
highlight-foreground: #000000
diff --git a/core/palettes/GruvBoxDark.tid b/core/palettes/GruvBoxDark.tid
index 6c3fa6a73..e839fd7b4 100644
--- a/core/palettes/GruvBoxDark.tid
+++ b/core/palettes/GruvBoxDark.tid
@@ -40,6 +40,7 @@ external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #d3869b
external-link-foreground: #8ec07c
+footnote-target-background: #665c54
foreground: #fbf1c7
highlight-background: #ffff79
highlight-foreground: #000000
diff --git a/core/palettes/Nord.tid b/core/palettes/Nord.tid
index e8e280998..5f18dce3f 100644
--- a/core/palettes/Nord.tid
+++ b/core/palettes/Nord.tid
@@ -40,6 +40,7 @@ external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #5E81AC
external-link-foreground: #8FBCBB
+footnote-target-background: #2E3440
foreground: #d8dee9
highlight-background: #ffff78
highlight-foreground: #000000
diff --git a/core/palettes/Rocker.tid b/core/palettes/Rocker.tid
index a91cd1b5f..c6693eb52 100644
--- a/core/palettes/Rocker.tid
+++ b/core/palettes/Rocker.tid
@@ -33,6 +33,7 @@ external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
+footnote-target-background: #ecf2ff
foreground: #333333
highlight-background: #ffff00
highlight-foreground: #000000
diff --git a/core/palettes/SolarFlare.tid b/core/palettes/SolarFlare.tid
index 4d81bf531..9f394f10c 100644
--- a/core/palettes/SolarFlare.tid
+++ b/core/palettes/SolarFlare.tid
@@ -131,6 +131,7 @@ external-link-background-hover: inherit
external-link-background-visited: inherit
external-link-background: inherit
external-link-foreground-hover: inherit
+footnote-target-background: #ded8c5
highlight-background: #ffff00
highlight-foreground: #000000
message-border: #cfd6e6
@@ -141,6 +142,10 @@ sidebar-controls-foreground-hover:
sidebar-muted-foreground-hover:
sidebar-tab-background: #ded8c5
sidebar-tiddler-link-foreground-hover:
+stability-deprecated: <>
+stability-experimental: <>
+stability-legacy: <>
+stability-stable: <>
static-alert-foreground: #aaaaaa
tab-border: #cccccc
modal-footer-border: <>
diff --git a/core/palettes/SolarizedDark.tid b/core/palettes/SolarizedDark.tid
index bacd385b2..326f6a4fb 100644
--- a/core/palettes/SolarizedDark.tid
+++ b/core/palettes/SolarizedDark.tid
@@ -34,6 +34,7 @@ external-link-background-visited: inherit
external-link-foreground: #268bd2
external-link-foreground-hover:
external-link-foreground-visited: #268bd2
+footnote-target-background: #073642
foreground: #839496
highlight-background: #ffff78
highlight-foreground: #000000
diff --git a/core/palettes/SolarizedLight.tid b/core/palettes/SolarizedLight.tid
index 5d8757386..28ce1c7c2 100644
--- a/core/palettes/SolarizedLight.tid
+++ b/core/palettes/SolarizedLight.tid
@@ -34,6 +34,7 @@ external-link-background-visited: inherit
external-link-foreground: #268bd2
external-link-foreground-hover: inherit
external-link-foreground-visited: #268bd2
+footnote-target-background: #eee8d5
foreground: #657b83
highlight-background: #ffff00
highlight-foreground: #000000
diff --git a/core/palettes/SpartanDay.tid b/core/palettes/SpartanDay.tid
index cc197144e..505427d33 100644
--- a/core/palettes/SpartanDay.tid
+++ b/core/palettes/SpartanDay.tid
@@ -33,6 +33,7 @@ external-link-background: transparent
external-link-foreground-hover:
external-link-foreground-visited:
external-link-foreground:
+footnote-target-background: #ececec
foreground: rgba(0, 0, 0, 0.87)
highlight-background: #ffff00
highlight-foreground: #000000
diff --git a/core/palettes/SpartanNight.tid b/core/palettes/SpartanNight.tid
index dc47a0774..b36ecb526 100644
--- a/core/palettes/SpartanNight.tid
+++ b/core/palettes/SpartanNight.tid
@@ -33,6 +33,7 @@ external-link-background: transparent
external-link-foreground-hover:
external-link-foreground-visited: #7c318c
external-link-foreground: #9e3eb3
+footnote-target-background: #494949
foreground: rgba(255, 255, 255, 0.7)
highlight-background: #ffff78
highlight-foreground: #000000
diff --git a/core/palettes/Twilight.tid b/core/palettes/Twilight.tid
index 4c127f822..1cd8efab1 100644
--- a/core/palettes/Twilight.tid
+++ b/core/palettes/Twilight.tid
@@ -42,6 +42,7 @@ external-link-background-visited: inherit
external-link-foreground: rgb(179, 179, 255)
external-link-foreground-hover: inherit
external-link-foreground-visited: rgb(153, 153, 255)
+footnote-target-background: <>
foreground: rgb(179, 179, 179)
highlight-background: #ffff78
highlight-foreground: #000000
diff --git a/core/palettes/Vanilla.tid b/core/palettes/Vanilla.tid
index 067f32519..76307acee 100644
--- a/core/palettes/Vanilla.tid
+++ b/core/palettes/Vanilla.tid
@@ -41,6 +41,7 @@ external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
+footnote-target-background: #ecf2ff
foreground: #333333
highlight-background: #ffff00
highlight-foreground: #000000
diff --git a/core/templates/social-metadata.tid b/core/templates/social-metadata.tid
new file mode 100644
index 000000000..f742621e8
--- /dev/null
+++ b/core/templates/social-metadata.tid
@@ -0,0 +1,38 @@
+title: $:/core/templates/social-metadata
+tags: $:/tags/RawMarkupWikified
+
+\procedure meta-plain(name,source,name-attribute:"name")
+\whitespace trim
+<%if [