storyline 360
15 TopicsAccessibility Checker Early Access Sign-up
Hello everyone, If you've noticed this on the roadmap or seen the demo at DevLearn last November, you know we're building a new Accessibility Checker feature for Storyline 360. The Accessibility Checker will surface potential a11y issues that could prevent some learners from getting the most out of your course. Even better, it will explain why the issue is important to fix, how you can fix it, and, in some cases, it will even fix it for you with a single click! We've been working hard on this feature for the past several months and are nearly ready to let a small group of customers try it out and provide feedback via our Early Access program. Participants in the Early Access program will be able to use the feature via the Storyline private beta and communicate directly with the engineering team to ask questions and provide feedback that will help shape the final version of the feature. If you're interested in participating in the Early Access program, please fill out this interest form: https://lnkd.in/eFAPU3KD NOTE: Not all customers currently in the private beta program will be able to use the Accessibility Checker while it's in Early Access. Once Early Access concludes, the feature will be available to all private beta users for a period of time before being released to everyone. Thanks, Ronnie416Views3likes36Comments[REDUNDANT] Storyline custom focus control
========================================================================= Update 18 March 2025 This functionality is now redundant. Please use the native focus trigger in Storyline 360 64 bit March 18, 2025 (Build 3.98.34222.0) ========================================================================= There have many been times, when using Storyline to develop content, it has not been possible to get the kind of screen reader focus control that I have needed. Using layers for this can only get you so far. I developed a JavaScript function that allows you to send the screen reader focus to the text field that you want, via any trigger. Adding the following JavaScript to your projects Slide Master will make it available throughout your module: // Check if function has been defined already if (typeof window.setFocus === "undefined") { // Get reference to the Storyline Player var $player = GetPlayer(); // Set the amount of time to delay before attempting to send focus to the target element (milliseconds) 1000 = 1 second. var $interval = 200; // window.setFocus = function ($target, $announce = false) { // Get the target element, based on the passed argument setTimeout(function () { var $div = document.querySelector('[data-acc-text^="' + $target + '"]'); var $id = "acc-" + $div.dataset.modelId $div = document.getElementById($id); if($announce) { $div.setAttribute("aria-atomic", "true"); $div.setAttribute("aria-live", "assertive"); } // Send focus to target, after defined $interval $div.focus(); }, $interval); } } Once the function is defined in your Slide Master, you can then call the function on the page using a JavaScript function, which can be triggered by any Storyline trigger such as timeline start, timeline end, button click etc. // The second argument will determine if the content should // be announced to assistive technology using aria-live=assertive // This will announce the text contents to the screen reader window.setFocus("Customer in the queue", true); // This will just send focus to the element. window.setFocus("Customer in the queue", false); The first argument, which is passed in the "" quotes, is the text contents of the text field you are targeting. You do not have to include all the text, just enough to ensure it is unique. For example, if you have two text fields: "Customer in the queue talking on their phone." "Customer in the shop staring into space." Passing the words "Customer in the" would not be specific enough, as there would be two text fields found. However, passing "Customer in the queue" would send the focus to the text field that contains the text "Customer in the queue talking on their phone." The second argument (true or false) determines if the target elements contents should be announced to the screen reader when it receives focus.269Views1like9CommentsHow To Embed An ElevenLabs Conversational AI Widget Into SL360 Using JS!
Hi Heroes, It feels like something new and exciting is always around the corner in the world of generative AI technology, and this week ElevenLabs put themselves firmly in the driving seat of the agentic AI revolution with their new Conversational AI toolkit. If you haven't heard of this yet, check out this video which explains it all: https://www.youtube.com/watch?v=v-EYzZCLF48&ab_channel=ElevenLabs The interactive, animated widget that this toolkit provided is easy to embed anywhere, including directly within an Articulate Storyline 360 project slide! If you're interested in how to get started, I've written a blog post that includes all the steps, including an Execute JavaScript snippet you can use to effortlessly get your agent loaded into your activity: https://discoverelearninguk.com/how-to-set-up-elevenlabs-conversational-ai-widget-in-articulate-storyline-360/ I'm also currently experimenting with the API for the new Conversational toolkit to understand how I can implement it into my eLearning Magic Toolkit plugin for Storyline + WordPress, potentially opening the door for developing real-time voice activated automation all within a Storyline-built eLearning activity! Much more to come very soon. 🚀 --- My name's Chris Hodgson, an eLearning developer and software trainer based in the UK. I enjoy creating fun, unique, and engaging online experiences using Articulate software! Connect with me on LinkedIn - https://www.linkedin.com/in/chrishodgson44/259Views4likes1CommentJavaScript help needed: button floating animation issue in Storyline
Hi everyone, I'm currently experimenting with creating a floating animation for a button using javascript. The goal is that when learners hover over the button, it will float up slightly, and when the mouse leaves, the button will bounce back to its original position. Here’s the JavaScript code I’m using: let button = document.querySelector("[data-model-id='60P0mJeyWGh']"); button.addEventListener("mouseover", () => { gsap.to(button, { y: -0.5, // Moves the button up by 0.5 pixels (subtle effect) duration: 1, // Animation duration ease: "power1.inOut", // Smooth easing yoyo: true, // Makes it come back to the original position repeat: 1, // Repeats once to go up and back down }); }); button.addEventListener("mouseout", () => { gsap.from(button, { // Uses gsap.from to return to the original position y: 0, // Moves back to the original position duration: 1, // Duration for the return animation ease: "power1.inOut", // Smooth easing }); }); However, when I implement this in Storyline, the button moves WAY more than 0.5 pixels and, after several hover events, ends up moving all the way to the top of the slide. Can anyone review my code and see if there might be an issue? I’m not sure why this is happening. I have also attached the Storyline file in case it would be helpful for review. Thank you!68Views0likes3CommentsDynamic border radius experiment
This was just a little experiment to see if I could manipulate the border radius of shapes on the slide numerically using JavaScript, and the answer is yes. Not sure of any use case, but I've always wanted to be able to control the border radius numerically in Storyline as border radius is not maintained when resizing shapes. I'm not sure if this could help as there is no easy way of targeting specific shapes in a slide without knowing their unique ID. It was a bit of fun anyway. If anybody would like to play or expand on this, go for it. What I've found so far, is it will only support solid or no outlines on shapes. When you start using other styles (dot, dash) an image is used by Storyline to achieve this. window.updateCornerRadius = function(targets, radius) { targets.forEach(function(target){ const path = document.querySelector(`[data-dv_ref="ref-${target}"] path`); if (!path) { console.error(`SVG target ${target} not found.`); return; } // Extract the bounding box of the current path const bbox = path.getBBox(); const x = bbox.x; const y = bbox.y; const width = bbox.width; const height = bbox.height; // Ensure radius doesn't exceed half the width or height radius = Math.min(radius, width / 2, height / 2); // Construct a new path data string with the updated corner radius const newPathData = ` M ${x + radius},${y} H ${x + width - radius} A ${radius},${radius} 0 0 1 ${x + width},${y + radius} V ${y + height - radius} A ${radius},${radius} 0 0 1 ${x + width - radius},${y + height} H ${x + radius} A ${radius},${radius} 0 0 1 ${x},${y + height - radius} V ${y + radius} A ${radius},${radius} 0 0 1 ${x + radius},${y} Z `; // Update the path's "d" attribute path.setAttribute("d", newPathData); }); } An example of this being called. I'm using a variable, borderRadius, change trigger. const borderRadius = getVar("borderRadius"); window.updateCornerRadius(['12','15','18','21'], borderRadius);101Views2likes2CommentsIn Case You Missed It (ICYMI): Accessibility Updates in Q4 2024
Welcome to 2025! Since my last update, this accessibility group has grown by 61 members, bringing its total to 403 members. The first ICYMI edition was published on October 23, 2024, and established a foundation, but we can keep it short and sweet from now on. Product Updates: Rise 360 New: Immerse all learners in customizable interactive experiences with accessible scenario blocks that offer alternative text, screen reader support, and a visible focus indicator. New: Select the source course language when exporting your training for translation. Enhanced: Select the text of a hyperlink to apply formatting, including changing the color of the text. Enhanced: Line height and letter spacing are now available in the text formatting toolbar. Storyline 360 Enhanced: Expand your reach with a new AI text-to-speech model that supports Hungarian, Norwegian, and Vietnamese in addition to the 29 other languages already supported. Enhanced: You can now add text-to-speech narration and sound effects to markers. Fixed: Text alignment wasn't preserved in existing projects. Upcoming accessibility features: We've released Rise Accessible Drag-and-Drop Questions (Q1 2025, but released before posting this) and added Rise Math Equations. Current accessibility items on our feature roadmap include: Storyline Accessibility Checker Storyline Math Equations Rise Math Equations Updates in articles, documentation, resource center, or training: Refreshed: Storyline 360: Working with Hyperlinks New blog: What Is Section 508? A Quick Guide to Section 508 Compliance Upcoming webinar: Beginner's Guide to NVDA and Storyline for Accessibility Testing New entry in Storyline 360: Our Accessibility Journey - Accessibility Enhancements to Kick Off 202588Views2likes0CommentsStoryline Accessibility Survey Summary
Hi Everyone, In April 2024, Our team conducted a survey about accessibility and Storyline 360. I am pleased to share that I have now posted a summary of the survey findings. I encourage everyone to check it out. Engineering Journal: Storyline Accessibility Survey Summary Thanks, Ronnie Pilman34Views1like0CommentsAlways on top
I just set myself the challenge of having elements that are "always on top". I've worked on a handful of courses in the past, that had an irregular shaped header graphic (sometimes with drop shadow), where it would have been great to be able to set some elements in the Master Template to appears always on top of other elements within the module. For those courses, I had to create a slice of the header (the irregular shaped part) and paste on each slide, where the header appeared over another element on the slide. I have had some success, and of course it is a JavaScript implementation. This is very much an ALPHA release. Here's the implementation if interested in having a play with it or extending it. I'm sure there will be some elements, that I haven't played with, that may need some extra logic in the JS. For each element you would like to appear always on top, add the string "{AOT}" in the "Alternative text" field. If the element is decorative, you can just add "{AOT}". This will be taken care of during processing (removed, and set to aria-hidden=true). If the element is non-decorative, for example an exit button, you would just add "{AOT}Exit" to the alternative text. This would also be process, and "{AOT}" removed and "Exit" retained in the ALT text. Add the following script to the "timeline starts" on the SLIDE MASTER. This ensures that the script will process on every slide. const init = () => { // inititial value for z-index let z = 999; // get all elements with data-acc-text attribute starting with "{AOT}" const elements = document.querySelectorAll('[data-acc-text^="{AOT}"]'); // loop through each element elements.forEach(element => { // get the modelId and accText from the element's dataset const { modelId, accText } = element.dataset; // get the root element with the same modelId const rootElement = document.querySelector(`[data-model-id="${modelId}"]`); // set the z-index of the root element (incrementing by 1 each time) rootElement.style.zIndex = z++; // get the alternative text by removing "{AOT}" from accText and trimming the result const alt = String(accText).replace('{AOT}', '').trim(); // get the alt element with the id "acc-${modelId}" const altElement = document.getElementById(`acc-${modelId}`); // set the alternative text to the element's dataset element.dataset.accText = alt; // re-write the inner text of the alt element altElement.innerText = alt; // if the alternative text is empty (decorative), set the aria-hidden attribute to true and the z-index to -1 if (!alt) { altElement.setAttribute('aria-hidden', 'true'); altElement.style.zIndex = '-1'; } else { if (altElement.hasAttribute('aria-label')) altElement.setAttribute('aria-label', alt); } }); }; requestAnimationFrame(() => { init(); }); I've also including a very simple example file. This just demonstrates that the designated "Always on top" elements will appear over the image on the slide.52Views2likes0CommentsNew Tutorial! Better Organise Unruly Navigation Menus With Custom Line Separators and JS
Hi Heroes, I have a handy Storyline JavaScript hack I'd like to share with you! In this Storyline Magic Series episode, I'll be showing you how to set up an 'Execute JavaScript' trigger that can add custom line separators to the standard navigation menu bar in Articulate Storyline 360. It's a simple but effective technique which provides another option you can use to help visually separate and group slides together within your courses! Check out the full tutorial below, along with a link to all previous episodes in the series: Watch the full series here - https://lnkd.in/dNvyD7wv --- My name's Chris Hodgson, an eLearning developer and software trainer based in the UK. I enjoy creating fun, unique, and engaging online experiences using Articulate software! Connect with me on LinkedIn - https://www.linkedin.com/in/chrishodgson44/107Views3likes0Comments