@loadbare/app 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +3 -3
  2. package/dist/build/assemble.d.ts.map +1 -1
  3. package/dist/build/assemble.js +107 -90
  4. package/dist/build/assemble.js.map +1 -1
  5. package/dist/build/expand.d.ts +6 -1
  6. package/dist/build/expand.d.ts.map +1 -1
  7. package/dist/build/expand.js +112 -26
  8. package/dist/build/expand.js.map +1 -1
  9. package/dist/build/locations.d.ts +2 -3
  10. package/dist/build/locations.d.ts.map +1 -1
  11. package/dist/build/locations.js +2 -3
  12. package/dist/build/locations.js.map +1 -1
  13. package/dist/build/pages.d.ts +3 -4
  14. package/dist/build/pages.d.ts.map +1 -1
  15. package/dist/build/pages.js +3 -4
  16. package/dist/build/pages.js.map +1 -1
  17. package/dist/core/lb-constants.d.ts +27 -24
  18. package/dist/core/lb-constants.d.ts.map +1 -1
  19. package/dist/core/lb-constants.js +103 -168
  20. package/dist/core/lb-constants.js.map +1 -1
  21. package/dist/core/lb-types.d.ts +64 -77
  22. package/dist/core/lb-types.d.ts.map +1 -1
  23. package/dist/core/lb-types.js +40 -7
  24. package/dist/core/lb-types.js.map +1 -1
  25. package/dist/hub/lb-apply.d.ts +47 -37
  26. package/dist/hub/lb-apply.d.ts.map +1 -1
  27. package/dist/hub/lb-apply.js +195 -199
  28. package/dist/hub/lb-apply.js.map +1 -1
  29. package/dist/hub/lb-hub.browser.d.ts +1 -1
  30. package/dist/hub/lb-hub.browser.d.ts.map +1 -1
  31. package/dist/hub/lb-hub.browser.js +410 -449
  32. package/dist/hub/lb-hub.browser.js.map +1 -1
  33. package/dist/server/lb-express.d.ts +5 -5
  34. package/dist/server/lb-express.d.ts.map +1 -1
  35. package/dist/server/lb-express.js +35 -66
  36. package/dist/server/lb-express.js.map +1 -1
  37. package/dist/server/lb-server.d.ts +77 -135
  38. package/dist/server/lb-server.d.ts.map +1 -1
  39. package/dist/server/lb-server.js +132 -79
  40. package/dist/server/lb-server.js.map +1 -1
  41. package/docs/TECHREF-1.0.md +908 -585
  42. package/docs/comparison.md +243 -185
  43. package/docs/prior-art.md +15 -14
  44. package/docs/reference/builder.md +9 -3
  45. package/docs/reference/chrome.md +107 -56
  46. package/docs/reference/custom-elements.md +291 -173
  47. package/docs/reference/data-binding.md +381 -374
  48. package/docs/reference/overview.md +12 -10
  49. package/docs/reference/page-files.md +164 -99
  50. package/docs/reference/server.md +2 -2
  51. package/docs/reference/widgets.md +104 -110
  52. package/docs/roadmap.md +32 -39
  53. package/docs/terms-of-art.md +57 -0
  54. package/docs/testing.md +97 -68
  55. package/docs/theory.md +92 -58
  56. package/docs/tutorials/010-pages-and-navigation.md +20 -12
  57. package/docs/tutorials/020-css.md +6 -3
  58. package/docs/tutorials/030-html-decomposition.md +9 -7
  59. package/docs/tutorials/040-displaying-data.md +30 -13
  60. package/docs/tutorials/{050-actions.md → 050-requests.md} +25 -15
  61. package/docs/tutorials/060-custom-element-code.md +17 -16
  62. package/docs/tutorials/065-conditional-rendering.md +34 -23
  63. package/docs/tutorials/070-displaying-a-list.md +29 -21
  64. package/docs/tutorials/072-inserting-into-a-list.md +24 -16
  65. package/docs/tutorials/074-deleting-from-a-list.md +9 -7
  66. package/docs/tutorials/076-updating-a-list-item.md +11 -10
  67. package/docs/tutorials/080-widget-requests.md +71 -43
  68. package/docs/tutorials/090-using-widget-libraries.md +22 -22
  69. package/docs/what-does-loadbare-extend.md +124 -0
  70. package/package.json +1 -1
  71. package/skills/loadbare-app/SKILL.md +201 -123
  72. package/skills/loadbare-app/references/TECHREF-1.0.md +908 -585
  73. package/skills/loadbare-app/references/builder.md +9 -3
  74. package/skills/loadbare-app/references/chrome.md +107 -56
  75. package/skills/loadbare-app/references/custom-elements.md +291 -173
  76. package/skills/loadbare-app/references/data-binding.md +381 -374
  77. package/skills/loadbare-app/references/overview.md +12 -10
  78. package/skills/loadbare-app/references/page-files.md +164 -99
  79. package/skills/loadbare-app/references/server.md +2 -2
  80. package/skills/loadbare-app/references/widgets.md +104 -110
  81. package/docs/analysis-accidental-complexity.md +0 -149
  82. package/docs/analysis-closed-set.md +0 -210
