@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,114 @@
1
+ @layer lotek {
2
+ .lt-checkbox {
3
+ /* The design system cannot assume the consumer has a CSS reset. */
4
+ box-sizing: border-box;
5
+
6
+ appearance: none;
7
+ flex: none;
8
+ display: inline-block;
9
+ inline-size: var(--lt-checkbox-size, var(--lt-spacing-5));
10
+ block-size: var(--lt-checkbox-size, var(--lt-spacing-5));
11
+ margin: 0;
12
+ background-color: var(--lt-color-neutral-canvas);
13
+ background-position: center;
14
+ background-repeat: no-repeat;
15
+ background-size: 80%;
16
+ border: 1px solid var(--lt-color-neutral-border);
17
+ border-radius: var(--lt-checkbox-radius, var(--lt-spacing-1));
18
+ cursor: pointer;
19
+ }
20
+
21
+ /* Without `:not(:disabled)`. It raised the specificity above the states
22
+ below, so the mouse removed both the error border and the border of a
23
+ checked box. The rules for checked, disabled and invalid come after
24
+ this one and win on order. */
25
+ .lt-checkbox:hover {
26
+ border-color: var(--lt-color-neutral-border-strong);
27
+ }
28
+
29
+ .lt-checkbox:focus-visible {
30
+ outline: var(--lt-focus-ring);
31
+ outline-offset: 2px;
32
+ }
33
+
34
+ .lt-checkbox:checked,
35
+ .lt-checkbox:indeterminate {
36
+ background-color: var(--lt-color-accent-fill);
37
+ border-color: var(--lt-color-accent-fill);
38
+ }
39
+
40
+ /* The tick is a token and not an image in this file, because a data URL
41
+ cannot read a CSS variable. The stroke is painted into the image, and
42
+ must therefore flip with the theme where the other colours flip. */
43
+ .lt-checkbox:checked {
44
+ background-image: var(--lt-icon-check);
45
+ }
46
+
47
+ .lt-checkbox:indeterminate {
48
+ background-image: var(--lt-icon-dash);
49
+ }
50
+
51
+ .lt-checkbox:disabled {
52
+ background-color: var(--lt-color-disabled-surface);
53
+ border-color: var(--lt-color-disabled-surface);
54
+ cursor: not-allowed;
55
+ }
56
+
57
+ .lt-checkbox:disabled:checked,
58
+ .lt-checkbox:disabled:indeterminate {
59
+ background-color: var(--lt-color-disabled-text);
60
+ border-color: var(--lt-color-disabled-text);
61
+ }
62
+
63
+ .lt-checkbox[data-state="invalid"] {
64
+ border-color: var(--lt-color-danger-text);
65
+ }
66
+
67
+ .lt-checkbox[data-state="invalid"]:focus-visible {
68
+ outline-color: var(--lt-color-danger-text);
69
+ }
70
+
71
+ .lt-checkbox[data-state="success"] {
72
+ border-color: var(--lt-color-success-text);
73
+ }
74
+
75
+ /* Disabled wins over a state. `[data-state]` used to come after
76
+ `:disabled` with the same specificity, and an invalid field in a form
77
+ that was disabled during submission looked red, not disabled. */
78
+ .lt-checkbox:disabled[data-state] {
79
+ background-color: var(--lt-color-disabled-surface);
80
+ border-color: var(--lt-color-disabled-surface);
81
+ }
82
+
83
+ .lt-checkbox:disabled:is(:checked, :indeterminate)[data-state] {
84
+ background-color: var(--lt-color-disabled-text);
85
+ border-color: var(--lt-color-disabled-text);
86
+ }
87
+
88
+ /* The box and the text on one line, with the text in place over several lines. */
89
+ .lt-checkbox-row {
90
+ display: flex;
91
+ align-items: flex-start;
92
+ gap: var(--lt-spacing-2);
93
+ line-height: var(--lt-line-height-default);
94
+ }
95
+
96
+ /*
97
+ * High contrast: let the browser draw the box itself.
98
+ *
99
+ * Tested in the mode: gradients and box-shadow are removed, custom colours
100
+ * are overridden, and only system colours, borders, masks and data URL
101
+ * images survive. Our tick is white and painted into the image, so it
102
+ * would have become invisible against the forced surface. The browser's
103
+ * own checkbox is correct in every theme the user can choose, and costs
104
+ * us nothing to fall back on.
105
+ */
106
+ @media (forced-colors: active) {
107
+ .lt-checkbox,
108
+ .lt-checkbox:checked,
109
+ .lt-checkbox:indeterminate {
110
+ appearance: auto;
111
+ background-image: none;
112
+ }
113
+ }
114
+ }
@@ -0,0 +1,50 @@
1
+ import {
2
+ attributes,
3
+ type FieldState,
4
+ fieldStates,
5
+ isFieldState,
6
+ type NonDefaultFieldState,
7
+ } from "../shared.js"
8
+
9
+ export const CHECKBOX_CLASS = "lt-checkbox" as const
10
+ /** The row that holds the box and the text next to each other. */
11
+ export const CHECKBOX_ROW_CLASS = "lt-checkbox-row" as const
12
+
13
+ export type CheckboxOptions = {
14
+ /** Validation state. Default: `default`. */
15
+ state?: FieldState
16
+ }
17
+
18
+ export type CheckboxAttributes = {
19
+ class: typeof CHECKBOX_CLASS
20
+ type: "checkbox"
21
+ "data-state"?: NonDefaultFieldState
22
+ "aria-invalid"?: "true"
23
+ }
24
+
25
+ /**
26
+ * The attributes for a checkbox.
27
+ *
28
+ * `type` is set here, so the box cannot become a text field with a box's
29
+ * styling. The indeterminate state is set with `element.indeterminate = true`
30
+ * in JavaScript, not as an attribute, because HTML has no such attribute.
31
+ *
32
+ * ```ts
33
+ * <input {...checkbox({ state: "invalid" })} />
34
+ * ```
35
+ */
36
+ export const checkbox = Object.assign(
37
+ ({ state = "default" }: CheckboxOptions = {}): CheckboxAttributes =>
38
+ attributes({
39
+ class: CHECKBOX_CLASS,
40
+ type: "checkbox" as const,
41
+ "data-state": state === "default" ? undefined : state,
42
+ "aria-invalid": state === "invalid" ? ("true" as const) : undefined,
43
+ }),
44
+ {
45
+ /** The class on the row around the box and the text. */
46
+ row: CHECKBOX_ROW_CLASS,
47
+ states: fieldStates,
48
+ isState: isFieldState,
49
+ },
50
+ )
@@ -0,0 +1,38 @@
1
+ @layer lotek {
2
+ .lt-divider {
3
+ /* <hr> has both a border and a height from the browser. Both must go
4
+ before the colour below is the only thing shown. */
5
+ border: 0;
6
+ block-size: 1px;
7
+ /* The browser also gives <hr> auto margins at the sides. In a flex
8
+ column they win over stretch, and the line shrinks to its content,
9
+ which is nothing. It was 0 pixels wide and invisible. It also
10
+ stretches when the parent centres its children or aligns them to the
11
+ start. */
12
+ margin-block: var(--lt-divider-space, var(--lt-spacing-4));
13
+ margin-inline: 0;
14
+ align-self: stretch;
15
+ justify-self: stretch;
16
+ background: var(--lt-color-neutral-border-subtle);
17
+ }
18
+
19
+ .lt-divider[data-variant="strong"] {
20
+ background: var(--lt-color-neutral-border-strong);
21
+ }
22
+
23
+ /* The surface colour alone was so close to the canvas that the line almost
24
+ disappeared. raised sits between it and border-subtle in both themes. */
25
+ .lt-divider[data-variant="subtle"] {
26
+ background: var(--lt-color-neutral-raised);
27
+ }
28
+
29
+ /* High contrast: backgrounds are forced to the page surface colour, and the
30
+ line was only a background. It became invisible. A system colour
31
+ survives. */
32
+ @media (forced-colors: active) {
33
+ .lt-divider,
34
+ .lt-divider[data-variant] {
35
+ background: CanvasText;
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,42 @@
1
+ import { attributes, createGuard } from "../shared.js"
2
+
3
+ export const DIVIDER_CLASS = "lt-divider" as const
4
+
5
+ export const dividerVariants = ["default", "subtle", "strong"] as const
6
+
7
+ export type DividerVariant = (typeof dividerVariants)[number]
8
+ export type NonDefaultDividerVariant = Exclude<DividerVariant, "default">
9
+
10
+ export type DividerOptions = {
11
+ /** How visible the line is. Default: `default`. */
12
+ variant?: DividerVariant
13
+ }
14
+
15
+ export type DividerAttributes = {
16
+ class: typeof DIVIDER_CLASS
17
+ "data-variant"?: NonDefaultDividerVariant
18
+ }
19
+
20
+ /**
21
+ * The attributes for a divider.
22
+ *
23
+ * The class goes on an `<hr>`. If the line separates two parts of the
24
+ * content, it is information screen readers should get. If it is only
25
+ * decoration between two boxes that are already apart, set
26
+ * `aria-hidden="true"` on it.
27
+ *
28
+ * ```ts
29
+ * <hr {...divider({ variant: "subtle" })} />
30
+ * ```
31
+ */
32
+ export const divider = Object.assign(
33
+ ({ variant = "default" }: DividerOptions = {}): DividerAttributes =>
34
+ attributes({
35
+ class: DIVIDER_CLASS,
36
+ "data-variant": variant === "default" ? undefined : variant,
37
+ }),
38
+ {
39
+ variants: dividerVariants,
40
+ isVariant: createGuard(dividerVariants),
41
+ },
42
+ )
@@ -0,0 +1,21 @@
1
+ @layer lotek {
2
+ .lt-error-text {
3
+ display: block;
4
+ /* The whole margin is set, not just the top: without it a <p> inherits
5
+ the browser's 1em at the bottom for consumers without a reset. */
6
+ margin: var(--lt-spacing-1) 0 0;
7
+ font-family: inherit;
8
+ font-size: var(--lt-font-size-xs);
9
+ font-weight: var(--lt-font-weight-medium);
10
+ line-height: var(--lt-line-height-compact);
11
+ color: var(--lt-color-danger-text);
12
+ }
13
+
14
+ .lt-error-text[hidden] {
15
+ display: none;
16
+ }
17
+
18
+ .lt-error-text[data-variant="warning"] {
19
+ color: var(--lt-color-warning-text);
20
+ }
21
+ }
@@ -0,0 +1,37 @@
1
+ import { attributes, createGuard } from "../shared.js"
2
+
3
+ export const ERROR_TEXT_CLASS = "lt-error-text" as const
4
+
5
+ export const errorTextVariants = ["error", "warning"] as const
6
+
7
+ export type ErrorTextVariant = (typeof errorTextVariants)[number]
8
+ export type NonDefaultErrorTextVariant = Exclude<ErrorTextVariant, "error">
9
+
10
+ export type ErrorTextOptions = {
11
+ /** Whether the error stops submission or only warns. Default: `error`. */
12
+ variant?: ErrorTextVariant
13
+ }
14
+
15
+ export type ErrorTextAttributes = {
16
+ class: typeof ERROR_TEXT_CLASS
17
+ "data-variant"?: NonDefaultErrorTextVariant
18
+ }
19
+
20
+ /**
21
+ * The attributes for an error text below a field.
22
+ *
23
+ * ```ts
24
+ * <p {...errorText({ variant: "warning" })}>…</p>
25
+ * ```
26
+ */
27
+ export const errorText = Object.assign(
28
+ ({ variant = "error" }: ErrorTextOptions = {}): ErrorTextAttributes =>
29
+ attributes({
30
+ class: ERROR_TEXT_CLASS,
31
+ "data-variant": variant === "error" ? undefined : variant,
32
+ }),
33
+ {
34
+ variants: errorTextVariants,
35
+ isVariant: createGuard(errorTextVariants),
36
+ },
37
+ )
@@ -0,0 +1,72 @@
1
+ @import "../label/label.css";
2
+
3
+ @layer lotek {
4
+ .lt-fieldset {
5
+ box-sizing: border-box;
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: var(--lt-fieldset-gap, var(--lt-spacing-2));
9
+ margin: 0;
10
+ padding: 0;
11
+ /* The browser's own border and indentation on <fieldset> belong to a look
12
+ from 1996, and cannot be turned off unless both are reset here. */
13
+ border: 0;
14
+ min-inline-size: 0;
15
+ }
16
+
17
+ .lt-legend {
18
+ padding: 0;
19
+ margin-block-end: var(--lt-spacing-1);
20
+ font-family: inherit;
21
+ font-size: var(--lt-font-size-m);
22
+ font-weight: var(--lt-font-weight-semibold);
23
+ line-height: var(--lt-line-height-default);
24
+ color: var(--lt-color-neutral-text-strong);
25
+ }
26
+
27
+ /* The same marker as on a label. The rules are here and not in label.css,
28
+ because <legend> is a different element with its own defaults. */
29
+ .lt-legend[data-required]::after {
30
+ content: var(--lt-label-required-symbol, " *");
31
+ color: var(--lt-color-danger-text);
32
+ font-weight: var(--lt-font-weight-bold);
33
+ }
34
+
35
+ .lt-legend[data-required="text"]::after {
36
+ /* Keep the fallback ASCII. A stylesheet without `@charset` inherits the
37
+ page's encoding, and a non-ASCII fallback came out garbled when the
38
+ page lacked `<meta charset>` and the server sent no charset. Write any
39
+ other character as an escape, such as `\e5`. */
40
+ content: var(--lt-label-required-text, " (required)");
41
+ color: var(--lt-color-danger-text);
42
+ font-weight: var(--lt-font-weight-regular);
43
+ font-size: var(--lt-font-size-xs);
44
+ }
45
+
46
+ /* Not when the field is also marked required: the builder function picks
47
+ required, and hand-written markup with both must give the same result.
48
+ The colour is not `disabled-text`: the text is not disabled, and that
49
+ colour gave 4.37:1. */
50
+ .lt-legend[data-optional]:not([data-required])::after {
51
+ content: var(--lt-label-optional-text, " (optional)");
52
+ color: var(--lt-color-neutral-text-subtle);
53
+ font-weight: var(--lt-font-weight-regular);
54
+ font-size: var(--lt-font-size-xs);
55
+ }
56
+
57
+ .lt-fieldset[data-state="invalid"] .lt-legend {
58
+ color: var(--lt-color-danger-text);
59
+ }
60
+
61
+ /* The fieldset has the same states as the controls it contains, and
62
+ `lt.fieldset.states` has always listed both. Without this rule the
63
+ builder function wrote out an attribute that did nothing. */
64
+ .lt-fieldset[data-state="success"] .lt-legend {
65
+ color: var(--lt-color-success-text);
66
+ }
67
+
68
+ .lt-fieldset:disabled .lt-legend,
69
+ .lt-legend[aria-disabled="true"] {
70
+ color: var(--lt-color-neutral-text-subtle);
71
+ }
72
+ }
@@ -0,0 +1,87 @@
1
+ import {
2
+ attributes,
3
+ createGuard,
4
+ type FieldState,
5
+ fieldStates,
6
+ isFieldState,
7
+ type NonDefaultFieldState,
8
+ type RequiredMarker,
9
+ requiredMarkers,
10
+ } from "../shared.js"
11
+
12
+ export const FIELDSET_CLASS = "lt-fieldset" as const
13
+ export const LEGEND_CLASS = "lt-legend" as const
14
+
15
+ export type FieldsetOptions = {
16
+ /** Validation state for the whole group. Default: `default`. */
17
+ state?: FieldState
18
+ /** Disables all the controls in the group. */
19
+ disabled?: boolean
20
+ }
21
+
22
+ export type FieldsetAttributes = {
23
+ class: typeof FIELDSET_CLASS
24
+ "data-state"?: NonDefaultFieldState
25
+ disabled?: true
26
+ }
27
+
28
+ export type LegendOptions = {
29
+ /** Marks the group as required, with an asterisk or with the word "(required)". */
30
+ required?: RequiredMarker
31
+ /** Marks the group as optional. Choose one of `required` and `optional`. */
32
+ optional?: boolean
33
+ /** Mutes the text when the group is disabled. */
34
+ disabled?: boolean
35
+ }
36
+
37
+ export type LegendAttributes = {
38
+ class: typeof LEGEND_CLASS
39
+ "data-required"?: RequiredMarker
40
+ "data-optional"?: ""
41
+ "aria-disabled"?: "true"
42
+ }
43
+
44
+ /**
45
+ * The attributes for a group of controls that belong together.
46
+ *
47
+ * `<fieldset>` with `<legend>` is the one way to give a set of radio buttons
48
+ * or checkboxes a shared label that screen readers actually announce before
49
+ * each choice.
50
+ *
51
+ * ```ts
52
+ * <fieldset {...fieldset({ state: "invalid" })}>
53
+ * <legend {...legend({ required: "symbol" })}>Delivery method</legend>
54
+ * </fieldset>
55
+ * ```
56
+ */
57
+ export const fieldset = Object.assign(
58
+ ({ state = "default", disabled }: FieldsetOptions = {}): FieldsetAttributes =>
59
+ attributes({
60
+ class: FIELDSET_CLASS,
61
+ "data-state": state === "default" ? undefined : state,
62
+ disabled: disabled ? (true as const) : undefined,
63
+ }),
64
+ {
65
+ states: fieldStates,
66
+ isState: isFieldState,
67
+ },
68
+ )
69
+
70
+ /**
71
+ * The attributes for the label of a group.
72
+ *
73
+ * The same marker as `label()`, but on a `<legend>`.
74
+ */
75
+ export const legend = Object.assign(
76
+ ({ required, optional, disabled }: LegendOptions = {}): LegendAttributes =>
77
+ attributes({
78
+ class: LEGEND_CLASS,
79
+ "data-required": required,
80
+ "data-optional": optional && !required ? ("" as const) : undefined,
81
+ "aria-disabled": disabled ? ("true" as const) : undefined,
82
+ }),
83
+ {
84
+ markers: requiredMarkers,
85
+ isMarker: createGuard(requiredMarkers),
86
+ },
87
+ )
@@ -0,0 +1,102 @@
1
+ @layer lotek {
2
+ .lt-file-upload {
3
+ box-sizing: border-box;
4
+ display: block;
5
+ inline-size: 100%;
6
+ padding: var(--lt-file-upload-padding, var(--lt-spacing-2));
7
+ font-family: inherit;
8
+ font-size: var(--lt-font-size-m);
9
+ line-height: var(--lt-line-height-default);
10
+ color: var(--lt-color-neutral-text-strong);
11
+ background: var(--lt-color-neutral-canvas);
12
+ border: 1px dashed var(--lt-color-neutral-border);
13
+ border-radius: var(--lt-file-upload-radius, var(--lt-spacing-1));
14
+ cursor: pointer;
15
+ }
16
+
17
+ /* The button inside the field is the browser's own, and can only be styled
18
+ through this pseudo-element. Its text comes from the browser and the
19
+ operating system's language, so it cannot be translated from here. */
20
+ .lt-file-upload::file-selector-button {
21
+ margin-inline-end: var(--lt-spacing-3);
22
+ padding: var(--lt-spacing-2) var(--lt-spacing-4);
23
+ font-family: inherit;
24
+ font-size: var(--lt-font-size-m);
25
+ line-height: var(--lt-line-height-default);
26
+ color: var(--lt-color-accent-text);
27
+ background: transparent;
28
+ border: 1px solid var(--lt-color-accent-border);
29
+ border-radius: var(--lt-file-upload-radius, var(--lt-spacing-1));
30
+ cursor: pointer;
31
+ }
32
+
33
+ .lt-file-upload::file-selector-button:hover {
34
+ background: var(--lt-color-accent-surface);
35
+ }
36
+
37
+ .lt-file-upload:hover {
38
+ border-color: var(--lt-color-neutral-border-strong);
39
+ }
40
+
41
+ .lt-file-upload:focus-visible {
42
+ outline: var(--lt-focus-ring);
43
+ outline-offset: 2px;
44
+ }
45
+
46
+ .lt-file-upload:disabled {
47
+ background: var(--lt-color-disabled-surface);
48
+ color: var(--lt-color-disabled-text);
49
+ border-color: var(--lt-color-disabled-surface);
50
+ cursor: not-allowed;
51
+ }
52
+
53
+ .lt-file-upload[data-state="invalid"] {
54
+ border-color: var(--lt-color-danger-text);
55
+ background: var(--lt-color-danger-surface);
56
+ }
57
+
58
+ .lt-file-upload[data-state="success"] {
59
+ border-color: var(--lt-color-success-text);
60
+ }
61
+
62
+ /* Disabled wins over a state. `[data-state]` used to come after
63
+ `:disabled` with the same specificity, and an invalid field in a form
64
+ that was disabled during submission looked red, not disabled. */
65
+ .lt-file-upload:disabled[data-state] {
66
+ background: var(--lt-color-disabled-surface);
67
+ color: var(--lt-color-disabled-text);
68
+ border-color: var(--lt-color-disabled-surface);
69
+ }
70
+
71
+ /* The list of the selected files. You write it yourself, since only you
72
+ know what should happen when a file is removed. */
73
+ .lt-file-upload-list {
74
+ display: flex;
75
+ flex-direction: column;
76
+ gap: var(--lt-spacing-2);
77
+ margin: var(--lt-spacing-2) 0 0;
78
+ padding: 0;
79
+ list-style: none;
80
+ }
81
+
82
+ .lt-file-upload-list li {
83
+ display: flex;
84
+ flex-wrap: wrap;
85
+ align-items: center;
86
+ justify-content: space-between;
87
+ gap: var(--lt-spacing-2);
88
+ padding: var(--lt-spacing-2) var(--lt-spacing-3);
89
+ background: var(--lt-color-neutral-surface);
90
+ border-radius: var(--lt-file-upload-radius, var(--lt-spacing-1));
91
+ /* File names rarely have spaces to break at, and the button text repeats
92
+ the name. Without this the row pushes wider than the screen on
93
+ mobile. */
94
+ overflow-wrap: anywhere;
95
+ }
96
+
97
+ /* A flex item cannot by default become narrower than its content. Without
98
+ this the file name does not break, whatever we say above. */
99
+ .lt-file-upload-list li > * {
100
+ min-inline-size: 0;
101
+ }
102
+ }
@@ -0,0 +1,65 @@
1
+ import {
2
+ attributes,
3
+ type FieldState,
4
+ fieldStates,
5
+ isFieldState,
6
+ type NonDefaultFieldState,
7
+ } from "../shared.js"
8
+
9
+ export const FILE_UPLOAD_CLASS = "lt-file-upload" as const
10
+ /** The list of the selected files. */
11
+ export const FILE_UPLOAD_LIST_CLASS = "lt-file-upload-list" as const
12
+
13
+ export type FileUploadOptions = {
14
+ /** Validation state. Default: `default`. */
15
+ state?: FieldState
16
+ /** Allow several files. */
17
+ multiple?: boolean
18
+ /** The file types the field accepts, such as `.pdf,image/*`. */
19
+ accept?: string
20
+ }
21
+
22
+ export type FileUploadAttributes = {
23
+ class: typeof FILE_UPLOAD_CLASS
24
+ type: "file"
25
+ multiple?: true
26
+ accept?: string
27
+ "data-state"?: NonDefaultFieldState
28
+ "aria-invalid"?: "true"
29
+ }
30
+
31
+ /**
32
+ * The attributes for a file upload field.
33
+ *
34
+ * The field is a plain `<input type="file">`. The button inside is the
35
+ * browser's own, and its text comes from the operating system's language. It
36
+ * cannot be translated, so the label above the field must say what to upload.
37
+ *
38
+ * `accept` is a help in the file picker, not a barrier. The user can choose
39
+ * "all files", so the type must be checked on the server anyway.
40
+ *
41
+ * ```ts
42
+ * <input {...fileUpload({ multiple: true, accept: ".pdf" })} />
43
+ * ```
44
+ */
45
+ export const fileUpload = Object.assign(
46
+ ({
47
+ state = "default",
48
+ multiple,
49
+ accept,
50
+ }: FileUploadOptions = {}): FileUploadAttributes =>
51
+ attributes({
52
+ class: FILE_UPLOAD_CLASS,
53
+ type: "file" as const,
54
+ multiple: multiple ? (true as const) : undefined,
55
+ accept,
56
+ "data-state": state === "default" ? undefined : state,
57
+ "aria-invalid": state === "invalid" ? ("true" as const) : undefined,
58
+ }),
59
+ {
60
+ /** The class on the list of selected files. */
61
+ list: FILE_UPLOAD_LIST_CLASS,
62
+ states: fieldStates,
63
+ isState: isFieldState,
64
+ },
65
+ )
@@ -0,0 +1,33 @@
1
+ @layer lotek {
2
+ .lt-heading {
3
+ margin: 0;
4
+ font-family: inherit;
5
+ font-weight: var(--lt-heading-font-weight, var(--lt-font-weight-bold));
6
+ line-height: var(--lt-heading-line-height, var(--lt-line-height-heading));
7
+ color: var(--lt-color-neutral-text-strong);
8
+ text-wrap: balance;
9
+ font-size: var(--lt-font-size-xl);
10
+ }
11
+
12
+ .lt-heading[data-size="mega"] {
13
+ font-size: var(--lt-font-size-mega);
14
+ }
15
+
16
+ .lt-heading[data-size="xl"] {
17
+ font-size: var(--lt-font-size-xxl);
18
+ }
19
+
20
+ .lt-heading[data-size="m"] {
21
+ font-size: var(--lt-font-size-l);
22
+ }
23
+
24
+ .lt-heading[data-size="s"] {
25
+ font-size: var(--lt-font-size-m);
26
+ }
27
+
28
+ .lt-heading[data-size="xs"] {
29
+ font-size: var(--lt-font-size-s);
30
+ text-transform: uppercase;
31
+ letter-spacing: 0.06em;
32
+ }
33
+ }