@lo-tek/interfaces 0.39.0 → 0.40.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 (148) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/README.md +1 -1
  3. package/agent/astro.md +9 -9
  4. package/agent/bundles.md +11 -11
  5. package/agent/datastar.md +65 -65
  6. package/agent/html.md +59 -59
  7. package/agent/react.md +11 -11
  8. package/agent/templates.md +65 -58
  9. package/core/lotek-core.wasm +0 -0
  10. package/core/lotek.wasm +0 -0
  11. package/dist/components/css/accordion/accordion.d.ts +1 -1
  12. package/dist/components/css/accordion/accordion.js +1 -1
  13. package/dist/components/css/alert/alert.d.ts +1 -1
  14. package/dist/components/css/alert/alert.js +1 -1
  15. package/dist/components/css/avatar/avatar.d.ts +1 -1
  16. package/dist/components/css/avatar/avatar.js +1 -1
  17. package/dist/components/css/badge/badge.d.ts +1 -1
  18. package/dist/components/css/badge/badge.js +1 -1
  19. package/dist/components/css/breadcrumbs/breadcrumbs.d.ts +1 -1
  20. package/dist/components/css/breadcrumbs/breadcrumbs.js +1 -1
  21. package/dist/components/css/card/card.d.ts +1 -1
  22. package/dist/components/css/card/card.js +1 -1
  23. package/dist/components/css/file-upload/file-upload.d.ts +1 -1
  24. package/dist/components/css/file-upload/file-upload.js +1 -1
  25. package/dist/components/css/icon/icon.d.ts +1 -1
  26. package/dist/components/css/icon/icon.js +1 -1
  27. package/dist/components/css/label/label.d.ts +1 -1
  28. package/dist/components/css/label/label.js +1 -1
  29. package/dist/components/css/link/link.d.ts +1 -1
  30. package/dist/components/css/link/link.js +1 -1
  31. package/dist/components/css/spinner/spinner.d.ts +7 -5
  32. package/dist/components/css/spinner/spinner.d.ts.map +1 -1
  33. package/dist/components/css/spinner/spinner.js +7 -5
  34. package/dist/components/css/spinner/spinner.js.map +1 -1
  35. package/dist/components/css/tag/tag.d.ts +1 -1
  36. package/dist/components/css/tag/tag.js +1 -1
  37. package/dist/components/css/toggle-group/toggle-group.d.ts +1 -1
  38. package/dist/components/css/toggle-group/toggle-group.js +1 -1
  39. package/dist/components/css/tooltip/tooltip.d.ts +2 -2
  40. package/dist/components/css/tooltip/tooltip.js +2 -2
  41. package/dist/components/frame/dialog/dialog.d.ts +11 -6
  42. package/dist/components/frame/dialog/dialog.d.ts.map +1 -1
  43. package/dist/components/frame/dialog/dialog.js +4 -4
  44. package/dist/components/frame/dialog/dialog.js.map +1 -1
  45. package/dist/components/frame/dialog/lt-dialog.d.ts +1 -1
  46. package/dist/components/frame/dialog/lt-dialog.js +7 -7
  47. package/dist/components/frame/error-summary/error-summary.d.ts +6 -2
  48. package/dist/components/frame/error-summary/error-summary.d.ts.map +1 -1
  49. package/dist/components/frame/error-summary/error-summary.js +1 -1
  50. package/dist/components/frame/error-summary/error-summary.js.map +1 -1
  51. package/dist/components/frame/error-summary/lt-error-summary.d.ts +1 -1
  52. package/dist/components/frame/error-summary/lt-error-summary.js +6 -6
  53. package/dist/components/frame/field/field-core.d.ts +4 -2
  54. package/dist/components/frame/field/field-core.d.ts.map +1 -1
  55. package/dist/components/frame/field/field-core.js.map +1 -1
  56. package/dist/components/frame/field/lt-field.d.ts +5 -4
  57. package/dist/components/frame/field/lt-field.d.ts.map +1 -1
  58. package/dist/components/frame/field/lt-field.js +5 -4
  59. package/dist/components/frame/field/lt-field.js.map +1 -1
  60. package/dist/components/frame/popover/lt-popover.d.ts +3 -3
  61. package/dist/components/frame/popover/lt-popover.js +3 -3
  62. package/dist/components/frame/popover/popover.d.ts +7 -3
  63. package/dist/components/frame/popover/popover.d.ts.map +1 -1
  64. package/dist/components/frame/popover/popover.js +2 -2
  65. package/dist/components/frame/popover/popover.js.map +1 -1
  66. package/dist/components/frame/session-timeout/lt-session-timeout.d.ts +8 -8
  67. package/dist/components/frame/session-timeout/lt-session-timeout.js +7 -7
  68. package/dist/components/frame/session-timeout/session-timeout.d.ts +10 -5
  69. package/dist/components/frame/session-timeout/session-timeout.d.ts.map +1 -1
  70. package/dist/components/frame/session-timeout/session-timeout.js +4 -4
  71. package/dist/components/frame/session-timeout/session-timeout.js.map +1 -1
  72. package/dist/components/frame/suggestion/lt-suggestion.d.ts +12 -11
  73. package/dist/components/frame/suggestion/lt-suggestion.d.ts.map +1 -1
  74. package/dist/components/frame/suggestion/lt-suggestion.js +11 -10
  75. package/dist/components/frame/suggestion/lt-suggestion.js.map +1 -1
  76. package/dist/components/frame/suggestion/suggestion.d.ts +3 -1
  77. package/dist/components/frame/suggestion/suggestion.d.ts.map +1 -1
  78. package/dist/components/frame/suggestion/suggestion.js.map +1 -1
  79. package/dist/components/frame/tabs/lt-tabs.d.ts +3 -3
  80. package/dist/components/frame/tabs/lt-tabs.js +5 -5
  81. package/dist/components/frame/tabs/lt-tabs.js.map +1 -1
  82. package/dist/components/frame/tabs/tabs.d.ts +8 -6
  83. package/dist/components/frame/tabs/tabs.d.ts.map +1 -1
  84. package/dist/components/frame/tabs/tabs.js +4 -4
  85. package/dist/components/frame/tabs/tabs.js.map +1 -1
  86. package/dist/components/standalone/connection-status/lt-connection-status.d.ts +1 -1
  87. package/dist/components/standalone/connection-status/lt-connection-status.js +1 -1
  88. package/dist/components/standalone/toast/lt-toast.d.ts +1 -1
  89. package/dist/components/standalone/toast/lt-toast.js +1 -1
  90. package/dist/diagnostics/index.d.ts +2 -2
  91. package/dist/diagnostics/index.js +2 -2
  92. package/dist/dom.d.ts +2 -1
  93. package/dist/dom.d.ts.map +1 -1
  94. package/dist/dom.js +2 -1
  95. package/dist/dom.js.map +1 -1
  96. package/dist/lotek.css +20 -1
  97. package/dist/lt.d.ts +5 -5
  98. package/dist/lt.js +5 -5
  99. package/dist/react.d.ts.map +1 -1
  100. package/dist/vocabulary/elements.js +1 -1
  101. package/dist/vocabulary/elements.js.map +1 -1
  102. package/dist/vocabulary/types.d.ts +20 -0
  103. package/dist/vocabulary/types.d.ts.map +1 -1
  104. package/live-templates-kotlin.xml +64 -0
  105. package/live-templates.xml +23 -23
  106. package/manifest/manifest.json +368 -80
  107. package/manifest/manifest.schema.json +54 -7
  108. package/package.json +2 -1
  109. package/src/components/css/accordion/accordion.ts +1 -1
  110. package/src/components/css/alert/alert.ts +1 -1
  111. package/src/components/css/avatar/avatar.ts +1 -1
  112. package/src/components/css/badge/badge.ts +1 -1
  113. package/src/components/css/breadcrumbs/breadcrumbs.ts +1 -1
  114. package/src/components/css/card/card.ts +1 -1
  115. package/src/components/css/file-upload/file-upload.ts +1 -1
  116. package/src/components/css/icon/icon.ts +1 -1
  117. package/src/components/css/input/input.css +21 -0
  118. package/src/components/css/label/label.ts +1 -1
  119. package/src/components/css/link/link.ts +1 -1
  120. package/src/components/css/spinner/spinner.ts +8 -5
  121. package/src/components/css/tag/tag.ts +1 -1
  122. package/src/components/css/toggle-group/toggle-group.ts +1 -1
  123. package/src/components/css/tooltip/tooltip.ts +2 -2
  124. package/src/components/frame/dialog/dialog.ts +11 -6
  125. package/src/components/frame/dialog/lt-dialog.ts +7 -7
  126. package/src/components/frame/error-summary/error-summary.ts +6 -2
  127. package/src/components/frame/error-summary/lt-error-summary.ts +6 -6
  128. package/src/components/frame/field/field-core.ts +4 -2
  129. package/src/components/frame/field/lt-field.ts +5 -4
  130. package/src/components/frame/popover/lt-popover.ts +3 -3
  131. package/src/components/frame/popover/popover.ts +7 -3
  132. package/src/components/frame/session-timeout/lt-session-timeout.ts +8 -8
  133. package/src/components/frame/session-timeout/session-timeout.ts +10 -5
  134. package/src/components/frame/suggestion/lt-suggestion.ts +13 -12
  135. package/src/components/frame/suggestion/suggestion.css +1 -1
  136. package/src/components/frame/suggestion/suggestion.ts +3 -1
  137. package/src/components/frame/tabs/lt-tabs.ts +5 -5
  138. package/src/components/frame/tabs/tabs.css +1 -1
  139. package/src/components/frame/tabs/tabs.ts +8 -6
  140. package/src/components/standalone/connection-status/lt-connection-status.ts +1 -1
  141. package/src/components/standalone/toast/lt-toast.ts +1 -1
  142. package/src/diagnostics/index.ts +2 -2
  143. package/src/dom.ts +2 -1
  144. package/src/lt.ts +5 -5
  145. package/src/tokens/boundary.css +4 -0
  146. package/src/vocabulary/elements.ts +1 -1
  147. package/src/vocabulary/types.ts +17 -0
  148. package/web-types.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/vocabulary/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/vocabulary/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ <!-- Generated by interfaces/scripts/generate-vocabulary.ts. Do not edit. -->
