@politiet/sheriff-web-components 2.13.0 → 2.14.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/custom-elements.json +3996 -1344
- package/dist/controllers/index.d.ts +3 -0
- package/dist/controllers/index.d.ts.map +1 -0
- package/dist/controllers/index.js +3 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/sds-drag-drop-controller.d.ts +25 -0
- package/dist/controllers/sds-drag-drop-controller.d.ts.map +1 -0
- package/dist/controllers/sds-drag-drop-controller.js +52 -0
- package/dist/controllers/sds-drag-drop-controller.js.map +1 -0
- package/dist/controllers/sds-file-preview-controller.d.ts +38 -0
- package/dist/controllers/sds-file-preview-controller.d.ts.map +1 -0
- package/dist/controllers/sds-file-preview-controller.js +90 -0
- package/dist/controllers/sds-file-preview-controller.js.map +1 -0
- package/dist/frameworks/preact.d.ts +14 -1
- package/dist/frameworks/preact.d.ts.map +1 -1
- package/dist/frameworks/react.d.ts +30 -1
- package/dist/frameworks/react.d.ts.map +1 -1
- package/dist/frameworks/solidjs.d.ts +4 -0
- package/dist/frameworks/solidjs.d.ts.map +1 -1
- package/dist/frameworks/svelte.d.ts +4 -0
- package/dist/frameworks/svelte.d.ts.map +1 -1
- package/dist/frameworks/vue.d.ts +24 -1
- package/dist/frameworks/vue.d.ts.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mixins/sds-dialog-target-mixin.d.ts.map +1 -1
- package/dist/mixins/sds-dialog-target-mixin.js +10 -0
- package/dist/mixins/sds-dialog-target-mixin.js.map +1 -1
- package/dist/react-wrappers/SDSDialogWrapper.d.ts +1 -0
- package/dist/react-wrappers/SDSDialogWrapper.d.ts.map +1 -1
- package/dist/react-wrappers/SDSDialogWrapper.js +1 -0
- package/dist/react-wrappers/SDSDialogWrapper.js.map +1 -1
- package/dist/react-wrappers/SDSFileUploadFileListWrapper.d.ts +3 -0
- package/dist/react-wrappers/SDSFileUploadFileListWrapper.d.ts.map +1 -0
- package/dist/react-wrappers/SDSFileUploadFileListWrapper.js +10 -0
- package/dist/react-wrappers/SDSFileUploadFileListWrapper.js.map +1 -0
- package/dist/react-wrappers/SDSFileUploadItemWrapper.d.ts +6 -0
- package/dist/react-wrappers/SDSFileUploadItemWrapper.d.ts.map +1 -0
- package/dist/react-wrappers/SDSFileUploadItemWrapper.js +12 -0
- package/dist/react-wrappers/SDSFileUploadItemWrapper.js.map +1 -0
- package/dist/react-wrappers/SDSFileUploadWrapper.d.ts +12 -0
- package/dist/react-wrappers/SDSFileUploadWrapper.d.ts.map +1 -0
- package/dist/react-wrappers/SDSFileUploadWrapper.js +18 -0
- package/dist/react-wrappers/SDSFileUploadWrapper.js.map +1 -0
- package/dist/react-wrappers/SDSSearchWrapper.d.ts +15 -0
- package/dist/react-wrappers/SDSSearchWrapper.d.ts.map +1 -0
- package/dist/react-wrappers/SDSSearchWrapper.js +19 -0
- package/dist/react-wrappers/SDSSearchWrapper.js.map +1 -0
- package/dist/react-wrappers/index.d.ts +4 -0
- package/dist/react-wrappers/index.d.ts.map +1 -1
- package/dist/react-wrappers/index.js +4 -0
- package/dist/react-wrappers/index.js.map +1 -1
- package/dist/sds-button/sds-button.component.d.ts +0 -1
- package/dist/sds-button/sds-button.component.d.ts.map +1 -1
- package/dist/sds-button/sds-button.component.js +10 -16
- package/dist/sds-button/sds-button.component.js.map +1 -1
- package/dist/sds-button/sds-button.styles.d.ts.map +1 -1
- package/dist/sds-button/sds-button.styles.js +7 -2
- package/dist/sds-button/sds-button.styles.js.map +1 -1
- package/dist/sds-dialog/sds-dialog.component.d.ts.map +1 -1
- package/dist/sds-dialog/sds-dialog.component.js +11 -1
- package/dist/sds-dialog/sds-dialog.component.js.map +1 -1
- package/dist/sds-file-upload/sds-file-upload.d.ts +102 -0
- package/dist/sds-file-upload/sds-file-upload.d.ts.map +1 -0
- package/dist/sds-file-upload/sds-file-upload.js +384 -0
- package/dist/sds-file-upload/sds-file-upload.js.map +1 -0
- package/dist/sds-file-upload/sds-file-upload.styles.d.ts +2 -0
- package/dist/sds-file-upload/sds-file-upload.styles.d.ts.map +1 -0
- package/dist/sds-file-upload/sds-file-upload.styles.js +234 -0
- package/dist/sds-file-upload/sds-file-upload.styles.js.map +1 -0
- package/dist/sds-file-upload-file-list/sds-file-upload-file-list.d.ts +14 -0
- package/dist/sds-file-upload-file-list/sds-file-upload-file-list.d.ts.map +1 -0
- package/dist/sds-file-upload-file-list/sds-file-upload-file-list.js +26 -0
- package/dist/sds-file-upload-file-list/sds-file-upload-file-list.js.map +1 -0
- package/dist/sds-file-upload-file-list/sds-file-upload-file-list.styles.d.ts +2 -0
- package/dist/sds-file-upload-file-list/sds-file-upload-file-list.styles.d.ts.map +1 -0
- package/dist/sds-file-upload-file-list/sds-file-upload-file-list.styles.js +19 -0
- package/dist/sds-file-upload-file-list/sds-file-upload-file-list.styles.js.map +1 -0
- package/dist/sds-file-upload-item/assets/u-progress.js +2 -0
- package/dist/sds-file-upload-item/sds-file-upload-item.d.ts +62 -0
- package/dist/sds-file-upload-item/sds-file-upload-item.d.ts.map +1 -0
- package/dist/sds-file-upload-item/sds-file-upload-item.js +205 -0
- package/dist/sds-file-upload-item/sds-file-upload-item.js.map +1 -0
- package/dist/sds-file-upload-item/sds-file-upload-item.styles.d.ts +2 -0
- package/dist/sds-file-upload-item/sds-file-upload-item.styles.d.ts.map +1 -0
- package/dist/sds-file-upload-item/sds-file-upload-item.styles.js +227 -0
- package/dist/sds-file-upload-item/sds-file-upload-item.styles.js.map +1 -0
- package/dist/sds-radio/sds-radio.d.ts +53 -1
- package/dist/sds-radio/sds-radio.d.ts.map +1 -1
- package/dist/sds-radio/sds-radio.js +218 -41
- package/dist/sds-radio/sds-radio.js.map +1 -1
- package/dist/sds-radio/sds-radio.styles.js +36 -36
- package/dist/sds-radio/sds-radio.styles.js.map +1 -1
- package/dist/sds-radio-group/sds-radio-group.d.ts +4 -2
- package/dist/sds-radio-group/sds-radio-group.d.ts.map +1 -1
- package/dist/sds-radio-group/sds-radio-group.js +10 -3
- package/dist/sds-radio-group/sds-radio-group.js.map +1 -1
- package/dist/sds-search/sds-search.component.d.ts +128 -0
- package/dist/sds-search/sds-search.component.d.ts.map +1 -0
- package/dist/sds-search/sds-search.component.js +345 -0
- package/dist/sds-search/sds-search.component.js.map +1 -0
- package/dist/sds-search/sds-search.d.ts +13 -0
- package/dist/sds-search/sds-search.d.ts.map +1 -0
- package/dist/sds-search/sds-search.js +18 -0
- package/dist/sds-search/sds-search.js.map +1 -0
- package/dist/sds-search/sds-search.styles.d.ts +2 -0
- package/dist/sds-search/sds-search.styles.d.ts.map +1 -0
- package/dist/sds-search/sds-search.styles.js +74 -0
- package/dist/sds-search/sds-search.styles.js.map +1 -0
- package/dist/sds-textfield/sds-textfield.component.d.ts +4 -1
- package/dist/sds-textfield/sds-textfield.component.d.ts.map +1 -1
- package/dist/sds-textfield/sds-textfield.component.js +20 -5
- package/dist/sds-textfield/sds-textfield.component.js.map +1 -1
- package/dist/sds-textfield/sds-textfield.styles.d.ts.map +1 -1
- package/dist/sds-textfield/sds-textfield.styles.js +11 -0
- package/dist/sds-textfield/sds-textfield.styles.js.map +1 -1
- package/dist/sheriff-web-components.js +1104 -375
- package/dist/skill/SKILL.md +136 -42
- package/dist/skill/references/components.md +332 -35
- package/dist/skill/references/react-wrappers.md +41 -9
- package/dist/utils/file-validation.d.ts +31 -0
- package/dist/utils/file-validation.d.ts.map +1 -0
- package/dist/utils/file-validation.js +57 -0
- package/dist/utils/file-validation.js.map +1 -0
- package/dist/utils/format-bytes.d.ts +6 -0
- package/dist/utils/format-bytes.d.ts.map +1 -0
- package/dist/utils/format-bytes.js +13 -0
- package/dist/utils/format-bytes.js.map +1 -0
- package/dist/utils/video-thumbnail.d.ts +8 -0
- package/dist/utils/video-thumbnail.d.ts.map +1 -0
- package/dist/utils/video-thumbnail.js +77 -0
- package/dist/utils/video-thumbnail.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +24 -4
- package/web-types.json +3452 -1048
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sds-radio.styles.js","sourceRoot":"","sources":["../../src/sds-radio/sds-radio.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiNxB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css`\n\t:host {\n\t\t--_sds-radio-font-family: var(--sds-radio-font-family, var(--sds-typography-font-family-roboto));\n\t\t--_sds-radio-disabled-opacity: var(--sds-radio-disabled-opacity, var(--sds-color-states-disabled-opacity));\n\t\t--_sds-radio-block-gap: var(--sds-radio-block-gap, var(--sds-spacing-4xs));\n\t\t--_sds-radio-inline-gap: var(--sds-radio-inline-gap, var(--sds-spacing-3xs));\n\n\t\t--_sds-radio-label-font-size: var(--sds-radio-label-font-size, var(--sds-components-font-size-content-md));\n\t\t--_sds-radio-label-font-weight: var(--sds-radio-label-font-weight, var(--sds-typography-body-md-desktop-font-weight));\n\t\t--_sds-radio-label-line-height: var(--sds-radio-label-line-height, var(--sds-components-line-height-tall-content-md));\n\t\t--_sds-radio-label-text-color: var(--sds-radio-label-text-color, var(--sds-color-text-default, var(--sds-color-neutral-text-default)));\n\n\t\t--_sds-radio-help-text-color: var(--sds-radio-help-text-color, var(--sds-color-text-subtle, var(--sds-color-neutral-text-subtle)));\n\t\t--_sds-radio-help-text-font-size: var(--sds-radio-help-text-font-size, var(--sds-components-font-size-content-md));\n\t\t--_sds-radio-help-text-font-weight: var(--sds-radio-help-text-font-weight, var(--sds-typography-body-md-desktop-font-weight));\n\t\t--_sds-radio-help-text-line-height: var(--sds-radio-help-text-line-height, var(--sds-components-line-height-tall-content-md));\n\n\t\t--_sds-radio-input-size: var(--sds-radio-input-size, var(--sds-components-icon-md));\n\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-border-default, var(--sds-color-neutral-border-default)));\n\t\t--_sds-radio-input-border-width: var(--sds-radio-input-border-width, var(--sds-border-md));\n\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, transparent);\n\t\t--_sds-radio-input-dot-size: var(--sds-radio-input-dot-size, 4.5px);\n\n\t\t--_sds-radio-focus-color-outer: var(--sds-radio-focus-color-outer, var(--sds-color-states-focus-outer));\n\t\t--_sds-radio-focus-color-inner: var(--sds-radio-focus-color-inner, var(--sds-color-states-focus-inner));\n\t\t--_sds-radio-focus-spacing: var(--sds-radio-focus-spacing, var(--sds-color-states-focus-spacing));\n\t\t--_sds-radio-focus-outline-size: var(--sds-radio-focus-outline-size, var(--sds-color-states-focus-outline-size));\n\t\t--_sds-radio-focus-radius: var(--sds-radio-focus-radius, var(--sds-radius-xs));\n\n\t\t--_sds-radio-grid-template-areas: var(--sds-radio-grid-template-area, 'input content');\n\t\t--_sds-radio-label-grid-area: var(--sds-radio-label-grid-area, content);\n\t\t--_sds-radio-input-grid-area: var(--sds-radio-input-grid-area, input);\n\t\t--_sds-radio-help-text-grid-area: var(--sds-radio-help-text-grid-area, content);\n\n\t\tdisplay: inline-flex;\n\t\tflex: 0 0 auto;\n\t}\n\n\t.sds-radio {\n\t\tdisplay: grid;\n\t\tfont-family: var(--_sds-radio-font-family);\n\t\tgap: var(--_sds-radio-block-gap) var(--_sds-radio-inline-gap);\n\t\tgrid-template-areas: var(--_sds-radio-grid-template-areas);\n\t\tgrid-template-columns: auto 1fr;\n\t\twidth: fit-content;\n\n\t\t&:has(:disabled) {\n\t\t\tcursor: default;\n\t\t\tpointer-events: none;\n\t\t\topacity: var(--_sds-radio-disabled-opacity);\n\t\t}\n\n\t\t&:has(:focus-visible) {\n\t\t\tbox-shadow: 0 0 0 var(--_sds-radio-focus-spacing) var(--_sds-radio-focus-color-inner);\n\t\t\toutline: var(--_sds-radio-focus-outline-size) solid var(--_sds-radio-focus-color-outer);\n\t\t\toutline-offset: var(--_sds-radio-focus-spacing);\n\t\t\tborder-radius: var(--_sds-radio-focus-radius);\n\t\t}\n\t}\n\n\t.sds-radio--error {\n\t\t--_sds-radio-label-text-color: var(--sds-radio-label-text-color, var(--sds-color-text-default, var(--sds-color-alert-danger-text-default)));\n\t}\n\n\t.sds-radio__help-text {\n\t\tgrid-column: var(--_sds-radio-help-text-grid-area);\n\t\tmargin: 0;\n\t\tcolor: var(--_sds-radio-help-text-color);\n\t\tfont-size: var(--_sds-radio-help-text-font-size);\n\t\tfont-weight: var(--_sds-radio-help-text-font-weight);\n\t\tline-height: var(--_sds-radio-help-text-line-height);\n\t\tmax-width: var(--_sds-radio-max-line-width);\n\t}\n\n\t.sds-radio__label {\n\t\tcursor: pointer;\n\t\tcolor: var(--_sds-radio-label-text-color);\n\t\tdisplay: inline-block;\n\t\tfont-size: var(--_sds-radio-label-font-size);\n\t\tfont-weight: var(--_sds-radio-label-font-weight);\n\t\tline-height: var(--_sds-radio-label-line-height);\n\n\t\tgrid-column: var(--_sds-radio-label-grid-area);\n\t}\n\n\t.sds-radio__input {\n\t\tappearance: none;\n\t\tbackground-color: var(--_sds-radio-input-background-color);\n\t\tbackground-image: radial-gradient(circle closest-side, currentcolor var(--_sds-radio-input-dot-size), transparent 0);\n\t\tcolor: var(--_sds-radio-input-dot-color);\n\t\tcursor: pointer;\n\t\twidth: var(--_sds-radio-input-size);\n\t\theight: var(--_sds-radio-input-size);\n\t\taspect-ratio: 1;\n\t\tborder: var(--_sds-radio-input-border-width) solid var(--_sds-radio-input-border-color);\n\t\tborder-radius: 50%;\n\t\tmargin: 0;\n\t\tposition: relative;\n\n\t\tgrid-column: var(--_sds-radio-input-grid-area);\n\t\tgrid-row: 1;\n\n\t\t&[readonly] {\n\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-tinted, var(--sds-color-neutral-surface-tinted)));\n\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-border-subtle, var(--sds-color-neutral-border-subtle)));\n\t\t\tcursor: default;\n\t\t\tpointer-events: none;\n\n\t\t\t& + .sds-radio__label {\n\t\t\t\tcursor: default;\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\t\t}\n\n\t\t&[checked] {\n\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-action-default, var(--sds-color-main-action-default)));\n\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-action-default, var(--sds-color-main-action-default)));\n\t\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, var(--sds-color-action-contrast-default, var(--sds-color-main-action-contrast-default)));\n\n\t\t\t&[readonly] {\n\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-tinted, var(--sds-color-neutral-surface-tinted)));\n\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-border-subtle, var(--sds-color-neutral-border-subtle)));\n\t\t\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, var(--sds-color-action-default, var(--sds-color-neutral-action-default)));\n\t\t\t\tcursor: default;\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\t\t}\n\n\t\t&:hover {\n\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-action-hover, var(--sds-color-main-action-hover)));\n\n\t\t\t&[checked] {\n\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-action-hover, var(--sds-color-main-action-hover)));\n\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-action-hover, var(--sds-color-main-action-hover)));\n\t\t\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t}\n\t\t}\n\n\t\t&:active:not([readonly], [checked]) {\n\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-action-active, var(--sds-color-main-action-active)));\n\n\t\t\t&[checked] {\n\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-action-active, var(--sds-color-main-action-active)));\n\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-action-active, var(--sds-color-main-action-active)));\n\t\t\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t}\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t}\n\n\t\t&.sds-radio__input--error {\n\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-alert-danger-border-default));\n\n\t\t\t&[checked] {\n\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-alert-danger-action-default));\n\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-alert-danger-action-default));\n\t\t\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, var(--sds-color-alert-danger-action-contrast-default));\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-alert-danger-action-hover));\n\n\t\t\t\t&[checked] {\n\t\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-alert-danger-action-hover));\n\t\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-alert-danger-action-hover));\n\t\t\t\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&:active:not([readonly], [checked]) {\n\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-alert-danger-action-active));\n\n\t\t\t\t&[checked] {\n\t\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-alert-danger-action-active));\n\t\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-alert-danger-action-active));\n\t\t\t\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t:host([size='sm']) {\n\t\t--_sds-radio-label-font-size: var(--sds-radio-label-font-size, var(--sds-components-font-size-content-sm));\n\t\t--_sds-radio-label-line-height: var(--sds-radio-label-line-height, var(--sds-components-line-height-tall-content-sm));\n\t\t--_sds-radio-input-size: var(--sds-radio-input-size, var(--sds-components-icon-sm));\n\t\t--_sds-radio-input-dot-size: var(--sds-radio-input-dot-size, 3.5px);\n\n\t\t.sds-radio__label {\n\t\t\tmargin-block-start: 1px;\n\t\t}\n\t}\n\n\t:host([size='lg']) {\n\t\t--_sds-radio-label-font-size: var(--sds-radio-label-font-size, var(--sds-components-font-size-content-lg));\n\t\t--_sds-radio-label-line-height: var(--sds-radio-label-line-height, var(--sds-components-line-height-tall-content-lg));\n\t\t--_sds-radio-input-size: var(--sds-radio-input-size, var(--sds-components-icon-lg));\n\t\t--_sds-radio-input-dot-size: var(--sds-radio-input-dot-size, 4.5px);\n\n\t\t.sds-radio__label {\n\t\t\tmargin-block-start: -1px;\n\t\t}\n\t}\n`;\n"]}
|
|
1
|
+
{"version":3,"file":"sds-radio.styles.js","sourceRoot":"","sources":["../../src/sds-radio/sds-radio.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiNxB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css`\n\t:host {\n\t\t--_sds-radio-font-family: var(--sds-radio-font-family, var(--sds-typography-font-family-roboto));\n\t\t--_sds-radio-disabled-opacity: var(--sds-radio-disabled-opacity, var(--sds-color-states-disabled-opacity));\n\t\t--_sds-radio-block-gap: var(--sds-radio-block-gap, var(--sds-spacing-4xs));\n\t\t--_sds-radio-inline-gap: var(--sds-radio-inline-gap, var(--sds-spacing-3xs));\n\n\t\t--_sds-radio-label-font-size: var(--sds-radio-label-font-size, var(--sds-components-font-size-content-md));\n\t\t--_sds-radio-label-font-weight: var(--sds-radio-label-font-weight, var(--sds-typography-body-md-desktop-font-weight));\n\t\t--_sds-radio-label-line-height: var(--sds-radio-label-line-height, var(--sds-components-line-height-tall-content-md));\n\t\t--_sds-radio-label-text-color: var(--sds-radio-label-text-color, var(--sds-color-text-default, var(--sds-color-neutral-text-default)));\n\n\t\t--_sds-radio-help-text-color: var(--sds-radio-help-text-color, var(--sds-color-text-subtle, var(--sds-color-neutral-text-subtle)));\n\t\t--_sds-radio-help-text-font-size: var(--sds-radio-help-text-font-size, var(--sds-components-font-size-content-md));\n\t\t--_sds-radio-help-text-font-weight: var(--sds-radio-help-text-font-weight, var(--sds-typography-body-md-desktop-font-weight));\n\t\t--_sds-radio-help-text-line-height: var(--sds-radio-help-text-line-height, var(--sds-components-line-height-tall-content-md));\n\n\t\t--_sds-radio-input-size: var(--sds-radio-input-size, var(--sds-components-icon-md));\n\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-border-default, var(--sds-color-neutral-border-default)));\n\t\t--_sds-radio-input-border-width: var(--sds-radio-input-border-width, var(--sds-border-md));\n\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, transparent);\n\t\t--_sds-radio-input-dot-size: var(--sds-radio-input-dot-size, 4.5px);\n\n\t\t--_sds-radio-focus-color-outer: var(--sds-radio-focus-color-outer, var(--sds-color-states-focus-outer));\n\t\t--_sds-radio-focus-color-inner: var(--sds-radio-focus-color-inner, var(--sds-color-states-focus-inner));\n\t\t--_sds-radio-focus-spacing: var(--sds-radio-focus-spacing, var(--sds-color-states-focus-spacing));\n\t\t--_sds-radio-focus-outline-size: var(--sds-radio-focus-outline-size, var(--sds-color-states-focus-outline-size));\n\t\t--_sds-radio-focus-radius: var(--sds-radio-focus-radius, var(--sds-radius-xs));\n\n\t\t--_sds-radio-grid-template-areas: var(--sds-radio-grid-template-area, 'input content');\n\t\t--_sds-radio-label-grid-area: var(--sds-radio-label-grid-area, content);\n\t\t--_sds-radio-input-grid-area: var(--sds-radio-input-grid-area, input);\n\t\t--_sds-radio-help-text-grid-area: var(--sds-radio-help-text-grid-area, content);\n\n\t\tdisplay: inline-flex;\n\t\tflex: 0 0 auto;\n\t}\n\n\t.sds-radio {\n\t\tdisplay: grid;\n\t\tcursor: pointer;\n\t\tfont-family: var(--_sds-radio-font-family);\n\t\tgap: var(--_sds-radio-block-gap) var(--_sds-radio-inline-gap);\n\t\tgrid-template-areas: var(--_sds-radio-grid-template-areas);\n\t\tgrid-template-columns: auto 1fr;\n\t\twidth: fit-content;\n\n\t\t&:has(:disabled) {\n\t\t\tcursor: default;\n\t\t\tpointer-events: none;\n\t\t\topacity: var(--_sds-radio-disabled-opacity);\n\t\t}\n\t}\n\n\t:host([readonly]) .sds-radio {\n\t\tcursor: default;\n\t}\n\n\t/* The host carries role=\"radio\" and takes focus, so the ring keys off it. */\n\t:host(:focus-visible) {\n\t\toutline: none;\n\t}\n\n\t:host(:focus-visible) .sds-radio {\n\t\tbox-shadow: 0 0 0 var(--_sds-radio-focus-spacing) var(--_sds-radio-focus-color-inner);\n\t\toutline: var(--_sds-radio-focus-outline-size) solid var(--_sds-radio-focus-color-outer);\n\t\toutline-offset: var(--_sds-radio-focus-spacing);\n\t\tborder-radius: var(--_sds-radio-focus-radius);\n\t}\n\n\t.sds-radio--error {\n\t\t--_sds-radio-label-text-color: var(--sds-radio-label-text-color, var(--sds-color-text-default, var(--sds-color-alert-danger-text-default)));\n\t}\n\n\t.sds-radio__help-text {\n\t\tgrid-column: var(--_sds-radio-help-text-grid-area);\n\t\tmargin: 0;\n\t\tcolor: var(--_sds-radio-help-text-color);\n\t\tfont-size: var(--_sds-radio-help-text-font-size);\n\t\tfont-weight: var(--_sds-radio-help-text-font-weight);\n\t\tline-height: var(--_sds-radio-help-text-line-height);\n\t\tmax-width: var(--_sds-radio-max-line-width);\n\t}\n\n\t.sds-radio__label {\n\t\tcursor: pointer;\n\t\tcolor: var(--_sds-radio-label-text-color);\n\t\tdisplay: inline-block;\n\t\tfont-size: var(--_sds-radio-label-font-size);\n\t\tfont-weight: var(--_sds-radio-label-font-weight);\n\t\tline-height: var(--_sds-radio-label-line-height);\n\n\t\tgrid-column: var(--_sds-radio-label-grid-area);\n\t}\n\n\t.sds-radio__input {\n\t\tappearance: none;\n\t\tbackground-color: var(--_sds-radio-input-background-color);\n\t\tbackground-image: radial-gradient(circle closest-side, currentcolor var(--_sds-radio-input-dot-size), transparent 0);\n\t\tcolor: var(--_sds-radio-input-dot-color);\n\t\tcursor: pointer;\n\t\twidth: var(--_sds-radio-input-size);\n\t\theight: var(--_sds-radio-input-size);\n\t\taspect-ratio: 1;\n\t\tborder: var(--_sds-radio-input-border-width) solid var(--_sds-radio-input-border-color);\n\t\tborder-radius: 50%;\n\t\tmargin: 0;\n\t\tposition: relative;\n\n\t\tgrid-column: var(--_sds-radio-input-grid-area);\n\t\tgrid-row: 1;\n\n\t\t&[readonly] {\n\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-tinted, var(--sds-color-neutral-surface-tinted)));\n\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-border-subtle, var(--sds-color-neutral-border-subtle)));\n\t\t\tcursor: default;\n\t\t\tpointer-events: none;\n\n\t\t\t& + .sds-radio__label {\n\t\t\t\tcursor: default;\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\t\t}\n\n\t\t&[checked] {\n\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-action-default, var(--sds-color-main-action-default)));\n\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-action-default, var(--sds-color-main-action-default)));\n\t\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, var(--sds-color-action-contrast-default, var(--sds-color-main-action-contrast-default)));\n\n\t\t\t&[readonly] {\n\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-tinted, var(--sds-color-neutral-surface-tinted)));\n\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-border-subtle, var(--sds-color-neutral-border-subtle)));\n\t\t\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, var(--sds-color-action-default, var(--sds-color-neutral-action-default)));\n\t\t\t\tcursor: default;\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * The input is inert so it stays out of the accessibility tree, which also excludes\n\t\t * it from hit testing — it never matches :hover or :active itself. Both are driven\n\t\t * from the host instead, so hovering the label highlights the control too, the same\n\t\t * way clicking the label already selects it.\n\t\t */\n\t\t:host(:hover) &:not([readonly]) {\n\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-action-hover, var(--sds-color-main-action-hover)));\n\t\t}\n\n\t\t:host(:hover) &[checked]:not([readonly]) {\n\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-action-hover, var(--sds-color-main-action-hover)));\n\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-action-hover, var(--sds-color-main-action-hover)));\n\t\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t}\n\n\t\t:host(:active) &:not([readonly], [checked]) {\n\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-action-active, var(--sds-color-main-action-active)));\n\t\t}\n\n\t\t&.sds-radio__input--error {\n\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-alert-danger-border-default));\n\n\t\t\t&[checked] {\n\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-alert-danger-action-default));\n\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-alert-danger-action-default));\n\t\t\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, var(--sds-color-alert-danger-action-contrast-default));\n\t\t\t}\n\n\t\t\t:host(:hover) &:not([readonly]) {\n\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-alert-danger-action-hover));\n\t\t\t}\n\n\t\t\t:host(:hover) &[checked]:not([readonly]) {\n\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-alert-danger-action-hover));\n\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-alert-danger-action-hover));\n\t\t\t\t--_sds-radio-input-dot-color: var(--sds-radio-input-dot-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t}\n\n\t\t\t:host(:active) &:not([readonly], [checked]) {\n\t\t\t\t--_sds-radio-input-background-color: var(--sds-radio-input-background-color, var(--sds-color-surface-default, var(--sds-color-neutral-surface-default)));\n\t\t\t\t--_sds-radio-input-border-color: var(--sds-radio-input-border-color, var(--sds-color-alert-danger-action-active));\n\t\t\t}\n\t\t}\n\t}\n\n\t:host([size='sm']) {\n\t\t--_sds-radio-label-font-size: var(--sds-radio-label-font-size, var(--sds-components-font-size-content-sm));\n\t\t--_sds-radio-label-line-height: var(--sds-radio-label-line-height, var(--sds-components-line-height-tall-content-sm));\n\t\t--_sds-radio-input-size: var(--sds-radio-input-size, var(--sds-components-icon-sm));\n\t\t--_sds-radio-input-dot-size: var(--sds-radio-input-dot-size, 3.5px);\n\n\t\t.sds-radio__label {\n\t\t\tmargin-block-start: 1px;\n\t\t}\n\t}\n\n\t:host([size='lg']) {\n\t\t--_sds-radio-label-font-size: var(--sds-radio-label-font-size, var(--sds-components-font-size-content-lg));\n\t\t--_sds-radio-label-line-height: var(--sds-radio-label-line-height, var(--sds-components-line-height-tall-content-lg));\n\t\t--_sds-radio-input-size: var(--sds-radio-input-size, var(--sds-components-icon-lg));\n\t\t--_sds-radio-input-dot-size: var(--sds-radio-input-dot-size, 4.5px);\n\n\t\t.sds-radio__label {\n\t\t\tmargin-block-start: -1px;\n\t\t}\n\t}\n`;\n"]}
|
|
@@ -5,8 +5,10 @@ import '../sds-radio/sds-radio';
|
|
|
5
5
|
import '../sds-icon/sds-icon';
|
|
6
6
|
import '../sds-alert/sds-alert';
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* The radiogroup role sits on the wrapper around the slot, not on the fieldset: a radio's
|
|
9
|
+
* position in the set is only computed when the radiogroup is its direct parent, and the
|
|
10
|
+
* fieldset has the legend and help text in between. The fieldset is therefore presentational
|
|
11
|
+
* and the wrapper carries the group's name and description.
|
|
10
12
|
*/
|
|
11
13
|
export interface SDSRadioGroupProps {
|
|
12
14
|
legend?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sds-radio-group.d.ts","sourceRoot":"","sources":["../../src/sds-radio-group/sds-radio-group.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMlD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,KAAK,cAAc,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AAI7D,OAAO,wBAAwB,CAAC;AAChC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,wBAAwB,CAAC;AAGhC
|
|
1
|
+
{"version":3,"file":"sds-radio-group.d.ts","sourceRoot":"","sources":["../../src/sds-radio-group/sds-radio-group.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMlD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,KAAK,cAAc,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AAI7D,OAAO,wBAAwB,CAAC;AAChC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,wBAAwB,CAAC;AAGhC;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;;AAED,qBACa,aAAc,SAAQ,kBAAmC;IACrE,OAAgB,MAAM,4BAAY;IAEN,MAAM,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACd,QAAQ,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACvC,YAAY,CAAC,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACxC,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAS;IACxF,SAAS,EAAE,QAAQ,GAAG,KAAK,CAAY;IACvB,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAS;IACjD,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAS;IAClD,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAQ;IAE1E,OAAO,CAAC,cAAc,CAAuB;IACvC,OAAO,CAAC,YAAY,CAAmB;IAEtD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAOjC;IAEF,OAAO,CAAC,iBAAiB,CAEvB;IAEF,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iBAAiB;IA0BhB,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC;IAS5D,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAevF,MAAM;IAwCf,IAAI,KAAK,IAAI,EAAE,CAEd;CACD;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,iBAAiB,EAAE,aAAa,CAAC;KACjC;CACD"}
|
|
@@ -95,12 +95,19 @@ let SDSRadioGroup = class SDSRadioGroup extends SDSEventDispatcherMixin(SDSEleme
|
|
|
95
95
|
};
|
|
96
96
|
const describedBy = [this.errorMessage ? 'error-message' : null, this.helpText ? 'help-text' : null].filter(Boolean).join(' ') || undefined;
|
|
97
97
|
return html `
|
|
98
|
-
<fieldset class="${classMap(radioGroupClasses)}"
|
|
98
|
+
<fieldset class="${classMap(radioGroupClasses)}" role="none">
|
|
99
99
|
${this.legend
|
|
100
|
-
? html `<legend class="sds-radio-group__legend">${this.readOnly ? html `<sds-icon name="lock-material-filled" size="md"></sds-icon>` : nothing}${this.legend}</legend>`
|
|
100
|
+
? html `<legend id="group-legend" class="sds-radio-group__legend">${this.readOnly ? html `<sds-icon name="lock-material-filled" size="md"></sds-icon>` : nothing}${this.legend}</legend>`
|
|
101
101
|
: nothing}
|
|
102
102
|
${this.helpText ? html `<p id="help-text" class="sds-radio-group__help-text">${this.helpText}</p>` : nothing}
|
|
103
|
-
<div
|
|
103
|
+
<div
|
|
104
|
+
class="${classMap(radioClasses)}"
|
|
105
|
+
role="radiogroup"
|
|
106
|
+
aria-labelledby="${ifDefined(this.legend ? 'group-legend' : undefined)}"
|
|
107
|
+
aria-describedby="${ifDefined(describedBy)}"
|
|
108
|
+
aria-invalid="${this.errorMessage ? 'true' : 'false'}"
|
|
109
|
+
@change=${this._handleRadioChange}
|
|
110
|
+
>
|
|
104
111
|
<slot @slotchange=${this._handleSlotChange}></slot>
|
|
105
112
|
</div>
|
|
106
113
|
${this.errorMessage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sds-radio-group.js","sourceRoot":"","sources":["../../src/sds-radio-group/sds-radio-group.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, nothing } from 'lit';\nimport { SDSElement } from '../utils/sds-element';\nimport { property, state, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { guardedCustomElement } from '../utils/guarded-custom-element';\nimport { styles } from './sds-radio-group.styles';\nimport { SDS_SIZES } from '../types';\nimport { SDSEventDispatcherMixin } from '../mixins/sds-event-dispatcher-mixin';\n\ntype RadioGroupSize = Extract<SDS_SIZES, 'lg' | 'md' | 'sm'>;\nconst updatableRadioProps = ['disabled', 'errorMessage', 'readOnly', 'required', 'size'] as const;\ntype UpdatableRadioProp = (typeof updatableRadioProps)[number];\n\nimport '../sds-radio/sds-radio';\nimport '../sds-icon/sds-icon';\nimport '../sds-alert/sds-alert';\nimport { SDSRadio } from '../sds-radio/sds-radio';\n\n/**\n * TODO: Implement keyboard navigation behavior according to\n * https://www.w3.org/WAI/ARIA/apg/patterns/radio/\n */\n\nexport interface SDSRadioGroupProps {\n\tlegend?: string;\n\t'help-text'?: string;\n\t'error-message'?: string;\n\treadonly?: boolean;\n\tdirection?: 'column' | 'row';\n\tdisabled?: boolean;\n\tsize?: RadioGroupSize;\n\trequired?: boolean;\n}\n\n@guardedCustomElement('sds-radio-group')\nexport class SDSRadioGroup extends SDSEventDispatcherMixin(SDSElement) {\n\tstatic override styles = [styles];\n\n\t@property({ type: String }) legend?: SDSRadioGroupProps['legend'];\n\t@property({ type: String, attribute: 'help-text' }) helpText?: SDSRadioGroupProps['help-text'];\n\t@property({ type: String, attribute: 'error-message' }) errorMessage?: SDSRadioGroupProps['error-message'];\n\t@property({ type: Boolean, attribute: 'readonly', reflect: true }) readOnly: SDSRadioGroupProps['readonly'] = false;\n\t@property({ type: String }) direction: 'column' | 'row' = 'column';\n\t@property({ type: Boolean, reflect: true }) disabled: SDSRadioGroupProps['disabled'] = false;\n\t@property({ type: Boolean, reflect: true }) required: SDSRadioGroupProps['required'] = false;\n\t@property({ type: String, reflect: true }) size: SDSRadioGroupProps['size'] = 'md';\n\n\t@state() private _selectedValue: string | null = null;\n\t@query('slot') private _slotElement!: HTMLSlotElement;\n\n\tprivate readonly _handleRadioChange = (event: Event): void => {\n\t\tconst target = event.composedPath().find((el) => el instanceof HTMLElement && el.tagName === 'SDS-RADIO') as HTMLElement & { value: string };\n\n\t\tif (target) {\n\t\t\tthis._selectedValue = target.getAttribute('value') || null;\n\t\t\tthis.dispatchSheriffEvent('sds-update');\n\t\t}\n\t};\n\n\tprivate _handleSlotChange = () => {\n\t\tthis._updateChildProps([...updatableRadioProps]);\n\t};\n\n\tprivate _getChildRadios(): SDSRadio[] {\n\t\treturn this._slotElement?.assignedElements({ flatten: true }).filter((element): element is SDSRadio => element.tagName === 'SDS-RADIO') ?? [];\n\t}\n\n\tprivate _updateChildProps(changedAttributes: Array<UpdatableRadioProp>) {\n\t\tconst radios = this._getChildRadios();\n\n\t\tfor (const childRadio of radios) {\n\t\t\tfor (const attribute of changedAttributes) {\n\t\t\t\tswitch (attribute) {\n\t\t\t\t\tcase 'readOnly':\n\t\t\t\t\t\tchildRadio.readOnly = this.readOnly;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'disabled':\n\t\t\t\t\t\tchildRadio.parentRequestDisabled = this.disabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'errorMessage':\n\t\t\t\t\t\tchildRadio.error = Boolean(this.errorMessage);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'required':\n\t\t\t\t\t\tchildRadio.required = this.required;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'size':\n\t\t\t\t\t\tchildRadio.size = this.size;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\toverride updated(changedProps: Map<string | number | symbol, unknown>) {\n\t\tsuper.updated(changedProps);\n\n\t\tconst changedKeys = Array.from(changedProps.keys());\n\t\tif (changedKeys.includes('errorMessage') || changedKeys.includes('error-message')) {\n\t\t\tthis._updateChildProps(['errorMessage']);\n\t\t}\n\t}\n\n\toverride attributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tsuper.attributeChangedCallback(name, _old, value);\n\n\t\t// DOM attribute for readonly has different casing than our types\n\t\tif (name === 'readonly') {\n\t\t\tthis._updateChildProps(['readOnly']);\n\t\t\treturn;\n\t\t}\n\n\t\tconst property = name as UpdatableRadioProp;\n\t\tif (updatableRadioProps.includes(property)) {\n\t\t\tthis._updateChildProps([property]);\n\t\t}\n\t}\n\n\toverride render() {\n\t\tconst radioGroupClasses = {\n\t\t\t'sds-radio-group': true,\n\t\t\t'sds-radio-group--readonly': this.readOnly ?? false,\n\t\t\t'sds-radio-group--disabled': this.disabled ?? false,\n\t\t};\n\n\t\tconst radioClasses = {\n\t\t\t'sds-radio-group__radios': true,\n\t\t\t'sds-radio-group--column': this.direction === 'column',\n\t\t\t'sds-radio-group--row': this.direction === 'row',\n\t\t};\n\n\t\tconst describedBy = [this.errorMessage ? 'error-message' : null, this.helpText ? 'help-text' : null].filter(Boolean).join(' ') || undefined;\n\n\t\treturn html`\n\t\t\t<fieldset class=\"${classMap(radioGroupClasses)}\" aria-describedby=\"${ifDefined(describedBy)}\" aria-invalid=\"${this.errorMessage ? 'true' : 'false'}\">\n\t\t\t\t${this.legend\n\t\t\t\t\t? html`<legend class=\"sds-radio-group__legend\">${this.readOnly ? html`<sds-icon name=\"lock-material-filled\" size=\"md\"></sds-icon>` : nothing}${this.legend}</legend>`\n\t\t\t\t\t: nothing}\n\t\t\t\t${this.helpText ? html`<p id=\"help-text\" class=\"sds-radio-group__help-text\">${this.helpText}</p>` : nothing}\n\t\t\t\t<div class=\"${classMap(radioClasses)}\" @change=${this._handleRadioChange}>\n\t\t\t\t\t<slot @slotchange=${this._handleSlotChange}></slot>\n\t\t\t\t</div>\n\t\t\t\t${this.errorMessage\n\t\t\t\t\t? html`<sds-alert id=\"error-message\" variant=\"secondary\" data-palette=\"danger\">\n\t\t\t\t\t\t\t<p slot=\"message\">${this.errorMessage}</p>\n\t\t\t\t\t\t</sds-alert>`\n\t\t\t\t\t: nothing}\n\t\t\t</fieldset>\n\t\t`;\n\t}\n\n\tget value(): {} {\n\t\treturn { selectedValue: this._selectedValue };\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sds-radio-group': SDSRadioGroup;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sds-radio-group.js","sourceRoot":"","sources":["../../src/sds-radio-group/sds-radio-group.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, nothing } from 'lit';\nimport { SDSElement } from '../utils/sds-element';\nimport { property, state, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { guardedCustomElement } from '../utils/guarded-custom-element';\nimport { styles } from './sds-radio-group.styles';\nimport { SDS_SIZES } from '../types';\nimport { SDSEventDispatcherMixin } from '../mixins/sds-event-dispatcher-mixin';\n\ntype RadioGroupSize = Extract<SDS_SIZES, 'lg' | 'md' | 'sm'>;\nconst updatableRadioProps = ['disabled', 'errorMessage', 'readOnly', 'required', 'size'] as const;\ntype UpdatableRadioProp = (typeof updatableRadioProps)[number];\n\nimport '../sds-radio/sds-radio';\nimport '../sds-icon/sds-icon';\nimport '../sds-alert/sds-alert';\nimport { SDSRadio } from '../sds-radio/sds-radio';\n\n/**\n * The radiogroup role sits on the wrapper around the slot, not on the fieldset: a radio's\n * position in the set is only computed when the radiogroup is its direct parent, and the\n * fieldset has the legend and help text in between. The fieldset is therefore presentational\n * and the wrapper carries the group's name and description.\n */\n\nexport interface SDSRadioGroupProps {\n\tlegend?: string;\n\t'help-text'?: string;\n\t'error-message'?: string;\n\treadonly?: boolean;\n\tdirection?: 'column' | 'row';\n\tdisabled?: boolean;\n\tsize?: RadioGroupSize;\n\trequired?: boolean;\n}\n\n@guardedCustomElement('sds-radio-group')\nexport class SDSRadioGroup extends SDSEventDispatcherMixin(SDSElement) {\n\tstatic override styles = [styles];\n\n\t@property({ type: String }) legend?: SDSRadioGroupProps['legend'];\n\t@property({ type: String, attribute: 'help-text' }) helpText?: SDSRadioGroupProps['help-text'];\n\t@property({ type: String, attribute: 'error-message' }) errorMessage?: SDSRadioGroupProps['error-message'];\n\t@property({ type: Boolean, attribute: 'readonly', reflect: true }) readOnly: SDSRadioGroupProps['readonly'] = false;\n\t@property({ type: String }) direction: 'column' | 'row' = 'column';\n\t@property({ type: Boolean, reflect: true }) disabled: SDSRadioGroupProps['disabled'] = false;\n\t@property({ type: Boolean, reflect: true }) required: SDSRadioGroupProps['required'] = false;\n\t@property({ type: String, reflect: true }) size: SDSRadioGroupProps['size'] = 'md';\n\n\t@state() private _selectedValue: string | null = null;\n\t@query('slot') private _slotElement!: HTMLSlotElement;\n\n\tprivate readonly _handleRadioChange = (event: Event): void => {\n\t\tconst target = event.composedPath().find((el) => el instanceof HTMLElement && el.tagName === 'SDS-RADIO') as HTMLElement & { value: string };\n\n\t\tif (target) {\n\t\t\tthis._selectedValue = target.getAttribute('value') || null;\n\t\t\tthis.dispatchSheriffEvent('sds-update');\n\t\t}\n\t};\n\n\tprivate _handleSlotChange = () => {\n\t\tthis._updateChildProps([...updatableRadioProps]);\n\t};\n\n\tprivate _getChildRadios(): SDSRadio[] {\n\t\treturn this._slotElement?.assignedElements({ flatten: true }).filter((element): element is SDSRadio => element.tagName === 'SDS-RADIO') ?? [];\n\t}\n\n\tprivate _updateChildProps(changedAttributes: Array<UpdatableRadioProp>) {\n\t\tconst radios = this._getChildRadios();\n\n\t\tfor (const childRadio of radios) {\n\t\t\tfor (const attribute of changedAttributes) {\n\t\t\t\tswitch (attribute) {\n\t\t\t\t\tcase 'readOnly':\n\t\t\t\t\t\tchildRadio.readOnly = this.readOnly;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'disabled':\n\t\t\t\t\t\tchildRadio.parentRequestDisabled = this.disabled;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'errorMessage':\n\t\t\t\t\t\tchildRadio.error = Boolean(this.errorMessage);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'required':\n\t\t\t\t\t\tchildRadio.required = this.required;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'size':\n\t\t\t\t\t\tchildRadio.size = this.size;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\toverride updated(changedProps: Map<string | number | symbol, unknown>) {\n\t\tsuper.updated(changedProps);\n\n\t\tconst changedKeys = Array.from(changedProps.keys());\n\t\tif (changedKeys.includes('errorMessage') || changedKeys.includes('error-message')) {\n\t\t\tthis._updateChildProps(['errorMessage']);\n\t\t}\n\t}\n\n\toverride attributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tsuper.attributeChangedCallback(name, _old, value);\n\n\t\t// DOM attribute for readonly has different casing than our types\n\t\tif (name === 'readonly') {\n\t\t\tthis._updateChildProps(['readOnly']);\n\t\t\treturn;\n\t\t}\n\n\t\tconst property = name as UpdatableRadioProp;\n\t\tif (updatableRadioProps.includes(property)) {\n\t\t\tthis._updateChildProps([property]);\n\t\t}\n\t}\n\n\toverride render() {\n\t\tconst radioGroupClasses = {\n\t\t\t'sds-radio-group': true,\n\t\t\t'sds-radio-group--readonly': this.readOnly ?? false,\n\t\t\t'sds-radio-group--disabled': this.disabled ?? false,\n\t\t};\n\n\t\tconst radioClasses = {\n\t\t\t'sds-radio-group__radios': true,\n\t\t\t'sds-radio-group--column': this.direction === 'column',\n\t\t\t'sds-radio-group--row': this.direction === 'row',\n\t\t};\n\n\t\tconst describedBy = [this.errorMessage ? 'error-message' : null, this.helpText ? 'help-text' : null].filter(Boolean).join(' ') || undefined;\n\n\t\treturn html`\n\t\t\t<fieldset class=\"${classMap(radioGroupClasses)}\" role=\"none\">\n\t\t\t\t${this.legend\n\t\t\t\t\t? html`<legend id=\"group-legend\" class=\"sds-radio-group__legend\">${this.readOnly ? html`<sds-icon name=\"lock-material-filled\" size=\"md\"></sds-icon>` : nothing}${this.legend}</legend>`\n\t\t\t\t\t: nothing}\n\t\t\t\t${this.helpText ? html`<p id=\"help-text\" class=\"sds-radio-group__help-text\">${this.helpText}</p>` : nothing}\n\t\t\t\t<div\n\t\t\t\t\tclass=\"${classMap(radioClasses)}\"\n\t\t\t\t\trole=\"radiogroup\"\n\t\t\t\t\taria-labelledby=\"${ifDefined(this.legend ? 'group-legend' : undefined)}\"\n\t\t\t\t\taria-describedby=\"${ifDefined(describedBy)}\"\n\t\t\t\t\taria-invalid=\"${this.errorMessage ? 'true' : 'false'}\"\n\t\t\t\t\t@change=${this._handleRadioChange}\n\t\t\t\t>\n\t\t\t\t\t<slot @slotchange=${this._handleSlotChange}></slot>\n\t\t\t\t</div>\n\t\t\t\t${this.errorMessage\n\t\t\t\t\t? html`<sds-alert id=\"error-message\" variant=\"secondary\" data-palette=\"danger\">\n\t\t\t\t\t\t\t<p slot=\"message\">${this.errorMessage}</p>\n\t\t\t\t\t\t</sds-alert>`\n\t\t\t\t\t: nothing}\n\t\t\t</fieldset>\n\t\t`;\n\t}\n\n\tget value(): {} {\n\t\treturn { selectedValue: this._selectedValue };\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sds-radio-group': SDSRadioGroup;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { PropertyValues } from 'lit';
|
|
2
|
+
import { SDSElement } from '../utils/sds-element';
|
|
3
|
+
import type { SDSFormControlAttributes } from '../mixins/sds-form-control-mixin';
|
|
4
|
+
import { SDS_SIZES, SDS_VARIANTS } from '../types';
|
|
5
|
+
import '../sds-textfield/sds-textfield';
|
|
6
|
+
import type { SDSTextFieldProps } from '../sds-textfield/sds-textfield';
|
|
7
|
+
import '../sds-button/sds-button';
|
|
8
|
+
import '../sds-icon/sds-icon';
|
|
9
|
+
type SearchSize = Extract<SDS_SIZES, 'lg' | 'md' | 'sm'>;
|
|
10
|
+
type ButtonVariant = SDS_VARIANTS;
|
|
11
|
+
/** Detail payload dispatched with the `search` event. */
|
|
12
|
+
export interface SDSSearchDetail {
|
|
13
|
+
value: string;
|
|
14
|
+
}
|
|
15
|
+
export interface SDSSearchProps extends SDSFormControlAttributes {
|
|
16
|
+
value?: string;
|
|
17
|
+
label?: string;
|
|
18
|
+
'hide-label'?: boolean;
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
'help-text'?: string;
|
|
21
|
+
'error-message'?: string;
|
|
22
|
+
size?: SearchSize;
|
|
23
|
+
'button-label'?: string;
|
|
24
|
+
'button-variant'?: ButtonVariant;
|
|
25
|
+
autocomplete?: SDSTextFieldProps['autocomplete'];
|
|
26
|
+
required?: boolean;
|
|
27
|
+
minlength?: number;
|
|
28
|
+
maxlength?: number;
|
|
29
|
+
pattern?: string;
|
|
30
|
+
}
|
|
31
|
+
declare const SDSSearchComponent_base: import("../mixins/types").Constructable<import("../mixins/sds-event-dispatcher-mixin").SDSEventDispatcherMixinInterface> & import("../mixins/types").Constructable<import("../mixins/sds-form-control-mixin").SDSFormControlMixinInterface> & typeof SDSElement;
|
|
32
|
+
/**
|
|
33
|
+
* A search field composed of an `sds-textfield` and `sds-button`.
|
|
34
|
+
*
|
|
35
|
+
* The field uses `type="search"`, so its input exposes the `searchbox` role and
|
|
36
|
+
* assistive technology announces it as a search field.
|
|
37
|
+
*
|
|
38
|
+
* The element is form-associated. Its `name` and value are submitted with the
|
|
39
|
+
* surrounding `<form>`, and the form's reset restores the initial value.
|
|
40
|
+
* `required`, `minlength`, `maxlength` and `pattern` are forwarded to the inner input, and its
|
|
41
|
+
* validity is mirrored on the host, so the field takes part in form validation like a native input.
|
|
42
|
+
*
|
|
43
|
+
* Emits a cancelable `search` event (detail: `{ value }`) when the button is
|
|
44
|
+
* pressed or the user presses Enter while the field is focused. Like a form's `submit`
|
|
45
|
+
* event, it is only emitted once the field passes validation (unless the form has
|
|
46
|
+
* `novalidate`). Unless the event is cancelled, the surrounding form (if any) is then submitted.
|
|
47
|
+
*
|
|
48
|
+
* A custom action control can be supplied through the `button` slot.
|
|
49
|
+
* A slotted control owns its own behaviour (click, `disabled`, form submission);
|
|
50
|
+
* Enter in the field still emits `search` and submits the form.
|
|
51
|
+
*
|
|
52
|
+
* @fires search - `CustomEvent<SDSSearchDetail>` on submit. Cancel it to prevent form submission.
|
|
53
|
+
* @fires input - When the value of the field changes.
|
|
54
|
+
* @fires change - When the value of the field has changed and the field loses focus.
|
|
55
|
+
* @fires select - When text in the field is selected.
|
|
56
|
+
* @fires keydown - `KeyboardEvent` on key presses in the field. Cancelling Enter prevents `search`.
|
|
57
|
+
* @fires focus - `FocusEvent` when focus moves into the component. Moving between the field and the button does not fire.
|
|
58
|
+
* @fires blur - `FocusEvent` when focus leaves the component. Moving between the field and the button does not fire.
|
|
59
|
+
* @fires invalid - When `checkValidity()`, `reportValidity()` or form submission finds the field invalid.
|
|
60
|
+
* @slot label - Rich content for the field's label. Takes precedence over the `label` property.
|
|
61
|
+
* @slot button - Optional replacement for the default icon button.
|
|
62
|
+
*/
|
|
63
|
+
export declare class SDSSearchComponent extends SDSSearchComponent_base {
|
|
64
|
+
static styles: import("lit").CSSResult[];
|
|
65
|
+
value: string;
|
|
66
|
+
label?: string;
|
|
67
|
+
/** Hides the label visually while keeping it as the field's accessible name. */
|
|
68
|
+
hideLabel: boolean;
|
|
69
|
+
placeholder?: string;
|
|
70
|
+
helpText?: string;
|
|
71
|
+
errorMessage?: string;
|
|
72
|
+
size: SearchSize;
|
|
73
|
+
buttonLabel: string;
|
|
74
|
+
buttonVariant: ButtonVariant;
|
|
75
|
+
autocomplete?: SDSSearchProps['autocomplete'];
|
|
76
|
+
required: boolean;
|
|
77
|
+
minlength?: number;
|
|
78
|
+
maxlength?: number;
|
|
79
|
+
pattern?: string;
|
|
80
|
+
private _field?;
|
|
81
|
+
private _buttonCol?;
|
|
82
|
+
private _resizeObserver?;
|
|
83
|
+
private _defaultValue;
|
|
84
|
+
private _customValidityMessage;
|
|
85
|
+
constructor();
|
|
86
|
+
connectedCallback(): void;
|
|
87
|
+
disconnectedCallback(): void;
|
|
88
|
+
updated(changedProperties: PropertyValues): void;
|
|
89
|
+
/** Mirrors the inner input's validity on the host, which is the element the form validates. */
|
|
90
|
+
updateValidity(): void;
|
|
91
|
+
get validity(): ValidityState;
|
|
92
|
+
get validationMessage(): string;
|
|
93
|
+
get willValidate(): boolean;
|
|
94
|
+
checkValidity(): boolean;
|
|
95
|
+
reportValidity(): boolean;
|
|
96
|
+
setCustomValidity(message: string): void;
|
|
97
|
+
select(): void;
|
|
98
|
+
get selectionStart(): number | null;
|
|
99
|
+
set selectionStart(value: number | null);
|
|
100
|
+
get selectionEnd(): number | null;
|
|
101
|
+
set selectionEnd(value: number | null);
|
|
102
|
+
setSelectionRange(start: number, end: number, direction?: 'forward' | 'backward' | 'none'): void;
|
|
103
|
+
formResetCallback(): void;
|
|
104
|
+
formStateRestoreCallback(state: string | File | FormData | null): void;
|
|
105
|
+
/**
|
|
106
|
+
* Keeps the button aligned with the input row regardless of a stacked label,
|
|
107
|
+
* help text (including when it wraps) or an error message below the input, by
|
|
108
|
+
* shifting the button down by the input's offset within the field.
|
|
109
|
+
*/
|
|
110
|
+
private _alignButtonToInput;
|
|
111
|
+
/** Emits `search` and, unless it is cancelled, submits the surrounding form. */
|
|
112
|
+
private _submit;
|
|
113
|
+
/** Whether `node` is the host, its light DOM content or part of its shadow tree. */
|
|
114
|
+
private _isOwnNode;
|
|
115
|
+
private readonly _handleFocusIn;
|
|
116
|
+
private readonly _handleFocusOut;
|
|
117
|
+
/** Stops `focus`/`blur` from the inner controls, both synthetic and native. The host emits its own. */
|
|
118
|
+
private readonly _stopChildEvent;
|
|
119
|
+
private readonly _reemitChildEvent;
|
|
120
|
+
private readonly _handleInput;
|
|
121
|
+
private readonly _handleButtonClick;
|
|
122
|
+
private readonly _handleKeydown;
|
|
123
|
+
private _renderField;
|
|
124
|
+
private _renderButtonColumn;
|
|
125
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
126
|
+
}
|
|
127
|
+
export {};
|
|
128
|
+
//# sourceMappingURL=sds-search.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sds-search.component.d.ts","sourceRoot":"","sources":["../../src/sds-search/sds-search.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { html } from 'lit';
|
|
8
|
+
import { property, query } from 'lit/decorators.js';
|
|
9
|
+
import { ifDefined } from 'lit/directives/if-defined.js';
|
|
10
|
+
import { SDSElement } from '../utils/sds-element';
|
|
11
|
+
import { SDSEventDispatcherMixin, SDSFormControlMixin } from '../mixins';
|
|
12
|
+
import { styles } from './sds-search.styles';
|
|
13
|
+
import '../sds-textfield/sds-textfield';
|
|
14
|
+
import '../sds-button/sds-button';
|
|
15
|
+
import '../sds-icon/sds-icon';
|
|
16
|
+
/**
|
|
17
|
+
* A search field composed of an `sds-textfield` and `sds-button`.
|
|
18
|
+
*
|
|
19
|
+
* The field uses `type="search"`, so its input exposes the `searchbox` role and
|
|
20
|
+
* assistive technology announces it as a search field.
|
|
21
|
+
*
|
|
22
|
+
* The element is form-associated. Its `name` and value are submitted with the
|
|
23
|
+
* surrounding `<form>`, and the form's reset restores the initial value.
|
|
24
|
+
* `required`, `minlength`, `maxlength` and `pattern` are forwarded to the inner input, and its
|
|
25
|
+
* validity is mirrored on the host, so the field takes part in form validation like a native input.
|
|
26
|
+
*
|
|
27
|
+
* Emits a cancelable `search` event (detail: `{ value }`) when the button is
|
|
28
|
+
* pressed or the user presses Enter while the field is focused. Like a form's `submit`
|
|
29
|
+
* event, it is only emitted once the field passes validation (unless the form has
|
|
30
|
+
* `novalidate`). Unless the event is cancelled, the surrounding form (if any) is then submitted.
|
|
31
|
+
*
|
|
32
|
+
* A custom action control can be supplied through the `button` slot.
|
|
33
|
+
* A slotted control owns its own behaviour (click, `disabled`, form submission);
|
|
34
|
+
* Enter in the field still emits `search` and submits the form.
|
|
35
|
+
*
|
|
36
|
+
* @fires search - `CustomEvent<SDSSearchDetail>` on submit. Cancel it to prevent form submission.
|
|
37
|
+
* @fires input - When the value of the field changes.
|
|
38
|
+
* @fires change - When the value of the field has changed and the field loses focus.
|
|
39
|
+
* @fires select - When text in the field is selected.
|
|
40
|
+
* @fires keydown - `KeyboardEvent` on key presses in the field. Cancelling Enter prevents `search`.
|
|
41
|
+
* @fires focus - `FocusEvent` when focus moves into the component. Moving between the field and the button does not fire.
|
|
42
|
+
* @fires blur - `FocusEvent` when focus leaves the component. Moving between the field and the button does not fire.
|
|
43
|
+
* @fires invalid - When `checkValidity()`, `reportValidity()` or form submission finds the field invalid.
|
|
44
|
+
* @slot label - Rich content for the field's label. Takes precedence over the `label` property.
|
|
45
|
+
* @slot button - Optional replacement for the default icon button.
|
|
46
|
+
*/
|
|
47
|
+
export class SDSSearchComponent extends SDSEventDispatcherMixin(SDSFormControlMixin(SDSElement)) {
|
|
48
|
+
constructor() {
|
|
49
|
+
super();
|
|
50
|
+
this.value = '';
|
|
51
|
+
/** Hides the label visually while keeping it as the field's accessible name. */
|
|
52
|
+
this.hideLabel = false;
|
|
53
|
+
this.size = 'md';
|
|
54
|
+
this.buttonLabel = 'Søk';
|
|
55
|
+
this.buttonVariant = 'primary';
|
|
56
|
+
this.required = false;
|
|
57
|
+
this._defaultValue = '';
|
|
58
|
+
this._customValidityMessage = '';
|
|
59
|
+
// The browser does not dispatch focusin/focusout on the host
|
|
60
|
+
// when focus moves within the shadow tree.
|
|
61
|
+
// `relatedTarget` is set to the host when it moves to/from slotted content.
|
|
62
|
+
this._handleFocusIn = (event) => {
|
|
63
|
+
if (!this._isOwnNode(event.relatedTarget)) {
|
|
64
|
+
this.dispatchEvent(new FocusEvent('focus', { composed: true, relatedTarget: event.relatedTarget }));
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
this._handleFocusOut = (event) => {
|
|
68
|
+
if (!this._isOwnNode(event.relatedTarget)) {
|
|
69
|
+
this.dispatchEvent(new FocusEvent('blur', { composed: true, relatedTarget: event.relatedTarget }));
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
/** Stops `focus`/`blur` from the inner controls, both synthetic and native. The host emits its own. */
|
|
73
|
+
this._stopChildEvent = (event) => {
|
|
74
|
+
event.stopImmediatePropagation();
|
|
75
|
+
};
|
|
76
|
+
this._reemitChildEvent = (event) => {
|
|
77
|
+
event.stopImmediatePropagation();
|
|
78
|
+
this.dispatchSheriffEvent(event.type);
|
|
79
|
+
};
|
|
80
|
+
this._handleInput = (event) => {
|
|
81
|
+
event.stopImmediatePropagation();
|
|
82
|
+
// Synced before re-emitting so `event.target.value` is current in listeners, like native `input`.
|
|
83
|
+
const target = event.target;
|
|
84
|
+
if (!!target && 'value' in target && typeof target.value === 'string') {
|
|
85
|
+
this.value = target.value;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.value = '';
|
|
89
|
+
}
|
|
90
|
+
this.updateValidity();
|
|
91
|
+
this.dispatchSheriffEvent('input');
|
|
92
|
+
};
|
|
93
|
+
this._handleButtonClick = () => {
|
|
94
|
+
this._submit();
|
|
95
|
+
};
|
|
96
|
+
this._handleKeydown = (event) => {
|
|
97
|
+
event.stopImmediatePropagation();
|
|
98
|
+
// Cancelling the re-emitted event also cancels the textfield's, so neither submits.
|
|
99
|
+
if (!this.dispatchKeyboardEvent('keydown', event)) {
|
|
100
|
+
event.preventDefault();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Enter that confirms an IME composition is not a submit, matching native implicit submission.
|
|
104
|
+
if (event.key !== 'Enter' || event.isComposing) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// Suppress the textfield's own Enter handling so `search` fires once.
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
this._submit();
|
|
110
|
+
};
|
|
111
|
+
this.addEventListener('focusin', this._handleFocusIn);
|
|
112
|
+
this.addEventListener('focusout', this._handleFocusOut);
|
|
113
|
+
}
|
|
114
|
+
connectedCallback() {
|
|
115
|
+
super.connectedCallback();
|
|
116
|
+
this._defaultValue = this.value;
|
|
117
|
+
this.internals.setFormValue(this.value);
|
|
118
|
+
// Re-align when the field reflows (e.g. help text wraps on narrow widths).
|
|
119
|
+
const resizeObserver = new ResizeObserver(() => this._alignButtonToInput());
|
|
120
|
+
this._resizeObserver = resizeObserver;
|
|
121
|
+
void this.updateComplete.then(() => {
|
|
122
|
+
if (this._resizeObserver === resizeObserver && this._field) {
|
|
123
|
+
resizeObserver.observe(this._field);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
disconnectedCallback() {
|
|
128
|
+
super.disconnectedCallback();
|
|
129
|
+
this._resizeObserver?.disconnect();
|
|
130
|
+
this._resizeObserver = undefined;
|
|
131
|
+
}
|
|
132
|
+
updated(changedProperties) {
|
|
133
|
+
super.updated(changedProperties);
|
|
134
|
+
if (changedProperties.has('value')) {
|
|
135
|
+
this.internals.setFormValue(this.value);
|
|
136
|
+
}
|
|
137
|
+
// The inner input applies new constraints and values when the textfield renders.
|
|
138
|
+
void this._field?.updateComplete.then(() => this.updateValidity());
|
|
139
|
+
const onlyValueChanged = changedProperties.size === 1 && changedProperties.has('value');
|
|
140
|
+
if (onlyValueChanged) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
this._alignButtonToInput();
|
|
144
|
+
}
|
|
145
|
+
/** Mirrors the inner input's validity on the host, which is the element the form validates. */
|
|
146
|
+
updateValidity() {
|
|
147
|
+
const field = this._field;
|
|
148
|
+
const control = field?.control;
|
|
149
|
+
if (!field || !control) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
field.setCustomValidity(this._customValidityMessage);
|
|
153
|
+
this.internals.setValidity(control.validity, control.validationMessage, control);
|
|
154
|
+
}
|
|
155
|
+
get validity() {
|
|
156
|
+
return this.internals.validity;
|
|
157
|
+
}
|
|
158
|
+
get validationMessage() {
|
|
159
|
+
return this.internals.validationMessage;
|
|
160
|
+
}
|
|
161
|
+
get willValidate() {
|
|
162
|
+
return this.internals.willValidate;
|
|
163
|
+
}
|
|
164
|
+
checkValidity() {
|
|
165
|
+
return this.internals.checkValidity();
|
|
166
|
+
}
|
|
167
|
+
reportValidity() {
|
|
168
|
+
return this.internals.reportValidity();
|
|
169
|
+
}
|
|
170
|
+
setCustomValidity(message) {
|
|
171
|
+
this._customValidityMessage = message;
|
|
172
|
+
this.updateValidity();
|
|
173
|
+
}
|
|
174
|
+
select() {
|
|
175
|
+
this._field?.select();
|
|
176
|
+
}
|
|
177
|
+
get selectionStart() {
|
|
178
|
+
return this._field?.selectionStart ?? null;
|
|
179
|
+
}
|
|
180
|
+
set selectionStart(value) {
|
|
181
|
+
if (this._field) {
|
|
182
|
+
this._field.selectionStart = value;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
get selectionEnd() {
|
|
186
|
+
return this._field?.selectionEnd ?? null;
|
|
187
|
+
}
|
|
188
|
+
set selectionEnd(value) {
|
|
189
|
+
if (this._field) {
|
|
190
|
+
this._field.selectionEnd = value;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
setSelectionRange(start, end, direction) {
|
|
194
|
+
this._field?.setSelectionRange(start, end, direction);
|
|
195
|
+
}
|
|
196
|
+
formResetCallback() {
|
|
197
|
+
this.value = this._defaultValue;
|
|
198
|
+
}
|
|
199
|
+
formStateRestoreCallback(state) {
|
|
200
|
+
if (typeof state === 'string') {
|
|
201
|
+
this.value = state;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Keeps the button aligned with the input row regardless of a stacked label,
|
|
206
|
+
* help text (including when it wraps) or an error message below the input, by
|
|
207
|
+
* shifting the button down by the input's offset within the field.
|
|
208
|
+
*/
|
|
209
|
+
async _alignButtonToInput() {
|
|
210
|
+
const field = this._field;
|
|
211
|
+
const buttonCol = this._buttonCol;
|
|
212
|
+
if (!field || !buttonCol) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
await field.updateComplete;
|
|
216
|
+
const input = field.control;
|
|
217
|
+
if (!input) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const offset = input.getBoundingClientRect().top - field.getBoundingClientRect().top;
|
|
221
|
+
buttonCol.style.marginBlockStart = offset > 0 ? `${offset}px` : '';
|
|
222
|
+
}
|
|
223
|
+
/** Emits `search` and, unless it is cancelled, submits the surrounding form. */
|
|
224
|
+
_submit() {
|
|
225
|
+
if (this.disabled) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
// Like a form's `submit` event, `search` only fires for a valid field. `novalidate` opts out, as for the form.
|
|
229
|
+
if (!this.form?.noValidate && !this.reportValidity()) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const shouldContinue = this.dispatchSheriffEvent('search', { value: this.value });
|
|
233
|
+
if (shouldContinue) {
|
|
234
|
+
this.form?.requestSubmit();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/** Whether `node` is the host, its light DOM content or part of its shadow tree. */
|
|
238
|
+
_isOwnNode(node) {
|
|
239
|
+
return node instanceof Node && (node === this || this.contains(node) || Boolean(this.shadowRoot?.contains(node)));
|
|
240
|
+
}
|
|
241
|
+
_renderField() {
|
|
242
|
+
return html `
|
|
243
|
+
<sds-textfield
|
|
244
|
+
class="sds-search__field"
|
|
245
|
+
type="search"
|
|
246
|
+
size="${this.size ?? 'md'}"
|
|
247
|
+
.value="${this.value}"
|
|
248
|
+
?hide-label="${this.hideLabel}"
|
|
249
|
+
placeholder="${ifDefined(this.placeholder)}"
|
|
250
|
+
help-text="${ifDefined(this.helpText)}"
|
|
251
|
+
error-message="${ifDefined(this.errorMessage)}"
|
|
252
|
+
?disabled="${this.disabled}"
|
|
253
|
+
?readonly="${this.readOnly}"
|
|
254
|
+
autocomplete="${ifDefined(this.autocomplete)}"
|
|
255
|
+
?required="${this.required}"
|
|
256
|
+
minlength="${ifDefined(this.minlength)}"
|
|
257
|
+
maxlength="${ifDefined(this.maxlength)}"
|
|
258
|
+
pattern="${ifDefined(this.pattern)}"
|
|
259
|
+
@input="${this._handleInput}"
|
|
260
|
+
@change="${this._reemitChildEvent}"
|
|
261
|
+
@select="${this._reemitChildEvent}"
|
|
262
|
+
@keydown="${this._handleKeydown}"
|
|
263
|
+
@focus="${this._stopChildEvent}"
|
|
264
|
+
@blur="${this._stopChildEvent}"
|
|
265
|
+
>
|
|
266
|
+
<slot name="label" slot="label">${this.label}</slot>
|
|
267
|
+
</sds-textfield>
|
|
268
|
+
`;
|
|
269
|
+
}
|
|
270
|
+
_renderButtonColumn() {
|
|
271
|
+
return html `
|
|
272
|
+
<div class="sds-search__button-col">
|
|
273
|
+
<slot name="button">
|
|
274
|
+
<sds-button
|
|
275
|
+
class="sds-search__button"
|
|
276
|
+
icon
|
|
277
|
+
type="button"
|
|
278
|
+
size="${this.size ?? 'md'}"
|
|
279
|
+
variant="${this.buttonVariant}"
|
|
280
|
+
label="${this.buttonLabel}"
|
|
281
|
+
?disabled="${this.disabled}"
|
|
282
|
+
@click="${this._handleButtonClick}"
|
|
283
|
+
@focus="${this._stopChildEvent}"
|
|
284
|
+
@blur="${this._stopChildEvent}"
|
|
285
|
+
>
|
|
286
|
+
<sds-icon name="search-material-outlined" size="${this.size}"></sds-icon>
|
|
287
|
+
</sds-button>
|
|
288
|
+
</slot>
|
|
289
|
+
</div>
|
|
290
|
+
`;
|
|
291
|
+
}
|
|
292
|
+
render() {
|
|
293
|
+
return html `<div class="sds-search">${this._renderField()} ${this._renderButtonColumn()}</div>`;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
SDSSearchComponent.styles = [styles];
|
|
297
|
+
__decorate([
|
|
298
|
+
property({ type: String })
|
|
299
|
+
], SDSSearchComponent.prototype, "value", void 0);
|
|
300
|
+
__decorate([
|
|
301
|
+
property({ type: String, reflect: true })
|
|
302
|
+
], SDSSearchComponent.prototype, "label", void 0);
|
|
303
|
+
__decorate([
|
|
304
|
+
property({ type: Boolean, attribute: 'hide-label', reflect: true })
|
|
305
|
+
], SDSSearchComponent.prototype, "hideLabel", void 0);
|
|
306
|
+
__decorate([
|
|
307
|
+
property({ type: String, reflect: true })
|
|
308
|
+
], SDSSearchComponent.prototype, "placeholder", void 0);
|
|
309
|
+
__decorate([
|
|
310
|
+
property({ type: String, attribute: 'help-text', reflect: true })
|
|
311
|
+
], SDSSearchComponent.prototype, "helpText", void 0);
|
|
312
|
+
__decorate([
|
|
313
|
+
property({ type: String, attribute: 'error-message', reflect: true })
|
|
314
|
+
], SDSSearchComponent.prototype, "errorMessage", void 0);
|
|
315
|
+
__decorate([
|
|
316
|
+
property({ type: String, reflect: true })
|
|
317
|
+
], SDSSearchComponent.prototype, "size", void 0);
|
|
318
|
+
__decorate([
|
|
319
|
+
property({ type: String, attribute: 'button-label', reflect: true })
|
|
320
|
+
], SDSSearchComponent.prototype, "buttonLabel", void 0);
|
|
321
|
+
__decorate([
|
|
322
|
+
property({ type: String, attribute: 'button-variant', reflect: true })
|
|
323
|
+
], SDSSearchComponent.prototype, "buttonVariant", void 0);
|
|
324
|
+
__decorate([
|
|
325
|
+
property({ type: String, reflect: true })
|
|
326
|
+
], SDSSearchComponent.prototype, "autocomplete", void 0);
|
|
327
|
+
__decorate([
|
|
328
|
+
property({ type: Boolean, reflect: true })
|
|
329
|
+
], SDSSearchComponent.prototype, "required", void 0);
|
|
330
|
+
__decorate([
|
|
331
|
+
property({ type: Number, reflect: true })
|
|
332
|
+
], SDSSearchComponent.prototype, "minlength", void 0);
|
|
333
|
+
__decorate([
|
|
334
|
+
property({ type: Number, reflect: true })
|
|
335
|
+
], SDSSearchComponent.prototype, "maxlength", void 0);
|
|
336
|
+
__decorate([
|
|
337
|
+
property({ type: String, reflect: true })
|
|
338
|
+
], SDSSearchComponent.prototype, "pattern", void 0);
|
|
339
|
+
__decorate([
|
|
340
|
+
query('.sds-search__field')
|
|
341
|
+
], SDSSearchComponent.prototype, "_field", void 0);
|
|
342
|
+
__decorate([
|
|
343
|
+
query('.sds-search__button-col')
|
|
344
|
+
], SDSSearchComponent.prototype, "_buttonCol", void 0);
|
|
345
|
+
//# sourceMappingURL=sds-search.component.js.map
|