@lo-tek/interfaces 0.0.0 → 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 +128 -1
  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 +398 -5
  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,400 @@
1
+ /**
2
+ * The base the web components inherit from, and their registration.
3
+ *
4
+ * `HTMLElement` and `customElements` only exist in the browser. A
5
+ * `class X extends HTMLElement` is evaluated when the module loads, so a
6
+ * server that only wanted `lt.button()` from the package stopped with
7
+ * "HTMLElement is not defined" before it got that far. That hit nine of the
8
+ * entry points, the main entry included, and made the package useless in
9
+ * exactly the situation it is built for: the server writing the markup.
10
+ *
11
+ * The fallback is an empty class. It is never used for anything, because
12
+ * without `customElements` nothing is registered, and without registration
13
+ * the browser never creates an instance. It only exists so the module can
14
+ * load.
15
+ */
16
+
17
+ export const HostElement =
18
+ typeof HTMLElement === "undefined"
19
+ ? (class {} as unknown as typeof HTMLElement)
20
+ : HTMLElement
21
+
22
+ /*
23
+ * The types of the events, such as `dialog-toggle` with `detail.open`. Every
24
+ * web component inherits from here, so the types come with all their entry
25
+ * points, and `addEventListener` on an element is typed without a separate
26
+ * import.
27
+ */
28
+ export type { LtEventMap } from "./events.js"
29
+
30
+ /**
31
+ * Registers a web component, once, and only in the browser.
32
+ *
33
+ * When `defineLt*` is called from a module that also runs on the server, as
34
+ * in TanStack Start or a server-rendered React app, nothing happens. There is
35
+ * no `customElements` there to register in.
36
+ *
37
+ * A constructor can only be in the registry once. If the class is already
38
+ * there under another name, a subclass is registered:
39
+ * `defineLtToast("app-toast")` followed by `defineLt()` otherwise threw
40
+ * NotSupportedError on `lt-toast`, and the components after it in the list
41
+ * were never registered. With the subclass both names work, and `instanceof`
42
+ * holds for both.
43
+ */
44
+ export function defineElement(
45
+ tagName: string,
46
+ element: CustomElementConstructor,
47
+ ): void {
48
+ if (typeof customElements === "undefined") return
49
+ if (customElements.get(tagName)) return
50
+ if (isRegistered(element)) {
51
+ customElements.define(tagName, class extends element {})
52
+ return
53
+ }
54
+ try {
55
+ customElements.define(tagName, element)
56
+ } catch (error) {
57
+ // The fallback for browsers without `getName`: the name is free, so a
58
+ // NotSupportedError here means the constructor is already in use.
59
+ if (!(error instanceof DOMException && error.name === "NotSupportedError"))
60
+ throw error
61
+ customElements.define(tagName, class extends element {})
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Whether the constructor is already in the registry, under any name.
67
+ * `getName` arrived in Chrome 117, Firefox 116 and Safari 17; without it the
68
+ * answer is `false`, and `define` reports the problem itself.
69
+ */
70
+ function isRegistered(element: CustomElementConstructor): boolean {
71
+ if (typeof customElements.getName !== "function") return false
72
+ return customElements.getName(element) !== null
73
+ }
74
+
75
+ /**
76
+ * Sets an attribute, but only when the value actually differs.
77
+ *
78
+ * The components observe the attributes they set themselves, so they can set
79
+ * them back after a patch. Writing a value that is already there counts as a
80
+ * change, so the observer calls itself, writes again, and the microtask queue
81
+ * never empties. The page freezes, and a test run hangs without an error: no
82
+ * stack trace, no assertion, just silence. That is why no test can catch it,
83
+ * and why writes go through one function all the components use.
84
+ *
85
+ * `null` removes the attribute.
86
+ */
87
+ export function setAttr(
88
+ element: Element,
89
+ name: string,
90
+ value: string | null | undefined,
91
+ ): void {
92
+ if (value === null || value === undefined) {
93
+ if (element.hasAttribute(name)) element.removeAttribute(name)
94
+ } else if (element.getAttribute(name) !== value) {
95
+ element.setAttribute(name, value)
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Turns a boolean attribute on or off, without writing when it is already so.
101
+ *
102
+ * `el.hidden = true` on something already hidden writes the attribute again,
103
+ * and that counts as a change. `toggleAttribute` does not: if the attribute
104
+ * is already as it should be, nothing happens. So it is the only permitted
105
+ * way to `hidden`, `disabled` and the other boolean attributes in a component
106
+ * that observes the attributes it writes.
107
+ *
108
+ * `Boolean(on)` and not `on` alone: with `undefined` as the second argument
109
+ * `toggleAttribute` toggles instead of removing. React 19 writes
110
+ * `el.open = undefined` when a prop goes from `true` to absent, and the
111
+ * setter then put the attribute back: a dialog the user had closed opened
112
+ * again as the app followed along.
113
+ */
114
+ export function setFlag(element: Element, name: string, on: boolean): void {
115
+ element.toggleAttribute(name, Boolean(on))
116
+ }
117
+
118
+ /**
119
+ * The language nearest the element, or `undefined` when the page does not
120
+ * say.
121
+ *
122
+ * `undefined` gives `Intl` the browser's language. A `lang` that is not a
123
+ * valid language tag makes `Intl` throw, and then the browser's language is
124
+ * better than no text.
125
+ */
126
+ export function languageOf(element: Element): string | undefined {
127
+ /*
128
+ * `closest()` stops at a shadow root. If the element is in one, as in
129
+ * every preview in the documentation, the search continues from the host;
130
+ * otherwise it never found `lang` on `<html>`.
131
+ */
132
+ let node: Element | null = element
133
+ while (node) {
134
+ const owner = node.closest("[lang]")
135
+ // `lang=""` means "unknown language" and stops inheritance from the ancestors.
136
+ if (owner) {
137
+ const lang = owner.getAttribute("lang")?.trim()
138
+ if (!lang) return undefined
139
+ try {
140
+ Intl.getCanonicalLocales(lang)
141
+ return lang
142
+ } catch {
143
+ return undefined
144
+ }
145
+ }
146
+ const root = node.getRootNode()
147
+ node = root instanceof ShadowRoot ? root.host : null
148
+ }
149
+ return undefined
150
+ }
151
+
152
+ /**
153
+ * Writes text in an element, but only when the text differs.
154
+ *
155
+ * `textContent` is a `childList` change, and the components observe their
156
+ * children. Writing the same text again counts as a change, and then the
157
+ * observer calls itself.
158
+ *
159
+ * `textContent` is all the text in the subtree joined, so the comparison does
160
+ * not tell `<b>3</b> matches` from `3 matches`. The function is meant for
161
+ * elements the component fills with plain text, such as the match count in
162
+ * the suggestion field.
163
+ */
164
+ export function setText(element: Element, text: string): void {
165
+ if (element.textContent !== text) element.textContent = text
166
+ }
167
+
168
+ /** Adds a class, but only when it is not already there. */
169
+ export function addClass(element: Element, name: string): void {
170
+ if (!element.classList.contains(name)) element.classList.add(name)
171
+ }
172
+
173
+ /** An id the component creates itself, when the markup had none. */
174
+ export function uniqueId(prefix: string): string {
175
+ return `${prefix}-${Math.random().toString(36).slice(2, 9)}`
176
+ }
177
+
178
+ /**
179
+ * The parts with a role, and those without only when the component set the
180
+ * roles itself.
181
+ *
182
+ * The components fill in roles where the markup came without them: a button
183
+ * in the row becomes a tab, an `<li>` in the list becomes an option. But if
184
+ * the server wrote the roles, an element without a role is something else,
185
+ * such as a "close" button in the row, and must not get a role, an id and
186
+ * `tabindex="-1"` from the component. `roledByHost` holds the roles the
187
+ * component set itself: if every role present was set by the component, the
188
+ * markup is bare, and an element without a role that the server sends later
189
+ * is a new part. The parts are limited to the host, since components inside
190
+ * components are ordinary markup.
191
+ */
192
+ export function derivedParts<T extends Element>(
193
+ host: Element,
194
+ selector: string,
195
+ role: string,
196
+ roledByHost: WeakSet<Element>,
197
+ ): T[] {
198
+ const own = [...host.querySelectorAll<T>(selector)].filter(
199
+ (part) => part.closest(host.localName) === host,
200
+ )
201
+ const bare = own
202
+ .filter((part) => part.getAttribute("role") === role)
203
+ .every((part) => roledByHost.has(part))
204
+ return bare ? own : own.filter((part) => part.getAttribute("role") === role)
205
+ }
206
+
207
+ /**
208
+ * The attribute that gives the state back to the server.
209
+ *
210
+ * By default the components repair what the user has done: the selected tab,
211
+ * the open popover, the expanded suggestion list. A morph tears it away,
212
+ * since none of it was in the HTML the server sent, and the component sets it
213
+ * back. Then no template needs to know the attributes.
214
+ *
215
+ * Sometimes the server should decide: "go on to step 2" is a real thing a
216
+ * server wants to be able to do. With `server-controlled` on the host, the
217
+ * component does not set back what the user did, and each patch decides. It
218
+ * still does the wiring and the keyboard, and what the attribute means for
219
+ * each component is documented in the component.
220
+ *
221
+ * This replaces `data-preserve-attr`, which required the template to copy the
222
+ * name of every attribute the component would touch. One attribute to
223
+ * remember instead of nine, and the default is the right choice almost
224
+ * always.
225
+ *
226
+ * Preserving is also a mechanism of one particular morpher:
227
+ * `data-preserve-attr` is a `data-*` attribute, and such an attribute only
228
+ * means something to the code that reads it. Repair reads the markup, and
229
+ * works whoever does the morphing.
230
+ */
231
+ export const SERVER_CONTROLLED = "server-controlled" as const
232
+
233
+ /** Whether the server decides the state in this element. */
234
+ export function isServerControlled(element: Element): boolean {
235
+ return element.hasAttribute(SERVER_CONTROLLED)
236
+ }
237
+
238
+ /**
239
+ * Warns when the markup a component received does not fit together.
240
+ *
241
+ * A component that cannot find its parts cannot do its job, and the only
242
+ * alternative to a message is silence. It was silent for a long time: a
243
+ * template without a control in `<lt-field>` gave a field without wiring,
244
+ * and nothing said so until someone read the page with a screen reader.
245
+ *
246
+ * The message comes once per element and message. A component syncs on every
247
+ * patch, and a warning per patch would fill the console so fast it became
248
+ * useless. So the message must be the same every time: interpolate a number
249
+ * into it and every round is a new message, and the deduplication is gone.
250
+ *
251
+ * `stillBroken` is why the warning can be trusted. It is called again when
252
+ * the page has settled, and only then is anything written. A component sees
253
+ * its markup as it connects, and the markup is often unfinished then: HTML
254
+ * streamed from a Go or Kotlin server arrives in chunks, and a break between
255
+ * the label and the field is perfectly normal. Without the final check the
256
+ * component warned about markup that was fine a moment later, and a warning
257
+ * that also fires on correct markup gets switched off.
258
+ *
259
+ * It comes in every environment, not only during development. The package
260
+ * has no build step that could remove it, and a warning that only fires on
261
+ * markup that really is wrong belongs where it happens.
262
+ */
263
+ const reported = new WeakMap<Element, Set<string>>()
264
+ const queued = new WeakMap<Element, Set<string>>()
265
+
266
+ export function warnAboutMarkup(
267
+ element: Element,
268
+ message: string,
269
+ stillBroken: () => boolean,
270
+ ): void {
271
+ if (typeof console === "undefined") return
272
+ if (reported.get(element)?.has(message)) return
273
+
274
+ let pending = queued.get(element)
275
+ if (!pending) {
276
+ pending = new Set()
277
+ queued.set(element, pending)
278
+ }
279
+ if (pending.has(message)) return
280
+ pending.add(message)
281
+
282
+ whenSettled(() => {
283
+ pending.delete(message)
284
+ if (!element.isConnected || !stillBroken()) return
285
+
286
+ let said = reported.get(element)
287
+ if (!said) {
288
+ said = new Set()
289
+ reported.set(element, said)
290
+ }
291
+ if (said.has(message)) return
292
+ said.add(message)
293
+
294
+ console.warn(`${element.tagName.toLowerCase()}: ${message}`, element)
295
+ })
296
+ }
297
+
298
+ /**
299
+ * Runs once the page has settled.
300
+ *
301
+ * First the parser must be done, or we only see the part of the markup that
302
+ * has arrived so far. Then two frames, so a morph, a React hydration or a
303
+ * script that fills the element in the next task has time to finish first.
304
+ */
305
+ function whenSettled(run: () => void): void {
306
+ let done = false
307
+ const once = () => {
308
+ if (done) return
309
+ done = true
310
+ run()
311
+ }
312
+
313
+ const afterTwoFrames = () => {
314
+ if (typeof requestAnimationFrame === "undefined") {
315
+ once()
316
+ return
317
+ }
318
+ /*
319
+ * A fallback, because `requestAnimationFrame` does not always fire in a
320
+ * frame that is not painted. Tested in an `<iframe>` with
321
+ * `display: none`: Chromium and WebKit fire anyway, Firefox does not.
322
+ * Without the fallback the message stayed in the queue there for ever,
323
+ * and blocked a later, real warning about the same thing.
324
+ *
325
+ * It is not cancelled. An attempt to cancel it in the first frame was
326
+ * worse than the problem: if the first frame fires and the tab is hidden
327
+ * before the second, both the fallback and the second frame are gone,
328
+ * and the check never runs. `once` runs only once, so it does no harm
329
+ * that both paths are running, and whichever comes first wins.
330
+ *
331
+ * One second is chosen so two frames win in anything but a page that is
332
+ * completely stalled. If that happens, a warning about markup that is
333
+ * still unfinished is a small problem next to a frozen page.
334
+ */
335
+ setTimeout(once, 1000)
336
+ requestAnimationFrame(() => requestAnimationFrame(once))
337
+ }
338
+
339
+ if (typeof document !== "undefined" && document.readyState === "loading") {
340
+ document.addEventListener("DOMContentLoaded", afterTwoFrames, {
341
+ once: true,
342
+ })
343
+ return
344
+ }
345
+
346
+ afterTwoFrames()
347
+ }
348
+
349
+ /**
350
+ * Waits until the element has been upgraded to its component, and returns it
351
+ * with the right type.
352
+ *
353
+ * The components with an imperative API have `show()`, `reportFailure()` and
354
+ * `extend()`. If one of them is called before `defineLt*` has run, the
355
+ * element is still a plain `HTMLElement`, and the call fails with
356
+ * "reportSuccess is not a function". In production it happened in the gap
357
+ * between the server's HTML being there and the registration being loaded:
358
+ * the first message from the event stream arrived in that gap, and the app
359
+ * put a `typeof` guard around every call to get around it.
360
+ *
361
+ * The helpers around the methods instead wait for `whenDefined` on the
362
+ * element's actual tag name, so a call that comes too early is made as soon
363
+ * as the registration is there. `upgrade()` covers an element not yet in the
364
+ * document; one that is in it is already upgraded when `whenDefined`
365
+ * resolves.
366
+ *
367
+ * An element nobody registers would otherwise wait silently for ever. After
368
+ * three seconds the helper says so in the console, once per tag name, and
369
+ * keeps waiting: if the registration comes late, the call should still be
370
+ * made.
371
+ */
372
+ const UPGRADE_WARNING_MS = 3000
373
+ const warnedTags = new Set<string>()
374
+
375
+ export async function whenUpgraded<T extends HTMLElement>(
376
+ element: Element,
377
+ ): Promise<T> {
378
+ const tag = element.localName
379
+ if (!customElements.get(tag)) {
380
+ const timer = setTimeout(() => {
381
+ if (customElements.get(tag) || warnedTags.has(tag)) return
382
+ warnedTags.add(tag)
383
+ console.warn(
384
+ `<${tag}> is not registered after ${UPGRADE_WARNING_MS / 1000} seconds. ` +
385
+ `Call defineLt() from @lo-tek/interfaces/register at startup, not in an effect.`,
386
+ element,
387
+ )
388
+ }, UPGRADE_WARNING_MS)
389
+ // `finally`: `whenDefined` rejects a name without a hyphen, and without
390
+ // the cleanup the timer would have warned "not registered" three seconds
391
+ // after the call had already failed with the right error.
392
+ try {
393
+ await customElements.whenDefined(tag)
394
+ } finally {
395
+ clearTimeout(timer)
396
+ }
397
+ }
398
+ customElements.upgrade(element)
399
+ return element as T
400
+ }
@@ -0,0 +1,41 @@
1
+ @layer lotek {
2
+ /* Both the element and the class. `lt.connectionStatus()` outputs
3
+ `lt-connection-status`, and a class a builder function advertises must do
4
+ something. Only the element selector was here, so the class was dead. */
5
+ lt-connection-status,
6
+ .lt-connection-status {
7
+ display: contents;
8
+ }
9
+
10
+ .lt-connection-status__bar {
11
+ position: fixed;
12
+ inset-block-start: 0;
13
+ inset-inline: 0;
14
+ z-index: var(--lt-connection-status-layer, 1000);
15
+ padding: var(
16
+ --lt-connection-status-padding,
17
+ var(--lt-spacing-2) var(--lt-spacing-4)
18
+ );
19
+ font-size: var(--lt-font-size-s);
20
+ line-height: var(--lt-line-height-compact);
21
+ text-align: center;
22
+ color: var(--lt-color-danger-text);
23
+ background: var(--lt-color-danger-surface);
24
+ border-block-end: 1px solid var(--lt-color-danger-text);
25
+ }
26
+
27
+ .lt-connection-status__bar[data-state="online"] {
28
+ color: var(--lt-color-success-text);
29
+ background: var(--lt-color-success-surface);
30
+ border-block-end-color: var(--lt-color-success-text);
31
+ }
32
+
33
+ /* Forced colours mode removes custom colours and backgrounds. Without a
34
+ border the bar would be invisible, and it is the bar that says something
35
+ is wrong. */
36
+ @media (forced-colors: active) {
37
+ .lt-connection-status__bar {
38
+ border: 2px solid CanvasText;
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,41 @@
1
+ import { attributes } from "../../css/shared.js"
2
+
3
+ export const CONNECTION_STATUS_CLASS = "lt-connection-status" as const
4
+ export const CONNECTION_STATUS_BAR_CLASS = "lt-connection-status__bar" as const
5
+
6
+ export type ConnectionStatusOptions = {
7
+ /** The text when the connection is lost. */
8
+ offlineText?: string
9
+ /** The text when it comes back. Shown for a short while. */
10
+ onlineText?: string
11
+ }
12
+
13
+ export type ConnectionStatusAttributes = {
14
+ class: typeof CONNECTION_STATUS_CLASS
15
+ "offline-text"?: string
16
+ "online-text"?: string
17
+ "data-ignore-morph": ""
18
+ }
19
+
20
+ /**
21
+ * The attributes for the bar that says the connection is lost.
22
+ *
23
+ * By definition the server cannot tell you it is unreachable. When it is
24
+ * down, nothing comes from it to render. So the component creates all the
25
+ * content itself, and `data-ignore-morph` stops a later patch from tearing
26
+ * it away the moment the connection is back.
27
+ *
28
+ * ```ts
29
+ * <lt-connection-status {...lt.connectionStatus()} />
30
+ * ```
31
+ */
32
+ export const connectionStatus = ({
33
+ offlineText,
34
+ onlineText,
35
+ }: ConnectionStatusOptions = {}): ConnectionStatusAttributes =>
36
+ attributes({
37
+ class: CONNECTION_STATUS_CLASS,
38
+ "offline-text": offlineText,
39
+ "online-text": onlineText,
40
+ "data-ignore-morph": "" as const,
41
+ })