2
+ <templateSet group="LO-TEK Kotlin">
3
+ <template name="ltfield" value="fun FlowContent.orderForm(invalid: Boolean = false) {&#10; val field = no.lotek.Lt.field(id = &quot;$codename$&quot;, required = no.lotek.RequiredMarker.SYMBOL, error = true, invalid = invalid)&#10; form {&#10; id = &quot;$order_form$&quot;&#10; attributes[&quot;novalidate&quot;] = &quot;&quot;&#10; label { lt(field.label); +&quot;Codename&quot; }&#10; input { lt(no.lotek.Lt.input(type = no.lotek.InputType.TEXT), field.control); name = &quot;$codename$&quot;; required = true }&#10; p { lt(no.lotek.Lt.errorText(), field.error); +&quot;Enter a codename.&quot; }&#10; button { lt(no.lotek.Lt.button()); type = ButtonType.submit; +&quot;Order the job&quot; }&#10; }&#10;}" description="The Kotlin recipe from the field page, in kotlinx.html. Needs import kotlinx.html.* and no.lotek.html.*; the names from no.lotek are imported when it is inserted." toReformat="true" toShortenFQNames="true">
4
+ <variable name="codename" expression="" defaultValue="" alwaysStopAt="true" />
5
+ <variable name="order_form" expression="" defaultValue="" alwaysStopAt="true" />
6
+ <context>
7
+ <option name="KOTLIN_TOPLEVEL" value="true" />
8
+ </context>
9
+ </template>
10
+ <template name="lttabs" value="data class Part(val key: String, val title: String, val text: String)&#10;&#10;fun FlowContent.claimTabs(&#10; parts: List&lt;Part&gt; = listOf(&#10; Part(&quot;claim&quot;, &quot;Claim&quot;, &quot;Claim AV-2079-0481 was filed on 4 March 2079.&quot;),&#10; Part(&quot;attachments&quot;, &quot;Attachments&quot;, &quot;Three attachments have been uploaded.&quot;),&#10; ),&#10;) {&#10; val tabs = no.lotek.Lt.tabs(id = &quot;$claim_tabs$&quot;, keys = parts.map { it.key }, label = &quot;Parts of the claim&quot;)&#10; ltTabs {&#10; id = &quot;$claim_tabs$&quot;&#10; ul {&#10; lt(tabs.list)&#10; parts.zip(tabs.tabs).forEach { (part, tab) -&gt; li { a { lt(tab); +part.title } } }&#10; }&#10; for ((i, part) in parts.withIndex()) {&#10; section {&#10; lt(tabs.panels[i])&#10; h2 { lt(tabs.headings[i]); +part.title }&#10; p { +part.text }&#10; }&#10; }&#10; }&#10; script(type = &quot;module&quot;) {&#10; unsafe {&#10; +&quot;&quot;&quot;&#10; document.getElementById(&quot;$claim_tabs$&quot;).addEventListener(&quot;tab-select&quot;, (evt) =&gt; {&#10; console.log(&quot;selected tab&quot;, evt.detail.index)&#10; })&#10; &quot;&quot;&quot;&#10; }&#10; }&#10;}" description="The Kotlin recipe from the tabs page, in kotlinx.html. Needs import kotlinx.html.* and no.lotek.html.*; the names from no.lotek are imported when it is inserted." toReformat="true" toShortenFQNames="true">
11
+ <variable name="claim_tabs" expression="" defaultValue="" alwaysStopAt="true" />
12
+ <context>
13
+ <option name="KOTLIN_TOPLEVEL" value="true" />
14
+ </context>
15
+ </template>
16
+ <template name="lterrorsummary" value="data class Fault(val field: String, val message: String)&#10;&#10;fun FlowContent.orderForm(faults: List&lt;Fault&gt; = emptyList()) {&#10; val summary = no.lotek.Lt.errorSummary(count = faults.size, id = &quot;$errors$&quot;, titleId = &quot;$errors_title$&quot;)&#10; val fixer = no.lotek.Lt.field(id = &quot;$fixer$&quot;, invalid = faults.any { it.field == &quot;$fixer$&quot; })&#10; form {&#10; attributes[&quot;novalidate&quot;] = &quot;&quot;&#10; ltErrorSummary {&#10; lt(summary.host)&#10; h2 {&#10; lt(summary.title)&#10; if (faults.isNotEmpty()) +(if (faults.size == 1) &quot;The form has one error&quot; else &quot;The form has $${faults.size} errors&quot;)&#10; }&#10; ul {&#10; lt(no.lotek.Lt.list())&#10; for (fault in faults) li { a(href = &quot;#$${fault.field}&quot;) { +fault.message } }&#10; }&#10; }&#10; label { lt(fixer.label); +&quot;Fixer's address&quot; }&#10; input { lt(no.lotek.Lt.input(type = no.lotek.InputType.EMAIL), fixer.control); name = &quot;$fixer$&quot; }&#10; button { lt(no.lotek.Lt.button()); +&quot;Order the job&quot; }&#10; }&#10; script(type = &quot;module&quot;) {&#10; unsafe {&#10; +&quot;&quot;&quot;&#10; const box = document.getElementById(&quot;$errors$&quot;)&#10;&#10; function showErrors(errors) {&#10; box.querySelector(&quot;ul&quot;).innerHTML = errors&#10; .map((e) =&gt; `&lt;li&gt;&lt;a href=&quot;#$${'$$'}{e.id}&quot;&gt;$${'$$'}{e.message}&lt;/a&gt;&lt;/li&gt;`)&#10; .join(&quot;&quot;)&#10;&#10; // The heading and hidden are written here, as a server would.&#10; if (errors.length &gt; 0) {&#10; box.querySelector(&quot;h2&quot;).textContent =&#10; errors.length === 1 ? &quot;The form has one error&quot; : `The form has $${'$$'}{errors.length} errors`&#10; }&#10; // Hidden and shown again, so focus also moves when the form fails&#10; // again while the box is already visible.&#10; box.hidden = true&#10; box.hidden = errors.length === 0&#10; }&#10;&#10; const fixer = document.getElementById(&quot;$fixer$&quot;)&#10;&#10; document.querySelector(&quot;form&quot;).addEventListener(&quot;submit&quot;, (event) =&gt; {&#10; event.preventDefault()&#10;&#10; const errors = fixer.value.includes(&quot;@&quot;)&#10; ? []&#10; : [{ id: &quot;$fixer$&quot;, message: &quot;Enter the fixer's address with an @&quot; }]&#10;&#10; showErrors(errors)&#10; })&#10; &quot;&quot;&quot;&#10; }&#10; }&#10;}" description="The Kotlin recipe from the error-summary page, in kotlinx.html. Needs import kotlinx.html.* and no.lotek.html.*; the names from no.lotek are imported when it is inserted." toReformat="true" toShortenFQNames="true">
17
+ <variable name="errors" expression="" defaultValue="" alwaysStopAt="true" />
18
+ <variable name="errors_title" expression="" defaultValue="" alwaysStopAt="true" />
19
+ <variable name="fixer" expression="" defaultValue="" alwaysStopAt="true" />
20
+ <context>
21
+ <option name="KOTLIN_TOPLEVEL" value="true" />
22
+ </context>
23
+ </template>
24
+ <template name="ltpopover" value="fun FlowContent.actionsMenu() {&#10; val menu = no.lotek.Lt.popover(id = &quot;$actions$&quot;, placement = no.lotek.PopoverPlacement.BOTTOM_END)&#10; ltPopover {&#10; id = &quot;$menu$&quot;&#10; lt(menu.host)&#10; button { lt(no.lotek.Lt.button(variant = no.lotek.ButtonVariant.SECONDARY), menu.trigger); type = ButtonType.button; +&quot;Actions&quot; }&#10; ul {&#10; lt(menu.panel)&#10; li { button { lt(no.lotek.Lt.button(variant = no.lotek.ButtonVariant.GHOST)); type = ButtonType.button; +&quot;Mark LDG-117 returned&quot; } }&#10; li { button { lt(no.lotek.Lt.button(variant = no.lotek.ButtonVariant.GHOST)); type = ButtonType.button; +&quot;Charge the late fee&quot; } }&#10; }&#10; }&#10; script(type = &quot;module&quot;) {&#10; unsafe {&#10; +&quot;&quot;&quot;&#10; const menu = document.getElementById(&quot;$menu$&quot;)&#10; const panel = menu.querySelector(&quot;.lt-popover&quot;)&#10;&#10; // Close the menu when an action has been chosen&#10; menu.addEventListener(&quot;click&quot;, (event) =&gt; {&#10; if (panel.contains(event.target) &amp;&amp; event.target.closest(&quot;button&quot;)) menu.hide()&#10; })&#10; &quot;&quot;&quot;&#10; }&#10; }&#10;}" description="The Kotlin recipe from the popover page, in kotlinx.html. Needs import kotlinx.html.* and no.lotek.html.*; the names from no.lotek are imported when it is inserted." toReformat="true" toShortenFQNames="true">
25
+ <variable name="actions" expression="" defaultValue="" alwaysStopAt="true" />
26
+ <variable name="menu" expression="" defaultValue="" alwaysStopAt="true" />
27
+ <context>
28
+ <option name="KOTLIN_TOPLEVEL" value="true" />
29
+ </context>
30
+ </template>
31
+ <template name="ltsuggestion" value="data class Breaker(val code: String, val name: String)&#10;&#10;fun FlowContent.breakerSearch(&#10; breakers: List&lt;Breaker&gt; = listOf(Breaker(&quot;crowbar&quot;, &quot;Crowbar&quot;), Breaker(&quot;needle&quot;, &quot;Needle&quot;)),&#10;) {&#10; val search = no.lotek.Lt.suggestion(id = &quot;$breaker$&quot;, keys = breakers.map { it.code })&#10; ltSuggestion {&#10; id = &quot;$breaker_search$&quot;&#10; label { lt(search.label); +&quot;Breaker&quot; }&#10; input { lt(search.control); name = &quot;$breaker$&quot; }&#10; ul {&#10; lt(search.list)&#10; breakers.zip(search.options).forEach { (breaker, option) -&gt; li { lt(option); +breaker.name } }&#10; }&#10; p { lt(search.empty); +&quot;No matches&quot; }&#10; span { lt(search.status) }&#10; }&#10; script(type = &quot;module&quot;) {&#10; unsafe {&#10; +&quot;&quot;&quot;&#10; document.getElementById(&quot;$breaker_search$&quot;).addEventListener(&quot;suggestion-select&quot;, (evt) =&gt; {&#10; console.log(&quot;selected&quot;, evt.detail.label, evt.detail.value)&#10; })&#10; &quot;&quot;&quot;&#10; }&#10; }&#10;}" description="The Kotlin recipe from the suggestion page, in kotlinx.html. Needs import kotlinx.html.* and no.lotek.html.*; the names from no.lotek are imported when it is inserted." toReformat="true" toShortenFQNames="true">
32
+ <variable name="breaker" expression="" defaultValue="" alwaysStopAt="true" />
33
+ <variable name="breaker_search" expression="" defaultValue="" alwaysStopAt="true" />
34
+ <context>
35
+ <option name="KOTLIN_TOPLEVEL" value="true" />
36
+ </context>
37
+ </template>
38
+ <template name="ltdialog" value="fun FlowContent.cancelJob() {&#10; val box = no.lotek.Lt.dialog(titleId = &quot;$confirm_title$&quot;)&#10; button { lt(no.lotek.Lt.button(variant = no.lotek.ButtonVariant.DANGER)); id = &quot;$open_confirm$&quot;; type = ButtonType.button; +&quot;Cancel the job&quot; }&#10; dialog {&#10; lt(box.dialog)&#10; id = &quot;$confirm$&quot;&#10; h2 { lt(box.title); +&quot;Cancel job 222-0481?&quot; }&#10; div {&#10; lt(box.body)&#10; p { +&quot;The crew keeps the advance. This cannot be undone.&quot; }&#10; }&#10; form {&#10; lt(box.footer)&#10; attributes[&quot;method&quot;] = &quot;dialog&quot;&#10; button { lt(no.lotek.Lt.button(variant = no.lotek.ButtonVariant.SECONDARY)); value = &quot;keep&quot;; +&quot;Keep the job&quot; }&#10; button { lt(no.lotek.Lt.button(variant = no.lotek.ButtonVariant.DANGER)); value = &quot;cancel&quot;; +&quot;Cancel the job&quot; }&#10; }&#10; }&#10; script(type = &quot;module&quot;) {&#10; unsafe {&#10; +&quot;&quot;&quot;&#10; const dialog = document.getElementById(&quot;$confirm$&quot;)&#10;&#10; document.getElementById(&quot;$open_confirm$&quot;).addEventListener(&quot;click&quot;, () =&gt; {&#10; // Escape and close() without a value leave the previous value in place.&#10; dialog.returnValue = &quot;&quot;&#10; dialog.showModal()&#10; })&#10;&#10; dialog.addEventListener(&quot;close&quot;, () =&gt; {&#10; if (dialog.returnValue === &quot;cancel&quot;) {&#10; // Cancel the job here&#10; }&#10; })&#10; &quot;&quot;&quot;&#10; }&#10; }&#10;}" description="The Kotlin recipe from the dialog page, in kotlinx.html. Needs import kotlinx.html.* and no.lotek.html.*; the names from no.lotek are imported when it is inserted." toReformat="true" toShortenFQNames="true">
39
+ <variable name="confirm_title" expression="" defaultValue="" alwaysStopAt="true" />
40
+ <variable name="open_confirm" expression="" defaultValue="" alwaysStopAt="true" />
41
+ <variable name="confirm" expression="" defaultValue="" alwaysStopAt="true" />
42
+ <context>
43
+ <option name="KOTLIN_TOPLEVEL" value="true" />
44
+ </context>
45
+ </template>
46
+ <template name="lttoast" value="fun FlowContent.relay() {&#10; ltToast { lt(no.lotek.Lt.toast(label = &quot;Messages&quot;).host); id = &quot;$messages$&quot; }&#10; button { lt(no.lotek.Lt.button()); id = &quot;$restart$&quot;; type = ButtonType.button; +&quot;Restart relay 14&quot; }&#10; script(type = &quot;module&quot;) {&#10; unsafe {&#10; +&quot;&quot;&quot;&#10; const messages = document.getElementById(&quot;$messages$&quot;)&#10;&#10; document.getElementById(&quot;$restart$&quot;).addEventListener(&quot;click&quot;, async () =&gt; {&#10; try {&#10; await restartRelay(14)&#10; messages.show(&quot;Relay 14 is back&quot;, { color: &quot;success&quot; })&#10; } catch {&#10; messages.show(&quot;Relay 14 did not answer. Try again.&quot;, { color: &quot;danger&quot;, duration: 0 })&#10; }&#10; })&#10; &quot;&quot;&quot;&#10; }&#10; }&#10;}" description="The Kotlin recipe from the toast page, in kotlinx.html. Needs import kotlinx.html.* and no.lotek.html.*; the names from no.lotek are imported when it is inserted." toReformat="true" toShortenFQNames="true">
47
+ <variable name="messages" expression="" defaultValue="" alwaysStopAt="true" />
48
+ <variable name="restart" expression="" defaultValue="" alwaysStopAt="true" />
49
+ <context>
50
+ <option name="KOTLIN_TOPLEVEL" value="true" />
51
+ </context>
52
+ </template>
53
+ <template name="ltsessiontimeout" value="fun FlowContent.sessionWarning() {&#10; val session = no.lotek.Lt.sessionTimeout(titleId = &quot;$session_title$&quot;, warnAt = 1500, expiresAt = 1800)&#10; ltSessionTimeout {&#10; lt(session.host)&#10; dialog {&#10; lt(session.dialog)&#10; h2 { lt(session.title); +&quot;Your session is ending&quot; }&#10; p {&#10; lt(session.text)&#10; +&quot;Your session on the Lattice ends in &quot;&#10; span { lt(session.count) }&#10; +&quot;. Unsaved routes will be lost.&quot;&#10; }&#10; span { lt(session.live) }&#10; form {&#10; lt(session.actions)&#10; attributes[&quot;method&quot;] = &quot;dialog&quot;&#10; button { lt(no.lotek.Lt.button(), session.extend); +&quot;Stay connected&quot; }&#10; button { lt(no.lotek.Lt.button(variant = no.lotek.ButtonVariant.SECONDARY), session.logout); +&quot;Log out&quot; }&#10; }&#10; }&#10; }&#10; script(type = &quot;module&quot;) {&#10; unsafe {&#10; +&quot;&quot;&quot;&#10; const session = document.querySelector(&quot;lt-session-timeout&quot;)&#10;&#10; session.addEventListener(&quot;session-extend&quot;, async () =&gt; {&#10; await fetch(&quot;/api/extend-session&quot;, { method: &quot;POST&quot; })&#10; })&#10;&#10; session.addEventListener(&quot;session-expired&quot;, () =&gt; {&#10; location.href = &quot;/log-in?reason=expired&quot;&#10; })&#10; &quot;&quot;&quot;&#10; }&#10; }&#10;}" description="The Kotlin recipe from the session-timeout page, in kotlinx.html. Needs import kotlinx.html.* and no.lotek.html.*; the names from no.lotek are imported when it is inserted." toReformat="true" toShortenFQNames="true">
54
+ <variable name="session_title" expression="" defaultValue="" alwaysStopAt="true" />
55
+ <context>
56
+ <option name="KOTLIN_TOPLEVEL" value="true" />
57
+ </context>
58
+ </template>
59
+ <template name="ltconnectionstatus" value="fun FlowContent.connection() {&#10; ltConnectionStatus { lt(no.lotek.Lt.connectionStatus()) }&#10; // The bar shows by itself when the browser goes offline. That the&#10; // server stopped answering, only the app knows, and says so here.&#10; script(type = &quot;module&quot;) {&#10; unsafe {&#10; +&quot;&quot;&quot;&#10; import { reportFailure, reportSuccess } from&#10; &quot;$${no.lotek.LotekWebJar.ROOT}/dist/components/standalone/connection-status/lt-connection-status.js&quot;&#10;&#10; const connection = document.querySelector(&quot;lt-connection-status&quot;)&#10; if (!connection) throw new Error(&quot;element not found&quot;)&#10;&#10; // A module keeps its names to itself, so the function the app saves through&#10; // is put on window, where its other scripts call it:&#10; // form.addEventListener(&quot;submit&quot;, (event) =&gt; {&#10; // event.preventDefault()&#10; // saveRoute(new FormData(form))&#10; // })&#10; // A request that got no answer is a lost connection, and so is an answer&#10; // from a gateway whose server is gone (502, 503, 504). Any other answer, an&#10; // error status included, means the server is there. reportSuccess and&#10; // reportFailure wait for the component to be registered, and warn when it&#10; // never is; the save does not wait for them.&#10; window.saveRoute = async (body) =&gt; {&#10; let response&#10; try {&#10; response = await fetch(&quot;/api/routes&quot;, { method: &quot;POST&quot;, body })&#10; } catch {}&#10; if (response &amp;&amp; ![502, 503, 504].includes(response.status)) reportSuccess(connection)&#10; else reportFailure(connection)&#10; return response&#10; }&#10; &quot;&quot;&quot;&#10; }&#10; }&#10;}" description="The Kotlin recipe from the connection-status page, in kotlinx.html. Needs import kotlinx.html.* and no.lotek.html.*; the names from no.lotek are imported when it is inserted." toReformat="true" toShortenFQNames="true">
60
+ <context>
61
+ <option name="KOTLIN_TOPLEVEL" value="true" />
62
+ </context>
63
+ </template>
64
+ </templateSet>
@@ -1,56 +1,56 @@
1
1
  <!-- Generated by interfaces/scripts/generate-vocabulary.ts. Do not edit. -->