@@ -1,13 +1,12 @@
1
1
  # The Basic Widget Library
2
2
 
3
- Seven widgets: `lb-input`, `lb-select`, `lb-list`, `lb-options`, `lb-table`,
4
- `lb-picker`, `lb-unknown-page`. Every one of them is written against the same two contracts
5
- documented elsewhere — [Custom Elements](./custom-elements.md#html) for its
6
- definition, [Custom Elements](./custom-elements.md#code) for its class —
7
- nothing here is special-cased machinery.
3
+ Six widgets: `lb-input`, `lb-select`, `lb-options`, `lb-picker`, `lb-table`,
4
+ `lb-unknown-page`. Every one of them is an ordinary custom element, written
5
+ against the contracts in [Custom Elements](./custom-elements.md#html) for its
6
+ definition and [Custom Elements](./custom-elements.md#code) for its class.
8
7
 
9
8
  They ship compiled, in `@loadbare/widgets`, a package the builder resolves the
10
- way it resolves anyone else's — it declares `"loadbare": { "widgets": "./dist" }`
9
+ way it resolves any other: it declares `"loadbare": { "widgets": "./dist" }`
11
10
  and the builder scans that. Install it and list it:
12
11
 
13
12
  ```
@@ -23,140 +22,133 @@ See [Widgets from packages](./builder.md#widgets-from-packages) for what
23
22
  listing a package does, and [The Builder](./builder.md#where-the-builder-looks)
24
23
  for where a listed package sits in the cascade.
25
24
 
25
+ `lb-input`, `lb-select`, `lb-options` and `lb-picker` are controls:
26
+ form-associated custom elements with a `value` property that fire `change`.
27
+ Each carries `lb-column` and `lb-request` itself, the way an `<input>` does;
28
+ see [Being a control](./custom-elements.md#being-a-control).
29
+
26
30
  ## `lb-input`
27
31
 
28
- Wraps an `<input>`. `lb-value` sets the input's `.value`. The widget sends
29
- nothing on its own: `lb-action` names what the input's `change` sends. The
30
- reserved `lb-row-update` saves the input's own cell; any other name sends that
31
- action. Either carries the input's value, and the hub adds the scope the
32
- input sits in.
32
+ Wraps an `<input>`. The hub sets its `value` from the column `lb-column`
33
+ names, and `lb-request` names what the widget sends on `change`:
33
34
 
34
- An input inside an `lb-row-insert` or `lb-row-update` form leaves the attribute off.
35
- The form reads every `lb-cell` in it on submit and sends one request for all
36
- of them, so an input that also sent its own would write the same edit twice.
35
+ ```html
36
+ <lb-input lb-column="name" lb-request="lb-row-update" exp-label="Name"></lb-input>
37
+ ```
37
38
 
38
- | Parameter | Fills |
39
- | ---------- | ----- |
40
- | `exp-label` | the visible `<label>` text |
41
- | `exp-readonly` | the input's `readonly` attribute |
39
+ Inside a form, leave `lb-request` off. The form gathers the widget on submit
40
+ like any other control, so a widget that also sent its own request would
41
+ write the same edit twice.
42
42
 
43
- | Attribute | Asks for |
44
- | ---------- | ----- |
45
- | `lb-action` | what to send on `change`; `lb-row-update` to save the cell's own edit |
43
+ | Parameter | Fills |
44
+ |----------------|----------------------------------|
45
+ | `exp-label` | The visible `<label>` text |
46
+ | `exp-readonly` | The input's `readonly` attribute |
46
47
 
47
48
  ## `lb-select`
48
49
 
49
- Wraps a `<select>` whose `<option>`s the author writes directly inside (via
50
- `lb-slot`). `lb-value` sets the select's `.value`; a `change` sends the
51
- action named by `lb-action`, with the select's `.value` as the request's
52
- `value` — the choice is the interaction, so this is the case where an
53
- action carries a value.
50
+ Wraps a `<select>` whose `<option>`s the page writes inside the tag:
54
51
 
55
- | Parameter | Fills |
56
- | ---------- | ----- |
57
- | `exp-label` | the visible `<label>` text |
52
+ ```html
53
+ <lb-select lb-column="team" lb-request="lb-row-update" exp-label="Team">
54
+ <option value="">No team</option>
55
+ <option value="Engines">Engines</option>
56
+ </lb-select>
57
+ ```
58
58
 
59
- Requires `lb-action` or `lb-query-parm` — a change with neither logs and
60
- sends nothing. With `lb-query-parm` the hub writes the choice into the URL.
59
+ | Parameter | Fills |
60
+ |-------------|----------------------------|
61
+ | `exp-label` | The visible `<label>` text |
61
62
 
62
63
  ## `lb-options`
63
64
 
64
- A `<select>` whose `<option>`s come from a query instead of being written by
65
- hand. The author supplies the row template inside the widget (via
66
- `lb-slot`), same as any list widget:
65
+ A `<select>` whose `<option>`s are the rows of the query it names. The page
66
+ writes the row template inside the widget:
67
67
 
68
68
  ```html
69
- <lb-options lb-list="statuses" exp-label="Status" lb-action="setStatus">
70
- <template lb-key="id" data-group="category">
71
- <option lb-cell="label"></option>
69
+ <lb-options lb-query="statuses" lb-column="status" lb-request="lb-row-update" exp-label="Status">
70
+ <template data-group="category">
71
+ <option lb-column="label"></option>
72
72
  </template>
73
73
  </lb-options>
74
74
  ```
75
75
 
76
- | Parameter | Fills |
77
- | ---------- | ----- |
78
- | `exp-label` | the visible `<label>` text |
76
+ | Parameter | Fills |
77
+ |-------------|----------------------------|
78
+ | `exp-label` | The visible `<label>` text |
79
79
 
80
- - The row's key becomes the option's `value`: the `lb-key-value` the hub
81
- stamps on each option is copied across, so the page names the key column
82
- once, with `lb-key`.
80
+ - Each option's `value` is its row's key, the `lb-key-value` the hub stamps
81
+ on the live row, so the widget holds a key and shows a label.
83
82
  - `data-group` on the row template sections the options into `<optgroup>`s,
84
- one per distinct value, created and removed as rows arrive and leave.
85
- - `lb-value` selects the option with that key, including one that arrives
86
- after the value did.
87
- - A `change` sends the action named by `lb-action`, value from the
88
- select's `.value`. With `lb-query-parm` instead, the hub writes the
89
- choice into the URL.
83
+ one per distinct value of that column, added and removed as rows arrive
84
+ and leave.
85
+ - Its `value` selects the option with that key, including an option that
86
+ arrives after the value did.
87
+
88
+ `lb-picker` is the same class with the row template supplied by its
89
+ definition.
90
+
91
+ ## `lb-picker`
92
+
93
+ `lb-options`, with the row template built in, for a list where every row is
94
+ one option showing one column:
95
+
96
+ ```html
97
+ <lb-picker
98
+ lb-query="statuses"
99
+ lb-column="status"
100
+ lb-request="lb-row-update"
101
+ exp-label="Status"
102
+ exp-column="label"
103
+ exp-group="category"
104
+ ></lb-picker>
105
+ ```
90
106
 
91
- `lb-picker` is this same class with its row template supplied by the
92
- definition instead of the page — see below.
107
+ | Parameter | Fills |
108
+ |--------------|-----------------------------------------|
109
+ | `exp-label` | The visible `<label>` text |
110
+ | `exp-column` | The column each option shows |
111
+ | `exp-group` | The row template's `data-group` |
112
+
113
+ An option built from two columns, or a row with a second element, is
114
+ `lb-options` with the page's own row template.
93
115
 
94
116
  ## `lb-table`
95
117
 
96
- A `<table>` that supplies its own scaffolding; the author supplies the
97
- heading row, the row template, and optionally a footer, each as a
98
- `<template>` matched to a destination:
118
+ A `<table>` that supplies its own scaffolding. The page supplies the heading
119
+ row, the row template, and optionally a footer, each as a `<template>`:
99
120
 
100
121
  ```html
101
- <lb-table lb-list="ledger" exp-caption="Ledger">
102
- <template lb-template="head">
122
+ <lb-table lb-query="ledger" exp-caption="Ledger">
123
+ <template lb-exp-template="head">
103
124
  <tr><th>Date</th><th>Amount</th></tr>
104
125
  </template>
105
- <template lb-key="id" data-sort="date" data-group="month">
106
- <tr><td lb-cell="date"></td><td lb-cell="amount"></td></tr>
126
+ <template data-sort="date" data-group="month">
127
+ <tr><td lb-column="date"></td><td lb-column="amount"></td></tr>
107
128
  </template>
108
- <template lb-template="foot">
109
- <tr lb-row="ledger-total"><td>Total</td><td lb-cell="total"></td></tr>
129
+ <template lb-exp-template="foot">
130
+ <tr lb-query="ledger-total"><td>Total</td><td lb-column="total"></td></tr>
110
131
  </template>
111
132
  </lb-table>
112
133
  ```
113
134
 
114
- | Parameter | Fills |
115
- | ---------- | ----- |
116
- | `exp-caption` | the `<caption>` text |
117
-
118
- | Destination | Fills |
119
- | ------------ | ----- |
120
- | `head` (`lb-template="head"`) | the `<thead>` content |
121
- | `foot` (`lb-template="foot"`) | the `<tfoot>` content |
122
- | slot (no `lb-template`) | the row template, via `lb-slot` on `<tbody>` |
123
-
124
- - `data-group` on the row template sections rows under a derived heading row,
125
- one per distinct value, whose `colSpan` matches the row's own column
126
- count. `data-sort` orders rows within a section (or the whole body, with no
127
- grouping) by comparing each row's cell text.
128
- - The `foot` destination is not delivered through `lbPlaceRow` — it's an
129
- ordinary scope carrying its own `lb-row`, resolved by name like any
130
- other on the page. A grand total is a second query over the same
131
- data, not a row the hub hands the table.
132
-
133
- ## `lb-picker`
134
-
135
- `lb-options`, with the row template supplied by the definition instead of
136
- the page — for when every row is one option and nothing else varies:
137
-
138
- ```html
139
- <lb-picker
140
- lb-list="statuses"
141
- exp-label="Status"
142
- exp-key="id"
143
- exp-cell="label"
144
- exp-group="category"
145
- lb-action="setStatus"
146
- ></lb-picker>
147
- ```
135
+ | Parameter | Fills |
136
+ |---------------|----------------------|
137
+ | `exp-caption` | The `<caption>` text |
148
138
 
149
- | Parameter | Fills |
150
- | ---------- | ----- |
151
- | `exp-label` | the visible `<label>` text |
152
- | `exp-key` | the row template's `lb-key` |
153
- | `exp-cell` | the option's `lb-cell` |
154
- | `exp-group` | the row template's `data-group` |
139
+ | Template | Fills |
140
+ |-----------------------------------|-----------------------------------------|
141
+ | `<template lb-exp-template="head">` | The `<thead>` |
142
+ | `<template lb-exp-template="foot">` | The `<tfoot>` |
143
+ | Any other `<template>` | The row template, in the `<tbody>` |
155
144
 
156
- Behavior — grouping, key-as-value, the action on change — is inherited
157
- whole from `lb-options`; a page author who needs a second element in the
158
- row, or an option built from two columns, writes `lb-options` and its own
159
- `<template>` instead.
145
+ - `data-group` on the row template sections rows under a heading row, one
146
+ per distinct value of that column, spanning every column of the row.
147
+ - `data-sort` orders rows within a section, or within the whole body with no
148
+ grouping, by the text of that column.
149
+ - The footer is not a row of `ledger`. Its `<tr>` names a `row` query of its
150
+ own, which lands on the `<tr>` itself. A grand total is a second query over
151
+ the same data.
160
152
 
161
153
  ## `lb-unknown-page`
162
154
 
@@ -170,9 +162,11 @@ The chrome's dialog for a URL that names no page, as one tag:
170
162
  </lb-hub>
171
163
  ```
172
164
 
173
- It expands to a `<dialog lb-unknown-page>` scoped to the hub's own
174
- `lb-navigation` query, so `page-label` and `page-uri` land in it the way any
175
- cell lands anywhere, and the hub opens it on a miss. It takes no parameters
176
- and, so far, shows both cells rather than choosing between them. See
177
- [`chrome.html`](./chrome.md#where-the-page-is) for the query, and for the same
178
- dialog written by hand.
165
+ It expands to a `<dialog lb-url-unknown lb-query="lb-url">` showing
166
+ `lb-path`, and the hub opens it when no page's stub matches the path. See
167
+ [An unknown page](./chrome.md#an-unknown-page) for the same dialog written
168
+ by hand.
169
+
170
+ | Parameter | Fills |
171
+ |-------------------|------------------------------------------|
172
+ | `exp-button-text` | The text of the button that closes it, `OK` by default |
package/docs/roadmap.md CHANGED
@@ -17,34 +17,35 @@ wrong thing. Revisit when the described symptom actually shows up.
17
17
 
18
18
  ### Staleness and concurrent writers
19
19
 
20
- Two tabs, or two users, updating the same list at once. A solo developer
20
+ Two tabs, or two users, updating the same rows at once. A solo developer
21
21
  testing in one browser will not produce this by accident, and retrofitting a
22
22
  version or conflict check onto every row after the fact touches every widget
23
23
  that writes.
24
24
 
25
25
  ### Nesting
26
26
 
27
- Whether a row may contain a list (master-detail, an expanding row). [Theory](./theory.md) already flags this as possibly load-bearing if
27
+ Whether a live row may hold rows of its own detail (master-detail, an
28
+ expanding row). [Theory](./theory.md) already flags this as possibly load-bearing if
28
29
  disallowed. Worth a decision-in-principle the first time a master-detail
29
30
  page is built, even before the mechanism is needed elsewhere.
30
31
 
31
32
  ### Pending appearance
32
33
 
33
34
  A value that hasn't arrived yet is probably derivable from an absent
34
- `lb-value` rather than needing a signal of its own. Not yet needed because
35
+ `lb-column-value` rather than needing a signal of its own. Not yet needed because
35
36
  nothing currently produces that gap in practice — revisit if one does.
36
37
 
37
38
  ### Events while a request is in flight
38
39
 
39
- A native action, a button or a form, ignores being performed again while its
40
- own round trip is in flight. Nothing holds back any other element, so two
41
- round trips can be out at once and the one that answers last is what lands,
42
- whichever the user started last.
40
+ The hub ignores a commit on an element carrying `lb-request-pending`.
41
+ Nothing holds back any other element, so two round trips can be out at once
42
+ and the one that answers last is what lands, whichever the user started
43
+ last.
43
44
 
44
- Whether the hub should refuse every event while anything is in flight is
45
- open. A widget is deliberately not held back today, because one that sends on
46
- change must have its latest value sent rather than dropped, and a refusal of
47
- everything would have to say what happens to that value.
45
+ A control that commits on `change` while its own round trip is in flight has
46
+ that change ignored, so its latest value is not sent. Whether the hub should
47
+ send it once the round trip settles, and whether it should refuse every
48
+ commit while anything is in flight, is open.
48
49
 
49
50
  ### Validation placement
50
51
 
@@ -109,15 +110,15 @@ enough to measure.
109
110
 
110
111
  ### Data binding utilities
111
112
 
112
- If a dev team wishes to make their own widgets that identify `lb-list` or `lb-row`,
113
- `lb-key-value`, `lb-cell`, they must repeat the code that is present in the hub.
113
+ A custom element that finds its own nearest ancestor `lb-query`,
114
+ `lb-key-value` or `lb-column` repeats code that is present in the hub.
114
115
 
115
- Perhaps a utility that can be called, like `getDataScope(el)`, to help
116
- clean up the code in these cases.
116
+ Perhaps a utility that can be called, like `nearestRow(el)`, to help clean up
117
+ the code in these cases.
117
118
 
118
119
  ### Refresh narrowed by query parm
119
120
 
120
- A query parm write loads the whole page again, every query at once. Keyed
121
+ A query parm write reloads every query of the page at once. Keyed
121
122
  landing keeps the rows that came back, so nothing on screen is disturbed, but
122
123
  the server does work for queries the parm never touched.
123
124
 
@@ -127,21 +128,21 @@ only the queries that read one of them, and still remember nothing.
127
128
 
128
129
  ### Query parm history as a user preference
129
130
 
130
- A query parm write replaces the history entry, and `lb-query-parm-push`
131
- pushes one. Which of the two a user wants may be the user's to say, rather
131
+ A query parm write replaces the history entry, and `lb-url-push` pushes
132
+ one. Which of the two a user wants may be the user's to say, rather
132
133
  than the page's.
133
134
 
134
- ### Build-time checking of `lb-action` against the declared requests
135
+ ### Build-time checking of `lb-request` against the declared requests
135
136
 
136
- Release 1.0 resolves every `lb-action` value at request time. A value naming
137
- no entry under `actions`, or a reserved operation naming a list with no entry
138
- under `crud`, is found on the first click: a server console warning and an
139
- empty answer, described in
137
+ Release 1.0 resolves every `lb-request` value at request time. A value naming
138
+ no entry under `handlers`, or one of the requests Loadbare provides for a
139
+ query with no entry under `crud`, is found on the first commit: a server
140
+ console warning and an empty answer, described in
140
141
  [Page files](./reference/page-files.md). A typo builds cleanly.
141
142
 
142
143
  The builder already expands each page and walks the finished document in
143
- `checkBinding`, tracking the enclosing `lb-list` scope, so collecting every
144
- action name together with the list it sits in needs no new machinery. What
144
+ `walkMarkup`, tracking the enclosing `lb-query`, so collecting every request
145
+ name together with the query it is issued for needs no new machinery. What
145
146
  it lacks is the other half of the comparison: it knows the path of a
146
147
  `.requests.ts` file and never reads its contents.
147
148
 
@@ -155,23 +156,15 @@ Two routes to the declared names, and the choice is the decision:
155
156
  API. No application code runs, at the price of a real dependency and of
156
157
  guessing wrong on anything not written as a plain object literal.
157
158
 
158
- Three smaller calls come with either route. The chrome belongs to no page, so
159
- an action there can only be required of every page or forbidden. A page with
160
- no requests file makes any action on it an error. And the check sees markup
161
- only, so it is sound only if `lb-action` is authored and never assigned by
162
- script — no widget assigns it today, and the rule has never been written
163
- down.
159
+ Two smaller calls come with either route. The chrome belongs to no page, so
160
+ a request there can only be required of every page or forbidden. A page with
161
+ no requests file makes any request on it an error. The check is sound
162
+ because the developer writes `lb-*` attributes in markup and script never
163
+ assigns them.
164
164
 
165
- This reverses the position stated above `walkBinding`, that markup and server
166
- are separate artifacts and the comparison belongs to `createHub`. The same
167
- machinery would then also let `lb-list` and `lb-row` names be checked against
165
+ The same machinery would then also let `lb-query` names be checked against
168
166
  the declared queries.
169
167
 
170
- One piece is separable and needs none of the above: an `lb-action` beginning
171
- with `lb-` that names none of the three operations is a typo the builder can
172
- refuse from markup alone. `LB_ACTIONS` in `core/lb-constants.ts` exists for
173
- this, and the builder does not yet import it.
174
-
175
168
  ### A language server
176
169
 
177
170
  ...for Loadbare HTML.
@@ -0,0 +1,57 @@
1
+ # Terms of art
2
+
3
+ This document uses these terms exactly as their specs define them.
4
+
5
+ DOM:
6
+ - element: a node with a name and attributes
7
+ - attribute: a name-value pair on an element
8
+ - attribute value: the string an attribute holds
9
+ - ancestor: a parent, or a parent's ancestor
10
+ - descendant: a child, or a child's descendant
11
+ - content: the child nodes of an element
12
+ - text content: the data of all descendant text nodes
13
+ - clone: a copy of a node and descendants
14
+ - event: an object dispatched to signal an occurrence
15
+ - bubbles: the event also dispatches to each ancestor
16
+ - abort: stop an operation through its AbortSignal
17
+
18
+ HTML:
19
+ - control: an `<input>`, `<select>` or `<textarea>`, or a form-associated
20
+ custom element with a `value` property that fires `change`
21
+ - control value: the current value of a control
22
+ - custom element: an element defined by `customElements.define`
23
+ - form-associated custom element: a custom element declaring
24
+ `static formAssociated = true`
25
+ - `<template>`: an element holding inert content for cloning
26
+ - `<title>`: the element holding a document's title
27
+ - document title: the title the tab and session history show
28
+ - click: the event an element's activation fires
29
+ - submit: the event a form's submission fires
30
+ - submitter: the submit button that submitted a form
31
+ - change: the event a committed control edit fires
32
+ - reset: restore a form's controls to defaults
33
+ - form owner: the form a control is associated with
34
+ - `form` attribute: names a form owner by id, from anywhere
35
+ - `href`: the attribute holding a link's URL
36
+ - history entry: one entry in the session history
37
+ - push: add a session history entry
38
+ - replace: change the current session history entry
39
+
40
+ URL:
41
+ - path: the slash-separated segments after the host
42
+ - query parm: a name-value pair in the URL's query
43
+
44
+ HTTP:
45
+ - request: the message a client sends a server
46
+ - response: the message a server returns for a request
47
+
48
+ JSON:
49
+ - object: zero or more members between braces
50
+ - member: one name-value pair of an object
51
+ - array: an ordered sequence of values
52
+ - null, true, false: literal values
53
+
54
+ SQL:
55
+ - row: one record of a result set
56
+ - column: a named field of every row
57
+ - key: a column whose value identifies one row