I want to have it so that you don’t actually have to click a link or button to bring up the next paragraph or text or an image, that you can just click anywhere on the page and it’ll happen. I found some code here to use, but when I tried opened the project in the browser, it came up with an error message saying “An error has occurred. You may be able to continue, but some parts may not work properly. Error [tw-user-script-0]: missing name after . operator.”
How do I make it so that I can reveal parts of a passage by clicking anywhere instead of on a specific link or button, without that error message showing up?
Here’s the javascript if that helps. Sorry it’s so long.
if (document.location.href.toLowerCase().includes(“/twine/scratch/”) || document.location.href.toLowerCase().includes(“/temp/”) || document.location.href.toLowerCase().includes(“/private/”) || hasOwnProperty.call(window, “storyFormat”)) {
setup.Path = “C:/Games/Twine_Sample_Code/”; // Running inside Twine application
} else {
setup.Path = “”; // Running in a browser
}
setup.ImagePath = setup.Path + “images/”;/* Fullscreen toggle code v1.4 - Start /
/ For more information see: Fullscreen API - Web APIs | MDN */
// Works in: Firefox, Chrome, Edge, and (old) Presto-based Opera
// Failure/Untested cases:
// - Blink-based Opera: Can’t trap F11 keypress, so toggleFullscreen() can’t cancel it.
// - Internet Explorer: Can trap F11 keypress, but can’t trigger toggleFullscreen() from keydown or keyup, so the keypress can’t be emulated.
// - Safari: should work(?)
// - iOS (iPad + Safari): should work(?)
// - iOS (iPhone): unsupported/* This code creates the setup.Fullscreen object, which normally contains these parts:
- setup.Fullscreen.API = “default”/“webkit”/“moz”/“ms” : Fullscreen API in use.
- setup.Fullscreen.onfullscreenchangeHandler : Set this property to a function with an “event” parameter, and that function will be triggered on changes to fullscreen mode.
For example: setup.Fullscreen.onfullscreenchangeHandler = function(event) { console.log("Fullscreen mode changed to " + setup.Fullscreen.isFullscreen()); console.log(event); };- setup.Fullscreen.isFullscreen() = true/false : Whether you’re in fullscreen mode or not. Check setup.Fullscreen.fullscreenElement() to see if you’re in fullscreen using the API or not.
- setup.Fullscreen.fullscreen() = true/false : Obsolete method of checking if you’re in fullscreen mode.
- setup.Fullscreen.fullscreenElement() = The Element object which is being displayed in fullscreen when in fullscreen mode; otherwise == null.
- setup.Fullscreen.fullscreenEnabled() = true/false : Tells you if fullscreen mode is available or not.
- setup.Fullscreen.requestFullscreen() : Call this to try to go fullscreen.
- setup.Fullscreen.exitFullscreen() : Call this to try to exit fullscreen mode. If it’s unable to exit fullscreen mode an alert message will appear telling the user how to exit fullscreen mode.
It also creates:- window.toggleFullscreen() -or- toggleFullscreen() : Call this to toggle fullscreen mode.
Finally, any errors will be output to the console as “Fullscreen error:” followed by the error object.If the code can’t find a fullscreen API, then setup.Fullscreen == false.
*/function fullscreenchangeHandler (event) {
if (typeof setup.Fullscreen.isFullscreen === “function”) {
if (setup.Fullscreen.isFullscreen() != setup.Fullscreen.wasFullscreen) {
setup.Fullscreen.wasFullscreen = setup.Fullscreen.isFullscreen();
if (typeof setup.Fullscreen.onfullscreenchangeHandler === “function”) {
setup.Fullscreen.onfullscreenchangeHandler(event);
}
/* Fullscreen icon/button support - Start /
/ You can remove this part if you’re not using the on-screen button. /
if (setup.Fullscreen.onfullscreenchangeButton && (typeof setup.Fullscreen.onfullscreenchangeButton === “function”)) {
setup.Fullscreen.onfullscreenchangeButton(event);
}
/ Fullscreen icon/button support - End /
}
}
return true;
}
function fullscreenExit() {
if (setup.Fullscreen.fullscreenElement() == null) { // Handle situations where exiting fullscreen isn’t possible.
setTimeout(alert(“Press F11 once or twice to exit fullscreen.”));
return false;
}
return true;
}
function fullscreenError (error) {
console.log(“Fullscreen error:”);
console.log(error);
}
if (typeof document.documentElement.requestFullscreen === “function”) {
// Default fullscreen support.
setup.Fullscreen = {
API : “default”,
onfullscreenchangeHandler : null,
fullscreen : function () { return document.fullscreen; },
fullscreenEnabled : function () { return document.fullscreenEnabled; },
fullscreenElement : function () { return document.fullscreenElement; },
requestFullscreen : function () { return document.documentElement.requestFullscreen(); }
};
if (typeof document.exitFullscreen === “function”) {
setup.Fullscreen.exitFullscreen = function () { return fullscreenExit() ? document.exitFullscreen() : true; };
} else if (typeof document.cancelFullScreen === “function”) {
setup.Fullscreen.exitFullscreen = function () { return fullscreenExit() ? document.cancelFullScreen() : true; };
}
document.onfullscreenchange = function (event) { return fullscreenchangeHandler(event); };
document.onfullscreenerror = function (error) { fullscreenError(error); };
} else if (typeof document.documentElement.webkitRequestFullscreen === “function”) {
if (typeof document.webkitExitFullscreen === “function”) {
// Blink/Chrome/Opera/Edge/Safari fullscreen support.
setup.Fullscreen = {
API : “webkit”,
onfullscreenchangeHandler : null,
fullscreen : function () { return document.webkitIsFullScreen; },
fullscreenEnabled : function () { return document.webkitFullscreenEnabled; },
fullscreenElement : function () { return document.webkitFullscreenElement; },
requestFullscreen : function () { return document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); },
exitFullscreen : function () { return fullscreenExit() ? document.webkitExitFullscreen() : true; }
};
} else if (typeof document.webkitCancelFullScreen === “function”) {
// Old Safari fullscreen support.
setup.Fullscreen = {
API : “webkit”,
onfullscreenchangeHandler : null,
fullscreen : function () { return Boolean(document.webkitIsFullScreen); },
fullscreenEnabled : function () { return document.webkitCancelFullScreen; },
fullscreenElement : function () { return document.webkitCurrentFullScreenElement; },
requestFullscreen : function () { return document.documentElement.webkitRequestFullscreen(); },
exitFullscreen : function () { return fullscreenExit() ? document.webkitCancelFullScreen() : true; }
};
}
document.onwebkitfullscreenchange = function (event) { return fullscreenchangeHandler(event); };
document.onwebkitfullscreenerror = function (error) { fullscreenError(error); };
} else if (typeof document.documentElement.mozRequestFullScreen === “function”) {
// Firefox fullscreen support.
setup.Fullscreen = {
API : “moz”,
onfullscreenchangeHandler : null,
fullscreen : function () { return document.mozFullScreen; },
fullscreenEnabled : function () { return document.mozFullScreenEnabled; },
fullscreenElement : function () { return document.mozFullScreenElement; },
requestFullscreen : function () { return document.documentElement.mozRequestFullScreen(); },
exitFullscreen : function () { return fullscreenExit() ? document.mozCancelFullScreen() : true; },
};
document.onmozfullscreenchange = function (event) { return fullscreenchangeHandler(event); };
document.onmozfullscreenerror = function (error) { fullscreenError(error); };
} else if (typeof document.documentElement.msRequestFullscreen === “function”) {
// Internet Explorer fullscreen support.
setup.Fullscreen = {
API : “ms”,
onfullscreenchangeHandler : null,
fullscreen : function () { return (setup.Fullscreen.fullscreenElement() != null) || // IE workaround
(window.fullScreen === true) || (screen.height === window.innerHeight); }, // F11 workaround
// Note: (screen.height === window.innerHeight) won’t work in IE if the console window is open.
fullscreenEnabled : function () { return document.msFullscreenEnabled; },
fullscreenElement : function () { return document.msFullscreenElement; },
requestFullscreen : function () { return document.documentElement.msRequestFullscreen(); },
exitFullscreen : function () { return fullscreenExit() ? document.msExitFullscreen() : true; },
};
document.MSFullscreenChange = function (event) { return fullscreenchangeHandler(event); };
document.MSFullscreenError = function (error) { fullscreenError(error); };
} else {
// Fullscreen not supported.
setup.Fullscreen = false;
}
if (setup.Fullscreen) {
setup.Fullscreen.isFullscreen = function () { return (setup.Fullscreen.fullscreenElement() != null) ||
(window.fullScreen === true) || (screen.height === window.innerHeight); }; // F11 workaround
setup.Fullscreen.wasFullscreen = setup.Fullscreen.isFullscreen();
$(window).on(“resize”, function(event) { // F11 workaround
fullscreenchangeHandler(event);
return true;
} );
}
window.toggleFullscreen = function () {
if (setup.Fullscreen) {
if (!setup.Fullscreen.isFullscreen()) {
setup.Fullscreen.requestFullscreen();
setTimeout( function () { // Firefox workaround
$(“body”).css(“top”, “0px”);
} );
} else {
setup.Fullscreen.exitFullscreen();
}
} else {
alert(“Fullscreen mode not supported for this browser.”);
}
};
$(document).on(“keydown”, function(e) {
if (e.key == “F11”) { // F11 workaround
if (setup.Fullscreen && (setup.Fullscreen.API !== “ms”)) {
return false; // tries to cancel F11 keypress
}
}
return true;
});
$(document).on(“keyup”, function(e) {
if (e.key == “F11”) { // F11 workaround
if (setup.Fullscreen && (setup.Fullscreen.API !== “ms”)) { // Can’t trigger fullscreen from a keypress in IE.
if ((!setup.Fullscreen.isFullscreen()) || (setup.Fullscreen.fullscreenElement() != null)) { // Try to toggle fullscreen if possible.
window.toggleFullscreen();
return false; // tries to cancel F11 keypress
}
}
}
return true;
});
/ Fullscreen icon/button support - Start /
/ You can remove this part if you’re not using the on-screen button. /
$(document).on(“click”, “#fullscreen*”, function (event) {
window.toggleFullscreen();
if (setup.Fullscreen && ($(“#fullscreen”).prop(“checked”) != setup.Fullscreen.isFullscreen())) {
$(“#fullscreen”).prop(“checked”, setup.Fullscreen.isFullscreen());
}
} );
$(document).one(“:passageend”, function (event) {
if (setup.Fullscreen && $(“#fullscreen”).length) {
setup.Fullscreen.onfullscreenchangeButton = function (event) {
if ($(“#fullscreen”).prop(“checked”) != setup.Fullscreen.isFullscreen()) {
$(“#fullscreen”).prop(“checked”, setup.Fullscreen.isFullscreen());
}
};
}
} );
/* Fullscreen icon/button support - End /
/ Fullscreen toggle code - End */if (document.location.href.toLowerCase().includes(“/temp/”) || document.location.href.toLowerCase().includes(“/private/”) || hasOwnProperty.call(window, “storyFormat”)) {
// Change this to the path where the HTML file is
// located if you want to run this from inside Twine.
setup.Path = “C:/Stories/AttachmentPart1”; // Running inside Twine application
} else {
setup.Path = “”; // Running in a browser
}
setup.SoundPath = setup.Path + “sounds/”;// Volume Slider, by Chapel; for SugarCube 2
// version 1.2.0 (modified by HiEv)
// For custom CSS for slider use: range.css - generate styles for your HTML5 range inputs/*
Changelog:
v1.2.0:
- Fixed using/storing the current volume level in the settings.
v1.1.0:- Fixed compatibility issues with SugarCube version 2.28 (still
compatible with older versions, too).- Added settings API integration for SugarCube 2.26.
- Internal improvements and greater style consistency with my
other work.- Added a pre-minified version.
- By default, the slider is now more granular than before
(101 possible positions vs 11). Change the ‘current’ and
‘rangeMax’ options to 10 to restore the old feel.
*/(function () {
// Set initial values.
var options = {
current : 50, // Default volume level.
rangeMax : 100,
step : 1,
setting : true
};
Setting.load();
if (options.setting && settings.volume) {
options.current = parseInt(settings.volume);
}
var vol = {
last: options.current,
start: (options.current / options.rangeMax).toFixed(2)
};// Function to update the volume level. function setVolume (val) { if (typeof val !== 'number') val = Number(val); if (Number.isNaN(val) || val < 0) val = 0; if (val > 1) val = 1; options.current = Math.round(val * options.rangeMax); if (options.setting) { settings.volume = options.current; Setting.save(); } if ($('input[name=volume]').val() != options.current) { $('input[name=volume]').val(options.current); } try { if (SimpleAudio) { if (typeof SimpleAudio.volume === 'function') { SimpleAudio.volume(val); } else { SimpleAudio.volume = val; } return val; } else { throw new Error('Cannot access audio API.'); } } catch (err) { // Fall back to the wikifier if we have to. console.error(err.message, err); $.wiki('<<masteraudio volume ' + val + '>>'); return val; } } // Fix the initial volume level display. postdisplay['volume-task'] = function (taskName) { delete postdisplay[taskName]; setVolume(vol.start); }; // Grab volume level changes from the volume slider. $(document).on('input', 'input[name=volume]', function() { var change = parseInt($('input[name=volume]').val()); setVolume(change / options.rangeMax); vol.last = change; }); // Create the <<volume>> macro. Macro.add('volume', { handler : function () { var wrapper = $(document.createElement('span')); var slider = $(document.createElement('input')); var className = 'macro-' + this.name; slider.attr({ id : 'volume-control', type : 'range', name : 'volume', min : '0', max : options.rangeMax, step : options.step, value : options.current }); // Class '.macro-volume' and ID '#volume-control' for styling the slider wrapper.append(slider).addClass(className).appendTo(this.output); } }); // Add Setting API integration for SugarCube 2.26 and higher. function updateVolume () { setVolume(settings.volume / options.rangeMax); } if (options.setting) { if (Setting && Setting.addRange && typeof Setting.addRange === 'function') { Setting.addRange('volume', { label : 'Volume: ', min : 0, max : options.rangeMax, step : options.step, default : options.current, onInit : updateVolume, onChange : updateVolume }); } else { console.error('This version of SugarCube does not include the `Settings.addRange()` method; please try updating to the latest version of SugarCube.'); } }}());
function revealFirstHidden(ev) {
if(ev.target.nodeName === ‘A’) return
const hidden = $(‘.passage .hide’)
if(hidden.length > 0) {
let show = hidden.first()
show.addClass(‘fadein’)
show.removeClass(‘hide’)
if(show[0].scrollIntoView)
show[0].scrollIntoView({behavior: ‘smooth’, block: ‘nearest’})
}
}(function () {
“use strict”;$(document).on(":passageinit", () => { CTP.Logs.forEach((_, id) => { if (!CTP.Repository.get(id)?.persist) CTP.Logs.delete(id); }); CTP.Repository.forEach(({ persist }, id) => { if (!persist) CTP.Repository.delete(id); }); }); window.CTP = class CTP { constructor(id, persist = false) { this.stack = []; this.clears = []; this.options = {}; if (!id?.trim()) throw new Error(`No ID specified!`); this.id = id; this.persist = persist; CTP.Repository.set(id, this); } static get Repository() { if (!setup["@CTP/Repository"]) setup["@CTP/Repository"] = new Map(); return setup["@CTP/Repository"]; } static get Logs() { if (!variables()["@CTP/Logs"]) variables()["@CTP/Logs"] = new Map(); return variables()["@CTP/Logs"]; } get log() { if (!CTP.Logs.get(this.id)) CTP.Logs.set(this.id, { lastClear: -1, index: -1, seen: -1 }); return CTP.Logs.get(this.id); } static getCTP(id) { return CTP.Repository.get(id); } add(content, options = {}) { options = { ...this.options, ...options }; if (options.clear) this.clears.push(this.stack.length); this.stack.push({ options, content, index: this.stack.length, element: $() }); return this; } print(index) { const { content, options: iOpts } = this.stack[index]; const options = { ...this.options, ...iOpts }; const element = $(document.createElement(options.element || "span")) .addClass("--macro-ctp-hidden") .attr({ "data-macro-ctp-id": this.id, "data-macro-ctp-index": index, }) .on("update-internal.macro-ctp", (event, firstTime) => { if ($(event.target).is(element)) { if (index === this.log.index) { if (firstTime) { if (typeof content === "string") element.wiki(content); else element.append(content); element.addClass(options.transition ? "--macro-ctp-t8n" : ""); } element.removeClass("--macro-ctp-hidden"); } else { if (index < this.log.seen) element.removeClass("--macro-ctp-t8n"); element.toggleClass("--macro-ctp-hidden", index > this.log.index || index < this.log.lastClear); } } }); this.stack[index].element = element; return element; } output() { const wrapper = document.createDocumentFragment(); for (let i = 0; i < this.stack.length; i++) { this.print(i).appendTo(wrapper); } return wrapper; } advance() { if (this.log.index < this.stack.length - 1) { this.log.index++; const firstTime = this.log.index > this.log.seen; this.log.seen = Math.max(this.log.seen, this.log.index); this.log.lastClear = this.clears.slice().reverse().find(el => el <= this.log.index) ?? -1; $(document).trigger("update.macro-ctp", ["advance", this.id, this.log.index]); this.stack.forEach(({ element }) => element.trigger("update-internal.macro-ctp", [firstTime, "advance", this.id, this.log.index])); } return this; } back() { if (this.log.index > 0) { this.log.index--; this.log.lastClear = this.clears.slice().reverse().find(el => el <= this.log.index) ?? -1; $(document).trigger("update.macro-ctp", ["back", this.id, this.log.index]); this.stack.forEach(({ element }) => element.trigger("update-internal.macro-ctp", [false, "back", this.id, this.log.index])); } return this; } } Macro.add("ctp", { tags: ["ctpNext"], handler() { const id = this.args[0]; const persist = this.args.slice(1).includes("persist"); const ctp = new CTP(id, persist); const _passage = passage(); this.payload.forEach(({ args, name, contents }) => { const options = {}; if (args.includes("clear")) options.clear = true; if (args.includesAny("t8n", "transition")) options.transition = true; const elementArg = (args.find((el) => el.startsWith("element:")) ?? ""); if (elementArg) options.element = elementArg.replace("element:", ""); if (name === "ctp") ctp.options = { ...options }; ctp.add(contents, options); }); $(this.output).append(ctp.output()); $(document).one(":passagedisplay", () => { if (_passage === passage()) { const i = Math.max(ctp.log.index, 0); ctp.log.index = -1; ctp.log.seen = -1; while (ctp.log.index < i) ctp.advance(); } }); } }); Macro.add("ctpAdvance", { handler() { const id = this.args[0]; if (id) { const ctp = CTP.getCTP(id); if (ctp) ctp.advance(); else throw new Error(`No CTP with ID '${id}' found!`); } else throw new Error(`No ID specified!`); } }); Macro.add("ctpBack", { handler() { const id = this.args[0]; if (id) { const ctp = CTP.getCTP(id); if (ctp) ctp.back(); else throw new Error(`No CTP with ID '${id}' found!`); } else throw new Error(`No ID specified!`); } });})();
(function () {
// v1.1.1
‘use strict’;var characters = new Map(); function addCharacter (name, displayname, icon) { if(icon === undefined && displayname){ icon = displayname; displayname = null; } if (State.length) { throw new Error('addCharacter() -> must be called before story starts'); } if (!name || !icon) { console.error('addCharacter() -> invalid arguments'); return; } if (characters.has(name)) { console.error('addCharacter() -> overwriting character "' + name + '"'); } characters.set(name, {displayName: displayname, image: icon}); } function say ($output, character, text, imgSrc) { // var $box = $(document.createElement('div')) .addClass(Util.slugify(character) + ' say'); // portrait var _img = characters.has(character) ? characters.get(character).image : null; var $img = $(document.createElement('img')) .attr('src', imgSrc || _img || ''); if ($img.attr('src') && $img.attr('src').trim()) { $box.append($img); } // name and content boxes var _name = character.toUpperFirst(); if (characters.has(character) && characters.get(character).displayName) { _name = characters.get(character).displayName; } $box.append($(document.createElement('p')) .wiki(_name)) .append($(document.createElement('p')) .wiki(text)); if ($output) { if (!($output instanceof $)) { $output = $($output); } $box.appendTo($output); } return $box; } setup.say = say; setup.addCharacter = addCharacter; Macro.add('character', { // character macro handler : function () { addCharacter(this.args[0], this.args[1], this.args[2]); } }); $(document).one(':passagestart', function () { // construct array of character names var names = Array.from(characters.keys()); names.push('say'); // generate macros Macro.add(names, { tags : null, handler : function () { if (this.name !== 'say') { say(this.output, this.name, this.payload[0].contents); } else { say(this.output, this.args[0], this.payload[0].contents, this.args[1]); } } }); });}());
(function () {
“use strict”;$(document).on(":liveupdate", function () { $(".macro-live").trigger(":liveupdateinternal"); }); Macro.add(['update', 'upd'], { handler: function handler() { $(document).trigger(":liveupdate"); } }); Macro.add(['live', 'l', 'lh'], { skipArgs: true, handler: function handler() { if (this.args.full.length === 0) { return this.error('no expression specified'); } try { var statement = this.args.full; var result = toStringOrDefault(Scripting.evalJavaScript(statement), null); if (result !== null) { var lh = this.name === "lh"; var $el = $("<span></span>").addClass("macro-live").wiki(lh ? Util.escape(result) : result).appendTo(this.output); $el.on(":liveupdateinternal", this.createShadowWrapper(function (ev) { var out = toStringOrDefault(Scripting.evalJavaScript(statement), null); $el.empty().wiki(lh ? Util.escape(out) : out); })); } } catch (ex) { return this.error("bad evaluation: " + (_typeof(ex) === 'object' ? ex.message : ex)); } } }); Macro.add(['liveblock', 'lb'], { tags: null, handler: function handler() { try { var content = this.payload[0].contents.trim(); if (content) { var $el = $("<span></span>").addClass("macro-live macro-live-block").wiki(content).appendTo(this.output); $el.on(":liveupdateinternal", this.createShadowWrapper(function (ev) { $el.empty().wiki(content); })); } } catch (ex) { return this.error("bad evaluation: " + (_typeof(ex) === 'object' ? ex.message : ex)); } } });})();
$(“#menu-item-restart”).hide();/* SlideWin v1.0 - Start /
// Add the SlideWin window to the page.
var el = document.createElement(“div”);
el.id = “slideWin”;
el.setAttribute(“role”, “main”);
el.setAttribute(“aria-labelledby”, “slideTitle”);
document.body.appendChild(el);
$(el).css({ transform: “translateX(-101vw)”, “stroke-width”: “101px” });
// Allow the ESC key to hide the SlideWin window.
$(document).on(“keyup”, function (event) {
if (($(“#slideWin*”).css(“stroke-width”) !== “101px”) && ((event.key === “Escape”) || (event.key === “Esc”))) {
window.slideWin(“hide”);
return false;
}
});
// The slideWin() function.
setup.slideWinHandler = [];
window.slideWin = function (dir) {
if ($(“#slideWin”).css(“stroke-width”) !== “101px”) { // Hide slide window.
setup.slideWinPassage = undefined;
$(“#slideWin”).attr(“tabindex”, null);
$(“#slideWin”).animate(
{ “stroke-width”: “101px” }, // Hack to get animation to work.
{ step: function (now, fx) { $(this).css(“transform”, “translateX(” + (-now) + “vw)”); },
complete: function () {
$(“#slideWin”).empty();
if (dir !== “hide”) {
window.slideWin(dir);
}
},
duration: 500
},
“swing”
);
var handler; // Remove event handlers.
while (setup.slideWinHandler.length) {
handler = setup.slideWinHandler.shift();
$(handler.selector).off(handler.event, “#slideWin”, handler.function);
}
$(“body”).removeClass(“slideWin”);
} else { // Show slide window.
setup.slideWinPassage = dir;
$(“#slideWin”).empty().attr(“tabindex”, 0).wiki(‘X<<include “’ + dir + ‘”>>’);
$(“#slideWin p”).each(function () { // Remove any empty elements.
if ($(this).text().trim() === “”) {
$(this).remove();
} else { // Strip elements from around their contents.
$(this).children().unwrap();
}
});
$(“#slideWin”).delay(1).animate( // Delay prevents animation stutter.
{ “stroke-width”: “0” }, // Hack to get animation to work.
{ step: function (now, fx) { $(this).css(“transform”, “translateX(” + (-now) + “vw)”); },
complete: function () { $(“body”).addClass(“slideWin”); },
duration: 500
},
“swing”
).focus();
}
};
/* SlideWin - End */$(“#passages”).bind(“mousedown”, funct@keyframe@keyframeson(event){
$(“#passages”)
.find(‘.next’)
.trigger(“click”);
}).–macro-ctp-hidden {
display: none;
}.–macro-ctp-t8n {
animation: macro-ctp-t8n 400ms ease-in;
}@keyframes macro-ctp-t8n {
from { opacity: 0; }
to { opacity: 1; }
}
I don’t know if I’m allowed to double post so I can’t post the stylesheet code just yet.
EDIT: I might have misunderstood things. Maybe it’s not working because I already have them in twice? But I’m looking for a way to get parts of a passage to be revealed without having to click ona specifc link or button, does anyone know if there’s a way, or will I be stuck having to make loads and loads of passages for that?