2
2
  <templateSet group="LO-TEK">
3
- <template name="lt-field" value="&lt;!-- novalidate: otherwise the browser stops an empty required field before&#10; the submit event, and the error text below is never shown. --&gt;&#10;&lt;form id=&quot;$contact_form$&quot; novalidate&gt;&#10; &lt;lt-field&gt;&#10; &lt;label class=&quot;lt-label&quot; for=&quot;$name$&quot; data-required=&quot;symbol&quot;&gt;Full name&lt;/label&gt;&#10; &lt;input class=&quot;lt-input&quot; id=&quot;$name$&quot; type=&quot;text&quot; name=&quot;name&quot; required /&gt;&#10; &lt;p class=&quot;lt-error-text&quot; hidden&gt;Enter your name.&lt;/p&gt;&#10; &lt;/lt-field&gt;&#10;&#10; &lt;button class=&quot;lt-button&quot; type=&quot;submit&quot;&gt;Send&lt;/button&gt;&#10;&lt;/form&gt;" description="Wires label, field, help text and error text together: sets `aria-describedby` and `aria-invalid` on the control and an id on the help text and the error text. Never writes an id on the control: the template writes `for` and `id`, or wraps the field in the label. The field is invalid when the error text is there without `hidden`. Exists for markup produced without JavaScript. When the markup is produced with JavaScript, use `lt.field()` instead." toReformat="false" toShortenFQNames="false">
4
- <variable name="contact_form" expression="" defaultValue="&quot;contact-form&quot;" alwaysStopAt="true" />
5
- <variable name="name" expression="" defaultValue="&quot;name&quot;" alwaysStopAt="true" />
3
+ <template name="lt-field" value="&lt;!-- novalidate: otherwise the browser stops an empty required field before&#10; the submit event, and the error text below is never shown. --&gt;&#10;&lt;form id=&quot;$order_form$&quot; novalidate&gt;&#10; &lt;lt-field&gt;&#10; &lt;label class=&quot;lt-label&quot; for=&quot;$codename$&quot; data-required=&quot;symbol&quot;&gt;Codename&lt;/label&gt;&#10; &lt;input class=&quot;lt-input&quot; id=&quot;$codename$&quot; type=&quot;text&quot; name=&quot;codename&quot; required /&gt;&#10; &lt;p class=&quot;lt-error-text&quot; hidden&gt;Enter a codename.&lt;/p&gt;&#10; &lt;/lt-field&gt;&#10;&#10; &lt;button class=&quot;lt-button&quot; type=&quot;submit&quot;&gt;Order the job&lt;/button&gt;&#10;&lt;/form&gt;" description="Wires label, field, help text and error text together: sets `aria-describedby` and `aria-invalid` on the control and an id on the help text and the error text. Never writes an id on the control: the template writes `for` and `id`, or wraps the field in the label. The field is invalid when the error text is there without `hidden`. Exists for markup from code that cannot call a builder function. When it can, in TypeScript, Kotlin or Java, use `lt.field()` or `Lt.field()` instead." toReformat="false" toShortenFQNames="false">
4
+ <variable name="order_form" expression="" defaultValue="" alwaysStopAt="true" />
5
+ <variable name="codename" expression="" defaultValue="" alwaysStopAt="true" />
6
6
  <context>
