@lo-tek/interfaces 0.0.0-stage → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3254 -0
- package/LICENSE +21 -0
- package/README.md +129 -2
- package/agent/astro.md +400 -0
- package/agent/bundles.md +429 -0
- package/agent/datastar.md +409 -0
- package/agent/html.md +388 -0
- package/agent/react.md +440 -0
- package/agent/templates.md +472 -0
- package/core/lotek-core.wasm +0 -0
- package/core/lotek.wasm +0 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -0
- package/dist/components/css/accordion/accordion.d.ts +37 -0
- package/dist/components/css/accordion/accordion.d.ts.map +1 -0
- package/dist/components/css/accordion/accordion.js +31 -0
- package/dist/components/css/accordion/accordion.js.map +1 -0
- package/dist/components/css/alert/alert.d.ts +35 -0
- package/dist/components/css/alert/alert.d.ts.map +1 -0
- package/dist/components/css/alert/alert.js +29 -0
- package/dist/components/css/alert/alert.js.map +1 -0
- package/dist/components/css/avatar/avatar.d.ts +40 -0
- package/dist/components/css/avatar/avatar.d.ts.map +1 -0
- package/dist/components/css/avatar/avatar.js +30 -0
- package/dist/components/css/avatar/avatar.js.map +1 -0
- package/dist/components/css/badge/badge.d.ts +24 -0
- package/dist/components/css/badge/badge.d.ts.map +1 -0
- package/dist/components/css/badge/badge.js +24 -0
- package/dist/components/css/badge/badge.js.map +1 -0
- package/dist/components/css/breadcrumbs/breadcrumbs.d.ts +26 -0
- package/dist/components/css/breadcrumbs/breadcrumbs.d.ts.map +1 -0
- package/dist/components/css/breadcrumbs/breadcrumbs.js +24 -0
- package/dist/components/css/breadcrumbs/breadcrumbs.js.map +1 -0
- package/dist/components/css/button/button.d.ts +26 -0
- package/dist/components/css/button/button.d.ts.map +1 -0
- package/dist/components/css/button/button.js +25 -0
- package/dist/components/css/button/button.js.map +1 -0
- package/dist/components/css/card/card.d.ts +36 -0
- package/dist/components/css/card/card.d.ts.map +1 -0
- package/dist/components/css/card/card.js +28 -0
- package/dist/components/css/card/card.js.map +1 -0
- package/dist/components/css/checkbox/checkbox.d.ts +32 -0
- package/dist/components/css/checkbox/checkbox.d.ts.map +1 -0
- package/dist/components/css/checkbox/checkbox.js +27 -0
- package/dist/components/css/checkbox/checkbox.js.map +1 -0
- package/dist/components/css/divider/divider.d.ts +29 -0
- package/dist/components/css/divider/divider.d.ts.map +1 -0
- package/dist/components/css/divider/divider.js +23 -0
- package/dist/components/css/divider/divider.js.map +1 -0
- package/dist/components/css/error-text/error-text.d.ts +24 -0
- package/dist/components/css/error-text/error-text.d.ts.map +1 -0
- package/dist/components/css/error-text/error-text.js +18 -0
- package/dist/components/css/error-text/error-text.js.map +1 -0
- package/dist/components/css/fieldset/fieldset.d.ts +55 -0
- package/dist/components/css/fieldset/fieldset.d.ts.map +1 -0
- package/dist/components/css/fieldset/fieldset.js +39 -0
- package/dist/components/css/fieldset/fieldset.js.map +1 -0
- package/dist/components/css/file-upload/file-upload.d.ts +41 -0
- package/dist/components/css/file-upload/file-upload.d.ts.map +1 -0
- package/dist/components/css/file-upload/file-upload.js +32 -0
- package/dist/components/css/file-upload/file-upload.js.map +1 -0
- package/dist/components/css/heading/heading.d.ts +29 -0
- package/dist/components/css/heading/heading.d.ts.map +1 -0
- package/dist/components/css/heading/heading.js +23 -0
- package/dist/components/css/heading/heading.js.map +1 -0
- package/dist/components/css/help-text/help-text.d.ts +24 -0
- package/dist/components/css/help-text/help-text.d.ts.map +1 -0
- package/dist/components/css/help-text/help-text.js +23 -0
- package/dist/components/css/help-text/help-text.js.map +1 -0
- package/dist/components/css/icon/icon.d.ts +34 -0
- package/dist/components/css/icon/icon.d.ts.map +1 -0
- package/dist/components/css/icon/icon.js +25 -0
- package/dist/components/css/icon/icon.js.map +1 -0
- package/dist/components/css/input/input.d.ts +40 -0
- package/dist/components/css/input/input.d.ts.map +1 -0
- package/dist/components/css/input/input.js +45 -0
- package/dist/components/css/input/input.js.map +1 -0
- package/dist/components/css/label/label.d.ts +33 -0
- package/dist/components/css/label/label.d.ts.map +1 -0
- package/dist/components/css/label/label.js +23 -0
- package/dist/components/css/label/label.js.map +1 -0
- package/dist/components/css/link/link.d.ts +28 -0
- package/dist/components/css/link/link.d.ts.map +1 -0
- package/dist/components/css/link/link.js +20 -0
- package/dist/components/css/link/link.js.map +1 -0
- package/dist/components/css/list/list.d.ts +31 -0
- package/dist/components/css/list/list.d.ts.map +1 -0
- package/dist/components/css/list/list.js +25 -0
- package/dist/components/css/list/list.js.map +1 -0
- package/dist/components/css/pagination/pagination.d.ts +27 -0
- package/dist/components/css/pagination/pagination.d.ts.map +1 -0
- package/dist/components/css/pagination/pagination.js +25 -0
- package/dist/components/css/pagination/pagination.js.map +1 -0
- package/dist/components/css/paragraph/paragraph.d.ts +36 -0
- package/dist/components/css/paragraph/paragraph.d.ts.map +1 -0
- package/dist/components/css/paragraph/paragraph.js +26 -0
- package/dist/components/css/paragraph/paragraph.js.map +1 -0
- package/dist/components/css/progress/progress.d.ts +53 -0
- package/dist/components/css/progress/progress.d.ts.map +1 -0
- package/dist/components/css/progress/progress.js +38 -0
- package/dist/components/css/progress/progress.js.map +1 -0
- package/dist/components/css/radio/radio.d.ts +32 -0
- package/dist/components/css/radio/radio.d.ts.map +1 -0
- package/dist/components/css/radio/radio.js +27 -0
- package/dist/components/css/radio/radio.js.map +1 -0
- package/dist/components/css/search/search.d.ts +34 -0
- package/dist/components/css/search/search.d.ts.map +1 -0
- package/dist/components/css/search/search.js +32 -0
- package/dist/components/css/search/search.js.map +1 -0
- package/dist/components/css/select/select.d.ts +40 -0
- package/dist/components/css/select/select.d.ts.map +1 -0
- package/dist/components/css/select/select.js +31 -0
- package/dist/components/css/select/select.js.map +1 -0
- package/dist/components/css/shared.d.ts +90 -0
- package/dist/components/css/shared.d.ts.map +1 -0
- package/dist/components/css/shared.js +167 -0
- package/dist/components/css/shared.js.map +1 -0
- package/dist/components/css/skeleton/skeleton.d.ts +29 -0
- package/dist/components/css/skeleton/skeleton.d.ts.map +1 -0
- package/dist/components/css/skeleton/skeleton.js +23 -0
- package/dist/components/css/skeleton/skeleton.js.map +1 -0
- package/dist/components/css/skip-link/skip-link.d.ts +18 -0
- package/dist/components/css/skip-link/skip-link.d.ts.map +1 -0
- package/dist/components/css/skip-link/skip-link.js +16 -0
- package/dist/components/css/skip-link/skip-link.js.map +1 -0
- package/dist/components/css/spinner/spinner.d.ts +33 -0
- package/dist/components/css/spinner/spinner.d.ts.map +1 -0
- package/dist/components/css/spinner/spinner.js +25 -0
- package/dist/components/css/spinner/spinner.js.map +1 -0
- package/dist/components/css/sr-only/sr-only.d.ts +17 -0
- package/dist/components/css/sr-only/sr-only.d.ts.map +1 -0
- package/dist/components/css/sr-only/sr-only.js +15 -0
- package/dist/components/css/sr-only/sr-only.js.map +1 -0
- package/dist/components/css/switch/switch.d.ts +37 -0
- package/dist/components/css/switch/switch.d.ts.map +1 -0
- package/dist/components/css/switch/switch.js +29 -0
- package/dist/components/css/switch/switch.js.map +1 -0
- package/dist/components/css/table/table.d.ts +76 -0
- package/dist/components/css/table/table.d.ts.map +1 -0
- package/dist/components/css/table/table.js +59 -0
- package/dist/components/css/table/table.js.map +1 -0
- package/dist/components/css/tag/tag.d.ts +35 -0
- package/dist/components/css/tag/tag.d.ts.map +1 -0
- package/dist/components/css/tag/tag.js +27 -0
- package/dist/components/css/tag/tag.js.map +1 -0
- package/dist/components/css/textarea/textarea.d.ts +23 -0
- package/dist/components/css/textarea/textarea.d.ts.map +1 -0
- package/dist/components/css/textarea/textarea.js +18 -0
- package/dist/components/css/textarea/textarea.js.map +1 -0
- package/dist/components/css/toggle-group/toggle-group.d.ts +31 -0
- package/dist/components/css/toggle-group/toggle-group.d.ts.map +1 -0
- package/dist/components/css/toggle-group/toggle-group.js +29 -0
- package/dist/components/css/toggle-group/toggle-group.js.map +1 -0
- package/dist/components/css/tooltip/tooltip.d.ts +31 -0
- package/dist/components/css/tooltip/tooltip.d.ts.map +1 -0
- package/dist/components/css/tooltip/tooltip.js +29 -0
- package/dist/components/css/tooltip/tooltip.js.map +1 -0
- package/dist/components/default-texts.d.ts +35 -0
- package/dist/components/default-texts.d.ts.map +1 -0
- package/dist/components/default-texts.js +35 -0
- package/dist/components/default-texts.js.map +1 -0
- package/dist/components/events.d.ts +77 -0
- package/dist/components/events.d.ts.map +1 -0
- package/dist/components/events.js +3 -0
- package/dist/components/events.js.map +1 -0
- package/dist/components/frame/dialog/dialog.d.ts +122 -0
- package/dist/components/frame/dialog/dialog.d.ts.map +1 -0
- package/dist/components/frame/dialog/dialog.js +112 -0
- package/dist/components/frame/dialog/dialog.js.map +1 -0
- package/dist/components/frame/dialog/lt-dialog.d.ts +104 -0
- package/dist/components/frame/dialog/lt-dialog.d.ts.map +1 -0
- package/dist/components/frame/dialog/lt-dialog.js +431 -0
- package/dist/components/frame/dialog/lt-dialog.js.map +1 -0
- package/dist/components/frame/error-summary/error-summary.d.ts +40 -0
- package/dist/components/frame/error-summary/error-summary.d.ts.map +1 -0
- package/dist/components/frame/error-summary/error-summary.js +32 -0
- package/dist/components/frame/error-summary/error-summary.js.map +1 -0
- package/dist/components/frame/error-summary/lt-error-summary.d.ts +82 -0
- package/dist/components/frame/error-summary/lt-error-summary.d.ts.map +1 -0
- package/dist/components/frame/error-summary/lt-error-summary.js +302 -0
- package/dist/components/frame/error-summary/lt-error-summary.js.map +1 -0
- package/dist/components/frame/field/field-core.d.ts +92 -0
- package/dist/components/frame/field/field-core.d.ts.map +1 -0
- package/dist/components/frame/field/field-core.js +63 -0
- package/dist/components/frame/field/field-core.js.map +1 -0
- package/dist/components/frame/field/lt-field.d.ts +173 -0
- package/dist/components/frame/field/lt-field.d.ts.map +1 -0
- package/dist/components/frame/field/lt-field.js +580 -0
- package/dist/components/frame/field/lt-field.js.map +1 -0
- package/dist/components/frame/popover/lt-popover.d.ts +132 -0
- package/dist/components/frame/popover/lt-popover.d.ts.map +1 -0
- package/dist/components/frame/popover/lt-popover.js +490 -0
- package/dist/components/frame/popover/lt-popover.js.map +1 -0
- package/dist/components/frame/popover/popover.d.ts +49 -0
- package/dist/components/frame/popover/popover.d.ts.map +1 -0
- package/dist/components/frame/popover/popover.js +64 -0
- package/dist/components/frame/popover/popover.js.map +1 -0
- package/dist/components/frame/session-timeout/lt-session-timeout.d.ts +198 -0
- package/dist/components/frame/session-timeout/lt-session-timeout.d.ts.map +1 -0
- package/dist/components/frame/session-timeout/lt-session-timeout.js +573 -0
- package/dist/components/frame/session-timeout/lt-session-timeout.js.map +1 -0
- package/dist/components/frame/session-timeout/session-timeout.d.ts +113 -0
- package/dist/components/frame/session-timeout/session-timeout.d.ts.map +1 -0
- package/dist/components/frame/session-timeout/session-timeout.js +101 -0
- package/dist/components/frame/session-timeout/session-timeout.js.map +1 -0
- package/dist/components/frame/suggestion/lt-suggestion.d.ts +361 -0
- package/dist/components/frame/suggestion/lt-suggestion.d.ts.map +1 -0
- package/dist/components/frame/suggestion/lt-suggestion.js +1152 -0
- package/dist/components/frame/suggestion/lt-suggestion.js.map +1 -0
- package/dist/components/frame/suggestion/suggestion.d.ts +143 -0
- package/dist/components/frame/suggestion/suggestion.d.ts.map +1 -0
- package/dist/components/frame/suggestion/suggestion.js +127 -0
- package/dist/components/frame/suggestion/suggestion.js.map +1 -0
- package/dist/components/frame/tabs/lt-tabs.d.ts +404 -0
- package/dist/components/frame/tabs/lt-tabs.d.ts.map +1 -0
- package/dist/components/frame/tabs/lt-tabs.js +1201 -0
- package/dist/components/frame/tabs/lt-tabs.js.map +1 -0
- package/dist/components/frame/tabs/tabs.d.ts +112 -0
- package/dist/components/frame/tabs/tabs.d.ts.map +1 -0
- package/dist/components/frame/tabs/tabs.js +107 -0
- package/dist/components/frame/tabs/tabs.js.map +1 -0
- package/dist/components/host-element.d.ts +135 -0
- package/dist/components/host-element.d.ts.map +1 -0
- package/dist/components/host-element.js +366 -0
- package/dist/components/host-element.js.map +1 -0
- package/dist/components/standalone/connection-status/connection-status.d.ts +28 -0
- package/dist/components/standalone/connection-status/connection-status.d.ts.map +1 -0
- package/dist/components/standalone/connection-status/connection-status.js +22 -0
- package/dist/components/standalone/connection-status/connection-status.js.map +1 -0
- package/dist/components/standalone/connection-status/lt-connection-status.d.ts +81 -0
- package/dist/components/standalone/connection-status/lt-connection-status.d.ts.map +1 -0
- package/dist/components/standalone/connection-status/lt-connection-status.js +216 -0
- package/dist/components/standalone/connection-status/lt-connection-status.js.map +1 -0
- package/dist/components/standalone/toast/lt-toast.d.ts +109 -0
- package/dist/components/standalone/toast/lt-toast.d.ts.map +1 -0
- package/dist/components/standalone/toast/lt-toast.js +256 -0
- package/dist/components/standalone/toast/lt-toast.js.map +1 -0
- package/dist/components/standalone/toast/toast.d.ts +52 -0
- package/dist/components/standalone/toast/toast.d.ts.map +1 -0
- package/dist/components/standalone/toast/toast.js +42 -0
- package/dist/components/standalone/toast/toast.js.map +1 -0
- package/dist/diagnostics/core.d.ts +137 -0
- package/dist/diagnostics/core.d.ts.map +1 -0
- package/dist/diagnostics/core.js +72 -0
- package/dist/diagnostics/core.js.map +1 -0
- package/dist/diagnostics/default-core.d.ts +10 -0
- package/dist/diagnostics/default-core.d.ts.map +1 -0
- package/dist/diagnostics/default-core.js +72 -0
- package/dist/diagnostics/default-core.js.map +1 -0
- package/dist/diagnostics/index.d.ts +84 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +106 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/dom.d.ts +55 -0
- package/dist/dom.d.ts.map +1 -0
- package/dist/dom.js +162 -0
- package/dist/dom.js.map +1 -0
- package/dist/index.d.ts +97 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx/react.d.ts +180 -0
- package/dist/jsx/react.d.ts.map +1 -0
- package/dist/jsx/react.js +2 -0
- package/dist/jsx/react.js.map +1 -0
- package/dist/lotek.css +3617 -0
- package/dist/lt.d.ts +325 -0
- package/dist/lt.d.ts.map +1 -0
- package/dist/lt.js +183 -0
- package/dist/lt.js.map +1 -0
- package/dist/react.d.ts +492 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +296 -0
- package/dist/react.js.map +1 -0
- package/dist/register.d.ts +17 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +35 -0
- package/dist/register.js.map +1 -0
- package/dist/tokens/color.d.ts +43 -0
- package/dist/tokens/color.d.ts.map +1 -0
- package/dist/tokens/color.js +123 -0
- package/dist/tokens/color.js.map +1 -0
- package/dist/tokens/contract.d.ts +18 -0
- package/dist/tokens/contract.d.ts.map +1 -0
- package/dist/tokens/contract.js +18 -0
- package/dist/tokens/contract.js.map +1 -0
- package/dist/tokens/matrix-cells.d.ts +30 -0
- package/dist/tokens/matrix-cells.d.ts.map +1 -0
- package/dist/tokens/matrix-cells.js +273 -0
- package/dist/tokens/matrix-cells.js.map +1 -0
- package/dist/tokens/matrix.d.ts +18 -0
- package/dist/tokens/matrix.d.ts.map +1 -0
- package/dist/tokens/matrix.js +21 -0
- package/dist/tokens/matrix.js.map +1 -0
- package/dist/tokens/theme-check.d.ts +42 -0
- package/dist/tokens/theme-check.d.ts.map +1 -0
- package/dist/tokens/theme-check.js +10 -0
- package/dist/tokens/theme-check.js.map +1 -0
- package/dist/tokens/theme.d.ts +94 -0
- package/dist/tokens/theme.d.ts.map +1 -0
- package/dist/tokens/theme.js +14 -0
- package/dist/tokens/theme.js.map +1 -0
- package/dist/tokens/tokens.d.ts +122 -0
- package/dist/tokens/tokens.d.ts.map +1 -0
- package/dist/tokens/tokens.js +158 -0
- package/dist/tokens/tokens.js.map +1 -0
- package/dist/vocabulary/classes.d.ts +3 -0
- package/dist/vocabulary/classes.d.ts.map +1 -0
- package/dist/vocabulary/classes.js +1320 -0
- package/dist/vocabulary/classes.js.map +1 -0
- package/dist/vocabulary/elements.d.ts +3 -0
- package/dist/vocabulary/elements.d.ts.map +1 -0
- package/dist/vocabulary/elements.js +410 -0
- package/dist/vocabulary/elements.js.map +1 -0
- package/dist/vocabulary/types.d.ts +175 -0
- package/dist/vocabulary/types.d.ts.map +1 -0
- package/dist/vocabulary/types.js +11 -0
- package/dist/vocabulary/types.js.map +1 -0
- package/dist/wasi-host.d.ts +24 -0
- package/dist/wasi-host.d.ts.map +1 -0
- package/dist/wasi-host.js +140 -0
- package/dist/wasi-host.js.map +1 -0
- package/live-templates.xml +62 -0
- package/manifest/files.json +373 -0
- package/manifest/manifest.json +4965 -0
- package/manifest/manifest.schema.json +513 -0
- package/package.json +404 -4
- package/src/cli.ts +21 -0
- package/src/components/css/accordion/accordion.css +102 -0
- package/src/components/css/accordion/accordion.ts +50 -0
- package/src/components/css/alert/alert.css +53 -0
- package/src/components/css/alert/alert.ts +48 -0
- package/src/components/css/avatar/avatar.css +96 -0
- package/src/components/css/avatar/avatar.ts +57 -0
- package/src/components/css/badge/badge.css +42 -0
- package/src/components/css/badge/badge.ts +43 -0
- package/src/components/css/breadcrumbs/breadcrumbs.css +62 -0
- package/src/components/css/breadcrumbs/breadcrumbs.ts +30 -0
- package/src/components/css/button/button.css +128 -0
- package/src/components/css/button/button.ts +44 -0
- package/src/components/css/card/card.css +65 -0
- package/src/components/css/card/card.ts +50 -0
- package/src/components/css/checkbox/checkbox.css +114 -0
- package/src/components/css/checkbox/checkbox.ts +50 -0
- package/src/components/css/divider/divider.css +38 -0
- package/src/components/css/divider/divider.ts +42 -0
- package/src/components/css/error-text/error-text.css +21 -0
- package/src/components/css/error-text/error-text.ts +37 -0
- package/src/components/css/fieldset/fieldset.css +72 -0
- package/src/components/css/fieldset/fieldset.ts +87 -0
- package/src/components/css/file-upload/file-upload.css +102 -0
- package/src/components/css/file-upload/file-upload.ts +65 -0
- package/src/components/css/heading/heading.css +33 -0
- package/src/components/css/heading/heading.ts +42 -0
- package/src/components/css/help-text/help-text.css +24 -0
- package/src/components/css/help-text/help-text.ts +42 -0
- package/src/components/css/icon/icon.css +20 -0
- package/src/components/css/icon/icon.ts +44 -0
- package/src/components/css/input/input.css +145 -0
- package/src/components/css/input/input.ts +77 -0
- package/src/components/css/label/label.css +42 -0
- package/src/components/css/label/label.ts +51 -0
- package/src/components/css/link/link.css +38 -0
- package/src/components/css/link/link.ts +38 -0
- package/src/components/css/list/list.css +53 -0
- package/src/components/css/list/list.ts +44 -0
- package/src/components/css/pagination/pagination.css +95 -0
- package/src/components/css/pagination/pagination.ts +33 -0
- package/src/components/css/paragraph/paragraph.css +31 -0
- package/src/components/css/paragraph/paragraph.ts +53 -0
- package/src/components/css/progress/progress.css +161 -0
- package/src/components/css/progress/progress.ts +78 -0
- package/src/components/css/radio/radio.css +94 -0
- package/src/components/css/radio/radio.ts +50 -0
- package/src/components/css/search/search.css +50 -0
- package/src/components/css/search/search.ts +56 -0
- package/src/components/css/select/select.css +321 -0
- package/src/components/css/select/select.ts +63 -0
- package/src/components/css/shared.ts +199 -0
- package/src/components/css/skeleton/skeleton.css +62 -0
- package/src/components/css/skeleton/skeleton.ts +43 -0
- package/src/components/css/skip-link/skip-link.css +41 -0
- package/src/components/css/skip-link/skip-link.ts +22 -0
- package/src/components/css/spinner/spinner.css +48 -0
- package/src/components/css/spinner/spinner.ts +48 -0
- package/src/components/css/sr-only/sr-only.css +16 -0
- package/src/components/css/sr-only/sr-only.ts +21 -0
- package/src/components/css/switch/switch.css +105 -0
- package/src/components/css/switch/switch.ts +50 -0
- package/src/components/css/table/table.css +159 -0
- package/src/components/css/table/table.ts +107 -0
- package/src/components/css/tag/tag.css +58 -0
- package/src/components/css/tag/tag.ts +49 -0
- package/src/components/css/textarea/textarea.css +83 -0
- package/src/components/css/textarea/textarea.ts +40 -0
- package/src/components/css/toggle-group/toggle-group.css +92 -0
- package/src/components/css/toggle-group/toggle-group.ts +37 -0
- package/src/components/css/tooltip/tooltip.css +89 -0
- package/src/components/css/tooltip/tooltip.ts +37 -0
- package/src/components/default-texts.ts +34 -0
- package/src/components/events.ts +68 -0
- package/src/components/frame/dialog/dialog.css +306 -0
- package/src/components/frame/dialog/dialog.ts +166 -0
- package/src/components/frame/dialog/lt-dialog.ts +510 -0
- package/src/components/frame/error-summary/error-summary.css +47 -0
- package/src/components/frame/error-summary/error-summary.ts +56 -0
- package/src/components/frame/error-summary/lt-error-summary.ts +344 -0
- package/src/components/frame/field/field-core.ts +152 -0
- package/src/components/frame/field/field.css +17 -0
- package/src/components/frame/field/lt-field.ts +753 -0
- package/src/components/frame/popover/lt-popover.ts +555 -0
- package/src/components/frame/popover/popover.css +50 -0
- package/src/components/frame/popover/popover.ts +102 -0
- package/src/components/frame/session-timeout/lt-session-timeout.ts +681 -0
- package/src/components/frame/session-timeout/session-timeout.css +50 -0
- package/src/components/frame/session-timeout/session-timeout.ts +156 -0
- package/src/components/frame/suggestion/lt-suggestion.ts +1358 -0
- package/src/components/frame/suggestion/suggestion.css +132 -0
- package/src/components/frame/suggestion/suggestion.ts +172 -0
- package/src/components/frame/tabs/lt-tabs.ts +1319 -0
- package/src/components/frame/tabs/tabs.css +128 -0
- package/src/components/frame/tabs/tabs.ts +188 -0
- package/src/components/host-element.ts +400 -0
- package/src/components/standalone/connection-status/connection-status.css +41 -0
- package/src/components/standalone/connection-status/connection-status.ts +41 -0
- package/src/components/standalone/connection-status/lt-connection-status.ts +242 -0
- package/src/components/standalone/toast/lt-toast.ts +300 -0
- package/src/components/standalone/toast/toast.css +78 -0
- package/src/components/standalone/toast/toast.ts +70 -0
- package/src/diagnostics/core.ts +210 -0
- package/src/diagnostics/default-core.ts +81 -0
- package/src/diagnostics/index.ts +150 -0
- package/src/dom.ts +185 -0
- package/src/index.ts +218 -0
- package/src/jsx/react.ts +212 -0
- package/src/lt.ts +192 -0
- package/src/react.ts +411 -0
- package/src/register.ts +43 -0
- package/src/tailwind/tailwind.css +169 -0
- package/src/tokens/boundary.css +104 -0
- package/src/tokens/color-contract.json +231 -0
- package/src/tokens/color.ts +150 -0
- package/src/tokens/contract.ts +24 -0
- package/src/tokens/matrix-cells.ts +375 -0
- package/src/tokens/matrix.ts +32 -0
- package/src/tokens/theme-check.ts +51 -0
- package/src/tokens/theme.ts +104 -0
- package/src/tokens/tokens.css +569 -0
- package/src/tokens/tokens.ts +223 -0
- package/src/vocabulary/classes.ts +1322 -0
- package/src/vocabulary/elements.ts +412 -0
- package/src/vocabulary/types.ts +178 -0
- package/src/wasi-host.ts +155 -0
- 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
|
+
}
|