@supersoniks/concorde 5.1.2 → 5.1.3-immutable.1
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/.agents/skills/concorde-docs/SKILL.md +1 -1
- package/.claude/skills +1 -0
- package/.github/workflows/ci.yml +21 -0
- package/.github-export-ignore +30 -0
- package/CONTRIBUTING.md +59 -0
- package/DEV.md +54 -0
- package/LICENSE +21 -0
- package/OPEN_SOURCE_CHECKPOINT.md +133 -0
- package/README.md +1 -1
- package/ai/README.md +29 -41
- package/ai/skills/concorde/SKILL.md +54 -324
- package/ai/skills/concorde/rules/composition.md +32 -0
- package/ai/skills/concorde/rules/data.md +47 -0
- package/ai/skills/concorde/rules/http.md +25 -0
- package/ai/skills/concorde/rules/lists-forms.md +35 -0
- package/ai/skills/concorde/rules/styling.md +46 -0
- package/ai/skills/concorde/rules/troubleshooting.md +45 -0
- package/build-infos.json +1 -1
- package/concorde-core.bundle.js +177 -177
- package/concorde-core.es.js +4993 -4833
- package/custom-elements-manifest.public.config.mjs +8 -0
- package/{.tmp-cem/custom-elements.json → custom-elements.json} +11722 -8868
- package/dist/concorde-core.bundle.js +177 -177
- package/dist/concorde-core.es.js +4993 -4833
- package/dist/docs-mock-api-sw.js +58 -223
- package/dist/docs-mock-api-sw.js.map +4 -4
- package/dist/img/og-concorde.jpg +0 -0
- package/dist/robots.txt +11 -10
- package/docs/assets/index-CD4WyL6o.css +1 -0
- package/docs/assets/index-D_alEsng.js +12122 -0
- package/docs/crawl/core/components/functional/date/date.html +190 -0
- package/docs/crawl/core/components/functional/fetch/fetch.html +109 -0
- package/docs/crawl/core/components/functional/if/if.html +27 -0
- package/docs/crawl/core/components/functional/jsonata/jsonata.html +79 -0
- package/docs/crawl/core/components/functional/list/list.html +70 -0
- package/docs/crawl/core/components/functional/mix/mix.html +45 -0
- package/docs/crawl/core/components/functional/queue/queue.html +96 -0
- package/docs/crawl/core/components/functional/router/router.html +106 -0
- package/docs/{core → crawl/core}/components/functional/sdui/sdui-extension-points.html +8 -9
- package/docs/crawl/core/components/functional/sdui/sdui.html +368 -0
- package/docs/crawl/core/components/functional/states/states.html +66 -0
- package/docs/crawl/core/components/functional/submit/submit.html +160 -0
- package/docs/{core → crawl/core}/components/functional/subscriber/subscriber.html +5 -6
- package/docs/crawl/core/components/functional/value/value.html +51 -0
- package/docs/{core → crawl/core}/components/ui/alert/alert.html +63 -53
- package/docs/{core → crawl/core}/components/ui/alert-messages/alert-messages.html +5 -6
- package/docs/{core → crawl/core}/components/ui/badge/badge.html +33 -33
- package/docs/crawl/core/components/ui/button/button.html +150 -0
- package/docs/crawl/core/components/ui/captcha/captcha.html +112 -0
- package/docs/{core → crawl/core}/components/ui/card/card.html +11 -12
- package/docs/{core → crawl/core}/components/ui/divider/divider.html +14 -14
- package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +73 -0
- package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +266 -0
- package/docs/{core → crawl/core}/components/ui/form/form-actions/form-actions.html +23 -23
- package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +121 -0
- package/docs/crawl/core/components/ui/form/input/input.html +109 -0
- package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +38 -0
- package/docs/crawl/core/components/ui/form/radio/radio.html +56 -0
- package/docs/crawl/core/components/ui/form/select/select.html +73 -0
- package/docs/crawl/core/components/ui/form/switch/switch.html +56 -0
- package/docs/crawl/core/components/ui/form/textarea/textarea.html +59 -0
- package/docs/crawl/core/components/ui/group/group.html +104 -0
- package/docs/{core → crawl/core}/components/ui/icon/icon.html +9 -10
- package/docs/crawl/core/components/ui/image/image.html +298 -0
- package/docs/{core → crawl/core}/components/ui/link/link.html +11 -12
- package/docs/crawl/core/components/ui/loader/loader.html +124 -0
- package/docs/{core → crawl/core}/components/ui/menu/menu.html +33 -34
- package/docs/crawl/core/components/ui/modal/modal.html +342 -0
- package/docs/crawl/core/components/ui/pop/pop.html +296 -0
- package/docs/{core → crawl/core}/components/ui/progress/progress.html +7 -8
- package/docs/crawl/core/components/ui/table/table.html +545 -0
- package/docs/crawl/core/components/ui/theme/theme.html +131 -0
- package/docs/crawl/core/components/ui/toast/toast.html +233 -0
- package/docs/crawl/core/components/ui/tooltip/tooltip.html +140 -0
- package/docs/{docs/getting-started → crawl/docs/_core-concept}/dataFlow.html +29 -26
- package/docs/crawl/docs/_core-concept/overview.html +66 -0
- package/docs/crawl/docs/_core-concept/subscriber.html +75 -0
- package/docs/crawl/docs/_decorators/ancestor-attribute.html +117 -0
- package/docs/crawl/docs/_decorators/auto-subscribe.html +202 -0
- package/docs/crawl/docs/_decorators/bind.html +141 -0
- package/docs/crawl/docs/_decorators/get.html +149 -0
- package/docs/crawl/docs/_decorators/handle.html +165 -0
- package/docs/crawl/docs/_decorators/on-assign.html +355 -0
- package/docs/crawl/docs/_decorators/patch.html +78 -0
- package/docs/crawl/docs/_decorators/post.html +139 -0
- package/docs/crawl/docs/_decorators/publish.html +61 -0
- package/docs/crawl/docs/_decorators/put.html +78 -0
- package/docs/crawl/docs/_decorators/subscribe.html +109 -0
- package/docs/crawl/docs/_decorators/wait-for-ancestors.html +137 -0
- package/docs/crawl/docs/_directives/sub.html +93 -0
- package/docs/{docs/getting-started → crawl/docs/_getting-started}/ai-agents.html +11 -12
- package/docs/crawl/docs/_getting-started/concorde-manual-install.html +100 -0
- package/docs/crawl/docs/_getting-started/concorde-outside.html +58 -0
- package/docs/{docs/getting-started → crawl/docs/_getting-started}/create-a-component.html +14 -11
- package/docs/{docs/getting-started → crawl/docs/_getting-started}/my-first-component.html +22 -13
- package/docs/crawl/docs/_getting-started/my-first-subscriber.html +110 -0
- package/docs/crawl/docs/_getting-started/pubsub.html +62 -0
- package/docs/crawl/docs/_getting-started/start.html +76 -0
- package/docs/{docs/getting-started → crawl/docs/_getting-started}/theming.html +9 -10
- package/docs/{docs/misc → crawl/docs/_misc}/api-configuration.html +18 -18
- package/docs/{docs/misc → crawl/docs/_misc}/dataProviderKey.html +11 -12
- package/docs/{docs/misc → crawl/docs/_misc}/docs-mock-api.html +28 -25
- package/docs/{docs/misc → crawl/docs/_misc}/dynamic-path.html +15 -16
- package/docs/{docs/misc → crawl/docs/_misc}/endpoint.html +15 -16
- package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +138 -0
- package/docs/{docs/misc → crawl/docs/_misc}/html-integration.html +15 -12
- package/docs/crawl/hubs/decorators.html +547 -0
- package/docs/crawl/hubs/form-components.html +381 -0
- package/docs/crawl/hubs/remote-data.html +452 -0
- package/docs/crawl/index.html +103 -0
- package/docs/docs-mock-api-sw.js +223 -58
- package/docs/docs-mock-api-sw.js.map +4 -4
- package/docs/index.html +68 -95
- package/docs/llms-full.txt +3610 -2231
- package/docs/llms.txt +86 -94
- package/docs/robots.txt +10 -11
- package/docs/sitemap.xml +84 -78
- package/docs/src/core/components/functional/date/date.md +231 -91
- package/docs/src/core/components/functional/fetch/fetch.md +83 -66
- package/docs/src/core/components/functional/if/if.md +3 -28
- package/docs/src/core/components/functional/jsonata/jsonata.md +37 -42
- package/docs/src/core/components/functional/list/list.md +43 -99
- package/docs/src/core/components/functional/mix/mix.md +26 -31
- package/docs/src/core/components/functional/queue/queue.md +61 -40
- package/docs/src/core/components/functional/router/router.md +65 -64
- package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
- package/docs/src/core/components/functional/sdui/component-catalog.json +1 -1
- package/docs/src/core/components/functional/sdui/example.json +86 -19
- package/docs/src/core/components/functional/sdui/sdui-extension-points.md +1 -1
- package/docs/src/core/components/functional/sdui/sdui.md +358 -187
- package/docs/src/core/components/functional/states/states.md +61 -86
- package/docs/src/core/components/functional/submit/submit.md +72 -64
- package/docs/src/core/components/functional/value/value.md +22 -34
- package/docs/src/core/components/ui/alert/alert.md +58 -48
- package/docs/src/core/components/ui/badge/badge.md +34 -27
- package/docs/src/core/components/ui/button/button.md +106 -139
- package/docs/src/core/components/ui/captcha/captcha.md +32 -17
- package/docs/src/core/components/ui/card/card.md +6 -6
- package/docs/src/core/components/ui/divider/divider.md +11 -8
- package/docs/src/core/components/ui/form/checkbox/checkbox.md +42 -90
- package/docs/src/core/components/ui/form/fieldset/fieldset.md +75 -31
- package/docs/src/core/components/ui/form/form-actions/form-actions.md +16 -14
- package/docs/src/core/components/ui/form/form-layout/form-layout.md +29 -19
- package/docs/src/core/components/ui/form/input/input.md +95 -95
- package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +29 -0
- package/docs/src/core/components/ui/form/radio/radio.md +34 -55
- package/docs/src/core/components/ui/form/select/select.md +45 -60
- package/docs/src/core/components/ui/form/switch/switch.md +34 -57
- package/docs/src/core/components/ui/form/textarea/textarea.md +38 -55
- package/docs/src/core/components/ui/group/group.md +33 -35
- package/docs/src/core/components/ui/icon/icon.md +4 -4
- package/docs/src/core/components/ui/image/image.md +107 -41
- package/docs/src/core/components/ui/link/link.md +6 -6
- package/docs/src/core/components/ui/loader/loader.md +55 -30
- package/docs/src/core/components/ui/menu/menu.md +27 -27
- package/docs/src/core/components/ui/modal/modal.md +96 -72
- package/docs/src/core/components/ui/pop/pop.md +158 -80
- package/docs/src/core/components/ui/progress/progress.md +2 -2
- package/docs/src/core/components/ui/table/table.md +255 -91
- package/docs/src/core/components/ui/theme/theme.md +36 -11
- package/docs/src/core/components/ui/toast/toast.md +117 -48
- package/docs/src/core/components/ui/tooltip/tooltip.md +62 -27
- package/docs/{docs/getting-started → src/docs/_core-concept}/dataFlow.md +18 -17
- package/docs/src/docs/_core-concept/overview.md +57 -0
- package/docs/src/docs/_core-concept/subscriber.md +75 -0
- package/docs/src/docs/_decorators/ancestor-attribute.md +128 -0
- package/docs/src/docs/_decorators/auto-subscribe.md +202 -0
- package/docs/src/docs/_decorators/bind.md +167 -0
- package/docs/src/docs/_decorators/get.md +162 -0
- package/docs/src/docs/_decorators/handle.md +175 -0
- package/docs/src/docs/_decorators/on-assign.md +390 -0
- package/docs/src/docs/_decorators/patch.md +70 -0
- package/docs/src/docs/_decorators/post.md +146 -0
- package/docs/src/docs/_decorators/publish.md +55 -0
- package/docs/src/docs/_decorators/put.md +70 -0
- package/docs/src/docs/_decorators/subscribe.md +100 -0
- package/docs/src/docs/_decorators/wait-for-ancestors.md +163 -0
- package/docs/src/docs/_directives/sub.md +91 -0
- package/docs/src/docs/{getting-started → _getting-started}/ai-agents.md +3 -3
- package/docs/src/docs/_getting-started/concorde-manual-install.md +133 -0
- package/docs/src/docs/_getting-started/concorde-outside.md +33 -0
- package/docs/{docs/getting-started → src/docs/_getting-started}/create-a-component.md +6 -3
- package/docs/src/docs/{getting-started → _getting-started}/my-first-component.md +14 -5
- package/docs/src/docs/_getting-started/my-first-subscriber.md +120 -0
- package/docs/src/docs/_getting-started/pubsub.md +37 -0
- package/docs/src/docs/{getting-started → _getting-started}/start.md +13 -1
- package/docs/src/docs/{getting-started → _getting-started}/theming.md +2 -2
- package/docs/src/docs/{misc → _misc}/api-configuration.md +12 -10
- package/docs/src/docs/{misc → _misc}/dataProviderKey.md +4 -4
- package/docs/{docs/misc → src/docs/_misc}/docs-mock-api.md +13 -12
- package/docs/{docs/misc → src/docs/_misc}/dynamic-path.md +8 -8
- package/docs/{docs/misc → src/docs/_misc}/endpoint.md +8 -8
- package/docs/src/docs/_misc/formelement-subscriber-removal.md +115 -0
- package/docs/{docs/misc → src/docs/_misc}/html-integration.md +5 -4
- package/docs/src/docs/search/docs-search.json +4375 -2420
- package/docs/src/tsconfig.declarations.json +22 -0
- package/docs/src/tsconfig.emit.json +23 -0
- package/docs/src/tsconfig.json +2 -23
- package/gitlab/job_github_mirror.sh +39 -0
- package/index.html +89 -0
- package/package.json +22 -4
- package/public/img/og-concorde.jpg +0 -0
- package/scripts/ai-init.mjs +104 -379
- package/scripts/ai-init.test.mjs +81 -239
- package/scripts/docs-markdown-vite-plugin.ts +11 -5
- package/scripts/docs-public-url.mjs +6 -0
- package/scripts/docs.htaccess +7 -0
- package/scripts/generate-cem.mjs +244 -0
- package/scripts/generate-cem.test.mjs +122 -0
- package/scripts/generate-crawl-docs.mjs +29 -5
- package/scripts/generate-sdui-catalog.mjs +11 -10
- package/scripts/github-export.mjs +150 -0
- package/scripts/post-build-docs.js +3 -0
- package/scripts/post-build.mjs +0 -0
- package/scripts/pre-publish.mjs +2 -1
- package/scripts/site-pages.mjs +212 -0
- package/scripts/site-pages.test.mjs +116 -0
- package/site-pages/about.md +22 -0
- package/site-pages/privacy.md +32 -0
- package/src/core/components/functional/date/date.md +1 -1
- package/src/core/components/functional/example/example.ts +3 -1
- package/src/core/components/functional/if/if.ts +0 -0
- package/src/core/components/functional/list/list.demo.ts +0 -0
- package/src/core/components/functional/list/list.md +6 -2
- package/src/core/components/functional/list/list.ts +17 -4
- package/src/core/components/functional/mix/mix.md +0 -0
- package/src/core/components/functional/router/router.demo.ts +0 -0
- package/src/core/components/functional/router/router.ts +0 -0
- package/src/core/components/functional/sdui/SDUIDescriptorTransformer.ts +0 -0
- package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
- package/src/core/components/functional/sdui/component-catalog.json +2 -2
- package/src/core/components/functional/sdui/example.json +0 -0
- package/src/core/components/functional/sdui/sdui-immutable.spec.ts +74 -0
- package/src/core/components/functional/sdui/sdui.ts +33 -8
- package/src/core/components/functional/sdui/types.ts +0 -0
- package/src/core/components/functional/states/states.ts +0 -0
- package/src/core/components/functional/submit/submit.spec.ts +60 -0
- package/src/core/components/functional/submit/submit.ts +6 -3
- package/src/core/components/functional/subscriber/subscriber.ts +0 -0
- package/src/core/components/functional/value/value.md +0 -0
- package/src/core/components/functional/value/value.ts +0 -0
- package/src/core/components/ui/_css/size.ts +0 -0
- package/src/core/components/ui/captcha/altchaStyles.ts +0 -0
- package/src/core/components/ui/card/card.md +1 -1
- package/src/core/components/ui/form/input/input.md +19 -1
- package/src/core/components/ui/form/input/input.ts +8 -2
- package/src/core/components/ui/form/radio/radio.md +14 -0
- package/src/core/components/ui/image/image.md +17 -17
- package/src/core/components/ui/modal/modal.md +2 -2
- package/src/core/decorators/subscriber/bind.ts +9 -14
- package/src/core/decorators/subscriber/subscribe.ts +15 -9
- package/src/core/decorators/subscriber/subscribe.type-test.ts +14 -5
- package/src/core/mixins/Subscriber.ts +0 -0
- package/src/core/utils/DataBindObserver.ts +0 -0
- package/src/core/utils/Objects.ts +0 -0
- package/src/core/utils/PublisherProxy.ts +166 -125
- package/src/core/utils/deepReadonly.spec.ts +66 -0
- package/src/core/utils/deepReadonly.ts +71 -0
- package/src/core/utils/immutableValue.spec.ts +54 -0
- package/src/core/utils/immutableValue.ts +102 -0
- package/src/core/utils/nestedDotForm.spec.ts +88 -0
- package/src/core/utils/publisherImmutable.spec.ts +76 -0
- package/src/core/utils/route.ts +0 -0
- package/src/core/utils/strictGet.spec.ts +61 -0
- package/src/core/utils/strictGet.ts +102 -0
- package/src/css.d.ts +19 -0
- package/src/docs/components/docs-demo-sources.ts +3 -3
- package/src/docs/decorators/bind.md +23 -24
- package/src/docs/docs-location.spec.ts +10 -0
- package/src/docs/docs-location.ts +10 -0
- package/src/docs/example/decorators-demo-bind-demos.ts +11 -28
- package/src/docs/example/docs-toggle-demos.ts +1 -1
- package/src/docs/example/users.ts +0 -0
- package/src/docs/getting-started/ai-agents.md +29 -55
- package/src/docs/getting-started/dataFlow.md +2 -2
- package/src/docs/home/home.ts +3 -1
- package/src/docs/misc/publisher-get-immutability-docs-crawl.json +902 -0
- package/src/docs/misc/publisher-get-immutability-docs-recheck.json +13 -0
- package/src/docs/misc/publisher-get-immutability-study.md +229 -0
- package/src/docs/navigation/navigation.ts +5 -1
- package/src/docs/search/docs-search.json +358 -58
- package/src/docs/search/markdown-renderer.ts +6 -1
- package/src/docs/tailwind/css/docs/content.css +4 -5
- package/src/tsconfig.declarations.json +22 -0
- package/src/tsconfig.emit.json +23 -0
- package/src/tsconfig.json +53 -5
- package/src/tsconfig.tsbuildinfo +1 -1
- package/.taste-skill/after/desktop-fold.jpg +0 -0
- package/.taste-skill/after/desktop-page-01.jpg +0 -0
- package/.taste-skill/after/desktop-page-02.jpg +0 -0
- package/.taste-skill/after/desktop-page-03.jpg +0 -0
- package/.taste-skill/after/mobile-fold.jpg +0 -0
- package/.taste-skill/after/mobile-page-01.jpg +0 -0
- package/.taste-skill/after/report.json +0 -4103
- package/.taste-skill/after/tablet-fold.jpg +0 -0
- package/.taste-skill/after/tablet-page-01.jpg +0 -0
- package/.taste-skill/after/tablet-page-02.jpg +0 -0
- package/.taste-skill/before/desktop-fold.jpg +0 -0
- package/.taste-skill/before/desktop-page-01.jpg +0 -0
- package/.taste-skill/before/desktop-page-02.jpg +0 -0
- package/.taste-skill/before/mobile-fold.jpg +0 -0
- package/.taste-skill/before/mobile-page-01.jpg +0 -0
- package/.taste-skill/before/report.json +0 -2556
- package/.taste-skill/before/tablet-fold.jpg +0 -0
- package/.taste-skill/before/tablet-page-01.jpg +0 -0
- package/.taste-skill/direction.json +0 -510
- package/.taste-skill/notes.md +0 -84
- package/.taste-skill/prod/desktop-fold.jpg +0 -0
- package/.taste-skill/prod/desktop-page-01.jpg +0 -0
- package/.taste-skill/prod/desktop-page-02.jpg +0 -0
- package/.taste-skill/prod/desktop-page-03.jpg +0 -0
- package/.taste-skill/prod/mobile-fold.jpg +0 -0
- package/.taste-skill/prod/mobile-page-01.jpg +0 -0
- package/.taste-skill/prod/mobile-page-02.jpg +0 -0
- package/.taste-skill/prod/report.json +0 -1973
- package/.taste-skill/prod/tablet-fold.jpg +0 -0
- package/.taste-skill/prod/tablet-page-01.jpg +0 -0
- package/.taste-skill/prod/tablet-page-02.jpg +0 -0
- package/AUDIT.md +0 -228
- package/PLAN-AMELIORATION.md +0 -220
- package/PLAN-DOCS-AGENTS.md +0 -80
- package/ai/AGENTS.md +0 -56
- package/ai/cursor/rules/concorde-menu.mdc +0 -15
- package/ai/cursor/rules/concorde-scope.mdc +0 -14
- package/ai/cursor/rules/concorde-theme.mdc +0 -13
- package/ai/cursor/rules/concorde.mdc +0 -66
- package/ai/jetbrains/rules/concorde.md +0 -53
- package/ai/skills/concorde-get-set-dp/SKILL.md +0 -194
- package/ai/skills/concorde-imports/SKILL.md +0 -78
- package/ai/skills/concorde-menu/SKILL.md +0 -74
- package/ai/skills/concorde-scope/SKILL.md +0 -70
- package/ai/skills/concorde-theme/SKILL.md +0 -57
- package/docs/.htaccess +0 -75
- package/docs/404.html +0 -15
- package/docs/404.md +0 -5
- package/docs/assets/index-BgG6FFPt.js +0 -11765
- package/docs/assets/index-x89XINSG.css +0 -1
- package/docs/core/components/functional/date/date.html +0 -211
- package/docs/core/components/functional/date/date.md +0 -150
- package/docs/core/components/functional/fetch/fetch.html +0 -180
- package/docs/core/components/functional/fetch/fetch.md +0 -108
- package/docs/core/components/functional/if/if.html +0 -65
- package/docs/core/components/functional/if/if.md +0 -34
- package/docs/core/components/functional/jsonata/jsonata.html +0 -110
- package/docs/core/components/functional/jsonata/jsonata.md +0 -61
- package/docs/core/components/functional/list/list.html +0 -198
- package/docs/core/components/functional/list/list.md +0 -121
- package/docs/core/components/functional/mix/mix.html +0 -78
- package/docs/core/components/functional/mix/mix.md +0 -46
- package/docs/core/components/functional/queue/queue.html +0 -155
- package/docs/core/components/functional/queue/queue.md +0 -51
- package/docs/core/components/functional/router/router.html +0 -154
- package/docs/core/components/functional/router/router.md +0 -93
- package/docs/core/components/functional/sdui/sdui-extension-points.md +0 -94
- package/docs/core/components/functional/sdui/sdui.html +0 -397
- package/docs/core/components/functional/sdui/sdui.md +0 -307
- package/docs/core/components/functional/states/states.html +0 -141
- package/docs/core/components/functional/states/states.md +0 -112
- package/docs/core/components/functional/submit/submit.html +0 -178
- package/docs/core/components/functional/submit/submit.md +0 -106
- package/docs/core/components/functional/subscriber/subscriber.md +0 -91
- package/docs/core/components/functional/translation/translation.html +0 -60
- package/docs/core/components/functional/translation/translation.md +0 -38
- package/docs/core/components/functional/value/value.html +0 -81
- package/docs/core/components/functional/value/value.md +0 -47
- package/docs/core/components/ui/alert/alert.md +0 -186
- package/docs/core/components/ui/alert-messages/alert-messages.md +0 -85
- package/docs/core/components/ui/badge/badge.md +0 -181
- package/docs/core/components/ui/button/button.html +0 -309
- package/docs/core/components/ui/button/button.md +0 -216
- package/docs/core/components/ui/captcha/captcha.html +0 -80
- package/docs/core/components/ui/captcha/captcha.md +0 -56
- package/docs/core/components/ui/card/card.md +0 -215
- package/docs/core/components/ui/divider/divider.md +0 -126
- package/docs/core/components/ui/form/checkbox/checkbox.html +0 -200
- package/docs/core/components/ui/form/checkbox/checkbox.md +0 -125
- package/docs/core/components/ui/form/fieldset/fieldset.html +0 -238
- package/docs/core/components/ui/form/fieldset/fieldset.md +0 -161
- package/docs/core/components/ui/form/form-actions/form-actions.md +0 -98
- package/docs/core/components/ui/form/form-layout/form-layout.html +0 -115
- package/docs/core/components/ui/form/form-layout/form-layout.md +0 -109
- package/docs/core/components/ui/form/input/input.html +0 -235
- package/docs/core/components/ui/form/input/input.md +0 -142
- package/docs/core/components/ui/form/radio/radio.html +0 -144
- package/docs/core/components/ui/form/radio/radio.md +0 -78
- package/docs/core/components/ui/form/select/select.html +0 -178
- package/docs/core/components/ui/form/select/select.md +0 -86
- package/docs/core/components/ui/form/switch/switch.html +0 -146
- package/docs/core/components/ui/form/switch/switch.md +0 -80
- package/docs/core/components/ui/form/textarea/textarea.html +0 -162
- package/docs/core/components/ui/form/textarea/textarea.md +0 -82
- package/docs/core/components/ui/group/group.html +0 -113
- package/docs/core/components/ui/group/group.md +0 -77
- package/docs/core/components/ui/icon/icon.md +0 -214
- package/docs/core/components/ui/image/image.html +0 -194
- package/docs/core/components/ui/image/image.md +0 -167
- package/docs/core/components/ui/link/link.md +0 -81
- package/docs/core/components/ui/loader/loader.html +0 -114
- package/docs/core/components/ui/loader/loader.md +0 -87
- package/docs/core/components/ui/menu/menu.md +0 -370
- package/docs/core/components/ui/modal/modal.html +0 -324
- package/docs/core/components/ui/modal/modal.md +0 -211
- package/docs/core/components/ui/pop/pop.html +0 -250
- package/docs/core/components/ui/pop/pop.md +0 -216
- package/docs/core/components/ui/progress/progress.md +0 -109
- package/docs/core/components/ui/table/table.html +0 -333
- package/docs/core/components/ui/table/table.md +0 -267
- package/docs/core/components/ui/theme/theme.html +0 -116
- package/docs/core/components/ui/theme/theme.md +0 -97
- package/docs/core/components/ui/toast/toast.html +0 -185
- package/docs/core/components/ui/toast/toast.md +0 -147
- package/docs/core/components/ui/tooltip/tooltip.html +0 -112
- package/docs/core/components/ui/tooltip/tooltip.md +0 -89
- package/docs/docs/decorators/ancestor-attribute.html +0 -71
- package/docs/docs/decorators/ancestor-attribute.md +0 -59
- package/docs/docs/decorators/auto-subscribe.html +0 -61
- package/docs/docs/decorators/auto-subscribe.md +0 -40
- package/docs/docs/decorators/bind.html +0 -86
- package/docs/docs/decorators/bind.md +0 -77
- package/docs/docs/decorators/get.html +0 -166
- package/docs/docs/decorators/get.md +0 -160
- package/docs/docs/decorators/handle.html +0 -139
- package/docs/docs/decorators/handle.md +0 -119
- package/docs/docs/decorators/on-assign.html +0 -72
- package/docs/docs/decorators/on-assign.md +0 -63
- package/docs/docs/decorators/patch.html +0 -76
- package/docs/docs/decorators/patch.md +0 -44
- package/docs/docs/decorators/post.html +0 -150
- package/docs/docs/decorators/post.md +0 -134
- package/docs/docs/decorators/publish.html +0 -74
- package/docs/docs/decorators/publish.md +0 -56
- package/docs/docs/decorators/put.html +0 -83
- package/docs/docs/decorators/put.md +0 -51
- package/docs/docs/decorators/subscribe.html +0 -91
- package/docs/docs/decorators/subscribe.md +0 -87
- package/docs/docs/decorators/wait-for-ancestors.html +0 -82
- package/docs/docs/decorators/wait-for-ancestors.md +0 -76
- package/docs/docs/directives/sub.html +0 -79
- package/docs/docs/directives/sub.md +0 -75
- package/docs/docs/directives/t.html +0 -91
- package/docs/docs/directives/t.md +0 -73
- package/docs/docs/getting-started/ai-agents.md +0 -76
- package/docs/docs/getting-started/components.html +0 -27
- package/docs/docs/getting-started/components.md +0 -5
- package/docs/docs/getting-started/installation.html +0 -69
- package/docs/docs/getting-started/installation.md +0 -36
- package/docs/docs/getting-started/my-first-component.md +0 -227
- package/docs/docs/getting-started/start.html +0 -47
- package/docs/docs/getting-started/start.md +0 -35
- package/docs/docs/getting-started/theming.md +0 -253
- package/docs/docs/index.html +0 -99
- package/docs/docs/misc/api-configuration.md +0 -79
- package/docs/docs/misc/dataProviderKey.md +0 -168
- package/docs/hubs/decorators.html +0 -443
- package/docs/hubs/form-components.html +0 -404
- package/docs/hubs/remote-data.html +0 -371
- package/docs/img/archive/concorde-001-2cv.webp +0 -0
- package/docs/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
- package/docs/img/archive/concorde-red-arrows-2002.webm +0 -0
- package/docs/img/archive/credits.json +0 -28
- package/docs/index.md +0 -22
- package/docs/src/core/components/functional/translation/translation.md +0 -38
- package/docs/src/docs/decorators/ancestor-attribute.md +0 -59
- package/docs/src/docs/decorators/auto-subscribe.md +0 -40
- package/docs/src/docs/decorators/bind.md +0 -77
- package/docs/src/docs/decorators/get.md +0 -160
- package/docs/src/docs/decorators/handle.md +0 -119
- package/docs/src/docs/decorators/on-assign.md +0 -63
- package/docs/src/docs/decorators/patch.md +0 -44
- package/docs/src/docs/decorators/post.md +0 -134
- package/docs/src/docs/decorators/publish.md +0 -56
- package/docs/src/docs/decorators/put.md +0 -51
- package/docs/src/docs/decorators/subscribe.md +0 -87
- package/docs/src/docs/decorators/wait-for-ancestors.md +0 -76
- package/docs/src/docs/directives/sub.md +0 -75
- package/docs/src/docs/directives/t.md +0 -73
- package/docs/src/docs/getting-started/components.md +0 -5
- package/docs/src/docs/getting-started/create-a-component.md +0 -136
- package/docs/src/docs/getting-started/dataFlow.md +0 -87
- package/docs/src/docs/getting-started/installation.md +0 -36
- package/docs/src/docs/misc/docs-mock-api.md +0 -62
- package/docs/src/docs/misc/dynamic-path.md +0 -71
- package/docs/src/docs/misc/endpoint.md +0 -45
- package/docs/src/docs/misc/html-integration.md +0 -14
- /package/{docs → dist}/img/concorde/plane_01.jpg +0 -0
- /package/{docs → dist}/img/concorde/plane_02.jpg +0 -0
- /package/{docs → dist}/img/concorde/plane_03.jpg +0 -0
- /package/{docs → dist}/img/concorde/plane_04.jpg +0 -0
- /package/{docs → dist}/img/concorde/plane_05.jpg +0 -0
- /package/{docs → dist}/img/concorde/plane_06.jpg +0 -0
- /package/{docs → dist}/img/concorde/plane_07.jpg +0 -0
- /package/{docs → dist}/img/concorde/plane_08.jpg +0 -0
- /package/{docs → dist}/img/concorde/plane_09.jpg +0 -0
- /package/{docs → dist}/img/concorde/plane_10.jpg +0 -0
- /package/{docs → dist}/img/concorde/plane_11.jpg +0 -0
- /package/{docs → dist}/img/concorde/plane_12.jpg +0 -0
- /package/{docs → dist}/img/concorde/plane_13.jpg +0 -0
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="fr" data-crawl-url="https://concorde.supersoniks.org/crawl/hubs/decorators.html" data-doc-id="hubs/decorators">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Concorde decorators reference — Concorde</title>
|
|
7
|
+
<meta name="description" content="Hub for all Concorde Lit decorators: @get @post @put @patch @subscribe @publish @bind @handle and related. Use this page when asking about any decorator.">
|
|
8
|
+
<meta name="keywords" content="decorator, @get, @post, @put, @patch, @subscribe, @publish, @bind, @handle, ApiResult, Endpoint, DataProviderKey">
|
|
9
|
+
<meta name="concorde-doc-id" content="hubs/decorators">
|
|
10
|
+
<link rel="canonical" href="https://concorde.supersoniks.org/crawl/hubs/decorators.html">
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
<header>
|
|
14
|
+
<p><a href="../index.html">Concorde documentation (crawl)</a></p>
|
|
15
|
+
</header>
|
|
16
|
+
<main>
|
|
17
|
+
<article>
|
|
18
|
+
<p class="doc-lead" id="doc-summary"><strong>Concorde documentation — Concorde decorators reference</strong>. Hub for all Concorde Lit decorators: @get @post @put @patch @subscribe @publish @bind @handle and related. Use this page when asking about any decorator. <span>Doc ID: <code>hubs/decorators</code>. Keywords: decorator, @get, @post, @put, @patch, @subscribe, @publish, @bind, @handle, ApiResult, Endpoint, DataProviderKey. URL: <a href="https://concorde.supersoniks.org/crawl/hubs/decorators.html">https://concorde.supersoniks.org/crawl/hubs/decorators.html</a>.</span></p>
|
|
19
|
+
<section id="docs-_decorators-ancestor-attribute" data-doc-id="docs/_decorators/ancestor-attribute">
|
|
20
|
+
<h2><a href="../docs/_decorators/ancestor-attribute.html">@ancestorAttribute</a></h2>
|
|
21
|
+
<p><strong>Doc ID:</strong> <code>docs/_decorators/ancestor-attribute</code> · <a href="../docs/_decorators/ancestor-attribute.html">full page</a></p>
|
|
22
|
+
<p>The @ancestorAttribute decorator automatically injects the value of an ancestor's attribute into a class property at the time of connectedCallback.</p>
|
|
23
|
+
<pre class="doc-excerpt">@ancestorAttribute
|
|
24
|
+
|
|
25
|
+
The @ancestorAttribute decorator automatically injects the value of an ancestor's attribute into a class property at the time of connectedCallback.
|
|
26
|
+
|
|
27
|
+
Principle
|
|
28
|
+
|
|
29
|
+
This decorator uses HTML.getAncestorAttributeValue to traverse up the DOM tree from the current element and find the first ancestor that has the specified attribute. The value of this attribute is then assigned to the decorated property.
|
|
30
|
+
|
|
31
|
+
Usage
|
|
32
|
+
|
|
33
|
+
Import
|
|
34
|
+
|
|
35
|
+
import { ancestorAttribute } from "@supersoniks/concorde/decorators";
|
|
36
|
+
|
|
37
|
+
Basic example
|
|
38
|
+
|
|
39
|
+
The component reads dataProvider and testAttribute from its ancestor wrapper. By default (dynamic: false), values are read once at connect.
|
|
40
|
+
|
|
41
|
+
import { html, LitElement } from "lit";
|
|
42
|
+
import { customElement } from "lit/decorators.js";
|
|
43
|
+
import { ancestorAttribute } from "@supersoniks/concorde/decorators";
|
|
44
|
+
|
|
45
|
+
@customElement("demo-ancestor-attribute")
|
|
46
|
+
export class DemoAncestorAttribute extends LitElement {
|
|
47
|
+
@ancestorAttribute("dataProvider")
|
|
48
|
+
dataProvider: string | null = null;
|
|
49
|
+
|
|
50
|
+
@ancestorAttribute("testAttribute")
|
|
51
|
+
testAttribute: string | null = null;
|
|
52
|
+
|
|
53
|
+
render() {
|
|
54
|
+
return html
|
|
55
|
+
dataProvider: ${this.dataProvider ?? "null"}
|
|
56
|
+
testAttribute: ${this.testAttribute</pre>
|
|
57
|
+
</section>
|
|
58
|
+
<section id="docs-_decorators-auto-subscribe" data-doc-id="docs/_decorators/auto-subscribe">
|
|
59
|
+
<h2><a href="../docs/_decorators/auto-subscribe.html">@autoSubscribe</a></h2>
|
|
60
|
+
<p><strong>Doc ID:</strong> <code>docs/_decorators/auto-subscribe</code> · <a href="../docs/_decorators/auto-subscribe.html">full page</a></p>
|
|
61
|
+
<p>> Legacy: prefer @subscribe + DataProviderKey. Examples below may still show PublisherManager for existing codebases.</p>
|
|
62
|
+
<pre class="doc-excerpt">@autoSubscribe
|
|
63
|
+
|
|
64
|
+
> Legacy: prefer @subscribe + DataProviderKey. Examples below may still show PublisherManager for existing codebases.
|
|
65
|
+
|
|
66
|
+
The @autoSubscribe decorator automatically detects which publishers are accessed within a method and subscribes to them. When any of these publishers change, the method is automatically re-executed.
|
|
67
|
+
|
|
68
|
+
Principle
|
|
69
|
+
|
|
70
|
+
This decorator wraps a method to track which publishers are accessed during its execution. It then subscribes to all accessed publishers, and when any of them change, the method is re-executed. This provides automatic reactivity without manually managing subscriptions.
|
|
71
|
+
|
|
72
|
+
Usage
|
|
73
|
+
|
|
74
|
+
Import
|
|
75
|
+
|
|
76
|
+
import { autoSubscribe } from "@supersoniks/concorde/decorators";
|
|
77
|
+
|
|
78
|
+
Basic example
|
|
79
|
+
|
|
80
|
+
@customElement("demo-auto-subscribe")
|
|
81
|
+
export class DemoAutoSubscribe extends LitElement {
|
|
82
|
+
static styles = [tailwind];
|
|
83
|
+
|
|
84
|
+
@state() displayText: string = "";
|
|
85
|
+
@state() computedValue: number = 0;
|
|
86
|
+
|
|
87
|
+
@autoSubscribe()
|
|
88
|
+
updateDisplay() {
|
|
89
|
+
const value1 = PublisherManager.get("autoValue1").get() || 0;
|
|
90
|
+
const value2 = PublisherManager.get("autoValue2").get() || 0;
|
|
91
|
+
this.computedValue = value1 + value2;
|
|
92
|
+
this.displayText = ${value1} + ${value2} = ${this.computedValue};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
</pre>
|
|
96
|
+
</section>
|
|
97
|
+
<section id="docs-_decorators-bind" data-doc-id="docs/_decorators/bind">
|
|
98
|
+
<h2><a href="../docs/_decorators/bind.html">@bind</a></h2>
|
|
99
|
+
<p><strong>Doc ID:</strong> <code>docs/_decorators/bind</code> · <a href="../docs/_decorators/bind.html">full page</a></p>
|
|
100
|
+
<p>Binds a class property to a path in a publisher. The property updates when publisher data changes.</p>
|
|
101
|
+
<pre class="doc-excerpt">@bind
|
|
102
|
+
|
|
103
|
+
Binds a class property to a path in a publisher. The property updates when publisher data changes.
|
|
104
|
+
|
|
105
|
+
For Lit re-renders, also add @state() on the same property.
|
|
106
|
+
|
|
107
|
+
See also: @subscribe, @handle, @publish, @get, @post, @put, @patch.
|
|
108
|
+
|
|
109
|
+
Principle
|
|
110
|
+
|
|
111
|
+
The decorator subscribes to the DataProvider store using dot notation or a DataProviderKey. Updates flow into the decorated property (Data flow).
|
|
112
|
+
|
|
113
|
+
Import
|
|
114
|
+
|
|
115
|
+
import { bind } from "@supersoniks/concorde/decorators";
|
|
116
|
+
|
|
117
|
+
Example
|
|
118
|
+
|
|
119
|
+
@customElement("demo-bind")
|
|
120
|
+
export class DemoBind extends LitElement {
|
|
121
|
+
static styles = [tailwind];
|
|
122
|
+
|
|
123
|
+
@bind("demoData.firstName")
|
|
124
|
+
@state()
|
|
125
|
+
firstName = "";
|
|
126
|
+
|
|
127
|
+
@bind("demoData.lastName")
|
|
128
|
+
@state()
|
|
129
|
+
lastName: string = "";
|
|
130
|
+
|
|
131
|
+
@bind("demoData.count")
|
|
132
|
+
@state()
|
|
133
|
+
count: number = 0;
|
|
134
|
+
|
|
135
|
+
render() {
|
|
136
|
+
return //......
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
updateData() {
|
|
140
|
+
set(demoDataKey, { ...get(demoDataKey), count: get(demoDataKey).count + 1 });
|
|
141
|
+
// see demo-bind in src/docs/example/decorators-demo-bind-demos.ts
|
|
142
|
+
const randomIndex = Math.floor(Math.random() demoUsers.get().length);
|
|
143
|
+
const randomUser = demoUsers.get()[randomIndex];
|
|
144
|
+
demoData.set({
|
|
145
|
+
firstName: randomUser.firstName,
|
|
146
|
+
lastName: randomUser.lastName,
|
|
147
|
+
count:</pre>
|
|
148
|
+
</section>
|
|
149
|
+
<section id="docs-_decorators-get" data-doc-id="docs/_decorators/get">
|
|
150
|
+
<h2><a href="../docs/_decorators/get.html">@get</a></h2>
|
|
151
|
+
<p><strong>Doc ID:</strong> <code>docs/_decorators/get</code> · <a href="../docs/_decorators/get.html">full page</a></p>
|
|
152
|
+
<p>@get loads data and stores the result in an optional ApiResult<T> property.</p>
|
|
153
|
+
<pre class="doc-excerpt">@get
|
|
154
|
+
|
|
155
|
+
@get loads data and stores the result in an optional ApiResult property.
|
|
156
|
+
The property is undefined until a result is available.
|
|
157
|
+
|
|
158
|
+
- payload.result: typed data;
|
|
159
|
+
- payload.response: the HTTP response;
|
|
160
|
+
- payload.request: the request that was sent.
|
|
161
|
+
|
|
162
|
+
Minimal usage
|
|
163
|
+
|
|
164
|
+
const usersEndpoint = new Endpoint ("users");
|
|
165
|
+
|
|
166
|
+
@get(usersEndpoint)
|
|
167
|
+
@state()
|
|
168
|
+
payload?: ApiResult ;
|
|
169
|
+
|
|
170
|
+
The same decorator adapts to a method. The method receives the complete
|
|
171
|
+
ApiResult payload after each GET:
|
|
172
|
+
|
|
173
|
+
@get(usersEndpoint)
|
|
174
|
+
handleUsers(payload?: ApiResult ) {
|
|
175
|
+
if (!payload) return;
|
|
176
|
+
|
|
177
|
+
console.log(payload.response?.status);
|
|
178
|
+
console.log(payload.result);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
The first argument is always an
|
|
182
|
+
Endpoint . API configuration is read
|
|
183
|
+
from the HTML scope (serviceURL, token, etc.), so the component is usually
|
|
184
|
+
placed below an element that provides this configuration.
|
|
185
|
+
|
|
186
|
+
Refetching a GET
|
|
187
|
+
|
|
188
|
+
From the component
|
|
189
|
+
|
|
190
|
+
Keep the decorator in a constant to access refetch(component). Refetch only
|
|
191
|
+
targets the instance passed as the argument, even before it has received a
|
|
192
|
+
result.
|
|
193
|
+
|
|
194
|
+
const usersGet = get(new Endpoint ("users"));
|
|
195
|
+
|
|
196
|
+
@usersGet
|
|
197
|
+
@state()
|
|
198
|
+
payload?: ApiResult ;
|
|
199
|
+
|
|
200
|
+
async refresh() {
|
|
201
|
+
const payload = await usersGet.refetch(this);
|
|
202
|
+
console.log(</pre>
|
|
203
|
+
</section>
|
|
204
|
+
<section id="docs-_decorators-handle" data-doc-id="docs/_decorators/handle">
|
|
205
|
+
<h2><a href="../docs/_decorators/handle.html">@handle</a></h2>
|
|
206
|
+
<p><strong>Doc ID:</strong> <code>docs/_decorators/handle</code> · <a href="../docs/_decorators/handle.html">full page</a></p>
|
|
207
|
+
<p>Typed callback on one or more DataProviderKey<T> paths: invokes the decorated method when a publisher assigns a value (calculations, side effects, updating other @state properties, etc.).</p>
|
|
208
|
+
<pre class="doc-excerpt">@handle
|
|
209
|
+
|
|
210
|
+
Typed callback on one or more DataProviderKey paths: invokes the decorated method when a publisher assigns a value (calculations, side effects, updating other @state properties, etc.).
|
|
211
|
+
|
|
212
|
+
Unlike @subscribe, nothing is bound to the decorated member — only your method runs. @handle is typed and accepts up to 3 keys plus an optional trailing HandleOptions object. It supersedes the string-based @onAssign.
|
|
213
|
+
|
|
214
|
+
By default the method is called on every assignment, even when the value is null / undefined. Use the options below to restrict that.
|
|
215
|
+
|
|
216
|
+
Import
|
|
217
|
+
|
|
218
|
+
import { handle, Skip } from "@supersoniks/concorde/decorators";
|
|
219
|
+
import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
|
|
220
|
+
import { get, set } from "@supersoniks/concorde/utils";
|
|
221
|
+
|
|
222
|
+
Basic example
|
|
223
|
+
|
|
224
|
+
type DemoCounterData = { count: number };
|
|
225
|
+
const demoDataKey = new DataProviderKey&lt;DemoCounterData&gt;("demoData");
|
|
226
|
+
|
|
227
|
+
@customElement("demo-handle")
|
|
228
|
+
export class DemoHandle extends LitElement {
|
|
229
|
+
@state() doubled = 0;
|
|
230
|
+
@state() lastUpdate = "";
|
|
231
|
+
|
|
232
|
+
@handle(demoDataKey.count)
|
|
233
|
+
onCountChange(count: number) {
|
|
234
|
+
this.doubled = count 2;
|
|
235
|
+
this.lastUpdate = new Date().toLocaleTimeString();
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
incrementCount() {
|
|
239
|
+
const data</pre>
|
|
240
|
+
</section>
|
|
241
|
+
<section id="docs-_decorators-on-assign" data-doc-id="docs/_decorators/on-assign">
|
|
242
|
+
<h2><a href="../docs/_decorators/on-assign.html">@onAssign</a></h2>
|
|
243
|
+
<p><strong>Doc ID:</strong> <code>docs/_decorators/on-assign</code> · <a href="../docs/_decorators/on-assign.html">full page</a></p>
|
|
244
|
+
<p>> New apps: use @handle with DataProviderKey (Data flow). @onAssign uses untyped string paths; it remains documented for existing codebases — see Migrating to @handle below.</p>
|
|
245
|
+
<pre class="doc-excerpt">@onAssign
|
|
246
|
+
|
|
247
|
+
> New apps: use @handle with DataProviderKey (Data flow). @onAssign uses untyped string paths; it remains documented for existing codebases — see Migrating to @handle below.
|
|
248
|
+
|
|
249
|
+
The @onAssign decorator allows you to execute a method when one or more publishers are updated. The method is called only when all specified publishers have been assigned values.
|
|
250
|
+
|
|
251
|
+
For a typed equivalent (recommended), use @handle.
|
|
252
|
+
|
|
253
|
+
Principle
|
|
254
|
+
|
|
255
|
+
This decorator subscribes to one or more publishers by string path (legacy). When all specified publishers have been assigned values (via set), the decorated method is called with all the values as arguments. Prefer @handle + DataProviderKey and get / set from Data flow.
|
|
256
|
+
|
|
257
|
+
This is particularly useful when you need to wait for multiple data sources to be ready before executing logic.
|
|
258
|
+
|
|
259
|
+
Usage
|
|
260
|
+
|
|
261
|
+
Import
|
|
262
|
+
|
|
263
|
+
import { onAssign } from "@supersoniks/concorde/decorators";
|
|
264
|
+
|
|
265
|
+
Basic example
|
|
266
|
+
|
|
267
|
+
//...
|
|
268
|
+
@customElement("demo-on-assign")
|
|
269
|
+
export class DemoOnAssign extends LitElement {
|
|
270
|
+
static styles = [tailwind];
|
|
271
|
+
|
|
272
|
+
@state() userWithSettings: any = null;
|
|
273
|
+
@state() isReady: boolean = false;
|
|
274
|
+
@state() lastUpdate: string = "";
|
|
275
|
+
|
|
276
|
+
@onAssign("demoUser", "demoUserSettings")
|
|
277
|
+
handleDataReady</pre>
|
|
278
|
+
</section>
|
|
279
|
+
<section id="docs-_decorators-patch" data-doc-id="docs/_decorators/patch">
|
|
280
|
+
<h2><a href="../docs/_decorators/patch.html">@patch</a></h2>
|
|
281
|
+
<p><strong>Doc ID:</strong> <code>docs/_decorators/patch</code> · <a href="../docs/_decorators/patch.html">full page</a></p>
|
|
282
|
+
<p>@patch applies a partial update with the body from a publisher. It uses the</p>
|
|
283
|
+
<pre class="doc-excerpt">@patch
|
|
284
|
+
|
|
285
|
+
@patch applies a partial update with the body from a publisher. It uses the
|
|
286
|
+
same model as @post:
|
|
287
|
+
Endpoint , DataProviderKey , ApiResult , options, and the
|
|
288
|
+
send(component) handle.
|
|
289
|
+
|
|
290
|
+
Minimal usage
|
|
291
|
+
|
|
292
|
+
const bodyKey = new DataProviderKey >("users.patch");
|
|
293
|
+
const patchUser = patch(new Endpoint ("users/42"), bodyKey);
|
|
294
|
+
|
|
295
|
+
@patchUser
|
|
296
|
+
@state()
|
|
297
|
+
payload?: ApiResult ;
|
|
298
|
+
|
|
299
|
+
The same decorator adapts to a method:
|
|
300
|
+
|
|
301
|
+
@patch(new Endpoint ("users/42"), bodyKey)
|
|
302
|
+
handlePatch(payload?: ApiResult ) {
|
|
303
|
+
if (payload?.response?.ok) console.log(payload.result);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
To run the operation again from the component:
|
|
307
|
+
|
|
308
|
+
async savePatch() {
|
|
309
|
+
await patchUser.send(this);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
send(component) returns a Promise resolved after the PATCH completes. See
|
|
313
|
+
@post for the method-decorator form and the
|
|
314
|
+
when: "before" option.
|
|
315
|
+
|
|
316
|
+
The PATCH is also sent automatically when the body mutates, unless
|
|
317
|
+
autoPostOnBodyMutation: false is set. The available options are described in
|
|
318
|
+
@post:
|
|
319
|
+
|
|
320
|
+
- autoPostOnBodyMutation
|
|
321
|
+
- skipIfBodyMissing
|
|
322
|
+
- refetchEveryMs
|
|
323
|
+
- skipEmptyPlaceholder
|
|
324
|
+
- triggerKey
|
|
325
|
+
|
|
326
|
+
Pass explicit API configuration as the third argument:
|
|
327
|
+
|
|
328
|
+
@patch(endpoint, bodyKey, apiConfigurationKey)
|
|
329
|
+
|
|
330
|
+
Import
|
|
331
|
+
|
|
332
|
+
import { patch, type ApiResult } from "@supersoniks/</pre>
|
|
333
|
+
</section>
|
|
334
|
+
<section id="docs-_decorators-post" data-doc-id="docs/_decorators/post">
|
|
335
|
+
<h2><a href="../docs/_decorators/post.html">@post</a></h2>
|
|
336
|
+
<p><strong>Doc ID:</strong> <code>docs/_decorators/post</code> · <a href="../docs/_decorators/post.html">full page</a></p>
|
|
337
|
+
<p>@post sends the contents of a publisher and stores the response in an</p>
|
|
338
|
+
<pre class="doc-excerpt">@post
|
|
339
|
+
|
|
340
|
+
@post sends the contents of a publisher and stores the response in an
|
|
341
|
+
optional ApiResult property. The property is undefined until a result
|
|
342
|
+
is available.
|
|
343
|
+
|
|
344
|
+
Minimal usage
|
|
345
|
+
|
|
346
|
+
Pass an Endpoint and a DataProviderKey for the request body.
|
|
347
|
+
|
|
348
|
+
const userBodyKey = new DataProviderKey ("users.form");
|
|
349
|
+
const createUser = post(new Endpoint ("users"), userBodyKey);
|
|
350
|
+
|
|
351
|
+
@createUser
|
|
352
|
+
@state()
|
|
353
|
+
payload?: ApiResult ;
|
|
354
|
+
|
|
355
|
+
The same decorator adapts to a method and receives the complete payload:
|
|
356
|
+
|
|
357
|
+
@post(new Endpoint ("users"), userBodyKey)
|
|
358
|
+
handleCreate(payload?: ApiResult ) {
|
|
359
|
+
if (payload?.response?.ok) console.log(payload.result);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
The current body is read from userBodyKey. By default, the POST is sent when
|
|
363
|
+
the component connects and after each body mutation. Mutations in the same
|
|
364
|
+
frame are coalesced into one request.
|
|
365
|
+
|
|
366
|
+
API configuration is read from the HTML scope, as with
|
|
367
|
+
@get.
|
|
368
|
+
|
|
369
|
+
Sending the POST again
|
|
370
|
+
|
|
371
|
+
From the component
|
|
372
|
+
|
|
373
|
+
Keep the decorator to access send(component). The body is read again when the
|
|
374
|
+
operation runs.
|
|
375
|
+
|
|
376
|
+
async saveAgain() {
|
|
377
|
+
const payload = await createUser.send(this);
|
|
378
|
+
console.log(payload?.result);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
send() returns a Promise | undefined> that resolves after the
|
|
382
|
+
operation completes. It</pre>
|
|
383
|
+
</section>
|
|
384
|
+
<section id="docs-_decorators-publish" data-doc-id="docs/_decorators/publish">
|
|
385
|
+
<h2><a href="../docs/_decorators/publish.html">@publish</a></h2>
|
|
386
|
+
<p><strong>Doc ID:</strong> <code>docs/_decorators/publish</code> · <a href="../docs/_decorators/publish.html">full page</a></p>
|
|
387
|
+
<p>Write-only binding: assigning to the property publishes to the DataProviderKey path. No read subscription (inverse of @subscribe).</p>
|
|
388
|
+
<pre class="doc-excerpt">@publish
|
|
389
|
+
|
|
390
|
+
Write-only binding: assigning to the property publishes to the DataProviderKey path. No read subscription (inverse of @subscribe).
|
|
391
|
+
|
|
392
|
+
Similar to the “reflect” half of @bind without listening to the publisher.
|
|
393
|
+
|
|
394
|
+
Import
|
|
395
|
+
|
|
396
|
+
import { publish } from "@supersoniks/concorde/decorators";
|
|
397
|
+
import { sub } from "@supersoniks/concorde/directives";
|
|
398
|
+
import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
|
|
399
|
+
|
|
400
|
+
Example
|
|
401
|
+
|
|
402
|
+
type PublishDemoData = { email: string; message: string };
|
|
403
|
+
const publishDemoKey = new DataProviderKey ("publishDemo");
|
|
404
|
+
//
|
|
405
|
+
@customElement("demo-publish")
|
|
406
|
+
export class DemoPublish extends LitElement {
|
|
407
|
+
@publish(publishDemoKey.email)
|
|
408
|
+
@state()
|
|
409
|
+
email = "";
|
|
410
|
+
//
|
|
411
|
+
@publish(publishDemoKey.message)
|
|
412
|
+
@state()
|
|
413
|
+
message = "";
|
|
414
|
+
//
|
|
415
|
+
render() {
|
|
416
|
+
return html
|
|
417
|
+
(this.email = (e.target as HTMLInputElement).value)}
|
|
418
|
+
label="Email"
|
|
419
|
+
>
|
|
420
|
+
${sub(publishDemoKey.email)}
|
|
421
|
+
;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
Dynamic paths use the same placeholder rules as @bind / @subscribe. Resolution and skipEmptyPlaceholder: Dynamic path placeholders.</pre>
|
|
426
|
+
</section>
|
|
427
|
+
<section id="docs-_decorators-put" data-doc-id="docs/_decorators/put">
|
|
428
|
+
<h2><a href="../docs/_decorators/put.html">@put</a></h2>
|
|
429
|
+
<p><strong>Doc ID:</strong> <code>docs/_decorators/put</code> · <a href="../docs/_decorators/put.html">full page</a></p>
|
|
430
|
+
<p>@put replaces a resource with the body from a publisher. It uses exactly the</p>
|
|
431
|
+
<pre class="doc-excerpt">@put
|
|
432
|
+
|
|
433
|
+
@put replaces a resource with the body from a publisher. It uses exactly the
|
|
434
|
+
same model as @post:
|
|
435
|
+
Endpoint , DataProviderKey , ApiResult , options, and the
|
|
436
|
+
send(component) handle.
|
|
437
|
+
|
|
438
|
+
Minimal usage
|
|
439
|
+
|
|
440
|
+
const bodyKey = new DataProviderKey ("users.form");
|
|
441
|
+
const updateUser = put(new Endpoint ("users/42"), bodyKey);
|
|
442
|
+
|
|
443
|
+
@updateUser
|
|
444
|
+
@state()
|
|
445
|
+
payload?: ApiResult ;
|
|
446
|
+
|
|
447
|
+
The same decorator adapts to a method:
|
|
448
|
+
|
|
449
|
+
@put(new Endpoint ("users/42"), bodyKey)
|
|
450
|
+
handleUpdate(payload?: ApiResult ) {
|
|
451
|
+
if (payload?.response?.ok) console.log(payload.result);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
To run the operation again from the component:
|
|
455
|
+
|
|
456
|
+
async update() {
|
|
457
|
+
await updateUser.send(this);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
send(component) returns a Promise resolved after the PUT completes. See
|
|
461
|
+
@post for the method-decorator form and the
|
|
462
|
+
when: "before" option.
|
|
463
|
+
|
|
464
|
+
The PUT is also sent automatically when the body mutates, unless
|
|
465
|
+
autoPostOnBodyMutation: false is set. See
|
|
466
|
+
@post for the option details:
|
|
467
|
+
|
|
468
|
+
- autoPostOnBodyMutation
|
|
469
|
+
- skipIfBodyMissing
|
|
470
|
+
- refetchEveryMs
|
|
471
|
+
- skipEmptyPlaceholder
|
|
472
|
+
- triggerKey
|
|
473
|
+
|
|
474
|
+
Pass explicit API configuration as the third argument:
|
|
475
|
+
|
|
476
|
+
@put(endpoint, bodyKey, apiConfigurationKey)
|
|
477
|
+
|
|
478
|
+
Import
|
|
479
|
+
|
|
480
|
+
import { put, type ApiResult } from "@supersoniks/concorde/decorators";
|
|
481
|
+
impo</pre>
|
|
482
|
+
</section>
|
|
483
|
+
<section id="docs-_decorators-subscribe" data-doc-id="docs/_decorators/subscribe">
|
|
484
|
+
<h2><a href="../docs/_decorators/subscribe.html">@subscribe</a></h2>
|
|
485
|
+
<p><strong>Doc ID:</strong> <code>docs/_decorators/subscribe</code> · <a href="../docs/_decorators/subscribe.html">full page</a></p>
|
|
486
|
+
<p>Keeps a Lit property in sync with a read-only slice of the DataProvider store. You pass a DataProviderKey; when that path changes, the property updates and the component re-renders.</p>
|
|
487
|
+
<pre class="doc-excerpt">@subscribe
|
|
488
|
+
|
|
489
|
+
Keeps a Lit property in sync with a read-only slice of the DataProvider store. You pass a DataProviderKey; when that path changes, the property updates and the component re-renders.
|
|
490
|
+
|
|
491
|
+
Typical setup (same idea as My first component):
|
|
492
|
+
|
|
493
|
+
| Piece | Role |
|
|
494
|
+
|-------|------|
|
|
495
|
+
| Type T | Shape of the object at that path (DocsUserData, { count: number }, …) |
|
|
496
|
+
| Key | DataProviderKey — static path ("cart") or dynamic ("users.${userIndex}", "${dataProvider}") |
|
|
497
|
+
| Scope on the host | Properties listed in U (e.g. dataProvider, userIndex) — often filled via @ancestorAttribute |
|
|
498
|
+
| @subscribe(key) | Mirrors the store into @state() (or another property); read-only from the component side |
|
|
499
|
+
|
|
500
|
+
For writing back to the store from component state, use @publish. In templates, the same paths work with sub().
|
|
501
|
+
|
|
502
|
+
Import
|
|
503
|
+
|
|
504
|
+
import { subscribe } from "@supersoniks/concorde/decorators";
|
|
505
|
+
import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
|
|
506
|
+
|
|
507
|
+
type Data = { count: number };
|
|
508
|
+
const dataKey = new DataProviderKey&lt;Data&gt;("data");
|
|
509
|
+
|
|
510
|
+
@subscribe(dataKey.count)
|
|
511
|
+
@state()
|
|
512
|
+
count = 0;
|
|
513
|
+
|
|
514
|
+
Static path
|
|
515
|
+
|
|
516
|
+
The key path is fixed. The property type must match T at that segment.
|
|
517
|
+
|
|
518
|
+
const cartKey = new DataProvi</pre>
|
|
519
|
+
</section>
|
|
520
|
+
<section id="docs-_decorators-wait-for-ancestors" data-doc-id="docs/_decorators/wait-for-ancestors">
|
|
521
|
+
<h2><a href="../docs/_decorators/wait-for-ancestors.html">@awaitConnectedAncestors and @dispatchConnectedEvent</a></h2>
|
|
522
|
+
<p><strong>Doc ID:</strong> <code>docs/_decorators/wait-for-ancestors</code> · <a href="../docs/_decorators/wait-for-ancestors.html">full page</a></p>
|
|
523
|
+
<p>The @awaitConnectedAncestors and @dispatchConnectedEvent decorators delay a web component's initialization until its matching ancestors have executed their connectedCallback. This is when contextual e</p>
|
|
524
|
+
<pre class="doc-excerpt">@awaitConnectedAncestors and @dispatchConnectedEvent
|
|
525
|
+
|
|
526
|
+
The @awaitConnectedAncestors and @dispatchConnectedEvent decorators delay a web component's initialization until its matching ancestors have executed their connectedCallback. This is when contextual elements (publisher, dataProvider, etc.) are configured.
|
|
527
|
+
|
|
528
|
+
Principle
|
|
529
|
+
|
|
530
|
+
When a child component attaches to the DOM, its ancestors may not yet be initialized (especially if custom element definitions are loaded asynchronously). The @awaitConnectedAncestors decorator delays the component's connectedCallback until all ancestors matching the provided CSS selectors have executed their connectedCallback.
|
|
531
|
+
|
|
532
|
+
The @dispatchConnectedEvent decorator allows ancestors to signal they are ready by dispatching the sonic-connected event at the end of their connectedCallback. The event bubbles, so it can be listened to from anywhere (e.g. document.addEventListener(CONNECTED, handler)).
|
|
533
|
+
|
|
534
|
+
Ancestors that are not web components (no hyphen in tag name) are considered connected by default and do not need to emit the event.
|
|
535
|
+
|
|
536
|
+
Usage
|
|
537
|
+
|
|
538
|
+
Import
|
|
539
|
+
|
|
540
|
+
import { awaitConnectedAncestors, dispatchConnectedEvent, ancestorAttribute } from "@supersoniks/concorde/decorators";
|
|
541
|
+
|
|
542
|
+
Basic</pre>
|
|
543
|
+
</section>
|
|
544
|
+
</article>
|
|
545
|
+
</main>
|
|
546
|
+
</body>
|
|
547
|
+
</html>
|