HTML preprocessors can make writing HTML more powerful or convenient. For instance, Markdown is designed to be easier to write and read for text documents and you could write a loop in Pug.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. So you don't have access to higher-up elements like the <html>
tag. If you want to add classes there that can affect the whole document, this is the place to do it.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. If you need things in the <head>
of the document, put that code here.
The resource you are linking to is using the 'http' protocol, which may not work when the browser is using https.
CSS preprocessors help make authoring CSS easier. All of them offer things like variables and mixins to provide convenient abstractions.
It's a common practice to apply CSS to a page that styles elements such that they are consistent across all browsers. We offer two of the most popular choices: normalize.css and a reset. Or, choose Neither and nothing will be applied.
To get the best cross-browser support, it is a common practice to apply vendor prefixes to CSS properties and values that require them to work. For instance -webkit-
or -moz-
.
We offer two popular choices: Autoprefixer (which processes your CSS server-side) and -prefix-free (which applies prefixes via a script, client-side).
Any URLs added here will be added as <link>
s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.
You can apply CSS to your Pen from any stylesheet on the web. Just put a URL to it here and we'll apply it, in the order you have them, before the CSS in the Pen itself.
You can also link to another Pen here (use the .css
URL Extension) and we'll pull the CSS from that Pen and include it. If it's using a matching preprocessor, use the appropriate URL Extension and we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
JavaScript preprocessors can help make authoring JavaScript easier and more convenient.
Babel includes JSX processing.
Any URL's added here will be added as <script>
s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.
You can apply a script from anywhere on the web to your Pen. Just put a URL to it here and we'll add it, in the order you have them, before the JavaScript in the Pen itself.
If the script you link to has the file extension of a preprocessor, we'll attempt to process it before applying.
You can also link to another Pen here, and we'll pull the JavaScript from that Pen and include it. If it's using a matching preprocessor, we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
Search for and use JavaScript packages from npm here. By selecting a package, an import
statement will be added to the top of the JavaScript editor for this package.
Using packages here is powered by Skypack, which makes packages from npm not only available on a CDN, but prepares them for native JavaScript ES6 import
usage.
All packages are different, so refer to their docs for how they work.
If you're using React / ReactDOM, make sure to turn on Babel for the JSX processing.
If active, Pens will autosave every 30 seconds after being saved once.
If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.
If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.
Visit your global Editor Settings.
<!-- <script src="https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js"></script> -->
<body>
<nav id="navbar">
<header>
<h2>Table of Contents</h2>
</header>
<div class="nav-link-wrapper">
<a class="nav-link" href="#voice_commands">Voice Commands</a>
<a class="nav-link" href="#text_commands">Text Commands</a>
<a class="nav-link" href="#emote_actions">Emote Actions</a>
<a class="nav-link" href="#stream_pet">Stream Pet</a>
<a class="nav-link" href="#flappy_jason">Flappy Jason</a>
</div>
</nav>
<div class="border"></div>
<main id="main-doc">
<h1> Learn With Jason Commands</h1>
<p>Want to have some fun with Jason and the chat? Here's the full list of available commands for you!</p>
<p>Each command is written how it should be used - so if it shows an <strong>!</strong> don't forget to add that!</p>
<p>A few of the text examples shown might have some odd-looking words - these are likely the names of different Twitch emotes. When added to the chat, they will turn into the named emote.</p>
<div class="border-horiz"></div>
<section class="main-section" id="voice_commands">
<header>
<h2>Voice Commands</h2>
</header>
<p>For when you just need to make some noise. These commands are often used to get Jason's attention, celebrate when things work, commiserate when they don't, and generally cause some mayhem.</p>
<p>These will trigger a command to play a soundclip and show an image on the bottom left-hand side of the screen. Some of them will also add text to the chat.</p>
<ul>
<li>
<code>!adult</code>
<p>Audio played: "I think I need, ah, adult supervision here."</p>
</li>
<li>
<code>!ahem</code>
<p>Audio played: Jason loudly going "Ahem!"</p>
</li>
<li>
<code>!behold</code>
<p>Audio played: "Ah-ha! Behold! My Bucket!"</p>
</li>
<li>
<code>!blitzed</code>
<p>Chat text: "KAPOW YOU GOT BLITZED! MorphinTime"</p>
<p>Audio played: "You just got blitzed!" then a booming explosion.</p>
</li>
<li>
<code>!code</code>
<p>Chat text: "oh, so we need to add code? Kappa"</p>
<p>Audio played: "Oh, so we would need to add code, is that right?"</p>
</li>
<li>
<code>!compooper</code>
<p>Chat text: "C’mon lil’ compooper!"</p>
<p>Audio played: "Oh you can do it! C'mon lil' compooper!"</p>
</li>
<li>
<code>!focusup</code>
<p>Chat text: "What were we doing again?"</p>
<p>Audio played: "Should we focus up? Should we write some code?"</p>
</li>
<li>
<code>!haxxors</code>
<p>Chat text: "MorphinTime no0o0o0 my c0d3z y0u h4x0rz! NotLikeThis"</p>
<p>Audio played: "You hackers! You, you dirty hackers."</p>
</li>
<li>
<code>!holybuckets</code>
<p>Chat text: "PogChamp jlengsHolyBucket holy buckets! did that just work?!"</p>
<p>Audio played: "Hooly buckets, did that just work?"</p>
</li>
<li>
<code>!jamstack</code>
<p>Audio played: "Jamstack!" then quieter "Jamstack!"</p>
</li>
<li>
<code>!justwork</code>
<p>Audio played: "It would be neat if this just worked."</p>
</li>
<li>
<code>!nope</code>
<p>Audio played: "And that's just not something I'm willing to do."</p>
</li>
<li>
<code>!offtherails</code>
<p>Audio played: "I'm sure there's something I was supposed to be doing that I've completely gone off the rails about."</p>
</li>
<li>
<code>!oofda</code>
<p>Chat text: "riPepperonis riPepperonis riPepperonis riPepperonis riPepperonis riPepperonis"</p>
<p>Audio played: "Oofda! Alright, so that's exciting."</p>
</li>
<li>
<code>!plzhold</code>
<p>Chat text: "SeriousSloth compiling..."</p>
<p>Audio played: Plays elevator music.</p>
</li>
<li>
<code>!potato-salad</code>
<p>Audio played: "Show me potato salad!"</p>
</li>
<li>
<code>!sonofa</code>
<p>Chat text: "NotLikeThis NotLikeThis NotLikeThis"</p>
<p>Audio played: "Ah, sonofa biscuit!"</p>
</li>
<li>
<code>!thiswillwork</code>
<p>Chat text: "PowerUpL jlengsHolyBucket PowerUpR"</p>
<p>Audio played: "Oh this will work, this will work." then "Yeesssss!"</p>
</li>
<li>
<code>!whyyy</code>
<p>Audio played: "What are you doing, computer? Why? Why are you like this?"</p>
</li>
<li>
<code>!youmatter</code>
<p>Audio played: "Your code has value. Your code matters." then "You have value. You matter."</p>
</li>
</ul>
</section>
<div class="border-horiz"></div>
<section class="main-section" id="text_commands">
<header>
<h2>Text Commands</h2>
</header>
<p>These will add some extra text to the chat, often used as a shortcut to writing out longer text.</p>
<ul>
<li>
<code>!so @username</code>
<p>Send a shout-out to someone in chat! The <em>@username</em> will be the person's Twitch username.</p>
<p>Chat text: "Please check out {@username} at {link to username Twitch channel} jlengsStreamBlitz jlengsHolyBucket jlengsBOOP"</p>
</li>
</ul>
</section>
<div class="border-horiz"></div>
<section class="main-section" id="emote_actions">
<header>
<h2>Emote Actions</h2>
</header>
<p>These specific emotes are used to trigger reactions on the screen!</p>
<ul>
<li>
<code>jlengsBOOP</code>
<p>This will cause a boop emote to rain down on the screen from a random location, and stay on the bottom for a minute. The more boops you do, the more fall down! You can even bury the streamers if enough people boop at once!</p>
</li>
<li>
<code>jlengsCorgi</code>
<p>Each time a corgi emote is sent, a counter will show on screen with the current corgi count. If the chat sends 60 total corgis, a corgi stampede will occur! This will cause a fun little song to play, and a herd of corgis to frolic across the screen.</p>
</li>
</ul>
</section>
<div class="border-horiz"></div>
<section class="main-section" id="stream_pet">
<header>
<h2>Stream Pet</h2>
</header>
<p>Jason's stream has a pet, and the chat can change it's appearance and control it's placement.</p>
<ul>
<li>
<code>!pet name</code>
<p>Change which pet is shown on the screen. Valid options for <em>name</em> are <code>submarine</code> or <code>dumpster-fire</code>.</p>
</li>
<li>
<code>!up</code>
<p>Move the pet up on the screen.</p>
</li>
<li>
<code>!down</code>
<p>Move the pet down on the screen.</p>
</li>
<li>
<code>!left</code>
<p>If the pet is currently facing to the left, will move the pet to the left on the screen. Otherwise, will turn the pet to face to the left.</p>
</li>
<li>
<code>!right</code>
<p>If the pet is currently facing to the right, will move the pet to the right on the screen. Otherwise, will turn the pet to face to the right.</p>
</li>
</ul>
</section>
<div class="border-horiz"></div>
<section class="main-section" id="flappy_jason">
<header>
<h2>Flappy Jason</h2>
</header>
<p>Show a special CSS version of Jason on the bottom left of the screen, make him flap, and change his beard length!</p>
<p>This animation was created during an episode with Cassidy Williams, <a href="https://codepen.io/jlengstorf/pen/xxwJKvM">you can see the initial CodePen here.</a></p>
<ul>
<li>
<code>!flap</code>
<p>Makes CSS Jason flap his arms.</p>
</li>
<li>
<code>!grow</code>
<p>Makes CSS Jason's beard grow a few inches. If you can make it grow long enough, it will turn into a rainbow beard!</p>
</li>
<li>
<code>!shave</code>
<p>Makes CSS Jason's beard grow shorter a few inches. If the beard is currently in rainbow mode, making it short enough will turn it back to brown.</p>
</li>
</ul>
</section>
<div class="border-horiz"></div>
<p>The code for Jason's stream is open sourced online, so you can add new commands if you'd like! You can <a href="https://github.com/learnwithjason/learnwithjason.dev/tree/main/functions">find the repo for the audio and text commands here</a> and <a href="https://github.com/learnwithjason/scenes/blob/main/src/components/submarine.js">the pet functionality here</a>. Enjoy your time during the stream!</p>
</main>
</body>
:root {
--white: #fff;
--text: #403c4a;
--text-pink: #c10b7e;
--yellow: #ffe742;
--pink: #ff87d4;
--blue: #87fffb;
--black: #171321;
--font-family: jwf, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
"Segoe UI Symbol";
--gradient: linear-gradient(
2deg,
var(--pink),
var(--yellow) 50%,
var(--blue)
);
}
body {
display: grid;
grid-template-columns: 0.25fr 5px 1fr;
grid-template-rows: 1fr;
font-family: var(--font-family);
color: var(--text);
}
nav {
grid-column: 1 / 2;
background: var(--black);
color: var(--white);
}
nav header {
margin-left: 6%;
}
.nav-link-wrapper {
position: sticky;
top: 0;
left: 0;
display: flex;
flex-direction: column;
margin-left: 6%;
}
.nav-link {
color: white;
font-size: 1.5rem;
margin: 3%;
}
.nav-link:hover {
color: var(--pink);
}
.border {
width: 5px;
height: 100%;
background: var(--gradient);
grid-column: 2 / 3;
}
main {
grid-column: 3;
margin-left: 3%;
}
h1 {
font-size: 2.5rem;
}
h2 {
font-size: 2rem;
margin-bottom: 0.5%;
}
.border-horiz {
width: 70%;
height: 3px;
background: var(--gradient);
margin: 3% auto 2%;
}
p {
margin: 1.25% 3%;
}
li {
margin: 2.5% 1%;
}
code {
background: var(--black);
color: var(--white);
padding: 0.35% 1%;
font-size: 1.2rem;
border-radius: 5px;
}
a {
color: var(--text-pink);
}
@media screen and (max-width: 700px) {
body {
display: grid;
grid-template-rows: 450px 5px 1fr;
grid-template-columns: 1fr;
font-family: var(--font-family);
color: var(--text);
}
nav {
grid-row: 1 / 2;
grid-column: 1;
}
nav header {
text-align: center;
margin-left: 0;
}
.nav-link-wrapper {
position: relative;
align-items: center;
margin-left: 0;
}
.border {
width: 100%;
height: 5px;
background: var(--gradient);
grid-row: 2 / 3;
grid-column: 1;
}
main {
grid-column: 1;
grid-row: 3;
margin-left: 3%;
}
p {
margin: 3%;
}
li {
margin: 5% 1%;
}
}
Also see: Tab Triggers