@lo-tek/interfaces 0.0.0-stage → 0.37.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 (456) hide show
  1. package/CHANGELOG.md +3254 -0
  2. package/LICENSE +21 -0
  3. package/README.md +129 -2
  4. package/agent/astro.md +400 -0
  5. package/agent/bundles.md +429 -0
  6. package/agent/datastar.md +409 -0
  7. package/agent/html.md +388 -0
  8. package/agent/react.md +440 -0
  9. package/agent/templates.md +472 -0
  10. package/core/lotek-core.wasm +0 -0
  11. package/core/lotek.wasm +0 -0
  12. package/dist/cli.d.ts +12 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +14 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/components/css/accordion/accordion.d.ts +37 -0
  17. package/dist/components/css/accordion/accordion.d.ts.map +1 -0
  18. package/dist/components/css/accordion/accordion.js +31 -0
  19. package/dist/components/css/accordion/accordion.js.map +1 -0
  20. package/dist/components/css/alert/alert.d.ts +35 -0
  21. package/dist/components/css/alert/alert.d.ts.map +1 -0
  22. package/dist/components/css/alert/alert.js +29 -0
  23. package/dist/components/css/alert/alert.js.map +1 -0
  24. package/dist/components/css/avatar/avatar.d.ts +40 -0
  25. package/dist/components/css/avatar/avatar.d.ts.map +1 -0
  26. package/dist/components/css/avatar/avatar.js +30 -0
  27. package/dist/components/css/avatar/avatar.js.map +1 -0
  28. package/dist/components/css/badge/badge.d.ts +24 -0
  29. package/dist/components/css/badge/badge.d.ts.map +1 -0
  30. package/dist/components/css/badge/badge.js +24 -0
  31. package/dist/components/css/badge/badge.js.map +1 -0
  32. package/dist/components/css/breadcrumbs/breadcrumbs.d.ts +26 -0
  33. package/dist/components/css/breadcrumbs/breadcrumbs.d.ts.map +1 -0
  34. package/dist/components/css/breadcrumbs/breadcrumbs.js +24 -0
  35. package/dist/components/css/breadcrumbs/breadcrumbs.js.map +1 -0
  36. package/dist/components/css/button/button.d.ts +26 -0
  37. package/dist/components/css/button/button.d.ts.map +1 -0
  38. package/dist/components/css/button/button.js +25 -0
  39. package/dist/components/css/button/button.js.map +1 -0
  40. package/dist/components/css/card/card.d.ts +36 -0
  41. package/dist/components/css/card/card.d.ts.map +1 -0
  42. package/dist/components/css/card/card.js +28 -0
  43. package/dist/components/css/card/card.js.map +1 -0
  44. package/dist/components/css/checkbox/checkbox.d.ts +32 -0
  45. package/dist/components/css/checkbox/checkbox.d.ts.map +1 -0
  46. package/dist/components/css/checkbox/checkbox.js +27 -0
  47. package/dist/components/css/checkbox/checkbox.js.map +1 -0
  48. package/dist/components/css/divider/divider.d.ts +29 -0
  49. package/dist/components/css/divider/divider.d.ts.map +1 -0
  50. package/dist/components/css/divider/divider.js +23 -0
  51. package/dist/components/css/divider/divider.js.map +1 -0
  52. package/dist/components/css/error-text/error-text.d.ts +24 -0
  53. package/dist/components/css/error-text/error-text.d.ts.map +1 -0
  54. package/dist/components/css/error-text/error-text.js +18 -0
  55. package/dist/components/css/error-text/error-text.js.map +1 -0
  56. package/dist/components/css/fieldset/fieldset.d.ts +55 -0
  57. package/dist/components/css/fieldset/fieldset.d.ts.map +1 -0
  58. package/dist/components/css/fieldset/fieldset.js +39 -0
  59. package/dist/components/css/fieldset/fieldset.js.map +1 -0
  60. package/dist/components/css/file-upload/file-upload.d.ts +41 -0
  61. package/dist/components/css/file-upload/file-upload.d.ts.map +1 -0
  62. package/dist/components/css/file-upload/file-upload.js +32 -0
  63. package/dist/components/css/file-upload/file-upload.js.map +1 -0
  64. package/dist/components/css/heading/heading.d.ts +29 -0
  65. package/dist/components/css/heading/heading.d.ts.map +1 -0
  66. package/dist/components/css/heading/heading.js +23 -0
  67. package/dist/components/css/heading/heading.js.map +1 -0
  68. package/dist/components/css/help-text/help-text.d.ts +24 -0
  69. package/dist/components/css/help-text/help-text.d.ts.map +1 -0
  70. package/dist/components/css/help-text/help-text.js +23 -0
  71. package/dist/components/css/help-text/help-text.js.map +1 -0
  72. package/dist/components/css/icon/icon.d.ts +34 -0
  73. package/dist/components/css/icon/icon.d.ts.map +1 -0
  74. package/dist/components/css/icon/icon.js +25 -0
  75. package/dist/components/css/icon/icon.js.map +1 -0
  76. package/dist/components/css/input/input.d.ts +40 -0
  77. package/dist/components/css/input/input.d.ts.map +1 -0
  78. package/dist/components/css/input/input.js +45 -0
  79. package/dist/components/css/input/input.js.map +1 -0
  80. package/dist/components/css/label/label.d.ts +33 -0
  81. package/dist/components/css/label/label.d.ts.map +1 -0
  82. package/dist/components/css/label/label.js +23 -0
  83. package/dist/components/css/label/label.js.map +1 -0
  84. package/dist/components/css/link/link.d.ts +28 -0
  85. package/dist/components/css/link/link.d.ts.map +1 -0
  86. package/dist/components/css/link/link.js +20 -0
  87. package/dist/components/css/link/link.js.map +1 -0
  88. package/dist/components/css/list/list.d.ts +31 -0
  89. package/dist/components/css/list/list.d.ts.map +1 -0
  90. package/dist/components/css/list/list.js +25 -0
  91. package/dist/components/css/list/list.js.map +1 -0
  92. package/dist/components/css/pagination/pagination.d.ts +27 -0
  93. package/dist/components/css/pagination/pagination.d.ts.map +1 -0
  94. package/dist/components/css/pagination/pagination.js +25 -0
  95. package/dist/components/css/pagination/pagination.js.map +1 -0
  96. package/dist/components/css/paragraph/paragraph.d.ts +36 -0
  97. package/dist/components/css/paragraph/paragraph.d.ts.map +1 -0
  98. package/dist/components/css/paragraph/paragraph.js +26 -0
  99. package/dist/components/css/paragraph/paragraph.js.map +1 -0
  100. package/dist/components/css/progress/progress.d.ts +53 -0
  101. package/dist/components/css/progress/progress.d.ts.map +1 -0
  102. package/dist/components/css/progress/progress.js +38 -0
  103. package/dist/components/css/progress/progress.js.map +1 -0
  104. package/dist/components/css/radio/radio.d.ts +32 -0
  105. package/dist/components/css/radio/radio.d.ts.map +1 -0
  106. package/dist/components/css/radio/radio.js +27 -0
  107. package/dist/components/css/radio/radio.js.map +1 -0
  108. package/dist/components/css/search/search.d.ts +34 -0
  109. package/dist/components/css/search/search.d.ts.map +1 -0
  110. package/dist/components/css/search/search.js +32 -0
  111. package/dist/components/css/search/search.js.map +1 -0
  112. package/dist/components/css/select/select.d.ts +40 -0
  113. package/dist/components/css/select/select.d.ts.map +1 -0
  114. package/dist/components/css/select/select.js +31 -0
  115. package/dist/components/css/select/select.js.map +1 -0
  116. package/dist/components/css/shared.d.ts +90 -0
  117. package/dist/components/css/shared.d.ts.map +1 -0
  118. package/dist/components/css/shared.js +167 -0
  119. package/dist/components/css/shared.js.map +1 -0
  120. package/dist/components/css/skeleton/skeleton.d.ts +29 -0
  121. package/dist/components/css/skeleton/skeleton.d.ts.map +1 -0
  122. package/dist/components/css/skeleton/skeleton.js +23 -0
  123. package/dist/components/css/skeleton/skeleton.js.map +1 -0
  124. package/dist/components/css/skip-link/skip-link.d.ts +18 -0
  125. package/dist/components/css/skip-link/skip-link.d.ts.map +1 -0
  126. package/dist/components/css/skip-link/skip-link.js +16 -0
  127. package/dist/components/css/skip-link/skip-link.js.map +1 -0
  128. package/dist/components/css/spinner/spinner.d.ts +33 -0
  129. package/dist/components/css/spinner/spinner.d.ts.map +1 -0
  130. package/dist/components/css/spinner/spinner.js +25 -0
  131. package/dist/components/css/spinner/spinner.js.map +1 -0
  132. package/dist/components/css/sr-only/sr-only.d.ts +17 -0
  133. package/dist/components/css/sr-only/sr-only.d.ts.map +1 -0
  134. package/dist/components/css/sr-only/sr-only.js +15 -0
  135. package/dist/components/css/sr-only/sr-only.js.map +1 -0
  136. package/dist/components/css/switch/switch.d.ts +37 -0
  137. package/dist/components/css/switch/switch.d.ts.map +1 -0
  138. package/dist/components/css/switch/switch.js +29 -0
  139. package/dist/components/css/switch/switch.js.map +1 -0
  140. package/dist/components/css/table/table.d.ts +76 -0
  141. package/dist/components/css/table/table.d.ts.map +1 -0
  142. package/dist/components/css/table/table.js +59 -0
  143. package/dist/components/css/table/table.js.map +1 -0
  144. package/dist/components/css/tag/tag.d.ts +35 -0
  145. package/dist/components/css/tag/tag.d.ts.map +1 -0
  146. package/dist/components/css/tag/tag.js +27 -0
  147. package/dist/components/css/tag/tag.js.map +1 -0
  148. package/dist/components/css/textarea/textarea.d.ts +23 -0
  149. package/dist/components/css/textarea/textarea.d.ts.map +1 -0
  150. package/dist/components/css/textarea/textarea.js +18 -0
  151. package/dist/components/css/textarea/textarea.js.map +1 -0
  152. package/dist/components/css/toggle-group/toggle-group.d.ts +31 -0
  153. package/dist/components/css/toggle-group/toggle-group.d.ts.map +1 -0
  154. package/dist/components/css/toggle-group/toggle-group.js +29 -0
  155. package/dist/components/css/toggle-group/toggle-group.js.map +1 -0
  156. package/dist/components/css/tooltip/tooltip.d.ts +31 -0
  157. package/dist/components/css/tooltip/tooltip.d.ts.map +1 -0
  158. package/dist/components/css/tooltip/tooltip.js +29 -0
  159. package/dist/components/css/tooltip/tooltip.js.map +1 -0
  160. package/dist/components/default-texts.d.ts +35 -0
  161. package/dist/components/default-texts.d.ts.map +1 -0
  162. package/dist/components/default-texts.js +35 -0
  163. package/dist/components/default-texts.js.map +1 -0
  164. package/dist/components/events.d.ts +77 -0
  165. package/dist/components/events.d.ts.map +1 -0
  166. package/dist/components/events.js +3 -0
  167. package/dist/components/events.js.map +1 -0
  168. package/dist/components/frame/dialog/dialog.d.ts +122 -0
  169. package/dist/components/frame/dialog/dialog.d.ts.map +1 -0
  170. package/dist/components/frame/dialog/dialog.js +112 -0
  171. package/dist/components/frame/dialog/dialog.js.map +1 -0
  172. package/dist/components/frame/dialog/lt-dialog.d.ts +104 -0
  173. package/dist/components/frame/dialog/lt-dialog.d.ts.map +1 -0
  174. package/dist/components/frame/dialog/lt-dialog.js +431 -0
  175. package/dist/components/frame/dialog/lt-dialog.js.map +1 -0
  176. package/dist/components/frame/error-summary/error-summary.d.ts +40 -0
  177. package/dist/components/frame/error-summary/error-summary.d.ts.map +1 -0
  178. package/dist/components/frame/error-summary/error-summary.js +32 -0
  179. package/dist/components/frame/error-summary/error-summary.js.map +1 -0
  180. package/dist/components/frame/error-summary/lt-error-summary.d.ts +82 -0
  181. package/dist/components/frame/error-summary/lt-error-summary.d.ts.map +1 -0
  182. package/dist/components/frame/error-summary/lt-error-summary.js +302 -0
  183. package/dist/components/frame/error-summary/lt-error-summary.js.map +1 -0
  184. package/dist/components/frame/field/field-core.d.ts +92 -0
  185. package/dist/components/frame/field/field-core.d.ts.map +1 -0
  186. package/dist/components/frame/field/field-core.js +63 -0
  187. package/dist/components/frame/field/field-core.js.map +1 -0
  188. package/dist/components/frame/field/lt-field.d.ts +173 -0
  189. package/dist/components/frame/field/lt-field.d.ts.map +1 -0
  190. package/dist/components/frame/field/lt-field.js +580 -0
  191. package/dist/components/frame/field/lt-field.js.map +1 -0
  192. package/dist/components/frame/popover/lt-popover.d.ts +132 -0
  193. package/dist/components/frame/popover/lt-popover.d.ts.map +1 -0
  194. package/dist/components/frame/popover/lt-popover.js +490 -0
  195. package/dist/components/frame/popover/lt-popover.js.map +1 -0
  196. package/dist/components/frame/popover/popover.d.ts +49 -0
  197. package/dist/components/frame/popover/popover.d.ts.map +1 -0
  198. package/dist/components/frame/popover/popover.js +64 -0
  199. package/dist/components/frame/popover/popover.js.map +1 -0
  200. package/dist/components/frame/session-timeout/lt-session-timeout.d.ts +198 -0
  201. package/dist/components/frame/session-timeout/lt-session-timeout.d.ts.map +1 -0
  202. package/dist/components/frame/session-timeout/lt-session-timeout.js +573 -0
  203. package/dist/components/frame/session-timeout/lt-session-timeout.js.map +1 -0
  204. package/dist/components/frame/session-timeout/session-timeout.d.ts +113 -0
  205. package/dist/components/frame/session-timeout/session-timeout.d.ts.map +1 -0
  206. package/dist/components/frame/session-timeout/session-timeout.js +101 -0
  207. package/dist/components/frame/session-timeout/session-timeout.js.map +1 -0
  208. package/dist/components/frame/suggestion/lt-suggestion.d.ts +361 -0
  209. package/dist/components/frame/suggestion/lt-suggestion.d.ts.map +1 -0
  210. package/dist/components/frame/suggestion/lt-suggestion.js +1152 -0
  211. package/dist/components/frame/suggestion/lt-suggestion.js.map +1 -0
  212. package/dist/components/frame/suggestion/suggestion.d.ts +143 -0
  213. package/dist/components/frame/suggestion/suggestion.d.ts.map +1 -0
  214. package/dist/components/frame/suggestion/suggestion.js +127 -0
  215. package/dist/components/frame/suggestion/suggestion.js.map +1 -0
  216. package/dist/components/frame/tabs/lt-tabs.d.ts +404 -0
  217. package/dist/components/frame/tabs/lt-tabs.d.ts.map +1 -0
  218. package/dist/components/frame/tabs/lt-tabs.js +1201 -0
  219. package/dist/components/frame/tabs/lt-tabs.js.map +1 -0
  220. package/dist/components/frame/tabs/tabs.d.ts +112 -0
  221. package/dist/components/frame/tabs/tabs.d.ts.map +1 -0
  222. package/dist/components/frame/tabs/tabs.js +107 -0
  223. package/dist/components/frame/tabs/tabs.js.map +1 -0
  224. package/dist/components/host-element.d.ts +135 -0
  225. package/dist/components/host-element.d.ts.map +1 -0
  226. package/dist/components/host-element.js +366 -0
  227. package/dist/components/host-element.js.map +1 -0
  228. package/dist/components/standalone/connection-status/connection-status.d.ts +28 -0
  229. package/dist/components/standalone/connection-status/connection-status.d.ts.map +1 -0
  230. package/dist/components/standalone/connection-status/connection-status.js +22 -0
  231. package/dist/components/standalone/connection-status/connection-status.js.map +1 -0
  232. package/dist/components/standalone/connection-status/lt-connection-status.d.ts +81 -0
  233. package/dist/components/standalone/connection-status/lt-connection-status.d.ts.map +1 -0
  234. package/dist/components/standalone/connection-status/lt-connection-status.js +216 -0
  235. package/dist/components/standalone/connection-status/lt-connection-status.js.map +1 -0
  236. package/dist/components/standalone/toast/lt-toast.d.ts +109 -0
  237. package/dist/components/standalone/toast/lt-toast.d.ts.map +1 -0
  238. package/dist/components/standalone/toast/lt-toast.js +256 -0
  239. package/dist/components/standalone/toast/lt-toast.js.map +1 -0
  240. package/dist/components/standalone/toast/toast.d.ts +52 -0
  241. package/dist/components/standalone/toast/toast.d.ts.map +1 -0
  242. package/dist/components/standalone/toast/toast.js +42 -0
  243. package/dist/components/standalone/toast/toast.js.map +1 -0
  244. package/dist/diagnostics/core.d.ts +137 -0
  245. package/dist/diagnostics/core.d.ts.map +1 -0
  246. package/dist/diagnostics/core.js +72 -0
  247. package/dist/diagnostics/core.js.map +1 -0
  248. package/dist/diagnostics/default-core.d.ts +10 -0
  249. package/dist/diagnostics/default-core.d.ts.map +1 -0
  250. package/dist/diagnostics/default-core.js +72 -0
  251. package/dist/diagnostics/default-core.js.map +1 -0
  252. package/dist/diagnostics/index.d.ts +84 -0
  253. package/dist/diagnostics/index.d.ts.map +1 -0
  254. package/dist/diagnostics/index.js +106 -0
  255. package/dist/diagnostics/index.js.map +1 -0
  256. package/dist/dom.d.ts +55 -0
  257. package/dist/dom.d.ts.map +1 -0
  258. package/dist/dom.js +162 -0
  259. package/dist/dom.js.map +1 -0
  260. package/dist/index.d.ts +97 -0
  261. package/dist/index.d.ts.map +1 -0
  262. package/dist/index.js +58 -0
  263. package/dist/index.js.map +1 -0
  264. package/dist/jsx/react.d.ts +180 -0
  265. package/dist/jsx/react.d.ts.map +1 -0
  266. package/dist/jsx/react.js +2 -0
  267. package/dist/jsx/react.js.map +1 -0
  268. package/dist/lotek.css +3617 -0
  269. package/dist/lt.d.ts +325 -0
  270. package/dist/lt.d.ts.map +1 -0
  271. package/dist/lt.js +183 -0
  272. package/dist/lt.js.map +1 -0
  273. package/dist/react.d.ts +492 -0
  274. package/dist/react.d.ts.map +1 -0
  275. package/dist/react.js +296 -0
  276. package/dist/react.js.map +1 -0
  277. package/dist/register.d.ts +17 -0
  278. package/dist/register.d.ts.map +1 -0
  279. package/dist/register.js +35 -0
  280. package/dist/register.js.map +1 -0
  281. package/dist/tokens/color.d.ts +43 -0
  282. package/dist/tokens/color.d.ts.map +1 -0
  283. package/dist/tokens/color.js +123 -0
  284. package/dist/tokens/color.js.map +1 -0
  285. package/dist/tokens/contract.d.ts +18 -0
  286. package/dist/tokens/contract.d.ts.map +1 -0
  287. package/dist/tokens/contract.js +18 -0
  288. package/dist/tokens/contract.js.map +1 -0
  289. package/dist/tokens/matrix-cells.d.ts +30 -0
  290. package/dist/tokens/matrix-cells.d.ts.map +1 -0
  291. package/dist/tokens/matrix-cells.js +273 -0
  292. package/dist/tokens/matrix-cells.js.map +1 -0
  293. package/dist/tokens/matrix.d.ts +18 -0
  294. package/dist/tokens/matrix.d.ts.map +1 -0
  295. package/dist/tokens/matrix.js +21 -0
  296. package/dist/tokens/matrix.js.map +1 -0
  297. package/dist/tokens/theme-check.d.ts +42 -0
  298. package/dist/tokens/theme-check.d.ts.map +1 -0
  299. package/dist/tokens/theme-check.js +10 -0
  300. package/dist/tokens/theme-check.js.map +1 -0
  301. package/dist/tokens/theme.d.ts +94 -0
  302. package/dist/tokens/theme.d.ts.map +1 -0
  303. package/dist/tokens/theme.js +14 -0
  304. package/dist/tokens/theme.js.map +1 -0
  305. package/dist/tokens/tokens.d.ts +122 -0
  306. package/dist/tokens/tokens.d.ts.map +1 -0
  307. package/dist/tokens/tokens.js +158 -0
  308. package/dist/tokens/tokens.js.map +1 -0
  309. package/dist/vocabulary/classes.d.ts +3 -0
  310. package/dist/vocabulary/classes.d.ts.map +1 -0
  311. package/dist/vocabulary/classes.js +1320 -0
  312. package/dist/vocabulary/classes.js.map +1 -0
  313. package/dist/vocabulary/elements.d.ts +3 -0
  314. package/dist/vocabulary/elements.d.ts.map +1 -0
  315. package/dist/vocabulary/elements.js +410 -0
  316. package/dist/vocabulary/elements.js.map +1 -0
  317. package/dist/vocabulary/types.d.ts +175 -0
  318. package/dist/vocabulary/types.d.ts.map +1 -0
  319. package/dist/vocabulary/types.js +11 -0
  320. package/dist/vocabulary/types.js.map +1 -0
  321. package/dist/wasi-host.d.ts +24 -0
  322. package/dist/wasi-host.d.ts.map +1 -0
  323. package/dist/wasi-host.js +140 -0
  324. package/dist/wasi-host.js.map +1 -0
  325. package/live-templates.xml +62 -0
  326. package/manifest/files.json +373 -0
  327. package/manifest/manifest.json +4965 -0
  328. package/manifest/manifest.schema.json +513 -0
  329. package/package.json +404 -4
  330. package/src/cli.ts +21 -0
  331. package/src/components/css/accordion/accordion.css +102 -0
  332. package/src/components/css/accordion/accordion.ts +50 -0
  333. package/src/components/css/alert/alert.css +53 -0
  334. package/src/components/css/alert/alert.ts +48 -0
  335. package/src/components/css/avatar/avatar.css +96 -0
  336. package/src/components/css/avatar/avatar.ts +57 -0
  337. package/src/components/css/badge/badge.css +42 -0
  338. package/src/components/css/badge/badge.ts +43 -0
  339. package/src/components/css/breadcrumbs/breadcrumbs.css +62 -0
  340. package/src/components/css/breadcrumbs/breadcrumbs.ts +30 -0
  341. package/src/components/css/button/button.css +128 -0
  342. package/src/components/css/button/button.ts +44 -0
  343. package/src/components/css/card/card.css +65 -0
  344. package/src/components/css/card/card.ts +50 -0
  345. package/src/components/css/checkbox/checkbox.css +114 -0
  346. package/src/components/css/checkbox/checkbox.ts +50 -0
  347. package/src/components/css/divider/divider.css +38 -0
  348. package/src/components/css/divider/divider.ts +42 -0
  349. package/src/components/css/error-text/error-text.css +21 -0
  350. package/src/components/css/error-text/error-text.ts +37 -0
  351. package/src/components/css/fieldset/fieldset.css +72 -0
  352. package/src/components/css/fieldset/fieldset.ts +87 -0
  353. package/src/components/css/file-upload/file-upload.css +102 -0
  354. package/src/components/css/file-upload/file-upload.ts +65 -0
  355. package/src/components/css/heading/heading.css +33 -0
  356. package/src/components/css/heading/heading.ts +42 -0
  357. package/src/components/css/help-text/help-text.css +24 -0
  358. package/src/components/css/help-text/help-text.ts +42 -0
  359. package/src/components/css/icon/icon.css +20 -0
  360. package/src/components/css/icon/icon.ts +44 -0
  361. package/src/components/css/input/input.css +145 -0
  362. package/src/components/css/input/input.ts +77 -0
  363. package/src/components/css/label/label.css +42 -0
  364. package/src/components/css/label/label.ts +51 -0
  365. package/src/components/css/link/link.css +38 -0
  366. package/src/components/css/link/link.ts +38 -0
  367. package/src/components/css/list/list.css +53 -0
  368. package/src/components/css/list/list.ts +44 -0
  369. package/src/components/css/pagination/pagination.css +95 -0
  370. package/src/components/css/pagination/pagination.ts +33 -0
  371. package/src/components/css/paragraph/paragraph.css +31 -0
  372. package/src/components/css/paragraph/paragraph.ts +53 -0
  373. package/src/components/css/progress/progress.css +161 -0
  374. package/src/components/css/progress/progress.ts +78 -0
  375. package/src/components/css/radio/radio.css +94 -0
  376. package/src/components/css/radio/radio.ts +50 -0
  377. package/src/components/css/search/search.css +50 -0
  378. package/src/components/css/search/search.ts +56 -0
  379. package/src/components/css/select/select.css +321 -0
  380. package/src/components/css/select/select.ts +63 -0
  381. package/src/components/css/shared.ts +199 -0
  382. package/src/components/css/skeleton/skeleton.css +62 -0
  383. package/src/components/css/skeleton/skeleton.ts +43 -0
  384. package/src/components/css/skip-link/skip-link.css +41 -0
  385. package/src/components/css/skip-link/skip-link.ts +22 -0
  386. package/src/components/css/spinner/spinner.css +48 -0
  387. package/src/components/css/spinner/spinner.ts +48 -0
  388. package/src/components/css/sr-only/sr-only.css +16 -0
  389. package/src/components/css/sr-only/sr-only.ts +21 -0
  390. package/src/components/css/switch/switch.css +105 -0
  391. package/src/components/css/switch/switch.ts +50 -0
  392. package/src/components/css/table/table.css +159 -0
  393. package/src/components/css/table/table.ts +107 -0
  394. package/src/components/css/tag/tag.css +58 -0
  395. package/src/components/css/tag/tag.ts +49 -0
  396. package/src/components/css/textarea/textarea.css +83 -0
  397. package/src/components/css/textarea/textarea.ts +40 -0
  398. package/src/components/css/toggle-group/toggle-group.css +92 -0
  399. package/src/components/css/toggle-group/toggle-group.ts +37 -0
  400. package/src/components/css/tooltip/tooltip.css +89 -0
  401. package/src/components/css/tooltip/tooltip.ts +37 -0
  402. package/src/components/default-texts.ts +34 -0
  403. package/src/components/events.ts +68 -0
  404. package/src/components/frame/dialog/dialog.css +306 -0
  405. package/src/components/frame/dialog/dialog.ts +166 -0
  406. package/src/components/frame/dialog/lt-dialog.ts +510 -0
  407. package/src/components/frame/error-summary/error-summary.css +47 -0
  408. package/src/components/frame/error-summary/error-summary.ts +56 -0
  409. package/src/components/frame/error-summary/lt-error-summary.ts +344 -0
  410. package/src/components/frame/field/field-core.ts +152 -0
  411. package/src/components/frame/field/field.css +17 -0
  412. package/src/components/frame/field/lt-field.ts +753 -0
  413. package/src/components/frame/popover/lt-popover.ts +555 -0
  414. package/src/components/frame/popover/popover.css +50 -0
  415. package/src/components/frame/popover/popover.ts +102 -0
  416. package/src/components/frame/session-timeout/lt-session-timeout.ts +681 -0
  417. package/src/components/frame/session-timeout/session-timeout.css +50 -0
  418. package/src/components/frame/session-timeout/session-timeout.ts +156 -0
  419. package/src/components/frame/suggestion/lt-suggestion.ts +1358 -0
  420. package/src/components/frame/suggestion/suggestion.css +132 -0
  421. package/src/components/frame/suggestion/suggestion.ts +172 -0
  422. package/src/components/frame/tabs/lt-tabs.ts +1319 -0
  423. package/src/components/frame/tabs/tabs.css +128 -0
  424. package/src/components/frame/tabs/tabs.ts +188 -0
  425. package/src/components/host-element.ts +400 -0
  426. package/src/components/standalone/connection-status/connection-status.css +41 -0
  427. package/src/components/standalone/connection-status/connection-status.ts +41 -0
  428. package/src/components/standalone/connection-status/lt-connection-status.ts +242 -0
  429. package/src/components/standalone/toast/lt-toast.ts +300 -0
  430. package/src/components/standalone/toast/toast.css +78 -0
  431. package/src/components/standalone/toast/toast.ts +70 -0
  432. package/src/diagnostics/core.ts +210 -0
  433. package/src/diagnostics/default-core.ts +81 -0
  434. package/src/diagnostics/index.ts +150 -0
  435. package/src/dom.ts +185 -0
  436. package/src/index.ts +218 -0
  437. package/src/jsx/react.ts +212 -0
  438. package/src/lt.ts +192 -0
  439. package/src/react.ts +411 -0
  440. package/src/register.ts +43 -0
  441. package/src/tailwind/tailwind.css +169 -0
  442. package/src/tokens/boundary.css +104 -0
  443. package/src/tokens/color-contract.json +231 -0
  444. package/src/tokens/color.ts +150 -0
  445. package/src/tokens/contract.ts +24 -0
  446. package/src/tokens/matrix-cells.ts +375 -0
  447. package/src/tokens/matrix.ts +32 -0
  448. package/src/tokens/theme-check.ts +51 -0
  449. package/src/tokens/theme.ts +104 -0
  450. package/src/tokens/tokens.css +569 -0
  451. package/src/tokens/tokens.ts +223 -0
  452. package/src/vocabulary/classes.ts +1322 -0
  453. package/src/vocabulary/elements.ts +412 -0
  454. package/src/vocabulary/types.ts +178 -0
  455. package/src/wasi-host.ts +155 -0
  456. package/web-types.json +800 -0
