diff --git a/editions/prerelease/tiddlywiki.info b/editions/prerelease/tiddlywiki.info
index 88261c531..018eb9788 100644
--- a/editions/prerelease/tiddlywiki.info
+++ b/editions/prerelease/tiddlywiki.info
@@ -15,7 +15,8 @@
"tiddlywiki/bibtex",
"tiddlywiki/savetrail",
"tiddlywiki/twitter",
- "tiddlywiki/external-attachments"
+ "tiddlywiki/external-attachments",
+ "tiddlywiki/dynaview"
],
"themes": [
"tiddlywiki/vanilla",
diff --git a/plugins/tiddlywiki/dynaview/above-story.tid b/plugins/tiddlywiki/dynaview/above-story.tid
new file mode 100644
index 000000000..89e32f4d5
--- /dev/null
+++ b/plugins/tiddlywiki/dynaview/above-story.tid
@@ -0,0 +1,7 @@
+title: $:/plugins/tiddlywiki/dynaview/above-story
+tags: $:/tags/AboveStory-disabled
+
+
+
>
diff --git a/plugins/tiddlywiki/dynaview/examples/progressive-text.tid b/plugins/tiddlywiki/dynaview/examples/progressive-text.tid
new file mode 100644
index 000000000..7dd37ae6b
--- /dev/null
+++ b/plugins/tiddlywiki/dynaview/examples/progressive-text.tid
@@ -0,0 +1,47 @@
+title: $:/plugins/tiddlywiki/dynaview/examples/progressive-text
+tags: $:/tags/dynaviewExamples
+caption: Progressive Text
+
+//Zoom into the space below to see a poem//
+
+''N.B. This example only works in Safari at the moment''
+
+
+ 'Fury said to a
+ mouse, That he
+ met in the
+ house,
"Let us
+ both go to
+ law: I will
+ prosecute
+ YOU.--Come,
I'll take no
+ denial; We
+ must have a
+ trial: For
really this
+ morning I've
+ nothing
+ to do."
Said the
+ mouse to the
+ cur, "Such
+ a trial,
+ dear Sir,
With
+ no jury
+ or judge,
+ would be
+ wasting
+ our
+ breath."
"I'll be
+ judge, I'll
+ be jury,"
+ Said
+ cunning
+ old Fury:
+ "I'll
+ try the
+ whole
+ cause,
and
+ condemn
+ you
+ to
+ death."'
+
diff --git a/plugins/tiddlywiki/dynaview/examples/reveal-on-scroll.tid b/plugins/tiddlywiki/dynaview/examples/reveal-on-scroll.tid
new file mode 100644
index 000000000..a9abbebb2
--- /dev/null
+++ b/plugins/tiddlywiki/dynaview/examples/reveal-on-scroll.tid
@@ -0,0 +1,26 @@
+title: $:/plugins/tiddlywiki/dynaview/examples/reveal-on-scroll
+tags: $:/tags/dynaviewExamples
+caption: Reveal on Scroll
+
+\define indicator(index)
+<$reveal state="$:/state/reveal-on-scroll/example$index$" type="match" text="yes">
+$index$
+$reveal>
+\end
+
+\define lorem-ipsum(index)
+
+
Heading $index$
+<$reveal state="$:/state/reveal-on-scroll/example$index$" type="match" text="yes">
+(Rendered at <>) Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+$reveal>
+
+\end
+
+Visible: <$list filter="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16">
+<$macrocall $name="indicator" index=<>/>
+$list>
+
+<$list filter="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16">
+<$macrocall $name="lorem-ipsum" index=<>/>
+$list>
diff --git a/plugins/tiddlywiki/dynaview/examples/zoomable-diagram-content.json b/plugins/tiddlywiki/dynaview/examples/zoomable-diagram-content.json
new file mode 100644
index 000000000..89d0b86ad
--- /dev/null
+++ b/plugins/tiddlywiki/dynaview/examples/zoomable-diagram-content.json
@@ -0,0 +1,134 @@
+[
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/TiddlyWiki Architecture",
+ "caption": "TiddlyWiki Architecture",
+ "tags": "[[$:/tags:/ZoomableDiagram]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Browser Architecture",
+ "caption": "Browser Architecture",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/TiddlyWiki Architecture]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Service Workers",
+ "caption": "Service Workers",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Browser Architecture]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Service Bosses",
+ "caption": "Service Bosses",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Service Workers]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Out of Service Workers",
+ "caption": "Out of Service Workers",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Service Workers]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Events",
+ "caption": "Events",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Browser Architecture]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Non Events",
+ "caption": "Non Events",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Events]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Past Events",
+ "caption": "Past Events",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Events]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/DOM",
+ "caption": "DOM",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Browser Architecture]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Nodes",
+ "caption": "Nodes",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/DOM]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Attributes",
+ "caption": "Attributes",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/DOM]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Pathogens",
+ "caption": "Pathogens",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/DOM]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Connection",
+ "caption": "Connection",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/TiddlyWiki Architecture]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/HTTP",
+ "caption": "HTTP",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Connection]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Server Architecture",
+ "caption": "Server Architecture",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/TiddlyWiki Architecture]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Node.js",
+ "caption": "Node.js",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Server Architecture]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/C/C++",
+ "caption": "C/C++",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Node.js]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Quotation Marks",
+ "caption": "Quotation Marks",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Node.js]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Asterisks",
+ "caption": "Asterisks",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Node.js]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Potatoes",
+ "caption": "Potatoes",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Server Architecture]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Carrots",
+ "caption": "Carrots",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Potatoes]]",
+ "text": "<>"
+ },
+ {
+ "title": "$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Apricots",
+ "caption": "Apricots",
+ "tags": "[[$:/plugins/tiddlywiki/dynaview/zoomable-diagram/Potatoes]]",
+ "text": "<>"
+ }
+]
diff --git a/plugins/tiddlywiki/dynaview/examples/zoomable-diagram.tid b/plugins/tiddlywiki/dynaview/examples/zoomable-diagram.tid
new file mode 100644
index 000000000..c543b2132
--- /dev/null
+++ b/plugins/tiddlywiki/dynaview/examples/zoomable-diagram.tid
@@ -0,0 +1,111 @@
+title: $:/plugins/tiddlywiki/dynaview/examples/zoomable-diagram
+tags: $:/tags/dynaviewExamples
+caption: Zoomable Diagram
+
+\define lorem-ipsum()
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+\end
+
+\define zoomable-diagram(tag,level:"1 2 3 4 5 6 7")
+
+ <$list filter="[all[shadows+tiddlers]tag[$tag$]]">
+
+
+ <$transclude field="caption" mode="inline"/>
+
+
+
+ <$transclude field="text" mode="block"/>
+
+
+ <$set name="new-level" filter=""" $level$ +[butfirst[]] """>
+ <$macrocall $name="zoomable-diagram" tag=<> level=<>/>
+ $set>
+
+
+
+ $list>
+
+\end
+
+//Zoom into the diagram below to find out more//
+
+''N.B. This example only works in Safari at the moment''
+
+
+
+
+<>
+
diff --git a/plugins/tiddlywiki/dynaview/examples/zoomable-tooltips.tid b/plugins/tiddlywiki/dynaview/examples/zoomable-tooltips.tid
new file mode 100644
index 000000000..8f5640607
--- /dev/null
+++ b/plugins/tiddlywiki/dynaview/examples/zoomable-tooltips.tid
@@ -0,0 +1,56 @@
+title: $:/plugins/tiddlywiki/dynaview/examples/zoomable-tooltips
+tags: $:/tags/dynaviewExamples
+caption: Zoomable Tooltips
+
+//Zoom into the images below to see their titles//
+
+''N.B. This example only works in Safari at the moment''
+
+
+
diff --git a/plugins/tiddlywiki/dynaview/macros.tid b/plugins/tiddlywiki/dynaview/macros.tid
new file mode 100644
index 000000000..d48def8f9
--- /dev/null
+++ b/plugins/tiddlywiki/dynaview/macros.tid
@@ -0,0 +1,13 @@
+title: $:/plugins/tiddlywiki/dynaview/macros
+tags: $:/tags/Macro
+
+\define transclude-when-visible(tiddler,mode:"block",state,minHeight:"1em",loadingText:"…")
+> data-dynaview-set-value="visible">
+<$reveal state=<<__state__>> type="match" text="visible">
+<$transclude tiddler=<<__tiddler__>> mode=<<__block__>>/>
+$reveal>
+<$reveal state=<<__state__>> type="nomatch" text="visible">
+$loadingText$
+$reveal>
+
+\end
diff --git a/plugins/tiddlywiki/dynaview/plugin.info b/plugins/tiddlywiki/dynaview/plugin.info
new file mode 100644
index 000000000..28d4191d0
--- /dev/null
+++ b/plugins/tiddlywiki/dynaview/plugin.info
@@ -0,0 +1,7 @@
+{
+ "title": "$:/plugins/tiddlywiki/dynaview",
+ "description": "Dynamic scrolling and zooming effects",
+ "author": "JeremyRuston",
+ "core-version": ">=5.0.0",
+ "list": "readme docs examples"
+}
diff --git a/plugins/tiddlywiki/dynaview/readme.tid b/plugins/tiddlywiki/dynaview/readme.tid
new file mode 100644
index 000000000..846d65e27
--- /dev/null
+++ b/plugins/tiddlywiki/dynaview/readme.tid
@@ -0,0 +1,16 @@
+title: $:/plugins/tiddlywiki/dynaview/readme
+
+! Dynaview
+
+This plugin makes it possible to build user interfaces that dynamically respond to changes in the browser viewport via scrolling or zooming:
+
+* CSS classes that allow rendering to be deferred until the output is scrolled into view
+* CSS classes that allow the opacity of DOM elements to vary according to the current zoom level
+
+Some points to note about the zoom features:
+
+* The zoom level currently only works on Safari, both on Mac OS and on the iPhone/iPad
+* The zoom level tracked by the plugin is the pinch-zoom level, and not the text-zoom level
+* Rather than being progressively rendered as needed, hidden item are rendered with zero opacity. Which means that they can still be interacted with
+
+This is really just a proof of concept to allow the user experience to be evaluated. A production version would need to work in all browsers, which would mean adopting a polyfill such as [[Hammer.js|http://hammerjs.github.io/]] to give us manual pan and zoom support. It would also allow deeper levels of zoom.
diff --git a/plugins/tiddlywiki/dynaview/styles.tid b/plugins/tiddlywiki/dynaview/styles.tid
new file mode 100644
index 000000000..aeda4e356
--- /dev/null
+++ b/plugins/tiddlywiki/dynaview/styles.tid
@@ -0,0 +1,34 @@
+title: $:/plugins/tiddlywiki/help/styles
+tags: [[$:/tags/Stylesheet]]
+
+\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
+
+body.tc-dynaview .tc-dynaview-zoom-visible-1-and-above,
+body.tc-dynaview .tc-dynaview-zoom-visible-1a-and-above,
+body.tc-dynaview .tc-dynaview-zoom-visible-1b-and-above,
+body.tc-dynaview .tc-dynaview-zoom-visible-1c-and-above,
+body.tc-dynaview .tc-dynaview-zoom-visible-2-and-above,
+body.tc-dynaview .tc-dynaview-zoom-visible-2a-and-above,
+body.tc-dynaview .tc-dynaview-zoom-visible-3-and-above,
+body.tc-dynaview .tc-dynaview-zoom-visible-4-and-above,
+body.tc-dynaview .tc-dynaview-zoom-visible-1,
+body.tc-dynaview .tc-dynaview-zoom-visible-2,
+body.tc-dynaview .tc-dynaview-zoom-visible-3,
+body.tc-dynaview .tc-dynaview-zoom-visible-4 {
+ transition: opacity 150ms ease-in-out;
+ opacity: 0;
+}
+
+body.tc-dynaview .tc-dynaview-zoom-visible-1-and-above {opacity: 1;}
+body.tc-dynaview.tc-dynaview-zoom-factor-1a-and-above .tc-dynaview-zoom-visible-1a-and-above {opacity: 1;}
+body.tc-dynaview.tc-dynaview-zoom-factor-1b-and-above .tc-dynaview-zoom-visible-1b-and-above {opacity: 1;}
+body.tc-dynaview.tc-dynaview-zoom-factor-1c-and-above .tc-dynaview-zoom-visible-1c-and-above {opacity: 1;}
+body.tc-dynaview.tc-dynaview-zoom-factor-2-and-above .tc-dynaview-zoom-visible-2-and-above {opacity: 1;}
+body.tc-dynaview.tc-dynaview-zoom-factor-2a-and-above .tc-dynaview-zoom-visible-2a-and-above {opacity: 1;}
+body.tc-dynaview.tc-dynaview-zoom-factor-3-and-above .tc-dynaview-zoom-visible-3-and-above {opacity: 1;}
+body.tc-dynaview.tc-dynaview-zoom-factor-4-and-above .tc-dynaview-zoom-visible-4-and-above {opacity: 1;}
+
+body.tc-dynaview.tc-dynaview-zoom-factor-1 .tc-dynaview-zoom-visible-1 {opacity: 1;}
+body.tc-dynaview.tc-dynaview-zoom-factor-2 .tc-dynaview-zoom-visible-2 {opacity: 1;}
+body.tc-dynaview.tc-dynaview-zoom-factor-3 .tc-dynaview-zoom-visible-3 {opacity: 1;}
+body.tc-dynaview.tc-dynaview-zoom-factor-4 .tc-dynaview-zoom-visible-4 {opacity: 1;}