7
7
  <option name="HTML" value="true" />
8
8
  </context>
9
9
  </template>
10
- <template name="lt-tabs" value="&lt;!-- The links point to the panels. The component writes the roles, the&#10; selection and `hidden`. Without JavaScript this is a table of contents. --&gt;&#10;&lt;lt-tabs id=&quot;$case_tabs$&quot;&gt;&#10; &lt;ul class=&quot;lt-tabs__list&quot; aria-label=&quot;Parts of the case&quot;&gt;&#10; &lt;li&gt;&lt;a href=&quot;#$application$&quot;&gt;Application&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href=&quot;#$attachments$&quot;&gt;Attachments&lt;/a&gt;&lt;/li&gt;&#10; &lt;/ul&gt;&#10; &lt;section class=&quot;lt-tabs__panel&quot; id=&quot;$application$&quot;&gt;&#10; &lt;h2&gt;Application&lt;/h2&gt;&#10; &lt;p&gt;The application was sent on 4 March 2026.&lt;/p&gt;&#10; &lt;/section&gt;&#10; &lt;section class=&quot;lt-tabs__panel&quot; id=&quot;$attachments$&quot;&gt;&#10; &lt;h2&gt;Attachments&lt;/h2&gt;&#10; &lt;p&gt;Three attachments have been uploaded.&lt;/p&gt;&#10; &lt;/section&gt;&#10;&lt;/lt-tabs&gt;" description="Tab list. The tabs are links to the panels in an `.lt-tabs__list`, so without JavaScript the list is a table of contents; `role=&quot;tab&quot;` on anything other than a link is not a tab. The component adds keyboard and focus handling, sets roles and wiring, gives each panel its tab's name, makes only the selected panel a tab stop, and hides the rest with `hidden=&quot;until-found&quot;`, so find in page and links into a panel reach them. Each selection is written to the URL. It never writes an id on a tab or a panel. When the page loads, the selected tab is the one with `aria-selected` from the server, otherwise the one the URL points to, otherwise the first one not hidden with `hidden`. Under `server-controlled` the URL never selects." toReformat="false" toShortenFQNames="false">
11
- <variable name="case_tabs" expression="" defaultValue="&quot;case-tabs&quot;" alwaysStopAt="true" />
12
- <variable name="application" expression="" defaultValue="&quot;application&quot;" alwaysStopAt="true" />
13
- <variable name="attachments" expression="" defaultValue="&quot;attachments&quot;" alwaysStopAt="true" />
10
+ <template name="lt-tabs" value="&lt;!-- The links point to the panels. The component writes the roles, the&#10; selection and `hidden`. Without JavaScript this is a table of contents. --&gt;&#10;&lt;lt-tabs id=&quot;$claim_tabs$&quot;&gt;&#10; &lt;ul class=&quot;lt-tabs__list&quot; aria-label=&quot;Parts of the claim&quot;&gt;&#10; &lt;li&gt;&lt;a href=&quot;#$claim$&quot;&gt;Claim&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href=&quot;#$attachments$&quot;&gt;Attachments&lt;/a&gt;&lt;/li&gt;&#10; &lt;/ul&gt;&#10; &lt;section class=&quot;lt-tabs__panel&quot; id=&quot;$claim$&quot;&gt;&#10; &lt;h2&gt;Claim&lt;/h2&gt;&#10; &lt;p&gt;Claim AV-2079-0481 was filed on 4 March 2079.&lt;/p&gt;&#10; &lt;/section&gt;&#10; &lt;section class=&quot;lt-tabs__panel&quot; id=&quot;$attachments$&quot;&gt;&#10; &lt;h2&gt;Attachments&lt;/h2&gt;&#10; &lt;p&gt;Three attachments have been uploaded.&lt;/p&gt;&#10; &lt;/section&gt;&#10;&lt;/lt-tabs&gt;" description="Tab list. The tabs are links to the panels in an `.lt-tabs__list`, so without JavaScript the list is a table of contents; `role=&quot;tab&quot;` on anything other than a link is not a tab. The component adds keyboard and focus handling, sets roles and wiring, gives each panel its tab's name, makes only the selected panel a tab stop, and hides the rest with `hidden=&quot;until-found&quot;`, so find in page and links into a panel reach them. Each selection is written to the URL. It never writes an id on a tab or a panel. When the page loads, the selected tab is the one with `aria-selected` from the server, otherwise the one the URL points to, otherwise the first one not hidden with `hidden`. Under `server-controlled` the URL never selects." toReformat="false" toShortenFQNames="false">
11
+ <variable name="claim_tabs" expression="" defaultValue="" alwaysStopAt="true" />
12
+ <variable name="claim" expression="" defaultValue="" alwaysStopAt="true" />
13
+ <variable name="attachments" expression="" defaultValue="" alwaysStopAt="true" />
14
14
  <context>
