Workshop · Angular · Kids
NG010 Angular for kids: the Sticker Board
A web page is a thing you can make. Over six short sits a child builds Pixel the robot's Sticker Board: first a plain page with words and colourful boxes, then a real Angular board where a button adds a sticker, a counter cheers, and a list grows. Every step is five minutes, shows up in the preview at once, and ends with the machine trying the page with a new word and a new number.
Open Coding Tutor at codingtutor.agilesystemsoftware.com, pick NG010 from the course button in the chat and press Tutor me. Every lesson, demo and hands-on step is also published below.
Who it is for
Children aged 8 to 12 with a guardian or teacher nearby who opens the seat and sits with them. No typing speed needed: every step changes a few words, a colour or a number and shows the result on a page straight away. No personal details are ever typed in; the stickers belong to Pixel the robot and the cat Biscuit.
A kids course: a guardian or teacher sets up the seat and stays nearby. The tutor never asks for personal details, answers come through buttons or by voice, and nothing is shared or ranked. How kids courses work.
What you will be able to do
- Change words and colours in a page and see the result in the App Preview
- Make boxes with CSS and line them up in a row
- Find the words of an Angular board in its component and change them
- Make a button do something with (click) and a signal
- Show a list of stickers with @for and add to it
Syllabus
Every session ends in a lab the machine checks on your own code. Open a session's mini steps to read each lesson, demo and hands-on task; the badge shows how far the engine can verify it: checked · T3 a check runs over your files, proven · T4 the grader also tries inputs you did not see, tutored · T0 done on your word. Each step has its own link (for example #s1-1).
- 1. Pixel gets a page
- 2. Colours and boxes
- 3. A component is a Lego brick
- 4. Buttons that count
- 5. A list of stickers
- 6. The Sticker Board show
Session 1 · Pixel gets a page
Four five-minute steps with a grown-up nearby. A web page is a text file the browser draws. The App Preview tab shows the page as the child changes it. Headings for big words, paragraphs for sentences, a list for Pixel's favourite things. Live in the seat: the tutor changes one word and the page changes, breaks a tag and shows the page gone odd, then fixes it.
Lab Make Pixel the robot's page: one big heading with Pixel's name, one sentence about Pixel, and a list of three things Pixel likes. Session 1 checkpoint.
4 mini steps · ~22 min
1.1The page is a text file5 minchecked · T3
Predict
The file says <h1>Hello</h1>. If we change Hello to Pixel, what does the page show?
Lesson
A web page is a text file. The browser reads it and draws it. Words inside tags like <h1> are drawn big; the tags are instructions and stay invisible.
Demo
The tutor opens node/ng010/demo/index.html next to the App Preview, changes Hello to Biscuit, saves, and the preview changes at once. Then the tutor puts it back.
Hands-on
Open node/ng010/s1/index.html. Change the word inside the <h1> from Hello to Pixel, save, and watch the preview change.
Explain
Say it out loud: where did the word on the page come from?
Check
The big heading says Pixel — checked (T3):
web_dom1.2Big words and sentences5 minchecked · T3
Predict
Which tag makes a normal sentence, not a big heading?
Lesson
<h1> is the biggest heading, <h2> a smaller one, and <p> is a paragraph: a sentence or two in normal size. Every opening tag has a closing tag with a slash.
Demo
The tutor adds an <h2> that says "Pixel likes" and a <p> sentence under it in the demo page, then forgets the closing </p> on purpose and shows how the page looks squashed before fixing it.
Hands-on
Under the heading in s1/index.html add an <h2> that says Pixel likes and a <p> with one sentence about Pixel (Pixel is a robot who likes shiny things).
Explain
Point at the two tags you added and say what each one does.
Check
An h2 and a paragraph are on the page — checked (T3):
web_dom1.3A list of favourite things6 minchecked · T3
Predict
A list with <ul> and three <li> inside: how many dots appear?
Lesson
<ul> starts a bulleted list and each <li> inside it is one item. The browser puts a dot in front of every item and lines them up for you.
Demo
The tutor adds a <ul> with three <li> items (bolts, magnets, a torch) to the demo page and the preview shows three dots. Adding a fourth <li> makes a fourth dot appear.
Hands-on
Add a <ul> with three <li> items to s1/index.html: three things Pixel likes. Make each one a different word.
Explain
What would happen if you added a fourth <li>?
Check
A list with three items — checked (T3):
web_dom1.4Lab: Pixel's page6 minchecked · T3
Predict
Which comes first on the page: the heading or the list?
Lesson
All of it together: a heading, a sentence and a list, in the order they sit in the file. The browser reads from the top down, like a story.
Demo
The tutor builds the demo page from empty: h1, p, ul with three li, saving after each tag so the preview grows one piece at a time, then shows the machine's check reading the page.
Hands-on
Make s1/index.html Pixel's finished page: an <h1> that says Pixel, one <p> sentence, and a <ul> with three <li> things Pixel likes. The machine will check all three are there.
Explain
Tell the grown-up: which three tags did you use and what does each draw?
Check
Pixel's page has a heading, a sentence and three list items — checked (T3):
web_dom
Session 2 · Colours and boxes
Four steps about how a page looks. A style rule picks a tag and says how to draw it. A box with a border and a background colour becomes a sticker. Boxes side by side with flexbox. Live in the seat: a heading turned orange with one line, a box growing a border, three boxes jumping from a column into a row.
Lab Give Pixel's page a style block with a coloured heading and a row of three sticker boxes, each a different colour. Session 2 checkpoint.
4 mini steps · ~23 min
2.1A rule that colours words5 minchecked · T3
Predict
The rule h1 { color: orange; } is added. What turns orange?
Lesson
A style rule has two parts: which tags it picks (the selector) and how to draw them (inside the curly brackets). h1 { color: orange; } colours every h1 orange.
Demo
The tutor adds a <style> block to the demo page's head with h1 { color: orange; }, saves, and the heading turns orange. Changing orange to teal changes it again.
Hands-on
Add a <style> block inside the <head> of node/ng010/s2/index.html (a copy of your s1 page is there) and give the h1 a colour you like, written as a colour word.
Explain
Which part of the rule said who gets the colour?
Check
A style block colours the heading — checked (T3):
seat_fileweb_dom2.2A box becomes a sticker6 minchecked · T3
Predict
A div gets border: 3px solid black and background: yellow. What do you see?
Lesson
A <div> is an empty box. Give it a class name, then a rule for .sticker with a border, a background colour, some padding and a width, and the box becomes a sticker you can see.
Demo
The tutor adds <div class="sticker">Bolt</div> and a .sticker rule with border, background, padding and width. Changing the padding number makes the sticker fatter.
Hands-on
In s2/index.html add one <div class="sticker"> with a word inside, and a .sticker rule with a border, a background colour and padding so it looks like a sticker.
Explain
What does padding do to the sticker?
Check
One sticker box with a border and background — checked (T3):
web_domseat_file2.3Stickers in a row6 minchecked · T3
Predict
Three divs sit in a parent with display: flex. How do they line up?
Lesson
Boxes normally stack top to bottom. Put them inside a parent <div class="row"> and give the row display: flex and a gap, and the boxes stand side by side with space between.
Demo
The tutor wraps three stickers in <div class="row">, adds .row { display: flex; gap: 12px; } and the column becomes a row. Removing display: flex makes them stack again.
Hands-on
Put three .sticker divs inside a <div class="row"> in s2/index.html and add a .row rule with display: flex and a gap, so the stickers sit in a row.
Explain
Which box got the flex rule: the stickers or the row around them?
Check
Three stickers inside a flex row — checked (T3):
web_domseat_file2.4Lab: a row of coloured stickers6 minchecked · T3
Predict
Two stickers share class sticker, one also has class gold. Which rule wins for its colour?
Lesson
A sticker can have two classes: sticker for the shape and a colour class for its own background. Later rules win, so the colour class goes after .sticker in the style block.
Demo
The tutor gives each of the three demo stickers a second class (red, gold, sky) with its own background rule, then shows the machine's check counting the stickers and reading the colours.
Hands-on
Finish s2/index.html: a coloured h1, a .row with three .sticker boxes, each with its own second class and a different background colour. Keep the h1, p and list from session 1 above the row.
Explain
Tell the grown-up how one sticker got a different colour from the others.
Check
Heading coloured, three stickers in a row with three colour classes — checked (T3):
web_domseat_file
Session 3 · A component is a Lego brick
Four steps inside a real Angular board the tutor has ready in node/ng010/board. A component is a brick with two sides: a template (the words and tags) and a class (where values live). Curly brackets in the template show a value from the class. Live in the seat: the tutor builds the board once, the preview shows it, a word in the class changes and the board changes too.
Lab Make the board say Pixel's Sticker Board at the top and a subtitle underneath, both coming from values in the component class, not typed into the template. Session 3 checkpoint.
4 mini steps · ~22 min
3.1Open the board5 minactivity · T1
Predict
The tutor runs the build and opens the preview. Which file holds the words you see?
Lesson
The board in node/ng010/board is an Angular app: a folder of files that a build turns into a page. One component, the board, owns what you see. Its template file holds the words and tags.
Demo
The tutor opens node/ng010/board, runs ng build in the terminal, opens dist/board/browser in the App Preview, and then opens src/app/board.component.html to show the words on the page sitting in the file.
Hands-on
Open node/ng010/board/src/app/board.component.html, find the words "Sticker Board", and read them aloud. Ask the tutor to build; the preview should show the same words. No changes yet.
Explain
Which file has the words the board shows?
No machine check: this step is marked done on your word (T0).
3.2Change the words in the template5 minchecked · T3
Predict
You change a word in board.component.html and save. When does the preview change?
Lesson
The template is HTML like your page from session 1. Change a word, save, build, and the preview shows it. The build is the step that turns the folder into a page.
Demo
The tutor changes the <p> under the heading in the demo copy node/ng010/demo-board to say "Pixel collects stickers", runs ng build, refreshes the preview, and the sentence has changed.
Hands-on
In node/ng010/board/src/app/board.component.html change the <p> sentence to a sentence about Pixel. Ask the tutor to build and check the preview.
Explain
What did you have to do after saving to see the change?
Check
The board sentence mentions Pixel and the build passes — checked (T3):
seat_buildseat_file3.3Where the words live: the class6 minchecked · T3
Predict
The class has title = "Board" and the template has <h1>{{ title }}</h1>. What shows?
Lesson
The other side of the brick is board.component.ts, the class. A value like title = 'Board' lives there and the template shows it with {{ title }}. Change the value once and every place it is shown changes.
Demo
The tutor adds owner = 'Biscuit' to the demo class and {{ owner }} in two places in the template, builds, and both places show Biscuit. Changing the class value to Mango changes both.
Hands-on
In board.component.ts change the title value to a title of your own. In board.component.html make sure the <h1> shows {{ title }}. Build and look.
Explain
Why do the curly brackets help when the same word appears twice?
Check
The h1 shows {{ title }} from the class — checked (T3):
seat_buildseat_fileseat_file3.4Lab: Pixel's board title6 minchecked · T3
Predict
Two values, title and subtitle, in the class. How many {{ }} do you need in the template?
Lesson
A board with two values from the class: a title in the h1 and a subtitle in the p. The template says where, the class says what.
Demo
The tutor adds subtitle = 'Stickers from the robot workshop' to the demo class and {{ subtitle }} to the p, builds, and shows the machine's check reading the built page.
Hands-on
Give the class a title of "Pixel's Sticker Board" and a subtitle of your own words; show both with {{ }} in the h1 and the p. Build and check the preview.
Explain
Tell the grown-up the two sides of a component brick.
Check
Title and subtitle come from the class — checked (T3):
seat_buildseat_fileweb_dom
Session 4 · Buttons that count
Four steps that make the board do something. A button with (click) runs a method in the class. A signal is a value the page watches: change it and the page updates. Showing a number with curly brackets. Live in the seat: a button that does nothing until (click) is added, a counter going 0, 1, 2, and a reset button.
Lab Add a Cheer button to the board that counts how many cheers Pixel has had, shows the number, and a Reset button that puts it back to zero. Session 4 checkpoint.
4 mini steps · ~22 min
4.1A button and a click5 minchecked · T3
Predict
<button (click)="cheer()">Cheer</button> is pressed. What happens?
Lesson
A <button> is a thing to press. (click)="cheer()" tells Angular that pressing it runs the method cheer() in the class. Without (click) a button just sits there.
Demo
The tutor adds a button to the demo board with no (click) and presses it: nothing. Then adds (click)="cheer()" and a cheer() method that logs to the console, presses again, and the console shows the message.
Hands-on
Add <button (click)="cheer()">Cheer</button> to the board template and a cheer() method in the class that writes "Cheer!" with console.log. Build, press it, and look in the browser console.
Explain
What does the (click) part mean in your own words?
Check
A Cheer button wired to cheer() — checked (T3):
seat_buildseat_fileseat_file4.2A number the page watches6 minchecked · T3
Predict
cheers = signal(0) and cheer() does this.cheers.update(n => n + 1). After three presses?
Lesson
A signal is a value the page watches. cheers = signal(0) starts at zero; this.cheers.update(n => n + 1) adds one. In the template, {{ cheers() }} shows it, brackets included, and it changes on its own.
Demo
The tutor adds cheers = signal(0) to the demo class, makes cheer() update it, puts {{ cheers() }} in the template, builds, and presses the button while the number climbs.
Hands-on
Add cheers = signal(0) to the class (import signal from @angular/core), make cheer() add one with update, and show {{ cheers() }} in the template next to the button.
Explain
Why does the number on the page change without you doing anything else?
Check
A cheers signal shown in the template — checked (T3):
seat_buildseat_fileseat_file4.3Back to zero5 minchecked · T3
Predict
reset() does this.cheers.set(0). The counter shows 7 and Reset is pressed. Then?
Lesson
set gives a signal a brand-new value; update changes it from what it was. A Reset button that calls this.cheers.set(0) wipes the count.
Demo
The tutor adds a Reset button and reset() with set(0) to the demo board, clicks Cheer five times, then Reset, and the number drops to 0.
Hands-on
Add a second button, Reset, with (click)="reset()", and a reset() method that sets cheers to 0. Build and try: cheer a few times, then reset.
Explain
What is the difference between set and update?
Check
A Reset button sets the signal to 0 — checked (T3):
seat_buildseat_fileseat_file4.4Lab: the cheer counter6 minchecked · T3
Predict
The machine tries your board: Cheer twice, Reset, Cheer once. What number should it see?
Lesson
The whole counter: a signal, a Cheer button that updates it, a Reset button that sets it, and the number on the page. The machine will press the buttons for you and read the number.
Demo
The tutor rebuilds the demo board's counter from scratch in two minutes and then runs the course's test file that presses the buttons and reads the number, showing the green result.
Hands-on
Make sure the board has the cheers signal, a Cheer button, a Reset button and the number shown in a <span class="count">. Build it; the machine will press the buttons and read the span.
Explain
Tell the grown-up what a signal is.
Check
Cheer and Reset work when the test presses them — checked (T3):
seat_buildseat_test
Session 5 · A list of stickers
Four steps that turn one sticker into many. A list in the class holds sticker names. @for in the template draws one box per name. A button adds a name to the list and a new box appears. Live in the seat: a list of three becoming a list of four without touching the template, and a track that keeps each sticker steady.
Lab The board shows every sticker in the list as a coloured box, and an Add button puts a new sticker called Star at the end. Session 5 checkpoint.
4 mini steps · ~23 min
5.1A list in the class5 minchecked · T3
Predict
stickers = signal(['Bolt', 'Magnet', 'Torch']). How many stickers are in the list?
Lesson
Square brackets make a list: ['Bolt', 'Magnet', 'Torch']. Put the list in a signal so the page can watch it. {{ stickers().length }} shows how many there are.
Demo
The tutor adds stickers = signal(['Bolt', 'Magnet', 'Torch']) to the demo class and shows the count with {{ stickers().length }}; adds a fourth name and the count says 4.
Hands-on
Add a stickers signal to the class with three sticker names of your own choosing (things, not people). Show the count in the template: "Stickers: {{ stickers().length }}".
Explain
What are the square brackets for?
Check
A stickers signal with three names and a count — checked (T3):
seat_buildseat_fileseat_file5.2One box for each name6 minchecked · T3
Predict
@for (s of stickers(); track s) { <div class="sticker">{{ s }}</div> } with three names draws?
Lesson
@for repeats a piece of template for every item in a list. Inside, s is the current name. track s tells Angular how to tell the boxes apart. Give the box the .sticker class from session 2 and it looks like one.
Demo
The tutor replaces the one demo sticker with an @for over stickers(), builds, and three boxes appear. Adding a name to the list in the class adds a box.
Hands-on
Replace any single sticker in the template with an @for over stickers(), drawing <div class="sticker">{{ s }}</div> for each. Copy the .sticker and .row styles into board.component.css.
Explain
What is s inside the @for?
Check
@for draws a sticker box per name — checked (T3):
seat_buildseat_fileweb_dom5.3Add a sticker with a button6 minchecked · T3
Predict
add() does this.stickers.update(list => [...list, 'Star']). Press it twice: how many Stars?
Lesson
To add to a list in a signal, make a new list: [...list, 'Star'] means "everything that was there, then Star". update hands you the old list and takes the new one. The @for draws the extra box on its own.
Demo
The tutor adds an Add button and add() with update and spread in the demo board, builds, and presses it three times while three Star boxes appear at the end of the row.
Hands-on
Add a button "Add Star" with (click)="add()" and an add() method that updates stickers to the old list plus 'Star'. Build and press it.
Explain
Why do we make a new list instead of pushing onto the old one?
Check
An Add button grows the list — checked (T3):
seat_buildseat_fileseat_file5.4Lab: the growing sticker row6 minchecked · T3
Predict
Three stickers to start. The machine presses Add Star twice. How many boxes?
Lesson
All of session 5 together: a list signal, an @for that draws a box per item, an Add button that grows the list. The machine will press Add and count the boxes.
Demo
The tutor runs the supplied stickers.spec.ts against the demo board: it counts three boxes, presses Add twice and counts five, and the result goes green.
Hands-on
Check the board has three starting stickers, the @for row and the Add Star button; copy the supplied stickers.spec.ts from node/ng010/samples/s5 into the board and ask the tutor to run ng test.
Explain
Tell the grown-up what @for does.
Check
Three boxes, then five after two Adds — checked (T3):
seat_buildseat_test
Session 6 · The Sticker Board show
The last four steps put on the show. Each sticker gets its own colour from a record with a name and a colour. A Remove button takes a sticker away. A line at the bottom says how many stickers there are and how many cheers. Then the machine tries the finished board with sticker names and numbers the child never typed. Live in the seat: a record replacing a plain name, a style binding painting a box, and the hidden test going green.
Lab Finish Pixel's Sticker Board: coloured stickers from a list of records, Add and Remove buttons, the cheer counter and a summary line. The machine tries it with its own stickers. Session 6 checkpoint and course finale.
4 mini steps · ~23 min
6.1A sticker with a name and a colour6 minchecked · T3
Predict
A sticker is { name: 'Bolt', color: 'gold' }. In the @for, what shows the name?
Lesson
A sticker can be a record: a name and a colour together in curly brackets, { name: 'Bolt', color: 'gold' }. The list holds records, and in the @for you write s.name for the words.
Demo
The tutor changes the demo list to three records with colours, updates the @for to {{ s.name }}, builds, and the names still show. A Sticker type with name and color is added so mistakes are caught.
Hands-on
Change your stickers list to records, each with a name and a color, with a Sticker type above the class. Change the @for to show {{ s.name }}. Make add() add { name: 'Star', color: 'gold' }.
Explain
What two things does each sticker record hold now?
Check
Stickers are records with name and color — checked (T3):
seat_buildseat_fileseat_file6.2Paint each sticker5 minchecked · T3
Predict
[style.background]="s.color" on the sticker div. A sticker has color gold. What colour is its box?
Lesson
Square brackets on an attribute bind it to a value: [style.background]="s.color" paints each box with its own colour from the record. No new CSS class per colour needed.
Demo
The tutor adds [style.background]="s.color" to the demo @for box, builds, and three different colours appear. Changing one colour word in the class repaints one box.
Hands-on
Add [style.background]="s.color" to the sticker div inside your @for. Build and look: each sticker should wear its own colour.
Explain
What do the square brackets do that curly brackets do not?
Check
Each sticker is painted from its record — checked (T3):
seat_buildseat_file6.3Take a sticker away6 minchecked · T3
Predict
remove('Bolt') keeps every sticker whose name is not Bolt. Five stickers, one Bolt. After?
Lesson
To remove, make a new list without that sticker: list.filter(x => x.name !== name). Each box gets its own small Remove button that calls remove(s.name).
Demo
The tutor puts a small x button inside each demo sticker with (click)="remove(s.name)" and a remove() method with filter; pressing an x makes that box vanish.
Hands-on
Add a <button class="x" (click)="remove(s.name)">x</button> inside each sticker and a remove(name) method that filters the list. Build and remove a sticker.
Explain
What does filter keep?
Check
A Remove button filters the list — checked (T3):
seat_buildseat_fileseat_file6.4Lab: the show6 minproven · T4
Predict
The machine gives your board stickers you never typed and presses Add once. What must the summary say?
Lesson
The show: coloured stickers from records, Add and Remove, the cheer counter, and a summary line "<span class="summary">N stickers, M cheers</span>" that uses a computed signal. The machine tries it with its own stickers.
Demo
The tutor adds summary = computed(() => ...) to the demo board and the summary span, then runs the hidden test, which swaps in four new stickers, presses Add and Cheer, and reads the summary.
Hands-on
Add a computed summary signal and show it in <span class="summary">. Make sure Add, Remove and Cheer all work and the board shows title and subtitle. Ask the tutor to run the check.
Explain
Tell the grown-up the three things your board can do.
Check
The Sticker Board works with stickers the machine chose — proven (T4):
seat_buildweb_domseat_test
Outcome
By the end of the course the tutor's checks will have verified: a web page with headings, a list and a row of coloured sticker boxes; an Angular board whose title and words come from code; a button that counts cheers; a sticker list that grows and shrinks with buttons; and the Sticker Board show, which the machine tries with sticker names the child did not type.
Completion
No certificate for kids courses. When the last show is done, the guardian or teacher receives a completion card listing the sessions and the checks the machine ran. No streaks, no leaderboards, nothing shared.
Environment
A VS Code seat in the browser with the App Preview tab; a web page folder for the first two sits and a ready-made Angular 22 board the tutor sets up — nothing to install, nothing to download. Your work lives in node/ng010; the tutor's demo files live apart from yours and the tutor never edits your hands-on file while you are working on it.
Open Coding Tutor at codingtutor.agilesystemsoftware.com, pick NG010 from the course button in the chat and press Tutor me. Every lesson, demo and hands-on step is also published below.