@loadbare/app 0.19.0 → 0.19.1

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.
@@ -12,7 +12,7 @@
12
12
 
13
13
  This document states how `@loadbare/app` differs from the frameworks and
14
14
  libraries most used for front-end development today. It repeats material
15
- from [Theory](./theory.md), [TECHREF-1.0](./TECHREF-1.0.md) and
15
+ from [Theory](./theory.md), the [Reference](./reference/overview.md) and
16
16
  [Prior art](./prior-art.md) so that it can be read on its own. Where this document and
17
17
  [Theory](./theory.md) disagree, Theory is authoritative.
18
18
 
@@ -21,9 +21,8 @@ goals and the one decision that serves them. Two are deliberate departures
21
21
  from HTML's own model, in navigation and on the wire, and are set out in
22
22
  [Departures](./departures.md).
23
23
 
24
- Loadbare/app has not reached 1.0. Five sections of
25
- [TECHREF-1.0](./TECHREF-1.0.md) are marked `UNEDITED`. Anything below that describes Loadbare/app describes the
26
- code as it stands.
24
+ Loadbare/app has not reached 1.0. Anything below that describes
25
+ Loadbare/app describes the code as it stands.
27
26
 
28
27
  ## Contents
29
28
 
@@ -974,7 +973,8 @@ performance measurements are published as of this writing.
974
973
 
975
974
  ## Surface area
976
975
 
977
- TECHREF-1.0 lists every name Loadbare/app owns in one cross-reference.
976
+ [Names](./reference/names.md) lists every name Loadbare/app owns in one
977
+ cross-reference.
978
978
 
979
979
  | Owned | Count | Names |
980
980
  | ------------------------------------ | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -1131,7 +1131,8 @@ should not mistake one for the other.
1131
1131
 
1132
1132
  ### Gaps and open items
1133
1133
 
1134
- Each is current behavior or an open item named in TECHREF-1.0 or the
1134
+ Each is current behavior or an open item named in the
1135
+ [Reference](./reference/overview.md) or the
1135
1136
  [Roadmap](./roadmap.md).
1136
1137
 
1137
1138
  | Area | Status |
package/docs/opinions.md CHANGED
@@ -103,7 +103,7 @@ same view.
103
103
  REST names resources in the path, and many applications keep view
104
104
  state on the server or in the browser's memory. In Loadbare/app,
105
105
  every link and every query parm follows this rule. See