15
15
  <option name="HTML" value="true" />
16
16
  </context>
17
17
  </template>
18
- <template name="lt-error-summary" value="&lt;form novalidate&gt;&#10; &lt;!-- The component sets the class, role=&quot;alert&quot; and tabindex=&quot;-1&quot;; the id and aria-labelledby that name the box are the template's. --&gt;&#10; &lt;lt-error-summary id=&quot;$errors$&quot; aria-labelledby=&quot;$errors_title$&quot; hidden&gt;&#10; &lt;h2 id=&quot;$errors_title$&quot;&gt;&lt;/h2&gt;&#10; &lt;ul class=&quot;lt-list&quot;&gt;&lt;/ul&gt;&#10; &lt;/lt-error-summary&gt;&#10;&#10; &lt;label class=&quot;lt-label&quot; for=&quot;$email$&quot;&gt;Email address&lt;/label&gt;&#10; &lt;input class=&quot;lt-input&quot; id=&quot;$email$&quot; type=&quot;email&quot; /&gt;&#10; &lt;button class=&quot;lt-button&quot;&gt;Send application&lt;/button&gt;&#10;&lt;/form&gt;" description="Error summary. Moves focus to the box when it appears, and to the control when a link in the list is followed." toReformat="false" toShortenFQNames="false">
19
- <variable name="errors" expression="" defaultValue="&quot;errors&quot;" alwaysStopAt="true" />
20
- <variable name="errors_title" expression="" defaultValue="&quot;errors-title&quot;" alwaysStopAt="true" />
21
- <variable name="email" expression="" defaultValue="&quot;email&quot;" alwaysStopAt="true" />
18
+ <template name="lt-error-summary" value="&lt;form novalidate&gt;&#10; &lt;!-- The component sets the class, role=&quot;alert&quot; and tabindex=&quot;-1&quot;; the id and aria-labelledby that name the box are the template's. --&gt;&#10; &lt;lt-error-summary id=&quot;$errors$&quot; aria-labelledby=&quot;$errors_title$&quot; hidden&gt;&#10; &lt;h2 id=&quot;$errors_title$&quot;&gt;&lt;/h2&gt;&#10; &lt;ul class=&quot;lt-list&quot;&gt;&lt;/ul&gt;&#10; &lt;/lt-error-summary&gt;&#10;&#10; &lt;label class=&quot;lt-label&quot; for=&quot;$fixer$&quot;&gt;Fixer's address&lt;/label&gt;&#10; &lt;input class=&quot;lt-input&quot; id=&quot;$fixer$&quot; type=&quot;email&quot; name=&quot;fixer&quot; /&gt;&#10; &lt;button class=&quot;lt-button&quot;&gt;Order the job&lt;/button&gt;&#10;&lt;/form&gt;" description="Error summary. Moves focus to the box when it appears, and to the control when a link in the list is followed." toReformat="false" toShortenFQNames="false">
19
+ <variable name="errors" expression="" defaultValue="" alwaysStopAt="true" />
20
+ <variable name="errors_title" expression="" defaultValue="" alwaysStopAt="true" />
21
+ <variable name="fixer" expression="" defaultValue="" alwaysStopAt="true" />
22
22
  <context>
