@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
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
function readDismissed(storageKey: string): Record<string, boolean> {
|
|
2
|
+
try {
|
|
3
|
+
const parsed = JSON.parse(localStorage.getItem(storageKey) || "{}");
|
|
4
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
5
|
+
} catch {
|
|
6
|
+
return {};
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function isDismissed(storageKey: string, id: string | number): boolean {
|
|
11
|
+
return !!readDismissed(storageKey)[id];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function markDismissed(storageKey: string, id: string | number): void {
|
|
15
|
+
const dismissed = readDismissed(storageKey);
|
|
16
|
+
dismissed[id] = true;
|
|
17
|
+
try {
|
|
18
|
+
localStorage.setItem(storageKey, JSON.stringify(dismissed));
|
|
19
|
+
} catch {
|
|
20
|
+
// stockage indisponible (mode privé, quota)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
computeFloatingPosition,
|
|
4
|
+
FloatingBounds,
|
|
5
|
+
FloatingSide,
|
|
6
|
+
parsePlacement,
|
|
7
|
+
} from "./positioning";
|
|
8
|
+
|
|
9
|
+
type Rect = {
|
|
10
|
+
left: number;
|
|
11
|
+
top: number;
|
|
12
|
+
right: number;
|
|
13
|
+
bottom: number;
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
};
|
|
17
|
+
type Size = { width: number; height: number };
|
|
18
|
+
|
|
19
|
+
const rect = (left: number, top: number, width: number, height: number) => ({
|
|
20
|
+
left,
|
|
21
|
+
top,
|
|
22
|
+
width,
|
|
23
|
+
height,
|
|
24
|
+
right: left + width,
|
|
25
|
+
bottom: top + height,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Ancien Pop.computePosition, étape par étape, sur un contenu simulé dont
|
|
30
|
+
* chaque déplacement appliqué se retrouve tel quel dans la mesure suivante.
|
|
31
|
+
*/
|
|
32
|
+
function legacyPopPosition(
|
|
33
|
+
thisRect: Rect,
|
|
34
|
+
size: Size,
|
|
35
|
+
placement: string,
|
|
36
|
+
{ minX, minY, maxX, maxY }: FloatingBounds,
|
|
37
|
+
) {
|
|
38
|
+
const [placementBase, placementSec] = placement.split(" ");
|
|
39
|
+
const x0 = thisRect.left;
|
|
40
|
+
const y0 = thisRect.top;
|
|
41
|
+
let x = x0,
|
|
42
|
+
y = y0;
|
|
43
|
+
const yTop = y0 - size.height;
|
|
44
|
+
const xLeft = x0 - size.width;
|
|
45
|
+
const xRight = x0 + thisRect.width;
|
|
46
|
+
const yBottom = y0 + thisRect.height;
|
|
47
|
+
const xCenter = x0 + (thisRect.width - size.width) * 0.5;
|
|
48
|
+
const yCenter = y0 + (thisRect.height - size.height) * 0.5;
|
|
49
|
+
switch (placementBase) {
|
|
50
|
+
case "bottom":
|
|
51
|
+
y = yBottom;
|
|
52
|
+
if (placementSec == "center") x = xCenter;
|
|
53
|
+
break;
|
|
54
|
+
case "top":
|
|
55
|
+
y = yTop;
|
|
56
|
+
if (placementSec == "center") x = xCenter;
|
|
57
|
+
break;
|
|
58
|
+
case "left":
|
|
59
|
+
x = xLeft;
|
|
60
|
+
if (placementSec == "center") y = yCenter;
|
|
61
|
+
break;
|
|
62
|
+
case "right":
|
|
63
|
+
x = xRight;
|
|
64
|
+
if (placementSec == "center") y = yCenter;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let contentX = x;
|
|
69
|
+
let contentY = y;
|
|
70
|
+
if (contentX < minX && placementBase == "left") x = xRight;
|
|
71
|
+
if (contentY < minY && placementBase == "top") y = yBottom;
|
|
72
|
+
if (contentX + size.width > maxX && placementBase == "right") x = xLeft;
|
|
73
|
+
if (contentY + size.height > maxY && placementBase == "bottom") y = yTop;
|
|
74
|
+
|
|
75
|
+
contentX = x;
|
|
76
|
+
contentY = y;
|
|
77
|
+
if (contentX < minX) contentX = minX;
|
|
78
|
+
if (contentY < minY) contentY = minY;
|
|
79
|
+
if (contentX + size.width > maxX) contentX = maxX - size.width;
|
|
80
|
+
if (contentY + size.height > maxY) contentY = maxY - size.height;
|
|
81
|
+
|
|
82
|
+
return { x: contentX, y: contentY };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function popPosition(
|
|
86
|
+
anchor: Rect,
|
|
87
|
+
floating: Size,
|
|
88
|
+
placement: string,
|
|
89
|
+
bounds: FloatingBounds,
|
|
90
|
+
) {
|
|
91
|
+
const [side, secondary] = placement.split(" ");
|
|
92
|
+
const { x, y } = computeFloatingPosition({
|
|
93
|
+
anchor,
|
|
94
|
+
floating,
|
|
95
|
+
side: side as FloatingSide,
|
|
96
|
+
align: secondary == "center" ? "center" : "start",
|
|
97
|
+
bounds,
|
|
98
|
+
});
|
|
99
|
+
return { x, y };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const bounds: FloatingBounds = { minX: 5, minY: 5, maxX: 795, maxY: 595 };
|
|
103
|
+
|
|
104
|
+
describe("computeFloatingPosition", () => {
|
|
105
|
+
describe("reproduit l'ancien positionnement de sonic-pop", () => {
|
|
106
|
+
const placements = [
|
|
107
|
+
"bottom",
|
|
108
|
+
"top",
|
|
109
|
+
"right",
|
|
110
|
+
"left",
|
|
111
|
+
"bottom center",
|
|
112
|
+
"top center",
|
|
113
|
+
"right center",
|
|
114
|
+
"left center",
|
|
115
|
+
"unknown",
|
|
116
|
+
];
|
|
117
|
+
const anchors = {
|
|
118
|
+
"au centre": rect(380, 280, 40, 30),
|
|
119
|
+
"coin haut gauche": rect(0, 0, 40, 30),
|
|
120
|
+
"coin bas droit": rect(760, 570, 40, 30),
|
|
121
|
+
"bord gauche": rect(2, 300, 40, 30),
|
|
122
|
+
"bord droit": rect(780, 300, 40, 30),
|
|
123
|
+
"bord haut": rect(400, 2, 40, 30),
|
|
124
|
+
"bord bas": rect(400, 590, 40, 30),
|
|
125
|
+
};
|
|
126
|
+
const sizes = {
|
|
127
|
+
petit: { width: 120, height: 80 },
|
|
128
|
+
"plus grand que la zone": { width: 900, height: 700 },
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
for (const placement of placements) {
|
|
132
|
+
for (const [anchorName, anchor] of Object.entries(anchors)) {
|
|
133
|
+
for (const [sizeName, size] of Object.entries(sizes)) {
|
|
134
|
+
it(`${placement} / ${anchorName} / contenu ${sizeName}`, () => {
|
|
135
|
+
expect(popPosition(anchor, size, placement, bounds)).toEqual(
|
|
136
|
+
legacyPopPosition(anchor, size, placement, bounds),
|
|
137
|
+
);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
describe("placements du tooltip", () => {
|
|
145
|
+
const anchor = rect(380, 280, 40, 30);
|
|
146
|
+
const floating = { width: 100, height: 20 };
|
|
147
|
+
const place = (side: FloatingSide, align?: "start" | "center" | "end") =>
|
|
148
|
+
computeFloatingPosition({
|
|
149
|
+
anchor,
|
|
150
|
+
floating,
|
|
151
|
+
side,
|
|
152
|
+
align,
|
|
153
|
+
gap: 4,
|
|
154
|
+
bounds,
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it("centre par défaut", () => {
|
|
158
|
+
expect(place("top")).toEqual({ side: "top", x: 350, y: 256 });
|
|
159
|
+
expect(place("right")).toEqual({ side: "right", x: 424, y: 285 });
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("aligne start / end", () => {
|
|
163
|
+
expect(place("bottom", "start")).toMatchObject({ x: 380, y: 314 });
|
|
164
|
+
expect(place("bottom", "end")).toMatchObject({ x: 320, y: 314 });
|
|
165
|
+
expect(place("left", "end")).toMatchObject({ x: 276, y: 290 });
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it("bascule sur le côté opposé quand il déborde", () => {
|
|
169
|
+
const nearTop = rect(380, 10, 40, 30);
|
|
170
|
+
expect(
|
|
171
|
+
computeFloatingPosition({
|
|
172
|
+
anchor: nearTop,
|
|
173
|
+
floating,
|
|
174
|
+
side: "top",
|
|
175
|
+
gap: 4,
|
|
176
|
+
bounds,
|
|
177
|
+
}),
|
|
178
|
+
).toEqual({ side: "bottom", x: 350, y: 44 });
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
describe("parsePlacement", () => {
|
|
184
|
+
it("lit côté et alignement", () => {
|
|
185
|
+
expect(parsePlacement("left-end", "bottom", "start")).toEqual({
|
|
186
|
+
side: "left",
|
|
187
|
+
align: "end",
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it("applique l'alignement par défaut quand il est absent", () => {
|
|
192
|
+
expect(parsePlacement("top", "bottom", "start")).toEqual({
|
|
193
|
+
side: "top",
|
|
194
|
+
align: "start",
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it("retombe sur les défauts pour une valeur inconnue", () => {
|
|
199
|
+
expect(parsePlacement("foo-bar", "top", "center")).toEqual({
|
|
200
|
+
side: "top",
|
|
201
|
+
align: "center",
|
|
202
|
+
});
|
|
203
|
+
expect(parsePlacement(undefined, "top", "center")).toEqual({
|
|
204
|
+
side: "top",
|
|
205
|
+
align: "center",
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
});
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import HTML, { SearchableDomElement } from "./HTML";
|
|
2
|
+
|
|
3
|
+
export type FloatingSide = "top" | "right" | "bottom" | "left";
|
|
4
|
+
export type FloatingAlign = "start" | "center" | "end";
|
|
5
|
+
export type FloatingPlacement =
|
|
6
|
+
| FloatingSide
|
|
7
|
+
| `${FloatingSide}-${FloatingAlign}`;
|
|
8
|
+
|
|
9
|
+
const SIDES: readonly string[] = ["top", "right", "bottom", "left"];
|
|
10
|
+
const ALIGNS: readonly string[] = ["start", "center", "end"];
|
|
11
|
+
|
|
12
|
+
/** Découpe `"côté-alignement"` ; une valeur inconnue retombe sur le défaut. */
|
|
13
|
+
export function parsePlacement(
|
|
14
|
+
placement: string | undefined,
|
|
15
|
+
defaultSide: FloatingSide,
|
|
16
|
+
defaultAlign: FloatingAlign,
|
|
17
|
+
): { side: FloatingSide; align: FloatingAlign } {
|
|
18
|
+
const [side, align] = (placement ?? "").split("-");
|
|
19
|
+
return {
|
|
20
|
+
side: SIDES.includes(side) ? (side as FloatingSide) : defaultSide,
|
|
21
|
+
align: ALIGNS.includes(align) ? (align as FloatingAlign) : defaultAlign,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type FloatingBounds = {
|
|
26
|
+
minX: number;
|
|
27
|
+
minY: number;
|
|
28
|
+
maxX: number;
|
|
29
|
+
maxY: number;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type Rect = Pick<DOMRect, "left" | "top" | "right" | "bottom" | "width" | "height">;
|
|
33
|
+
type Size = Pick<DOMRect, "width" | "height">;
|
|
34
|
+
|
|
35
|
+
export const supportsPopover = "popover" in HTMLElement.prototype;
|
|
36
|
+
|
|
37
|
+
const OPPOSITE_SIDE: Record<FloatingSide, FloatingSide> = {
|
|
38
|
+
top: "bottom",
|
|
39
|
+
bottom: "top",
|
|
40
|
+
left: "right",
|
|
41
|
+
right: "left",
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Zone dans laquelle un élément flottant doit rester visible :
|
|
46
|
+
* le viewport, restreint par le premier ancêtre qui scrolle ou clippe `node`.
|
|
47
|
+
*/
|
|
48
|
+
export function getFloatingBounds(
|
|
49
|
+
node: SearchableDomElement,
|
|
50
|
+
padding = 0,
|
|
51
|
+
): FloatingBounds {
|
|
52
|
+
const clipRect = (
|
|
53
|
+
HTML.getScrollableAncestor(node) as HTMLElement | null
|
|
54
|
+
)?.getBoundingClientRect();
|
|
55
|
+
|
|
56
|
+
// `||` et non `??` : un bord à 0 (ancêtre non rendu) retombe sur le viewport, comme historiquement dans sonic-pop.
|
|
57
|
+
return {
|
|
58
|
+
minX: Math.max(0, clipRect?.left || 0) + padding,
|
|
59
|
+
minY: Math.max(0, clipRect?.top || 0) + padding,
|
|
60
|
+
maxX:
|
|
61
|
+
Math.min(window.innerWidth, clipRect?.right || window.innerWidth) -
|
|
62
|
+
padding,
|
|
63
|
+
maxY:
|
|
64
|
+
Math.min(window.innerHeight, clipRect?.bottom || window.innerHeight) -
|
|
65
|
+
padding,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function alignOnAxis(
|
|
70
|
+
start: number,
|
|
71
|
+
length: number,
|
|
72
|
+
floatingLength: number,
|
|
73
|
+
align: FloatingAlign,
|
|
74
|
+
) {
|
|
75
|
+
if (align === "start") return start;
|
|
76
|
+
if (align === "end") return start + length - floatingLength;
|
|
77
|
+
return start + (length - floatingLength) / 2;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function placeOnSide(
|
|
81
|
+
anchor: Rect,
|
|
82
|
+
floating: Size,
|
|
83
|
+
side: FloatingSide,
|
|
84
|
+
align: FloatingAlign,
|
|
85
|
+
gap: number,
|
|
86
|
+
) {
|
|
87
|
+
switch (side) {
|
|
88
|
+
case "top":
|
|
89
|
+
return {
|
|
90
|
+
x: alignOnAxis(anchor.left, anchor.width, floating.width, align),
|
|
91
|
+
y: anchor.top - floating.height - gap,
|
|
92
|
+
};
|
|
93
|
+
case "bottom":
|
|
94
|
+
return {
|
|
95
|
+
x: alignOnAxis(anchor.left, anchor.width, floating.width, align),
|
|
96
|
+
y: anchor.bottom + gap,
|
|
97
|
+
};
|
|
98
|
+
case "left":
|
|
99
|
+
return {
|
|
100
|
+
x: anchor.left - floating.width - gap,
|
|
101
|
+
y: alignOnAxis(anchor.top, anchor.height, floating.height, align),
|
|
102
|
+
};
|
|
103
|
+
case "right":
|
|
104
|
+
return {
|
|
105
|
+
x: anchor.right + gap,
|
|
106
|
+
y: alignOnAxis(anchor.top, anchor.height, floating.height, align),
|
|
107
|
+
};
|
|
108
|
+
default:
|
|
109
|
+
return { x: anchor.left, y: anchor.top };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function overflowsSide(
|
|
114
|
+
position: { x: number; y: number },
|
|
115
|
+
floating: Size,
|
|
116
|
+
side: FloatingSide,
|
|
117
|
+
bounds: FloatingBounds,
|
|
118
|
+
) {
|
|
119
|
+
switch (side) {
|
|
120
|
+
case "top":
|
|
121
|
+
return position.y < bounds.minY;
|
|
122
|
+
case "bottom":
|
|
123
|
+
return position.y + floating.height > bounds.maxY;
|
|
124
|
+
case "left":
|
|
125
|
+
return position.x < bounds.minX;
|
|
126
|
+
case "right":
|
|
127
|
+
return position.x + floating.width > bounds.maxX;
|
|
128
|
+
default:
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Position (coordonnées viewport) d'un élément flottant accolé à `anchor` :
|
|
135
|
+
* bascule sur le côté opposé s'il déborde, puis le contraint dans `bounds`.
|
|
136
|
+
* S'il est plus grand que `bounds`, c'est le bord bas / droit qui l'emporte.
|
|
137
|
+
*/
|
|
138
|
+
export function computeFloatingPosition({
|
|
139
|
+
anchor,
|
|
140
|
+
floating,
|
|
141
|
+
side,
|
|
142
|
+
align = "center",
|
|
143
|
+
gap = 0,
|
|
144
|
+
bounds,
|
|
145
|
+
}: {
|
|
146
|
+
anchor: Rect;
|
|
147
|
+
floating: Size;
|
|
148
|
+
side: FloatingSide;
|
|
149
|
+
align?: FloatingAlign;
|
|
150
|
+
gap?: number;
|
|
151
|
+
bounds: FloatingBounds;
|
|
152
|
+
}) {
|
|
153
|
+
let placedSide = side;
|
|
154
|
+
let position = placeOnSide(anchor, floating, placedSide, align, gap);
|
|
155
|
+
|
|
156
|
+
if (overflowsSide(position, floating, placedSide, bounds)) {
|
|
157
|
+
placedSide = OPPOSITE_SIDE[placedSide];
|
|
158
|
+
position = placeOnSide(anchor, floating, placedSide, align, gap);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
side: placedSide,
|
|
163
|
+
x: Math.min(
|
|
164
|
+
Math.max(position.x, bounds.minX),
|
|
165
|
+
bounds.maxX - floating.width,
|
|
166
|
+
),
|
|
167
|
+
y: Math.min(
|
|
168
|
+
Math.max(position.y, bounds.minY),
|
|
169
|
+
bounds.maxY - floating.height,
|
|
170
|
+
),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Appelle `callback` à chaque frame ; renvoie la fonction d'arrêt. */
|
|
175
|
+
export function startFrameLoop(callback: () => void) {
|
|
176
|
+
let frame = 0;
|
|
177
|
+
const tick = () => {
|
|
178
|
+
callback();
|
|
179
|
+
frame = requestAnimationFrame(tick);
|
|
180
|
+
};
|
|
181
|
+
tick();
|
|
182
|
+
return () => cancelAnimationFrame(frame);
|
|
183
|
+
}
|
package/src/directives.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as directives from "@supersoniks/concorde/core/directives/DataProvider";
|
|
2
2
|
import {dp as pubDp, dataProvider as pubDataProvider, get as pubGet, set as pubSet} from "@supersoniks/concorde/core/utils/PublisherProxy";
|
|
3
|
-
import type {DirectiveResult} from "lit/async-directive.js";
|
|
4
3
|
|
|
5
4
|
import {ConcordeWindow} from "./core/_types/types";
|
|
6
5
|
/**
|
|
@@ -11,8 +10,7 @@ export const dp = pubDp;
|
|
|
11
10
|
* @deprecated @see pubDataProvider
|
|
12
11
|
*/
|
|
13
12
|
export const dataProvider = pubDataProvider;
|
|
14
|
-
export
|
|
15
|
-
export const sub = directives.sub as DirectiveResult;
|
|
13
|
+
export { subscribe, sub } from "@supersoniks/concorde/core/directives/DataProvider";
|
|
16
14
|
|
|
17
15
|
/**
|
|
18
16
|
* @deprecated @see pubGet
|
|
@@ -15,7 +15,7 @@ Recommended patterns for new Concorde apps (Lit + TypeScript). Under the hood, d
|
|
|
15
15
|
| HTTP GET | `@get` + `Endpoint`, or `sonic-list` / `sonic-queue` with `fetch` |
|
|
16
16
|
| HTTP POST (body from store) | `@post` + `Endpoint` + body `DataProviderKey` |
|
|
17
17
|
| HTTP PUT / PATCH (body from store) | `@put` / `@patch` — same model as `@post` |
|
|
18
|
-
| Forms | `formDataProvider` + `name` on fields |
|
|
18
|
+
| Forms | `formDataProvider` + `name` on fields (no Subscriber on form elements) |
|
|
19
19
|
| Derived / aggregate (JSONata) | `derive()` or `sonic-jsonata` — [Jsonata](#core/components/functional/jsonata/jsonata.md/jsonata) |
|
|
20
20
|
| Offline doc demos | `serviceURL="/docs-mock-api"` — [Local API demos](#docs/_misc/docs-mock-api.md/docs-mock-api) |
|
|
21
21
|
|
|
@@ -69,8 +69,9 @@ This decorator is particularly useful for:
|
|
|
69
69
|
- By default (`dynamic: false`), the value is read once at connect time and is not updated afterward
|
|
70
70
|
- With `{ dynamic: true }`, the property stays in sync when:
|
|
71
71
|
- an ancestor **changes** the attribute value
|
|
72
|
-
- a **closer** ancestor **gains** the attribute (
|
|
73
|
-
- the
|
|
72
|
+
- a **closer** ancestor **gains** / **loses** the attribute (fallback / `null`)
|
|
73
|
+
- the component is **reparented** (no extra opt-in) — parent `childList` only reacts if *this* node moves
|
|
74
|
+
- Observers are **shared** (one per ancestor attribute / one per parent) so large lists of `sonic-icon` stay cheap on Firefox.
|
|
74
75
|
- When `dynamic` is enabled, updates also propagate to `@subscribe` / `@bind` paths that depend on the decorated property (e.g. `${dataProvider}`)
|
|
75
76
|
|
|
76
77
|
### Dynamic mode
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Installation
|
|
2
2
|
|
|
3
|
-
<sonic-alert status="
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
<sonic-alert status="info" label="Recommended — use the starter" background>
|
|
4
|
+
<p>For almost all new projects, use <a href="https://www.npmjs.com/package/@supersoniks/create-concorde-ts-starter">create-concorde-ts-starter</a></p>
|
|
5
|
+
<p>You get Vite + TypeScript + Lit + Tailwind, an example component, <code>npx concorde enable-short-paths</code> ready to run, and <code>yarn ai:sync</code> for <a href="#docs/_getting-started/ai-agents.md/ai-agents">AI agent skills</a> (<code>AGENTS.md</code>, Cursor / JetBrains rules) without extra setup.</p>
|
|
6
6
|
</sonic-alert>
|
|
7
7
|
|
|
8
8
|
## Starter
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# FormElement without Subscriber (REDMINE-79569)
|
|
2
|
+
|
|
3
|
+
Form fields (`sonic-input`, `textarea`, `select`, `checkbox`, `radio`, `switch`, `button`, `input-autocomplete`) no longer inherit the **Subscriber** mixin.
|
|
4
|
+
|
|
5
|
+
## Behaviour now
|
|
6
|
+
|
|
7
|
+
| Before | After |
|
|
8
|
+
|--------|--------|
|
|
9
|
+
| Dual channel `dataProvider` (autofill) + `formDataProvider` | **`formDataProvider` + `name` only** |
|
|
10
|
+
| Ancestor `dataProvider` auto-filled field props | Ignored by form fields |
|
|
11
|
+
| `noAutoFill` on fields/buttons inside a `dataProvider` tree | Dead on form fields (attribute harmless; can be cleaned in apps) |
|
|
12
|
+
|
|
13
|
+
Preview pattern still valid: form writes via `formDataProvider`, display card reads via `dataProvider` on a **Subscriber** (or `@subscribe`) sibling — not on the fields themselves.
|
|
14
|
+
|
|
15
|
+
## Migration checklist (apps)
|
|
16
|
+
|
|
17
|
+
1. Prefer `formDataProvider` alone on forms / fieldsets.
|
|
18
|
+
2. Drop redundant `dataProvider={sameKey}` on form containers when it only existed for field autofill.
|
|
19
|
+
3. Prefill edit forms with `set(formKey, row)` / `dp(formKey.field).set(...)` before mount — not field `dataProvider`.
|
|
20
|
+
4. Remove `noAutoFill` on `sonic-button` / fields when it only blocked Subscriber autofill.
|
|
21
|
+
5. `initFromPublisher` still works (form publisher only).
|
|
22
|
+
|
|
23
|
+
## Billetterie collect — dual-channel risk
|
|
24
|
+
|
|
25
|
+
Files under `la-billetterie/concorde` that mention both `formDataProvider` and `dataProvider=` (review; many are filter+queue, not field autofill):
|
|
26
|
+
|
|
27
|
+
### High priority (same key on form container)
|
|
28
|
+
|
|
29
|
+
- `la-billetterie/components/reservation-request/atoms/request-event-form.ts` — `form` / `fieldset` with both attrs equal
|
|
30
|
+
- `la-billetterie/components/reservation/atoms/new-quote-form.ts`
|
|
31
|
+
- `la-billetterie/components/stats/sales-summary/sales-summary.ts`
|
|
32
|
+
- `la-billetterie/components/product/price-selection-form/price-selection-form.ts` — `formDataProvider` + `dataProvider="cart/editForm"`
|
|
33
|
+
- `la-billetterie/components/user/account/link-ticket/link-ticket.ts` — distinct keys (API vs form) — keep `dataProvider` only if used by fetch/submit siblings
|
|
34
|
+
|
|
35
|
+
### Filters + queue (usually OK)
|
|
36
|
+
|
|
37
|
+
`formDataProvider` on filter bar, `dataProvider` on `sonic-queue` / list — no field autofill dependency:
|
|
38
|
+
|
|
39
|
+
- `access-control/components/event/list/index.ts`
|
|
40
|
+
- `access-control/components/control/search/views/list.ts`
|
|
41
|
+
- `la-billetterie/components/event/form-event-filter/form-event-filter.ts`
|
|
42
|
+
- `la-billetterie/components/counter/*` (agenda, store, reservation-request-treatment, …)
|
|
43
|
+
- `widgets/agenda/agenda.ts`
|
|
44
|
+
- … see full dual list in ticket notes / grep below
|
|
45
|
+
|
|
46
|
+
### Full dual-channel file list (55)
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
concorde/src/access-control/components/control/search/views/list.ts
|
|
50
|
+
concorde/src/access-control/components/event/list/index.ts
|
|
51
|
+
concorde/src/la-billetterie/components/access-control-mobile/access-controller-picker.ts
|
|
52
|
+
concorde/src/la-billetterie/components/accreditations-directory/accreditations-directory.ts
|
|
53
|
+
concorde/src/la-billetterie/components/address/address-suggestion.ts
|
|
54
|
+
concorde/src/la-billetterie/components/bulk/bulk.ts
|
|
55
|
+
concorde/src/la-billetterie/components/campaign/campaign-content.ts
|
|
56
|
+
concorde/src/la-billetterie/components/counter/agenda/agenda.ts
|
|
57
|
+
concorde/src/la-billetterie/components/counter/event-selector/event-selector.ts
|
|
58
|
+
concorde/src/la-billetterie/components/counter/order-validation/order-validation-settings.ts
|
|
59
|
+
concorde/src/la-billetterie/components/counter/print/format-menu.ts
|
|
60
|
+
concorde/src/la-billetterie/components/counter/reservation-request-treatment/reservation-request-treatment.ts
|
|
61
|
+
concorde/src/la-billetterie/components/counter/store/counter-store.ts
|
|
62
|
+
concorde/src/la-billetterie/components/counter/widgets-settings/widgets-settings-page.ts
|
|
63
|
+
concorde/src/la-billetterie/components/custom-list/custom-list.ts
|
|
64
|
+
concorde/src/la-billetterie/components/event/agenda/agenda.ts
|
|
65
|
+
concorde/src/la-billetterie/components/event/atoms/buy-event-block/buy-event-block.ts
|
|
66
|
+
concorde/src/la-billetterie/components/event/atoms/categorizedPrices/categorizedPrices.ts
|
|
67
|
+
concorde/src/la-billetterie/components/event/event-store/event-store-content.ts
|
|
68
|
+
concorde/src/la-billetterie/components/event/form-event-filter/form-event-filter.ts
|
|
69
|
+
concorde/src/la-billetterie/components/form/event-selection/event-selection-filters.ts
|
|
70
|
+
concorde/src/la-billetterie/components/form/event-selection/event-selection.ts
|
|
71
|
+
concorde/src/la-billetterie/components/giftcards/giftcard-link.ts
|
|
72
|
+
concorde/src/la-billetterie/components/layout/header.ts
|
|
73
|
+
concorde/src/la-billetterie/components/orders/recover/recover.ts
|
|
74
|
+
concorde/src/la-billetterie/components/placing/atoms/placement-choice/placement-choice.ts
|
|
75
|
+
concorde/src/la-billetterie/components/placing/seatmap-view/seatmap-view.ts
|
|
76
|
+
concorde/src/la-billetterie/components/product/price-selection-form/price-selection-form.ts
|
|
77
|
+
concorde/src/la-billetterie/components/product/prices-form/price-button/price-button.ts
|
|
78
|
+
concorde/src/la-billetterie/components/purchase/purchase-summary/complementary-info/complementary-info.ts
|
|
79
|
+
concorde/src/la-billetterie/components/reservation-request/atoms/request-event-form.ts
|
|
80
|
+
concorde/src/la-billetterie/components/reservation/atoms/new-quote-form.ts
|
|
81
|
+
concorde/src/la-billetterie/components/reservation/reservation-content.ts
|
|
82
|
+
concorde/src/la-billetterie/components/seatmap/seatmap.ts
|
|
83
|
+
concorde/src/la-billetterie/components/shop/shop.ts
|
|
84
|
+
concorde/src/la-billetterie/components/stats/dashboard/dashboard.ts
|
|
85
|
+
concorde/src/la-billetterie/components/stats/event/event-stats-check.ts
|
|
86
|
+
concorde/src/la-billetterie/components/stats/sales-summary/sales-summary.ts
|
|
87
|
+
concorde/src/la-billetterie/components/subscription/atoms/quick-select-display-toggle/quick-select-display-toggle.ts
|
|
88
|
+
concorde/src/la-billetterie/components/subscription/cart-quick-select.ts
|
|
89
|
+
concorde/src/la-billetterie/components/subscription/edit/subscription-renew-form.ts
|
|
90
|
+
concorde/src/la-billetterie/components/ticket/ticket-freeup.ts
|
|
91
|
+
concorde/src/la-billetterie/components/tickets-app/default-router.ts
|
|
92
|
+
concorde/src/la-billetterie/components/user/account/account-purchases.ts
|
|
93
|
+
concorde/src/la-billetterie/components/user/account/account-tickets.ts
|
|
94
|
+
concorde/src/la-billetterie/components/user/account/link-ticket/link-ticket.ts
|
|
95
|
+
concorde/src/la-billetterie/components/user/form/login.ts
|
|
96
|
+
concorde/src/la-billetterie/components/user/user-attach/buyer-attach-form.ts
|
|
97
|
+
concorde/src/la-billetterie/components/user/user-attach/buyer-attach.ts
|
|
98
|
+
concorde/src/la-billetterie/components/user/user-attach/owner-attach-form.ts
|
|
99
|
+
concorde/src/la-billetterie/components/user/user-attach/subscription-attach-form.ts
|
|
100
|
+
concorde/src/la-billetterie/components/user/user-attach/subscription-selector.ts
|
|
101
|
+
concorde/src/la-billetterie/components/user/user-selector/user-selector.ts
|
|
102
|
+
concorde/src/la-billetterie/components/user/user-suggest/user-suggest.ts
|
|
103
|
+
concorde/src/widgets/agenda/agenda.ts
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Re-run audit:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# from la-billetterie
|
|
110
|
+
rg -l 'formDataProvider' concorde/src | while read f; do rg -q 'dataProvider\s*=' "$f" && echo "$f"; done
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Non-regression (Concorde docs)
|
|
114
|
+
|
|
115
|
+
Smoke form demos: input, textarea, select, checkbox (incl. check-all), radio, switch, button form modes, queue + `dataFilterProvider`, submit, validation / sameValueAs, input-autocomplete.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Some hosts (legacy PHP pages, static HTML) embed Concorde components **without** a Lit build step. They can use HTML attributes such as **`data-bind`**, **`dataProvider`**, and **`formDataProvider`** on tags directly in the page.
|
|
4
4
|
|
|
5
|
+
**Form fields** (`sonic-input`, checkbox, select, …) bind only via **`formDataProvider` + `name`**. They do not autofill from ancestor `dataProvider` (Subscriber was removed from FormElement — see [FormElement without Subscriber](#docs/_misc/formelement-subscriber-removal.md/formelement-subscriber-removal)).
|
|
6
|
+
|
|
5
7
|
That style is **not** what we demonstrate in this doc site: live examples are **Lit components** under `src/docs/example/`, registered once and reused from Markdown via tags like `<docs-joke-search-demo>`.
|
|
6
8
|
|
|
7
9
|
| Goal | Use |
|
package/src/docs/code.ts
CHANGED
|
@@ -36,6 +36,8 @@ export class DocsCode extends LitElement {
|
|
|
36
36
|
pre {
|
|
37
37
|
font-size: 13px !important;
|
|
38
38
|
padding-right: 5rem !important;
|
|
39
|
+
border: 1px solid var(--sc-base-200);
|
|
40
|
+
border-radius: var(--sc-rounded);
|
|
39
41
|
}
|
|
40
42
|
.custom-scroll {
|
|
41
43
|
overflow: auto !important;
|
|
@@ -239,7 +241,7 @@ export class DocsCode extends LitElement {
|
|
|
239
241
|
return html`
|
|
240
242
|
<div
|
|
241
243
|
class="relative ${this.language === "markup"
|
|
242
|
-
? "border border-neutral-
|
|
244
|
+
? "rounded-md border border-neutral-200 bg-neutral-50/80 dark:border-neutral-700/80 dark:bg-neutral-900/40 p-4"
|
|
243
245
|
: ""}"
|
|
244
246
|
>
|
|
245
247
|
${this.language === "markup" && !this.noOutput
|