@supersoniks/concorde 4.9.98-visual-stack.1 → 4.9.98-visual-stack.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/.gitlab-ci.yml +0 -13
- package/build-infos.json +1 -1
- package/concorde-3d.bundle.js +1 -1
- package/concorde-3d.es.js +2 -2
- package/concorde-core.bundle.js +557 -622
- package/concorde-core.es.js +6025 -5575
- package/concorde-hugging-face-infer.bundle.js +1 -1
- package/concorde-hugging-face-infer.es.js +1 -1
- package/concorde-interactive.bundle.js +1162 -0
- package/concorde-interactive.es.js +10723 -0
- package/concorde-shader.bundle.js +1 -1
- package/concorde-shader.es.js +2 -2
- package/concorde-webgpu.bundle.js +1 -1
- package/concorde-webgpu.es.js +2 -2
- package/dist/concorde-3d.bundle.js +1 -1
- package/dist/concorde-3d.es.js +2 -2
- package/dist/concorde-core.bundle.js +557 -622
- package/dist/concorde-core.es.js +6025 -5575
- package/dist/concorde-hugging-face-infer.bundle.js +1 -1
- package/dist/concorde-hugging-face-infer.es.js +1 -1
- package/dist/concorde-interactive.bundle.js +1162 -0
- package/dist/concorde-interactive.es.js +10723 -0
- package/dist/concorde-shader.bundle.js +1 -1
- package/dist/concorde-shader.es.js +2 -2
- package/dist/concorde-webgpu.bundle.js +1 -1
- package/dist/concorde-webgpu.es.js +2 -2
- package/dist/docs-mock-api-sw.js +5 -1
- package/dist/docs-mock-api-sw.js.map +2 -2
- package/dist/js/addons/interactive.js +6 -0
- package/dist/js/addons/interactive.js.map +1 -0
- package/dist/js/core/components/functional/if/if.js +65 -7
- package/dist/js/core/components/functional/if/if.js.map +1 -1
- package/dist/js/core/components/functional/interactive/action.js +96 -0
- package/dist/js/core/components/functional/interactive/action.js.map +1 -0
- package/dist/js/core/components/functional/interactive/gamepad.js +206 -0
- package/dist/js/core/components/functional/interactive/gamepad.js.map +1 -0
- package/dist/js/core/components/functional/interactive/gesture.js +148 -0
- package/dist/js/core/components/functional/interactive/gesture.js.map +1 -0
- package/dist/js/core/components/functional/interactive/helpers.js +82 -0
- package/dist/js/core/components/functional/interactive/helpers.js.map +1 -0
- package/dist/js/core/components/functional/interactive/index.js +20 -0
- package/dist/js/core/components/functional/interactive/index.js.map +1 -0
- package/dist/js/core/components/functional/interactive/keyboard.js +183 -0
- package/dist/js/core/components/functional/interactive/keyboard.js.map +1 -0
- package/dist/js/core/components/functional/interactive/matrix.js +201 -0
- package/dist/js/core/components/functional/interactive/matrix.js.map +1 -0
- package/dist/js/core/components/functional/interactive/registry.js +28 -0
- package/dist/js/core/components/functional/interactive/registry.js.map +1 -0
- package/dist/js/core/components/functional/interactive/store.js +264 -0
- package/dist/js/core/components/functional/interactive/store.js.map +1 -0
- package/dist/js/core/components/functional/interactive/ticker.js +182 -0
- package/dist/js/core/components/functional/interactive/ticker.js.map +1 -0
- package/dist/js/core/components/functional/value/value.js +49 -4
- package/dist/js/core/components/functional/value/value.js.map +1 -1
- package/dist/js/core/components/ui/_css/rounded.js +34 -0
- package/dist/js/core/components/ui/_css/rounded.js.map +1 -0
- package/dist/js/core/components/ui/_css/type.js +44 -0
- package/dist/js/core/components/ui/_css/type.js.map +1 -1
- package/dist/js/core/components/ui/_i18n/ui-aria-labels.js +95 -0
- package/dist/js/core/components/ui/_i18n/ui-aria-labels.js.map +1 -0
- package/dist/js/core/components/ui/alert/alert.js +72 -87
- package/dist/js/core/components/ui/alert/alert.js.map +1 -1
- package/dist/js/core/components/ui/alert-messages/alert-messages.js +1 -0
- package/dist/js/core/components/ui/alert-messages/alert-messages.js.map +1 -1
- package/dist/js/core/components/ui/badge/badge.js +29 -80
- package/dist/js/core/components/ui/badge/badge.js.map +1 -1
- package/dist/js/core/components/ui/button/button.js +8 -7
- package/dist/js/core/components/ui/button/button.js.map +1 -1
- package/dist/js/core/components/ui/card/card-header.js +7 -2
- package/dist/js/core/components/ui/card/card-header.js.map +1 -1
- package/dist/js/core/components/ui/divider/divider.js +1 -1
- package/dist/js/core/components/ui/divider/divider.js.map +1 -1
- package/dist/js/core/components/ui/form/checkbox/checkbox.js +4 -20
- package/dist/js/core/components/ui/form/checkbox/checkbox.js.map +1 -1
- package/dist/js/core/components/ui/form/fieldset/legend-description.js +1 -1
- package/dist/js/core/components/ui/form/fieldset/legend.js +1 -1
- package/dist/js/core/components/ui/form/input/input.js +12 -15
- package/dist/js/core/components/ui/form/input/input.js.map +1 -1
- package/dist/js/core/components/ui/form/input-autocomplete/input-autocomplete.js +363 -158
- package/dist/js/core/components/ui/form/input-autocomplete/input-autocomplete.js.map +1 -1
- package/dist/js/core/components/ui/form/radio/radio.js +1 -1
- package/dist/js/core/components/ui/form/select/select.js +3 -6
- package/dist/js/core/components/ui/form/select/select.js.map +1 -1
- package/dist/js/core/components/ui/form/textarea/textarea.js +1 -2
- package/dist/js/core/components/ui/form/textarea/textarea.js.map +1 -1
- package/dist/js/core/components/ui/image/image.js +9 -37
- package/dist/js/core/components/ui/image/image.js.map +1 -1
- package/dist/js/core/components/ui/link/link.js +25 -26
- package/dist/js/core/components/ui/link/link.js.map +1 -1
- package/dist/js/core/components/ui/modal/modal-close.js +3 -12
- package/dist/js/core/components/ui/modal/modal-close.js.map +1 -1
- package/dist/js/core/components/ui/modal/modal.js +18 -18
- package/dist/js/core/components/ui/modal/modal.js.map +1 -1
- package/dist/js/core/components/ui/pop/pop.js +131 -112
- package/dist/js/core/components/ui/pop/pop.js.map +1 -1
- package/dist/js/core/components/ui/table/table.js.map +1 -1
- package/dist/js/core/components/ui/theme/theme.js +1 -1
- package/dist/js/core/components/ui/toast/dismissed.js +9 -0
- package/dist/js/core/components/ui/toast/dismissed.js.map +1 -0
- package/dist/js/core/components/ui/toast/render-content.js +14 -0
- package/dist/js/core/components/ui/toast/render-content.js.map +1 -0
- package/dist/js/core/components/ui/toast/toast-item.js +150 -96
- package/dist/js/core/components/ui/toast/toast-item.js.map +1 -1
- package/dist/js/core/components/ui/toast/toast.js +41 -13
- package/dist/js/core/components/ui/toast/toast.js.map +1 -1
- package/dist/js/core/components/ui/tooltip/tooltip.js +144 -143
- package/dist/js/core/components/ui/tooltip/tooltip.js.map +1 -1
- package/dist/js/core/decorators/subscriber/ancestorAttribute.js.map +1 -1
- package/dist/js/core/decorators/subscriber/derive.js +3 -1
- package/dist/js/core/decorators/subscriber/derive.js.map +1 -1
- package/dist/js/core/mixins/Fetcher.js.map +1 -1
- package/dist/js/core/mixins/FormCheckable.js +1 -8
- package/dist/js/core/mixins/FormCheckable.js.map +1 -1
- package/dist/js/core/mixins/FormElement.js +26 -53
- package/dist/js/core/mixins/FormElement.js.map +1 -1
- package/dist/js/core/utils/AncestorAttributeObserver.js +130 -55
- package/dist/js/core/utils/AncestorAttributeObserver.js.map +1 -1
- package/dist/js/core/utils/LocationHandler.js +1 -1
- package/dist/js/core/utils/LocationHandler.js.map +1 -1
- package/dist/js/core/utils/dismissed.js +23 -0
- package/dist/js/core/utils/dismissed.js.map +1 -0
- package/dist/js/core/utils/positioning.js +110 -0
- package/dist/js/core/utils/positioning.js.map +1 -0
- package/dist/js/directives.js +1 -2
- package/dist/js/directives.js.map +1 -1
- package/dist/types/addons/interactive.d.ts +6 -0
- package/dist/types/addons/interactive.d.ts.map +1 -0
- package/dist/types/core/components/functional/if/if.d.ts +14 -5
- package/dist/types/core/components/functional/if/if.d.ts.map +1 -1
- package/dist/types/core/components/functional/interactive/action.d.ts +22 -0
- package/dist/types/core/components/functional/interactive/action.d.ts.map +1 -0
- package/dist/types/core/components/functional/interactive/gamepad.d.ts +37 -0
- package/dist/types/core/components/functional/interactive/gamepad.d.ts.map +1 -0
- package/dist/types/core/components/functional/interactive/gesture.d.ts +26 -0
- package/dist/types/core/components/functional/interactive/gesture.d.ts.map +1 -0
- package/dist/types/core/components/functional/interactive/helpers.d.ts +23 -0
- package/dist/types/core/components/functional/interactive/helpers.d.ts.map +1 -0
- package/dist/types/core/components/functional/interactive/index.d.ts +20 -0
- package/dist/types/core/components/functional/interactive/index.d.ts.map +1 -0
- package/dist/types/core/components/functional/interactive/keyboard.d.ts +37 -0
- package/dist/types/core/components/functional/interactive/keyboard.d.ts.map +1 -0
- package/dist/types/core/components/functional/interactive/matrix.d.ts +31 -0
- package/dist/types/core/components/functional/interactive/matrix.d.ts.map +1 -0
- package/dist/types/core/components/functional/interactive/registry.d.ts +23 -0
- package/dist/types/core/components/functional/interactive/registry.d.ts.map +1 -0
- package/dist/types/core/components/functional/interactive/store.d.ts +46 -0
- package/dist/types/core/components/functional/interactive/store.d.ts.map +1 -0
- package/dist/types/core/components/functional/interactive/ticker.d.ts +33 -0
- package/dist/types/core/components/functional/interactive/ticker.d.ts.map +1 -0
- package/dist/types/core/components/functional/value/value.d.ts +6 -0
- package/dist/types/core/components/functional/value/value.d.ts.map +1 -1
- package/dist/types/core/components/ui/_css/rounded.d.ts +3 -0
- package/dist/types/core/components/ui/_css/rounded.d.ts.map +1 -0
- package/dist/types/core/components/ui/_css/type.d.ts +13 -0
- package/dist/types/core/components/ui/_css/type.d.ts.map +1 -1
- package/dist/types/core/components/ui/_i18n/ui-aria-labels.d.ts +83 -0
- package/dist/types/core/components/ui/_i18n/ui-aria-labels.d.ts.map +1 -0
- package/dist/types/core/components/ui/alert/alert.d.ts +14 -12
- package/dist/types/core/components/ui/alert/alert.d.ts.map +1 -1
- package/dist/types/core/components/ui/alert-messages/alert-messages.d.ts.map +1 -1
- package/dist/types/core/components/ui/badge/badge.d.ts +1 -1
- package/dist/types/core/components/ui/badge/badge.d.ts.map +1 -1
- package/dist/types/core/components/ui/button/button.d.ts +13 -29
- package/dist/types/core/components/ui/button/button.d.ts.map +1 -1
- package/dist/types/core/components/ui/card/card-header.d.ts.map +1 -1
- package/dist/types/core/components/ui/divider/divider.d.ts +2 -1
- package/dist/types/core/components/ui/divider/divider.d.ts.map +1 -1
- package/dist/types/core/components/ui/form/checkbox/checkbox.d.ts +25 -73
- package/dist/types/core/components/ui/form/checkbox/checkbox.d.ts.map +1 -1
- package/dist/types/core/components/ui/form/input/input.d.ts +14 -29
- package/dist/types/core/components/ui/form/input/input.d.ts.map +1 -1
- package/dist/types/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts +63 -65
- package/dist/types/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts.map +1 -1
- package/dist/types/core/components/ui/form/radio/radio.d.ts +1 -1
- package/dist/types/core/components/ui/form/select/select.d.ts +3 -5
- package/dist/types/core/components/ui/form/select/select.d.ts.map +1 -1
- package/dist/types/core/components/ui/form/textarea/textarea.d.ts +12 -28
- package/dist/types/core/components/ui/form/textarea/textarea.d.ts.map +1 -1
- package/dist/types/core/components/ui/image/image.d.ts +2 -1
- package/dist/types/core/components/ui/image/image.d.ts.map +1 -1
- package/dist/types/core/components/ui/link/link.d.ts +10 -9
- package/dist/types/core/components/ui/link/link.d.ts.map +1 -1
- package/dist/types/core/components/ui/modal/modal-close.d.ts +2 -2
- package/dist/types/core/components/ui/modal/modal-close.d.ts.map +1 -1
- package/dist/types/core/components/ui/pop/pop.d.ts +12 -4
- package/dist/types/core/components/ui/pop/pop.d.ts.map +1 -1
- package/dist/types/core/components/ui/table/table.d.ts +2 -1
- package/dist/types/core/components/ui/table/table.d.ts.map +1 -1
- package/dist/types/core/components/ui/toast/dismissed.d.ts +3 -0
- package/dist/types/core/components/ui/toast/dismissed.d.ts.map +1 -0
- package/dist/types/core/components/ui/toast/render-content.d.ts +7 -0
- package/dist/types/core/components/ui/toast/render-content.d.ts.map +1 -0
- package/dist/types/core/components/ui/toast/toast-item.d.ts +26 -9
- package/dist/types/core/components/ui/toast/toast-item.d.ts.map +1 -1
- package/dist/types/core/components/ui/toast/toast.d.ts +6 -3
- package/dist/types/core/components/ui/toast/toast.d.ts.map +1 -1
- package/dist/types/core/components/ui/toast/types.d.ts +12 -2
- package/dist/types/core/components/ui/toast/types.d.ts.map +1 -1
- package/dist/types/core/components/ui/tooltip/tooltip.d.ts +19 -11
- package/dist/types/core/components/ui/tooltip/tooltip.d.ts.map +1 -1
- package/dist/types/core/decorators/subscriber/ancestorAttribute.d.ts +3 -4
- package/dist/types/core/decorators/subscriber/ancestorAttribute.d.ts.map +1 -1
- package/dist/types/core/decorators/subscriber/derive.d.ts.map +1 -1
- package/dist/types/core/mixins/FormCheckable.d.ts +10 -27
- package/dist/types/core/mixins/FormCheckable.d.ts.map +1 -1
- package/dist/types/core/mixins/FormElement.d.ts +21 -10
- package/dist/types/core/mixins/FormElement.d.ts.map +1 -1
- package/dist/types/core/mixins/FormInput.d.ts +11 -27
- package/dist/types/core/mixins/FormInput.d.ts.map +1 -1
- package/dist/types/core/utils/AncestorAttributeObserver.d.ts +17 -9
- package/dist/types/core/utils/AncestorAttributeObserver.d.ts.map +1 -1
- package/dist/types/core/utils/LocationHandler.d.ts +3 -2
- package/dist/types/core/utils/LocationHandler.d.ts.map +1 -1
- package/dist/types/core/utils/dismissed.d.ts +3 -0
- package/dist/types/core/utils/dismissed.d.ts.map +1 -0
- package/dist/types/core/utils/positioning.d.ts +44 -0
- package/dist/types/core/utils/positioning.d.ts.map +1 -0
- package/dist/types/directives.d.ts +1 -3
- package/dist/types/directives.d.ts.map +1 -1
- package/dist/types/mixins.d.ts +22 -55
- package/dist/types/mixins.d.ts.map +1 -1
- package/docs/assets/{index-FmK4JaIM.js → index-D8MVWqY6.js} +946 -687
- package/docs/assets/index-DiD0qYvE.css +1 -0
- package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +17 -85
- package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +1 -1
- package/docs/crawl/hubs/form-components.html +13 -11
- package/docs/docs-mock-api-sw.js +5 -1
- package/docs/docs-mock-api-sw.js.map +2 -2
- package/docs/index.html +2 -2
- package/docs/llms-full.txt +12 -38
- package/docs/llms.txt +1 -1
- package/docs/src/core/components/functional/sdui/sdui.md +0 -0
- package/docs/src/core/components/ui/form/checkbox/checkbox.md +0 -0
- package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +14 -118
- package/docs/src/docs/_getting-started/create-a-component.md +0 -0
- package/docs/src/docs/_misc/formelement-subscriber-removal.md +1 -1
- package/docs/src/docs/search/docs-search.json +195 -200
- package/docs/src/tsconfig.json +324 -0
- package/gitlab/job_tests.sh +25 -12
- package/index.html +3 -3
- package/package.json +181 -9
- package/public/docs-mock-api-sw.js +5 -1
- package/public/docs-mock-api-sw.js.map +2 -2
- package/scripts/build-addons.mjs +2 -2
- package/scripts/post-build.mjs +9 -0
- package/src/addons/interactive.ts +5 -0
- package/src/core/components/functional/if/if.ts +54 -7
- package/src/core/components/functional/interactive/action.ts +84 -0
- package/src/core/components/functional/interactive/gamepad.ts +197 -0
- package/src/core/components/functional/interactive/gesture.ts +136 -0
- package/src/core/components/functional/interactive/helpers.spec.ts +50 -0
- package/src/core/components/functional/interactive/helpers.ts +97 -0
- package/src/core/components/functional/interactive/index.ts +25 -0
- package/src/core/components/functional/interactive/interactive.md +33 -0
- package/src/core/components/functional/interactive/keyboard.ts +171 -0
- package/src/core/components/functional/interactive/matrix.ts +185 -0
- package/src/core/components/functional/interactive/registry.ts +46 -0
- package/src/core/components/functional/interactive/store.ts +264 -0
- package/src/core/components/functional/interactive/ticker.ts +171 -0
- package/src/core/components/functional/list/list.ts +0 -0
- package/src/core/components/functional/subscriber/subscriber.ts +0 -0
- package/src/core/components/functional/value/value.ts +44 -4
- package/src/core/components/ui/_css/rounded.ts +36 -0
- package/src/core/components/ui/_css/type.ts +49 -0
- package/src/core/components/ui/_i18n/ui-aria-labels.ts +104 -0
- package/src/core/components/ui/alert/alert.md +128 -72
- package/src/core/components/ui/alert/alert.spec.ts +145 -0
- package/src/core/components/ui/alert/alert.ts +86 -91
- package/src/core/components/ui/alert-messages/alert-messages.ts +1 -1
- package/src/core/components/ui/badge/badge.md +126 -78
- package/src/core/components/ui/badge/badge.ts +29 -81
- package/src/core/components/ui/button/button.md +1 -0
- package/src/core/components/ui/button/button.ts +12 -10
- package/src/core/components/ui/card/card-header.ts +7 -2
- package/src/core/components/ui/card/card.md +120 -65
- package/src/core/components/ui/divider/divider.ts +4 -9
- package/src/core/components/ui/form/checkbox/checkbox.md +1 -1
- package/src/core/components/ui/form/checkbox/checkbox.ts +4 -20
- package/src/core/components/ui/form/fieldset/legend-description.ts +1 -1
- package/src/core/components/ui/form/fieldset/legend.ts +1 -1
- package/src/core/components/ui/form/input/input.md +1 -1
- package/src/core/components/ui/form/input/input.ts +25 -27
- package/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +14 -118
- package/src/core/components/ui/form/input-autocomplete/input-autocomplete.ts +419 -187
- package/src/core/components/ui/form/radio/radio.ts +1 -1
- package/src/core/components/ui/form/select/select.ts +3 -6
- package/src/core/components/ui/form/textarea/textarea.md +1 -1
- package/src/core/components/ui/form/textarea/textarea.ts +1 -2
- package/src/core/components/ui/image/image.md +147 -53
- package/src/core/components/ui/image/image.ts +10 -44
- package/src/core/components/ui/link/link.md +2 -2
- package/src/core/components/ui/link/link.ts +42 -37
- package/src/core/components/ui/modal/modal-close.ts +8 -12
- package/src/core/components/ui/modal/modal.ts +18 -18
- package/src/core/components/ui/pop/pop.md +105 -1
- package/src/core/components/ui/pop/pop.ts +145 -141
- package/src/core/components/ui/table/table.ts +2 -8
- package/src/core/components/ui/theme/theme.ts +1 -1
- package/src/core/components/ui/toast/dismissed.ts +14 -0
- package/src/core/components/ui/toast/render-content.ts +13 -0
- package/src/core/components/ui/toast/toast-item.ts +179 -103
- package/src/core/components/ui/toast/toast.ts +58 -21
- package/src/core/components/ui/toast/types.ts +14 -2
- package/src/core/components/ui/tooltip/tooltip.ts +176 -154
- package/src/core/decorators/subscriber/ancestorAttribute.spec.ts +26 -0
- package/src/core/decorators/subscriber/ancestorAttribute.ts +3 -4
- package/src/core/decorators/subscriber/derive.ts +3 -3
- package/src/core/mixins/Fetcher.ts +1 -1
- package/src/core/mixins/FormCheckable.ts +1 -8
- package/src/core/mixins/FormElement.ts +74 -76
- package/src/core/mixins/Subscriber.ts +0 -0
- package/src/core/utils/AncestorAttributeObserver.ts +183 -70
- package/src/core/utils/DataBindObserver.ts +0 -0
- package/src/core/utils/LocationHandler.ts +12 -5
- package/src/core/utils/Objects.ts +0 -0
- package/src/core/utils/dismissed.ts +22 -0
- package/src/core/utils/positioning.spec.ts +208 -0
- package/src/core/utils/positioning.ts +183 -0
- package/src/directives.ts +1 -3
- package/src/docs/_core-concept/dataFlow.md +1 -1
- package/src/docs/_decorators/ancestor-attribute.md +3 -2
- package/src/docs/_getting-started/concorde-outside.md +3 -3
- package/src/docs/_misc/formelement-subscriber-removal.md +115 -0
- package/src/docs/_misc/html-integration.md +2 -0
- package/src/docs/code.ts +3 -1
- package/src/docs/components/docs-demo-sources.ts +60 -0
- package/src/docs/docs.ts +1 -0
- package/src/docs/example/docs-input-autocomplete-demos.ts +110 -0
- package/src/docs/mock-api/router.ts +17 -1
- package/src/docs/navigation/navigation.ts +4 -0
- package/src/docs/search/docs-search.json +943 -2033
- package/src/docs/tailwind/css/tailwind.css +13 -6
- package/src/tsconfig.json +135 -6
- package/src/tsconfig.tsbuildinfo +1 -1
- package/tailwind.config.js +50 -3
- package/vite/config.js +23 -35
- package/vite.config.mts +5 -0
- package/vitest.setup.ts +49 -13
- package/docs/assets/index-BZiZXMU-.css +0 -1
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Alert
|
|
2
2
|
|
|
3
|
+
Inline message in the page: title (`label`), body (`text` or default slot), icon from `status`. For HTML or actions, use the slot instead of `label` / `text` (plain text only).
|
|
4
|
+
|
|
5
|
+
Use **`status`**: `default`, `info`, `success`, `warning`, `error`.
|
|
6
|
+
|
|
3
7
|
<sonic-code>
|
|
4
8
|
<template>
|
|
5
9
|
<sonic-alert status="error" label="Email error" text="This address is already in use" background></sonic-alert>
|
|
@@ -8,15 +12,52 @@
|
|
|
8
12
|
|
|
9
13
|
## Status
|
|
10
14
|
|
|
15
|
+
Color and icon follow `status`. With no `status`, behavior is `default`.
|
|
16
|
+
|
|
11
17
|
<sonic-code>
|
|
12
18
|
<template>
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
<div class="grid gap-4">
|
|
20
|
+
<sonic-alert label="Default">This address is already in use.</sonic-alert>
|
|
21
|
+
<sonic-alert status="success" label="Success">This address is already in use.</sonic-alert>
|
|
22
|
+
<sonic-alert status="error" label="Error">This address is already in use.</sonic-alert>
|
|
23
|
+
<sonic-alert status="warning" label="Warning">This address is already in use.</sonic-alert>
|
|
24
|
+
<sonic-alert status="info" label="Info">This address is already in use.</sonic-alert>
|
|
25
|
+
</div>
|
|
26
|
+
</template>
|
|
27
|
+
</sonic-code>
|
|
28
|
+
|
|
29
|
+
## Accessibility (`announce`)
|
|
30
|
+
|
|
31
|
+
By default, an alert already in the DOM is **not** announced (no `role` / `aria-live`). Set **`announce`** when the message appears **after** user action (API response, validation, etc.): screen readers get `role="alert"` for `error`, otherwise `role="status"` and `aria-live="polite"`.
|
|
32
|
+
|
|
33
|
+
`sonic-alert-messages` sets `announce` on every rendered alert.
|
|
34
|
+
|
|
35
|
+
<sonic-code>
|
|
36
|
+
<template>
|
|
37
|
+
<sonic-alert announce status="success" label="Saved" text="Your changes were saved."></sonic-alert>
|
|
38
|
+
</template>
|
|
39
|
+
</sonic-code>
|
|
40
|
+
|
|
41
|
+
## Content and icon
|
|
42
|
+
|
|
43
|
+
`label` and `text` accept plain text only. The default slot is rendered after `text`. Use the **`icon`** slot to replace the default `sonic-icon`. **`noIcon`** hides the icon.
|
|
44
|
+
|
|
45
|
+
<sonic-code>
|
|
46
|
+
<template>
|
|
47
|
+
<sonic-alert status="info" noIcon label="No icon" text="Informational message."></sonic-alert>
|
|
48
|
+
</template>
|
|
49
|
+
</sonic-code>
|
|
50
|
+
|
|
51
|
+
## Custom icon slot
|
|
52
|
+
|
|
53
|
+
Project any markup into **`slot="icon"`** (emoji, image, custom component). Keep it decorative with `aria-hidden="true"` when the message text already conveys meaning.
|
|
54
|
+
|
|
55
|
+
<sonic-code>
|
|
56
|
+
<template>
|
|
57
|
+
<sonic-alert status="success" label="Achievement unlocked" background>
|
|
58
|
+
<span slot="icon" aria-hidden="true" class="text-lg leading-none">🎉</span>
|
|
59
|
+
You unlocked a new badge.
|
|
60
|
+
</sonic-alert>
|
|
20
61
|
</template>
|
|
21
62
|
</sonic-code>
|
|
22
63
|
|
|
@@ -24,98 +65,113 @@
|
|
|
24
65
|
|
|
25
66
|
<sonic-code>
|
|
26
67
|
<template>
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
68
|
+
<div class="grid gap-4">
|
|
69
|
+
<sonic-alert status="error" label="Email error" size="2xs">
|
|
70
|
+
This address is already in use. Lorem ipsum dolor sit amet.
|
|
71
|
+
</sonic-alert>
|
|
72
|
+
<sonic-alert status="error" label="Email error" size="xs">
|
|
73
|
+
This address is already in use. Lorem ipsum dolor sit amet.
|
|
74
|
+
</sonic-alert>
|
|
75
|
+
<sonic-alert status="error" label="Email error" size="sm">
|
|
76
|
+
This address is already in use. Lorem ipsum dolor sit amet.
|
|
77
|
+
</sonic-alert>
|
|
78
|
+
<sonic-alert status="error" label="Email error">
|
|
79
|
+
This address is already in use. Lorem ipsum dolor sit amet.
|
|
80
|
+
</sonic-alert>
|
|
81
|
+
<sonic-alert status="error" label="Email error" size="lg">
|
|
82
|
+
This address is already in use. Lorem ipsum dolor sit amet.
|
|
83
|
+
</sonic-alert>
|
|
84
|
+
<sonic-alert status="error" label="Email error" size="xl">
|
|
85
|
+
This address is already in use. Lorem ipsum dolor sit amet.
|
|
86
|
+
</sonic-alert>
|
|
87
|
+
<sonic-alert status="error" label="Email error" size="2xl">
|
|
88
|
+
This address is already in use. Lorem ipsum dolor sit amet.
|
|
89
|
+
</sonic-alert>
|
|
90
|
+
</div>
|
|
50
91
|
</template>
|
|
51
92
|
</sonic-code>
|
|
52
93
|
|
|
53
94
|
## Alert with link
|
|
54
95
|
|
|
96
|
+
Rich content in the slot (buttons, links).
|
|
97
|
+
|
|
55
98
|
<sonic-code>
|
|
56
99
|
<template>
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
100
|
+
<sonic-alert status="info" label="New messages !">
|
|
101
|
+
You have 2 unread messages<br />
|
|
102
|
+
<div class="flex gap-2 mt-1">
|
|
103
|
+
<sonic-button variant="outline" type="info" size="xs">See messages</sonic-button>
|
|
104
|
+
<sonic-button variant="ghost" type="info" size="xs">Dismiss</sonic-button>
|
|
105
|
+
</div>
|
|
106
|
+
</sonic-alert>
|
|
64
107
|
</template>
|
|
65
108
|
</sonic-code>
|
|
66
109
|
|
|
67
110
|
## Background
|
|
68
111
|
|
|
112
|
+
Tinted background from the `status` color (`color-mix` on `currentColor`).
|
|
113
|
+
|
|
69
114
|
<sonic-code>
|
|
70
115
|
<template>
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
</sonic-alert>
|
|
87
|
-
</div>
|
|
116
|
+
<div class="grid gap-4">
|
|
117
|
+
<sonic-alert background label="Lorem ipsum dolor">This address is already in use.</sonic-alert>
|
|
118
|
+
<sonic-alert status="success" background label="Lorem ipsum dolor">
|
|
119
|
+
This address is already in use.
|
|
120
|
+
</sonic-alert>
|
|
121
|
+
<sonic-alert status="error" background label="Lorem ipsum dolor">
|
|
122
|
+
This address is already in use.
|
|
123
|
+
</sonic-alert>
|
|
124
|
+
<sonic-alert status="warning" background label="Lorem ipsum dolor">
|
|
125
|
+
This address is already in use.
|
|
126
|
+
</sonic-alert>
|
|
127
|
+
<sonic-alert status="info" background label="Lorem ipsum dolor">
|
|
128
|
+
This address is already in use.
|
|
129
|
+
</sonic-alert>
|
|
130
|
+
</div>
|
|
88
131
|
</template>
|
|
89
132
|
</sonic-code>
|
|
90
133
|
|
|
91
134
|
## Dismissible
|
|
92
135
|
|
|
136
|
+
`dismissible` removes the alert from the DOM when the close control is clicked (i18n aria label). **`dismissible`** and **`background`** are independent: without `background`, close sits at the end of the row; with `background`, top-right.
|
|
137
|
+
|
|
93
138
|
<sonic-code>
|
|
94
139
|
<template>
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
140
|
+
<sonic-alert status="info" class="mb-3" dismissible label="This address is already in use.">
|
|
141
|
+
</sonic-alert>
|
|
142
|
+
<sonic-alert class="mb-3" dismissible background label="Lorem ipsum dolor">
|
|
143
|
+
This address is already in use.
|
|
144
|
+
</sonic-alert>
|
|
145
|
+
<sonic-alert status="success" class="mb-3" dismissible background label="Lorem ipsum dolor">
|
|
146
|
+
This address is already in use.
|
|
147
|
+
</sonic-alert>
|
|
148
|
+
<sonic-alert status="error" class="mb-3" dismissible background label="Lorem ipsum dolor">
|
|
149
|
+
This address is already in use.
|
|
150
|
+
</sonic-alert>
|
|
151
|
+
<sonic-alert status="warning" class="mb-3" dismissible background label="Lorem ipsum dolor">
|
|
152
|
+
This address is already in use.
|
|
153
|
+
</sonic-alert>
|
|
154
|
+
<sonic-alert status="info" class="mb-3" dismissible background label="Lorem ipsum dolor">
|
|
155
|
+
This address is already in use.
|
|
156
|
+
</sonic-alert>
|
|
110
157
|
</template>
|
|
111
158
|
</sonic-code>
|
|
112
159
|
|
|
113
160
|
## Dismiss forever
|
|
114
161
|
|
|
162
|
+
With **`dismissForever`**, dismissal is stored in `localStorage` (key `sonic-alert-dismissed`). A stable **`id`** on the element is **required**; without `id`, a warning is logged and nothing is persisted.
|
|
163
|
+
|
|
115
164
|
<sonic-code>
|
|
116
165
|
<template>
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
166
|
+
<sonic-alert
|
|
167
|
+
class="mb-3"
|
|
168
|
+
dismissible
|
|
169
|
+
background
|
|
170
|
+
dismissForever
|
|
171
|
+
label="Lorem ipsum dolor"
|
|
172
|
+
id="addressUniqueId"
|
|
173
|
+
>
|
|
174
|
+
This address is already in use.
|
|
175
|
+
</sonic-alert>
|
|
120
176
|
</template>
|
|
121
177
|
</sonic-code>
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { expect, vi } from "vitest";
|
|
2
|
+
import TestUtils from "@supersoniks/concorde/test-utils/TestUtils";
|
|
3
|
+
import "./alert";
|
|
4
|
+
import { Alert } from "./alert";
|
|
5
|
+
|
|
6
|
+
async function create(attributes: string) {
|
|
7
|
+
const element = TestUtils.bootstrap(
|
|
8
|
+
`<sonic-alert ${attributes}></sonic-alert>`
|
|
9
|
+
)[0] as Alert;
|
|
10
|
+
await element.updateComplete;
|
|
11
|
+
return element;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
describe("SonicAlert", () => {
|
|
15
|
+
it("utilise status=default par défaut", async () => {
|
|
16
|
+
const elt = await create("");
|
|
17
|
+
expect(elt.getAttribute("status")).toBe("default");
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("conserve status=error", async () => {
|
|
21
|
+
const elt = await create('status="error"');
|
|
22
|
+
expect(elt.status).toBe("error");
|
|
23
|
+
expect(elt.getAttribute("status")).toBe("error");
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it.each(["warning", "success", "info"])(
|
|
27
|
+
"accepte status=%s",
|
|
28
|
+
async (value) => {
|
|
29
|
+
const elt = await create(`status="${value}"`);
|
|
30
|
+
expect(elt.getAttribute("status")).toBe(value);
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
it("n'expose pas role ni aria-live sans announce", async () => {
|
|
35
|
+
const elt = await create('status="error"');
|
|
36
|
+
expect(elt.hasAttribute("role")).toBe(false);
|
|
37
|
+
expect(elt.hasAttribute("aria-live")).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("avec announce, role=alert pour error sans aria-live explicite", async () => {
|
|
41
|
+
const error = await create('announce status="error"');
|
|
42
|
+
expect(error.getAttribute("role")).toBe("alert");
|
|
43
|
+
expect(error.hasAttribute("aria-live")).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("avec announce, role=status et aria-live=polite pour les autres status", async () => {
|
|
47
|
+
const info = await create('announce status="info"');
|
|
48
|
+
expect(info.getAttribute("role")).toBe("status");
|
|
49
|
+
expect(info.getAttribute("aria-live")).toBe("polite");
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("retire role et aria-live quand announce repasse à false", async () => {
|
|
53
|
+
const elt = await create("announce status=info");
|
|
54
|
+
expect(elt.getAttribute("role")).toBe("status");
|
|
55
|
+
elt.announce = false;
|
|
56
|
+
await elt.updateComplete;
|
|
57
|
+
expect(elt.hasAttribute("role")).toBe(false);
|
|
58
|
+
expect(elt.hasAttribute("aria-live")).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("affiche un bouton de fermeture uniquement si dismissible", async () => {
|
|
62
|
+
const dismissible = await create("dismissible");
|
|
63
|
+
expect(dismissible.shadowRoot?.querySelector(".close-btn")).not.toBeNull();
|
|
64
|
+
const plain = await create("");
|
|
65
|
+
expect(plain.shadowRoot?.querySelector(".close-btn")).toBeNull();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("retire l'alerte au clic sur le bouton dismissible", async () => {
|
|
69
|
+
const container = document.createElement("div");
|
|
70
|
+
document.body.appendChild(container);
|
|
71
|
+
container.innerHTML = '<sonic-alert dismissible text="msg"></sonic-alert>';
|
|
72
|
+
const elt = container.querySelector("sonic-alert") as Alert;
|
|
73
|
+
await elt.updateComplete;
|
|
74
|
+
const closeBtn = elt.shadowRoot?.querySelector(
|
|
75
|
+
".close-btn"
|
|
76
|
+
) as HTMLElement | null;
|
|
77
|
+
expect(closeBtn).not.toBeNull();
|
|
78
|
+
closeBtn!.click();
|
|
79
|
+
expect(container.querySelector("sonic-alert")).toBeNull();
|
|
80
|
+
container.remove();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("masque l'icône décorative aux lecteurs d'écran", async () => {
|
|
84
|
+
const elt = await create('status="info"');
|
|
85
|
+
expect(
|
|
86
|
+
elt.shadowRoot?.querySelector("sonic-icon")?.getAttribute("aria-hidden")
|
|
87
|
+
).toBe("true");
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("n'affiche pas l'icône si noIcon", async () => {
|
|
91
|
+
const elt = await create("noIcon");
|
|
92
|
+
expect(elt.shadowRoot?.querySelector("sonic-icon")).toBeNull();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("traduit le libellé de fermeture selon la langue du document", async () => {
|
|
96
|
+
const previous = document.documentElement.lang;
|
|
97
|
+
document.documentElement.lang = "fr";
|
|
98
|
+
const fr = await create("dismissible");
|
|
99
|
+
expect(
|
|
100
|
+
(fr.shadowRoot?.querySelector(".close-btn") as HTMLElement & {
|
|
101
|
+
ariaLabel?: string;
|
|
102
|
+
})?.ariaLabel
|
|
103
|
+
).toBe("Fermer");
|
|
104
|
+
document.documentElement.lang = "it";
|
|
105
|
+
const it = await create("dismissible");
|
|
106
|
+
expect(
|
|
107
|
+
(it.shadowRoot?.querySelector(".close-btn") as HTMLElement & {
|
|
108
|
+
ariaLabel?: string;
|
|
109
|
+
})?.ariaLabel
|
|
110
|
+
).toBe("Chiudi");
|
|
111
|
+
document.documentElement.lang = previous;
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("n'interprète pas le HTML du label", async () => {
|
|
115
|
+
const elt = await create('label="<b>x</b>"');
|
|
116
|
+
expect(elt.shadowRoot?.querySelector(".label b")).toBeNull();
|
|
117
|
+
expect(elt.shadowRoot?.querySelector(".label")?.textContent).toBe(
|
|
118
|
+
"<b>x</b>"
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("mémorise la fermeture avec dismissForever et un id", async () => {
|
|
123
|
+
localStorage.clear();
|
|
124
|
+
const elt = await create('dismissForever id="my-alert"');
|
|
125
|
+
elt.close();
|
|
126
|
+
expect(JSON.parse(localStorage.getItem("sonic-alert-dismissed")!)).toEqual(
|
|
127
|
+
{ "my-alert": true }
|
|
128
|
+
);
|
|
129
|
+
const children = TestUtils.bootstrap(
|
|
130
|
+
'<sonic-alert dismissForever id="my-alert"></sonic-alert>'
|
|
131
|
+
);
|
|
132
|
+
expect(children.length).toBe(0);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it("ne mémorise rien avec dismissForever sans id", async () => {
|
|
136
|
+
localStorage.clear();
|
|
137
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
138
|
+
const elt = await create("dismissForever");
|
|
139
|
+
elt.close();
|
|
140
|
+
expect(localStorage.getItem("sonic-alert-dismissed")).toBeNull();
|
|
141
|
+
expect(warn).toHaveBeenCalled();
|
|
142
|
+
warn.mockRestore();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
});
|
|
@@ -1,20 +1,28 @@
|
|
|
1
|
-
import { html, LitElement, css, nothing } from "lit";
|
|
1
|
+
import { html, LitElement, css, nothing, PropertyValues } from "lit";
|
|
2
2
|
import { customElement, property } from "lit/decorators.js";
|
|
3
3
|
import {
|
|
4
4
|
fontSize,
|
|
5
5
|
Size,
|
|
6
6
|
} from "@supersoniks/concorde/core/components/ui/_css/size";
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
7
|
+
import {
|
|
8
|
+
StatusIconKey,
|
|
9
|
+
statusAriaLive,
|
|
10
|
+
statusAriaRole,
|
|
11
|
+
statusColor,
|
|
12
|
+
statusIcon,
|
|
13
|
+
} from "@supersoniks/concorde/core/components/ui/_css/type";
|
|
14
|
+
import {
|
|
15
|
+
isDismissed,
|
|
16
|
+
markDismissed,
|
|
17
|
+
} from "@supersoniks/concorde/core/utils/dismissed";
|
|
18
|
+
import {
|
|
19
|
+
resolveUiLabel,
|
|
20
|
+
uiAriaLabels,
|
|
21
|
+
} from "@supersoniks/concorde/core/components/ui/_i18n/ui-aria-labels";
|
|
22
|
+
|
|
23
|
+
export type AlertStatus = StatusIconKey;
|
|
17
24
|
const tagName = "sonic-alert";
|
|
25
|
+
const dismissStorageKey = "sonic-alert-dismissed";
|
|
18
26
|
|
|
19
27
|
/**
|
|
20
28
|
* Affiche un message en ligne.
|
|
@@ -24,66 +32,29 @@ const tagName = "sonic-alert";
|
|
|
24
32
|
export class Alert extends LitElement {
|
|
25
33
|
static styles = [
|
|
26
34
|
fontSize,
|
|
35
|
+
statusColor,
|
|
27
36
|
css`
|
|
28
37
|
:host {
|
|
29
|
-
--
|
|
30
|
-
--sc_rounded: var(--sc-rounded);
|
|
31
|
-
--sc_fw: var(--sc-font-weight-base, 400);
|
|
32
|
-
--sc_fst: var(--sc-font-style-base, normal);
|
|
33
|
-
--sc_label-fw: bold;
|
|
34
|
-
|
|
35
|
-
font-weight: var(--sc_fw);
|
|
36
|
-
font-style: var(--sc_fst);
|
|
37
|
-
color: var(--sc_color);
|
|
38
|
+
--sc-_rounded: var(--sc-rounded);
|
|
38
39
|
position: relative;
|
|
39
40
|
display: flex;
|
|
40
41
|
gap: 0.4em;
|
|
41
|
-
border-radius: var(--
|
|
42
|
+
border-radius: var(--sc-_rounded);
|
|
42
43
|
}
|
|
43
44
|
|
|
44
45
|
.label {
|
|
45
|
-
font-weight:
|
|
46
|
+
font-weight: bold;
|
|
46
47
|
margin-bottom: 0.15em;
|
|
47
48
|
display: block;
|
|
48
49
|
}
|
|
49
50
|
|
|
50
|
-
:host([status="warning"]) {
|
|
51
|
-
--sc_color: var(--sc-warning, var(--sc-base-content, #000));
|
|
52
|
-
}
|
|
53
|
-
:host([status="error"]) {
|
|
54
|
-
--sc_color: var(--sc-danger, var(--sc-base-content, #000));
|
|
55
|
-
}
|
|
56
|
-
:host([status="info"]) {
|
|
57
|
-
--sc_color: var(--sc-info, var(--sc-base-content, #000));
|
|
58
|
-
}
|
|
59
|
-
:host([status="success"]) {
|
|
60
|
-
--sc_color: var(--sc-success, var(--sc-base-content, #000));
|
|
61
|
-
}
|
|
62
|
-
|
|
63
51
|
/*background*/
|
|
64
|
-
:host([dismissible]),
|
|
65
52
|
:host([background]) {
|
|
66
|
-
background: var(--sc-base, #fff);
|
|
67
|
-
padding: 0.8em
|
|
68
|
-
}
|
|
69
|
-
:host([dismissible]):before,
|
|
70
|
-
:host([background]):before {
|
|
71
|
-
background-color: currentColor;
|
|
72
|
-
content: "";
|
|
73
|
-
display: block;
|
|
74
|
-
position: absolute;
|
|
75
|
-
left: 0;
|
|
76
|
-
top: 0;
|
|
77
|
-
right: 0;
|
|
78
|
-
bottom: 0;
|
|
79
|
-
opacity: 0.08;
|
|
80
|
-
border-radius: var(--sc_rounded);
|
|
81
|
-
pointer-events: none;
|
|
53
|
+
background: color-mix(in srgb, currentColor 8%, var(--sc-base, #fff));
|
|
54
|
+
padding: 0.8em;
|
|
82
55
|
}
|
|
83
56
|
|
|
84
57
|
.content {
|
|
85
|
-
z-index: 2;
|
|
86
|
-
position: relative;
|
|
87
58
|
flex: 1;
|
|
88
59
|
}
|
|
89
60
|
|
|
@@ -91,30 +62,34 @@ export class Alert extends LitElement {
|
|
|
91
62
|
display: block;
|
|
92
63
|
}
|
|
93
64
|
|
|
94
|
-
.hidden {
|
|
95
|
-
display: none !important;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
65
|
/*Rounded*/
|
|
99
66
|
:host([size="2xs"]),
|
|
100
67
|
:host([size="xs"]),
|
|
101
68
|
:host([size="sm"]) {
|
|
102
|
-
--
|
|
69
|
+
--sc-_rounded: var(--sc-rounded-sm);
|
|
103
70
|
}
|
|
104
71
|
|
|
105
72
|
/*Dismissible*/
|
|
106
|
-
|
|
73
|
+
.close-btn {
|
|
74
|
+
flex-shrink: 0;
|
|
75
|
+
align-self: flex-start;
|
|
76
|
+
border-left: var(--sc-border-width, 1px) solid currentColor;
|
|
77
|
+
padding-left: 0.5em;
|
|
78
|
+
margin-left: 0.5em;
|
|
79
|
+
}
|
|
80
|
+
:host([dismissible][background]) {
|
|
107
81
|
padding-right: 3rem;
|
|
108
82
|
}
|
|
109
|
-
:host([dismissible]) .close-btn {
|
|
83
|
+
:host([dismissible][background]) .close-btn {
|
|
110
84
|
position: absolute;
|
|
111
85
|
top: 0.4rem;
|
|
112
86
|
right: 0.3rem;
|
|
87
|
+
border-left: none;
|
|
113
88
|
}
|
|
114
89
|
`,
|
|
115
90
|
];
|
|
116
91
|
/**
|
|
117
|
-
* Titre du message
|
|
92
|
+
* Titre du message (texte brut, utiliser le slot pour du contenu riche)
|
|
118
93
|
*/
|
|
119
94
|
@property({ type: String }) label = "";
|
|
120
95
|
|
|
@@ -125,8 +100,6 @@ export class Alert extends LitElement {
|
|
|
125
100
|
*/
|
|
126
101
|
@property({ type: String }) text = "";
|
|
127
102
|
|
|
128
|
-
@property({ type: String }) id = new Date().getTime().toString();
|
|
129
|
-
|
|
130
103
|
@property({ type: String, reflect: true }) size?: Size;
|
|
131
104
|
|
|
132
105
|
@property({ type: Boolean, reflect: true }) dismissible = false;
|
|
@@ -135,33 +108,58 @@ export class Alert extends LitElement {
|
|
|
135
108
|
|
|
136
109
|
@property({ type: String, reflect: true }) status: AlertStatus = "default";
|
|
137
110
|
|
|
111
|
+
/**
|
|
112
|
+
* Mémorise la fermeture dans le localStorage. Nécessite un `id`.
|
|
113
|
+
*/
|
|
138
114
|
@property({ type: Boolean, reflect: true }) dismissForever = false;
|
|
139
115
|
|
|
116
|
+
/**
|
|
117
|
+
* Annonce le message aux lecteurs d'écran (role alert/status).
|
|
118
|
+
* À activer pour les messages injectés dynamiquement, pas pour une alerte déjà dans la page.
|
|
119
|
+
*/
|
|
120
|
+
@property({ type: Boolean, reflect: true }) announce = false;
|
|
121
|
+
|
|
140
122
|
connectedCallback() {
|
|
141
|
-
if (this.dismissForever) {
|
|
142
|
-
const dismissed = localStorage.getItem("sonic-alert-dismissed") || "{}";
|
|
143
|
-
const dismissedObj = JSON.parse(dismissed);
|
|
144
|
-
if (dismissedObj[this.id]) {
|
|
145
|
-
this.remove();
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
123
|
super.connectedCallback();
|
|
124
|
+
if (
|
|
125
|
+
this.dismissForever &&
|
|
126
|
+
this.id &&
|
|
127
|
+
isDismissed(dismissStorageKey, this.id)
|
|
128
|
+
) {
|
|
129
|
+
this.remove();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
willUpdate(changed: PropertyValues<this>) {
|
|
134
|
+
if (changed.has("announce") || changed.has("status")) {
|
|
135
|
+
this._syncAnnounceA11y();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private _syncAnnounceA11y() {
|
|
140
|
+
if (!this.announce) {
|
|
141
|
+
this.removeAttribute("role");
|
|
142
|
+
this.removeAttribute("aria-live");
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
this.setAttribute("role", statusAriaRole(this.status));
|
|
146
|
+
const live = statusAriaLive(this.status);
|
|
147
|
+
if (live) this.setAttribute("aria-live", live);
|
|
148
|
+
else this.removeAttribute("aria-live");
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
render() {
|
|
152
152
|
return html`
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
153
|
+
${this.noIcon
|
|
154
|
+
? nothing
|
|
155
|
+
: html`<slot name="icon">
|
|
156
|
+
<sonic-icon
|
|
157
|
+
aria-hidden="true"
|
|
158
|
+
name=${statusIcon[this.status] ?? statusIcon.default}
|
|
159
|
+
></sonic-icon>
|
|
160
|
+
</slot>`}
|
|
161
161
|
<div class="content">
|
|
162
|
-
${this.label
|
|
163
|
-
? html`<span class="label">${unsafeHTML(this.label)}</span>`
|
|
164
|
-
: nothing}
|
|
162
|
+
${this.label ? html`<span class="label">${this.label}</span>` : nothing}
|
|
165
163
|
<div>${this.text}<slot></slot></div>
|
|
166
164
|
</div>
|
|
167
165
|
${this.dismissible
|
|
@@ -171,6 +169,7 @@ export class Alert extends LitElement {
|
|
|
171
169
|
variant="unstyled"
|
|
172
170
|
shape="circle"
|
|
173
171
|
icon
|
|
172
|
+
.ariaLabel=${resolveUiLabel(uiAriaLabels.closeAlert)}
|
|
174
173
|
>
|
|
175
174
|
<sonic-icon name="cancel"></sonic-icon>
|
|
176
175
|
</sonic-button>`
|
|
@@ -180,15 +179,11 @@ export class Alert extends LitElement {
|
|
|
180
179
|
|
|
181
180
|
close() {
|
|
182
181
|
this.remove();
|
|
183
|
-
|
|
184
|
-
if (this.
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
dismissedObj[this.id] = true;
|
|
188
|
-
localStorage.setItem(
|
|
189
|
-
"sonic-alert-dismissed",
|
|
190
|
-
JSON.stringify(dismissedObj)
|
|
191
|
-
);
|
|
182
|
+
if (!this.dismissForever) return;
|
|
183
|
+
if (!this.id) {
|
|
184
|
+
console.warn("sonic-alert : dismissForever nécessite un id.");
|
|
185
|
+
return;
|
|
192
186
|
}
|
|
187
|
+
markDismissed(dismissStorageKey, this.id);
|
|
193
188
|
}
|
|
194
189
|
}
|