23
23
  <option name="HTML" value="true" />
24
24
  </context>
25
25
  </template>
26
- <template name="lt-popover" value="&lt;!-- The component sets `popover` and `aria-controls`. You write the id on&#10; the panel: that is what the button points to. --&gt;&#10;&lt;lt-popover id=&quot;$menu$&quot; placement=&quot;bottom-end&quot;&gt;&#10; &lt;button class=&quot;lt-button&quot; data-variant=&quot;secondary&quot; type=&quot;button&quot;&gt;Actions&lt;/button&gt;&#10;&#10; &lt;ul class=&quot;lt-popover&quot; id=&quot;$actions$&quot;&gt;&#10; &lt;li&gt;&lt;button class=&quot;lt-button&quot; data-variant=&quot;ghost&quot; type=&quot;button&quot;&gt;Archive the case&lt;/button&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;button class=&quot;lt-button&quot; data-variant=&quot;ghost&quot; type=&quot;button&quot;&gt;Download as PDF&lt;/button&gt;&lt;/li&gt;&#10; &lt;/ul&gt;&#10;&lt;/lt-popover&gt;" description="A panel that hangs from a button and closes itself. A button and a panel with the class `lt-popover` and an id from the template; the component sets `popover` and `aria-controls` where the markup came without them, but never the id." toReformat="false" toShortenFQNames="false">
27
- <variable name="menu" expression="" defaultValue="&quot;menu&quot;" alwaysStopAt="true" />
28
- <variable name="actions" expression="" defaultValue="&quot;actions&quot;" alwaysStopAt="true" />
26
+ <template name="lt-popover" value="&lt;!-- The component sets `popover` and `aria-controls`. You write the id on&#10; the panel: that is what the button points to. --&gt;&#10;&lt;lt-popover id=&quot;$menu$&quot; placement=&quot;bottom-end&quot;&gt;&#10; &lt;button class=&quot;lt-button&quot; data-variant=&quot;secondary&quot; type=&quot;button&quot;&gt;Actions&lt;/button&gt;&#10;&#10; &lt;ul class=&quot;lt-popover&quot; id=&quot;$actions$&quot;&gt;&#10; &lt;li&gt;&lt;button class=&quot;lt-button&quot; data-variant=&quot;ghost&quot; type=&quot;button&quot;&gt;Mark LDG-117 returned&lt;/button&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;button class=&quot;lt-button&quot; data-variant=&quot;ghost&quot; type=&quot;button&quot;&gt;Charge the late fee&lt;/button&gt;&lt;/li&gt;&#10; &lt;/ul&gt;&#10;&lt;/lt-popover&gt;" description="A panel that hangs from a button and closes itself. A button and a panel with the class `lt-popover` and an id from the template; the component sets `popover` and `aria-controls` where the markup came without them, but never the id." toReformat="false" toShortenFQNames="false">
27
+ <variable name="menu" expression="" defaultValue="" alwaysStopAt="true" />
28
+ <variable name="actions" expression="" defaultValue="" alwaysStopAt="true" />
29
29
  <context>
