···3636}
3737```
38383939-To make this work, let's say that whenever the HTML is sent over the network--that is, *serialized*--all custom tags get replaced with the output of their functions:
3939+To make this work, let's say that whenever the HTML is sent over the network--that is, *serialized*--the server must replace those tags with the output they return:
40404141```js {3}
4242<html>
···56565757---
58585959-### Parameters
5959+### Attributes
60606161-Functions take parameters.
6262-6363-Let's support passing and receiving them:
6161+Let's support passing attributes to tags and interpolating values into the markup.
64626563```js {3-4,9}
6664<html>
···7573}
7674```
77757878-Of course, there's no reason why those parameters have to be *strings*.
7676+Of course, there's no reason why those arguments have to be *strings*.
79778080-We might want to pass an object to `Greeting`:
7878+We might want to pass an object to `Greeting` instead:
81798280```js {3-4,10-12}
8381<html>
···98969997Objects let us group related stuff together.
10098101101-Suppose we wanted to *send* the HTML above to the browser. The first step, as we specified earlier, would involve replacing custom tags with their output:
9999+According to the [earlier rule](#tags), *serializing* the HTML above would produce:
102100103103-```js {3,4}
101101+```js
104102<html>
105103 <body>
106104 <p style={{ color: 'purple' }}>Hello, Alice</p>
···117115118116### Objects
119117120120-The "real" HTML we know and love has no first-class notion of objects. If we wanted to output some "real" HTML, we'd have to turn them into `style` strings:
118118+The "real" HTML we know and love has no first-class notion of objects. If we wanted to output some "real" HTML, we'd have to turn `style` into a string:
121119122120```js {3,4}
123121<html>
···128126</html>
129127```
130128131131-But we don't *have to* turn our "imaginary" HTML into "real" HTML right away. We can stay in the imaginary land for a bit longer by turning *the entire thing* into JSON.
132132-133133-Note how, in this format, `style` can remain completely intact as an object within:
129129+But if we're reimagining HTML, we don't have to abide by the same limitations. For example, we could decide that our imaginary HTML *serializes into* JSON:
134130135131```js {6,10}
136132["html", {
···149145}]
150146```
151147152152-We can *then* easily turn this JSON into the "real" HTML if we want. But JSON is a *richer* representation because it preserves objects in a way that is easy to parse.
148148+This lets us keep the `style` objects--*or any objects we might want to send*--intact.
153149154154-This strange JSON representation isn't particularly interesting or useful yet. But going forward, we'll co-evolve these two representations. In fact, we'll consider the JSON representation to be the primary one because it preserves the most original information--notably, *it preserves objects.* We'll think of the "real" HTML representation as secondary because it can always be computed from that JSON.
155155-156156-In other words, we have a little pipeline:
157157-158158-1. *Imaginary HTML:* The language we are inventing.
159159-1. *JSON:* The primary output format of our language.
160160-1. *Real HTML:* What browsers can handle directly.
161161-162162-Let's see how each piece evolves with new requirements.
150150+This strange JSON representation isn't particularly interesting or useful yet. But going forward, we'll consider this representation as our primary output format. We can always generate "real" HTML *from* this representation, but not vice versa.
163151164152---
165153