@statistikzh/leu 0.28.0 → 0.28.2
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/dist/{Accordion-D9kLsiBW.js → Accordion-CaDTUDJG.js} +1 -1
- package/dist/Accordion.js +2 -2
- package/dist/{Button-DyNVOHCd.js → Button-BF3_6xgs.js} +3 -3
- package/dist/Button.js +4 -4
- package/dist/{ButtonGroup-MEh4vb5a.js → ButtonGroup-grJiWGHI.js} +2 -2
- package/dist/ButtonGroup.js +5 -5
- package/dist/{ChartWrapper-DAl91BIN.js → ChartWrapper-CeolXijF.js} +2 -2
- package/dist/ChartWrapper.js +3 -3
- package/dist/{Checkbox-CGGyUW9U.js → Checkbox-DGUZ1XtB.js} +2 -2
- package/dist/Checkbox.js +3 -3
- package/dist/{CheckboxGroup-DXt5iMdj.js → CheckboxGroup-CGdyk_RP.js} +2 -2
- package/dist/CheckboxGroup.js +4 -4
- package/dist/{Chip-BGs71WGH.js → Chip-BpKH3_Nk.js} +1 -1
- package/dist/Chip.js +2 -2
- package/dist/{ChipGroup-BcGyusP-.js → ChipGroup-dSAMpfy1.js} +1 -1
- package/dist/ChipGroup.js +3 -3
- package/dist/ChipLink.js +2 -2
- package/dist/ChipRemovable.js +3 -3
- package/dist/ChipSelectable.js +2 -2
- package/dist/{Dialog-BzuyL1U3.js → Dialog-CC674l80.js} +2 -2
- package/dist/Dialog.js +3 -3
- package/dist/{Dropdown-plyBTM15.js → Dropdown-B9YTM5N_.js} +5 -5
- package/dist/Dropdown.d.ts +2 -2
- package/dist/Dropdown.js +8 -8
- package/dist/{FileInput-BT3Fe-0J.js → FileInput-D4kyWFkL.js} +8 -6
- package/dist/FileInput.d.ts +1 -1
- package/dist/FileInput.js +6 -6
- package/dist/{Icon-D83qesg5.js → Icon-DOcb_NlX.js} +1 -1
- package/dist/Icon.js +2 -2
- package/dist/{Input-D7zS50oz.js → Input-6Xu1N2sA.js} +2 -2
- package/dist/Input.js +3 -3
- package/dist/{LeuElement-DQI8cqZV.js → LeuElement-C3HedxlQ.js} +1 -1
- package/dist/{Menu-DRU1LiMM.js → Menu-CJtyuUvP.js} +2 -2
- package/dist/{Menu-Z2b7dsB5.d.ts → Menu-txbYINTW.d.ts} +1 -1
- package/dist/Menu.d.ts +1 -1
- package/dist/Menu.js +4 -4
- package/dist/{MenuItem-LY4TRIho.d.ts → MenuItem-9TTOrL0Z.d.ts} +1 -1
- package/dist/{MenuItem-DCttylRO.js → MenuItem-ClSE3auh.js} +2 -2
- package/dist/MenuItem.d.ts +1 -1
- package/dist/MenuItem.js +3 -3
- package/dist/{Message-0NxnKEqw.js → Message-C55ydBaU.js} +2 -2
- package/dist/Message.js +3 -3
- package/dist/{Pagination-CIy7YvWE.js → Pagination-BVwKLcd5.js} +4 -4
- package/dist/Pagination.js +6 -6
- package/dist/{Placeholder-Dol_X5Hp.js → Placeholder-DFNppiVf.js} +1 -1
- package/dist/Placeholder.js +2 -2
- package/dist/{Popup-nJrJHGSy.js → Popup-D91ZiFWh.js} +1 -1
- package/dist/Popup.js +2 -2
- package/dist/{ProgressBar-Dmq9veqU.js → ProgressBar-DQGO2we8.js} +1 -1
- package/dist/ProgressBar.js +2 -2
- package/dist/{Radio-W5ck_IJI.js → Radio-BetZNoUQ.js} +1 -1
- package/dist/Radio.js +2 -2
- package/dist/{RadioGroup-De5x2YCO.js → RadioGroup-DzW5z_SD.js} +2 -2
- package/dist/RadioGroup.js +3 -3
- package/dist/{Range-NCdfDkeD.js → Range-9ijUzrty.js} +1 -1
- package/dist/Range.js +2 -2
- package/dist/{ScrollTop-DwcNIKmN.js → ScrollTop-uDL4K_C6.js} +3 -3
- package/dist/ScrollTop.js +5 -5
- package/dist/{Select-Bpicra9q.js → Select-ClGNTYfp.js} +7 -7
- package/dist/Select.d.ts +2 -2
- package/dist/Select.js +9 -9
- package/dist/{Spinner-BBiVZxFH.js → Spinner-B7ikVfUZ.js} +1 -1
- package/dist/Spinner.js +2 -2
- package/dist/{Tab-Ce9nrDok.js → Tab-CSHR71IX.js} +1 -1
- package/dist/Tab.js +2 -2
- package/dist/{TabGroup-C-cd4Wcx.js → TabGroup-D7YbKXm8.js} +3 -3
- package/dist/TabGroup.js +4 -4
- package/dist/{TabPanel-BW1ydVBT.js → TabPanel-D_RHF3lv.js} +1 -1
- package/dist/TabPanel.js +2 -2
- package/dist/{Table-DiYqIzBu.js → Table-CdosaNFb.js} +3 -3
- package/dist/Table.js +7 -7
- package/dist/{Tag-Ct8Hhv7W.js → Tag-BQBgkkAs.js} +1 -1
- package/dist/Tag.js +2 -2
- package/dist/{VisuallyHidden-CpYXyuC7.js → VisuallyHidden-CEBTA6hv.js} +1 -1
- package/dist/VisuallyHidden.js +2 -2
- package/dist/custom-elements.json +6445 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +30 -30
- package/dist/leu-accordion.js +2 -2
- package/dist/leu-button-group.js +5 -5
- package/dist/leu-button.js +4 -4
- package/dist/leu-chart-wrapper.js +3 -3
- package/dist/leu-checkbox-group.js +4 -4
- package/dist/leu-checkbox.js +3 -3
- package/dist/leu-chip-group.js +3 -3
- package/dist/leu-chip-link.js +2 -2
- package/dist/leu-chip-removable.js +3 -3
- package/dist/leu-chip-selectable.js +2 -2
- package/dist/leu-dialog.js +3 -3
- package/dist/leu-dropdown.js +8 -8
- package/dist/leu-file-input.js +6 -6
- package/dist/leu-icon.js +2 -2
- package/dist/leu-input.js +3 -3
- package/dist/leu-menu-item.d.ts +1 -1
- package/dist/leu-menu-item.js +3 -3
- package/dist/leu-menu.d.ts +1 -1
- package/dist/leu-menu.js +4 -4
- package/dist/leu-message.js +3 -3
- package/dist/leu-pagination.js +6 -6
- package/dist/leu-placeholder.js +2 -2
- package/dist/leu-popup.js +2 -2
- package/dist/leu-progress-bar.js +2 -2
- package/dist/leu-radio-group.js +3 -3
- package/dist/leu-radio.js +2 -2
- package/dist/leu-range.js +2 -2
- package/dist/leu-scroll-top.js +5 -5
- package/dist/leu-select.js +9 -9
- package/dist/leu-spinner.js +2 -2
- package/dist/leu-tab-group.js +4 -4
- package/dist/leu-tab-panel.js +2 -2
- package/dist/leu-tab.js +2 -2
- package/dist/leu-table.js +7 -7
- package/dist/leu-tag.js +2 -2
- package/dist/leu-visually-hidden.js +2 -2
- package/dist/web-types.json +1 -1
- package/package.json +9 -4
- package/.editorconfig +0 -29
- package/.github/workflows/ci.yml +0 -81
- package/.github/workflows/deploy-github-pages.yaml +0 -34
- package/.github/workflows/publish.yml +0 -30
- package/.github/workflows/release-please.yml +0 -19
- package/.husky/commit-msg +0 -1
- package/.husky/pre-commit +0 -1
- package/.nvmrc +0 -1
- package/.prettierignore +0 -2
- package/.release-please-manifest.json +0 -3
- package/.storybook/main.ts +0 -34
- package/.storybook/manager-head.html +0 -1
- package/.storybook/manager.ts +0 -6
- package/.storybook/preview.ts +0 -96
- package/.storybook/static/fonts/Inter-Black.woff2 +0 -0
- package/.storybook/static/fonts/Inter-Regular.woff2 +0 -0
- package/.storybook/static/fonts.css +0 -11
- package/.storybook/static/global.css +0 -5
- package/.storybook/static/logo.svg +0 -19
- package/.storybook/theme.ts +0 -8
- package/CHANGELOG.md +0 -594
- package/CODE_OF_CONDUCT.md +0 -128
- package/CONTRIBUTING.md +0 -42
- package/commitlint.config.cjs +0 -1
- package/custom-elements-manifest.config.js +0 -46
- package/eslint.config.mjs +0 -79
- package/postcss.config.cjs +0 -16
- package/release-please-config.json +0 -9
- package/scripts/generate-component/generate.js +0 -167
- package/scripts/generate-component/templates/[Name].ts +0 -31
- package/scripts/generate-component/templates/[name].css +0 -6
- package/scripts/generate-component/templates/[namespace]-[name].ts +0 -11
- package/scripts/generate-component/templates/stories/[name].stories.ts +0 -26
- package/scripts/generate-component/templates/test/[name].test.ts +0 -23
- package/scripts/postcss-leu-font-styles.cjs +0 -154
- package/src/components/accordion/Accordion.ts +0 -108
- package/src/components/accordion/accordion.css +0 -150
- package/src/components/accordion/leu-accordion.ts +0 -11
- package/src/components/accordion/stories/accordion.stories.ts +0 -62
- package/src/components/accordion/test/accordion.test.ts +0 -118
- package/src/components/button/Button.ts +0 -286
- package/src/components/button/button.css +0 -317
- package/src/components/button/leu-button.ts +0 -11
- package/src/components/button/stories/button.stories.ts +0 -366
- package/src/components/button/test/button.test.ts +0 -417
- package/src/components/button-group/ButtonGroup.ts +0 -97
- package/src/components/button-group/button-group.css +0 -5
- package/src/components/button-group/leu-button-group.ts +0 -11
- package/src/components/button-group/stories/button-group.stories.ts +0 -54
- package/src/components/button-group/test/button-group.test.ts +0 -105
- package/src/components/chart-wrapper/ChartWrapper.ts +0 -78
- package/src/components/chart-wrapper/chart-wrapper.css +0 -87
- package/src/components/chart-wrapper/leu-chart-wrapper.ts +0 -11
- package/src/components/chart-wrapper/stories/chart-wrapper.stories.ts +0 -58
- package/src/components/chart-wrapper/test/chart-wrapper.test.ts +0 -77
- package/src/components/checkbox/Checkbox.ts +0 -129
- package/src/components/checkbox/CheckboxGroup.ts +0 -57
- package/src/components/checkbox/checkbox-group.css +0 -29
- package/src/components/checkbox/checkbox.css +0 -81
- package/src/components/checkbox/leu-checkbox-group.ts +0 -11
- package/src/components/checkbox/leu-checkbox.ts +0 -11
- package/src/components/checkbox/stories/checkbox-group.stories.ts +0 -59
- package/src/components/checkbox/stories/checkbox.stories.ts +0 -72
- package/src/components/checkbox/test/checkbox-group.test.ts +0 -109
- package/src/components/checkbox/test/checkbox.test.ts +0 -247
- package/src/components/chip/Chip.ts +0 -19
- package/src/components/chip/ChipGroup.ts +0 -122
- package/src/components/chip/ChipLink.ts +0 -24
- package/src/components/chip/ChipRemovable.ts +0 -45
- package/src/components/chip/ChipSelectable.ts +0 -80
- package/src/components/chip/chip-group.css +0 -15
- package/src/components/chip/chip.css +0 -139
- package/src/components/chip/exports.ts +0 -4
- package/src/components/chip/leu-chip-group.ts +0 -11
- package/src/components/chip/leu-chip-link.ts +0 -11
- package/src/components/chip/leu-chip-removable.ts +0 -11
- package/src/components/chip/leu-chip-selectable.ts +0 -11
- package/src/components/chip/stories/chip-group.stories.ts +0 -159
- package/src/components/chip/stories/chip-link.stories.ts +0 -45
- package/src/components/chip/stories/chip-removable.stories.ts +0 -42
- package/src/components/chip/stories/chip-selectable.stories.ts +0 -54
- package/src/components/chip/test/chip-group.test.ts +0 -171
- package/src/components/chip/test/chip-link.test.ts +0 -54
- package/src/components/chip/test/chip-removable.test.ts +0 -105
- package/src/components/chip/test/chip-selectable.test.ts +0 -101
- package/src/components/chip/test/chip.test.ts +0 -22
- package/src/components/dialog/Dialog.ts +0 -86
- package/src/components/dialog/dialog.css +0 -157
- package/src/components/dialog/leu-dialog.ts +0 -11
- package/src/components/dialog/stories/dialog.stories.ts +0 -142
- package/src/components/dialog/test/dialog.test.ts +0 -85
- package/src/components/dropdown/Dropdown.ts +0 -152
- package/src/components/dropdown/dropdown.css +0 -16
- package/src/components/dropdown/leu-dropdown.ts +0 -11
- package/src/components/dropdown/stories/dropdown.stories.ts +0 -58
- package/src/components/dropdown/test/dropdown.test.ts +0 -59
- package/src/components/file-input/FileInput.ts +0 -322
- package/src/components/file-input/file-input.css +0 -118
- package/src/components/file-input/leu-file-input.ts +0 -11
- package/src/components/file-input/stories/file-input.stories.ts +0 -45
- package/src/components/file-input/test/file-input.test.ts +0 -38
- package/src/components/icon/Icon.ts +0 -47
- package/src/components/icon/icon.css +0 -10
- package/src/components/icon/leu-icon.ts +0 -11
- package/src/components/icon/paths.ts +0 -219
- package/src/components/icon/stories/icon.stories.ts +0 -79
- package/src/components/icon/test/icon.test.ts +0 -50
- package/src/components/input/Input.ts +0 -469
- package/src/components/input/input.css +0 -238
- package/src/components/input/leu-input.ts +0 -11
- package/src/components/input/stories/input.stories.ts +0 -204
- package/src/components/input/test/input.test.ts +0 -603
- package/src/components/menu/Menu.ts +0 -149
- package/src/components/menu/MenuItem.ts +0 -168
- package/src/components/menu/leu-menu-item.ts +0 -11
- package/src/components/menu/leu-menu.ts +0 -11
- package/src/components/menu/menu-item.css +0 -77
- package/src/components/menu/menu.css +0 -19
- package/src/components/menu/stories/menu-item.stories.ts +0 -81
- package/src/components/menu/stories/menu.stories.ts +0 -54
- package/src/components/menu/test/menu-item.test.ts +0 -210
- package/src/components/menu/test/menu.test.ts +0 -125
- package/src/components/message/Message.ts +0 -118
- package/src/components/message/leu-message.ts +0 -11
- package/src/components/message/message.css +0 -163
- package/src/components/message/stories/message.mdx +0 -76
- package/src/components/message/stories/message.stories.ts +0 -149
- package/src/components/message/test/message.test.ts +0 -96
- package/src/components/pagination/Pagination.ts +0 -192
- package/src/components/pagination/leu-pagination.ts +0 -11
- package/src/components/pagination/pagination.css +0 -54
- package/src/components/pagination/stories/pagination.stories.ts +0 -115
- package/src/components/pagination/test/pagination.test.ts +0 -210
- package/src/components/placeholder/Placeholder.ts +0 -33
- package/src/components/placeholder/leu-placeholder.ts +0 -11
- package/src/components/placeholder/placeholder.css +0 -59
- package/src/components/placeholder/stories/placeholder.stories.ts +0 -34
- package/src/components/placeholder/test/placeholder.test.ts +0 -31
- package/src/components/popup/Popup.ts +0 -264
- package/src/components/popup/leu-popup.ts +0 -11
- package/src/components/popup/popup.css +0 -24
- package/src/components/popup/stories/popup.stories.ts +0 -117
- package/src/components/popup/test/popup.test.ts +0 -90
- package/src/components/progress-bar/ProgressBar.ts +0 -52
- package/src/components/progress-bar/leu-progress-bar.ts +0 -11
- package/src/components/progress-bar/progress-bar.css +0 -97
- package/src/components/progress-bar/stories/progress-bar.stories.ts +0 -39
- package/src/components/progress-bar/test/progress-bar.test.ts +0 -61
- package/src/components/radio/Radio.ts +0 -59
- package/src/components/radio/RadioGroup.ts +0 -181
- package/src/components/radio/leu-radio-group.ts +0 -11
- package/src/components/radio/leu-radio.ts +0 -11
- package/src/components/radio/radio-group.css +0 -29
- package/src/components/radio/radio.css +0 -76
- package/src/components/radio/stories/radio-group.stories.ts +0 -54
- package/src/components/radio/stories/radio.stories.ts +0 -55
- package/src/components/radio/test/radio-group.test.ts +0 -83
- package/src/components/radio/test/radio.test.ts +0 -119
- package/src/components/range/Range.ts +0 -400
- package/src/components/range/leu-range.ts +0 -11
- package/src/components/range/range.css +0 -227
- package/src/components/range/stories/range.stories.ts +0 -185
- package/src/components/range/test/range.test.ts +0 -228
- package/src/components/scroll-top/ScrollTop.ts +0 -91
- package/src/components/scroll-top/leu-scroll-top.ts +0 -11
- package/src/components/scroll-top/scroll-top.css +0 -50
- package/src/components/scroll-top/stories/scroll-top.stories.ts +0 -217
- package/src/components/scroll-top/test/scroll-top.test.ts +0 -22
- package/src/components/select/Select.ts +0 -570
- package/src/components/select/leu-select.ts +0 -11
- package/src/components/select/select.css +0 -222
- package/src/components/select/stories/select.stories.ts +0 -173
- package/src/components/select/test/fixtures.ts +0 -162
- package/src/components/select/test/select.test.ts +0 -937
- package/src/components/spinner/Spinner.ts +0 -31
- package/src/components/spinner/leu-spinner.ts +0 -11
- package/src/components/spinner/spinner.css +0 -20
- package/src/components/spinner/stories/spinner.stories.ts +0 -29
- package/src/components/spinner/test/spinner.test.ts +0 -30
- package/src/components/tab/Tab.ts +0 -72
- package/src/components/tab/TabGroup.ts +0 -267
- package/src/components/tab/TabPanel.ts +0 -59
- package/src/components/tab/leu-tab-group.ts +0 -11
- package/src/components/tab/leu-tab-panel.ts +0 -11
- package/src/components/tab/leu-tab.ts +0 -11
- package/src/components/tab/stories/tab.stories.ts +0 -97
- package/src/components/tab/tab-group.css +0 -63
- package/src/components/tab/tab-panel.css +0 -10
- package/src/components/tab/tab.css +0 -54
- package/src/components/tab/test/tab-group.test.ts +0 -426
- package/src/components/tab/test/tab-panel.test.ts +0 -102
- package/src/components/tab/test/tab.test.ts +0 -139
- package/src/components/table/Table.ts +0 -253
- package/src/components/table/leu-table.ts +0 -11
- package/src/components/table/stories/table.stories.ts +0 -131
- package/src/components/table/table.css +0 -112
- package/src/components/table/test/table.test.ts +0 -37
- package/src/components/tag/Tag.ts +0 -28
- package/src/components/tag/leu-tag.ts +0 -11
- package/src/components/tag/stories/tag.stories.ts +0 -107
- package/src/components/tag/tag.css +0 -42
- package/src/components/tag/test/tag.test.ts +0 -28
- package/src/components/visually-hidden/VisuallyHidden.ts +0 -16
- package/src/components/visually-hidden/leu-visually-hidden.ts +0 -11
- package/src/components/visually-hidden/stories/visually-hidden.stories.ts +0 -22
- package/src/components/visually-hidden/test/visually-hidden.test.ts +0 -34
- package/src/components/visually-hidden/visually-hidden.css +0 -10
- package/src/docs/contributing.mdx +0 -154
- package/src/docs/installation.mdx +0 -35
- package/src/docs/theme.mdx +0 -400
- package/src/docs/usage.mdx +0 -73
- package/src/global.d.ts +0 -11
- package/src/index.ts +0 -29
- package/src/lib/LeuElement.ts +0 -43
- package/src/lib/a11y.ts +0 -26
- package/src/lib/hasSlotController.ts +0 -74
- package/src/lib/mixins/FormAssociatedMixin.ts +0 -115
- package/src/lib/styleMap.ts +0 -139
- package/src/lib/utils.ts +0 -45
- package/src/styles/common-styles.css +0 -14
- package/src/styles/custom-media.css +0 -6
- package/src/styles/font-definitions.json +0 -210
- package/src/styles/style.stories.ts +0 -64
- package/src/styles/theme.css +0 -90
- package/stat_zh.png +0 -0
- package/stylelint.config.mjs +0 -23
- package/tsconfig.build.json +0 -24
- package/tsconfig.json +0 -14
- package/tsdown.config.ts +0 -35
- package/web-test-runner.config.mjs +0 -102
|
@@ -1,469 +0,0 @@
|
|
|
1
|
-
import { html, nothing, PropertyValues } from "lit"
|
|
2
|
-
import { classMap } from "lit/directives/class-map.js"
|
|
3
|
-
import { ifDefined } from "lit/directives/if-defined.js"
|
|
4
|
-
import { live } from "lit/directives/live.js"
|
|
5
|
-
import { createRef, ref } from "lit/directives/ref.js"
|
|
6
|
-
import { property, state } from "lit/decorators.js"
|
|
7
|
-
|
|
8
|
-
import { LeuElement } from "../../lib/LeuElement.js"
|
|
9
|
-
import { LeuIcon } from "../icon/Icon.js"
|
|
10
|
-
|
|
11
|
-
import styles from "./input.css?inline"
|
|
12
|
-
import { IconPathName } from "../icon/paths.js"
|
|
13
|
-
import { FormAssociatedMixin } from "../../lib/mixins/FormAssociatedMixin.js"
|
|
14
|
-
|
|
15
|
-
export const SIZES = Object.freeze({
|
|
16
|
-
SMALL: "small",
|
|
17
|
-
REGULAR: "regular",
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
type InputType =
|
|
21
|
-
| "date"
|
|
22
|
-
| "datetime-local"
|
|
23
|
-
| "email"
|
|
24
|
-
| "month"
|
|
25
|
-
| "number"
|
|
26
|
-
| "password"
|
|
27
|
-
| "search"
|
|
28
|
-
| "tel"
|
|
29
|
-
| "text"
|
|
30
|
-
| "time"
|
|
31
|
-
| "week"
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* TODO:
|
|
35
|
-
* - Add section to docs about how to mark up suffix and prefix for screenreaders
|
|
36
|
-
* - Handle validation
|
|
37
|
-
* - Infotext attribute or slot?
|
|
38
|
-
*/
|
|
39
|
-
|
|
40
|
-
const VALIDATION_MESSAGES = {
|
|
41
|
-
badInput: "Bitte überprüfen Sie das Format.",
|
|
42
|
-
patternMismatch: "Bitte überprüfen Sie das Format.",
|
|
43
|
-
rangeOverflow: (max) => `Der Wert darf nicht grösser als ${max} sein.`,
|
|
44
|
-
rangeUnderflow: (min) => `Der Wert darf nicht kleiner als ${min} sein.`,
|
|
45
|
-
stepMismatch: "Bitte überprüfen Sie das Format.",
|
|
46
|
-
tooLong: (maxlength) =>
|
|
47
|
-
`Die Eingabe muss kürzer als ${maxlength} Zeichen sein.`,
|
|
48
|
-
tooShort: (minlength) =>
|
|
49
|
-
`Die Eingabe muss länger als ${minlength} Zeichen sein.`,
|
|
50
|
-
typeMismatch: "Bitte überprüfen Sie das Format.",
|
|
51
|
-
valueMissing: "Bitte füllen Sie das Feld aus.",
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* A text input element.
|
|
56
|
-
*
|
|
57
|
-
* @fires {CustomEvent} input - Dispatched when the value of the input element changes.
|
|
58
|
-
* @fires {CustomEvent} change - Dispatched when the value of the input element changes and the input element loses focus.
|
|
59
|
-
*
|
|
60
|
-
* @tagname leu-input
|
|
61
|
-
*/
|
|
62
|
-
export class LeuInput extends FormAssociatedMixin(LeuElement) {
|
|
63
|
-
static dependencies = {
|
|
64
|
-
"leu-icon": LeuIcon,
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
static styles = [LeuElement.styles, styles]
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* @internal
|
|
71
|
-
*/
|
|
72
|
-
static shadowRootOptions = {
|
|
73
|
-
...LeuElement.shadowRootOptions,
|
|
74
|
-
delegatesFocus: true,
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** Disables the input element. */
|
|
78
|
-
@property({ type: Boolean, reflect: true })
|
|
79
|
-
disabled: boolean = false
|
|
80
|
-
|
|
81
|
-
/** Marks the input element as required */
|
|
82
|
-
@property({ type: Boolean, reflect: true })
|
|
83
|
-
required: boolean = false
|
|
84
|
-
|
|
85
|
-
/** Adds a button to clear the input element */
|
|
86
|
-
@property({ type: Boolean, reflect: true })
|
|
87
|
-
clearable: boolean = false
|
|
88
|
-
|
|
89
|
-
/** A custom error that is completely independent of the validity state. Useful for displaying server side errors. */
|
|
90
|
-
@property({ type: String, reflect: true })
|
|
91
|
-
error: string = ""
|
|
92
|
-
|
|
93
|
-
/** The label of the input element */
|
|
94
|
-
@property({ type: String, reflect: true })
|
|
95
|
-
label: string = ""
|
|
96
|
-
|
|
97
|
-
/** A prefix that relates to the value of the input (e.g. CHF) */
|
|
98
|
-
@property({ type: String, reflect: true })
|
|
99
|
-
prefix: string
|
|
100
|
-
|
|
101
|
-
/** A suffix that relates to the value of the input (e.g. mm). */
|
|
102
|
-
@property({ type: String, reflect: true })
|
|
103
|
-
suffix: string
|
|
104
|
-
|
|
105
|
-
/** The size of the input element */
|
|
106
|
-
@property({ type: String, reflect: true })
|
|
107
|
-
size: "small" | "regular" = "regular"
|
|
108
|
-
|
|
109
|
-
/** The icon that is displayed at the end of the input element */
|
|
110
|
-
@property({ type: String, reflect: true })
|
|
111
|
-
icon: IconPathName
|
|
112
|
-
|
|
113
|
-
/** A regular expression that the value is checked against. */
|
|
114
|
-
@property({ type: String, reflect: true })
|
|
115
|
-
pattern: string
|
|
116
|
-
|
|
117
|
-
/** The type of the input element. */
|
|
118
|
-
@property({ type: String, reflect: true })
|
|
119
|
-
type: InputType = "text"
|
|
120
|
-
|
|
121
|
-
/** The minimum value of the input element. */
|
|
122
|
-
@property({ type: Number, reflect: true })
|
|
123
|
-
min: number
|
|
124
|
-
|
|
125
|
-
/** The maximum value of the input element. */
|
|
126
|
-
@property({ type: Number, reflect: true })
|
|
127
|
-
max: number
|
|
128
|
-
|
|
129
|
-
/** The step value of the input element. */
|
|
130
|
-
@property({ type: Number, reflect: true })
|
|
131
|
-
step: number
|
|
132
|
-
|
|
133
|
-
/** The maximum length of the input element. */
|
|
134
|
-
@property({ type: Number, reflect: true })
|
|
135
|
-
maxlength: number
|
|
136
|
-
|
|
137
|
-
/** The minimum length of the input element. */
|
|
138
|
-
@property({ type: Number, reflect: true })
|
|
139
|
-
minlength: number
|
|
140
|
-
|
|
141
|
-
/** Custom validation messages. The key is the name of the validity state and the value is the message. */
|
|
142
|
-
@property({ type: Object })
|
|
143
|
-
validationMessages: Record<string, string> = {}
|
|
144
|
-
|
|
145
|
-
/** Disables the browser's validation. */
|
|
146
|
-
@property({ type: Boolean, reflect: true })
|
|
147
|
-
novalidate: boolean = false
|
|
148
|
-
|
|
149
|
-
/** The default value of the input element. */
|
|
150
|
-
@property({ type: String, reflect: true, attribute: "value" })
|
|
151
|
-
defaultValue: string = ""
|
|
152
|
-
|
|
153
|
-
protected _value: string
|
|
154
|
-
|
|
155
|
-
/** The value of the input element. */
|
|
156
|
-
@property({ type: String, attribute: false })
|
|
157
|
-
set value(value: string) {
|
|
158
|
-
this._value = value
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
get value(): string {
|
|
162
|
-
if (typeof this._value === "string") {
|
|
163
|
-
return this._value
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return this.defaultValue
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
@state()
|
|
170
|
-
_validity: ValidityState | null = null
|
|
171
|
-
|
|
172
|
-
static resolveErrorMessage(message, refernceValue) {
|
|
173
|
-
if (typeof message === "function") {
|
|
174
|
-
return message(refernceValue)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return message
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
protected _inputRef = createRef<HTMLInputElement>()
|
|
181
|
-
|
|
182
|
-
get valueAsNumber() {
|
|
183
|
-
if (this.value === "") {
|
|
184
|
-
return NaN
|
|
185
|
-
}
|
|
186
|
-
return Number(this.value)
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
formResetCallback() {
|
|
190
|
-
this.value = this.defaultValue
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
protected setFormValue(): void {
|
|
194
|
-
this.internals.setFormValue(this.disabled ? null : this.value)
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
protected willUpdate(changedProperties: PropertyValues<this>): void {
|
|
198
|
-
super.willUpdate(changedProperties)
|
|
199
|
-
let valueChanged = false
|
|
200
|
-
|
|
201
|
-
if (
|
|
202
|
-
changedProperties.has("defaultValue") &&
|
|
203
|
-
!changedProperties.has("value") &&
|
|
204
|
-
!this.hasInteracted
|
|
205
|
-
) {
|
|
206
|
-
this.value = this.defaultValue
|
|
207
|
-
valueChanged = true
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
if (
|
|
211
|
-
valueChanged ||
|
|
212
|
-
changedProperties.has("value") ||
|
|
213
|
-
changedProperties.has("name") ||
|
|
214
|
-
changedProperties.has("disabled")
|
|
215
|
-
) {
|
|
216
|
-
this.setFormValue()
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Method for handling the click event of the wrapper element.
|
|
222
|
-
* Redirect every click on the wrapper to the input element.
|
|
223
|
-
* This is only necessary for click events because the wrapper element
|
|
224
|
-
* looks like the input element. But the actual input field does not
|
|
225
|
-
* completely fill the wrapper element. Keyboard events don't need to be
|
|
226
|
-
* handled because the actual input element is focusable.
|
|
227
|
-
*/
|
|
228
|
-
protected handleWrapperClick(event: MouseEvent | PointerEvent) {
|
|
229
|
-
if (event.target === event.currentTarget) {
|
|
230
|
-
this._inputRef.value.focus()
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Method for handling the blur event of the input element.
|
|
236
|
-
* Checks validity of the input element and sets the validity state.
|
|
237
|
-
*/
|
|
238
|
-
protected handleBlur(event: FocusEvent & { target: HTMLInputElement }) {
|
|
239
|
-
this._validity = null
|
|
240
|
-
|
|
241
|
-
if (!this.novalidate) {
|
|
242
|
-
event.target.checkValidity()
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Method for handling the invalid event of the input element.
|
|
248
|
-
* Sets the validity state.
|
|
249
|
-
*/
|
|
250
|
-
protected handleInvalid(event: Event & { target: HTMLInputElement }) {
|
|
251
|
-
this._validity = event.target.validity
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* Method for handling the change event of the input element.
|
|
256
|
-
* Sets the value property and dispatches a change event so that
|
|
257
|
-
* the event can be handled outside the shadow DOM.
|
|
258
|
-
* @fires {CustomEvent} change
|
|
259
|
-
*/
|
|
260
|
-
protected handleChange(event: Event & { target: HTMLInputElement }) {
|
|
261
|
-
this.hasInteracted = true
|
|
262
|
-
if (event.target.validity.valid) {
|
|
263
|
-
this.value = event.target.value
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
const customEvent = new CustomEvent(event.type, event)
|
|
267
|
-
this.dispatchEvent(customEvent)
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Method for handling the input event of the input element.
|
|
272
|
-
* Sets the value property and dispatches an input event so that
|
|
273
|
-
* the event can be handled outside the shadow DOM.
|
|
274
|
-
*/
|
|
275
|
-
protected handleInput(event: Event & { target: HTMLInputElement }) {
|
|
276
|
-
this.hasInteracted = true
|
|
277
|
-
this.value = event.target.value
|
|
278
|
-
|
|
279
|
-
const customEvent = new CustomEvent("input", {
|
|
280
|
-
bubbles: true,
|
|
281
|
-
composed: true,
|
|
282
|
-
})
|
|
283
|
-
this.dispatchEvent(customEvent)
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* Method for clearing the input element.
|
|
288
|
-
* Sets the value property to an empty string and dispatches
|
|
289
|
-
* an input and a change event.
|
|
290
|
-
* @fires {CustomEvent} input
|
|
291
|
-
* @fires {CustomEvent} change
|
|
292
|
-
*/
|
|
293
|
-
protected clear() {
|
|
294
|
-
this.value = ""
|
|
295
|
-
|
|
296
|
-
this._inputRef.value.focus()
|
|
297
|
-
|
|
298
|
-
this.dispatchEvent(
|
|
299
|
-
new CustomEvent("input", { bubbles: true, composed: true }),
|
|
300
|
-
)
|
|
301
|
-
this.dispatchEvent(
|
|
302
|
-
new CustomEvent("change", { bubbles: true, composed: true }),
|
|
303
|
-
)
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* Merge custom and default validation messages.
|
|
308
|
-
* A validation message can be a function or a string.
|
|
309
|
-
* If it s a function, the function is called with the corresponding
|
|
310
|
-
* attribute value as argument.
|
|
311
|
-
* e.g.
|
|
312
|
-
* `tooLong(this.maxlength)`
|
|
313
|
-
* This way the framework user can create reasonable validation messages
|
|
314
|
-
*/
|
|
315
|
-
protected getValidationMessages() {
|
|
316
|
-
const validationMessages = {
|
|
317
|
-
...VALIDATION_MESSAGES,
|
|
318
|
-
...this.validationMessages,
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const { tooLong, tooShort, rangeOverflow, rangeUnderflow } =
|
|
322
|
-
validationMessages
|
|
323
|
-
|
|
324
|
-
validationMessages.tooLong = LeuInput.resolveErrorMessage(
|
|
325
|
-
tooLong,
|
|
326
|
-
this.maxlength,
|
|
327
|
-
)
|
|
328
|
-
validationMessages.tooShort = LeuInput.resolveErrorMessage(
|
|
329
|
-
tooShort,
|
|
330
|
-
this.minlength,
|
|
331
|
-
)
|
|
332
|
-
validationMessages.rangeOverflow = LeuInput.resolveErrorMessage(
|
|
333
|
-
rangeOverflow,
|
|
334
|
-
this.max,
|
|
335
|
-
)
|
|
336
|
-
validationMessages.rangeUnderflow = LeuInput.resolveErrorMessage(
|
|
337
|
-
rangeUnderflow,
|
|
338
|
-
this.min,
|
|
339
|
-
)
|
|
340
|
-
|
|
341
|
-
return validationMessages
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
isInvalid() {
|
|
345
|
-
if (this.error) {
|
|
346
|
-
return true
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
return this._validity === null || this.novalidate || this.disabled
|
|
350
|
-
? false
|
|
351
|
-
: !this._validity.valid
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
/**
|
|
355
|
-
* Check input validation
|
|
356
|
-
*/
|
|
357
|
-
checkValidity() {
|
|
358
|
-
return this._inputRef.value?.checkValidity() ?? false
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* Creates an error list with an item for the given validity state.
|
|
363
|
-
*/
|
|
364
|
-
protected renderErrorMessages() {
|
|
365
|
-
if (!this.isInvalid()) {
|
|
366
|
-
return nothing
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
const validationMessages = this.getValidationMessages()
|
|
370
|
-
let errorMessages = this._validity
|
|
371
|
-
? Object.entries(validationMessages)
|
|
372
|
-
.filter(([prop]) => this._validity[prop])
|
|
373
|
-
.map(([_, message]) => message)
|
|
374
|
-
: []
|
|
375
|
-
|
|
376
|
-
if (this.error !== "") {
|
|
377
|
-
errorMessages = [this.error, errorMessages]
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
return html`
|
|
381
|
-
<ul class="error" aria-errormessage="input">
|
|
382
|
-
${errorMessages.map(
|
|
383
|
-
(message) => html`<li class="error-message">${message}</li>`,
|
|
384
|
-
)}
|
|
385
|
-
</ul>
|
|
386
|
-
`
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
/**
|
|
390
|
-
* Determines the content that is displayed after the input element.
|
|
391
|
-
* This can be either an icon, a clear button or an error indicator icon.
|
|
392
|
-
*/
|
|
393
|
-
protected renderAfterContent() {
|
|
394
|
-
if (this.isInvalid()) {
|
|
395
|
-
return html`<div class="error-icon">
|
|
396
|
-
<leu-icon name="caution"></leu-icon>
|
|
397
|
-
</div>`
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
if (this.clearable && this.value) {
|
|
401
|
-
return html`<button
|
|
402
|
-
class="clear-button"
|
|
403
|
-
@click=${this.clear}
|
|
404
|
-
aria-label="Eingabefeld zurücksetzen"
|
|
405
|
-
?disabled=${this.disabled}
|
|
406
|
-
>
|
|
407
|
-
<leu-icon name="clear"></leu-icon>
|
|
408
|
-
</button>`
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
if (this.icon) {
|
|
412
|
-
return html`<div class="icon">
|
|
413
|
-
<leu-icon name=${this.icon}></leu-icon>
|
|
414
|
-
</div>`
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
return nothing
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
render() {
|
|
421
|
-
const isInvalid = this.isInvalid()
|
|
422
|
-
|
|
423
|
-
const inputWrapperClasses = {
|
|
424
|
-
"input-wrapper": true,
|
|
425
|
-
"input-wrapper--empty": !this.value,
|
|
426
|
-
"input-wrapper--invalid": isInvalid,
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
/* See the description of the handleWrapperClick method on why this rule is disabled */
|
|
430
|
-
/* eslint-disable lit-a11y/click-events-have-key-events */
|
|
431
|
-
return html`
|
|
432
|
-
<div
|
|
433
|
-
@click=${this.handleWrapperClick}
|
|
434
|
-
class=${classMap(inputWrapperClasses)}
|
|
435
|
-
>
|
|
436
|
-
<input
|
|
437
|
-
class="input"
|
|
438
|
-
id="input"
|
|
439
|
-
type=${this.type}
|
|
440
|
-
name=${this.name}
|
|
441
|
-
@change=${this.handleChange}
|
|
442
|
-
@blur=${this.handleBlur}
|
|
443
|
-
@input=${this.handleInput}
|
|
444
|
-
@invalid=${this.handleInvalid}
|
|
445
|
-
?disabled=${this.disabled}
|
|
446
|
-
?required=${this.required}
|
|
447
|
-
.value=${live(this.value ?? "")}
|
|
448
|
-
pattern=${ifDefined(this.pattern)}
|
|
449
|
-
min=${ifDefined(this.min)}
|
|
450
|
-
max=${ifDefined(this.max)}
|
|
451
|
-
maxlength=${ifDefined(this.maxlength)}
|
|
452
|
-
minlength=${ifDefined(this.minlength)}
|
|
453
|
-
step=${ifDefined(this.step)}
|
|
454
|
-
ref=${ref(this._inputRef)}
|
|
455
|
-
aria-invalid=${isInvalid}
|
|
456
|
-
/>
|
|
457
|
-
<label for="input" class="label">${this.label}</label>
|
|
458
|
-
${this.prefix
|
|
459
|
-
? html`<div class="prefix" .aria-hidden=${true}>${this.prefix}</div>`
|
|
460
|
-
: nothing}
|
|
461
|
-
${this.suffix
|
|
462
|
-
? html`<div class="suffix" .aria-hidden=${true}>${this.suffix}</div>`
|
|
463
|
-
: nothing}
|
|
464
|
-
${this.renderAfterContent()}
|
|
465
|
-
</div>
|
|
466
|
-
${this.renderErrorMessages()}
|
|
467
|
-
`
|
|
468
|
-
}
|
|
469
|
-
}
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
:host {
|
|
2
|
-
--input-color: var(--leu-color-black-100);
|
|
3
|
-
--input-color-disabled: var(--leu-color-black-20);
|
|
4
|
-
--input-color-invalid: var(--leu-color-func-red);
|
|
5
|
-
--input-color-focus: var(--leu-color-func-cyan);
|
|
6
|
-
--input-border-width: 2px;
|
|
7
|
-
|
|
8
|
-
--input-label-color: var(--leu-color-black-100);
|
|
9
|
-
--input-label-color-disabled: var(--input-color-disabled);
|
|
10
|
-
--input-label-color-empty: var(--leu-color-black-60);
|
|
11
|
-
|
|
12
|
-
--input-affix-color: var(--leu-color-black-60);
|
|
13
|
-
--input-affix-color-disabled: var(--input-color-disabled);
|
|
14
|
-
|
|
15
|
-
--input-border-color: var(--leu-color-black-40);
|
|
16
|
-
--input-border-color-focus: var(--input-color-focus);
|
|
17
|
-
--input-border-color-disabled: var(--leu-color-black-20);
|
|
18
|
-
--input-border-color-invalid: var(--input-color-invalid);
|
|
19
|
-
|
|
20
|
-
--input-error-color: var(--leu-color-black-0);
|
|
21
|
-
|
|
22
|
-
--input-clear-color: var(--leu-color-black-60);
|
|
23
|
-
|
|
24
|
-
--input-font-regular: var(--leu-font-family-regular);
|
|
25
|
-
--input-font-black: var(--leu-font-family-black);
|
|
26
|
-
|
|
27
|
-
--input-height: 4.5rem;
|
|
28
|
-
--input-height-small: 3rem;
|
|
29
|
-
|
|
30
|
-
display: block;
|
|
31
|
-
font-family: var(--input-font-regular);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
:host([disabled]) {
|
|
35
|
-
--input-color: var(--input-color-disabled);
|
|
36
|
-
--input-border-color: var(--input-border-color-disabled);
|
|
37
|
-
--input-label-color: var(--input-color-disabled);
|
|
38
|
-
--input-color-focus: var(--input-color-disabled);
|
|
39
|
-
--input-affix-color: var(--input-color-disabled);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
:host(:focus-within) {
|
|
43
|
-
outline: 2px solid var(--input-color-focus);
|
|
44
|
-
outline-offset: 2px;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.input-wrapper {
|
|
48
|
-
position: relative;
|
|
49
|
-
display: flex;
|
|
50
|
-
gap: 0.5rem;
|
|
51
|
-
padding-inline: 0.875rem;
|
|
52
|
-
|
|
53
|
-
border: var(--input-border-width) solid var(--input-border-color);
|
|
54
|
-
border-radius: 2px;
|
|
55
|
-
background: var(--leu-color-black-0);
|
|
56
|
-
|
|
57
|
-
line-height: 1;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.input-wrapper:focus-within,
|
|
61
|
-
.input-wrapper:hover {
|
|
62
|
-
--input-border-color: var(--input-border-color-focus);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
.input-wrapper--invalid,
|
|
66
|
-
.input-wrapper--invalid:is(:hover, :focus-within) {
|
|
67
|
-
--input-border-color: var(--input-border-color-invalid);
|
|
68
|
-
border-radius: 2px 2px 0 0;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
.input {
|
|
72
|
-
appearance: none;
|
|
73
|
-
display: block;
|
|
74
|
-
width: 100%;
|
|
75
|
-
|
|
76
|
-
font-size: 1rem;
|
|
77
|
-
line-height: 1;
|
|
78
|
-
color: var(--input-color);
|
|
79
|
-
|
|
80
|
-
border: 0;
|
|
81
|
-
background: var(--leu-color-black-0);
|
|
82
|
-
|
|
83
|
-
padding-block: 2rem 1rem;
|
|
84
|
-
height: calc(var(--input-height) - var(--input-border-width) * 2);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
.input:focus-visible {
|
|
88
|
-
outline: none;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
:host([size="small"]) .input {
|
|
92
|
-
--input-height: var(--input-height-small);
|
|
93
|
-
padding-block: 0.75rem;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
.prefix,
|
|
97
|
-
.suffix {
|
|
98
|
-
padding-block: calc(2rem - var(--input-border-width))
|
|
99
|
-
calc(1rem - var(--input-border-width));
|
|
100
|
-
font-size: 1rem;
|
|
101
|
-
line-height: 1.5;
|
|
102
|
-
color: var(--input-affix-color);
|
|
103
|
-
pointer-events: none;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
.prefix {
|
|
107
|
-
order: -1;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/* Label styles for when the input has focus OR contains a value */
|
|
111
|
-
.label {
|
|
112
|
-
position: absolute;
|
|
113
|
-
left: 1rem;
|
|
114
|
-
|
|
115
|
-
line-height: 1.5;
|
|
116
|
-
color: var(--input-label-color);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/* is size regular AND (has focus OR contains a value) */
|
|
120
|
-
.input-wrapper--invalid .label,
|
|
121
|
-
:host(:not([size])) .label,
|
|
122
|
-
:host([size="regular"]) .label {
|
|
123
|
-
top: calc(0.75rem - var(--input-border-width));
|
|
124
|
-
|
|
125
|
-
font-size: 0.75rem;
|
|
126
|
-
font-family: var(--input-font-black);
|
|
127
|
-
|
|
128
|
-
transition: 0.15s ease-out;
|
|
129
|
-
transition-property: font-size, top;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/* is size small AND (has focus OR contains a value) */
|
|
133
|
-
:host([size="small"]) .label {
|
|
134
|
-
opacity: 0;
|
|
135
|
-
visibility: hidden;
|
|
136
|
-
|
|
137
|
-
font-size: 1rem;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
:host([required]) .label::after {
|
|
141
|
-
content: "*";
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/* is not disabled AND has focus AND is empty */
|
|
145
|
-
:host(:not([disabled], :focus-within)) .input-wrapper--empty .label {
|
|
146
|
-
--input-label-color: var(--input-label-color-empty);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/* is empty AND has no focus */
|
|
150
|
-
:host(:not(:focus-within))
|
|
151
|
-
.input-wrapper--empty:not(.input-wrapper--invalid)
|
|
152
|
-
.label {
|
|
153
|
-
font-family: var(--input-font-regular);
|
|
154
|
-
font-size: 1rem;
|
|
155
|
-
top: calc(1.5rem - var(--input-border-width));
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/* is size small AND has no focus AND is empty */
|
|
159
|
-
:host(:not(:focus-within)[size="small"])
|
|
160
|
-
.input-wrapper--empty:not(.input-wrapper--invalid)
|
|
161
|
-
.label {
|
|
162
|
-
top: calc(0.75rem - var(--input-border-width));
|
|
163
|
-
opacity: 1;
|
|
164
|
-
visibility: visible;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/* The label has to behave a bit different when the input has a suffix or a prefix */
|
|
168
|
-
:host(:is([suffix], [prefix]))
|
|
169
|
-
.input-wrapper--empty
|
|
170
|
-
.input:not(:focus)
|
|
171
|
-
+ .label {
|
|
172
|
-
top: calc(0.75rem - var(--input-border-width));
|
|
173
|
-
|
|
174
|
-
font-family: var(--input-font-black);
|
|
175
|
-
font-size: 0.75rem;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
.error {
|
|
179
|
-
list-style: none;
|
|
180
|
-
padding: 0.0625rem 1rem 0.1875rem;
|
|
181
|
-
margin: 0;
|
|
182
|
-
|
|
183
|
-
color: var(--input-error-color);
|
|
184
|
-
font-size: 0.75rem;
|
|
185
|
-
line-height: 1.5;
|
|
186
|
-
|
|
187
|
-
border: 2px solid var(--input-color-invalid);
|
|
188
|
-
border-radius: 0 0 2px 2px;
|
|
189
|
-
|
|
190
|
-
background-color: var(--input-color-invalid);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
.clear-button {
|
|
194
|
-
--_length: 1.5rem;
|
|
195
|
-
|
|
196
|
-
align-self: center;
|
|
197
|
-
|
|
198
|
-
width: var(--_length);
|
|
199
|
-
height: var(--_length);
|
|
200
|
-
padding: 0;
|
|
201
|
-
|
|
202
|
-
cursor: pointer;
|
|
203
|
-
|
|
204
|
-
background: none;
|
|
205
|
-
color: var(--input-clear-color);
|
|
206
|
-
border: none;
|
|
207
|
-
|
|
208
|
-
/* border-radius is only defined for a nice focus outline */
|
|
209
|
-
border-radius: 2px;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
.clear-button:focus-visible {
|
|
213
|
-
outline: 2px solid var(--input-color-focus);
|
|
214
|
-
outline-offset: 2px;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
.clear-button:disabled {
|
|
218
|
-
cursor: default;
|
|
219
|
-
color: var(--input-color-disabled);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
.icon {
|
|
223
|
-
align-self: center;
|
|
224
|
-
color: var(--input-color);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
:host(:not([disabled], :focus-within)) .input-wrapper--empty .icon {
|
|
228
|
-
color: var(--input-label-color-empty);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
.error-icon {
|
|
232
|
-
align-self: center;
|
|
233
|
-
color: var(--input-color-invalid);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
:is(.icon, .error-icon) leu-icon {
|
|
237
|
-
display: block;
|
|
238
|
-
}
|