mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2025-02-09 23:50:01 +00:00
Add confetti widget
This commit is contained in:
parent
9676706052
commit
5b9f464f26
50
plugins/tiddlywiki/confetti/confetti-manager.js
Normal file
50
plugins/tiddlywiki/confetti/confetti-manager.js
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/plugins/tiddlywiki/confetti/confetti-manager.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: global
|
||||||
|
|
||||||
|
Confetti manager
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var confetti = require("$:/plugins/tiddlywiki/confetti/confetti.js");
|
||||||
|
|
||||||
|
function ConfettiManager() {
|
||||||
|
this.outstandingTimers = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfettiManager.prototype.launch = function (delay,options) {
|
||||||
|
var self = this;
|
||||||
|
if(delay > 0) {
|
||||||
|
var id = setTimeout(function() {
|
||||||
|
var p = self.outstandingTimers.indexOf(id);
|
||||||
|
if(p !== -1) {
|
||||||
|
self.outstandingTimers.splice(p,1);
|
||||||
|
} else {
|
||||||
|
console.log("Confetti Manager Error: Cannot find previously stored timer ID");
|
||||||
|
debugger;
|
||||||
|
}
|
||||||
|
confetti(options);
|
||||||
|
},delay);
|
||||||
|
this.outstandingTimers.push(id);
|
||||||
|
} else {
|
||||||
|
confetti(options);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ConfettiManager.prototype.reset = function () {
|
||||||
|
$tw.utils.each(this.outstandingTimers,function(id) {
|
||||||
|
clearTimeout(id);
|
||||||
|
});
|
||||||
|
this.outstandingTimers = [];
|
||||||
|
confetti.reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.ConfettiManager = ConfettiManager;
|
||||||
|
|
||||||
|
})();
|
67
plugins/tiddlywiki/confetti/confetti-widget.js
Normal file
67
plugins/tiddlywiki/confetti/confetti-widget.js
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/plugins/tiddlywiki/confetti/confetti-widget.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: widget
|
||||||
|
|
||||||
|
Confetti widget
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var Widget = require("$:/core/modules/widgets/widget.js").widget;
|
||||||
|
|
||||||
|
var confetti = require("$:/plugins/tiddlywiki/confetti/confetti.js");
|
||||||
|
|
||||||
|
var ConfettiWidget = function(parseTreeNode,options) {
|
||||||
|
this.initialise(parseTreeNode,options);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Inherit from the base widget class
|
||||||
|
*/
|
||||||
|
ConfettiWidget.prototype = new Widget();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Render this widget into the DOM
|
||||||
|
*/
|
||||||
|
ConfettiWidget.prototype.render = function(parent,nextSibling) {
|
||||||
|
var self = this;
|
||||||
|
// Remember parent
|
||||||
|
this.parentDomNode = parent;
|
||||||
|
// Compute attributes and execute state
|
||||||
|
this.computeAttributes();
|
||||||
|
this.execute();
|
||||||
|
// Launch confetti
|
||||||
|
if($tw.browser) {
|
||||||
|
var options = {};
|
||||||
|
$tw.utils.each(this.attributes,function(attribute,name) {
|
||||||
|
options[name] = self.getAttribute(name);
|
||||||
|
});
|
||||||
|
$tw.confettiManager.launch(options.delay,options);
|
||||||
|
}
|
||||||
|
// Render children
|
||||||
|
this.renderChildren(parent,nextSibling);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Compute the internal state of the widget
|
||||||
|
*/
|
||||||
|
ConfettiWidget.prototype.execute = function() {
|
||||||
|
// Make child widgets
|
||||||
|
this.makeChildWidgets();
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
|
||||||
|
*/
|
||||||
|
ConfettiWidget.prototype.refresh = function(changedTiddlers) {
|
||||||
|
return this.refreshChildren(changedTiddlers);
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.confetti = ConfettiWidget;
|
||||||
|
|
||||||
|
})();
|
9
plugins/tiddlywiki/confetti/examples/staggered.tid
Normal file
9
plugins/tiddlywiki/confetti/examples/staggered.tid
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
title: $:/plugins/tiddlywiki/confetti/examples/staggered
|
||||||
|
tags: $:/tags/ConfettiExample
|
||||||
|
|
||||||
|
<$button>
|
||||||
|
<$action-sendmessage $message="tm-confetti-launch"/>
|
||||||
|
<$action-sendmessage $message="tm-confetti-launch" originY=0.6 spread=70 delay=300/>
|
||||||
|
<$action-sendmessage $message="tm-confetti-launch" originY=0.55 spread=30 delay=600/>
|
||||||
|
Launch three staggered rounds of confetti
|
||||||
|
</$button>
|
10
plugins/tiddlywiki/confetti/examples/typing-trigger.tid
Normal file
10
plugins/tiddlywiki/confetti/examples/typing-trigger.tid
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
title: $:/plugins/tiddlywiki/confetti/examples/typing-trigger
|
||||||
|
tags: $:/tags/ConfettiExample
|
||||||
|
|
||||||
|
<$edit-text tiddler="$:/temp/confetti/launchstatus" tag="input" placeholder="Type here"/>
|
||||||
|
|
||||||
|
<$list filter="[{$:/temp/confetti/launchstatus}match:caseinsensitive[launch]]" variable="ignore">
|
||||||
|
Launched!
|
||||||
|
<$confetti particleCount=100/>
|
||||||
|
<$confetti particleCount=100 delay=300/>
|
||||||
|
</$list>
|
@ -1,16 +1,50 @@
|
|||||||
title: $:/plugins/tiddlywiki/confetti/readme
|
title: $:/plugins/tiddlywiki/confetti/readme
|
||||||
|
|
||||||
|
\define show-example(name)
|
||||||
|
<$let title={{{ [[$:/plugins/tiddlywiki/confetti/examples/]addsuffix<__name__>] }}}>
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
<$macrocall $name="copy-to-clipboard-above-right" src=<<__src__>>/>
|
||||||
|
|
||||||
|
<$codeblock code={{{ [<title>get[text]] }}}/>
|
||||||
|
|
||||||
|
Renders as:
|
||||||
|
|
||||||
|
<$transclude tiddler=<<title>> mode="block"/>
|
||||||
|
|
||||||
|
</$let>
|
||||||
|
\end
|
||||||
|
|
||||||
! Introduction
|
! Introduction
|
||||||
|
|
||||||
This plugin adds a programmable confetti cannon to your TiddlyWiki. It is based on https://www.kirilv.com/canvas-confetti/ by Kiril Vatev.
|
This plugin adds a programmable confetti cannon to your TiddlyWiki. It is based on https://www.kirilv.com/canvas-confetti/ by Kiril Vatev.
|
||||||
|
|
||||||
! Usage
|
! Usage
|
||||||
|
|
||||||
The confetti cannon is controlled using messages.
|
The confetti cannon can be controlled using messages or via the `<$confetti>` widget. Use the message approach when triggering confetti in response to an action (such as clicking a button). Use the widget approach when confetti is to be triggered by a condition (such as a target number of words being reached).
|
||||||
|
|
||||||
!! Message: tm-confetti-launch
|
!! Messages: tm-confetti-launch and tm-confetti-reset
|
||||||
|
|
||||||
The `tm-confetti-launch` message launches the confetti cannon. The following options are supported:
|
The `tm-confetti-launch` message launches the confetti cannon. See below for the available parameters.
|
||||||
|
|
||||||
|
The `tm-confetti-reset` message cancels any confetti that is in progress.
|
||||||
|
|
||||||
|
<<show-example staggered>>
|
||||||
|
|
||||||
|
!! Widget: `<$confetti>`
|
||||||
|
|
||||||
|
The `<$confetti>` widget launches the confetti cannon when it is first rendered. See below for the available attributes.
|
||||||
|
|
||||||
|
Typically it is used in conjunction with a `<$list>` or `<$reveal>` widget that shows the widget when the conditions required to trigger the confetti are satisfied.
|
||||||
|
|
||||||
|
In this example, the confetti will be launched when the word "launch" in typed into the box.
|
||||||
|
|
||||||
|
<<show-example typing-trigger>>
|
||||||
|
|
||||||
|
!! Confetti Launch parameters
|
||||||
|
|
||||||
|
The following options are supported:
|
||||||
|
|
||||||
|!Name |!Description |!Default |
|
|!Name |!Description |!Default |
|
||||||
|''delay'' |Number of milliseconds to delay the launch |0 |
|
|''delay'' |Number of milliseconds to delay the launch |0 |
|
||||||
@ -29,14 +63,3 @@ The `tm-confetti-launch` message launches the confetti cannon. The following opt
|
|||||||
|''scalar'' |Scale factor for each confetti particle. Use decimals to make the confetti smaller |1 |
|
|''scalar'' |Scale factor for each confetti particle. Use decimals to make the confetti smaller |1 |
|
||||||
|''zIndex'' |Z-index of confetti. Increase the value if the confetti is appearing behind other on-screen elements|100 |
|
|''zIndex'' |Z-index of confetti. Increase the value if the confetti is appearing behind other on-screen elements|100 |
|
||||||
|''disableForReducedMotion'' |Set to `yes` to entirely disable confetti for users that [[prefer reduced motion|https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion]] |`no` |
|
|''disableForReducedMotion'' |Set to `yes` to entirely disable confetti for users that [[prefer reduced motion|https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion]] |`no` |
|
||||||
|
|
||||||
<$button>
|
|
||||||
<$action-sendmessage $message="tm-confetti-launch"/>
|
|
||||||
<$action-sendmessage $message="tm-confetti-launch" originY=0.6 spread=70 delay=300/>
|
|
||||||
<$action-sendmessage $message="tm-confetti-launch" originY=0.55 spread=30 delay=600/>
|
|
||||||
Launch
|
|
||||||
</$button>
|
|
||||||
|
|
||||||
!! Message: tm-confetti-reset
|
|
||||||
|
|
||||||
The `tm-confetti-reset` message stops any active confetti.
|
|
||||||
|
@ -12,8 +12,6 @@ Setup the root widget event handlers
|
|||||||
/*global $tw: false */
|
/*global $tw: false */
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var confetti = require("$:/plugins/tiddlywiki/confetti/confetti.js");
|
|
||||||
|
|
||||||
// Export name and synchronous status
|
// Export name and synchronous status
|
||||||
exports.name = "confetti";
|
exports.name = "confetti";
|
||||||
exports.platforms = ["browser"];
|
exports.platforms = ["browser"];
|
||||||
@ -22,7 +20,7 @@ exports.synchronous = true;
|
|||||||
|
|
||||||
// Install the root widget event handlers
|
// Install the root widget event handlers
|
||||||
exports.startup = function() {
|
exports.startup = function() {
|
||||||
var manager = new ConfettiManager();
|
$tw.confettiManager = new $tw.ConfettiManager();
|
||||||
$tw.rootWidget.addEventListener("tm-confetti-launch",function(event) {
|
$tw.rootWidget.addEventListener("tm-confetti-launch",function(event) {
|
||||||
var paramObject = event.paramObject || {},
|
var paramObject = event.paramObject || {},
|
||||||
options = {},
|
options = {},
|
||||||
@ -47,42 +45,11 @@ exports.startup = function() {
|
|||||||
};
|
};
|
||||||
extractBooleanParameter("disableForReducedMotion");
|
extractBooleanParameter("disableForReducedMotion");
|
||||||
var delay = paramObject.delay ? $tw.utils.parseNumber(paramObject.delay) : 0;
|
var delay = paramObject.delay ? $tw.utils.parseNumber(paramObject.delay) : 0;
|
||||||
manager.launch(delay,options);
|
$tw.confettiManager.launch(delay,options);
|
||||||
});
|
});
|
||||||
$tw.rootWidget.addEventListener("tm-confetti-reset",function(event) {
|
$tw.rootWidget.addEventListener("tm-confetti-reset",function(event) {
|
||||||
manager.reset();
|
$tw.confettiManager.reset();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
function ConfettiManager() {
|
|
||||||
this.outstandingTimers = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfettiManager.prototype.launch = function (delay,options) {
|
|
||||||
var self = this;
|
|
||||||
if(delay > 0) {
|
|
||||||
var id = setTimeout(function() {
|
|
||||||
var p = self.outstandingTimers.indexOf(id);
|
|
||||||
if(p !== -1) {
|
|
||||||
self.outstandingTimers.splice(p,1);
|
|
||||||
} else {
|
|
||||||
console.log("Confetti Manager Error: Cannot find previously stored timer ID");
|
|
||||||
debugger;
|
|
||||||
}
|
|
||||||
confetti(options);
|
|
||||||
},delay);
|
|
||||||
this.outstandingTimers.push(id);
|
|
||||||
} else {
|
|
||||||
confetti(options);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
ConfettiManager.prototype.reset = function () {
|
|
||||||
$tw.utils.each(this.outstandingTimers,function(id) {
|
|
||||||
clearTimeout(id);
|
|
||||||
});
|
|
||||||
this.outstandingTimers = [];
|
|
||||||
confetti.reset();
|
|
||||||
};
|
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user