@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
|
@@ -1,61 +1,56 @@
|
|
|
1
1
|
# Jsonata
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`sonic-jsonata` : **1 input → expression → 1 output** (readonly).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Unidirectional (fetch → compute → display), unlike [`sonic-mix`](#core/components/functional/mix/mix.md/mix).
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
> Offline : `serviceURL="/docs-mock-api"` — [Local API demos](#docs/_misc/docs-mock-api.md/docs-mock-api).
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Demos
|
|
10
|
+
|
|
11
|
+
### Groupby + top N
|
|
12
|
+
|
|
13
|
+
Change **Top N** → recalcul sans refetch.
|
|
10
14
|
|
|
11
|
-
|
|
15
|
+
<docs-lit-demo for="docs-jsonata-space-cats-demo"></docs-lit-demo>
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
### Totaux (somme + taxe)
|
|
14
18
|
|
|
15
|
-
|
|
19
|
+
Change **Tax %** → même idée.
|
|
16
20
|
|
|
17
21
|
<docs-lit-demo for="docs-jsonata-table-totals-demo"></docs-lit-demo>
|
|
18
22
|
|
|
19
|
-
##
|
|
23
|
+
## Attributes
|
|
24
|
+
|
|
25
|
+
| Attribute | Role |
|
|
26
|
+
|-----------|------|
|
|
27
|
+
| `inputProvider` | Entrée (`$input` dans l’expression) |
|
|
28
|
+
| `outputProvider` | Sortie (readonly) |
|
|
29
|
+
| `expression` | Expression JSONata |
|
|
30
|
+
| `formDataProvider` | Form optionnel (`$top`, `$taxPercent`, …) — même id que le form |
|
|
31
|
+
| `outputSchema` | Schéma léger optionnel (`type`, `required`) |
|
|
20
32
|
|
|
21
|
-
|
|
33
|
+
## Helpers
|
|
22
34
|
|
|
23
|
-
|
|
35
|
+
`$ucFirst` · `$currency` · `$percent` · `$date` · `$toChart(items, labelKey, valueKey, datasetLabel?)`
|
|
36
|
+
|
|
37
|
+
Pas de DOM, pas de réseau, pas d’`eval`.
|
|
38
|
+
|
|
39
|
+
## Markup
|
|
40
|
+
|
|
41
|
+
<sonic-code language="html">
|
|
24
42
|
<template>
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
></sonic-jsonata>
|
|
32
|
-
<sonic-states dataProvider="jsonataLanded/_state_" data-path="status">
|
|
33
|
-
<template data-value="loading">Counting flights…</template>
|
|
34
|
-
<template data-value="ready">Landed flights: <sonic-value dataProvider="jsonataLanded" key="landed"></sonic-value></template>
|
|
35
|
-
<template data-value="error">Expression error</template>
|
|
36
|
-
</sonic-states>
|
|
37
|
-
</div>
|
|
43
|
+
<sonic-jsonata
|
|
44
|
+
inputProvider="api/space-cats"
|
|
45
|
+
outputProvider="leaderboard"
|
|
46
|
+
formDataProvider="topForm"
|
|
47
|
+
expression='$input{name: $sum(points)} ~> $each(function($v,$k){{"name":$k,"points":$v}}) ^(>points)[[0..$number($top)-1]]'
|
|
48
|
+
></sonic-jsonata>
|
|
38
49
|
</template>
|
|
39
50
|
</sonic-code>
|
|
40
51
|
|
|
41
|
-
|
|
52
|
+
Pour du multi-entrées ou une fonction TS : primitive [`derive`](#docs/_core-concept/dataFlow.md/dataFlow).
|
|
42
53
|
|
|
43
|
-
|
|
44
|
-
|-----------|--------|-------------|
|
|
45
|
-
| `inputProvider` | string | Source data provider, bound to `$input`. Required |
|
|
46
|
-
| `outputProvider` | string | Data provider that receives the result. Required |
|
|
47
|
-
| `expression` | JSONata string (max 8,000 characters) | Expression to evaluate. Required |
|
|
48
|
-
| `formDataProvider` | string | Store whose fields become variables (`$name`) |
|
|
49
|
-
| `outputSchema` | object | Light check of the result: `type` and `required` only; a mismatch sets the `error` state |
|
|
50
|
-
|
|
51
|
-
| Helper | Description |
|
|
52
|
-
|--------|-------------|
|
|
53
|
-
| `$ucFirst(value)` | Upper-cases the first letter |
|
|
54
|
-
| `$currency(value, locale?, currency?)` | Formats a price (default `fr-FR` and `EUR`) |
|
|
55
|
-
| `$percent(value, locale?, digits?)` | Formats a ratio as a percentage (default `fr-FR` and `0` digits) |
|
|
56
|
-
| `$date(value, locale?, optionsJson?)` | Formats a date (default `fr-FR`, medium style) |
|
|
57
|
-
| `$toChart(items, labelKey, valueKey, datasetLabel?)` | Converts rows to `{ labels, datasets }` for a chart |
|
|
58
|
-
|
|
59
|
-
Expressions have no access to the DOM or the network.
|
|
54
|
+
## States
|
|
60
55
|
|
|
61
|
-
|
|
56
|
+
`{output}/_state_` → `{ status, error? }` (`loading` | `ready` | `error` | `empty`). Brancher avec `sonic-states`.
|
|
@@ -1,121 +1,65 @@
|
|
|
1
1
|
# List
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> **Try offline:** `serviceURL="/docs-mock-api"` and `dataProvider="api/users"` with `key="data"` — see [Local API demos](#docs/_misc/docs-mock-api.md/docs-mock-api). Recommended patterns: [Data flow](#docs/_core-concept/dataFlow.md/dataFlow).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
The **sonic-list** component renders one row per entry in **`props`** (array from fetch or set on the element).
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
List extends [Subscriber](#docs/_core-concept/subscriber.md/subscriber) and **Fetcher**:
|
|
8
|
+
* **Subscriber** — `props` + `dataProvider`
|
|
9
|
+
* **Fetcher** — optional `fetch` + `serviceURL` / `key` (see [Fetch](#core/components/functional/fetch/fetch.md/fetch))
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
<template>
|
|
11
|
-
<sonic-list fetch serviceURL="/docs-mock-api" dataProvider="flights?direction=arrivals" key="flights" class="grid gap-1">
|
|
12
|
-
<template>
|
|
13
|
-
<div class="text-sm" data-bind ::inner-html="<b>$time</b> $code from $city ($airport)"></div>
|
|
14
|
-
</template>
|
|
15
|
-
</sonic-list>
|
|
16
|
-
</template>
|
|
17
|
-
</sonic-code>
|
|
11
|
+
## Row renderer (`items`) — recommended
|
|
18
12
|
|
|
19
|
-
|
|
13
|
+
From a **Lit** parent, pass a function on the **`items`** property (`ListItems`). Each row is wrapped in a `sonic-subscriber` with `dataProvider="…/list-item/n"` (hover rows with `debug`).
|
|
20
14
|
|
|
21
|
-
|
|
15
|
+
```typescript
|
|
16
|
+
private items = ({ first_name, last_name, email, avatar }) => html`
|
|
17
|
+
<sonic-image src=${avatar} …></sonic-image>
|
|
18
|
+
<div>${first_name} <b>${last_name}</b></div>
|
|
19
|
+
<div>${email}</div>
|
|
20
|
+
`;
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
html`<sonic-list
|
|
23
|
+
fetch
|
|
24
|
+
dataProvider="api/users"
|
|
25
|
+
key="data"
|
|
26
|
+
serviceURL="/docs-mock-api"
|
|
27
|
+
.items=${this.items}
|
|
28
|
+
></sonic-list>`;
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Use **`.items=${fn}`** (property binding): Lit passes functions only as properties, not as HTML attributes — `@property({ type: Function })` does not change that. Same for **`.noItems`**, **`.separator`**, **`.skeleton`**. The callback receives each row object (replacing `data-bind` / `<sonic-value>` in a `<template>`).
|
|
32
|
+
|
|
33
|
+
Live demo + TypeScript source (one file, no Markdown copy):
|
|
34
|
+
|
|
35
|
+
<docs-lit-demo for="docs-users-list"></docs-lit-demo>
|
|
36
|
+
|
|
37
|
+
Implementation: `src/docs/example/docs-users-list.ts` — row markup in the **`items`** callback (`item.first_name`, …), same idea as replacing `data-bind` / `<sonic-value>` in a `<template>`.
|
|
38
|
+
|
|
39
|
+
## Alternating row layouts
|
|
40
|
+
|
|
41
|
+
Use **`metadata`** (`even`, `odd`, `firstChild`, …) or fields on each item (e.g. `tpl` with `templateKey`):
|
|
24
42
|
|
|
25
43
|
<docs-lit-demo for="docs-list-alternate-demo"></docs-lit-demo>
|
|
26
44
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
In HTML, `templateKey` (default `template`) names the row field that selects a `<template data-value="…">`. Rows without a match cycle through the `<template>` children that have no `data-value`. From Lit, branch inside the `items` callback instead.
|
|
30
|
-
|
|
31
|
-
<sonic-code>
|
|
32
|
-
<template>
|
|
33
|
-
<sonic-list fetch serviceURL="/docs-mock-api" dataProvider="flights?direction=departures" key="flights" templateKey="status" class="grid gap-1">
|
|
34
|
-
<template>
|
|
35
|
-
<div class="text-sm" data-bind ::inner-html="$code to $city"></div>
|
|
36
|
-
</template>
|
|
37
|
-
<template data-value="delayed">
|
|
38
|
-
<div class="text-sm text-warning" data-bind ::inner-html="$code to $city: delayed"></div>
|
|
39
|
-
</template>
|
|
40
|
-
<template data-value="cancelled">
|
|
41
|
-
<div class="text-sm text-danger line-through" data-bind ::inner-html="$code to $city"></div>
|
|
42
|
-
</template>
|
|
43
|
-
</sonic-list>
|
|
44
|
-
</template>
|
|
45
|
-
</sonic-code>
|
|
45
|
+
<docs-lit-demo for="docs-list-template-key-demo"></docs-lit-demo>
|
|
46
46
|
|
|
47
47
|
## Separator and empty list
|
|
48
48
|
|
|
49
|
-
`.separator` renders between rows (not after the last one). `.noItems` renders when the array is empty. In HTML, use `<template data-value="separator">` and `<template data-value="no-item">`.
|
|
50
|
-
|
|
51
49
|
<docs-lit-demo for="docs-list-separator-demo"></docs-lit-demo>
|
|
52
50
|
|
|
53
|
-
##
|
|
51
|
+
## Fetch + `extractValues`
|
|
54
52
|
|
|
55
|
-
|
|
53
|
+
<docs-lit-demo for="docs-list-extract-values-demo"></docs-lit-demo>
|
|
56
54
|
|
|
57
|
-
|
|
58
|
-
<template>
|
|
59
|
-
<sonic-list fetch serviceURL="/docs-mock-api" dataProvider="flights?direction=departures" key="flights" limit="3" class="grid gap-1">
|
|
60
|
-
<template>
|
|
61
|
-
<div class="text-sm" data-bind ::inner-html="<b>$time</b> $code to $city"></div>
|
|
62
|
-
</template>
|
|
63
|
-
</sonic-list>
|
|
64
|
-
</template>
|
|
65
|
-
</sonic-code>
|
|
55
|
+
## HTML `<template>` children (integration without Lit)
|
|
66
56
|
|
|
67
|
-
|
|
57
|
+
For **plain HTML** hosts, you can still declare **`<template>`** children (and `data-value` for `templateKey`, `separator`, `no-item`). That path is for [HTML integration](#docs/_misc/html-integration.md/html-integration) — not used in Concorde doc live demos.
|
|
68
58
|
|
|
69
|
-
|
|
59
|
+
Each list row still gets `dataProvider="[list]/list-item/[index]"`.
|
|
70
60
|
|
|
71
|
-
|
|
61
|
+
## Additionnal tips
|
|
72
62
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
<sonic-code>
|
|
78
|
-
<template>
|
|
79
|
-
<sonic-list fetch loader="inline" serviceURL="/docs-mock-api" dataProvider="flights?direction=arrivals&status=landed" key="flights" class="grid gap-1">
|
|
80
|
-
<template>
|
|
81
|
-
<div class="text-sm" data-bind ::inner-html="$code from $city: landed"></div>
|
|
82
|
-
</template>
|
|
83
|
-
</sonic-list>
|
|
84
|
-
</template>
|
|
85
|
-
</sonic-code>
|
|
86
|
-
|
|
87
|
-
## API reference
|
|
88
|
-
|
|
89
|
-
| Attribute | Values | Description |
|
|
90
|
-
|-----------|--------|-------------|
|
|
91
|
-
| `dataProvider` | string | Publisher of the list. Also the endpoint when `endPoint` is empty. Inherited from ancestors |
|
|
92
|
-
| `fetch` | boolean | Loads `props` from the API. Without it, the list never fetches |
|
|
93
|
-
| `serviceURL` · `endPoint` · `key` | string | Request configuration, see [Fetch](/core/components/functional/fetch) |
|
|
94
|
-
| `templateKey` | string (default `template`) | Row field that selects a `<template data-value>` |
|
|
95
|
-
| `extractValues` | boolean | Renders an object as one `{ key, value }` row per property |
|
|
96
|
-
| `limit` | number (default unlimited) | Maximum number of rendered rows |
|
|
97
|
-
| `offset` | number (default `0`) | Index of the first rendered row |
|
|
98
|
-
| `loader` | `fixed` (when empty) · `inline` | Loader shown while fetching. None by default |
|
|
99
|
-
| `debug` | boolean | Shows each row's data on hover |
|
|
100
|
-
|
|
101
|
-
| Property | Type | Description |
|
|
102
|
-
|----------|------|-------------|
|
|
103
|
-
| `props` | array · object | Rows to render |
|
|
104
|
-
| `items` | `(item, metadata) => TemplateResult` | Row renderer |
|
|
105
|
-
| `separator` | `() => TemplateResult` | Rendered between rows |
|
|
106
|
-
| `noItems` | `() => TemplateResult` | Rendered when there are no rows |
|
|
107
|
-
| `skeleton` | `() => TemplateResult` | Rendered while fetching |
|
|
108
|
-
| `itemPropertyMap` | object | `propertyMap` passed to each row subscriber |
|
|
109
|
-
|
|
110
|
-
| Template | Description |
|
|
111
|
-
|----------|-------------|
|
|
112
|
-
| `<template>` | Row markup; several are used in turn |
|
|
113
|
-
| `<template data-value="…">` | Row variant selected by `templateKey` |
|
|
114
|
-
| `<template data-value="separator">` | Between rows |
|
|
115
|
-
| `<template data-value="no-item">` | Empty list |
|
|
116
|
-
| `<template skeleton>` | While fetching |
|
|
117
|
-
|
|
118
|
-
| Event | Description |
|
|
119
|
-
|-------|-------------|
|
|
120
|
-
| `loading` | A fetch starts |
|
|
121
|
-
| `load` | Data is loaded and assigned to `props` |
|
|
63
|
+
* If the request returns an object, it is wrapped in an array (unless `extractValues` is set).
|
|
64
|
+
* Call **`invalidate()`** on the list publisher to reload fetch data.
|
|
65
|
+
* Each row publisher exposes **`_parent_`** pointing at the list publisher.
|
|
@@ -1,46 +1,41 @@
|
|
|
1
1
|
# Mix
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Mix allows you to mix several subsets of dataProvider in a new key/value structure which is itself associated with a new dataProvider. The data update is then bidirectional.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Two sources hold the flight and its gate. The mix exposes the whole flight under `flight` and only the gate number under `gate`; children read them like any other data provider.
|
|
5
|
+
Dot notation is supported to extract a sub-part of the data.
|
|
8
6
|
|
|
7
|
+
For example, if we declare dataproviders as follows :
|
|
9
8
|
<sonic-code>
|
|
10
9
|
<template>
|
|
11
|
-
<sonic-subscriber dataProvider="
|
|
12
|
-
<sonic-subscriber dataProvider="
|
|
13
|
-
<sonic-mix dataProvider="docs-mix-board" composition='{"flight":"docs-mix-flight","gate":"docs-mix-gate.gate"}'>
|
|
14
|
-
<p>
|
|
15
|
-
<sonic-value key="flight.code"></sonic-value> ·
|
|
16
|
-
<sonic-value key="flight.route"></sonic-value> ·
|
|
17
|
-
gate <sonic-value key="gate"></sonic-value>
|
|
18
|
-
</p>
|
|
19
|
-
</sonic-mix>
|
|
10
|
+
<sonic-subscriber dataProvider="dataToMixA" props='{"foo":{"bar":2}}'></sonic-subscriber>
|
|
11
|
+
<sonic-subscriber dataProvider="dataToMixB" props='{"baz":3}'></sonic-subscriber>
|
|
20
12
|
</template>
|
|
21
13
|
</sonic-code>
|
|
22
|
-
|
|
23
|
-
## Two-way sync
|
|
24
|
-
|
|
25
|
-
Writing to a source updates the mix, and writing to the mix updates the source. The button changes `docs-mix-gate`; the field writes to `docs-mix-board.gate`.
|
|
26
|
-
|
|
14
|
+
We can rearrange the data as follows
|
|
27
15
|
<sonic-code>
|
|
28
16
|
<template>
|
|
29
|
-
<
|
|
30
|
-
<
|
|
31
|
-
<
|
|
32
|
-
</
|
|
33
|
-
|
|
17
|
+
<sonic-mix dataProvider="mixedData" composition='{"either":"dataToMixB","orThat":"dataToMixA.foo.bar"}'>
|
|
18
|
+
<div>Value of dataToMixA.foo.bar and mixedData.orThat : <sonic-value key="orThat"></sonic-value></div>
|
|
19
|
+
<div>Value of dataToMixB.baz and mixedData.either.baz : <sonic-value key="either.baz"></sonic-value></div>
|
|
20
|
+
</sonic-mix>
|
|
21
|
+
</template>
|
|
22
|
+
</sonic-code>
|
|
23
|
+
Then we can change values in both dataProviders programaticaly this way, they will stay in sync
|
|
24
|
+
<sonic-code language="javascript">
|
|
25
|
+
<template>
|
|
26
|
+
SonicPublisherManager.get("mixedData").either.baz=6;
|
|
27
|
+
SonicPublisherManager.get("dataToMixB").baz=8;
|
|
28
|
+
SonicPublisherManager.get("dataToMixA").foo.bar=8;
|
|
29
|
+
SonicPublisherManager.get("mixedData").orThat=6;
|
|
34
30
|
</template>
|
|
35
31
|
</sonic-code>
|
|
32
|
+
Or by using a form element
|
|
33
|
+
<sonic-code>
|
|
34
|
+
<template>
|
|
35
|
+
<sonic-input label="mixedData.orThat" formDataProvider="mixedData" name="orThat"></sonic-input>
|
|
36
|
+
</template>
|
|
37
|
+
</sonic-code>
|
|
38
|
+
|
|
36
39
|
|
|
37
|
-
## API reference
|
|
38
40
|
|
|
39
|
-
| Attribute | Values | Description |
|
|
40
|
-
|-----------|--------|-------------|
|
|
41
|
-
| `dataProvider` | string | Id of the mixed data provider. Its content is reset when the composition changes |
|
|
42
|
-
| `composition` | object (JSON) | Keys of the mixed provider mapped to `"providerId"` or `"providerId.path.to.value"` |
|
|
43
41
|
|
|
44
|
-
| Slot | Description |
|
|
45
|
-
|------|-------------|
|
|
46
|
-
| *(default)* | Content that reads the mixed provider |
|
|
@@ -1,51 +1,72 @@
|
|
|
1
1
|
# Queue
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> **Try offline:** `serviceURL="/docs-mock-api"` — see [Local API demos](#docs/_misc/docs-mock-api.md/docs-mock-api). Row rendering: [Data flow](#docs/_core-concept/dataFlow.md/dataFlow) (`.items` property binding).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**sonic-queue** loads data in **batches**. Each batch is an internal [List](#core/components/functional/list/list.md/list) with its own `dataProvider` (`…/list-item/0`, `…/1`, …).
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
| Mechanism | Role |
|
|
8
|
+
|-----------|------|
|
|
9
|
+
| **`dataProviderExpression`** | API path template; `$offset` and `$limit` are replaced per batch |
|
|
10
|
+
| **`lazyload`** | Load the next batch when the user scrolls near the end |
|
|
11
|
+
| **`dataFilterProvider`** | Publisher id of a form (`formDataProvider`); field values are merged into the request query string |
|
|
12
|
+
| **`filteredFields`** | Optional list of form field names to **exclude** from the query (space-separated) — omit when every field should be sent |
|
|
13
|
+
| **`.items`**, **`.noItems`**, **`.separator`**, **`.skeleton`** | Lit callbacks forwarded to each batch list (use the **dot** — functions are properties, not attributes) |
|
|
8
14
|
|
|
9
|
-
|
|
15
|
+
## Lazy load — `$offset` and `$limit`
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
When the expression contains **`$offset`** and **`$limit`**, the queue:
|
|
12
18
|
|
|
13
|
-
|
|
19
|
+
1. Fetches the first batch with `offset=0` (or the initial `offset` attribute) and `per_page=$limit`.
|
|
20
|
+
2. On scroll, appends a batch with `offset` increased by the previous batch size.
|
|
21
|
+
3. Stops when a batch returns fewer rows than `limit` (or none).
|
|
14
22
|
|
|
15
|
-
|
|
23
|
+
The doc mock implements this on `GET /docs-mock-api/api/users?offset=…&per_page=…` (`paginateUsers` in `src/docs/mock-api/router.ts`).
|
|
16
24
|
|
|
17
25
|
<docs-lit-demo for="docs-queue-users-demo"></docs-lit-demo>
|
|
18
26
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
The
|
|
50
|
-
|
|
51
|
-
|
|
27
|
+
Wrap the queue in a **fixed height** with **`overflow-y-auto`** so lazy load triggers when scrolling inside the box (same layout as the [TS starter](https://github.com/supersoniks/create-concorde-ts-starter) `demo-queue-templates`).
|
|
28
|
+
|
|
29
|
+
Try scrolling after load — batches of 4 users. Search e.g. `George`, `Bluth`, or `zzz` for empty results.
|
|
30
|
+
|
|
31
|
+
### Expression example
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
html`<sonic-queue
|
|
35
|
+
lazyload
|
|
36
|
+
serviceURL="/docs-mock-api"
|
|
37
|
+
dataProviderExpression="api/users?offset=$offset&limit=$limit"
|
|
38
|
+
key="data"
|
|
39
|
+
limit="4"
|
|
40
|
+
class="grid max-h-96 overflow-y-auto"
|
|
41
|
+
.items=${this.renderUser}
|
|
42
|
+
></sonic-queue>`;
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Without **`$offset`** in the expression, the queue behaves like a single list (one batch), e.g. geo communes below.
|
|
46
|
+
|
|
47
|
+
## Filter — `dataFilterProvider` + `q`
|
|
48
|
+
|
|
49
|
+
One search field (`name="q"`) on `formDataProvider="filter"`. The queue listens via **`dataFilterProvider="filter"`** and, on change:
|
|
50
|
+
|
|
51
|
+
1. Resets loaded batches.
|
|
52
|
+
2. Appends each non-empty form field to the query (here only **`q`** — no `filteredFields` needed).
|
|
53
|
+
3. Fetches again from offset `0`.
|
|
54
|
+
|
|
55
|
+
Use **`filteredFields`** only when the form has extra fields that must **not** be sent to the API (e.g. `filteredFields="rememberMe internalId"`).
|
|
56
|
+
|
|
57
|
+
The mock API filters before pagination — same haystack logic as the starter (`filterDocsUsers` in `src/docs/mock-api/fixtures.ts`, used by `paginateUsers` in `router.ts` / Service Worker):
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
const haystack = `${first_name} ${last_name} ${email}`.toLowerCase();
|
|
61
|
+
return haystack.includes(q);
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Simple batch (no lazy scroll)
|
|
65
|
+
|
|
66
|
+
Geo communes: expression uses **`$limit` only** (no `$offset`) — one request, one batch.
|
|
67
|
+
|
|
68
|
+
<docs-lit-demo for="docs-queue-geo-demo"></docs-lit-demo>
|
|
69
|
+
|
|
70
|
+
## HTML `<template>` children
|
|
71
|
+
|
|
72
|
+
Optional for hosts without Lit — see [HTML integration](#docs/_misc/html-integration.md/html-integration).
|
|
@@ -1,93 +1,94 @@
|
|
|
1
1
|
# Router
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**sonic-router** watches `document.location` (pathname + hash) and renders the matching view.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
From a **Lit** parent, pass a **`.routes`** map (property binding — same rule as [`.items` on list](#core/components/functional/list/list.md/list)): keys are path patterns, values are render functions. Use **`fallback`** when nothing matches.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Legacy HTML **`<template data-route="…">`** remains for hosts without Lit — [HTML integration](#docs/_misc/html-integration.md/html-integration).
|
|
8
|
+
|
|
9
|
+
## Static routes (no parameters)
|
|
10
|
+
|
|
11
|
+
Route keys are matched against `pathname + hash`. A simple hash route `#home` matches when the location contains that segment.
|
|
12
|
+
|
|
13
|
+
On the **doc site**, the page URL is already a hash (`#…/router.md/router`). Demos append a **second** hash for in-page routes (`#…/router#home`), use **`href` + `autoActive="strict"`** on `sonic-button` for the active state, and `history.replaceState` on click so markdown is not reloaded (`setDocsDemoSubHash` in `src/docs/docs-location.ts`).
|
|
8
14
|
|
|
9
15
|
<docs-lit-demo for="docs-router-basic-demo"></docs-lit-demo>
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
```typescript
|
|
18
|
+
@state()
|
|
19
|
+
private routes = {
|
|
20
|
+
"#home": () => html`<div>Home</div>`,
|
|
21
|
+
"#about": () => html`<div>About</div>`,
|
|
22
|
+
fallback: () => html`<div>Not found</div>`,
|
|
23
|
+
};
|
|
12
24
|
|
|
13
|
-
|
|
25
|
+
html`
|
|
26
|
+
<sonic-button href="#home">Home</sonic-button>
|
|
27
|
+
<sonic-router .routes=${this.routes}></sonic-router>
|
|
28
|
+
`;
|
|
29
|
+
```
|
|
14
30
|
|
|
15
|
-
|
|
31
|
+
| Key | When it runs |
|
|
32
|
+
|-----|----------------|
|
|
33
|
+
| `"#home"`, `"#about"`, … | `RegExp` or [url-pattern](https://www.npmjs.com/package/url-pattern) test succeeds on current location |
|
|
34
|
+
| **`fallback`** | No other route matched (not an attribute — a key on the same object) |
|
|
16
35
|
|
|
17
|
-
|
|
36
|
+
## Routes with parameters
|
|
18
37
|
|
|
19
|
-
|
|
38
|
+
Two styles (see `router.demo.ts` and `docs-router-params-demo`):
|
|
20
39
|
|
|
21
|
-
|
|
40
|
+
### Url-pattern (`:name`)
|
|
22
41
|
|
|
23
|
-
|
|
24
|
-
<template>
|
|
25
|
-
<sonic-router basePath="/app"></sonic-router>
|
|
26
|
-
<!-- "/fleet" now matches /app/fleet only -->
|
|
27
|
-
</template>
|
|
28
|
-
</sonic-code>
|
|
42
|
+
Key uses **`:param`** segments. The render function receives an **object** `{ param: string }`.
|
|
29
43
|
|
|
30
|
-
|
|
44
|
+
<docs-lit-demo for="docs-router-params-demo"></docs-lit-demo>
|
|
31
45
|
|
|
32
|
-
|
|
46
|
+
```typescript
|
|
47
|
+
"#couleur/:id": ({ id }) => html`<p>Colour id: ${id}</p>`,
|
|
48
|
+
```
|
|
33
49
|
|
|
34
|
-
|
|
35
|
-
<template>
|
|
36
|
-
<sonic-router fallBackRoute="/departures">
|
|
37
|
-
<template data-route="/departures" title="Departures">…</template>
|
|
38
|
-
<template data-route="/flights/:code" dataProviderExpression="flights/:code">
|
|
39
|
-
<sonic-value key="status"></sonic-value>
|
|
40
|
-
</template>
|
|
41
|
-
</sonic-router>
|
|
42
|
-
</template>
|
|
43
|
-
</sonic-code>
|
|
50
|
+
### RegExp (capturing groups)
|
|
44
51
|
|
|
45
|
-
|
|
52
|
+
Key is a **RegExp** string with `(\d+)` / `(\w+)` groups. The render function receives an **array** of captured strings (in order).
|
|
46
53
|
|
|
47
|
-
|
|
54
|
+
```typescript
|
|
55
|
+
"#products/(\\d+)/(\\w+)": ([productId, slug]) =>
|
|
56
|
+
html`<p>Product ${productId}, slug ${slug}</p>`,
|
|
57
|
+
```
|
|
48
58
|
|
|
49
|
-
|
|
59
|
+
With parameters you usually render data directly in Lit (`${id}`). The old **`<template data-route>` + `dataProviderExpression`** pattern scoped a `dataProvider` for `data-bind` / fetch children — prefer **`@subscribe`** or explicit props when using `.routes`.
|
|
50
60
|
|
|
51
|
-
|
|
52
|
-
<template>
|
|
53
|
-
<sonic-redirect to="#boarding" dataProvider="checkin" onData="checkedIn"></sonic-redirect>
|
|
54
|
-
<div formDataProvider="checkin">
|
|
55
|
-
<sonic-button radio name="checkedIn" value="yes">Check in</sonic-button>
|
|
56
|
-
</div>
|
|
57
|
-
</template>
|
|
58
|
-
</sonic-code>
|
|
61
|
+
## `.routes` binding
|
|
59
62
|
|
|
60
|
-
|
|
63
|
+
Always use **`.routes=${…}`** in Lit templates: route handlers are functions and must be set as **properties**, not HTML attributes.
|
|
61
64
|
|
|
62
|
-
##
|
|
65
|
+
## Optional attributes
|
|
63
66
|
|
|
64
|
-
|
|
67
|
+
| Attribute | Role |
|
|
68
|
+
|-----------|------|
|
|
69
|
+
| **`basePath`** | Prefix for pattern matching (default allows optional leading segments) |
|
|
70
|
+
| **`fallBackRoute`** | If set and no template/route matches, navigates to this URL (redirect). Distinct from **`routes.fallback`** which only renders content |
|
|
65
71
|
|
|
66
|
-
|
|
67
|
-
|-----------|--------|-------------|
|
|
68
|
-
| `routes` | object (property) | Render functions keyed by RegExp or url-pattern, plus `fallback` |
|
|
69
|
-
| `basePath` | string | Prefix required before every route. Default: any leading slashes for url-pattern, no anchor for RegExp |
|
|
70
|
-
| `fallBackRoute` | string | URL to navigate to when no route matches and `routes.fallback` is not set |
|
|
72
|
+
## `sonic-redirect`
|
|
71
73
|
|
|
72
|
-
|
|
73
|
-
|--------------------|-------------|
|
|
74
|
-
| `data-route` | RegExp or url-pattern matched against the location |
|
|
75
|
-
| `data-fallback` | Template shown when no route matches |
|
|
76
|
-
| `title` | Sets `document.title` when the template renders |
|
|
77
|
-
| `dataProviderExpression` | Builds the `dataProvider` of a wrapper around the content from `$1`… or `:name` |
|
|
74
|
+
Separate component: redirect when data appears on a publisher (login steps, wizards). Not part of the `.routes` map.
|
|
78
75
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
<sonic-code>
|
|
77
|
+
<template>
|
|
78
|
+
<sonic-redirect to="#core/components/functional/router/router.md/router#data-is-set" dataProvider="stupid-data-set-id" onData="theData"></sonic-redirect>
|
|
79
|
+
<div class="flex gap-2 mb-4" formDataProvider="stupid-data-set-id">
|
|
80
|
+
<sonic-button radio name="theData" value="Some Data" size="xs">
|
|
81
|
+
Enter data
|
|
82
|
+
</sonic-button>
|
|
83
|
+
<sonic-button radio name="theData" value="" href="javascript:history.back();" size="xs">
|
|
84
|
+
Delete the data and do a history.back()
|
|
85
|
+
</sonic-button>
|
|
86
|
+
</div>
|
|
87
|
+
</template>
|
|
88
|
+
</sonic-code>
|
|
82
89
|
|
|
83
|
-
|
|
90
|
+
Example: combine with **`.routes`** and **submit** for login / logout / profile steps.
|
|
84
91
|
|
|
85
|
-
|
|
86
|
-
|-----------|--------|-------------|
|
|
87
|
-
| `to` | string | Destination. A value starting with `#` only changes the hash |
|
|
88
|
-
| `dataProvider` | string | Provider to watch. Inherited from the closest ancestor when omitted |
|
|
89
|
-
| `onData` | string (required) | Dot path of the value that triggers the redirect when truthy |
|
|
90
|
-
| `onAdded` | boolean | Redirects as soon as the element renders, without waiting for data |
|
|
91
|
-
| `pushState` · `replaceState` | boolean | Navigates with `history.pushState` or `history.replaceState` instead of a full load. Ignored for `#` destinations |
|
|
92
|
+
## Package demo
|
|
92
93
|
|
|
93
|
-
|
|
94
|
+
`sonic-router-demo` (`router.demo.ts`) — home, user profile (`#user/:id/:slug`), products RegExp, **fallback** 404.
|