30
30
  <option name="HTML" value="true" />
31
31
  </context>
32
32
  </template>
33
- <template name="lt-suggestion" value="&lt;!-- You write for and id, so the field has a name without JavaScript. The&#10; component sets the roles and the wiring to the list. You write the&#10; status element: that is where the number of matches is announced. --&gt;&#10;&lt;lt-suggestion id=&quot;$airport_search$&quot;&gt;&#10; &lt;label class=&quot;lt-label&quot; for=&quot;$airport$&quot;&gt;Airport&lt;/label&gt;&#10; &lt;input class=&quot;lt-input&quot; id=&quot;$airport$&quot; name=&quot;airport&quot; type=&quot;text&quot;&gt;&#10; &lt;ul class=&quot;lt-suggestion__list&quot;&gt;&#10; &lt;li&gt;Bergen&lt;/li&gt;&#10; &lt;li&gt;Malmö&lt;/li&gt;&#10; &lt;/ul&gt;&#10; &lt;p class=&quot;lt-suggestion__empty&quot;&gt;No matches&lt;/p&gt;&#10; &lt;span class=&quot;lt-sr-only&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&#10;&lt;/lt-suggestion&gt;" description="Field with a suggestion list. A `&lt;label for&gt;`, an `&lt;input id&gt;`, an `.lt-suggestion__list` with `&lt;li&gt;` items and a `[role=status]` are enough; the component sets the roles and the wiring where the markup came without them, and gives the list and the options ids. The field never gets an id from the component. Filters as the user types, moves the highlight with the arrow keys and announces the number of matches." toReformat="false" toShortenFQNames="false">
34
- <variable name="airport_search" expression="" defaultValue="&quot;airport-search&quot;" alwaysStopAt="true" />
35
- <variable name="airport" expression="" defaultValue="&quot;airport&quot;" alwaysStopAt="true" />
33
+ <template name="lt-suggestion" value="&lt;!-- You write for and id, so the field has a name without JavaScript. The&#10; component sets the roles and the wiring to the list. You write the&#10; status element: that is where the number of matches is announced. --&gt;&#10;&lt;lt-suggestion id=&quot;$breaker_search$&quot;&gt;&#10; &lt;label class=&quot;lt-label&quot; for=&quot;$breaker$&quot;&gt;Breaker&lt;/label&gt;&#10; &lt;input class=&quot;lt-input&quot; id=&quot;$breaker$&quot; name=&quot;breaker&quot; type=&quot;text&quot;&gt;&#10; &lt;ul class=&quot;lt-suggestion__list&quot;&gt;&#10; &lt;li&gt;Crowbar&lt;/li&gt;&#10; &lt;li&gt;Needle&lt;/li&gt;&#10; &lt;/ul&gt;&#10; &lt;p class=&quot;lt-suggestion__empty&quot;&gt;No matches&lt;/p&gt;&#10; &lt;span class=&quot;lt-sr-only&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&#10;&lt;/lt-suggestion&gt;" description="Field with a suggestion list. A `&lt;label for&gt;`, an `&lt;input id&gt;`, an `.lt-suggestion__list` with `&lt;li&gt;` items and a `[role=status]` are enough; the component sets the roles and the wiring where the markup came without them, and gives the list and the options ids. The field never gets an id from the component. Filters as the user types, moves the highlight with the arrow keys and announces the number of matches." toReformat="false" toShortenFQNames="false">
34
+ <variable name="breaker_search" expression="" defaultValue="" alwaysStopAt="true" />
35
+ <variable name="breaker" expression="" defaultValue="" alwaysStopAt="true" />
36
36
  <context>
37
37
  <option name="HTML" value="true" />
38
38
  </context>
39
39
  </template>
40
- <template name="lt-dialog" value="&lt;lt-dialog open&gt;&#10; &lt;dialog class=&quot;lt-dialog&quot; open&gt;&#10; &lt;h2&gt;The decision is registered&lt;/h2&gt;&#10; &lt;div class=&quot;lt-dialog__body&quot;&gt;&#10; &lt;p&gt;The case is closed and has been sent to the archive.&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;form method=&quot;dialog&quot; class=&quot;lt-dialog__footer&quot;&gt;&#10; &lt;button class=&quot;lt-button&quot; value=&quot;close&quot;&gt;Close&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;/dialog&gt;&#10;&lt;/lt-dialog&gt;" description="Makes a `&lt;dialog class=&quot;lt-dialog&quot;&gt;` modal with `showModal()`, for servers that cannot call it themselves. The host around the dialog. Gives the dialog its name from the first heading outside `lt-dialog__body` when neither `aria-labelledby` nor `aria-label` is there." toReformat="false" toShortenFQNames="false">
40
+ <template name="lt-dialog" value="&lt;lt-dialog open&gt;&#10; &lt;dialog class=&quot;lt-dialog&quot; open&gt;&#10; &lt;h2&gt;The order is placed&lt;/h2&gt;&#10; &lt;div class=&quot;lt-dialog__body&quot;&gt;&#10; &lt;p&gt;Job 222-0481 is open to crews.&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;form method=&quot;dialog&quot; class=&quot;lt-dialog__footer&quot;&gt;&#10; &lt;button class=&quot;lt-button&quot; value=&quot;close&quot;&gt;Close&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;/dialog&gt;&#10;&lt;/lt-dialog&gt;" description="Makes a `&lt;dialog class=&quot;lt-dialog&quot;&gt;` modal with `showModal()`, for servers that cannot call it themselves. The host around the dialog. Gives the dialog its name from the first heading outside `lt-dialog__body` when neither `aria-labelledby` nor `aria-label` is there." toReformat="false" toShortenFQNames="false">
41
41
  <context>