106
- [What a URL names](./TECHREF-1.0.md#what-a-url-names).
106
+ [Query parms](./reference/chrome.md#query-parms).
107
107
 
108
108
  ## Framework state is a row
109
109
 
@@ -147,7 +147,7 @@ user can break is answered by a refusal from the server.
147
147
  A widget, what other frameworks call a component, is a custom element.
148
148
  There is no component model of Loadbare/app's own. A widget talks to
149
149
  the hub through the attributes, events, and methods described in
150
- [Custom elements](./TECHREF-1.0.md#custom-elements).
150
+ [Custom Elements](./reference/custom-elements.md#code).
151
151
 
152
152
  Most frameworks define their own component model, with its own
153
153
  lifecycle and its own way of passing data. In Loadbare/app, every
@@ -44,11 +44,16 @@ The builder classifies by name, not location.
44
44
  | `*.queries.ts` | A page's queries, matched by base name |
45
45
  | `imports.ts` | The packages this app takes widgets from |
46
46
  | `*.css` | A stylesheet — see [CSS](./css.md) |
47
- | Any other `.html` | A widget definition, named for the tag it defines |
47
+ | `<tag-name>.html` | A widget definition, named for the tag it defines |
48
48
  | `<tag>.browser.ts` | A widget script, named for the tag it registers |
49
49
 
50
50
  Give the application exactly one `chrome.html` and at most one `imports.ts`.
51
- Give every `.requests.ts` and `.queries.ts` a `.page.html` of the same base name.
51
+ Give every `.requests.ts` and `.queries.ts` a `.page.html` of the same base name;
52
+ one with no page is a build error.
53
+
54
+ A widget definition is exactly `<kebab-case-name>.html`. Any other `.html`
55
+ file is an error when it looks like a definition with capitals in its name,
56
+ and is skipped otherwise.
52
57
 
53
58
  Name a widget script `<tag>.browser.ts`, not `<tag>.ts`. Only a file whose
54
59
  name carries `.browser` is bundled for the browser; every other module under
@@ -141,6 +146,10 @@ does when the server starts, so a module that connects to a database at
141
146
  import connects during the build too; open connections in `contextFor`
142
147
  instead.
143
148
 
149
+ It also writes `client-entry.ts`, the generated entry `client.js` is bundled
150
+ from, and leaves it there. Nothing reads it after the bundle, and an
151
+ application neither writes nor imports it.
152
+
144
153
  The builder writes `app.css` only when it finds a stylesheet, and `pages.ts`
145
154
  only when some page has a `.requests.ts` or a `.queries.ts` file. Import `hub`
146
155
  from `pages.ts` — see [The Express Server](./server.md) for the rest of the
@@ -103,6 +103,12 @@ server's row lands, so a chrome shows where the page is with no code:
103
103
  | `lb-page-unknown` | `true` when no page's stub matches the path |
104
104
  | Any other name | The query parm of that name, or empty when it is absent |
105
105
 
106
+ The path names a page, never a resource: `/accounts/42` is not a way to
107
+ reach account 42, and an application designs no endpoints. The query string
108
+ describes what that page has on screen, `/accounts?acct=23`, and never
109
+ commands. The server remembers nothing about the view, so a URL reloads,
110
+ bookmarks and mails as the same view.
111
+
106
112
  A path names a page by its stub: `/members` shows `members.page.html`, and
107
113
  `/` shows `index.page.html`. A page's title is the text of the `<title>` its
108
114
  page file carries; see [page files](./page-files.md#the-page-title). The hub
@@ -139,11 +145,17 @@ Write `lb-url-link` on an `<a>` to move between pages:
139
145
  </nav>
140
146
  ```
141
147
 
142
- On a plain primary click, the hub pushes a history entry for the `href`,
143
- path and query string both, and shows the page it names. A click with a
144
- modifier key or another button, and a link without `lb-url-link`, behave as
145
- the browser has them behave. Back and Forward show the page at the URL they
146
- arrive at.
148
+ On a plain primary click, the first button with no modifier key and not
149
+ already handled, the hub pushes a history entry for the `href`, path and
150
+ query string both, and shows the page it names. Any other click, and a link
151
+ without `lb-url-link`, behave as the browser has them behave, so leaving the
152
+ application is the default and staying in it is the opt-in. The attribute
153
+ takes no value. Back and Forward show the page at the URL they arrive at.
154
+
155
+ Path space is flat: `/members` shows `members.page.html` wherever under
156
+ `--src` it sits. The query string is kept, so
157
+ `/transactions?date_begin=2026-09-01` opens the page narrowed to those
158
+ dates.
147
159
 
148
160
  ### Query parms
149
161
 
@@ -170,11 +182,28 @@ pushes one instead when the element carrying `lb-request` also carries
170
182
 
171
183
  The hub answers the request itself, with no round trip, then reloads the
172
184
  page's queries at the new URL. The page stays in place, and rows that come
173
- back keep their place.
185
+ back keep their place. A request that leaves the URL as it was does
186
+ nothing. `lb-page-label` and `lb-page-unknown` are the hub's, and a request
187
+ never sets them.
188
+
189
+ A request that gives `lb-path` a new value enters that page, pushes a
190
+ history entry, and the new URL carries only the query parms the request
191
+ names.
174
192
 
175
193
  A control whose column the URL does not carry lands empty, so every control
176
194
  inside `lb-query="lb-url"` shows what the address bar says, after a reload
177
- and after Back alike.
195
+ and after Back alike
196
+ ([miswart](../miswarts.md#lb-url-lands-every-parm-it-names)).
197
+
198
+ Loadbare assigns no parm a meaning, and a column of `lb-url` whose name
199
+ begins with `lb-` is never a query parm.
200
+
201
+ A query parm is user input. A query still takes no argument from the
202
+ browser, and a parm arrives the way the session cookie does, as part of the
203
+ request the context is built from, but a user who types `?acct=99999`
204
+ influences what a query returns. Validate it where the application reads
205
+ it; a per-session database role means an id outside the caller's reach
206
+ finds nothing.
178
207
 
179
208
  An order or a filter the hub applies to rows the page already holds is not
180
209
  a query parm. It is a [choice](./data-binding.md#choices), which holds until
@@ -198,8 +227,13 @@ show the path:
198
227
  ```
199
228
 
200
229
  When no page's stub matches the path, `lb-page-unknown` is `true`,
201
- `lb-page-label` is null, `<main>` keeps the page it had, and the hub calls
202
- `showModal()` on the dialog.
230
+ `lb-page-label` is null, `<main>` keeps the page it had, the hub calls
231
+ `showModal()` on the dialog, and reports the path to the console. A chrome
232
+ with no dialog shows nothing. `lb-url` lands before the page is looked up,
233
+ so the dialog shows the path by naming it like any other element.
234
+
235
+ Every route gets the same document, so an unknown path is found out in the
236
+ browser after a successful 200, and there is no server-delivered 404.
203
237
 
204
238
  `@loadbare/widgets` ships this dialog as `<lb-unknown-page>`, for a chrome
205
239
  that would rather write one tag; see
@@ -41,7 +41,6 @@ Serve it at `/app.css` and link it from the chrome:
41
41
  See [`chrome.html`](./chrome.md) for the link, [The Express
42
42
  server](./server.md) for the route, and
43
43
  [`loadbare-app-build`](./builder.md#running-the-builder) for `--minify`.
44
- </content>
45
44
 
46
45
  ## Selecting what the hub stamps
47
46
 
@@ -250,30 +250,8 @@ takes part in data binding in one of four ways: it is a control, it renders
250
250
  a value, it sends a request, or it holds rows.
251
251
 
252
252
  Import every Loadbare name from `@loadbare/app/constants`, and never write
253
- one as a string literal:
254
-
255
- | Constant | Value |
256
- |------------------------|----------------------|
257
- | `ATTR_QUERY` | `lb-query` |
258
- | `ATTR_COLUMN` | `lb-column` |
259
- | `ATTR_SHOW` | `lb-show` |
260
- | `ATTR_REQUEST` | `lb-request` |
261
- | `ATTR_COLUMN_VALUE` | `lb-column-value` |
262
- | `ATTR_KEY_VALUE` | `lb-key-value` |
263
- | `ATTR_ROW_LIVE` | `lb-row-live` |
264
- | `LIVE_ROW` | `[lb-row-live]` |
265
- | `ATTR_QUERY_ROW_COUNT` | `lb-query-row-count` |
266
- | `ATTR_REQUEST_PENDING` | `lb-request-pending` |
267
- | `ATTR_REQUEST_ERROR` | `lb-request-error` |
268
- | `REQUEST_ROW_INSERT`, `REQUEST_ROW_UPDATE`, `REQUEST_ROW_DELETE` | The requests Loadbare provides |
269
- | `LB_ROW_REQUESTS` | All three, in one array |
270
- | `LB_EVENT_NAME` | `lb-request`, the event every request travels as |
271
- | `LB_DONE_EVENT_NAME` | `lb-request-done`, the event that says how it turned out |
272
- | `SHOW_NOT` | `!`, written before a column in `lb-show` |
273
- | `URL_QUERY` | `lb-url` |
274
- | `CHOICES_QUERY` | `lb-choices` |
275
- | `URL_COLUMN_PATH`, `URL_COLUMN_PAGE_LABEL`, `URL_COLUMN_PAGE_UNKNOWN` | `lb-path`, `lb-page-label`, `lb-page-unknown` |
276
- | `LB_RESERVED_PREFIX` | `lb-` |
253
+ one as a string literal: `ATTR_COLUMN_VALUE` rather than `"lb-column-value"`.
254
+ [Constants](./names.md#constants) lists them all.
277
255
 
278
256
  A custom element reads `lb-` attributes and never assigns one. The developer
279
257
  writes them in markup, and the hub and the builder write their stamps.