@lo-tek/interfaces 0.40.0 → 0.41.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.
- package/CHANGELOG.md +78 -0
- package/agent/astro.md +9 -7
- package/agent/bundles.md +8 -6
- package/agent/datastar.md +53 -51
- package/agent/html.md +55 -53
- package/agent/kotlin.md +622 -0
- package/agent/react.md +8 -6
- package/agent/templates.md +60 -63
- package/core/lotek-core.wasm +0 -0
- package/core/lotek.wasm +0 -0
- package/dist/components/css/steps/steps.d.ts +23 -0
- package/dist/components/css/steps/steps.d.ts.map +1 -0
- package/dist/components/css/steps/steps.js +21 -0
- package/dist/components/css/steps/steps.js.map +1 -0
- package/dist/components/events.d.ts +3 -1
- package/dist/components/events.d.ts.map +1 -1
- package/dist/components/frame/error-summary/lt-error-summary.js +1 -1
- package/dist/components/frame/popover/lt-popover.d.ts.map +1 -1
- package/dist/components/frame/popover/lt-popover.js +4 -19
- package/dist/components/frame/popover/lt-popover.js.map +1 -1
- package/dist/components/frame/term/lt-term.d.ts +114 -0
- package/dist/components/frame/term/lt-term.d.ts.map +1 -0
- package/dist/components/frame/term/lt-term.js +530 -0
- package/dist/components/frame/term/lt-term.js.map +1 -0
- package/dist/components/frame/term/term.d.ts +55 -0
- package/dist/components/frame/term/term.d.ts.map +1 -0
- package/dist/components/frame/term/term.js +55 -0
- package/dist/components/frame/term/term.js.map +1 -0
- package/dist/components/host-element.d.ts +19 -0
- package/dist/components/host-element.d.ts.map +1 -1
- package/dist/components/host-element.js +37 -0
- package/dist/components/host-element.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/jsx/react.d.ts +3 -1
- package/dist/jsx/react.d.ts.map +1 -1
- package/dist/lotek.css +351 -1
- package/dist/lt.d.ts +8 -1
- package/dist/lt.d.ts.map +1 -1
- package/dist/lt.js +9 -1
- package/dist/lt.js.map +1 -1
- package/dist/react.d.ts +19 -0
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +14 -0
- package/dist/react.js.map +1 -1
- package/dist/register.d.ts.map +1 -1
- package/dist/register.js +2 -0
- package/dist/register.js.map +1 -1
- package/dist/vocabulary/classes.d.ts.map +1 -1
- package/dist/vocabulary/classes.js +60 -6
- package/dist/vocabulary/classes.js.map +1 -1
- package/dist/vocabulary/elements.d.ts.map +1 -1
- package/dist/vocabulary/elements.js +15 -2
- package/dist/vocabulary/elements.js.map +1 -1
- package/dist/vocabulary/types.d.ts +8 -3
- package/dist/vocabulary/types.d.ts.map +1 -1
- package/live-templates-kotlin.xml +15 -10
- package/live-templates.xml +12 -6
- package/manifest/files.json +18 -0
- package/manifest/manifest.json +145 -10
- package/package.json +15 -5
- package/src/components/css/steps/steps.css +240 -0
- package/src/components/css/steps/steps.ts +26 -0
- package/src/components/events.ts +3 -1
- package/src/components/frame/error-summary/lt-error-summary.ts +1 -1
- package/src/components/frame/popover/lt-popover.ts +4 -24
- package/src/components/frame/term/lt-term.ts +573 -0
- package/src/components/frame/term/term.css +177 -0
- package/src/components/frame/term/term.ts +87 -0
- package/src/components/host-element.ts +46 -0
- package/src/index.ts +4 -0
- package/src/jsx/react.ts +4 -0
- package/src/lt.ts +9 -1
- package/src/react.ts +15 -0
- package/src/register.ts +2 -0
- package/src/tokens/tokens.css +4 -0
- package/src/vocabulary/classes.ts +60 -6
- package/src/vocabulary/elements.ts +15 -2
- package/src/vocabulary/types.ts +8 -3
- package/web-types.json +31 -10
package/CHANGELOG.md
CHANGED
|
@@ -24,6 +24,84 @@ including 0.36.0 were written in Norwegian, and list them under "Brytende".
|
|
|
24
24
|
|
|
25
25
|
## Unreleased
|
|
26
26
|
|
|
27
|
+
## 0.41.0 (2026-11-05)
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- **A rulebook for coding agents on a Kotlin or Java server, `agent/kotlin.md`.**
|
|
32
|
+
It covers `Lt` with a table of every enum and its constants, kotlinx.html
|
|
33
|
+
and strings, the WebJar and `LotekWebJar`, ids from a key in the data,
|
|
34
|
+
`assertLotek` in tests, the Gradle plugin and `lotek.jar`. `llms.txt`
|
|
35
|
+
names Kotlin and the check without Node.
|
|
36
|
+
- **`<lt-term>` and `lt.term()`: a word in the text that shows its entry
|
|
37
|
+
from a glossary on the same page.** The word is a link to the entry, a
|
|
38
|
+
`<div>` with a `<dt>` and a `<dd>` in a `<dl>`, and stays one without
|
|
39
|
+
JavaScript. The web component shows the entry itself as a card by the
|
|
40
|
+
word, in the top layer: the mouse opens it after a rest, a click, a tap or
|
|
41
|
+
Enter pins it, and Escape, a click outside or the word scrolling out of
|
|
42
|
+
view closes it. Below the `sm` breakpoint the card is a sheet across the
|
|
43
|
+
bottom of the window, or the top when the word is down there. Nothing is
|
|
44
|
+
copied and no id is made in the browser, so the card survives an update
|
|
45
|
+
from the server. `lt.term({ id })` writes `href` and `aria-details` on the
|
|
46
|
+
link, the classes `lt-term` and `lt-term__entry`, and the id; `/react`
|
|
47
|
+
adds `aria-expanded="false"`. `Lt.term()` in Kotlin, and `ltTerm` and
|
|
48
|
+
`ltTermEntry` in kotlinx.html. New entry points `./term` and
|
|
49
|
+
`./term.css`, new component variables `--lt-term-width`,
|
|
50
|
+
`--lt-term-gap`, `--lt-term-padding`, `--lt-term-radius`,
|
|
51
|
+
`--lt-term-accent-color`, `--lt-term-underline-color`,
|
|
52
|
+
`--lt-term-label-text`, `--lt-term-label-font` and
|
|
53
|
+
`--lt-term-sheet-height`, and the default text "Glossary".
|
|
54
|
+
- **`lt-steps` and `lt.steps()`: a step indicator for a task over several
|
|
55
|
+
pages.** The class goes on an `<ol>` with one `<li>` per step, and
|
|
56
|
+
`aria-current="step"` on the step the user is on. The steps before it are
|
|
57
|
+
drawn as done, with a check the screen reader reads as "Completed", as part
|
|
58
|
+
of the step's link when it has one. Below `28rem` of the list's own width
|
|
59
|
+
the steps stand in a column. `Lt.steps()` in Kotlin. New entry points
|
|
60
|
+
`./steps` and `./steps.css`, new component variables
|
|
61
|
+
`--lt-steps-marker-size`, `--lt-steps-done-icon` and
|
|
62
|
+
`--lt-steps-done-text`, and the default text
|
|
63
|
+
"Completed ".
|
|
64
|
+
- **The check reports `untranslated-text` for the step indicator's
|
|
65
|
+
"Completed "** on a page in another language, as for the other texts in
|
|
66
|
+
the stylesheets. In the manifest's `texts` on a class,
|
|
67
|
+
`siblingsBefore: true` is a text shown on the children before the one with
|
|
68
|
+
the attribute, and the Kotlin `CssText` has `siblingsBefore`. The term's
|
|
69
|
+
"Glossary" is not checked, since the card shows it only while it is open.
|
|
70
|
+
- **The check reports `term-without-entry`** on a whole page, when a word
|
|
71
|
+
in `<lt-term>` points at an id the page does not have, or at something
|
|
72
|
+
that is not a glossary entry.
|
|
73
|
+
- **`place()` in `@lo-tek/interfaces/host-element`**, the placement
|
|
74
|
+
`<lt-popover>` worked out, now shared with `<lt-term>`.
|
|
75
|
+
|
|
76
|
+
### Changed
|
|
77
|
+
|
|
78
|
+
- **`lotek agent` gives the Kotlin rulebook in a folder with
|
|
79
|
+
`build.gradle.kts`, `build.gradle`, `settings.gradle.kts`,
|
|
80
|
+
`settings.gradle` or `pom.xml`,** unless `package.json` names a framework
|
|
81
|
+
other than Vite. Such a folder used to get `templates`, or `bundles` when it
|
|
82
|
+
also had a `package.json`. `--framework=templates` and
|
|
83
|
+
`--framework=bundles` still give those.
|
|
84
|
+
|
|
85
|
+
### Fixed
|
|
86
|
+
|
|
87
|
+
- **The snippets and the live templates follow the corrected recipes.** In
|
|
88
|
+
the HTML snippets and live templates the error summary and the field post
|
|
89
|
+
to the server, the popover's actions are forms that post, and the session
|
|
90
|
+
timeout logs out with a post. In the Kotlin live templates the error
|
|
91
|
+
summary has no script, and it and the field take what was typed; the
|
|
92
|
+
popover, the tabs and the suggestion have no script; the dialog's Cancel
|
|
93
|
+
and the session timeout's Log out post to the server; and the toast tells
|
|
94
|
+
a refused restart from one that got no answer, and a redirect from a
|
|
95
|
+
restart. The switch saves only an answer that is not a redirect, and
|
|
96
|
+
stands in a `<form autocomplete="off">`, since HTML does not allow the
|
|
97
|
+
attribute on a checkbox. The Kotlin live template for the error summary
|
|
98
|
+
inserted the browser validation from the HTML recipe, which a Kotlin
|
|
99
|
+
server does itself.
|
|
100
|
+
- **The editor descriptions of `session-logout` and `<lt-dialog>`.**
|
|
101
|
+
`session-logout` comes only from a Log out button that closes the dialog;
|
|
102
|
+
one with `formmethod="post"` submits instead. `<lt-dialog>` makes a dialog
|
|
103
|
+
the server sends open a real modal.
|
|
104
|
+
|
|
27
105
|
## 0.40.0 (2026-11-03)
|
|
28
106
|
|
|
29
107
|
### Breaking
|
package/agent/astro.md
CHANGED
|
@@ -9,7 +9,7 @@ this runs at build time: out comes plain HTML, and `lt` is gone once the page
|
|
|
9
9
|
is built. The only JavaScript the browser gets from the package is the
|
|
10
10
|
registration of the web components you use, in a `<script>`.
|
|
11
11
|
|
|
12
|
-
This is @lo-tek/interfaces 0.
|
|
12
|
+
This is @lo-tek/interfaces 0.41.0. The file is generated by the package and
|
|
13
13
|
follows its version, so it can never say anything other than the code next to
|
|
14
14
|
it.
|
|
15
15
|
|
|
@@ -59,7 +59,7 @@ component, `tokens.css` belongs there, once for the whole page.
|
|
|
59
59
|
|
|
60
60
|
## 2. What exists
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
36 CSS components and 10 web components, and this is the whole list. The
|
|
63
63
|
classes are `lt-` + kebab-case. Variants are always `data-*` attributes, never
|
|
64
64
|
classes of their own: `data-variant="secondary"`, not `lt-button--secondary`.
|
|
65
65
|
The default variant has no attribute.
|
|
@@ -97,6 +97,7 @@ The default variant has no attribute.
|
|
|
97
97
|
| `lt-skip-link` | `@lo-tek/interfaces/skip-link.css` | none |
|
|
98
98
|
| `lt-spinner` | `@lo-tek/interfaces/spinner.css` | `data-size`: small, large |
|
|
99
99
|
| `lt-sr-only` | `@lo-tek/interfaces/sr-only.css` | none |
|
|
100
|
+
| `lt-steps` | `@lo-tek/interfaces/steps.css` | none |
|
|
100
101
|
| `lt-switch`<br>`lt-switch-row` | `@lo-tek/interfaces/switch.css` | none |
|
|
101
102
|
| `lt-table`<br>`lt-table__sort`<br>`lt-table-scroll` | `@lo-tek/interfaces/table.css` | `data-variant`: striped<br>`data-hoverable` (flag) |
|
|
102
103
|
| `lt-tag` | `@lo-tek/interfaces/tag.css` | `data-variant`: filled<br>`data-selectable` (flag) |
|
|
@@ -279,6 +280,7 @@ Three rules apply to all of them:
|
|
|
279
280
|
| `<lt-tabs>` | frame | `@lo-tek/interfaces/tabs.css` | `defineLtTabs()` from `@lo-tek/interfaces/tabs` | `server-controlled` (flag)<br>`activation`: manual, automatic | `tab-select` (index) | `lt-tabs__list`<br>`lt-tabs__panel` |
|
|
280
281
|
| `<lt-error-summary>` | frame | `@lo-tek/interfaces/error-summary.css` | `defineLtErrorSummary()` from `@lo-tek/interfaces/error-summary` | `data-autofocus`: false, true<br>`hidden` (flag) | none | `lt-error-summary`<br>`lt-error-summary__title` |
|
|
281
282
|
| `<lt-popover>` | frame | `@lo-tek/interfaces/popover.css` | `defineLtPopover()` from `@lo-tek/interfaces/popover` | `open` (flag)<br>`placement`: bottom-start, bottom-end, top-start, top-end<br>`server-controlled` (flag) | `popover-toggle` (open) | `lt-popover` |
|
|
283
|
+
| `<lt-term>` | frame | `@lo-tek/interfaces/term.css` | `defineLtTerm()` from `@lo-tek/interfaces/term` | none | none | `lt-term`<br>`lt-term__entry` |
|
|
282
284
|
| `<lt-suggestion>` | frame | `@lo-tek/interfaces/suggestion.css` | `defineLtSuggestion()` from `@lo-tek/interfaces/suggestion` | `prefiltered` (flag)<br>`count-none` (text)<br>`count-zero` (text)<br>`count-one` (text)<br>`count-two` (text)<br>`count-few` (text)<br>`count-many` (text)<br>`count-other` (text)<br>`server-controlled` (flag) | `suggestion-select` (value, label) | `lt-suggestion__list`<br>`lt-suggestion__option`<br>`lt-suggestion__value`<br>`lt-suggestion__empty` |
|
|
283
285
|
| `<lt-dialog>` | frame | `@lo-tek/interfaces/dialog.css` | `defineLtDialog()` from `@lo-tek/interfaces/dialog` | `open` (flag)<br>`server-controlled` (flag) | `dialog-toggle` (open, returnValue) | `lt-dialog` (`data-color`: brand, info, success, warning, danger)<br>`lt-dialog__body`<br>`lt-dialog__title`<br>`lt-dialog__footer`<br>`lt-dialog__header`<br>`lt-dialog__subtitle` |
|
|
284
286
|
| `<lt-toast>` | standalone | `@lo-tek/interfaces/toast.css` | `defineLtToast()` from `@lo-tek/interfaces/toast` | `duration` (number)<br>`label` (text)<br>`close-label` (text) | `toast-dismiss` | `lt-toast`<br>`lt-toast__message`<br>`lt-toast__close` |
|
|
@@ -309,7 +311,7 @@ Runs at build time. Out comes plain HTML:
|
|
|
309
311
|
<span class="lt-badge" data-color="success">Approved</span>
|
|
310
312
|
```
|
|
311
313
|
|
|
312
|
-
`lt` is imported from the main entry, which gives `class` and `for`. The
|
|
314
|
+
`lt` is imported from the main entry, which gives `class` and `for`. The 48
|
|
313
315
|
builder functions:
|
|
314
316
|
|
|
315
317
|
`lt.accordion()`, `lt.alert()`, `lt.avatar()`, `lt.badge()`,
|
|
@@ -320,9 +322,9 @@ builder functions:
|
|
|
320
322
|
`lt.legend()`, `lt.link()`, `lt.list()`, `lt.pagination()`, `lt.paragraph()`,
|
|
321
323
|
`lt.popover()`, `lt.progress()`, `lt.radio()`, `lt.search()`, `lt.select()`,
|
|
322
324
|
`lt.sessionTimeout()`, `lt.skeleton()`, `lt.skipLink()`, `lt.spinner()`,
|
|
323
|
-
`lt.srOnly()`, `lt.suggestion()`, `lt.switch()`, `lt.table()`,
|
|
324
|
-
`lt.tableSort()`, `lt.tabs()`, `lt.tag()`, `lt.
|
|
325
|
-
`lt.toggleGroup()`, `lt.tooltip()`
|
|
325
|
+
`lt.srOnly()`, `lt.steps()`, `lt.suggestion()`, `lt.switch()`, `lt.table()`,
|
|
326
|
+
`lt.tableSort()`, `lt.tabs()`, `lt.tag()`, `lt.term()`, `lt.textarea()`,
|
|
327
|
+
`lt.toast()`, `lt.toggleGroup()`, `lt.tooltip()`
|
|
326
328
|
|
|
327
329
|
## 6. Fields without JavaScript
|
|
328
330
|
|
|
@@ -341,7 +343,7 @@ const fixer = lt.field({ id: "fixer", required: "symbol", help: true, error: tru
|
|
|
341
343
|
<label {...fixer.label}>Fixer's address</label>
|
|
342
344
|
<input {...lt.input({ type: "email" })} {...fixer.control} name="fixer" required />
|
|
343
345
|
<p {...lt.helpText()} {...fixer.help}>The board writes to the fixer, never to the crew.</p>
|
|
344
|
-
<p {...lt.errorText()} {...fixer.error}>Enter
|
|
346
|
+
<p {...lt.errorText()} {...fixer.error}>Enter the fixer's address, for example fixer@relay.example.</p>
|
|
345
347
|
```
|
|
346
348
|
|
|
347
349
|
No `<lt-field>`, no runtime.
|
package/agent/bundles.md
CHANGED
|
@@ -10,7 +10,7 @@ names, and `defineLt*()` runs at the top of `main.ts`. If you write React, the
|
|
|
10
10
|
attribute names differ and `react.md` applies instead. If you write Astro, the
|
|
11
11
|
stylesheets are imported in the frontmatter and `astro.md` applies.
|
|
12
12
|
|
|
13
|
-
This is @lo-tek/interfaces 0.
|
|
13
|
+
This is @lo-tek/interfaces 0.41.0. The file is generated by the package and
|
|
14
14
|
follows its version, so it can never say anything other than the code next to
|
|
15
15
|
it.
|
|
16
16
|
|
|
@@ -63,7 +63,7 @@ page does not use.
|
|
|
63
63
|
|
|
64
64
|
## 2. What exists
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
36 CSS components and 10 web components, and this is the whole list. The
|
|
67
67
|
classes are `lt-` + kebab-case. Variants are always `data-*` attributes, never
|
|
68
68
|
classes of their own: `data-variant="secondary"`, not `lt-button--secondary`.
|
|
69
69
|
The default variant has no attribute.
|
|
@@ -101,6 +101,7 @@ The default variant has no attribute.
|
|
|
101
101
|
| `lt-skip-link` | `@lo-tek/interfaces/skip-link.css` | none |
|
|
102
102
|
| `lt-spinner` | `@lo-tek/interfaces/spinner.css` | `data-size`: small, large |
|
|
103
103
|
| `lt-sr-only` | `@lo-tek/interfaces/sr-only.css` | none |
|
|
104
|
+
| `lt-steps` | `@lo-tek/interfaces/steps.css` | none |
|
|
104
105
|
| `lt-switch`<br>`lt-switch-row` | `@lo-tek/interfaces/switch.css` | none |
|
|
105
106
|
| `lt-table`<br>`lt-table__sort`<br>`lt-table-scroll` | `@lo-tek/interfaces/table.css` | `data-variant`: striped<br>`data-hoverable` (flag) |
|
|
106
107
|
| `lt-tag` | `@lo-tek/interfaces/tag.css` | `data-variant`: filled<br>`data-selectable` (flag) |
|
|
@@ -283,6 +284,7 @@ Three rules apply to all of them:
|
|
|
283
284
|
| `<lt-tabs>` | frame | `@lo-tek/interfaces/tabs.css` | `defineLtTabs()` from `@lo-tek/interfaces/tabs` | `server-controlled` (flag)<br>`activation`: manual, automatic | `tab-select` (index) | `lt-tabs__list`<br>`lt-tabs__panel` |
|
|
284
285
|
| `<lt-error-summary>` | frame | `@lo-tek/interfaces/error-summary.css` | `defineLtErrorSummary()` from `@lo-tek/interfaces/error-summary` | `data-autofocus`: false, true<br>`hidden` (flag) | none | `lt-error-summary`<br>`lt-error-summary__title` |
|
|
285
286
|
| `<lt-popover>` | frame | `@lo-tek/interfaces/popover.css` | `defineLtPopover()` from `@lo-tek/interfaces/popover` | `open` (flag)<br>`placement`: bottom-start, bottom-end, top-start, top-end<br>`server-controlled` (flag) | `popover-toggle` (open) | `lt-popover` |
|
|
287
|
+
| `<lt-term>` | frame | `@lo-tek/interfaces/term.css` | `defineLtTerm()` from `@lo-tek/interfaces/term` | none | none | `lt-term`<br>`lt-term__entry` |
|
|
286
288
|
| `<lt-suggestion>` | frame | `@lo-tek/interfaces/suggestion.css` | `defineLtSuggestion()` from `@lo-tek/interfaces/suggestion` | `prefiltered` (flag)<br>`count-none` (text)<br>`count-zero` (text)<br>`count-one` (text)<br>`count-two` (text)<br>`count-few` (text)<br>`count-many` (text)<br>`count-other` (text)<br>`server-controlled` (flag) | `suggestion-select` (value, label) | `lt-suggestion__list`<br>`lt-suggestion__option`<br>`lt-suggestion__value`<br>`lt-suggestion__empty` |
|
|
287
289
|
| `<lt-dialog>` | frame | `@lo-tek/interfaces/dialog.css` | `defineLtDialog()` from `@lo-tek/interfaces/dialog` | `open` (flag)<br>`server-controlled` (flag) | `dialog-toggle` (open, returnValue) | `lt-dialog` (`data-color`: brand, info, success, warning, danger)<br>`lt-dialog__body`<br>`lt-dialog__title`<br>`lt-dialog__footer`<br>`lt-dialog__header`<br>`lt-dialog__subtitle` |
|
|
288
290
|
| `<lt-toast>` | standalone | `@lo-tek/interfaces/toast.css` | `defineLtToast()` from `@lo-tek/interfaces/toast` | `duration` (number)<br>`label` (text)<br>`close-label` (text) | `toast-dismiss` | `lt-toast`<br>`lt-toast__message`<br>`lt-toast__close` |
|
|
@@ -339,7 +341,7 @@ lt.button({ variant: "secondary" })
|
|
|
339
341
|
|
|
340
342
|
The builder functions return an object with HTML attribute names, which is
|
|
341
343
|
spread in where the template language supports spreading, or read out field by
|
|
342
|
-
field. The
|
|
344
|
+
field. The 48 builder functions:
|
|
343
345
|
|
|
344
346
|
`lt.accordion()`, `lt.alert()`, `lt.avatar()`, `lt.badge()`,
|
|
345
347
|
`lt.breadcrumbs()`, `lt.button()`, `lt.card()`, `lt.checkbox()`,
|
|
@@ -349,9 +351,9 @@ field. The 46 builder functions:
|
|
|
349
351
|
`lt.legend()`, `lt.link()`, `lt.list()`, `lt.pagination()`, `lt.paragraph()`,
|
|
350
352
|
`lt.popover()`, `lt.progress()`, `lt.radio()`, `lt.search()`, `lt.select()`,
|
|
351
353
|
`lt.sessionTimeout()`, `lt.skeleton()`, `lt.skipLink()`, `lt.spinner()`,
|
|
352
|
-
`lt.srOnly()`, `lt.suggestion()`, `lt.switch()`, `lt.table()`,
|
|
353
|
-
`lt.tableSort()`, `lt.tabs()`, `lt.tag()`, `lt.
|
|
354
|
-
`lt.toggleGroup()`, `lt.tooltip()`
|
|
354
|
+
`lt.srOnly()`, `lt.steps()`, `lt.suggestion()`, `lt.switch()`, `lt.table()`,
|
|
355
|
+
`lt.tableSort()`, `lt.tabs()`, `lt.tag()`, `lt.term()`, `lt.textarea()`,
|
|
356
|
+
`lt.toast()`, `lt.toggleGroup()`, `lt.tooltip()`
|
|
355
357
|
|
|
356
358
|
Where the template language cannot spread an object, `lt.setAttributes()` sets
|
|
357
359
|
the attributes on an element in plain DOM:
|
package/agent/datastar.md
CHANGED
|
@@ -8,7 +8,7 @@ That means two things for this file: the addresses are URLs, since a browser
|
|
|
8
8
|
without a bundler does not resolve a package name, and the state is controlled
|
|
9
9
|
with attributes, which is exactly what the `frame` components expect.
|
|
10
10
|
|
|
11
|
-
This is @lo-tek/interfaces 0.
|
|
11
|
+
This is @lo-tek/interfaces 0.41.0. The file is generated by the package and
|
|
12
12
|
follows its version, so it can never say anything other than the code next to
|
|
13
13
|
it.
|
|
14
14
|
|
|
@@ -39,21 +39,21 @@ it.
|
|
|
39
39
|
## 1. The stylesheet and Datastar
|
|
40
40
|
|
|
41
41
|
```html
|
|
42
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
42
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/dist/lotek.css">
|
|
43
43
|
<script
|
|
44
44
|
type="module"
|
|
45
45
|
src="https://cdn.jsdelivr.net/gh/starfederation/datastar@v1.0.4/bundles/datastar.js"
|
|
46
46
|
></script>
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
`lotek.css` is
|
|
49
|
+
`lotek.css` is 112 kB, 14 kB compressed, and has all the components. If you
|
|
50
50
|
want only what you use, `tokens.css` defines all the variables, and all the
|
|
51
51
|
other stylesheets build on it. It must be loaded, and comes first out of
|
|
52
52
|
habit: the order between it and the others does not matter.
|
|
53
53
|
|
|
54
54
|
## 2. What exists
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
36 CSS components and 10 web components, and this is the whole list. The
|
|
57
57
|
classes are `lt-` + kebab-case. Variants are always `data-*` attributes, never
|
|
58
58
|
classes of their own: `data-variant="secondary"`, not `lt-button--secondary`.
|
|
59
59
|
The default variant has no attribute.
|
|
@@ -62,41 +62,42 @@ The default variant has no attribute.
|
|
|
62
62
|
|
|
63
63
|
| Class | Stylesheet | Attributes |
|
|
64
64
|
| --- | --- | --- |
|
|
65
|
-
| `lt-accordion`<br>`lt-accordion__content` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
66
|
-
| `lt-alert`<br>`lt-alert__title` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
67
|
-
| `lt-avatar`<br>`lt-avatar-stack` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
68
|
-
| `lt-badge` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
69
|
-
| `lt-breadcrumbs` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
70
|
-
| `lt-button` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
71
|
-
| `lt-card`<br>`lt-card__title` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
72
|
-
| `lt-checkbox`<br>`lt-checkbox-row` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
73
|
-
| `lt-divider` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
74
|
-
| `lt-error-text` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
75
|
-
| `lt-fieldset`<br>`lt-legend` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
76
|
-
| `lt-file-upload`<br>`lt-file-upload-list` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
77
|
-
| `lt-heading` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
78
|
-
| `lt-help-text` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
79
|
-
| `lt-icon` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
80
|
-
| `lt-input` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
81
|
-
| `lt-label` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
82
|
-
| `lt-link` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
83
|
-
| `lt-list` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
84
|
-
| `lt-pagination`<br>`lt-pagination__gap` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
85
|
-
| `lt-paragraph` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
86
|
-
| `lt-progress` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
87
|
-
| `lt-radio`<br>`lt-radio-row` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
88
|
-
| `lt-search`<br>`lt-search-row` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
89
|
-
| `lt-select` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
90
|
-
| `lt-skeleton` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
91
|
-
| `lt-skip-link` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
92
|
-
| `lt-spinner` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
93
|
-
| `lt-sr-only` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
94
|
-
| `lt-
|
|
95
|
-
| `lt-
|
|
96
|
-
| `lt-
|
|
97
|
-
| `lt-
|
|
98
|
-
| `lt-
|
|
99
|
-
| `lt-
|
|
65
|
+
| `lt-accordion`<br>`lt-accordion__content` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/accordion/accordion.css` | `data-variant`: plain |
|
|
66
|
+
| `lt-alert`<br>`lt-alert__title` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/alert/alert.css` | `data-color`: info, success, warning, danger |
|
|
67
|
+
| `lt-avatar`<br>`lt-avatar-stack` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/avatar/avatar.css` | `data-variant`: square<br>`data-size`: small, large |
|
|
68
|
+
| `lt-badge` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/badge/badge.css` | `data-color`: success, warning, danger, neutral |
|
|
69
|
+
| `lt-breadcrumbs` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/breadcrumbs/breadcrumbs.css` | none |
|
|
70
|
+
| `lt-button` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/button/button.css` | `data-variant`: secondary, ghost, danger |
|
|
71
|
+
| `lt-card`<br>`lt-card__title` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/card/card.css` | `data-variant`: filled<br>`data-interactive` (flag) |
|
|
72
|
+
| `lt-checkbox`<br>`lt-checkbox-row` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/checkbox/checkbox.css` | `data-state`: invalid, success |
|
|
73
|
+
| `lt-divider` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/divider/divider.css` | `data-variant`: subtle, strong |
|
|
74
|
+
| `lt-error-text` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/error-text/error-text.css` | `data-variant`: warning |
|
|
75
|
+
| `lt-fieldset`<br>`lt-legend` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/fieldset/fieldset.css` | `data-state`: invalid, success<br>`data-required`: symbol, text<br>`data-optional` (flag) |
|
|
76
|
+
| `lt-file-upload`<br>`lt-file-upload-list` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/file-upload/file-upload.css` | `data-state`: invalid, success |
|
|
77
|
+
| `lt-heading` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/heading/heading.css` | `data-size`: xs, s, m, xl, mega |
|
|
78
|
+
| `lt-help-text` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/help-text/help-text.css` | `data-variant`: strong, success, warning |
|
|
79
|
+
| `lt-icon` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/icon/icon.css` | none |
|
|
80
|
+
| `lt-input` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/input/input.css` | `data-state`: invalid, success<br>`data-variant`: date, datetime-local, time |
|
|
81
|
+
| `lt-label` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/label/label.css` | `data-required`: symbol, text<br>`data-optional` (flag) |
|
|
82
|
+
| `lt-link` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/link/link.css` | none |
|
|
83
|
+
| `lt-list` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/list/list.css` | `data-variant`: plain, divided |
|
|
84
|
+
| `lt-pagination`<br>`lt-pagination__gap` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/pagination/pagination.css` | none |
|
|
85
|
+
| `lt-paragraph` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/paragraph/paragraph.css` | `data-variant`: lead<br>`data-size`: small, large |
|
|
86
|
+
| `lt-progress` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/progress/progress.css` | `data-color`: success, warning, danger |
|
|
87
|
+
| `lt-radio`<br>`lt-radio-row` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/radio/radio.css` | `data-state`: invalid, success |
|
|
88
|
+
| `lt-search`<br>`lt-search-row` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/search/search.css` | `data-state`: invalid, success |
|
|
89
|
+
| `lt-select` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/select/select.css` | `data-state`: invalid, success<br>`data-picker`: styled |
|
|
90
|
+
| `lt-skeleton` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/skeleton/skeleton.css` | `data-variant`: text, circle |
|
|
91
|
+
| `lt-skip-link` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/skip-link/skip-link.css` | none |
|
|
92
|
+
| `lt-spinner` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/spinner/spinner.css` | `data-size`: small, large |
|
|
93
|
+
| `lt-sr-only` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/sr-only/sr-only.css` | none |
|
|
94
|
+
| `lt-steps` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/steps/steps.css` | none |
|
|
95
|
+
| `lt-switch`<br>`lt-switch-row` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/switch/switch.css` | none |
|
|
96
|
+
| `lt-table`<br>`lt-table__sort`<br>`lt-table-scroll` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/table/table.css` | `data-variant`: striped<br>`data-hoverable` (flag) |
|
|
97
|
+
| `lt-tag` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/tag/tag.css` | `data-variant`: filled<br>`data-selectable` (flag) |
|
|
98
|
+
| `lt-textarea` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/textarea/textarea.css` | `data-state`: invalid, success |
|
|
99
|
+
| `lt-toggle-group`<br>`lt-toggle-group__option` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/toggle-group/toggle-group.css` | none |
|
|
100
|
+
| `lt-tooltip`<br>`lt-tooltip__bubble` | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/css/tooltip/tooltip.css` | none |
|
|
100
101
|
|
|
101
102
|
There is also `lt-theme-control`, a class on a radio button that lets the user
|
|
102
103
|
choose a theme. It is in `tokens.css`, and is described under Tokens.
|
|
@@ -175,7 +176,7 @@ root element:
|
|
|
175
176
|
Below the root element the browser then ignores the host's CSS without a
|
|
176
177
|
layer, unless a rule of the host's wins on specificity as described below, and
|
|
177
178
|
LO-TEK's layer applies again. The rule is in `lotek.css` and in
|
|
178
|
-
`https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
179
|
+
`https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/tokens/boundary.css`.
|
|
179
180
|
Fonts and other inherited properties still come from the host, and the
|
|
180
181
|
`--lt-*` variables work. Three things follow from it:
|
|
181
182
|
|
|
@@ -269,15 +270,16 @@ Three rules apply to all of them:
|
|
|
269
270
|
|
|
270
271
|
| Element | Category | Stylesheet | Registration | Attributes | Events | Classes inside |
|
|
271
272
|
| --- | --- | --- | --- | --- | --- | --- |
|
|
272
|
-
| `<lt-field>` | frame | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
273
|
-
| `<lt-tabs>` | frame | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
274
|
-
| `<lt-error-summary>` | frame | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
275
|
-
| `<lt-popover>` | frame | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
276
|
-
| `<lt-
|
|
277
|
-
| `<lt-
|
|
278
|
-
| `<lt-
|
|
279
|
-
| `<lt-
|
|
280
|
-
| `<lt-
|
|
273
|
+
| `<lt-field>` | frame | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/frame/field/field.css` | `defineLtField()` from `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/dist/components/frame/field/lt-field.js` | `disabled` (flag)<br>`optional` (flag)<br>`described-by` (text) | none | none |
|
|
274
|
+
| `<lt-tabs>` | frame | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/frame/tabs/tabs.css` | `defineLtTabs()` from `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/dist/components/frame/tabs/lt-tabs.js` | `server-controlled` (flag)<br>`activation`: manual, automatic | `tab-select` (index) | `lt-tabs__list`<br>`lt-tabs__panel` |
|
|
275
|
+
| `<lt-error-summary>` | frame | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/frame/error-summary/error-summary.css` | `defineLtErrorSummary()` from `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/dist/components/frame/error-summary/lt-error-summary.js` | `data-autofocus`: false, true<br>`hidden` (flag) | none | `lt-error-summary`<br>`lt-error-summary__title` |
|
|
276
|
+
| `<lt-popover>` | frame | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/frame/popover/popover.css` | `defineLtPopover()` from `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/dist/components/frame/popover/lt-popover.js` | `open` (flag)<br>`placement`: bottom-start, bottom-end, top-start, top-end<br>`server-controlled` (flag) | `popover-toggle` (open) | `lt-popover` |
|
|
277
|
+
| `<lt-term>` | frame | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/frame/term/term.css` | `defineLtTerm()` from `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/dist/components/frame/term/lt-term.js` | none | none | `lt-term`<br>`lt-term__entry` |
|
|
278
|
+
| `<lt-suggestion>` | frame | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/frame/suggestion/suggestion.css` | `defineLtSuggestion()` from `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/dist/components/frame/suggestion/lt-suggestion.js` | `prefiltered` (flag)<br>`count-none` (text)<br>`count-zero` (text)<br>`count-one` (text)<br>`count-two` (text)<br>`count-few` (text)<br>`count-many` (text)<br>`count-other` (text)<br>`server-controlled` (flag) | `suggestion-select` (value, label) | `lt-suggestion__list`<br>`lt-suggestion__option`<br>`lt-suggestion__value`<br>`lt-suggestion__empty` |
|
|
279
|
+
| `<lt-dialog>` | frame | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/frame/dialog/dialog.css` | `defineLtDialog()` from `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/dist/components/frame/dialog/lt-dialog.js` | `open` (flag)<br>`server-controlled` (flag) | `dialog-toggle` (open, returnValue) | `lt-dialog` (`data-color`: brand, info, success, warning, danger)<br>`lt-dialog__body`<br>`lt-dialog__title`<br>`lt-dialog__footer`<br>`lt-dialog__header`<br>`lt-dialog__subtitle` |
|
|
280
|
+
| `<lt-toast>` | standalone | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/standalone/toast/toast.css` | `defineLtToast()` from `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/dist/components/standalone/toast/lt-toast.js` | `duration` (number)<br>`label` (text)<br>`close-label` (text) | `toast-dismiss` | `lt-toast`<br>`lt-toast__message`<br>`lt-toast__close` |
|
|
281
|
+
| `<lt-session-timeout>` | frame | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/frame/session-timeout/session-timeout.css` | `defineLtSessionTimeout()` from `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/dist/components/frame/session-timeout/lt-session-timeout.js` | `warn-at` (number)<br>`expires-at` (number)<br>`activity-interval` (number) | `session-warn`<br>`session-extend`<br>`session-logout`<br>`session-expired`<br>`session-activity` | `lt-session-timeout`<br>`lt-session-timeout__dialog`<br>`lt-session-timeout__title`<br>`lt-session-timeout__text`<br>`lt-session-timeout__count`<br>`lt-session-timeout__actions` |
|
|
282
|
+
| `<lt-connection-status>` | standalone | `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/src/components/standalone/connection-status/connection-status.css` | `defineLtConnectionStatus()` from `https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/dist/components/standalone/connection-status/lt-connection-status.js` | `offline-text` (text)<br>`online-text` (text) | `connection-lost`<br>`connection-restored` | `lt-connection-status`<br>`lt-connection-status__bar` |
|
|
281
283
|
|
|
282
284
|
None of them uses shadow DOM. The content is in plain DOM, so `querySelector`,
|
|
283
285
|
`FormData` and ordinary CSS work straight into it.
|
|
@@ -307,7 +309,7 @@ None of them uses shadow DOM. The content is in plain DOM, so `querySelector`,
|
|
|
307
309
|
|
|
308
310
|
<script type="module">
|
|
309
311
|
import { defineLtField } from
|
|
310
|
-
"https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.
|
|
312
|
+
"https://cdn.jsdelivr.net/npm/@lo-tek/interfaces@0.41.0/dist/components/frame/field/lt-field.js"
|
|
311
313
|
|
|
312
314
|
defineLtField()
|
|
313
315
|
</script>
|
|
@@ -334,7 +336,7 @@ as plain HTML:
|
|
|
334
336
|
<label class="lt-label" for="fixer" data-required="text">Fixer's address</label>
|
|
335
337
|
<input class="lt-input" id="fixer" type="email" value="fixer@" />
|
|
336
338
|
<p class="lt-help-text">The board writes to the fixer, never to the crew.</p>
|
|
337
|
-
<p class="lt-error-text">Enter
|
|
339
|
+
<p class="lt-error-text">Enter the fixer's address, for example fixer@relay.example.</p>
|
|
338
340
|
</lt-field>
|
|
339
341
|
```
|
|
340
342
|
|