42
42
  <option name="HTML" value="true" />
43
43
  </context>
44
44
  </template>
45
- <template name="lt-toast" value="&lt;lt-toast id=&quot;$messages$&quot; class=&quot;lt-toast&quot; role=&quot;status&quot; aria-live=&quot;polite&quot;&#10; aria-atomic=&quot;false&quot;&#10; aria-label=&quot;Messages&quot; data-ignore-morph&gt;&lt;/lt-toast&gt;&#10;&#10;&lt;button class=&quot;lt-button&quot; id=&quot;$save$&quot; type=&quot;button&quot;&gt;Save application&lt;/button&gt;" description="A queue of short messages in the corner of the screen. The messages are created from script with `show(text, { color, duration })`." toReformat="false" toShortenFQNames="false">
46
- <variable name="messages" expression="" defaultValue="&quot;messages&quot;" alwaysStopAt="true" />
47
- <variable name="save" expression="" defaultValue="&quot;save&quot;" alwaysStopAt="true" />
45
+ <template name="lt-toast" value="&lt;lt-toast id=&quot;$messages$&quot; class=&quot;lt-toast&quot; role=&quot;status&quot; aria-live=&quot;polite&quot;&#10; aria-atomic=&quot;false&quot;&#10; aria-label=&quot;Messages&quot; data-ignore-morph&gt;&lt;/lt-toast&gt;&#10;&#10;&lt;button class=&quot;lt-button&quot; id=&quot;$restart$&quot; type=&quot;button&quot;&gt;Restart relay 14&lt;/button&gt;" description="A queue of short messages in the corner of the screen. The messages are created from script with `show(text, { color, duration })`." toReformat="false" toShortenFQNames="false">
46
+ <variable name="messages" expression="" defaultValue="" alwaysStopAt="true" />
47
+ <variable name="restart" expression="" defaultValue="" alwaysStopAt="true" />
48
48
  <context>
49
49
  <option name="HTML" value="true" />
50
50
  </context>
51
51
  </template>
52
- <template name="lt-session-timeout" value="&lt;lt-session-timeout class=&quot;lt-session-timeout&quot; warn-at=&quot;1500&quot; expires-at=&quot;1800&quot;&#10; data-ignore-morph&gt;&#10; &lt;dialog class=&quot;lt-session-timeout__dialog&quot; role=&quot;alertdialog&quot; aria-labelledby=&quot;$session_title$&quot;&gt;&#10; &lt;h2 class=&quot;lt-session-timeout__title&quot; id=&quot;$session_title$&quot;&gt;You will soon be logged out&lt;/h2&gt;&#10; &lt;p class=&quot;lt-session-timeout__text&quot;&gt;&#10; We will log you out in &lt;span class=&quot;lt-session-timeout__count&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&#10; to protect your information.&#10; &lt;/p&gt;&#10; &lt;span class=&quot;lt-sr-only&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&#10; &lt;form method=&quot;dialog&quot; class=&quot;lt-session-timeout__actions&quot;&gt;&#10; &lt;button class=&quot;lt-button&quot; value=&quot;extend&quot;&gt;Stay logged in&lt;/button&gt;&#10; &lt;button class=&quot;lt-button&quot; data-variant=&quot;secondary&quot; value=&quot;logout&quot;&gt;Log out now&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;/dialog&gt;&#10;&lt;/lt-session-timeout&gt;" description="Warns before a signed-in session expires, and counts down. The renderer writes the dialog and the text inside the element: a `&lt;dialog&gt;` with `.lt-session-timeout__count` for the number, `[role=status]` for the announcement and the buttons in a `&lt;form method=&quot;dialog&quot;&gt;`. Dispatches `session-warn` when the dialog opens, `session-extend` when the user wants to continue, `session-logout` when the user logs out, `session-expired` when time is up, and `session-activity` at most once per `activity-interval` while the user is active, so the app can keep the server session alive." toReformat="false" toShortenFQNames="false">
53
- <variable name="session_title" expression="" defaultValue="&quot;session-title&quot;" alwaysStopAt="true" />
52
+ <template name="lt-session-timeout" value="&lt;lt-session-timeout class=&quot;lt-session-timeout&quot; warn-at=&quot;1500&quot; expires-at=&quot;1800&quot;&#10; data-ignore-morph&gt;&#10; &lt;dialog class=&quot;lt-session-timeout__dialog&quot; role=&quot;alertdialog&quot; aria-labelledby=&quot;$session_title$&quot;&gt;&#10; &lt;h2 class=&quot;lt-session-timeout__title&quot; id=&quot;$session_title$&quot;&gt;Your session is ending&lt;/h2&gt;&#10; &lt;p class=&quot;lt-session-timeout__text&quot;&gt;&#10; Your session on the Lattice ends in &lt;span class=&quot;lt-session-timeout__count&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;.&#10; Unsaved routes will be lost.&#10; &lt;/p&gt;&#10; &lt;span class=&quot;lt-sr-only&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&#10; &lt;form method=&quot;dialog&quot; class=&quot;lt-session-timeout__actions&quot;&gt;&#10; &lt;button class=&quot;lt-button&quot; value=&quot;extend&quot;&gt;Stay connected&lt;/button&gt;&#10; &lt;button class=&quot;lt-button&quot; data-variant=&quot;secondary&quot; value=&quot;logout&quot;&gt;Log out&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;/dialog&gt;&#10;&lt;/lt-session-timeout&gt;" description="Warns before a signed-in session expires, and counts down. The renderer writes the dialog and the text inside the element: a `&lt;dialog&gt;` with `.lt-session-timeout__count` for the number, `[role=status]` for the announcement and the buttons in a `&lt;form method=&quot;dialog&quot;&gt;`. Dispatches `session-warn` when the dialog opens, `session-extend` when the user wants to continue, `session-logout` when the user logs out, `session-expired` when time is up, and `session-activity` at most once per `activity-interval` while the user is active, so the app can keep the server session alive." toReformat="false" toShortenFQNames="false">
53
+ <variable name="session_title" expression="" defaultValue="" alwaysStopAt="true" />
54
54
  <context>
55
55
  <option name="HTML" value="true" />
56
56
  </context>