@@ -0,0 +1,113 @@
1
+ export declare const SESSION_TIMEOUT_CLASS: "lt-session-timeout";
2
+ export declare const SESSION_TIMEOUT_DIALOG_CLASS: "lt-session-timeout__dialog";
3
+ export declare const SESSION_TIMEOUT_TITLE_CLASS: "lt-session-timeout__title";
4
+ export declare const SESSION_TIMEOUT_TEXT_CLASS: "lt-session-timeout__text";
5
+ export declare const SESSION_TIMEOUT_COUNT_CLASS: "lt-session-timeout__count";
6
+ export declare const SESSION_TIMEOUT_ACTIONS_CLASS: "lt-session-timeout__actions";
7
+ /** `value` on the button that extends the session. */
8
+ export declare const SESSION_EXTEND: "extend";
9
+ /** `value` on the button that logs out. */
10
+ export declare const SESSION_LOGOUT: "logout";
11
+ export type SessionTimeoutOptions = {
12
+ /** Id of the heading. The dialog takes its name from it with `aria-labelledby`. */
13
+ titleId: string;
14
+ /** Seconds without activity before the warning appears. Default: 25 minutes. */
15
+ warnAt?: number;
16
+ /** Seconds without activity before the session expires. Default: 30 minutes. */
17
+ expiresAt?: number;
18
+ /** Seconds between each `session-activity` while the user is active. Default: 60. */
19
+ activityInterval?: number;
20
+ };
21
+ export type SessionTimeoutAttributes = {
22
+ host: {
23
+ class: typeof SESSION_TIMEOUT_CLASS;
24
+ "warn-at"?: string;
25
+ "expires-at"?: string;
26
+ "activity-interval"?: string;
27
+ "data-ignore-morph": "";
28
+ };
29
+ dialog: {
30
+ class: typeof SESSION_TIMEOUT_DIALOG_CLASS;
31
+ role: "alertdialog";
32
+ "aria-labelledby": string;
33
+ };
34
+ title: {
35
+ class: typeof SESSION_TIMEOUT_TITLE_CLASS;
36
+ id: string;
37
+ };
38
+ /** The paragraph holding the number. The announcement is this paragraph, with the number spoken. */
39
+ text: {
40
+ class: typeof SESSION_TIMEOUT_TEXT_CLASS;
41
+ };
42
+ /** The number. Empty in the markup, and the component fills it in. */
43
+ count: {
44
+ class: typeof SESSION_TIMEOUT_COUNT_CLASS;
45
+ "aria-hidden": "true";
46
+ };
47
+ /** The screen reader announcement. Empty in the markup. */
48
+ live: {
49
+ class: "lt-sr-only";
50
+ role: "status";
51
+ };
52
+ /** The form around the buttons. `method="dialog"` closes the dialog without a script. */
53
+ actions: {
54
+ class: typeof SESSION_TIMEOUT_ACTIONS_CLASS;
55
+ method: "dialog";
56
+ };
57
+ extend: {
58
+ class: "lt-button";
59
+ value: typeof SESSION_EXTEND;
60
+ };
61
+ logout: {
62
+ class: "lt-button";
63
+ "data-variant": "secondary";
64
+ value: typeof SESSION_LOGOUT;
65
+ };
66
+ };
67
+ /**
68
+ * The attributes for the warning that a signed-in session is about to expire.
69
+ *
70
+ * The renderer writes the dialog and all of the text, in its own language and
71
+ * with its own translation tool. The component only keeps time: it opens and
72
+ * closes the dialog, fills in the number and announces the countdown.
73
+ *
74
+ * The buttons are plain buttons in a `<form method="dialog">`. The browser
75
+ * closes the dialog and sets `returnValue` to the button's `value`, and the
76
+ * component reads it. `data-ignore-morph` asks Datastar's morph to leave the
77
+ * warning alone. Without it the morph takes `open` and the number while the
78
+ * dialog is in the top layer. The component puts `open` back, and the number
79
+ * comes back on the next tick. With the attribute the number stays the whole
80
+ * time.
81
+ *
82
+ * ```ts
83
+ * const session = lt.sessionTimeout({ titleId: "session-title" })
84
+ * ```
85
+ * ```html
86
+ * <lt-session-timeout {...session.host}>
87
+ * <dialog {...session.dialog}>
88
+ * <h2 {...session.title}>You will soon be signed out</h2>
89
+ * <p {...session.text}>
90
+ * We will sign you out in <span {...session.count}></span>.
91
+ * </p>
92
+ * <span {...session.live}></span>
93
+ * <form {...session.actions}>
94
+ * <button {...session.extend}>Stay signed in</button>
95
+ * <button {...session.logout}>Sign out now</button>
96
+ * </form>
97
+ * </dialog>
98
+ * </lt-session-timeout>
99
+ * ```
100
+ */
101
+ export declare const sessionTimeout: (({ titleId: givenId, warnAt, expiresAt, activityInterval, }: SessionTimeoutOptions) => SessionTimeoutAttributes) & {
102
+ /** The class on the `<dialog>` itself. */
103
+ dialog: "lt-session-timeout__dialog";
104
+ /** The class on the heading. */
105
+ title: "lt-session-timeout__title";
106
+ /** The class on the paragraph holding the number. */
107
+ text: "lt-session-timeout__text";
108
+ /** The class on the number the component fills in. */
109
+ count: "lt-session-timeout__count";
110
+ /** The class on the form with the buttons. */
111
+ actions: "lt-session-timeout__actions";
112
+ };
113
+ //# sourceMappingURL=session-timeout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-timeout.d.ts","sourceRoot":"","sources":["../../../../src/components/frame/session-timeout/session-timeout.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,EAAG,oBAA6B,CAAA;AAClE,eAAO,MAAM,4BAA4B,EACvC,4BAAqC,CAAA;AACvC,eAAO,MAAM,2BAA2B,EAAG,2BAAoC,CAAA;AAC/E,eAAO,MAAM,0BAA0B,EAAG,0BAAmC,CAAA;AAC7E,eAAO,MAAM,2BAA2B,EAAG,2BAAoC,CAAA;AAC/E,eAAO,MAAM,6BAA6B,EACxC,6BAAsC,CAAA;AAExC,sDAAsD;AACtD,eAAO,MAAM,cAAc,EAAG,QAAiB,CAAA;AAC/C,2CAA2C;AAC3C,eAAO,MAAM,cAAc,EAAG,QAAiB,CAAA;AAE/C,MAAM,MAAM,qBAAqB,GAAG;IAClC,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAA;IACf,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE;QACJ,KAAK,EAAE,OAAO,qBAAqB,CAAA;QACnC,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,mBAAmB,CAAC,EAAE,MAAM,CAAA;QAC5B,mBAAmB,EAAE,EAAE,CAAA;KACxB,CAAA;IACD,MAAM,EAAE;QACN,KAAK,EAAE,OAAO,4BAA4B,CAAA;QAC1C,IAAI,EAAE,aAAa,CAAA;QACnB,iBAAiB,EAAE,MAAM,CAAA;KAC1B,CAAA;IACD,KAAK,EAAE;QAAE,KAAK,EAAE,OAAO,2BAA2B,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IAChE,oGAAoG;IACpG,IAAI,EAAE;QAAE,KAAK,EAAE,OAAO,0BAA0B,CAAA;KAAE,CAAA;IAClD,sEAAsE;IACtE,KAAK,EAAE;QAAE,KAAK,EAAE,OAAO,2BAA2B,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3E,2DAA2D;IAC3D,IAAI,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAA;IAC7C,yFAAyF;IACzF,OAAO,EAAE;QAAE,KAAK,EAAE,OAAO,6BAA6B,CAAC;QAAC,MAAM,EAAE,QAAQ,CAAA;KAAE,CAAA;IAC1E,MAAM,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,OAAO,cAAc,CAAA;KAAE,CAAA;IAC5D,MAAM,EAAE;QACN,KAAK,EAAE,WAAW,CAAA;QAClB,cAAc,EAAE,WAAW,CAAA;QAC3B,KAAK,EAAE,OAAO,cAAc,CAAA;KAC7B,CAAA;CACF,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,cAAc,gEAMtB,qBAAqB,KAAG,wBAAwB;IA+CjD,0CAA0C;;IAE1C,gCAAgC;;IAEhC,qDAAqD;;IAErD,sDAAsD;;IAEtD,8CAA8C;;CAGjD,CAAA"}
@@ -0,0 +1,101 @@
1
+ import { attributes, idOrFallback } from "../../css/shared.js";
2
+ export const SESSION_TIMEOUT_CLASS = "lt-session-timeout";
3
+ export const SESSION_TIMEOUT_DIALOG_CLASS = "lt-session-timeout__dialog";
4
+ export const SESSION_TIMEOUT_TITLE_CLASS = "lt-session-timeout__title";
5
+ export const SESSION_TIMEOUT_TEXT_CLASS = "lt-session-timeout__text";
6
+ export const SESSION_TIMEOUT_COUNT_CLASS = "lt-session-timeout__count";
7
+ export const SESSION_TIMEOUT_ACTIONS_CLASS = "lt-session-timeout__actions";
8
+ /** `value` on the button that extends the session. */
9
+ export const SESSION_EXTEND = "extend";
10
+ /** `value` on the button that logs out. */
11
+ export const SESSION_LOGOUT = "logout";
12
+ /**
13
+ * The attributes for the warning that a signed-in session is about to expire.
14
+ *
15
+ * The renderer writes the dialog and all of the text, in its own language and
16
+ * with its own translation tool. The component only keeps time: it opens and
17
+ * closes the dialog, fills in the number and announces the countdown.
18
+ *
19
+ * The buttons are plain buttons in a `<form method="dialog">`. The browser
20
+ * closes the dialog and sets `returnValue` to the button's `value`, and the
21
+ * component reads it. `data-ignore-morph` asks Datastar's morph to leave the
22
+ * warning alone. Without it the morph takes `open` and the number while the
23
+ * dialog is in the top layer. The component puts `open` back, and the number
24
+ * comes back on the next tick. With the attribute the number stays the whole
25
+ * time.
26
+ *
27
+ * ```ts
28
+ * const session = lt.sessionTimeout({ titleId: "session-title" })
29
+ * ```
30
+ * ```html
31
+ * <lt-session-timeout {...session.host}>
32
+ * <dialog {...session.dialog}>
33
+ * <h2 {...session.title}>You will soon be signed out</h2>
34
+ * <p {...session.text}>
35
+ * We will sign you out in <span {...session.count}></span>.
36
+ * </p>
37
+ * <span {...session.live}></span>
38
+ * <form {...session.actions}>
39
+ * <button {...session.extend}>Stay signed in</button>
40
+ * <button {...session.logout}>Sign out now</button>
41
+ * </form>
42
+ * </dialog>
43
+ * </lt-session-timeout>
44
+ * ```
45
+ */
46
+ export const sessionTimeout = Object.assign(({ titleId: givenId, warnAt = 25 * 60, expiresAt = 30 * 60, activityInterval = 60, }) => {
47
+ // The fallback only matters to someone without a type check.
48
+ const titleId = idOrFallback("lt.sessionTimeout()", givenId, "titleId");
49
+ return {
50
+ host: attributes({
51
+ class: SESSION_TIMEOUT_CLASS,
52
+ "warn-at": warnAt === 25 * 60 ? undefined : String(warnAt),
53
+ "expires-at": expiresAt === 30 * 60 ? undefined : String(expiresAt),
54
+ "activity-interval": activityInterval === 60 ? undefined : String(activityInterval),
55
+ "data-ignore-morph": "",
56
+ }),
57
+ dialog: attributes({
58
+ class: SESSION_TIMEOUT_DIALOG_CLASS,
59
+ // alertdialog and not dialog: the warning is an interruption the user did
60
+ // not ask for, and then the screen reader should read all of the content
61
+ // when it opens.
62
+ role: "alertdialog",
63
+ "aria-labelledby": titleId,
64
+ }),
65
+ title: attributes({ class: SESSION_TIMEOUT_TITLE_CLASS, id: titleId }),
66
+ text: attributes({ class: SESSION_TIMEOUT_TEXT_CLASS }),
67
+ count: attributes({
68
+ class: SESSION_TIMEOUT_COUNT_CLASS,
69
+ "aria-hidden": "true",
70
+ }),
71
+ live: attributes({
72
+ class: "lt-sr-only",
73
+ role: "status",
74
+ }),
75
+ actions: attributes({
76
+ class: SESSION_TIMEOUT_ACTIONS_CLASS,
77
+ method: "dialog",
78
+ }),
79
+ extend: attributes({
80
+ class: "lt-button",
81
+ value: SESSION_EXTEND,
82
+ }),
83
+ logout: attributes({
84
+ class: "lt-button",
85
+ "data-variant": "secondary",
86
+ value: SESSION_LOGOUT,
87
+ }),
88
+ };
89
+ }, {
90
+ /** The class on the `<dialog>` itself. */
91
+ dialog: SESSION_TIMEOUT_DIALOG_CLASS,
92
+ /** The class on the heading. */
93
+ title: SESSION_TIMEOUT_TITLE_CLASS,
94
+ /** The class on the paragraph holding the number. */
95
+ text: SESSION_TIMEOUT_TEXT_CLASS,
96
+ /** The class on the number the component fills in. */
97
+ count: SESSION_TIMEOUT_COUNT_CLASS,
98
+ /** The class on the form with the buttons. */
99
+ actions: SESSION_TIMEOUT_ACTIONS_CLASS,
100
+ });
101
+ //# sourceMappingURL=session-timeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-timeout.js","sourceRoot":"","sources":["../../../../src/components/frame/session-timeout/session-timeout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,361 @@
1
+ import { HostElement } from "../../host-element.js";
2
+ export declare const LT_SUGGESTION_TAG: "lt-suggestion";
3
+ /**
4
+ * The parts the suggestion field finds, as selectors relative to the element.
5
+ * The web component finds its parts with these, and the manifest describes
6
+ * them for whoever writes the markup by hand, so the two cannot disagree.
7
+ */
8
+ export declare const LT_SUGGESTION_PARTS: {
9
+ /** The field: the role when present, otherwise the first input. */
10
+ readonly control: "[role='combobox'], input:not([type='hidden'])";
11
+ /** The list: the role when present, otherwise the class. */
12
+ readonly list: "[role='listbox'], .lt-suggestion__list";
13
+ /** An option: the role when present, otherwise an `<li>` without a role in the list. */
14
+ readonly option: "[role='option'], .lt-suggestion__list > li:not([role])";
15
+ readonly empty: ".lt-suggestion__empty";
16
+ readonly status: "[role='status']";
17
+ /** The hidden field that receives the code of the option the user chose. */
18
+ readonly value: "input.lt-suggestion__value";
19
+ };
20
+ /**
21
+ * The keyboard and the filtering in a field with a suggestion list.
22
+ *
23
+ * The server writes the field and the list. When the markup is made with
24
+ * JavaScript, `lt.suggestion()` writes the roles, the ids and the wiring.
25
+ * When it comes from a template without JavaScript, the template writes
26
+ * `for` on the label and `id` on the field, or wraps the field in the label,
27
+ * which HTML requires for the field to have a name without JavaScript. The
28
+ * rest is enough: a `.lt-suggestion__list` with `<li>` and a
29
+ * `[role="status"]`. The web component sets the roles, gives the list and the
30
+ * options ids, connects the list to the field, and closes the list until the
31
+ * user touches the field. Only what is missing, so what the server wrote
32
+ * stays.
33
+ *
34
+ * The web component never writes an id on the field. Datastar and idiomorph
35
+ * recognise a node by its id, and a field with an id the server did not send
36
+ * is replaced on the next update, along with focus and what the user has
37
+ * typed.
38
+ *
39
+ * The field always shows the option's text. If the server has written a
40
+ * hidden `.lt-suggestion__value`, it receives the code from `data-value`, or
41
+ * the text when the option has none. Without JavaScript the text is
42
+ * submitted, and the server looks it up. The web component renders nothing.
43
+ * It used to create the whole field itself, and then there was neither a
44
+ * label nor an input before the script had run, and nothing was included in
45
+ * the submission.
46
+ *
47
+ * What the web component does is what the browser does not: it filters the
48
+ * options while the user types, moves the highlight with the arrow keys, and
49
+ * keeps `aria-activedescendant` in sync so the screen reader announces the
50
+ * option without focus leaving the field.
51
+ *
52
+ * If something else has already filtered, a server or a React component that
53
+ * renders only the matches, `prefiltered` says so, and the web component
54
+ * leaves the options alone.
55
+ *
56
+ * ```html
57
+ * <lt-suggestion>
58
+ * <label class="lt-label" for="city">City</label>
59
+ * <input class="lt-input" id="city" role="combobox" aria-controls="city-list"
60
+ * aria-expanded="false" aria-autocomplete="list" autocomplete="off"
61
+ * aria-describedby="city-status">
62
+ * <ul class="lt-suggestion__list" id="city-list" role="listbox" hidden>
63
+ * <li class="lt-suggestion__option" id="city-option-0" role="option">Bergen</li>
64
+ * </ul>
65
+ * <p class="lt-suggestion__empty">No matches</p>
66
+ * <span class="lt-sr-only" id="city-status" role="status"></span>
67
+ * </lt-suggestion>
68
+ * ```
69
+ */
70
+ export declare class LtSuggestion extends HostElement {
71
+ static observedAttributes: readonly ["prefiltered", "server-controlled", "count-none", "count-zero", "count-one", "count-two", "count-few", "count-many", "count-other"];
72
+ private observer?;
73
+ private control?;
74
+ private list?;
75
+ private empty?;
76
+ /** The options that already have their listener. */
77
+ private readonly bound;
78
+ /** The ids the web component created, per node, so a patch gets the same ones back. */
79
+ private readonly ids;
80
+ /** The roles the web component set. See `derivedParts`. */
81
+ private readonly roledByMe;
82
+ /** True while the web component dispatches events, so it does not answer itself. */
83
+ private choosing;
84
+ /**
85
+ * The text and code of the choice in the field, when the value field is in
86
+ * use.
87
+ *
88
+ * The pair is what the code in the value field applies to. If the user
89
+ * changes the text, the code no longer applies, and the value field is
90
+ * emptied; otherwise the form would submit the code for Bergen with the
91
+ * text "Bodø" in the field. If the text is still there after an update, the
92
+ * code is set back: the value field's `value` is an attribute, and a morph
93
+ * writes the server's over what the web component set.
94
+ */
95
+ private chosen?;
96
+ /**
97
+ * What the server sent as text and code, the last time something other
98
+ * than the web component wrote the code. When the form is reset, the text
99
+ * goes back to the server's, and the code must follow: a hidden field has
100
+ * no default value of its own to go back to, since the web component
101
+ * writes the code as an attribute.
102
+ */
103
+ private serverChoice?;
104
+ /** The code the web component wrote last. If something else is there, the server wrote it. */
105
+ private writtenCode?;
106
+ /** The form listened to for `reset`. Follows the field, which a patch can move. */
107
+ private boundForm?;
108
+ /** The `for` the web component wrote on the label. */
109
+ private readonly forByMe;
110
+ /**
111
+ * The name the web component gave the list, per list: `aria-labelledby`
112
+ * pointing to the label, or `aria-label` with its text. If something else
113
+ * is there, the server wrote it, and it stays.
114
+ */
115
+ private readonly listNameByMe;
116
+ /**
117
+ * Labels where the server wrote a `for` pointing to another id. Reported
118
+ * once; the memory is not reset, since the rewritten `for` cannot be told
119
+ * apart from a server that corrected itself.
120
+ */
121
+ private readonly wrongFor;
122
+ /**
123
+ * Whether the list is open, and which option is highlighted.
124
+ *
125
+ * Both come from the user: she typed something, and she moves with the
126
+ * arrow keys. None of it is in the HTML the server sent, so a morph strips
127
+ * it. The template used to list `aria-expanded`, `aria-activedescendant`
128
+ * and `hidden` in `data-preserve-attr`. Now the web component sets it back,
129
+ * as long as the morph keeps the field. It only does so when the id
130
+ * matches, see `warnAboutReplacedControl`.
131
+ */
132
+ private wantOpen?;
133
+ /**
134
+ * The highlighted option, remembered by both id and text.
135
+ *
136
+ * The ids from `lt.suggestion()` are positional, so a new list from the
137
+ * server reuses them. With the id alone the web component put the
138
+ * highlight back on option number two in an entirely different list, and
139
+ * the screen reader announced a place the user never navigated to. The
140
+ * text is the identity; the id is only where `aria-activedescendant`
141
+ * points.
142
+ */
143
+ private active?;
144
+ /**
145
+ * The count last announced, when something else filters.
146
+ *
147
+ * Only changes are announced, and the first count is the starting point,
148
+ * not news. See `announceFiltered`.
149
+ */
150
+ private announcedCount?;
151
+ /**
152
+ * The text last written in the status element.
153
+ *
154
+ * The text is not in the server's version, so an update that sends the
155
+ * region again empties the element. `repair()` writes it back.
156
+ */
157
+ private announcedText?;
158
+ connectedCallback(): void;
159
+ attributeChangedCallback(name: string): void;
160
+ private sync;
161
+ /**
162
+ * Opens and closes the popover the list sits in, following `hidden`.
163
+ *
164
+ * `hidden` still says whether the list is open, from the server as from
165
+ * the web component, and the popover follows. The list sits in the top
166
+ * layer, so a parent with `overflow`, such as the body of a dialog, does
167
+ * not clip it.
168
+ */
169
+ private mirrorPopover;
170
+ /**
171
+ * Places the list right below the field, as wide as it. If there is no
172
+ * room below, it goes above, and it is squeezed into the viewport either
173
+ * way, like the panel in `<lt-popover>`. The position is physical,
174
+ * computed from the field's box.
175
+ */
176
+ private reposition;
177
+ /**
178
+ * Names the list from the label, when the markup arrived without a name.
179
+ *
180
+ * With `aria-labelledby` when the label is next to the field; the web
181
+ * component gives it an id when it has none, since it holds nothing the
182
+ * user can lose. If the label wraps the field, it gets no id: a morph would
183
+ * then replace the label, and the field with it. In that case the list
184
+ * gets the label's text as `aria-label`, without the field's value.
185
+ */
186
+ private nameList;
187
+ /** The id an element should have: the one it has, otherwise the one the web component created last. */
188
+ private rememberedId;
189
+ /**
190
+ * Fills in the wiring where the markup arrived without it. Only what is
191
+ * missing.
192
+ *
193
+ * The list is closed when the markup says nothing about it, that is when
194
+ * neither `aria-expanded` on the field nor `hidden` on the list is there.
195
+ * If the markup states one of them, that is the server's word on both, as
196
+ * with `lt.suggestion({ open: true })`.
197
+ */
198
+ private wire;
199
+ /**
200
+ * Sets the user's state back after a patch.
201
+ *
202
+ * The filtering is recomputed from what is in the field, so it needs no
203
+ * memory. What the list shows and what is highlighted do.
204
+ */
205
+ private repair;
206
+ disconnectedCallback(): void;
207
+ /**
208
+ * Something else has already filtered, so the web component leaves the
209
+ * options alone.
210
+ *
211
+ * The name used to be `server-filtered`, and that was misleading: it is not
212
+ * about servers. A React app that renders only the matches has filtered all
213
+ * the same, without any server involved.
214
+ *
215
+ * The web component hides an option when its text does not contain what is
216
+ * in the field. If you filter on something else, without diacritics, on a
217
+ * code that is not shown, or fuzzily, the two disagree, and then your filter
218
+ * should win. The attribute turns off both the hiding and the empty
219
+ * message, that is everything about what the list shows. The announcement
220
+ * of the number of matches remains, since it is not markup.
221
+ */
222
+ get prefiltered(): boolean;
223
+ set prefiltered(on: boolean);
224
+ private get listElement();
225
+ private get emptyElement();
226
+ private get valueField();
227
+ /** The field accepts no input: `readonly` or `disabled`. */
228
+ private get locked();
229
+ /**
230
+ * The options, recognised by the role and not by the class.
231
+ *
232
+ * The role must be there anyway, for the screen reader. A template that
233
+ * wrote `<li role="option">` with its own styling got neither filtering nor
234
+ * arrow keys when the web component looked for the class, and nothing said
235
+ * so.
236
+ */
237
+ private get options();
238
+ /**
239
+ * Which visible option is highlighted now.
240
+ *
241
+ * It is read from `aria-selected` in the markup, not from a counter inside
242
+ * the web component. The server can set the highlight itself with
243
+ * `lt.suggestion({ activeIndex })`, and a parallel counter would have jumped
244
+ * to the top of the list on the first arrow key instead of to the next
245
+ * option. The filtering also moves the options around, and then the lookup
246
+ * gives the right answer by itself.
247
+ */
248
+ private get activeIndex();
249
+ /** The options that are visible now. */
250
+ private get visible();
251
+ /**
252
+ * The visible options that can be chosen. An option with
253
+ * `aria-disabled="true"` is shown, but the arrow keys skip it and it cannot
254
+ * be chosen, with neither keyboard nor mouse.
255
+ */
256
+ private get selectable();
257
+ private unbind;
258
+ /**
259
+ * Reports when an update replaced the field because the id from the server
260
+ * changed.
261
+ *
262
+ * The message comes only when the user had something to lose: the old field
263
+ * is out of the tree, both had an id from the server, the ids differ, `name`
264
+ * is the same, and the old field held something other than the new one. A
265
+ * server that sends the text back has not lost it.
266
+ */
267
+ private warnAboutReplacedControl;
268
+ private bind;
269
+ private setOpen;
270
+ private hasSomethingToShow;
271
+ /** Writes the state into the markup, without changing what the user wanted. */
272
+ private applyOpen;
273
+ /**
274
+ * The empty message follows the list: visible only when the list is open and
275
+ * empty.
276
+ *
277
+ * It is a sibling of the list and not a child, so `hidden` on the list did
278
+ * not hide it, and "No matches" stayed below a closed field after Escape.
279
+ * If something else has filtered, it also controls the empty message.
280
+ */
281
+ private syncEmpty;
282
+ /**
283
+ * Hides what does not match, and announces how many are left.
284
+ *
285
+ * Runs when the user types or focuses the field, and again after a patch
286
+ * while the list is open, since the patch may have replaced the options.
287
+ */
288
+ private filter;
289
+ /**
290
+ * Removes the highlight from an option the filtering just hid.
291
+ *
292
+ * The cleanup belongs here, where the hiding happens, and not only in
293
+ * `repair()`: that returns at once under `server-controlled`, and then
294
+ * `aria-activedescendant` pointed to a hidden option, which the screen
295
+ * reader announced anyway.
296
+ */
297
+ private dropHiddenMark;
298
+ /**
299
+ * Announces the count when something else has filtered.
300
+ *
301
+ * The list then changes not from a keystroke but from the app rendering
302
+ * again, and that is exactly the change the observer sees. The message
303
+ * belongs here and not in `filter()`, because half a second over the
304
+ * network can pass between the keystroke and the new answer.
305
+ *
306
+ * Only changes are announced. The first count is the starting point and not
307
+ * news, and it is often 0 because the app has not rendered the list yet.
308
+ */
309
+ private announceFiltered;
310
+ /**
311
+ * Announces the number of matches.
312
+ *
313
+ * Without this, people who cannot see the screen get no word that the list
314
+ * narrowed while they typed. The text is generated on the client, and
315
+ * `repair()` writes it back when an update empties the element. If the
316
+ * element is missing, `bind()` has already reported it.
317
+ */
318
+ private announce;
319
+ /**
320
+ * The text for a count, in the page's language.
321
+ *
322
+ * `count-none` applies to zero matches, since "No matches" is a sentence of
323
+ * its own and not an inflection. Otherwise `Intl.PluralRules` picks the form
324
+ * the language requires, and `count-<form>` gives the text, with `{n}` for
325
+ * the number. If the form is missing, `count-other` applies. If that is
326
+ * missing too, the default text from `DEFAULT_TEXTS` applies.
327
+ */
328
+ private countText;
329
+ private markActive;
330
+ /** Highlights one option, and remembers which. */
331
+ private markOption;
332
+ private choose;
333
+ /**
334
+ * Writes the code in the value field and dispatches `input` and `change` on
335
+ * it, so `data-bind` in Datastar sees the code. The events do not bubble: a
336
+ * `data-on:input` on the host, which the recipe uses to fetch suggestions,
337
+ * must not trigger a search for the code every time the user chooses.
338
+ */
339
+ private writeCode;
340
+ /**
341
+ * The form is reset. The browser sets the text back to the server's after
342
+ * the event has been dispatched, so the code is set in the next turn, after
343
+ * the reset is done. The text there then decides: if it is the server's,
344
+ * the server's code applies; if it is the chosen one, the code stays;
345
+ * otherwise the code of the option with that text, otherwise none. The
346
+ * server's comes first because two options can have the same name: if the
347
+ * user chose the second Våler, the reset goes back to the server's. The
348
+ * server may also have sent the chosen one back, and then it is as much the
349
+ * server's word as the user's.
350
+ */
351
+ private handleReset;
352
+ private handleInput;
353
+ private handleFocus;
354
+ private handleFocusOut;
355
+ private handleKeydown;
356
+ private handleListMouseDown;
357
+ private handleOptionMouseDown;
358
+ private handleOptionClick;
359
+ }
360
+ export declare function defineLtSuggestion(tagName?: string): void;
361
+ //# sourceMappingURL=lt-suggestion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lt-suggestion.d.ts","sourceRoot":"","sources":["../../../../src/components/frame/suggestion/lt-suggestion.ts"],"names":[],"mappings":"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"}