@supersoniks/concorde 5.1.1 → 5.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/concorde-docs/SKILL.md +153 -0
- package/.agents/skills/{concorde-component-docs/template.md → concorde-docs/templates/component.md} +6 -2
- package/.agents/skills/concorde-docs/templates/decorator.md +43 -0
- package/.agents/skills/concorde-docs/templates/guide.md +25 -0
- package/.tmp-cem/custom-elements.json +503 -503
- package/PLAN-DOCS-AGENTS.md +80 -0
- package/README.md +3 -3
- package/ai/skills/concorde/SKILL.md +1 -1
- package/ai/skills/concorde-get-set-dp/SKILL.md +3 -3
- package/ai/skills/concorde-theme/SKILL.md +1 -1
- package/build-infos.json +1 -1
- package/concorde-core.bundle.js +1 -1
- package/concorde-core.es.js +1 -1
- package/dist/concorde-core.bundle.js +1 -1
- package/dist/concorde-core.es.js +1 -1
- package/docs/.htaccess +75 -0
- package/docs/404.html +15 -0
- package/docs/404.md +5 -0
- package/docs/assets/{index-Bb-_LRyY.js → index-BgG6FFPt.js} +2582 -3097
- package/docs/assets/index-x89XINSG.css +1 -0
- package/docs/core/components/functional/date/date.html +211 -0
- package/docs/core/components/functional/date/date.md +150 -0
- package/docs/core/components/functional/fetch/fetch.html +180 -0
- package/docs/core/components/functional/fetch/fetch.md +108 -0
- package/docs/core/components/functional/if/if.html +65 -0
- package/docs/core/components/functional/if/if.md +34 -0
- package/docs/core/components/functional/jsonata/jsonata.html +110 -0
- package/docs/core/components/functional/jsonata/jsonata.md +61 -0
- package/docs/core/components/functional/list/list.html +198 -0
- package/docs/core/components/functional/list/list.md +121 -0
- package/docs/core/components/functional/mix/mix.html +78 -0
- package/docs/core/components/functional/mix/mix.md +46 -0
- package/docs/core/components/functional/queue/queue.html +155 -0
- package/docs/core/components/functional/queue/queue.md +51 -0
- package/docs/core/components/functional/router/router.html +154 -0
- package/docs/core/components/functional/router/router.md +93 -0
- package/docs/core/components/functional/sdui/sdui-extension-points.html +127 -0
- package/docs/core/components/functional/sdui/sdui-extension-points.md +94 -0
- package/docs/core/components/functional/sdui/sdui.html +397 -0
- package/docs/core/components/functional/sdui/sdui.md +307 -0
- package/docs/core/components/functional/states/states.html +141 -0
- package/docs/core/components/functional/states/states.md +112 -0
- package/docs/core/components/functional/submit/submit.html +178 -0
- package/docs/core/components/functional/submit/submit.md +106 -0
- package/docs/core/components/functional/subscriber/subscriber.html +68 -0
- package/docs/core/components/functional/subscriber/subscriber.md +91 -0
- package/docs/core/components/functional/translation/translation.html +60 -0
- package/docs/core/components/functional/translation/translation.md +38 -0
- package/docs/core/components/functional/value/value.html +81 -0
- package/docs/core/components/functional/value/value.md +47 -0
- package/docs/core/components/ui/alert/alert.html +201 -0
- package/docs/core/components/ui/alert/alert.md +186 -0
- package/docs/core/components/ui/alert-messages/alert-messages.html +132 -0
- package/docs/core/components/ui/alert-messages/alert-messages.md +85 -0
- package/docs/core/components/ui/badge/badge.html +197 -0
- package/docs/core/components/ui/badge/badge.md +181 -0
- package/docs/core/components/ui/button/button.html +309 -0
- package/docs/core/components/ui/button/button.md +216 -0
- package/docs/core/components/ui/captcha/captcha.html +80 -0
- package/docs/core/components/ui/captcha/captcha.md +56 -0
- package/docs/core/components/ui/card/card.html +254 -0
- package/docs/core/components/ui/card/card.md +215 -0
- package/docs/core/components/ui/divider/divider.html +144 -0
- package/docs/core/components/ui/divider/divider.md +126 -0
- package/docs/core/components/ui/form/checkbox/checkbox.html +200 -0
- package/docs/core/components/ui/form/checkbox/checkbox.md +125 -0
- package/docs/core/components/ui/form/fieldset/fieldset.html +238 -0
- package/docs/core/components/ui/form/fieldset/fieldset.md +161 -0
- package/docs/core/components/ui/form/form-actions/form-actions.html +122 -0
- package/docs/core/components/ui/form/form-actions/form-actions.md +98 -0
- package/docs/core/components/ui/form/form-layout/form-layout.html +115 -0
- package/docs/core/components/ui/form/form-layout/form-layout.md +109 -0
- package/docs/core/components/ui/form/input/input.html +235 -0
- package/docs/core/components/ui/form/input/input.md +142 -0
- package/docs/core/components/ui/form/radio/radio.html +144 -0
- package/docs/core/components/ui/form/radio/radio.md +78 -0
- package/docs/core/components/ui/form/select/select.html +178 -0
- package/docs/core/components/ui/form/select/select.md +86 -0
- package/docs/core/components/ui/form/switch/switch.html +146 -0
- package/docs/core/components/ui/form/switch/switch.md +80 -0
- package/docs/core/components/ui/form/textarea/textarea.html +162 -0
- package/docs/core/components/ui/form/textarea/textarea.md +82 -0
- package/docs/core/components/ui/group/group.html +113 -0
- package/docs/core/components/ui/group/group.md +77 -0
- package/docs/core/components/ui/icon/icon.html +223 -0
- package/docs/core/components/ui/icon/icon.md +214 -0
- package/docs/core/components/ui/image/image.html +194 -0
- package/docs/core/components/ui/image/image.md +167 -0
- package/docs/core/components/ui/link/link.html +101 -0
- package/docs/core/components/ui/link/link.md +81 -0
- package/docs/core/components/ui/loader/loader.html +114 -0
- package/docs/core/components/ui/loader/loader.md +87 -0
- package/docs/core/components/ui/menu/menu.html +395 -0
- package/docs/core/components/ui/menu/menu.md +370 -0
- package/docs/core/components/ui/modal/modal.html +324 -0
- package/docs/core/components/ui/modal/modal.md +211 -0
- package/docs/core/components/ui/pop/pop.html +250 -0
- package/docs/core/components/ui/pop/pop.md +216 -0
- package/docs/core/components/ui/progress/progress.html +132 -0
- package/docs/core/components/ui/progress/progress.md +109 -0
- package/docs/core/components/ui/table/table.html +333 -0
- package/docs/core/components/ui/table/table.md +267 -0
- package/docs/core/components/ui/theme/theme.html +116 -0
- package/docs/core/components/ui/theme/theme.md +97 -0
- package/docs/core/components/ui/toast/toast.html +185 -0
- package/docs/core/components/ui/toast/toast.md +147 -0
- package/docs/core/components/ui/tooltip/tooltip.html +112 -0
- package/docs/core/components/ui/tooltip/tooltip.md +89 -0
- package/docs/docs/decorators/ancestor-attribute.html +71 -0
- package/docs/docs/decorators/ancestor-attribute.md +59 -0
- package/docs/docs/decorators/auto-subscribe.html +61 -0
- package/docs/docs/decorators/auto-subscribe.md +40 -0
- package/docs/docs/decorators/bind.html +86 -0
- package/docs/docs/decorators/bind.md +77 -0
- package/docs/docs/decorators/get.html +166 -0
- package/docs/docs/decorators/get.md +160 -0
- package/docs/docs/decorators/handle.html +139 -0
- package/docs/docs/decorators/handle.md +119 -0
- package/docs/docs/decorators/on-assign.html +72 -0
- package/docs/docs/decorators/on-assign.md +63 -0
- package/docs/docs/decorators/patch.html +76 -0
- package/docs/docs/decorators/patch.md +44 -0
- package/docs/docs/decorators/post.html +150 -0
- package/docs/docs/decorators/post.md +134 -0
- package/docs/docs/decorators/publish.html +74 -0
- package/docs/docs/decorators/publish.md +56 -0
- package/docs/docs/decorators/put.html +83 -0
- package/docs/docs/decorators/put.md +51 -0
- package/docs/docs/decorators/subscribe.html +91 -0
- package/docs/docs/decorators/subscribe.md +87 -0
- package/docs/docs/decorators/wait-for-ancestors.html +82 -0
- package/docs/docs/decorators/wait-for-ancestors.md +76 -0
- package/docs/docs/directives/sub.html +79 -0
- package/docs/docs/directives/sub.md +75 -0
- package/docs/docs/directives/t.html +91 -0
- package/docs/docs/directives/t.md +73 -0
- package/docs/docs/getting-started/ai-agents.html +174 -0
- package/{src/docs/_getting-started → docs/docs/getting-started}/ai-agents.md +3 -3
- package/docs/docs/getting-started/components.html +27 -0
- package/docs/docs/getting-started/create-a-component.html +108 -0
- package/{src/docs/_getting-started → docs/docs/getting-started}/create-a-component.md +3 -6
- package/docs/docs/getting-started/dataFlow.html +174 -0
- package/{src/docs/_core-concept → docs/docs/getting-started}/dataFlow.md +17 -18
- package/docs/docs/getting-started/installation.html +69 -0
- package/docs/docs/getting-started/installation.md +36 -0
- package/docs/docs/getting-started/my-first-component.html +180 -0
- package/{src/docs/_getting-started → docs/docs/getting-started}/my-first-component.md +5 -14
- package/docs/docs/getting-started/start.html +47 -0
- package/{src/docs/_getting-started → docs/docs/getting-started}/start.md +1 -13
- package/docs/docs/getting-started/theming.html +334 -0
- package/docs/docs/index.html +99 -0
- package/docs/docs/misc/api-configuration.html +149 -0
- package/{src/docs/_misc → docs/docs/misc}/api-configuration.md +10 -12
- package/docs/docs/misc/dataProviderKey.html +136 -0
- package/{src/docs/_misc → docs/docs/misc}/dataProviderKey.md +4 -4
- package/docs/docs/misc/docs-mock-api.html +155 -0
- package/{src/docs/_misc → docs/docs/misc}/docs-mock-api.md +12 -13
- package/docs/docs/misc/dynamic-path.html +181 -0
- package/{src/docs/_misc → docs/docs/misc}/dynamic-path.md +8 -8
- package/docs/docs/misc/endpoint.html +51 -0
- package/{src/docs/_misc → docs/docs/misc}/endpoint.md +8 -8
- package/docs/docs/misc/html-integration.html +45 -0
- package/{src/docs/_misc → docs/docs/misc}/html-integration.md +4 -5
- package/docs/docs-mock-api-sw.js +58 -223
- package/docs/docs-mock-api-sw.js.map +4 -4
- package/docs/hubs/decorators.html +443 -0
- package/docs/hubs/form-components.html +404 -0
- package/docs/hubs/remote-data.html +371 -0
- 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 +28 -0
- package/docs/img/concorde/plane_01.jpg +0 -0
- package/docs/img/concorde/plane_02.jpg +0 -0
- package/docs/img/concorde/plane_03.jpg +0 -0
- package/docs/img/concorde/plane_04.jpg +0 -0
- package/docs/img/concorde/plane_05.jpg +0 -0
- package/docs/img/concorde/plane_06.jpg +0 -0
- package/docs/img/concorde/plane_07.jpg +0 -0
- package/docs/img/concorde/plane_08.jpg +0 -0
- package/docs/img/concorde/plane_09.jpg +0 -0
- package/docs/img/concorde/plane_10.jpg +0 -0
- package/docs/img/concorde/plane_11.jpg +0 -0
- package/docs/img/concorde/plane_12.jpg +0 -0
- package/docs/img/concorde/plane_13.jpg +0 -0
- package/docs/index.html +95 -68
- package/docs/index.md +22 -0
- package/docs/llms-full.txt +5795 -0
- package/docs/llms.txt +106 -0
- package/docs/robots.txt +11 -10
- package/docs/sitemap.xml +237 -0
- package/docs/src/core/components/functional/date/date.md +150 -0
- package/docs/src/core/components/functional/fetch/fetch.md +108 -0
- package/docs/src/core/components/functional/if/if.md +34 -0
- package/docs/src/core/components/functional/jsonata/jsonata.md +61 -0
- package/docs/src/core/components/functional/list/list.md +121 -0
- package/docs/src/core/components/functional/mix/mix.md +46 -0
- package/docs/src/core/components/functional/queue/queue.md +51 -0
- package/docs/src/core/components/functional/router/router.md +93 -0
- package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +511 -0
- package/docs/src/core/components/functional/sdui/component-catalog.json +3103 -0
- package/docs/src/core/components/functional/sdui/default-library.json +108 -0
- package/docs/src/core/components/functional/sdui/example.json +32 -0
- package/docs/src/core/components/functional/sdui/sdui-extension-points.md +94 -0
- package/docs/src/core/components/functional/sdui/sdui.md +307 -0
- package/docs/src/core/components/functional/states/states.md +112 -0
- package/docs/src/core/components/functional/submit/submit.md +106 -0
- package/docs/src/core/components/functional/subscriber/subscriber.md +91 -0
- package/docs/src/core/components/functional/translation/translation.md +38 -0
- package/docs/src/core/components/functional/value/value.md +47 -0
- package/docs/src/core/components/ui/alert/alert.md +186 -0
- package/docs/src/core/components/ui/alert-messages/alert-messages.md +85 -0
- package/docs/src/core/components/ui/badge/badge.md +181 -0
- package/docs/src/core/components/ui/button/button.md +216 -0
- package/docs/src/core/components/ui/captcha/captcha.md +56 -0
- package/docs/src/core/components/ui/card/card.md +215 -0
- package/docs/src/core/components/ui/divider/divider.md +126 -0
- package/docs/src/core/components/ui/form/checkbox/checkbox.md +125 -0
- package/docs/src/core/components/ui/form/fieldset/fieldset.md +161 -0
- package/docs/src/core/components/ui/form/form-actions/form-actions.md +98 -0
- package/docs/src/core/components/ui/form/form-layout/form-layout.md +109 -0
- package/docs/src/core/components/ui/form/input/input.md +142 -0
- package/docs/src/core/components/ui/form/radio/radio.md +78 -0
- package/docs/src/core/components/ui/form/select/select.md +86 -0
- package/docs/src/core/components/ui/form/switch/switch.md +80 -0
- package/docs/src/core/components/ui/form/textarea/textarea.md +82 -0
- package/docs/src/core/components/ui/group/group.md +77 -0
- package/docs/src/core/components/ui/icon/icon.md +214 -0
- package/docs/src/core/components/ui/icon/icons.json +1 -0
- package/docs/src/core/components/ui/image/image.md +167 -0
- package/docs/src/core/components/ui/link/link.md +81 -0
- package/docs/src/core/components/ui/loader/loader.md +87 -0
- package/docs/src/core/components/ui/menu/menu.md +370 -0
- package/docs/src/core/components/ui/modal/modal.md +211 -0
- package/docs/src/core/components/ui/pop/pop.md +216 -0
- package/docs/src/core/components/ui/progress/progress.md +109 -0
- package/docs/src/core/components/ui/table/table.md +267 -0
- package/docs/src/core/components/ui/theme/theme.md +97 -0
- package/docs/src/core/components/ui/toast/toast.md +147 -0
- package/docs/src/core/components/ui/tooltip/tooltip.md +89 -0
- package/docs/src/docs/decorators/ancestor-attribute.md +59 -0
- package/docs/src/docs/decorators/auto-subscribe.md +40 -0
- package/docs/src/docs/decorators/bind.md +77 -0
- package/docs/src/docs/decorators/get.md +160 -0
- package/docs/src/docs/decorators/handle.md +119 -0
- package/docs/src/docs/decorators/on-assign.md +63 -0
- package/docs/src/docs/decorators/patch.md +44 -0
- package/docs/src/docs/decorators/post.md +134 -0
- package/docs/src/docs/decorators/publish.md +56 -0
- package/docs/src/docs/decorators/put.md +51 -0
- package/docs/src/docs/decorators/subscribe.md +87 -0
- package/docs/src/docs/decorators/wait-for-ancestors.md +76 -0
- package/docs/src/docs/directives/sub.md +75 -0
- package/docs/src/docs/directives/t.md +73 -0
- package/docs/src/docs/getting-started/ai-agents.md +76 -0
- package/docs/src/docs/getting-started/components.md +5 -0
- package/docs/src/docs/getting-started/create-a-component.md +136 -0
- package/docs/src/docs/getting-started/dataFlow.md +87 -0
- package/docs/src/docs/getting-started/installation.md +36 -0
- package/docs/src/docs/getting-started/my-first-component.md +227 -0
- package/docs/src/docs/getting-started/start.md +35 -0
- package/docs/src/docs/getting-started/theming.md +253 -0
- package/docs/src/docs/misc/api-configuration.md +79 -0
- package/docs/src/docs/misc/dataProviderKey.md +168 -0
- package/docs/src/docs/misc/docs-mock-api.md +62 -0
- package/docs/src/docs/misc/dynamic-path.md +71 -0
- package/docs/src/docs/misc/endpoint.md +45 -0
- package/docs/src/docs/misc/html-integration.md +14 -0
- package/docs/src/docs/search/docs-search.json +10287 -0
- package/docs/src/tag-list.json +1 -0
- package/docs/src/tsconfig-model.json +23 -0
- package/docs/src/tsconfig.json +1353 -0
- package/index.html +68 -5
- package/package.json +1 -1
- package/public/docs-mock-api-sw.js +58 -223
- package/public/docs-mock-api-sw.js.map +4 -4
- package/public/img/concorde/plane_01.jpg +0 -0
- package/public/img/concorde/plane_02.jpg +0 -0
- package/public/img/concorde/plane_03.jpg +0 -0
- package/public/img/concorde/plane_04.jpg +0 -0
- package/public/img/concorde/plane_05.jpg +0 -0
- package/public/img/concorde/plane_06.jpg +0 -0
- package/public/img/concorde/plane_07.jpg +0 -0
- package/public/img/concorde/plane_08.jpg +0 -0
- package/public/img/concorde/plane_09.jpg +0 -0
- package/public/img/concorde/plane_10.jpg +0 -0
- package/public/img/concorde/plane_11.jpg +0 -0
- package/public/img/concorde/plane_12.jpg +0 -0
- package/public/img/concorde/plane_13.jpg +0 -0
- package/public/robots.txt +11 -10
- package/scripts/docs-markdown-vite-plugin.ts +37 -0
- package/scripts/docs-public-url.mjs +50 -0
- package/scripts/docs.htaccess +75 -0
- package/scripts/generate-crawl-docs.mjs +207 -116
- package/scripts/generate-crawl-docs.test.mjs +124 -0
- package/scripts/post-build-docs.js +34 -50
- package/src/core/components/functional/date/date.md +91 -231
- package/src/core/components/functional/fetch/fetch.md +66 -83
- package/src/core/components/functional/if/if.md +28 -3
- package/src/core/components/functional/jsonata/jsonata.md +42 -37
- package/src/core/components/functional/list/list.md +99 -43
- package/src/core/components/functional/mix/mix.md +31 -26
- package/src/core/components/functional/queue/queue.demo.ts +10 -7
- package/src/core/components/functional/queue/queue.md +40 -61
- package/src/core/components/functional/router/router.demo.ts +16 -16
- package/src/core/components/functional/router/router.md +64 -65
- package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
- package/src/core/components/functional/sdui/component-catalog.json +1 -1
- package/src/core/components/functional/sdui/example.json +19 -86
- package/src/core/components/functional/sdui/sdui-extension-points.md +1 -1
- package/src/core/components/functional/sdui/sdui.md +187 -358
- package/src/core/components/functional/states/states.demo.ts +21 -22
- package/src/core/components/functional/states/states.md +86 -61
- package/src/core/components/functional/states/states.ts +1 -1
- package/src/core/components/functional/submit/submit.md +64 -72
- package/src/core/components/functional/translation/translation.md +38 -0
- package/src/core/components/functional/value/value.md +34 -22
- package/src/core/components/ui/alert/alert.md +48 -58
- package/src/core/components/ui/badge/badge.md +27 -34
- package/src/core/components/ui/button/button.md +139 -106
- package/src/core/components/ui/captcha/captcha.md +17 -32
- package/src/core/components/ui/card/card.md +6 -6
- package/src/core/components/ui/divider/divider.md +8 -11
- package/src/core/components/ui/form/checkbox/checkbox.md +90 -42
- package/src/core/components/ui/form/fieldset/fieldset.md +31 -75
- package/src/core/components/ui/form/form-actions/form-actions.md +14 -16
- package/src/core/components/ui/form/form-layout/form-layout.md +19 -29
- package/src/core/components/ui/form/input/input.md +95 -95
- package/src/core/components/ui/form/radio/radio.md +55 -34
- package/src/core/components/ui/form/select/select.md +60 -45
- package/src/core/components/ui/form/switch/switch.md +57 -34
- package/src/core/components/ui/form/textarea/textarea.md +55 -38
- package/src/core/components/ui/group/group.md +35 -33
- package/src/core/components/ui/icon/icon.md +4 -4
- package/src/core/components/ui/image/image.md +41 -107
- package/src/core/components/ui/link/link.md +6 -6
- package/src/core/components/ui/loader/loader.md +30 -55
- package/src/core/components/ui/menu/menu.md +27 -27
- package/src/core/components/ui/modal/modal.md +72 -96
- package/src/core/components/ui/pop/pop.md +80 -158
- package/src/core/components/ui/progress/progress.md +2 -2
- package/src/core/components/ui/table/table.md +91 -255
- package/src/core/components/ui/theme/theme.md +11 -36
- package/src/core/components/ui/toast/toast.md +48 -117
- package/src/core/components/ui/tooltip/tooltip.md +27 -62
- package/src/core/utils/LocationHandler.spec.ts +80 -0
- package/src/core/utils/LocationHandler.ts +5 -9
- package/src/docs/components/docs-demo-sources.ts +55 -140
- package/src/docs/components/docs-lit-demo.ts +1 -3
- package/src/docs/components/docs-source-link.ts +0 -82
- package/src/docs/decorators/ancestor-attribute.md +59 -0
- package/src/docs/decorators/auto-subscribe.md +40 -0
- package/src/docs/decorators/bind.md +77 -0
- package/src/docs/decorators/get.md +160 -0
- package/src/docs/decorators/handle.md +119 -0
- package/src/docs/decorators/on-assign.md +63 -0
- package/src/docs/decorators/patch.md +44 -0
- package/src/docs/decorators/post.md +134 -0
- package/src/docs/decorators/publish.md +56 -0
- package/src/docs/decorators/put.md +51 -0
- package/src/docs/decorators/subscribe.md +87 -0
- package/src/docs/decorators/wait-for-ancestors.md +76 -0
- package/src/docs/directives/sub.md +75 -0
- package/src/docs/directives/t.md +73 -0
- package/src/docs/docs-location.spec.ts +46 -0
- package/src/docs/docs-location.ts +123 -32
- package/src/docs/docs.ts +1 -2
- package/src/docs/example/decorators-demo-bind-demos.ts +81 -116
- package/src/docs/example/decorators-demo-geo.ts +30 -19
- package/src/docs/example/decorators-demo-post.ts +88 -186
- package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +165 -268
- package/src/docs/example/decorators-demo.ts +85 -98
- package/src/docs/example/docs-api-config-demos.ts +19 -20
- package/src/docs/example/docs-flight-demos.ts +147 -0
- package/src/docs/example/docs-jsonata-demos.ts +52 -52
- package/src/docs/example/docs-list-demos.ts +43 -123
- package/src/docs/example/docs-provider-keys.ts +21 -28
- package/src/docs/example/docs-queue-demos.ts +37 -77
- package/src/docs/example/docs-router-demos.ts +20 -25
- package/src/docs/example/docs-submit-demos.ts +48 -48
- package/src/docs/example/docs-toggle-demos.ts +4 -3
- package/src/docs/getting-started/ai-agents.md +76 -0
- package/src/docs/getting-started/components.md +5 -0
- package/src/docs/getting-started/create-a-component.md +136 -0
- package/src/docs/getting-started/dataFlow.md +87 -0
- package/src/docs/getting-started/installation.md +36 -0
- package/src/docs/getting-started/my-first-component.md +227 -0
- package/src/docs/getting-started/start.md +35 -0
- package/src/docs/getting-started/theming.md +253 -0
- package/src/docs/header/header.ts +11 -6
- package/src/docs/home/catalog.ts +1 -1
- package/src/docs/home/home.ts +17 -10
- package/src/docs/layout.ts +12 -13
- package/src/docs/misc/api-configuration.md +79 -0
- package/src/docs/misc/dataProviderKey.md +168 -0
- package/src/docs/misc/docs-mock-api.md +62 -0
- package/src/docs/misc/dynamic-path.md +71 -0
- package/src/docs/misc/endpoint.md +45 -0
- package/src/docs/misc/html-integration.md +14 -0
- package/src/docs/mock-api/api-config-mock.ts +5 -0
- package/src/docs/mock-api/fixtures.ts +0 -278
- package/src/docs/mock-api/flights.ts +89 -0
- package/src/docs/mock-api/router.ts +3 -4
- package/src/docs/mock-api/urls.ts +1 -2
- package/src/docs/navigation/navigation.ts +82 -103
- package/src/docs/navigation/toc.ts +7 -4
- package/src/docs/search/docs-search.json +2845 -5110
- package/src/docs/search/markdown-renderer.ts +25 -7
- package/src/docs/search/page.ts +9 -6
- package/src/docs/search/search.ts +154 -122
- package/vite.config.mts +11 -2
- package/.agents/skills/concorde-component-docs/SKILL.md +0 -194
- package/docs/assets/index-CD4WyL6o.css +0 -1
- package/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -29
- package/src/docs/_core-concept/overview.md +0 -57
- package/src/docs/_core-concept/subscriber.md +0 -75
- package/src/docs/_decorators/ancestor-attribute.md +0 -128
- package/src/docs/_decorators/auto-subscribe.md +0 -202
- package/src/docs/_decorators/bind.md +0 -167
- package/src/docs/_decorators/get.md +0 -162
- package/src/docs/_decorators/handle.md +0 -175
- package/src/docs/_decorators/on-assign.md +0 -390
- package/src/docs/_decorators/patch.md +0 -70
- package/src/docs/_decorators/post.md +0 -146
- package/src/docs/_decorators/publish.md +0 -55
- package/src/docs/_decorators/put.md +0 -70
- package/src/docs/_decorators/subscribe.md +0 -100
- package/src/docs/_decorators/wait-for-ancestors.md +0 -163
- package/src/docs/_directives/sub.md +0 -91
- package/src/docs/_getting-started/concorde-manual-install.md +0 -133
- package/src/docs/_getting-started/concorde-outside.md +0 -33
- package/src/docs/_getting-started/my-first-subscriber.md +0 -120
- package/src/docs/_getting-started/pubsub.md +0 -37
- package/src/docs/_misc/formelement-subscriber-removal.md +0 -115
- package/src/docs/example/docs-input-autocomplete-demos.ts +0 -110
- package/src/docs/example/docs-joke-demos.ts +0 -297
- /package/{src/docs/_getting-started → docs/docs/getting-started}/components.md +0 -0
- /package/{src/docs/_getting-started → docs/docs/getting-started}/theming.md +0 -0
|
@@ -1,125 +1,108 @@
|
|
|
1
1
|
# Fetch
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
The **sonic-fetch** component requests and stores API data. It extends the Fetcher and [Subscriber](#docs/_core-concept/subscriber.md/subscriber) mixins.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
## Basic usage
|
|
12
|
-
In order to work properly the <b>sonic-fetch</b> component needs at least the following attributes.
|
|
13
|
-
- **serviceURL** : A base service url. This attribute can be inherited from an ancestor.
|
|
14
|
-
*ex : /docs-mock-api*
|
|
15
|
-
- **endPoint** : the specific location where requests for information are sent (see the api docs).
|
|
16
|
-
*ex : api/users | api/users?page=2 | api/users/2*
|
|
17
|
-
- **dataProvider *(Required)*** : An ID that is used as a reference to the object storing the data returned by the API.
|
|
18
|
-
This attribute can be inherited from an ancestor.
|
|
3
|
+
**`sonic-fetch`** sends a GET request to `serviceURL` + `endPoint` and publishes the response under `dataProvider`, so its children and any subscriber of that provider can render it. In a Lit component, prefer the [@get](/docs/decorators/get) decorator; for collections, use [List](/core/components/functional/list) or [Queue](/core/components/functional/queue).
|
|
19
4
|
|
|
5
|
+
## Basic example
|
|
20
6
|
|
|
7
|
+
`dataProvider` is required; `serviceURL` and `dataProvider` can be set on an ancestor. Children are hidden while the request is pending. With no `serviceURL`, requests go to the page origin.
|
|
21
8
|
|
|
22
9
|
<sonic-code>
|
|
23
10
|
<template>
|
|
24
|
-
<sonic-fetch serviceURL="/docs-mock-api" endPoint="
|
|
25
|
-
<
|
|
11
|
+
<sonic-fetch serviceURL="/docs-mock-api" endPoint="flights?direction=departures" dataProvider="docsFetchNextDeparture" key="flights.0">
|
|
12
|
+
<p data-bind ::inner-html="Next departure: <b>$code</b> to $city, gate $gate"></p>
|
|
13
|
+
</sonic-fetch>
|
|
26
14
|
</template>
|
|
27
15
|
</sonic-code>
|
|
28
16
|
|
|
29
|
-
##
|
|
30
|
-
|
|
17
|
+
## Data provider as endpoint
|
|
18
|
+
|
|
19
|
+
With no `endPoint`, the `dataProvider` value is used as the endpoint.
|
|
31
20
|
|
|
32
21
|
<sonic-code>
|
|
33
22
|
<template>
|
|
34
|
-
<sonic-fetch serviceURL="/docs-mock-api" dataProvider="
|
|
35
|
-
|
|
23
|
+
<sonic-fetch serviceURL="/docs-mock-api" dataProvider="flights?direction=arrivals" key="flights.0">
|
|
24
|
+
<p data-bind ::inner-html="Next arrival: <b>$code</b> from $city at $time"></p>
|
|
25
|
+
</sonic-fetch>
|
|
36
26
|
</template>
|
|
37
27
|
</sonic-code>
|
|
38
28
|
|
|
39
|
-
## HeadersDataProvider
|
|
40
|
-
|
|
41
|
-
<sonic-alert status="error" background>Deprecated</sonic-alert>
|
|
42
|
-
|
|
43
29
|
## Key
|
|
44
|
-
When the **key** attribute is present, only a sub-part of the data received is injected into the **dataProvider**.
|
|
45
|
-
We can use the dot syntax to target what we want to keep.
|
|
46
30
|
|
|
47
|
-
|
|
31
|
+
`key` keeps only part of the response, using a dot path: with `{ "flights": [ … ] }` and `key="flights.1"`, the provider holds the second flight. Add `preserveOtherKeys` to merge the target into the parent object instead of dropping its siblings. With no `key`, the whole response is published.
|
|
48
32
|
|
|
49
33
|
<sonic-code>
|
|
50
34
|
<template>
|
|
51
|
-
<sonic-fetch serviceURL="/docs-mock-api" dataProvider="
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
<sonic-fetch serviceURL="/docs-mock-api" dataProvider="id" endPoint="api/users/2" key="data.id"></sonic-fetch>
|
|
55
|
-
<sonic-button dataProvider="id" debug>data.id</sonic-button>
|
|
56
|
-
<!-- Get the user First name -->
|
|
57
|
-
<sonic-fetch serviceURL="/docs-mock-api" dataProvider="first_name" endPoint="api/users/2" key="data.first_name"></sonic-fetch>
|
|
58
|
-
<sonic-button dataProvider="first_name" debug>data.first_name</sonic-button>
|
|
59
|
-
<!-- Get the user Last name -->
|
|
60
|
-
<sonic-fetch serviceURL="/docs-mock-api" dataProvider="last_name" endPoint="api/users/2" key="data.last_name"></sonic-fetch>
|
|
61
|
-
<sonic-button dataProvider="last_name" debug>data.last_name</sonic-button>
|
|
62
|
-
<!-- Get the user email -->
|
|
63
|
-
<sonic-fetch serviceURL="/docs-mock-api" dataProvider="email" endPoint="api/users/2" key="data.email"></sonic-fetch>
|
|
64
|
-
<sonic-button dataProvider="email" debug>data.email</sonic-button>
|
|
35
|
+
<sonic-fetch serviceURL="/docs-mock-api" endPoint="flights?direction=departures" dataProvider="docsFetchKey" key="flights.1">
|
|
36
|
+
<p data-bind ::inner-html="$code to $city ($airport), status $status"></p>
|
|
37
|
+
</sonic-fetch>
|
|
65
38
|
</template>
|
|
66
39
|
</sonic-code>
|
|
67
40
|
|
|
68
|
-
##
|
|
41
|
+
## Loader and skeleton
|
|
69
42
|
|
|
70
|
-
|
|
43
|
+
With no `loader`, nothing is shown during the request. Set `loader` (`fixed` overlay) or `loader="inline"` to show a [Loader](/core/components/ui/loader), or add a `<template skeleton>` child rendered in place of the content while loading.
|
|
71
44
|
|
|
72
45
|
<sonic-code>
|
|
73
46
|
<template>
|
|
74
|
-
<sonic-fetch endPoint="
|
|
75
|
-
|
|
47
|
+
<sonic-fetch loader="inline" serviceURL="/docs-mock-api" endPoint="flights?direction=arrivals" dataProvider="docsFetchLoader" key="flights.2">
|
|
48
|
+
<template skeleton>
|
|
49
|
+
<p class="text-neutral-400">Loading arrivals…</p>
|
|
50
|
+
</template>
|
|
51
|
+
<p data-bind ::inner-html="<b>$code</b> from $city: $status"></p>
|
|
52
|
+
</sonic-fetch>
|
|
76
53
|
</template>
|
|
77
54
|
</sonic-code>
|
|
78
55
|
|
|
79
|
-
##
|
|
56
|
+
## Text responses
|
|
80
57
|
|
|
81
|
-
|
|
58
|
+
When the response type starts with `text/`, the provider holds `{ text: "…" }`.
|
|
82
59
|
|
|
83
60
|
<sonic-code>
|
|
84
61
|
<template>
|
|
85
|
-
<sonic-fetch
|
|
86
|
-
|
|
62
|
+
<sonic-fetch endPoint="robots.txt" dataProvider="docsFetchText">
|
|
63
|
+
<pre class="max-h-40 overflow-auto text-xs" data-bind ::inner-html="$text"></pre>
|
|
64
|
+
</sonic-fetch>
|
|
87
65
|
</template>
|
|
88
66
|
</sonic-code>
|
|
89
67
|
|
|
68
|
+
## Reloading
|
|
90
69
|
|
|
70
|
+
`endPoint` is reactive: changing it fetches again. Call `invalidate()` on the publisher to reload the same endpoint, or set `refetchEveryMs` to poll. A request that fails with no data shows an error toast.
|
|
91
71
|
|
|
72
|
+
<sonic-code language="typescript">
|
|
73
|
+
<template>
|
|
74
|
+
import { PublisherManager } from "@supersoniks/concorde/utils";
|
|
92
75
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
### Configuration via les attributs
|
|
98
|
-
|
|
99
|
-
| nom | sur quelle balise | Description | Exemple de valeur | défaut / requis |
|
|
100
|
-
|-----|-----|---|---|---|
|
|
101
|
-
| serviceURL |Fetcher ou un de ses parents | URL de base des services. | http://la-billetterie.net/api/v2 | domain du site |
|
|
102
|
-
| endpoint |Fetcher | point d'accès d'un service | user/2 | valeur de l'attribut dataProvider |
|
|
103
|
-
| dataProvider |Fetcher ou un de ses parents | Identifiant d'un publisher qui stock les données, voir [subscriber](#core/components/functional/subscriber/subscriber.md/subscriber). | billetterie/user/2 | *REQUIS* |
|
|
104
|
-
| headersDataProvider |Fetcher ou un de ses parents | Identifiant d'un publisher qui stock les données destinées à être envoyées en entêtes de la requetes | MyCoockieHEaders | null |
|
|
105
|
-
| key |Fetcher | extrait une sous propriété de la donnée chargée avant de l'assignée à son publisher | ma.data | null |
|
|
106
|
-
|
|
107
|
-
*Si la données est `{ma:{data:{a:1,b:2}}}` et `key="ma.data"`, la données disponible dans le composant sera `{a:1, b:2}`*
|
|
108
|
-
|
|
109
|
-
### Intégration auto de basic auth (pour tester une api qui nécessite une authentification)
|
|
110
|
-
|
|
111
|
-
Fetch utilise le service pour générer le token et l'ajoute au header de l'appel qui récupère les données.
|
|
112
|
-
|
|
113
|
-
| nom | sur quelle balise | Description | Exemple de valeur | défaut / requis |
|
|
114
|
-
|-----|-----|---|---|---|
|
|
115
|
-
| userName | Fetcher ou un de ses parents | Nom de l'utilisateur | DjuDju | null |
|
|
116
|
-
| password | Fetcher ou un de ses parents | mot de passe | pom_549 | null |
|
|
117
|
-
| tokenProvider | Fetcher ou un de ses parents | point d'accès du service fournissant le token | auth | null |
|
|
118
|
-
| token | Fetcher ou un de ses parents | A fournir à la place des autres attributs si on le possède | q<d34gb | null |
|
|
119
|
-
|
|
120
|
-
### Autres choses utiles
|
|
121
|
-
L'attribut *noLoader* du composant permet de désactiver l'affichage du loader par défaut.
|
|
122
|
-
On peut appeler la methode invalidate() sur le publisher associé au composant pour declencher le rechargement des données.
|
|
123
|
-
endPoint est une propriété réctive, par conséquent, sa modification, manuelle via template ou data binbding provoque la mise à jour du contenu.
|
|
124
|
-
-->
|
|
76
|
+
PublisherManager.get("docsFetchNextDeparture").invalidate();
|
|
77
|
+
</template>
|
|
78
|
+
</sonic-code>
|
|
125
79
|
|
|
80
|
+
## API reference
|
|
81
|
+
|
|
82
|
+
| Attribute | Values | Description |
|
|
83
|
+
|-----------|--------|-------------|
|
|
84
|
+
| `dataProvider` | string | **Required.** Publisher that receives the data. Also the endpoint when `endPoint` is empty. Inherited from ancestors |
|
|
85
|
+
| `serviceURL` | URL (default page origin) | Base URL of the API. Inherited from ancestors |
|
|
86
|
+
| `endPoint` | string | Path appended to `serviceURL`. Reactive |
|
|
87
|
+
| `key` | dot path | Part of the response to publish |
|
|
88
|
+
| `preserveOtherKeys` | boolean | With `key`, keeps the sibling properties of the target |
|
|
89
|
+
| `loader` | `fixed` (when empty) · `inline` | Loader shown during the request. None by default |
|
|
90
|
+
| `lazyload` | boolean | Fetches when the element nears the viewport |
|
|
91
|
+
| `lazyBoundsRatio` | number (default `1`) | Viewport ratio used as margin by `lazyload` |
|
|
92
|
+
| `refetchEveryMs` | number (default `0`) | Polling interval in milliseconds; `0` disables it |
|
|
93
|
+
| `headersDataProvider` | string | Publisher whose data is sent as request headers. Inherited from ancestors |
|
|
94
|
+
| `token` | string | Bearer token. Inherited from ancestors |
|
|
95
|
+
| `userName` · `password` · `tokenProvider` | string | Basic auth used to get a token from `tokenProvider` when no `token` is set. Inherited from ancestors |
|
|
96
|
+
| `credentials` | `omit` · `same-origin` · `include` | `fetch` credentials mode. Inherited from ancestors |
|
|
97
|
+
| `cache` | `RequestCache` value | `fetch` cache mode |
|
|
98
|
+
| `addHTTPResponse` | boolean | Adds the HTTP response as `_sonic_http_response_` on the data. Inherited from ancestors |
|
|
99
|
+
| `localStorage` | `disabled` (default) · `enabled` | Persists the publisher in `localStorage` |
|
|
100
|
+
|
|
101
|
+
| Slot | Description |
|
|
102
|
+
|------|-------------|
|
|
103
|
+
| *(default)* | Content, hidden while the request is pending |
|
|
104
|
+
|
|
105
|
+
| Event | Description |
|
|
106
|
+
|-------|-------------|
|
|
107
|
+
| `loading` | The request starts |
|
|
108
|
+
| `load` | The data is published |
|
|
@@ -1,9 +1,34 @@
|
|
|
1
|
-
#
|
|
1
|
+
# If
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**`sonic-if`** renders its default slot only while `condition` is true. Use it to show or hide a block from reactive state; with no `condition`, the content is not rendered. The host uses `display: contents`, so it adds no box to the layout.
|
|
4
|
+
|
|
5
|
+
## Basic example
|
|
6
|
+
|
|
7
|
+
<sonic-code>
|
|
8
|
+
<template>
|
|
9
|
+
<sonic-if condition>
|
|
10
|
+
<sonic-badge type="success">CN 001 · Boarding</sonic-badge>
|
|
11
|
+
</sonic-if>
|
|
12
|
+
<sonic-if>
|
|
13
|
+
<sonic-badge type="danger">Never rendered</sonic-badge>
|
|
14
|
+
</sonic-if>
|
|
15
|
+
</template>
|
|
16
|
+
</sonic-code>
|
|
17
|
+
|
|
18
|
+
`condition` is a boolean attribute: **any value, even `condition="false"`, counts as true**. To toggle it, remove the attribute or bind the property.
|
|
19
|
+
|
|
20
|
+
## Reactive condition
|
|
21
|
+
|
|
22
|
+
In Lit, bind `.condition` to state read with `@subscribe`. Here a checkbox writes to a `formDataProvider` and the component re-renders from it.
|
|
4
23
|
|
|
5
24
|
<docs-lit-demo for="docs-toggle-if-demo"></docs-lit-demo>
|
|
6
25
|
|
|
7
|
-
|
|
26
|
+
## API reference
|
|
8
27
|
|
|
28
|
+
| Attribute | Values | Description |
|
|
29
|
+
|-----------|--------|-------------|
|
|
30
|
+
| `condition` | boolean (default `false`) | Renders the default slot when true |
|
|
9
31
|
|
|
32
|
+
| Slot | Description |
|
|
33
|
+
|------|-------------|
|
|
34
|
+
| *(default)* | Content rendered while `condition` is true |
|
|
@@ -1,56 +1,61 @@
|
|
|
1
1
|
# Jsonata
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**`sonic-jsonata`** reads one data provider, evaluates a [JSONata](https://jsonata.org) expression on it and writes the result to another data provider. Use it for read-only aggregates such as groups, rankings and totals; use [Mix](/core/components/functional/mix) to compose data in both directions, and [`derive`](/docs/getting-started/dataFlow) for several inputs or a TypeScript function.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Group and sort
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## Demos
|
|
10
|
-
|
|
11
|
-
### Groupby + top N
|
|
12
|
-
|
|
13
|
-
Change **Top N** → recalcul sans refetch.
|
|
7
|
+
`inputProvider` is available as `$input` and the result is written to `outputProvider`. Each field of the optional `formDataProvider` store becomes a variable (`$direction` here): changing it recomputes the output without fetching again.
|
|
14
8
|
|
|
15
9
|
<docs-lit-demo for="docs-jsonata-space-cats-demo"></docs-lit-demo>
|
|
16
10
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
Change **Tax %** → même idée.
|
|
20
|
-
|
|
21
|
-
<docs-lit-demo for="docs-jsonata-table-totals-demo"></docs-lit-demo>
|
|
22
|
-
|
|
23
|
-
## Attributes
|
|
11
|
+
JSONata returns a single object instead of an array when only one item matches. Wrap the expression in `$append([], …)` when a list renders the output.
|
|
24
12
|
|
|
25
|
-
|
|
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`) |
|
|
13
|
+
## Totals
|
|
32
14
|
|
|
33
|
-
|
|
15
|
+
A `( … )` block declares local variables and returns an object; read its fields with `sonic-value`. Change the reserve to recompute the block fuel.
|
|
34
16
|
|
|
35
|
-
|
|
17
|
+
<docs-lit-demo for="docs-jsonata-table-totals-demo"></docs-lit-demo>
|
|
36
18
|
|
|
37
|
-
|
|
19
|
+
## States
|
|
38
20
|
|
|
39
|
-
|
|
21
|
+
The evaluation state is published on `{outputProvider}/_state_` as `{ status, error }`, with `status` among `loading` · `ready` · `empty` · `error`. Display it with [States](/core/components/functional/states).
|
|
40
22
|
|
|
41
|
-
<sonic-code
|
|
23
|
+
<sonic-code>
|
|
42
24
|
<template>
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
25
|
+
<div serviceURL="/docs-mock-api">
|
|
26
|
+
<sonic-fetch dataProvider="jsonataStateFlights" endPoint="flights" key="flights"></sonic-fetch>
|
|
27
|
+
<sonic-jsonata
|
|
28
|
+
inputProvider="jsonataStateFlights"
|
|
29
|
+
outputProvider="jsonataLanded"
|
|
30
|
+
expression='{"landed": $count($input[status="landed"])}'
|
|
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>
|
|
49
38
|
</template>
|
|
50
39
|
</sonic-code>
|
|
51
40
|
|
|
52
|
-
|
|
41
|
+
## API reference
|
|
53
42
|
|
|
54
|
-
|
|
43
|
+
| Attribute | Values | Description |
|
|
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.
|
|
55
60
|
|
|
56
|
-
|
|
61
|
+
No slots.
|
|
@@ -1,65 +1,121 @@
|
|
|
1
1
|
# List
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**`sonic-list`** renders one row per entry of its `props` array, either set directly or loaded with `fetch`. From Lit, pass a row renderer on the `items` property; in plain HTML, declare `<template>` children. Each row gets its own data provider at `<dataProvider>/list-item/<index>`.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Basic example
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
* **Subscriber** — `props` + `dataProvider`
|
|
9
|
-
* **Fetcher** — optional `fetch` + `serviceURL` / `key` (see [Fetch](#core/components/functional/fetch/fetch.md/fetch))
|
|
7
|
+
Add `fetch` to load `props` from `serviceURL` + `endPoint` (or `dataProvider` when `endPoint` is empty). `key` picks the array inside the response. Without `fetch`, the list only renders the `props` it receives.
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
<sonic-code>
|
|
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>
|
|
12
18
|
|
|
13
|
-
|
|
19
|
+
Fetch attributes (`lazyload` · `refetchEveryMs` · headers · authentication) are shared with [Fetch](/core/components/functional/fetch).
|
|
14
20
|
|
|
15
|
-
|
|
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
|
-
`;
|
|
21
|
+
## Row renderer
|
|
21
22
|
|
|
22
|
-
|
|
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`):
|
|
23
|
+
From a Lit component, set `.items` to a function `(item, metadata) => TemplateResult`. Functions only pass as properties, so always use the `.` binding: the same applies to `.separator` · `.noItems` · `.skeleton`. `metadata` holds `key` · `even` · `odd` · `firstChild` · `lastChild` · `onlyChild`.
|
|
42
24
|
|
|
43
25
|
<docs-lit-demo for="docs-list-alternate-demo"></docs-lit-demo>
|
|
44
26
|
|
|
45
|
-
|
|
27
|
+
## Row variants
|
|
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>
|
|
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
|
+
|
|
49
51
|
<docs-lit-demo for="docs-list-separator-demo"></docs-lit-demo>
|
|
50
52
|
|
|
51
|
-
##
|
|
53
|
+
## Limit and offset
|
|
52
54
|
|
|
53
|
-
|
|
55
|
+
`limit` caps the number of rendered rows and `offset` skips the first ones, without changing the data. With no `limit`, every row is rendered.
|
|
54
56
|
|
|
55
|
-
|
|
57
|
+
<sonic-code>
|
|
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>
|
|
56
66
|
|
|
57
|
-
|
|
67
|
+
## Objects and `extractValues`
|
|
58
68
|
|
|
59
|
-
|
|
69
|
+
When the data is an object, the list wraps it in a one-row array. Add `extractValues` to render one row per property instead, as `{ key, value }`.
|
|
60
70
|
|
|
61
|
-
|
|
71
|
+
<docs-lit-demo for="docs-list-extract-values-demo"></docs-lit-demo>
|
|
62
72
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
73
|
+
## Loading state
|
|
74
|
+
|
|
75
|
+
With no `loader`, nothing is shown while fetching. Set `loader` (`fixed`) or `loader="inline"` to show a [Loader](/core/components/ui/loader), or provide `.skeleton` / `<template skeleton>` to render placeholder rows; a skeleton replaces the loader. Call `invalidate()` on the list publisher to fetch again.
|
|
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` |
|
|
@@ -1,41 +1,46 @@
|
|
|
1
1
|
# Mix
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**`sonic-mix`** builds a new data provider from parts of other ones. Each key of `composition` maps to a source data provider id, with an optional dot path to a sub-value. The mixed provider is named by the `dataProvider` attribute and stays in sync with its sources in both directions.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Basic example
|
|
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.
|
|
6
8
|
|
|
7
|
-
For example, if we declare dataproviders as follows :
|
|
8
|
-
<sonic-code>
|
|
9
|
-
<template>
|
|
10
|
-
<sonic-subscriber dataProvider="dataToMixA" props='{"foo":{"bar":2}}'></sonic-subscriber>
|
|
11
|
-
<sonic-subscriber dataProvider="dataToMixB" props='{"baz":3}'></sonic-subscriber>
|
|
12
|
-
</template>
|
|
13
|
-
</sonic-code>
|
|
14
|
-
We can rearrange the data as follows
|
|
15
9
|
<sonic-code>
|
|
16
10
|
<template>
|
|
17
|
-
<sonic-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
<sonic-subscriber dataProvider="docs-mix-flight" props='{"code":"CN 001","route":"CDG → JFK"}'></sonic-subscriber>
|
|
12
|
+
<sonic-subscriber dataProvider="docs-mix-gate" props='{"gate":"B12","terminal":"2E"}'></sonic-subscriber>
|
|
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>
|
|
20
19
|
</sonic-mix>
|
|
21
20
|
</template>
|
|
22
21
|
</sonic-code>
|
|
23
|
-
|
|
24
|
-
|
|
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
|
+
|
|
27
|
+
<sonic-code>
|
|
25
28
|
<template>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
<div class="flex flex-wrap items-end gap-4">
|
|
30
|
+
<sonic-button size="sm" onclick="SonicPublisherManager.get('docs-mix-gate').gate = 'C34'">Gate change to C34</sonic-button>
|
|
31
|
+
<sonic-input label="Gate (mixed provider)" formDataProvider="docs-mix-board" name="gate"></sonic-input>
|
|
32
|
+
</div>
|
|
33
|
+
<p class="mt-2">Source gate: <sonic-value dataProvider="docs-mix-gate" key="gate"></sonic-value></p>
|
|
30
34
|
</template>
|
|
31
35
|
</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
|
-
|
|
39
36
|
|
|
37
|
+
## API reference
|
|
40
38
|
|
|
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"` |
|
|
41
43
|
|
|
44
|
+
| Slot | Description |
|
|
45
|
+
|------|-------------|
|
|
46
|
+
| *(default)* | Content that reads the mixed provider |
|
|
@@ -4,19 +4,21 @@ import { customElement } from "lit/decorators.js";
|
|
|
4
4
|
import "./queue";
|
|
5
5
|
import { tailwind } from "../../../../docs/tailwind";
|
|
6
6
|
|
|
7
|
+
type FlightRow = { code: string; city: string; airport: string; time: string };
|
|
8
|
+
|
|
7
9
|
@customElement("sonic-queue-demo")
|
|
8
10
|
export class QueueDemo extends LitElement {
|
|
9
11
|
static styles = [tailwind];
|
|
10
12
|
|
|
11
|
-
private items = (item:
|
|
13
|
+
private items = (item: FlightRow) => html`
|
|
12
14
|
<div class="bg-neutral-100 p-2 rounded-md">
|
|
13
|
-
<div class="font-medium">${item.
|
|
14
|
-
<div class="text-sm text-gray-600"
|
|
15
|
+
<div class="font-medium">${item.code} · ${item.city}</div>
|
|
16
|
+
<div class="text-sm text-gray-600">${item.airport} · ${item.time}</div>
|
|
15
17
|
</div>
|
|
16
18
|
`;
|
|
17
19
|
private noItems = () => html`
|
|
18
20
|
<div class="flex flex-col items-center justify-center p-4 text-gray-500">
|
|
19
|
-
<p>
|
|
21
|
+
<p>No flight found</p>
|
|
20
22
|
</div>
|
|
21
23
|
`;
|
|
22
24
|
|
|
@@ -24,9 +26,10 @@ export class QueueDemo extends LitElement {
|
|
|
24
26
|
return html`
|
|
25
27
|
<sonic-queue
|
|
26
28
|
class="grid grid-cols-3 gap-3"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
serviceURL="/docs-mock-api"
|
|
30
|
+
dataProviderExpression="flights?limit=$limit"
|
|
31
|
+
key="flights"
|
|
32
|
+
limit="15"
|
|
30
33
|
.items=${this.items}
|
|
31
34
|
.noItems=${this.noItems}
|
|
32
35
|
></sonic-queue>
|